Send an estimate for approval
send_estimate takes a request_id and an estimate_id, emails the quote, and moves a draft to sent. The client opens the public page to view it and to accept or decline, which sets the status the conversion step later reads.
Written and reviewed by the Billr team. Published , last reviewed .
- Who this is for
- Anyone who needs a client answer recorded against a quote.
- Billr capabilities used
send_estimateget_estimatelist_estimates
What you need first
- A draft estimate, and a key with the billing or full profile because sending needs the send scope.
- A client email on file, or an explicit
toaddress. - A decision about how long the quote stays valid, reflected in
expiry_date.
Step by step
01Send it
request_idmakes delivery safe to retry.todefaults to the client email;cc,bcc,subjectandmessageare optional.send_estimate { "request_id": "7a3d9c25-4e81-4b6f-9d20-5c8b1f4a7e36", "estimate_id": "a4f1c8d2-6b39-4e07-9d51-2c8a6f3b1e94", "message": "Scope and dates are in this quote; happy to adjust before you accept." }02Track the reply from the client
list_estimatesfilters bystatus. A quote moves toviewedwhen the page is opened, then toacceptedordeclinedwhen the client answers there.list_estimates { "status": "accepted" }03Know what conversion will read
The conversion tool refuses declined and expired quotes, returns the existing invoice if the quote was already converted, and warns when a quote is being converted without formal acceptance.
04Keep the expiry meaningful
An expired quote is closed for conversion. If a client comes back after the expiry, revise or reissue rather than converting a stale number.
Worked example
Fictional account, field names as returned by the server
You say
Send EST-0213 to Harbor & Lane.
Your agent calls
send_estimate { "request_id": "7a3d9c25-4e81-4b6f-9d20-5c8b1f4a7e36", "estimate_id": "a4f1c8d2-6b39-4e07-9d51-2c8a6f3b1e94" }
Expected response, abridged
{
"summary": "Sent estimate EST-0213 to accounts@harbor-lane.example.",
"to": "accounts@harbor-lane.example",
"public_url": "https://billr.cc/e/9dK2wQ8mZp"
}Limits and gotchas
- Sending needs the send scope, so a Read and draft key cannot deliver a quote.
- The client accepts or declines on the public page; there is no MCP tool that records an acceptance on their behalf.
- A converted estimate cannot be sent again; it already has an invoice.
- Estimates carry no payment state, and a client cannot pay against a quote.
Troubleshooting
- The call is refused with a permission message
- The key lacks the send scope. Create a billing key, or send the estimate from the dashboard.
- The status never moves past sent
- The client has not opened the page. Check the recipient address on the result and confirm the message arrived.
- The client wants changes after accepting
- Treat it as new scope: revise is not possible once accepted, so create a fresh estimate or an invoice for the difference.
Sources
Reviewed 2026-09-20 against Billr's own tool implementations and the client documentation linked above.
Read next
Acceptance happens on the client side, so the conversion step is written to say plainly whether the quote was formally accepted.
Convert an accepted estimate