Handling upgrades & downgrades

Loop supports billing for subscriptions where the products or pricing has changed.

Downgrading

Downgrading is straightforward regardless of payment method:

  1. Update the subscription in Stripe - Change the product to the lower tier
  2. No action needed in Loop - Loop automatically handles the billing change

This works the same whether the customer pays with fiat or crypto, as you're simply modifying the existing Stripe subscription.

When invoicing immediately for a downgrade, the customer might be owed a credit, which is added to their credit balance to be applied to future invoices. These future invoices may be for $0. Loop does not display $0 invoices on the company dashboard however on the customer portal we will show the $0 invoice.

Once the customer has an invoice that is greater than $1, Loop will process the payment. The $1 threshold is a Stripe limitation, Stripe will not bill for an invoice less than $1 and will roll the amount over to the next month until the bill is at least $1.

Upgrades

There are two scenarios:

  1. The customer has their payment method already set to pay in crypto with Loop and you'd like to change their subscription products (i.e., upgrade the customer from Plan A to Plan B)
  2. The customer does not have their payment method already set to pay in crypto with Loop and you'd like to modify the subscription and have them pay with Loop in the same action.

The customer is already paying with Loop and you'd like to change their subscription

Stripe is your billing and invoice generation system. Logic about the subscription products should live in Stripe. Thus, to modify a subscription, use Stripe's endpoints (docs). When a subscription is updated in Stripe, Loop will hear about it via Stripe webhooks and will updated the subscription in our system. The customer does not need another payment link as they are already set up to pay via Loop. Please refer to directions here on how to best handle this case.

The customer is not already paying in crypto with Loop and you'd like to modify and have them pay in crypto with Loop in the same action

For customers currently on a $0 (free) product

In this scenario, the customer/subscription is already created in Stripe and the subscription has a $0 product. When you want the customer to pay to upgrade, you create a Loop Checkout Session for the upgrade passing in the externalPriceID of the paid tier that you want to upgrade the customer to, the externalSubscriptionId and set the value for the upgradeSubscription parameter to TRUE. Please refer to directions here on how to handle this case.

Loop will switch both the product and payment method in one step

For customers currently on a paid fiat product

You have two approaches for handling the upgrade:

Option A: Switch payment method first, then upgrade

  1. Create Loop checkout session - Pass the existing sub-id
  2. Customer completes checkout - Switches from fiat to crypto payment
  3. Update subscription in Stripe - Change to the new product tier
  4. Loop charges the customer on the next billing cycle

Option B: Upgrade first, then switch payment method

  1. Update subscription in Stripe - Change to the new product tier
  2. Create Loop checkout session - Pass the existing sub-id
  3. Customer completes checkout - Switches to crypto payment
  4. Loop charges for the next billing cycle

For immediate payment (prorated upgrades): If your upgrade creates a prorated charge that needs immediate payment, add payInvoiceImmediately: true to your checkout session.

This will:

  • Finalize any draft invoices
  • Set the due date to now
  • Require payment during checkout

The existing subscription is always modified, never replaced.


Important Notes

  • Never create multiple subscriptions - Always modify the existing Stripe subscription by using thesub-id. This ensures Loop knows which subscription to update
  • Fiat-to-crypto upgrades require a checkout session - This handles the payment method switch