Tell Me When Down
How it worksWhat we checkPricing
BlogFree toolsCompareDocs
Log inGet started
All posts
Stripe webhooks you can trust

Stripe subscription not activating after payment

July 18, 2026·5 min read
A dim locked gate at night — a paid customer still shut out because the subscription never switched on.

The customer paid. Stripe shows the payment. But in your app they're still on the free plan, still locked out of the thing they just bought. Before you dig through code, this splits into two very different problems — and the first thing to check tells you which one you have.

Start with the subscription's status

Open the subscription in Stripe and read its status. That one field decides everything about where you look next:

If the status is active, Stripe considers this customer paid and subscribed — so the failure is on your side, in the code that's supposed to grant access. If it's anything else — incomplete, past_due — Stripe never fully activated it, and the problem is in the payment itself, before your app ever gets involved.

"They paid" and "the subscription is active" are not the same thing. A card can be charged for a one-off amount while the recurring subscription sits in incomplete — the money moved, but the subscription never switched on. The status field is the truth, not the receipt.

Case 1: the subscription is incomplete

A new subscription starts in incomplete and only becomes active once its first invoice is actually paid. If that first payment needs extra authentication (3D Secure), the card is declined, or the customer closes the tab before the confirmation step finishes, the subscription gets stuck there.

And it doesn't wait forever. If the initial payment isn't completed within roughly 23 hours, Stripe cancels the incomplete subscription outright. So a customer who "paid yesterday" but hit an authentication wall can end up with no subscription at all — which reads, to them, as "I paid and got nothing."

The fix here is on the checkout side: make sure your flow completes the payment confirmation, handles the authentication step, and surfaces a decline instead of leaving the customer on a spinner.

Case 2: active in Stripe, not in your app

If Stripe says active but your app hasn't upgraded the user, the payment worked and the message that was supposed to tell your app never landed. This is a webhook problem, plain and simple: the event that flips a user to paid — checkout.session.completed, customer.subscription.updated, invoice.paid — either wasn't received or wasn't processed.

That's the exact scenario behind Stripe webhooks failing silently: the payment succeeds, so nothing looks broken, but the provisioning event got a 400 or a 500 and never took effect. If verification is the culprit, it's usually the raw-body signature trap.

This prompt walks the whole diagnosis and tells you which case you're in:

paste into Claude or ChatGPT
A customer paid but their subscription still isn't active in my app. Help me find where it broke. I'm using Stripe with <FRAMEWORK>.

Walk me through it in order:
1. In Stripe, what STATUS is the subscription in — active, incomplete, past_due, or something else? Explain what each status means for whether the customer actually has access.
2. If it's "incomplete," explain that the initial payment hasn't finalized yet, and what causes that (payment needs authentication, card declined, or the confirmation step never completed on checkout).
3. If the subscription IS active in Stripe but NOT in my app, the problem is on my side: which webhook events should flip the user to paid (e.g. checkout.session.completed, customer.subscription.created/updated, invoice.paid), and is my handler receiving and processing them?
4. Show me how to check my webhook delivery log in Stripe for those events and whether they returned 2xx.

Tell me how to distinguish "Stripe never activated it" from "Stripe activated it but my app didn't hear."

The version you don't have to notice

Both cases share a cruel property: nothing in your app announces them. The customer is the alarm, and by the time they email, they've already paid for access they didn't get. The webhook that quietly stopped provisioning users looks identical to one that's working.

Watching the endpoint from outside closes that gap — the moment your billing webhook starts erroring instead of returning 2xx, you get an email, while there's still time to replay the events and upgrade the accounts that got stuck.

Know the day activations stop — not when a customer writes in.

Join Tell Me When Down free and we'll watch the Stripe webhook your upgrades depend on. When it starts failing to activate paying customers, you get an email in minutes — in time to replay the events, not refund the anger.

Watch my webhookfree · no card required
more on stripe webhooks you can trust
Stripe webhooks failing silently — and how to catch itThe payment succeeds even when the webhook fails, so nothing looks broken until a customer writes in. The real retry-and-disable timeline, the raw-body trap, and how to catch it inside the window.Stripe webhook signature verification failed: the raw-body fix"No signatures found matching the expected signature" almost always means a body parser changed the request bytes before verification ran. Here's what Stripe actually compares, and the raw-body fix for each framework.Stripe webhook duplicate events: stop the double chargeStripe's delivery is at-least-once, so the same event can arrive twice and charge a customer twice. Here's why it happens, and how to make your handler idempotent with the event id so running it twice is safe.How to test Stripe webhooks locally (and what it won't prove)The Stripe CLI brings events to your machine — stripe listen forwards them, stripe trigger fires them. Here are the commands, the signing-secret gotcha, and why passing locally doesn't prove the live endpoint works.

spot something wrong or out of date? [email protected] — we'll fix it

Tell Me When Down

Uptime and security monitoring for people who'd rather ship than babysit servers. We watch so you can sleep.

product
How it worksWhat we checkPricingDocsBlogFAQ
free toolsWebsite security scanSupabase pause checkRender sleep checkMixed content checkerSecurity headers checkCookie security checkSSL expiry check
comparevs UptimeRobotvs Better Stackvs PingdomFor indie hackers
company
StatusAbout our botSupportPrivacyTerms
© 2026 TellMeWhenDown · tellmewhendown.com