stripe subscription moved to "incomplete_expired": first invoice payment never confirmed
Explains the Stripe incomplete_expired subscription state after the first invoice payment was never confirmed, and how to retry collection or recreate the subscription. Use when a new subscription dies before going active. Not for past_due renewals on already-active subscriptions.
TL;DR
The first invoice was never paid and expired, so Stripe parked the subscription in incomplete_expired instead of activating it. Do not try to reactivate the expired subscription. Collect payment by creating a new invoice or a fresh subscription with the same parameters, then cancel the expired one.
stripe subscription moved to "incomplete_expired": first invoice payment never confirmedUse this when
- A new Stripe subscription shows status incomplete_expired.
- The first invoice for a trial or new signup was never confirmed within the allowed window.
- You need to decide between re-invoicing the same customer or starting over.
Not for this skill when
- An existing subscription failed a renewal payment. That is past_due, a different flow.
- The payment was confirmed but the webhook never fired. That is a webhook-delivery problem.
- You want to change billing terms on an active subscription. Use subscription updates instead.
Steps
- ('Check the invoice state: the open invoice attached to the expired subscription shows why payment lapsed (no payment method, 3DS abandoned, method declined). Verify: the invoice is void or uncollectible, not still payable.', 'Cancel the incomplete_expired subscription (or leave it; it will not bill). Verify: no new invoices generate from it.', 'Create a new subscription for the customer with the same price and trial settings. If you still hold a usable payment method, attach it before creating. Verify: the new subscription enters trialing or active, not incomplete.', 'If the customer owes for the missed first period, create a one-off invoice for the lapsed amount. Verify: the invoice shows paid before you deliver anything.', 'Tell the customer the old signup lapsed and the new one is live, with the same payment method if they already entered it.')
Variant phrasings
incomplete_expired stripe subscription
Same state, shorter search.
stripe first invoice expired subscription not active
Symptom phrasing.
reactivate incomplete_expired subscription stripe
The common wrong instinct; answer is you cannot, you recreate.
Compatibility: Stripe Billing API, any client version with subscription statuses. The incomplete_expired status exists wherever trial/invoice payment confirmation is required.
Why it happens
Stripe treats the first invoice as a confirmation step: the subscription only becomes active once money actually moves. When the invoice is never confirmed within the collection window, Stripe refuses to guess that the customer agreed, so it parks the subscription in incomplete_expired instead of silently starting billing. It is a guard against billing customers who never finished signing up.
Edge cases / pitfalls
- You cannot move an incomplete_expired subscription back to active or trialing. Recreate it.
- The expired first invoice may still be payable if it was not voided. Void it or risk a double bill if the customer pays it later.
- If 3DS abandonment caused the lapse, collect on the new subscription with a proper 3DS redirect flow.
- Delete the expired subscription from customer-facing views so support is not confused by two subscriptions.
Provenance
Resolved from the public thread: https://vectle.com/posts/pstk2IM0ifi9z9lyjQNJWSdg