Freeze one timer request and symptom
Record node, release, manager identity, ActionID, Channel, Uniqueid, Linkedid, bridge peers, channel creation time, action time, timeout value and unit, raw response, observed request and hangup events, context, extension, priority and synchronized timestamps.
Classify the symptom as unknown or denied action, wrong or vanished channel, early termination, late termination, no termination, wrong dialplan path, other leg surviving unexpectedly or final event missing. Do not combine several calls into one timeline.
Confirm availability, permission and channel lifetime first
Check the running AMI action inventory, installed branch and manager write authority. Resolve the channel again immediately before sending the action and require the same Uniqueid; a reused channel label, transferred leg, Local-channel optimization or completed call invalidates a stale target.
An unknown action, denied request or missing channel is not a timer-precision defect. Keep least privilege and do not substitute broad CLI command authority for a missing action permission.
Normalize seconds and competing timeout owners
AbsoluteTimeout documents seconds. Compare that field with the dialplan TIMEOUT(absolute), Dial or Originate timing, queue, bridge, endpoint, carrier and application limits without assuming they share units or start points. Record which component ended the channel first.
The action page does not specify a remaining-time query or replacement semantics. If multiple writers set a lifetime, preserve their order and raw values, then reproduce only on a disposable call rather than guessing from the final duration.
Trace T, h and handler execution in the loaded dialplan
Inspect the exact context loaded for the target channel. Uppercase T handles absolute-timeout expiry, lowercase t handles response timeout, and h performs cleanup after hangup. Reconcile generated FreePBX ownership before editing Asterisk files directly.
A correct timeout can appear late when cleanup blocks, or appear absent when the expected T extension is not in the channel's context. Preserve NewExten and hangup-handler events where available, but do not treat missing filtered events as proof that code did not run.
Correlate request events with final Hangup
Match HangupRequest or SoftHangupRequest and final Hangup by exact Uniqueid, not caller ID or Linkedid alone. Preserve cause, cause text, technology cause and event-filter state. A request can precede cleanup; final disposal is the later channel boundary.
Then inspect every bridge peer. Ending the timed channel does not guarantee that a transferred, masqueraded, Local or other linked leg ended, and a surviving peer does not prove the timer missed its target.
Retest one bounded correction and stop
Correct only the first demonstrated cause: target identity, permission, unit conversion, competing writer, dialplan ownership, event visibility or blocking cleanup. Retest one disposable call with synchronized clocks and a safe timeout, then compare the same evidence tuple.
Do not shorten active production calls, loop timer actions or claim precision from one wall-clock observation. No PBX, manager action, timer, dialplan, channel, bridge, event stream, endpoint, packet, media stream or live call was inspected or tested.
Sources & applicability
Primary references for the technical details above. Operational examples and planning checklists are VoIP.info editorial guidance.
- Asterisk 23 AbsoluteTimeout action ↗
- Asterisk 22 AbsoluteTimeout action ↗
- Certified Asterisk 22.8 AbsoluteTimeout action ↗
- Asterisk 23 TIMEOUT dialplan function ↗
- Asterisk special dialplan extensions ↗
- Asterisk 23 HangupRequest event ↗
- Asterisk 23 SoftHangupRequest event ↗
- Asterisk 23 Hangup event ↗
- Asterisk AMI v2 specification ↗
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.