Evalgent
Back to Blog
Voice AI Testing

Delivery Exception AI Calls: Are Tracking Numbers Right?

Deepesh Jayal
16 min read
Delivery Exception AI Calls: Are Tracking Numbers Right?
On this page

Last verified October 19, 2026, against the carrier, USPS and eCFR pages linked below. Carrier rules and fees change, so recheck before you hard-code them.

A driver misses the door. The carrier flags a failed delivery attempt. Someone calls your voice agent to fix it. They want a new address, a new day, or a hold at a nearby shop. The call is short. The agent must catch a tracking number, act on it and write the result back. Delivery exception AI calls look like status work. They are really an identifier-capture problem with a write attached. Treat the AI voice agent tracking number step as its own system under test.

This post is for the team that built and runs that agent inside a larger product. Think a shipping or returns platform, a 3PL portal, or an e-commerce helpdesk used by many merchants. You own the agent. Every prompt change reaches every merchant's customers. The question is not "can it talk." It is "did it move the right parcel?"

1.8%
Word error rate of the best digit micro-model on up-to-5-digit utterances; Whisper-Large 4.6% (arXiv 2402.01931)
1 per package
Notifications allowed under the FCC package-delivery exemption, plus one per attempt up to two (47 CFR 64.1200(a)(9)(i))
6 business days
Longest time to honor an opt-out under that exemption (47 CFR 64.1200(a)(9)(i)(F))
$19.45
USPS Package Intercept fee per request, sender only, as of October 2026 (USPS)

What a delivery exception call really does

An exception call is a four-step workflow with a voice front door. The caller speaks. The agent identifies the parcel. It takes an action in a carrier or order system. It confirms, then writes the outcome to the record. A speech error in step two corrupts steps three and four without any visible failure.

Delivery exception AI calls map to a small set of actions.

ExceptionWhat the caller wantsSystem actionWho can usually ask
Failed delivery attemptA new day or timeDelivery rescheduling or redelivery requestRecipient
Address problemFix a typo or change the addressAddress correction or rerouteRecipient or sender, by carrier rule
Nobody home, no safe placePick up insteadHold at locationRecipient
Wrong item or no longer wantedStop it in transitPackage intercept or returnSender
Marked delivered, not foundAsk for proof of delivery, start a claimOpen a caseRecipient

Many platforms place an outbound call after a carrier exception scan, so the agent already knows the order. The risky version is inbound. A caller reads out a number from an email or a card left on the door. Last-mile delivery voice AI is usually sold on rescheduling volume, but this inbound capture step decides whether the action lands on the right parcel.

Exception handling is a product category. ClickPost, for example, describes an NDR management product that detects failed deliveries and contacts customers by WhatsApp, SMS and AI calls. A non-delivery report (NDR) records that delivery failed and why. This post covers the part inside your agent.

Why tracking number capture is the hard part

The tracking number is a long alphanumeric string with a carrier format hidden inside it. The caller reads it off a screen or a slip of paper. Speech recognition must then turn 18 to 22 characters into text without one slip.

Carrier format differences matter because your agent must validate before it trusts.

CarrierWhat a number looks likeWhat you can validateSource
UPS`1Z` plus 16 characters, 18 in all. Other forms appear: 12 digits, `T` plus 10 digits, 9 digitsLength, `1Z` prefix, final check digitUPS tracking support, Wikipedia
USPSUsually 22 digits for IMpb labels, starting `92`, `93` or `94`Length, prefix, Mod 10 check digitPublication 199, BarcodeFAQ
FedExSeveral lengths in circulation. Third-party format guides list 12, 15, 20 and 22 digits and disagree on detailsPull the current spec from your integrationVerify with FedEx

I could not confirm the FedEx lengths against a FedEx page, so treat that row as a to-do. The UPS page alone shows four shapes. A merchant on three carriers gives your agent six or more patterns.

The USPS 22-digit number breaks down as a 2-digit application identifier, a 3-digit service type code, a 9-digit mailer ID, a 7-digit serial and a Mod 10 check digit. The serial is sequential within a mailer's run. Hold that thought. It becomes a problem two sections down.

How spoken tracking numbers break

Callers do not dictate like a test script. They read in groups, pause to scroll, say "double" and "triple", and correct themselves. Each habit maps to a stored error.

Grid of six spoken tracking number failures, from grouping pauses to truncation, showing what was said, what was stored and which check catches each one
FailureWhat the caller doesWhat gets storedWhich layer catches it
Grouping pauseReads `1Z 4A79K2`, stops, then `03 8841`Agent endpoints early, stores 8 charactersLength check
Oh versus zeroSays "oh" for a zero, or the letter O`O` where `0` belongsFormat check per position
Double and tripleSays "double eight"Single 8, or 88 read as "eighty-eight"Check digit, then lookup
Letter confusionsB, D, P, T, V and M, N sound alike on a phone lineWrong letter in the shipper codeLookup, read-back
Self-correction"Eight five... no, eight two zero"Both attempts concatenatedLength check, read-back
TruncationGives only the last 8 digitsPartial stringLookup by suffix plus ZIP

