QuickBooks
Convert an estimate to an invoice
Turns a QuickBooks estimate into an invoice, in full or in part. Intuit's API has no endpoint for this.
- Uses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.
- Needs Estimates on your QuickBooks connector.
- For assistants, the MCP tool convert_quickbooks_estimate_to_invoice.
Request
curl -X POST https://api.clickr.cloud/v2/integrations/quickbooks/estimates/convert-to-invoice \
-H "Authorization: Bearer $CLICKR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"txnId": "1187",
"percentage": "50",
"invoiceDate": "11/04/2026",
"dueDate": "12/04/2026",
"statusCallbackUrl": "https://example.com/clickr/runs"
}'const response = await fetch(`https://api.clickr.cloud/v2/integrations/quickbooks/estimates/convert-to-invoice`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CLICKR_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"txnId": "1187",
"percentage": "50",
"invoiceDate": "11/04/2026",
"dueDate": "12/04/2026",
"statusCallbackUrl": "https://example.com/clickr/runs"
}),
});
const data = await response.json();import os
import requests
response = requests.post(
"https://api.clickr.cloud/v2/integrations/quickbooks/estimates/convert-to-invoice",
headers={"Authorization": f"Bearer {os.environ['CLICKR_API_KEY']}"},
json={
"txnId": "1187",
"percentage": "50",
"invoiceDate": "11/04/2026",
"dueDate": "12/04/2026",
"statusCallbackUrl": "https://example.com/clickr/runs"
},
)
data = response.json()Response
{
"receipt": "6729c1f04b7e3d0012a91e07"
}Invoice the whole estimate by sending only txnId. For part of it, send a percentage or an amount, or set each line with lineItems; only one of the three.
Body
JSON, with Content-Type: application/json.
txnIdstringRequiredQuickBooks' transaction id for the estimate.
percentagestringInvoice this percentage of the estimate, as a number: 50 invoices half. Not with amount or lineItems.
amountstringInvoice this amount of the estimate, as a number. Not with percentage or lineItems.
lineItemsarray of objectsSets invoice lines one by one, each found by its match or, without one, by position. Not with percentage or amount.
matchobjectNames the invoice line this entry fills, instead of its position in the array. Matched exactly, ignoring case. Either every entry has a match or none does, and no two can be the same. Prefer it: a progress invoice carries over only the estimate lines with a balance left, so positions stop lining up once part of an estimate is invoiced.
productOrServicestringProduct or service name of the invoice line to fill.
descriptionstringDescription of the invoice line to fill.
productOrServicestringProduct or service name.
descriptionstringThe line's description.
dueobjectHow much of this line to invoice, where the account uses progress invoicing.
valuestringRequiredHow much of the line to invoice.
unitstringRequiredWhether value is a percentage or an amount.
One of percent, amount
qtystringQuantity, as a number.
ratestringUnit rate, as a number.
amountstringThe line's total, as a number.
invoiceNumberstringThe new invoice's number.
invoiceDatestringInvoice date, as MM/DD/YYYY.
dueDatestringDue date, as MM/DD/YYYY.
noteToCustomerstringThe note printed on the invoice.
memoOnStatementstringThe memo shown on the customer's statement.
statusCallbackUrlstringA URL Clickr POSTs the run's result to when it finishes, as JSON with your metaData. Sent once, with a 30-second timeout.
metaDataobjectAny JSON object of your own, such as your id for the job. Sent back with the result to statusCallbackUrl.
Response
200, as JSON, once the run is queued. What the run did comes from Get a run, or is POSTed to your statusCallbackUrl.
receiptstringThe id of the run this call started. Pass it to Get a run.
Errors
JSON with an error and, on most, a message saying what to change. All errors
| Status | Error | When |
|---|---|---|
| 401 | Bad input | The body is missing txnId, combines options that can't go together, or has a field in the wrong format. The message says which. |
| 401 | No API Key provided | The Authorization header is missing. |
| 401 | No account found for api key provided | The key isn't recognised: mistyped, revoked, or held by someone who has left the account. |
| 401 | No integration found for account | The account has no connector connected yet. |
| 401 | This integration is still pending setup… | QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do. |
| 403 | Forbidden | Your access on the account doesn't include this action. |
| 403 | Operation not allowed | Estimates isn't on your QuickBooks connector. |
| 403 | Daily cap exceeded | The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC. |