Convert an accepted estimate into an invoice

convert_estimate_to_invoice copies the accepted quote into a draft invoice and links the two. It refuses declined and expired quotes, returns the existing invoice when the quote was already converted, and notes when a quote was converted without formal acceptance.

Written and reviewed by the Billr team. Published , last reviewed .

Who this is for
Anyone who quotes work and starts it once the client agrees.
Billr capabilities used
convert_estimate_to_invoiceget_estimateget_invoice

What you need first

  • An estimate that has been sent and answered, ideally with status accepted.
  • A key with the Read and draft profile.
  • The estimate id, from list_estimates or get_estimate.

Step by step

  1. 01Check the estimate status

    get_estimate returns the status and the converted invoice id when there is one. Converting an already-converted quote is safe but pointless, and the server says so.

    Example
    get_estimate  {
      "estimate_id": "a4f1c8d2-6b39-4e07-9d51-2c8a6f3b1e94"
    }
  2. 02Convert it

    Only the estimate id is required. issue_date and due_date are optional overrides for the new draft, which otherwise takes today and the business payment terms.

    Example
    convert_estimate_to_invoice  {
      "estimate_id": "a4f1c8d2-6b39-4e07-9d51-2c8a6f3b1e94"
    }
  3. 03Read the result carefully

    The summary names the new invoice number and total, and mentions when the estimate was not formally accepted. already_converted: true means nothing new was created and the existing invoice came back.

  4. 04Send it when you are ready

    The new invoice is a draft like any other, so it is reviewed, corrected and then sent with send_invoice under a key that has the send scope.

Worked example

Fictional account, field names as returned by the server

You say

Harbor & Lane accepted EST-0213, turn it into an invoice.

Your agent calls

  • convert_estimate_to_invoice { "estimate_id": "a4f1c8d2-6b39-4e07-9d51-2c8a6f3b1e94" }

Expected response, abridged

Example
{
  "summary": "Converted estimate EST-0213 into draft invoice INV-1151: $4,100.00. Call send_invoice to deliver it.",
  "already_converted": false,
  "invoice": {
    "invoice_number": "INV-1151",
    "status": "draft",
    "total": 4100
  }
}

Limits and gotchas

  • Declined and expired quotes cannot be converted; create a fresh estimate instead.
  • The estimate becomes converted and can no longer be edited or sent.
  • Converting does not send anything. Delivery is a separate, scope-checked call.
  • The invoice takes the estimate lines as written; it does not attach logged time or expenses.

Troubleshooting

"Estimate EST-0213 is 'declined'"
The client declined this quote. Reissue the scope as a new estimate and get an acceptance before invoicing.
The summary warns the estimate was not formally accepted
The quote was still sent or viewed. Convert only when you have the client agreement you rely on; the note exists so the record is honest.
Two invoices exist for one quote
Only one invoice can be linked, and retries return it rather than creating another. Check the estimate for converted_invoice_id before assuming a duplicate.

Sources

Reviewed 2026-09-20 against Billr's own tool implementations and the client documentation linked above.

The invoice is a draft, so review it before sending. Source work is not involved here, which makes the draft the only place to make changes.

Review the new draft