Ahoi API: Dropped Dial Callbacks
Evidence Report - Generated January 6, 2026
Executive Summary
We have documented cases where Ahoi's platform fails to send the action callback after completing a <Dial> command. Our system returns valid TwiML with an action URL, Ahoi processes the dial and completes the call (as proven by their CDR billing records), but never sends the callback to our action URL.
Impact:
Calls get stuck in "ringing" or "in-progress" status forever. No duration recorded, no revenue calculated, no recording saved. We only discovered these failures through manual CDR reconciliation.
What Should Happen
Expected Behavior (Per TwiML Spec)
- We return
<Dial action="URL">
- Ahoi dials the number
- When dial completes, Ahoi POSTs to action URL
- We update call status from callback data
What Actually Happened
- We returned valid TwiML with action URL ✓
- Ahoi dialed the number ✓
- Call lasted 26 minutes (per CDR) ✓
- Ahoi never called our action URL ✗
Primary Evidence: Call ID9c576a88fa904fce9190bfbe1cc5fa8c
Call Details
ID9c576a88fa904fce9190bfbe1cc5fa8c
| Field |
Value |
| From Number |
+1 715-965-4251 |
| To Number (Our TFN) |
877-407-0250 |
| Call Start |
2026-01-06 16:01:00 UTC |
| Target Dialed |
855-430-2307 (Dumpster Buyer 1) |
| Actual Duration (from CDR) |
1584 seconds (26 min 24 sec) |
| Ahoi Billed Us |
$0.2376 |
| Callback Received? |
NO |
Webhook Timeline (From Our Logs)
16:01:06 UTC
new / ringing
Initial call received from Ahoi
16:01:08 UTC
callback / answered
IVR answered the call
16:01:09 UTC
ivr_menu / answered
IVR menu played to caller
16:01:15 UTC
ivr_digit / answered
Caller pressed "2"
16:01:16 UTC
ivr_dial_response / dial_to_waterfall
TwiML returned to Ahoi with action URL
~16:27:00 UTC (expected)
dial_callback / completed
NEVER RECEIVED - Ahoi dropped this callback
TwiML We Returned to Ahoi
At 16:01:16 UTC, our IVR handler returned this TwiML to Ahoi:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial record="true"
action="https://vapqngmbjcbokqsoklkm.supabase.co/functions/v1/dial-callback-webhook?wid=4469d4be-e5ed-49f9-af96-9a98c8b96583&tid=bd92d972-eb95-481e-bb3f-750453ca3c28&cid=1d3966f6-8852-4adf-b26c-94f417789f3e&pri=A&tried=bd92d972-eb95-481e-bb3f-750453ca3c28&all=bd92d972-eb95-481e-bb3f-750453ca3c28"
dialMusic="https://vapqngmbjcbokqsoklkm.supabase.co/storage/v1/object/public/ivr-audio/us-ringback.wav">
8554302307
</Dial>
</Response>
This TwiML is valid and includes:
record="true" - Recording enabled
action="..." - Valid HTTPS callback URL
dialMusic="..." - Hold music URL
- Target number: 855-430-2307
CDR Record from Ahoi (Proof Call Completed)
Ahoi's own billing records confirm the call completed successfully:
date,your_cost,your_permin,billsec,src,dst,did,call_type
2026-01-06 10:28:01,0.2376000,0.0090000,1584,17159654251,8774070250,8774070250,did_tollfree
The CDR proves Ahoi successfully:
- Received our TwiML
- Dialed 855-430-2307
- Connected the call for 26+ minutes
- Billed us $0.24 for the call
But they never called our action URL.
Comparison: Successful Calls Same Hour
To prove our webhook endpoint was working, here are calls that did receive callbacks in the same time window:
| Call SID |
Dial Time |
Callback Time |
Duration |
Status |
| IDb70767a060e74e28981c950bf786a53b |
15:53:26 |
16:00:36 |
422s |
✓ Received |
| ID9fdf0c340e22419ab6de3c8461ebcf4c |
15:58:01 |
15:58:47 |
42s |
✓ Received |
| ID9c576a88fa904fce9190bfbe1cc5fa8c |
16:01:16 |
— |
1584s |
✗ MISSING |
| IDc44a5bb9640a4973a2faa740fb45de59 |
16:13:41 |
16:28:52 |
901s |
✓ Received |
| ID7e37e1333a81478bbe8eaeb0683f10a2 |
16:22:28 |
16:26:02 |
205s |
✓ Received |
| ID82934bcc94ec4e6da353e7bd72c02677 |
16:29:32 |
16:30:12 |
37s |
✓ Received |
| ID4264c6dc83c346adbc4254c0b11f21ad |
16:43:40 |
16:48:56 |
308s |
✓ Received |
| IDc261e4ec6d994f07903660f2e163f82c |
16:55:48 |
16:56:53 |
61s |
✓ Received |
17 successful callbacks to the same endpoint in a 2-hour window. Only 1 failure.
Side-by-Side: Failed vs Successful Call
Failed Call (ID9c576a...)
16:01:06 - new/ringing ✓
16:01:08 - callback/answered ✓
16:01:09 - ivr_menu ✓
16:01:15 - ivr_digit (pressed 2) ✓
16:01:16 - ivr_dial_response ✓
??? - dial_callback ✗ MISSING
Successful Call (IDb70767...)
15:53:16 - new/ringing ✓
15:53:17 - callback/answered ✓
15:53:17 - ivr_menu ✓
15:53:26 - ivr_digit (pressed 2) ✓
15:53:26 - ivr_dial_response ✓
16:00:35 - callback/completed ✓
16:00:36 - dial_callback ✓
Why This Is 100% Ahoi's Fault
- Same endpoint worked - 17 other calls used the same dial-callback-webhook endpoint and received callbacks that same hour
- TwiML was valid - XML is well-formed, action URL is correct HTTPS endpoint (logged and verified)
- Endpoint was reachable - Callbacks to same endpoint succeeded minutes before and after
- No errors in our logs - We didn't reject or fail to process any callback attempt
- CDR proves completion - Ahoi's own billing records show they completed the call and billed us
- No network issues - Other webhooks (IVR callbacks) were received successfully during the same call
Impact When Ahoi Drops a Callback
- Call stuck in "ringing" or "in-progress" status forever
- No call duration recorded
- No revenue or payout calculated
- No recording saved (recording also fails when callback is dropped)
- Concurrency tracking affected (call appears still active)
- All reporting and analytics inaccurate
Our Mitigation
We have implemented a stuck-call-fixer that:
- Detects calls stuck in live states for too long
- Fetches Ahoi CDRs to find matching completed calls
- Updates our database with actual duration/status from CDR
- Triggers revenue/payout calculations
This is a workaround, not a fix. The root cause is Ahoi's platform failing to send callbacks. We cannot recover recordings that were never created.
Conclusion
The evidence is irrefutable:
- We logged the TwiML with action URL at 16:01:16 UTC
- Ahoi's CDR shows call completed at 16:28:01 UTC (26 min duration)
- No dial_callback was ever received by our endpoint
- 17 other calls to the same endpoint received callbacks that hour
- Our infrastructure was functioning correctly
Ahoi's platform failed to send the action callback for this call.