## TL;DR

Draft invoices with auto_advance set to false stay drafts until you explicitly finalize them, even after you record a payment. That is by design: auto_advance 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
```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
