Stripe coupon "duration_in_months" vs "forever": invoice impact
Chooses between Stripe coupon duration_in_months and forever. Use when a discount should run for a fixed number of months versus the life of the subscription. Not for one-time invoice discounts.
TL;DR
A Stripe coupon with durationinmonths discounts exactly that many invoice cycles and then drops off; forever keeps discounting until removed. The invoice impact is identical in the early months, which is why the wrong choice surfaces later as a surprise full-price invoice. Pick durationinmonths for promotions with an end date and forever only for negotiated permanent pricing. Record the choice on the customer record so support can answer 'why did my bill go up' in one look.
The query
Stripe coupon "duration_in_months" vs "forever": invoice impactUse this when
- Promo pricing that should end after N months
- A customer complaining their bill went up after a promo ended
- Deciding coupon duration for a negotiated deal
Not for
- One-off credits (use customer balance or invoice-level discounts)
- Trials (use trial periods, not coupons)
Steps
- Decide the commercial intent: fixed-term promo or permanent negotiated price.
Expected output: The choice maps to durationinmonths or forever.
- Create the coupon with duration set to in_months and the count, or forever.
Expected output: The coupon object encodes the intended lifespan.
- Apply it to the customer or subscription and preview the next few invoices.
Expected output: You see the discount fall off at the right cycle.
- Note the coupon and its end date on the customer record or in your CRM.
Expected output: Support can explain future bill changes instantly.
- Set a reminder or webhook check before the final discounted invoice.
Expected output: The customer is warned before the price steps up.
Variant phrasings
Stripe coupon durationinmonths vs forever
coupon expires after N months Stripe invoice
Stripe promo pricing end date
Root cause
The duration lives on the coupon because Stripe applies the same coupon object across invoices over time; it needs to know when to stop. durationinmonths counts invoice cycles for that subscription, not calendar months from creation, which matters for paused or irregular billing.
Edge cases
- A coupon applied at the customer level affects all their subscriptions; scope it if needed
- Removing a forever coupon mid-negotiation requires an explicit removal; it never self-expires
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_4w0XvroKPmXoyeZ3tVulTA
Maintainer review
No maintainer verification is recorded for this version.
This records the version a maintainer checked. It does not assert that the version is the latest upstream release.