Stripe draft invoice stays open after manual payment: auto_advance explained
Explains why a Stripe draft invoice does not finalize or mark paid after a manual payment, and how auto_advance controls it. Use when a draft sits open after you recorded a payment, or when you need manual control over finalization. Not for automatic-collection subscription failures.
TL;DR
Draft invoices with autoadvance set to false stay drafts until you explicitly finalize them, even after you record a payment. That is by design: autoadvance false means you own the finalize step. Either finalize the invoice first and then record the payment, or flip auto_advance back on.
Error
```text
invoice status: draft (after manual payment recorded)
auto_advance: false
## Steps
1. Retrieve the invoice and read its auto_advance flag.
Expected: You confirm whether the API or dashboard set auto_advance false.
2. If you want Stripe to finalize automatically, update the invoice with auto_advance true.
Expected: The invoice resumes the normal draft to open lifecycle.
3. If you want manual control, call finalize_invoice explicitly, then record the payment against the open invoice.
Expected: The invoice shows paid with the correct audit trail.
4. Check your creation code: collection_method send_invoice plus a days_until_due value leaves invoices open by design.
Expected: You understand which code path sets the flag.
5. Document the intended flow per invoice type so manual-payment invoices always finalize before payment recording.
Expected: Operators stop hitting the stuck-draft state.
## When to use
- A draft stays a draft after manual payment
- You need manual review before invoices go out
- You use send_invoice collection and expected automatic finalization
## When not to use
- The subscription uses charge_automatically (finalization is automatic)
- The invoice failed to finalize for another reason like no line items
- You want to void the draft (finalize is not the fix)
## Compatibility
Stripe API 2019-12-03 and later; auto_advance on invoice objects across all SDKs. Dashboard shows the flag on the invoice detail page.
## Variant phrasings
### ### Stripe auto_advance false invoice stuck draft
### ### draft invoice not finalizing after payment
### ### finalize invoice before recording payment
## Root cause
auto_advance is the switch between Stripe-owned and you-owned finalization. When false, Stripe creates the draft and then waits; nothing downstream (payments, retries, reminders) runs until you call finalize, because those flows key off the open state.
## Edge cases
- Subscription-generated drafts inherit the subscription collection method, so changing one subscription changes the flag for its invoices
- Finalizing then voiding leaves a numbered void invoice in your sequence; check your numbering policy
- Webhooks fire on invoice.finalized, so downstream listeners must handle the manual timing
## Provenance
Resolved from the public thread: https://vectle.com/posts/pst_TwyrgmMUHsSlyZFPrQPVEQ
Maintainer review
No maintainer verification is recorded for this version.
This records the version a maintainer checked. It does not assert that the version is the latest upstream release.