Bug Fix

callsUpdated webhook: exactly one event per dialer call's terminal state

Follow-up to the 2026-05-14 fix. Partner integrations reported that dialer calls still produced two POSTs per terminal state in production. Two remaining paths slipped past the original gate, both fixed in this release:

  • Twilio parent-call statusCallback echo. For outbound dialer calls, Twilio fires the <Dial action> URL with the authoritative outcome (DialCallStatus), then a second callback from the parent SDK call carrying CallStatus="completed". The second was overwriting the real outcome (e.g. no-answercompleted) and emitting a duplicate callsUpdated. The second callback is now recognised as an echo for outbound terminal calls and ignored. Inbound calls are unaffected — their parent statusCallback is still the only signal we receive.
  • Post-call recording duration rewrite. When the audio recording finished processing, Twilio’s reported recording duration (often 1–3 seconds shorter than DialCallDuration due to silence trim) was rewriting the call’s duration field and re-firing callsUpdated. That write is now silent — the call’s duration is still corrected internally, but the partner webhook is not re-emitted.

What you’ll see: exactly one callsUpdated per terminal state, with stable outcome and duration. If you implemented the deduplicate-on-(callId, eventCreated) workaround we suggested earlier, you can keep it as defense-in-depth or remove it.

Not changed in this release: the isFinal: true payload flag (so partners can distinguish in-flight enrichment from authoritative finals) is tracked as a separate follow-up.