Subscription

A Stripe subscription bills a customer on a repeating schedule until it is canceled. Learn its statuses, the events it fires, and which changes to watch.

Updated October 1, 2026

A subscription is an agreement to charge a customer on a repeating schedule, such as $49 every month or $480 every year, until someone stops it. For a SaaS product, membership, or subscription box, it's the object that turns one signup into revenue you can count on next month. Its changes decide whether that revenue grows or shrinks.

How Stripe subscriptions work

A Stripe Subscription links a customer to one or more recurring prices. Each billing period, the subscription creates an invoice, and Stripe tries to collect it from the customer's saved payment method. For automatically charged invoices, Stripe waits about an hour after creating the invoice before it attempts payment.

If changes need to happen on a timeline, such as an introductory price that rises after three months, attach a subscription schedule to the subscription.

Stripe subscription statuses

The status field shows where the subscription stands.

  • trialing means the customer is in a free trial and hasn't paid yet.
  • active means the subscription is in good standing.
  • incomplete means the first payment failed or needs customer authentication. The customer has 23 hours to pay. After that the status becomes incomplete_expired and the subscription never bills.
  • past_due means a renewal payment failed and Stripe is retrying.
  • unpaid and canceled are where a subscription can land after retries run out, depending on your Dashboard settings.
  • paused most often means a free trial ended without a payment method and you chose to pause instead of cancel.

Subscription events

Every change fires an event. These are the ones to know:

  • customer.subscription.created fires when a subscription is created, even if its status is trialing or incomplete.
  • customer.subscription.updated fires when the plan, quantity, coupon, or status changes, including a trial becoming active.
  • customer.subscription.trial_will_end fires three days before a trial ends.
  • customer.subscription.deleted fires when the subscription ends.
  • customer.subscription.paused and customer.subscription.resumed fire when a subscription enters or leaves paused.

Why the lifecycle matters

A new subscription isn't money collected. customer.subscription.created fires for trials and for first payments that haven't gone through, so a team that celebrates every creation event will overcount wins. The reliable signal that you got paid is invoice.paid.

Status changes after that matter more. When a renewal fails and the subscription goes past_due, the revenue is still on your books, but time is running out. Stripe's recommended Smart Retries setting is 8 tries within 2 weeks. After the last attempt, the subscription moves to whatever you configured, which is canceled, unpaid, or left past due. Customers who lapse this way become involuntary churn, often without ever deciding to leave.

Scheduled cancellations are easy to miss. When a customer cancels at period end, Stripe sets cancel_at_period_end and fires customer.subscription.updated, not deleted. The deletion event arrives when the paid-through period is over, which can be weeks later.

Each of these changes moves your MRR, which is why subscription events feed your revenue metrics.

What to do at each stage

  • New subscription. The founder or success team checks the status. If it's active, start onboarding while the customer is engaged. If it's trialing, plan for the conversion date.
  • Plan change. An upgrade is a reason to talk to the customer. A downgrade is worth a short, personal note asking what changed.
  • Past due. Finance or support reaches out before retries run out. A personal email asking the customer to update their card often works faster than automated reminders.
  • Scheduled cancellation. You have until the period ends to learn why and make an offer.
  • Canceled. Record the reason. Stripe's cancellation_details.reason separates cancellation_requested from payment_failed and payment_disputed, which tells you whether you have a product problem or a billing problem.
  • Engineering. Grant and revoke access from webhook events, not from checkout redirects, so your app matches what Stripe has on record.

Subscriptions in ChargeBell

ChargeBell turns subscription events into plain-English Slack messages. The new subscription alert posts the plan, the customer when Stripe provides it, and the MRR change as a monthly figure. Trial and incomplete signups post without an MRR figure. The alert doesn't show the status itself, so check it in Stripe. Separate alerts cover plan upgrades and downgrades, trials ending soon, cancellations with their lost MRR, failed payments, and recovered payments.

Each alert type can go to its own channel, for example new subscribers to #wins and failed payments and cancellations to #billing or #founders. The Stripe connection is read-only, so ChargeBell reports on a subscription but can never create, change, or cancel one. For a full setup, see how to monitor Stripe subscriptions in Slack.

Get alerted in Slack

Stripe events: customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, customer.subscription.trial_will_end, customer.subscription.paused, customer.subscription.resumed

# wins

ChargeBellAPP

🎉 New subscriber: $49.00/month

Acme Corp · Pro Monthly

MRR impact: +$49.00/mo

Related terms