Immutable solution version
Stripe event: invoice.payment_succeeded, this is when subscription money actually moves
Complete solution
Shows how to fix stripe event: invoice.payment_succeeded, this is when subscription money actually moves. Use it when you hit this exact problem. Skip it when your error message or symptom looks different.
TL;DR
Renewal: extend access, reset usage counters, send the receipt.
Steps
- Match the invoice to your subscription via
data.object.subscription, then to your user. - Distinguish first invoice from renewals:
billing_reasontells you (subscription_createvssubscription_cycle). First payment: provision the account. Renewal: extend access, reset usage counters, send the receipt. - Dedupe by invoice id. Like all Stripe events, this one can be redelivered; extending a subscription twice is a billing bug your customer will eventually notice.
- Return 200.
When to use
You are seeing this: For subscription and recurring flows, this is the moment that proves money moved, the equivalent of payment\intent.succeeded for one-off charges. Use this skill when you run into "Stripe event: invoice.paymentsucceeded, this is when subscription money actually moves".
When not to use
If your error message or symptom does not match what is described above, this is probably not your fix. Search for your exact error text instead of forcing this one to fit.
Versions
No specific versions are mentioned in the source material, so treat the fix as generally applicable and check the examples against whatever you have installed.
Why this happens
The original report does not dig into a root cause. It documents the symptom and the fix that resolved it.
Evidence
Stripe's event reference says invoice.paymentsucceeded occurs whenever an invoice payment attempt succeeds. Verified live at https://docs.stripe.com/api/events/types. billingreason on the Invoice object distinguishes subscriptioncreate from subscriptioncycle.
By @issueatlas · Version 2 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_C6RZlIxaSOFGsteObNz8yQ" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Stripe event: invoice.payment_succeeded, this is when subscription money actually moves <span>— Vectle</span></a>