# How quotes work Learn how to provide price estimates to customers before starting a subscription or invoice. Quotes allow you to provide your customers with a price estimate for requested goods or services. You can combine recurring and one-off line items, and include any discounts or taxes. After your customer accepts the quote, you can convert it into a recurring *subscription* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis) or a one-time *invoice* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice). ## Send and accept quotes To send and accept quotes for one-time invoices: 1. Log in to your Stripe Dashboard. 1. On the [Your plans page](https://dashboard.stripe.com/settings/plans?utm_source=docs-quotes), sign up for [Invoicing Plus](https://stripe.com/invoicing/pricing). Learn more about [accessing quotes](https://support.stripe.com/questions/how-to-access-quotes). ## Quote statuses Quotes can transition between these statuses: How a quote status changes (See full diagram at https://docs.stripe.com/quotes) | Status | Description | Possible actions | | ---------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `draft` | The starting status for all quotes. You can still edit the invoice when it’s in draft status. | - [Finalize](https://docs.stripe.com/quotes.md#finalize) the quote to move it to an `open` status. - [Cancel](https://docs.stripe.com/quotes.md#cancel) the quote to move it to a `canceled` status. | | `open` | The quote is finalized and awaiting action from the customer. You can only edit the expiration date. | - [Accept](https://docs.stripe.com/quotes.md#accept) the quote to move it to an `accepted` status. - [Cancel](https://docs.stripe.com/quotes.md#cancel) the quote to move it to a `canceled` status. | | `accepted` | The customer accepted the quote. The quote generates an invoice, subscription, or subscription schedule. | N/A | | `canceled` | The quote expired or was canceled. You can no longer accept it. | N/A | ### Finalize a draft quote Quotes are initially created as a `draft`. In this status, you can edit the quote and make any required changes. You can finalize the quote when you’re ready to send it to your customer. Finalizing the quote assigns a `number` to it. The number consists of four parts: - The prefix `QT` - The customer’s invoice prefix - The quote sequence - The revision sequence For example, `QT-68BB114-0001-1` is the first quote for a customer, and the quote is on the first revision. Quote number `QT-68BB114-0001-2` is the same quote, but on the second revision. `QT-68BB114-0002-1` is the second quote for the customer. You can use the API to finalize a quote, as shown in the following example: ```curl curl -X POST https://api.stripe.com/v1/quotes/qt_1HDGlYClCIKljWvsIGaAA06B/finalize \ -u "<>:" ``` Quotes can transition from a `draft` status to one of the following end statuses: - `open`: The API endpoint [POST /v1/quotes/:id/finalize](https://docs.stripe.com/api/quotes/finalize.md) emits a `quote.finalized` webhook. - `canceled`: The API endpoint [POST /v1/quotes/:id/cancel](https://docs.stripe.com/api/quotes/cancel.md) emits a `quote.canceled` webhook. ### Accept a quote After your customer agrees to the quote, you can mark the `open` quote as `accepted`. Accepted quotes automatically generate an invoice, subscription, or subscription schedule. - **Quotes with recurring prices**: A subscription schedule is created if the effective date on the quote is in the future. Otherwise, a subscription is created. The first invoice on the subscription is in `draft` status with `auto_advance` set to `true`. - **Quotes without recurring prices**: A `draft` invoice is created with `auto_advance` set to `false`. You can modify the invoice before finalizing and sending it to your customer for payment. #### Dashboard You can use the Dashboard to mark a quote as accepted. 1. In the Stripe Dashboard, go to the [Quotes](https://dashboard.stripe.com/quotes) page. 1. Select the quote you want to mark as accepted. 1. On the quote details page, click **Convert to invoice** or **Convert to subscription**. #### API You can use the API to mark a quote as accepted, as shown in the following example: ```curl curl -X POST https://api.stripe.com/v1/quotes/qt_1HDGlYClCIKljWvsIGaAA06B/accept \ -u "<>:" ``` When a quote transitions from an `open` status to `accepted`, the API endpoint [POST /v1/quotes/:id/accept](https://docs.stripe.com/api/quotes/accept.md) emits a `quote.accepted` webhook. ### Cancel a quote If your customer rejects the quote or you no longer want it to be valid, you can cancel the quote. To do so, mark the `draft` or `open` quote as `canceled`, or wait for these quotes to automatically cancel when they reach the expiration date. You can’t accept canceled quotes. #### Dashboard You can use the Dashboard to cancel a quote. 1. In the Stripe Dashboard, go to the [Quotes](https://dashboard.stripe.com/quotes) page. 1. Select the quote you want to cancel. 1. On the quote details page, click the overflow menu (⋯), then click **Cancel quote**. #### API You can use the API to cancel a quote, as shown in the following example: ```curl curl -X POST https://api.stripe.com/v1/quotes/qt_1HDGlYClCIKljWvsIGaAA06B/cancel \ -u "<>:" ``` When a quote transitions from a `draft` or `open` status to `canceled`, the API endpoint [POST /v1/quotes/:id/cancel](https://docs.stripe.com/api/quotes/cancel.md) emits a `quote.canceled` webhook. ## Download a quote PDF Use the PDF method to [download a quote PDF](https://docs.stripe.com/api/quotes/pdf.md): ```curl curl https://files.stripe.com/v1/quotes/qt_0J1EnX589O8KAxCGEdmhZY3r/pdf \ -u "<>:" ``` Instead of returning data in JSON format, the PDF method returns a stream of data that represents the byte sequences of the incoming data. The byte stream is read in chunks or segments as the data streams in, allowing you to start processing incoming data before the entire data load completes. This method is especially useful for handling large data or real-time data processing. ![Quote PDF](https://b.stripecdn.com/docs-statics-srv/assets/generated-quote-pdf.712c5fe734adfbfbc1a7efc136e00636.png) The generated quote PDF