Telephone audio is narrowband, so "f" and "s" blur. Noise hurts digits harder than words, because a digit has no sentence context to repair it. See phone audio quality and STT and how to test STT under background noise.

What the research says about digits

A 2024 paper on spoken digit recognition for phone transactions measured word error rate on 1,149 utterances at 8 kHz. Its best micro-model scored 1.8%. Google STT configured for numeric content scored 2.9%. Whisper-Large scored 4.6% and Whisper-Small 5.8%. The authors warn that a mistranscribed digit string "may result in financial discrepancies or authentication failures."

Read the limits. The vocabulary covers numbers up to five digits. The paper reports no results on 18-character alphanumeric strings. Treat 1.8% to 5.8% as a floor for short digit groups, not a prediction for tracking numbers.

Errors also compound. This is an illustrative assumption, not a measurement. Suppose each character has an independent 0.5% error rate.

String lengthP(at least one wrong character)
18 characters (UPS `1Z`)1 - 0.995^18 = 8.6%
22 digits (USPS IMpb)1 - 0.995^22 = 10.4%

At 0.5% per character, roughly one call in ten gets a wrong number. Real errors cluster in noisy calls, so the average hides a worse tail.

Check digits help, but less than you think

A check digit is the last character of the number, computed from the rest. It lets a system reject a mistyped value without a lookup. The question is how much it rejects. I simulated the GS1-style Mod 10 scheme (weights 3 and 1 from the right) on random 22-digit strings. USPS labels cite a Mod 10 check digit in Publication 199, but confirm each carrier's own spec before you copy the weights.

Error typeSimulated detectionWhy
One digit wrong100%Any single change shifts the weighted sum
Adjacent digits swapped88.9%Misses pairs that differ by 5 (0 and 5, 1 and 6, and so on)
Two digits wrong88.9%Roughly 1 in 9 pairs cancel out
A random 22-digit string90%A random string passes 1 time in 10

The 88.9% matches the general result for this weighting. Wikipedia's check digit article says the GS1 weights detect all single-digit errors and miss transpositions of digits that differ by 5. So a check digit is a cheap first filter. It is not proof.

Why a live lookup is not enough either

The next defense is a lookup. Does the number exist in your order management system or the carrier API? A random garbled string almost never does. But a near miss often does.

Take a shipper that prints 500 labels with consecutive serials. In my simulation, 95 of the 500 numbers (19%) had a single adjacent swap that landed on a different live, check-digit-valid number in the same batch. A two-digit slip in the last four characters reached another live number for all 500. This is an illustrative worked example with an assumed dense batch. Real batches are sparser.

Format, check digit and lookup can all pass on the wrong parcel. A neighbour's package then gets rerouted, and the log shows success.

Five stepped checks for a misheard tracking number, from shape and check digit to ownership and read-back, with simulated pass rates and the neighbour case flagged

The capture ladder

Combine the layers, because each removes a different class of error. This is the capture ladder for tracking number capture. It runs six steps before any action.

1. Normalize speech to characters. Map "oh" to 0 and "double eight" to 88. Do not map the bare word "o" to zero, because UPS shipper codes contain letters.

2. Validate shape per carrier. Reject by length and prefix.

3. Test the check digit. Reject single-character errors for free.

4. Look up the live set. Prefer parcels tied to this caller's phone, order or ZIP, not the whole carrier universe.

5. Run the ownership check. The destination ZIP or last name must match the caller. Similarity to a valid number never overrides it.

6. Read back in chunks. Group as the label does and wait for a yes after each group.

Here is simplified Python for steps 1, 3, 4 and 5. It is a sketch to adapt, not a drop-in. The carrier weights are an assumption to confirm.

import re

SPOKEN = {"oh": "0", "zero": "0", "one": "1", "two": "2", "three": "3",
          "four": "4", "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9"}
REPEAT = {"double": 2, "triple": 3}

def normalize(utterance: str) -> str:
    out, mult = [], 1
    for w in utterance.lower().replace("-", " ").split():
        if w in REPEAT:
            mult = REPEAT[w]; continue
        tok = "Z" if w in ("zed", "zee") else SPOKEN.get(w, w.upper() if len(w) == 1 else "")
        out.append(tok * mult); mult = 1
    return "".join(out)

def gs1_mod10_ok(num: str) -> bool:
    body, check = num[:-1], int(num[-1])
    total = sum(int(c) * (3 if i % 2 == 0 else 1) for i, c in enumerate(reversed(body)))
    return (10 - total % 10) % 10 == check

