# Stripe: coupon_expired

> Stripe returns coupon_expired when a subscription uses a coupon past its redeem_by date. Create a new coupon or promotion code, and stop offering the old one.

Canonical: https://app369.com/fix/stripe-coupon-expired/
Last updated: 2026-11-09

coupon_expired is the Stripe error for a coupon that can no longer be applied, usually because its redeem_by date has passed. Customers who already have the discount keep it; new subscriptions can’t use it.

**Short answer**

Check the coupon in the Dashboard for its redeem_by date and redemption count. Create a new coupon, or a new promotion code on a valid coupon, and update every place the old ID is hard-coded: pricing pages, Checkout calls and emails.

Rather not fix it yourself? [**Stripe Billing Fix and Setup**](https://app369.com/fixed-price/stripe-billing-setup/) handles it at a fixed price, agreed before work starts.

## **Why Stripe refuses the coupon, and the fix**

1. 01 ### **The redeem_by date has passed**
  > “Either create a new coupon, or use an existing one that’s valid.” [**Stripe, Error codes (coupon_expired)**](https://docs.stripe.com/error-codes) A launch coupon with an end date stops working on that date. Make a new one for the next offer instead of reusing the old ID.```
const coupon = await stripe.coupons.create({
  percent_off: 20,
  duration: 'once',
  redeem_by: Math.floor(new Date('2026-12-31').getTime() / 1000),
});
```
2. 02 ### **The code still sits in the app**
  > “The latest date at which you can apply this coupon to customers.” [**Stripe, Coupons (redeem_by)**](https://docs.stripe.com/billing/subscriptions/coupons) A coupon ID hard-coded in a Checkout call or a pricing page link keeps failing after it ends. Read the current offer from config, and check the coupon before creating the session.
3. 03 ### **The redemption limit may be the real cause**
  > “Maximum number of times a coupon can be redeemed across all customers.” [**Stripe, Coupons (max_redemptions)**](https://docs.stripe.com/billing/subscriptions/coupons) A coupon that has hit max_redemptions stops applying too, though Stripe may report it with a different message. max_redemptions counts every use, by any customer, including promotion codes on that coupon. Raise the limit on a new coupon, or use per-code limits on promotion codes.
4. 04 ### **Existing customers keep a forever coupon**
  > “New customers can’t apply the coupon after the expiration date.” [**Stripe, Coupons (redemption limits)**](https://docs.stripe.com/billing/subscriptions/coupons) Also check: expiry only stops new uses. A customer who already has a forever coupon keeps the discount, so plan price changes with that in mind.

Checked against the vendor’s docs on November 9, 2026: [Stripe docs: Error codes](https://docs.stripe.com/error-codes); [Stripe docs: Coupons and promotion codes](https://docs.stripe.com/billing/subscriptions/coupons).

## **Rather hand it over?**

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

- [$950**Stripe Billing Fix and Setup**Subscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.**See scope and start**](https://app369.com/fixed-price/stripe-billing-setup/)
- [from $450**App Fix Ticket**One reproducible bug in an existing mobile or web app, diagnosed and fixed.**See scope and start**](https://app369.com/fixed-price/flutter-firebase-bug-fix/)
- [from $450**AI-Built App Rescue**A Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.****No issues worth fixing, no charge.**** If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.**See scope and start**](https://app369.com/fixed-price/ai-app-rescue/)

[**All 127 Fiverr reviews**](https://app369.com/reviews/)

Related: [**Stripe subscription past_due**](https://app369.com/fix/stripe-subscription-past-due/) · [**Stripe subscription incomplete**](https://app369.com/fix/stripe-subscription-incomplete-requires-action/) · [**Stripe email_invalid**](https://app369.com/fix/stripe-email-invalid/) · [**Stripe Checkout Session expired**](https://app369.com/fix/stripe-checkout-session-expired/)

Questions

## **More on this error**

<details>

<summary>**Can I extend an expired coupon? **+</summary>

Create a new coupon with the same discount and a later date. Promotion codes let you give the new coupon the same customer-facing code once you deactivate the old code.

</details>

<details>

<summary>**Do promotion codes expire separately? **+</summary>

Yes. A promotion code can have its own expires_at, which can’t be later than the coupon’s redeem_by.

</details>

<details>

<summary>**Can you fix it for me? **+</summary>

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.

</details>

A different error?

## **Describe it and get a written quote**

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.

[**Describe your problem **→](https://app369.com/contact/) [**All fixes**](https://app369.com/fix/)