Voicemail & Answering-Machine Detection
Waiting for an answering-machine verdict before you speak is an abandoned call by construction — the detector needs about four seconds and the rule gives you two.
Twilio's own FAQ puts answering-machine detection at roughly four seconds after the call is answered on default settings, while the US telemarketing rule defines an abandoned call as one not connected to a live representative within two seconds of the called person's completed greeting and caps abandonment at 3% of live-answered calls over any 30-day campaign window. An outbound voice agent that gates its first word on a detection result is therefore out of compliance by design, and it pays that silence on the 5–10% of dials that reached a human — the only calls with any value in them. Speak on answer, run detection concurrently, and treat leaving a voicemail as a separate regulated act with its own consent record rather than a fallback branch.
Step 1Two clocks that cannot both be satisfied.
Get the numbers on the table first, because the conflict is arithmetic and not a matter of judgement. Figures below are as of October 2026.
The detector's clock. Twilio's answering-machine detection documentation describes two modes. In the default mode it returns a verdict after it has heard enough of the answering party, which the vendor's own FAQ characterises as approximately four seconds after answer with default configuration values. In DetectMessageEnd mode a human is reported immediately, but a machine verdict only arrives when the greeting ends — usually at the beep — because that is the point at which you could actually leave a message. The default MachineDetectionTimeout is 30 seconds. Third-party write-ups put real greeting-end latency commonly in the 10–30 second range, which is a vendor estimate rather than a published figure, but the shape is not in dispute: greeting-end detection takes as long as the greeting.
The rule's clock. The FCC's delivery restrictions at 47 CFR 64.1200 treat a call as abandoned if it is not connected to a live sales representative within two seconds of the called person's completed greeting, and bar abandoning more than three percent of telemarketing calls answered live, measured per campaign over each successive 30-day period. The same rule requires that unanswered calls ring at least 15 seconds or four rings before disconnecting, and that where no representative is available the caller play a prerecorded identification message stating only the business name, its telephone number, and that the call was for telemarketing purposes.
The incompatibility, on one timeline (US telemarketing, Oct 2026). t=0.0s call answered, callee says "Hello?" t=1.2s greeting complete <-- rule's clock starts here t=3.2s deadline: live rep connected <-- 2s after completed greeting t=4.0s AMD default verdict arrives <-- 0.8s too late, every time t=10-30s DetectMessageEnd verdict <-- only at the beep t=30s MachineDetectionTimeout default Gate the greeting on detection -> abandoned by construction. Cap is 3% of live-answered calls per 30-day campaign.
One honest unknown sits inside this: whether a conversational agent counts as the "live sales representative" the rule contemplates. Nothing in the regulation anticipated it, and the prudent reading — the one outbound voice agents takes for pacing and abandonment generally — is that the cap applies whichever side of that line a regulator eventually puts you on. Design so the question does not decide your compliance.
This page is written against US telemarketing rules because they are the most specific and most litigated. Other regimes differ in the numbers but not in the structure: Ofcom's abandoned-call regime, for instance, has its own rate and its own identification requirement. Check your own jurisdiction and treat the figures here as the shape of the problem, not as legal advice.
Step 2The machine is the common case, and detection bills you on the human calls.
Teams build voicemail handling as a fallback branch because they picture a call that mostly reaches people. The published connect rates do not describe that world. A 2026 analysis of more than 175,000 dials logged the previous year reports a cold-call connect rate of 9.9% per dial, rising to 24.5% measured per prospect because some are reached on a later attempt. Gong's dataset of over 300 million calls is cited at a 5.4% average connect rate with top performers at 13.3%. Cognism's 2026 outbound report puts the industry cold-call success rate at 2.7%, up from 2.3%, with a 13.3% answered rate for teams using verified contact data. One 2026 vendor analysis warns that roughly half of what its customers counted as "answers" were voicemail, carrier screening features, or hangups inside six seconds. Pew data cited in the same literature has only about 19% of people saying they typically pick up a number they do not recognise.
Definitions differ enough that none of those numbers is directly comparable — some count voicemail as answered, some measure per dial and some per prospect — but every one of them puts live human contact in the single digits to low teens per dial. So:
- Machines are not the exception. On cold lists most completed connections are a voicemail greeting, a screening prompt, or a six-second hangup. A voicemail path built as an afterthought is the path most of your traffic takes.
- But detection latency is charged to the humans. The four seconds of silence is paid on every answered call, and the only calls that can produce revenue, a resolved ticket or a confirmed appointment are the few that a person answered. You are degrading the 9% to classify the 91%.
- Four seconds of silence is not neutral. It reads as a dropped call or a robocall, and the callee hangs up or starts speaking into the gap, which puts your agent into a barge-in state before it has said anything. The latency budget for a first word is well under a second; detection spends four.
That asymmetry is the whole design constraint. It is also why a warm-contact campaign — appointment reminders to known customers, where humans answer most calls — should usually run with detection off entirely and a short, polite message that works equally well spoken to a person or into a mailbox.
Step 3Speak on answer; let detection run beside the conversation.
The architecture that satisfies both clocks is not clever, it is just ordered differently from the tutorial. Start the agent the moment the channel is answered, and subscribe to the detection verdict as an event that may arrive mid-utterance.
# WRONG: the verdict gates the first word. ~4s of dead air on every # answered call, and the 2s post-greeting deadline is already gone. result = await telephony.detect_answering_machine(call) # blocks if result == "human": await agent.start(call) # RIGHT: greet immediately, treat detection as a concurrent signal. await agent.start(call) # first word < 1s detect = asyncio.create_task(telephony.amd_events(call)) async for verdict in detect: if verdict.kind == "human": break # nothing to do; keep talking if verdict.kind.startswith("machine"): await agent.stop(reason=verdict.kind) # stop mid-sentence await voicemail_policy.handle(call, verdict) break if verdict.kind in ("fax", "unknown"): await call.hangup(); log(verdict); break # invariant: agent.start() is never downstream of a detector.
Three properties fall out of that ordering and are worth stating as requirements rather than consequences. The agent's greeting must be interruptible by your own code, not only by the caller — most realtime stacks expose cancellation of an in-flight utterance for barge-in, and this is the same mechanism pointed at a different trigger, which the realtime architecture page covers as cancel-and-flush. The detection verdict must be an event stream rather than a return value, so a late machine verdict can still stop a conversation that already started. And every verdict class needs an explicit branch, because unknown is common and silently treating it as human is how a sales pitch ends up on a fax machine's tape.
The cost of this ordering is that when the verdict says machine, you have already said part of your greeting into a mailbox. That is a real defect and the next step is how to make it a small one.
Step 4Design the first eight words so a partial message is still a good message.
If detection can arrive four seconds into your greeting, then your greeting's first four seconds are the only part you control. Write them so they survive being the whole message. Concretely: identity, purpose, and a callback path, in that order, before any conversational move.
# Bad opener: nothing useful survives truncation at 4s. "Hi there! How are you doing today? I'm calling on behalf of--" # Good opener: identity + purpose + callback inside ~4 seconds. "This is the Northgate Clinic scheduling line, about your Thursday appointment. You can reach us on 555-0147." # ^ who ^ why ^ how to respond # Truncated at 4s it is a usable voicemail; heard in full by a # person it is a normal opening. One script, both outcomes.
This also discharges the disclosure obligation early, which matters independently: the agent has to identify itself as an agent, and doing it in the first breath means a truncated message still carried it. Disclosing the agent on a call has the jurisdiction-by-jurisdiction detail; the point here is purely about ordering.
Then handle the verdict classes distinctly, because they carry different information. Twilio's greeting-end mode distinguishes machine_end_beep, machine_end_silence and machine_end_other alongside human, fax and unknown. A beep is a reliable signal that a mailbox is recording; silence usually means the greeting ended without one, and a message left there may or may not be captured. Treat them as three different outcomes in your logs rather than collapsing them to "machine", or your retry logic will keep redialling numbers you have already successfully messaged.
Do not attempt to cancel the partial greeting by hanging up the instant a machine is detected. A sub-second call that leaves half a sentence is the pattern consumer complaints are made of, and on a telemarketing campaign it is also the pattern the abandonment rule exists to catch. Finish the four-second opener you designed, then decide whether to continue into a full message.
Step 5Leaving the voicemail is a separate act, and it needs its own consent record.
This is the step teams skip, and it is the one with the largest downside. Dropping a prerecorded or synthesised message into a mailbox is not a quieter version of calling — under US law it is a call. The FCC's declaratory ruling of 21 November 2022 (FCC 22-85, CG Docket 02-278) concluded that so-called ringless voicemail delivered to a wireless number is a "call" made with an artificial or prerecorded voice and therefore requires the consumer's consent; the Commission was explicit that it was not banning the technique, only confirming that the TCPA reaches it. The technical fact that the message never traversed the subscriber's handset was rejected as a basis for exemption.
The practical consequence for an agent platform is that your consent model needs a second field. "May we call this number" and "may we leave an artificial-voice message at this number" are different permissions, and a workflow that collected only the first should not be dropping messages.
# Two permissions, not one. Check the second before the drop. contact = { "number": "+1555...", "consent_call": {"granted": True, "source": "web_form_2026_08_14"}, "consent_prerec": {"granted": False, "source": None}, "line_type": "wireless", } if verdict.kind.startswith("machine"): if contact["consent_prerec"]["granted"]: await leave_message(call, script=approved_vm_script) else: await call.hangup() # no drop without the 2nd grant audit.record(call, verdict.kind, left_message=...) # always
Three details make this hold up under review. Record the verdict and whether a message was left for every call, not just the ones where something went wrong — this is the evidence that answers a complaint months later, and it belongs in the same place as the rest of your audit trails. Keep the voicemail script itself a fixed, approved artefact rather than something the model generates per call, because a generated message is an unreviewed prerecorded message and you cannot show what was said without the recording. And resolve the line type before the campaign, since the wireless case is the one carrying the stricter consent requirement.
Debt collection and similar regulated outbound add a further layer: who may hear the message at all, and what may be said if someone other than the debtor picks up the mailbox. Collections and dunning agents covers the third-party-disclosure rules that make a cheerful, detailed voicemail a violation in that domain.
Step 6What to measure, and when detection earns its latency.
Detection is a classifier in your call path, so instrument it like one. The four numbers that actually drive decisions:
- Time to first word, measured from answer. Target well under a second; this is the metric that goes negative the moment someone reintroduces a blocking detector. Alert on the p95, not the mean — a blocking call path shows up as a bimodal distribution long before the average moves.
- Misclassification rate by direction, not in aggregate. A machine scored as human wastes a conversation and may leave your agent talking to a tape. A human scored as machine is worse: you cut off a real person mid-sentence and, on a telemarketing campaign, possibly abandoned the call. These two errors have different costs, so a single accuracy figure is useless. Tune the threshold against the asymmetry you actually face.
- Abandonment rate per campaign, per 30-day window, with a kill-switch. The rule's denominator is live-answered calls and its window is a rolling campaign period, so compute it that way rather than daily and site-wide. Outbound voice agents has the pacing side of the same metric.
- Verdict distribution by carrier and region. Greeting conventions, carrier screening features and network audio differ enough that a detector tuned on one market degrades silently on another. A shifted distribution is the early warning; a complaint is the late one.
Put those on the same evaluation harness as the rest of the agent rather than in a telephony dashboard nobody opens — evaluating voice agents covers recorded-call replay, and machine-answer audio is cheap to collect and easy to regression-test because it does not change.
When is detection worth its cost? Three cases, and they are narrower than the default configuration suggests. When you need greeting-end timing because the point of the call is to leave a recorded message at the beep, in which case DetectMessageEnd's long latency is the feature and there is no human to annoy. When the campaign is cold and the script is long, so the expected waste from talking to tapes exceeds the expected damage from four seconds of silence. And when a downstream system needs the classification for routing or suppression — marking a number as "mailbox reached today" so the next attempt is not a redial. Outside those, on a warm list with a short script, the honest configuration is detection off and one well-written opener.
Ship it in this order. Write the four-second opener first — identity, purpose, callback — and confirm it reads correctly both as a full greeting to a person and as a truncated voicemail. Then start the agent on answer with detection subscribed as a concurrent event stream, with an explicit branch for every verdict class including unknown and fax. Then add the second consent field and refuse the voicemail drop without it. Measure time-to-first-word from answer and the two misclassification directions separately, and wire abandonment rate per campaign per 30-day window to a kill-switch. If you only change one thing today, delete the await in front of your detector: on default settings it costs about four seconds against a two-second rule, and it spends that silence on the one call in ten that a person actually answered.