## TL;DR
The quote is no longer in a state that allows conversion, usually because it was already converted, canceled, or expired. Re-fetch the quote, check its status, and if it is already converted, use the resulting invoice or subscription instead of converting again. If expired, duplicate it as a new quote.

```text
quote is not in an acceptable state
```

## Use this when
- Converting an accepted quote fails with a state error.
- A double-click or retry converted the quote twice.
- An old accepted quote is being converted after expiry.

## Not for this skill when
- The quote is still a draft. Drafts are edited, not converted.
- The acceptance itself failed. That is an accept-step problem.

## Steps
1. ('Re-fetch the quote and read its status. Verify: you know whether it is accepted, canceled, or expired.', 'If status shows converted, find the invoice or subscription it produced. Verify: the billing object already exists.', 'If the quote expired, duplicate it into a new quote and re-send for acceptance. Verify: the new quote is open.', 'Guard your conversion endpoint against double-submit: disable the button after the first click and make conversion idempotent. Verify: a second call returns the existing result.', 'If the quote was canceled, ask sales whether it should be revived. Verify: you have approval before re-quoting.')

## Variant phrasings
### stripe quote acceptable state error
Short search.

### stripe convert accepted quote failed
Action search.

### quote already converted stripe
Double-submit phrasing.


Compatibility: Stripe Billing quotes API, all client versions.

## Why it happens
Quotes are state machines: draft to open to accepted to converted, with cancel and expire as exits. Conversion is only valid from accepted, and it is a one-way transition. The error appears when two processes race (double-click, retry after a timeout) or when time passed (the quote expired after acceptance). Stripe rejects the second conversion because creating a second invoice from one quote would double-bill.

## Edge cases / pitfalls
- A timeout on the first conversion often means it actually succeeded. Check before retrying.
- Expired quotes keep their accepted status history but cannot convert. Read the current status.
- Your CRM may show "accepted" while Stripe shows "expired." Stripe is the source of truth.
- Quote line items can change prices between duplication and acceptance. Reconfirm with the customer.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_ATdIIJ1pml26MaKtX4Qh3w
