Draft acceptance rate: three outcomes it has to separate
In short
Draft acceptance rate is only informative when it separates 3 outcomes: sent unchanged, sent after an agent edited it, and discarded without being used. Collapsed into one percentage it measures adoption at best and nothing at worst — and a very high figure almost always means the denominator is quietly dropping the drafts agents never opened.
Key takeaways
- 3 outcomes, not 1 rate: sent unchanged, sent after edits, discarded. Report all 3 or none.
- The middle outcome carries the signal. What agents change is what the system is getting wrong.
- A rate above about 90 per cent is usually a denominator that excludes unopened drafts.
- Sent unchanged is not the same as correct — an unread draft ships whatever is in it.
- Watch the distribution of edit distance, not its mean. Two peaks mean two different problems.
Draft acceptance rate is the share of generated drafts that an agent actually used, and it is worth reporting only when it splits into 3: sent with no change, sent after the agent edited it, and discarded. Those are 3 different verdicts on the system. One says the draft was right; one says it was close and names what was wrong; one says it was useless or slower than typing. Averaged into a single percentage they cancel each other out.
The middle outcome is the one worth building instrumentation for. A discarded draft tells you something failed; an edited draft tells you exactly which sentence failed, in the agent's own words, at no labelling cost. That is why acceptance is a measurement question before it is a model question. What a draft has to carry for any of it to be recordable is set out in what a drafted reply must contain before it is sent.
Three verdicts, and the event that proves each one
| Outcome | The event that establishes it | What it actually tells you |
|---|---|---|
| Sent unchanged | Outbound body is byte-identical to the draft after signature and greeting normalisation | Either the draft was right, or nobody read it. On its own it cannot distinguish the two |
| Sent after edits | Outbound body differs from the draft, and the draft was open when the edit began | The most useful record you have: what was wrong, sentence by sentence |
| Discarded | Draft existed, agent sent a reply, no textual overlap above your threshold | The draft was wrong, off-voice, or slower to fix than to replace |
| Never opened | Draft generated, agent never expanded or focused it | An adoption or interface problem, not a quality one. Keep it out of the quality rate |
| No draft offered | Generator refused, retrieval empty, or the intent was out of scope | Coverage, which is a separate number and should never sit in this denominator |
Note the last 2 rows. They are not outcomes of a draft; they are outcomes of the system deciding whether to draft at all. Folding them in is the single most common way an acceptance figure becomes meaningless, and it moves the number in whichever direction the person reporting it prefers.
Five ways the denominator quietly flatters you
- Unopened drafts excluded. The population becomes drafts agents already chose to engage with, which is circular — and it is why very high figures should be read as a bug report about the query.
- Internal notes counted with public replies. A note has a different audience and a different failure cost — see the internal note the customer never reads. Mixing them makes the rate move when the mix moves.
- Regenerations counted as separate drafts. One agent pressing regenerate 3 times before sending reads as 33 per cent or 100 per cent depending purely on how you group.
- Merged and closed tickets left in. A draft on a ticket that was merged away was never sendable by anyone, and belongs outside the population rather than in the discard bucket.
- One pilot cohort standing in for the team. Volunteers accept more; a fall at general rollout is composition, not regression — as the staging in introducing drafts to a team that did not ask for them expects.
Four cases where the outcome is genuinely arguable
- The agent copies the draft into a fresh compose box. Textually that is acceptance; in the click stream it is a discard followed by an unrelated reply. Resolve it on text similarity between sent body and offered draft, with 1 threshold for the whole team.
- The agent pastes half of it. Count it as an edit with a large distance, not a discard. A correct explanation with a wrong opening is a voice problem, not a knowledge problem.
- The agent was simply faster. On short intents a good agent types the reply before the draft renders. Log time-to-draft: a discard at 400 milliseconds and one at 9 seconds are different events.
- The draft was accepted and the ticket reopened. Acceptance is a 5-second judgement under queue pressure, not a correctness verdict. Reopen rate has to be reported against the same drafts.
Edit distance, and why its shape matters more than its mean
Once the 3 outcomes are separated, the headline rate stops being interesting and the edited bucket starts. The measurement is the distance between the generated text and the sent text, and the useful form is a distribution, not an average.
- Normalise first. Strip the helpdesk's appended signature, the templated greeting and any merge fields rendered after generation. Skip this and every draft looks edited, because the platform edited it.
- Diff at token level, not character level. Levenshtein over characters reports a rewritten sentence and a corrected spelling as comparable events; token-level diff separates them.
- Bucket rather than score. Cosmetic, substantive and rewrite is enough — 3 buckets with a written boundary beats a continuous metric nobody can interpret at a standup.
- Plot the distribution weekly per intent. A single mean hides the only pattern that matters: 2 peaks means 2 different problems, typically a voice problem on short replies and a knowledge problem on long ones.
- Cluster the identical edits. When the same deletion appears across dozens of drafts it is a corpus artefact, not agent preference — the fix is in agents deleting the same sentence from every draft, and no amount of prompt tuning replaces it.
An edited draft is a labelled example somebody produced for free, under real conditions, with the customer in front of them. There is no evaluation set you can buy that is worth more.
Reading a suspiciously good number
A rate in the high nineties is almost never a strong model. In order of likelihood it is a denominator excluding unopened drafts, a population narrowed to 1 easy intent, a comparison that normalises away real edits, or a team that has learned drafts are safer to send than to argue with.
All 4 are answerable from event data, if the events exist. Acceptance is reconstructed from the draft record, the compose events and the outbound message, on the same log as everything else in drafted replies and agent assist — the case for treating that log as the system of record is the audit trail is the real record, not the ticket. Wiring those events is a small MVP and product build inside our SaaS and customer support work, and it separates a number you can act on from one you can only quote.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
What counts as an edit if the helpdesk appends a signature automatically?
It does not count — normalise it away before diffing. Signatures, templated greetings and merge fields rendered after generation are platform edits, not agent edits, and leaving them in makes every draft look modified. Define the normalisation once, in code, and apply it identically to the draft and the sent body.
Is a high draft acceptance rate a good sign?
Not on its own, and above roughly 90 per cent it is usually a denominator problem. Check whether unopened drafts are in the population, whether refusals and out-of-scope tickets were excluded, and whether the figure covers one narrow intent. A genuinely high rate on a broad intent mix, with the source panel being opened, is a real result; the same number without those conditions is an artefact.
Should discarded drafts be treated as failures?
Only after you know why they were discarded, because 2 of the common reasons are not quality failures at all. A draft the agent beat to the reply is a latency finding, and a draft discarded on a ticket that was merged away was never sendable. Log time-to-draft and ticket disposition next to the outcome, and the discard bucket splits into a fixable part and a noise part.
How often should acceptance be reviewed?
Weekly for the distribution, and on every change to the prompt, the retrieval corpus or the model. The weekly read is for drift; the per-change read is for causation, and it only works if the population and the normalisation are frozen between comparisons.
- measurement
- agent assist
- acceptance rate
- edit distance
The work behind this page
Builds from our portfolio that this page draws on.
Read next
- Agents are deleting the same sentence out of every draftA repeated identical deletion is the cheapest diagnostic signal a drafting system produces. It says something is still emitting that sentence — and the prompt is the wrong place to stop it.diagnostic
- An unrendered placeholder shipped in a live reply"Hi {{first_name}}" reaching a customer is not one bug. It is 5, and the first question — did the model write those braces, or did your template engine fail to remove them — decides which.diagnostic
- Internal note: the half of a ticket the customer never readsEvery helpdesk has 2 compose boxes behind one text field. The internal note holds the reasoning, the doubt and the account context — and it is discoverable, which changes what belongs in it.definition
- The draft promised a refund window that does not existA model asserting a commercial term nobody wrote is not a hallucination in general. It is one of 3 specific defects, and the first search you run tells you which.diagnostic
- A mail loop is manufacturing tickets between your system and theirsRunaway ticket volume from a single counterparty is rarely spam. It is two automated systems answering each other, and the fix is a header rule your responder should already have been applying.diagnostic
- Customer replies are opening new tickets instead of threadingOpen the raw source of one orphaned reply. Whether the References chain contains your outbound Message-ID decides whether this is a matching bug, a stripped-header problem, or an identity problem.diagnostic
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation