Stripe subscription not activating after payment

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.
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:
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.
spot something wrong or out of date? [email protected] — we'll fix it