def candidates(heard: str, live: set[str]) -> list[str]:
    if heard in live:
        return [heard]
    swaps = {heard[:i] + heard[i+1] + heard[i] + heard[i+2:] for i in range(len(heard) - 1)}
    return sorted(swaps & live)

def decide(heard: str, caller_zip: str, live: dict[str, dict]) -> dict:
    cands = candidates(heard, set(live))
    if len(cands) != 1:
        return {"action": "ask_again" if not cands else "spell_in_chunks", "candidates": cands}
    rec = live[cands[0]]
    if rec["dest_zip"] != caller_zip:
        return {"action": "spell_in_chunks", "reason": "zip_mismatch"}
    return {"action": "read_back_in_chunks", "tracking": cands[0], "corrected": cands[0] != heard}

I ran it on two live parcels that differ by one swap, `...8520` for ZIP 60614 and `...8502` for ZIP 73301. A caller in 60614 who says `...8520` gets a read-back. The same caller, misheard as `...8502`, hits the ZIP mismatch and gets a chunked re-ask, not a reroute. Without the ownership check, that second call would have moved the wrong parcel.

When the caller has no number, fall back to other keys and run the same ownership check (see the FAQ below). Our post on VIN capture for dealership service uses the same ladder for a 17-character identifier. The load number problem in freight check calls is the same failure with different prefixes.

What the agent writes back

The write-back is where a voice error becomes a business error. The agent updates your order management system, the carrier API or both. Write more than the outcome.

Annotated write-back record for one exception call showing caller role, heard and confirmed values, ownership check, action and idempotency key, the fields that make a wrong write traceable

A record that supports an audit has these fields.

FieldWhy it matters
`heard_value` and `confirmed_value`Shows whether the read-back changed anything
`confirm_method``chunk_readback`, `spelled`, or `none`. Anything but the first two is a defect
`caller_role`Recipient, sender or unknown. Drives which actions are allowed
`ownership_check`Pass, fail or not run, with the key used
`action` and `carrier_response`What was asked and what the carrier answered, verbatim
`idempotency` keyA retried request must not create a second reschedule
`delivery window`The date and range the caller accepted, as spoken and as stored

Idempotency matters. A carrier call can time out after it succeeded. A retry without a key sends two requests. Use one key per call and action, and check how the carrier handles repeats.

Which actions the caller may ask for

The caller's role limits the action. The USPS page on Package Intercept says the sender or an authorized representative can stop or redirect a shipment. It is "not a guaranteed service". Retail senders can redirect to their own address or to a post office for hold. Redirecting to a PO Box is not allowed. The fee was $19.45 per request as of October 2026.

UPS's tracking support page lists change-delivery options to reroute, hold or cancel. It also says a missed first delivery gets another attempt the next business day, and the driver leaves a notice. So "reschedule" can mean "ask for a specific day" or "accept the default redelivery." Your agent must know which one it did.

Put this policy table in code, not in the prompt. Package intercept is sender-only on USPS, so a recipient's request becomes a handoff. The agent must say so plainly and never imply it worked.

Rules for outbound delivery exception AI calls

If your agent places the call, the call itself is regulated. Under 47 CFR 64.1200(a)(9)(i), the FCC exemption for package delivery notifications applies only when the call is not charged to the called person. The notification must go only to the number for the package recipient. It must name the company, carry no marketing, run about a minute or less, and allow opt-out. The company may send one notification per package, plus one per attempt up to two when a signature is required.

Three design rules follow. Do not read parcel details to a third party who answers. Do not upsell on the call. Honor opt-outs fast, within six business days at most. The exemption is written for a package delivery company, so a retailer or platform should ask counsel whether it applies to them. The FCC adopted new consent-revocation rules on September 30, 2026, released October 1, per Kelley Drye. Our outbound testing guide covers the call-level checks. Are AI delivery exception calls allowed under the TCPA? Sometimes, and it depends on consent, the caller identity and the exemption conditions. This is not legal advice.

How to test delivery exception AI calls before release

Run this before any prompt or flow change reaches live callers. Our prompt change guide explains why the gate belongs before release.

1. Build a parcel fixture set. Create 40 to 60 fake parcels across your carriers. Include sequential batches, near-duplicate numbers with different ZIPs, and numbers with letters. Add a few that exist at the carrier but not in your system.

2. Write the scenarios from the flow. Cover each exception type: failed attempt, address fix, reschedule, hold at location, intercept request from a recipient, caller with no number. Evalgent generates scenarios from the agent's prompt and flows, including branches and hard constraints, so the coverage gaps show up early.

3. Vary the caller. Cross each scenario with accent, pace, interruptions, response delay, background noise and language. Its caller profiles cover these, and the simulator reaches the agent over phone, SIP or WebRTC. Add Spanish or Hinglish if your merchants' customers use them. See accent robustness and multilingual accuracy.

