Subscription grace period
A subscription grace period is the time a customer keeps access after a failed payment while retries run. In Stripe, it is the past_due window. How to set it.
Updated October 1, 2026
A subscription grace period is the time after a failed subscription payment during which the customer keeps access while you try to collect. You don't lock someone out the moment a card declines. The retry schedule and the customer both get a chance to fix it. Most first failures are temporary, so cutting access right away punishes customers who would have paid.
How a grace period works in Stripe
Stripe has no setting called "grace period". You build one from two parts:
- Stripe's retry window. When a renewal fails, the subscription moves to
past_due, and Smart Retries or a custom schedule keeps trying. You pick the window from 1 week, 2 weeks, 3 weeks, 1 month or 2 months. Stripe recommends 8 tries within 2 weeks. - Your access rules. Stripe tracks the status, and your app decides what a
past_duecustomer can still do. Stripe's docs say to revoke access once a subscription isunpaid, because payments were already retried while it was past due.
When the retry window ends, the subscription follows your failed payment settings. It is canceled, marked unpaid or left past_due. If a retry succeeds, or the customer pays the latest invoice while the subscription is past_due, it goes back to active.
Events mark the edges of the window. invoice.payment_failed opens it. customer.subscription.updated records the move to past_due and back. invoice.paid closes it with a payment, and customer.subscription.deleted closes it with a cancellation.
Two cases work differently. A failed first payment leaves the subscription incomplete, and the customer has 23 hours to pay before it becomes incomplete_expired. Invoices with the send_invoice collection method are paid by the customer against a due date, with no automatic retries.
How long should a grace period be?
It is a trade-off:
- Too short, and you cancel customers whose card would have cleared on the next retry, or who needed a few days to update it.
- Too long, and you give service to accounts that will never pay, while your active customer count looks better than your cash.
Some rules of thumb:
- Match access to Stripe's retry window, so you never lock out a customer Stripe is still trying to charge.
- Give annual plans and large accounts longer. A week of free access costs little next to a lost renewal.
- Keep it shorter where each active account has real costs, such as seats, usage or shipped goods.
- Check when your recovered payments actually recover. If nearly all of them succeed in the first week, a two-month window mostly adds bad debt.
What to do during the grace period
- Tell the customer. Stripe's failed payment emails include a link to update the payment method.
- Show it in the product. A banner for
past_dueaccounts ("your last payment failed, please update your card") reaches people who ignore billing email. - Escalate hard declines. If Stripe can't retry the decline, such as a lost or stolen card, support or the founder should reach out now, not on day 14.
- Decide the ending in advance. Choose what happens on the last day, whether that is a downgrade, a lock or a cancellation. The founder makes that call once.
Accounts still unpaid when the window closes become involuntary churn. A good dunning process is how you make the grace period count.
Grace periods and ChargeBell
A grace period only helps if someone knows it started. ChargeBell's invoice payment failed alert posts a declined renewal to Slack with the customer, amount and decline reason. It is critical, so it skips quiet hours. When a retry succeeds, a payment recovered alert tells the team the clock has stopped. Send both to #billing, so the person who owns follow-up sees the whole window. For the rest of the subscription picture, see how to monitor Stripe subscriptions in Slack.
Get alerted in Slack
Stripe events: invoice.payment_failed, customer.subscription.updated, invoice.paid, customer.subscription.deleted
ChargeBellAPP
⚠️ A $499.00 payment didn't go through
@channel
billing@acmecorp.com · Your card has insufficient funds.
Check Stripe to see if it will be retried.