#johnm_best-practices
1 messages Ā· Page 1 of 1 (latest)
š Welcome to your new thread!
ā²ļø We'll be here soon! Typically we respond in a few minutes, but sometimes we might take a bit longer if the server is busy or if you have a particularly tricky question.
ā±ļø We close idle threads, which makes them read-only. Once a thread is closed it won't be reopened, but you can always start a new thread if you have another question.
š This thread will always be available, even after it's closed. You can find it again using Discord's search, or you can save this link: https://discord.com/channels/841573134531821608/1461327747484745902
š Have more to share? Add more details, code, screenshots, videos, etc. below.
Below are links to other discussions we've had with you in the past week in case you want to review that information. If your question is related to one of these previous discussions, please provide a comprehensive summary of the current state and what you need help with now. We help many users simultaneously, so a summary allows us to resolve your issue as soon as possible.
- johnm_api, 16 hours ago, 20 messages
Just to flesh this out a bit.
To recreate the issue
- Sign up to annual plan account with 4 seats
- Enter card and End trial, make payment.
- Now enter a 50% off forever coupon
- Update subscription to 5 seats.
- Stripe generates a negative invoice and the customers account is credited rather than debited.
When the customer pays full price for their 4 seat subscription the total cost is ā¬432.00
The customer then adds a 50% off coupon which means that any invoice items will have 50% off from now on.
The customer then updates to 5 seats, this is calculated at 50% off which brings the cost to ā¬270.00
When Stripe calculates proration it gives the customer back what they had spent on the old subscription and then charges them the new subscription.
Without the coupon this would be fine, it would be:
Unused time for 4 seats at full price: 432
Remaining time for 5 seats at full price: 540
Charge for adding extra seat: 108
Adding coupon after the initial charge is where the issue comes in, now it is:
Unused time for 4 seats at full price: 432
Remaining time for 5 seats at 50% off: 270
Charge for adding extra seat: -162 users account is credited.
Current issues like this in Stripe for us
Search invoices for Total less than 0
Last one was June 5 2025
And it is this exact scenario
What I would expect to happen.
When a customer applies a 50% off coupon I would expect the charge to calculate at full price and then apply the 50% off, so they are getting 50% off on the upgrade but not the entire subscription.
So I would expect in the same test scenario as above:
Unused time for 4 seats at full price: 432
Remaining time for 5 seats at full price: 540
Charge for adding extra seat: 108
Customer coupon applied 50% off, customer actually charged: 54
Sign in to the Stripe Dashboard to manage business payments and operations in your account. Manage payments and refunds, respond to disputes and more.
Some Possible Solutions I have been thinking about:
- Use proration off if initial subscription has no coupon and current subscription has coupon. This means users will get a free upgrade until the next billing date when they will be charged for new seats. I'm not a fan of this as users could get free upgrades for a year just by adding a coupon.
- Only apply coupon at the start of the billing cycle. So if a user is charged and then applies a coupon the coupon will not take effect until their next billing cycle.
- Manual invoices. Use proration off if initial subscription has no coupon and current subscription has coupon. Then manually calculate the charge for the upgrade apply the coupon to the total and charge the customer manually...this is a lot more work for us, but maybe it's the right option....
But I would appreciate any advice you have
This is an invoice where I have seen this issue in our account - https://dashboard.stripe.com/acct_15cE90IJlgOai667/invoices/in_1RWg41IJlgOai6677NUlVodb
Sign in to the Stripe Dashboard to manage business payments and operations in your account. Manage payments and refunds, respond to disputes and more.
thanks for the detailed explanations! having a look.
Thank you, I guess it must be a common usage pattern and I'm just not doing it correctly
Adding coupon after the initial charge is where the issue comes in, now it is:
Unused time for 4 seats at full price: 432
Remaining time for 5 seats at 50% off: 270
Charge for adding extra seat: -162 users account is credited.
what you described here is how Stripe works, but I agree it's not ideal.
The recommendation is to disable prorations when making the update, and add extra one-off invoice items (positive or negative) to adjust the total.
OK, so coupons are not meant to be used for subscription updates only for subscription renewals?
Or how do others usually handle this, is our way of using subscriptions with coupons and allowing upgrades an incorrect way of using it?
Another scenario that has just crossed my mind is what happens if a customer removes their coupon and makes an update, they will actually be charged more than expected.
following on from my previous example:
Unused time for 5 seats at 50% off: -270
Remaining time for 6 seats at full price: 648
Charge for adding extra seat: 378.
Again this seems incorrect. Are we wrong to be using coupons for subscriptions that can change?
What if we gave a customer a single use coupon to get started e.g. 50% off once. They use this to subscribe and then add a user, they would be charged much more for adding a single user?
I'd love to hear your ideas on how better we can design this.
Thanks
looking into this
hey there š this is related to one of the more complex parts of our Billing product, but essentially it comes down to the fact that the coupon was added to the customer before the upgrade was done
Proration invoice items can't have discounts applied to them, but at the time of calculating proration (i.e. at the time of the upgrade), Stripe automatically calculates an appropriate "adjustment" for the proration amount based on current & historically applied discounts and time fractions
to simplify this, the flow for your example was as follows:
- Subscription was created with no coupon/discount (2025-04-04)
- 100% off coupon was applied to customer (2025-06-05, 15:03:25 UTC)
- Subscription was upgraded (2025-06-05, 15:50:44 UTC)
when Stripe calculates proration for a subscription upgrade/downgrade, our system looks at a few factors:
-the pre-update pricing configuration
-how much time has passed in the billing cycle
-the post-update pricing configuration
-how much time remains in the billing cycle
we calculate the proration amounts accordingly
the reason coupons complicate this is that when a coupon is set on a subscription/customer, it rests in a sort of 'pending' state, until:
a) the next invoice is generated, or
b) an update changes the pricing configuration
at that point, the coupon gets 'applied' to the subscription
so all of that results in two proration items being calculated:
-
a credit, to refund the customer for the remaining time in the billing period on the previous plan
-
a debit, to bill the customer for the remaining time in the billing period on the new plan
the issue is that at the same time this calculation happens, the 100% off coupon is applied to the subscription, to the 2nd proration item (debit to bill for remaining time) factors in the 100% off coupon
ultimately this results in a $0 amount for the 2nd proration item, which is why the customer was credited rather than billed
we recognise that this is a tricky aspect to our Subscriptions product, and the behaviour isn't completely intuitive
the neatest way to get around all of this would be to apply the coupon after the subscription upgrade goes through, so that it will apply to the next invoice (rather than to the proration item)
Can someone help, I need to get sent the forgotten password email, your site has confirmed my email address is correct but your not sending me the email so I cannot log in . Your website won't let me contact u unless I sign in so please can u send the forgotten password email Ćo I can access my account please