4. Script the hard dictations. Group-pause reads, "double" and "triple", self-corrections, letter confusions and truncated numbers. Each is a test case with a known right answer.

5. Score the record, not the sentence. Compare `confirmed_value` to the fixture, the action to the policy table, and the write to the expected state. A fluent call can still write the wrong parcel. This is why an audio-based judge matters: Evalgent judges from the audio, not only the transcript, and custom metrics can run on every call.

6. Set pass gates and run enough calls. Use the scorecard below, and rerun after every model, prompt or carrier-format change.

A scorecard with thresholds

MetricDefinitionGate
Identifier exact matchConfirmed value equals fixture, all callsTrack by condition, no single average
Action without confirmationWrites with `confirm_method` of `none`0
Wrong-parcel writeAction applied to a parcel the caller does not own0
Role violationSender-only action granted to a recipient0
Duplicate actionTwo writes for one request0
Honest handoffWhen blocked, the agent says it could not do it100%

How many calls does a zero gate need? Use the rule of three. If you see zero failures in n independent runs, the 95% upper bound on the true rate is about 3/n. With 100 runs per cell that is 3%. With 300 runs it is 1%. With 1,000 it is 0.3%. Cells are carrier by exception type by noise level, so the budget grows fast. Spend it on wrong-parcel risk. For sampling logic, see how to sample live calls. Our tool call accuracy guide and tool calling test cases give the argument-level checks.

Monitoring delivery exception AI calls after launch

Evalgent's production monitoring takes call recordings that you push in. It transcribes each call, maps it to a scenario and judges it. It flags tool-call failures, policy failures, PII leakage and latency spikes, with fix recommendations. For exception calls, add a custom metric: a write that happened without a confirmed value. Alert on any non-zero count. Also watch for repeat calls on the same tracking number within 48 hours. A second call about the same parcel often means the first one wrote the wrong thing. Our multi-tenant testing guide shows how to slice results by merchant, and the production monitoring guide covers baseline signals.

If this is your first agent, Evalgent works with teams to set up evals for it. It is sales-led, not self-serve.

Frequently asked questions

How accurate are AI voice agents at capturing tracking numbers?

No public benchmark covers full tracking numbers. A 2024 paper reports 1.8% to 5.8% word error on digit groups up to five digits at 8 kHz. Longer alphanumeric strings compound that error. At an assumed 0.5% per character, about 10% of 22-digit numbers would contain a mistake. Measure your own agent on your own carriers.

How do you test an AI agent on failed delivery calls?

Build fake parcels per carrier, including near-duplicates and sequential batches. Script each exception type against varied accents, noise and interruptions. Judge the written record, not the wording: confirmed value, action, role and idempotency. Set zero gates for wrong-parcel and unconfirmed writes. Rerun after every prompt, model or carrier-format change.

Can an AI agent reschedule a failed delivery?

Yes, if the carrier exposes a reschedule or redelivery action and the caller passes the ownership check. Know which kind you are asking for. UPS, for example, retries the next business day by default. Writing a chosen delivery window is a different request. Record which one happened and say it accurately on the call.

Can an AI call change a delivery address?

Only where the carrier allows it for that caller's role. USPS Package Intercept, which redirects a shipment, is for the sender or an authorized representative. A recipient asking for a new address usually needs a different route. The agent should state the limit and hand off, not imply the address changed.

What does the agent write back to the order or carrier system?

At minimum: heard value, confirmed value, confirmation method, caller role, ownership result, the action requested, the carrier's response, an idempotency key and the chosen delivery window. This record lets you audit a wrong move and prove a right one. An outcome flag alone cannot do either.

Do check digits catch spoken tracking number errors?

Partly. A GS1-style Mod 10 check digit catches every single-digit error. In simulation it caught 88.9% of adjacent swaps and 88.9% of two-digit errors. It misses swaps of digits that differ by 5. A random string passes one time in ten. Use it as a filter, then look up, check ownership and read back.

Are AI delivery exception calls allowed under the TCPA?

Sometimes. 47 CFR 64.1200(a)(9)(i) exempts package delivery notifications that meet strict conditions: not charged to the called person, sent to the recipient's number, no marketing, about a minute long, and opt-out honored within six business days. It is written for delivery companies. This is not legal advice, so check your case with counsel.

What should the agent do when the caller cannot find the tracking number?

Use another key the system holds: the order number, the phone number on the order, or ZIP plus last name. Run the same ownership check before any action. If nothing matches, say so, offer to send the tracking link to the number on file, and hand off. Never pick the closest-looking parcel.

The bottom line

A delivery exception call is only as safe as the tracking number the agent captured, and a misheard digit can still pass format, check digit and lookup. Layer the checks, read the number back in chunks, write down what was heard and what was confirmed, and test every layer on noisy and accented calls before each release.

Related Articles