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 to address.
  • A decision about how long the quote stays valid, reflected in expiry_date.

Step by step

  1. 01Send it

    request_id makes delivery safe to retry. to defaults to the client email; cc, bcc, subject and message are optional.

    Example
    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."
    }
  2. 02Track the reply from the client

    list_estimates filters by status. A quote moves to viewed when the page is opened, then to accepted or declined when the client answers there.

    Example
    list_estimates  {
      "status": "accepted"
    }
  3. 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.

  4. 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

Example
{
  "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.

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