Capture one target, conversion, channel timeline and status
Record timestamp and timezone, installed Asterisk branch, channel identity, context, extension, priority, exact loaded argument, original civil-time input if any, conversion zone and format, resulting epoch, application entry and return times, immediate WAITUNTILSTATUS, relevant channel hangup, next priority and caller-visible result. Redact caller data and secrets.
Classify the symptom as PAST, FAILURE, HANGUP, unexpected OK, late or early return, no return, missing status or correct return followed by a wrong downstream action. Do not combine them as one scheduling failure.
Prove the installed application and loaded dialplan
Confirm the running system exposes WaitUntil() and inspect its local help. Then prove that the active dialplan entered the intended context, extension and priority with the expected epoch. A source-file change or generated configuration fragment does not prove the loaded dialplan executed it.
Compare installed help with the branch-appropriate upstream reference. If the application, syntax or target priority differs, correct that boundary before changing timezone, clock or timeout settings.
Reconstruct civil time to timezone to epoch
When the target originated as a human date or time, replay the conversion with the same explicit timezone and format. STRPTIME() produces an epoch from those inputs, while STRFTIME() can render an epoch for comparison. Preserve the input, zone, format, output and database or library versions used by the actual system.
Check seconds versus milliseconds and daylight-saving gaps or duplicate local times. The epoch does not carry the conversion timezone, so changing only the display zone does not move the target instant.
Classify OK, PAST, FAILURE and HANGUP exactly
Capture WAITUNTILSTATUS immediately after the application. PAST means the target time was already past; FAILURE means the argument was invalid; HANGUP means the channel ended before the time elapsed; and OK means the wait succeeded. Keep the channel and timestamp attached to the observation.
A later variable read, a different channel or a downstream error can obscure the original result. None of these status values alone proves that a later playback, notification, call or media path worked.
Separate the target epoch from every channel timeout
Read the effective TIMEOUT(absolute), TIMEOUT(digit) and TIMEOUT(response) values and label them separately. The absolute type is a seconds-based maximum call duration; digit and response types govern digit entry. None supplies the absolute epoch consumed by WaitUntil().
If the channel ends before the target, establish whether the absolute timeout, caller hangup, transfer, bridge teardown or another dialplan action ended it. Do not disable the absolute timeout merely to suppress a HANGUP result.
Fix the first proved boundary and test a timing matrix
Correct only the first demonstrated divergence: application availability, loaded priority, malformed argument, unit conversion, timezone, format, stale target, host clock, channel lifetime, absolute timeout, result branch or later action. Preserve rollback and remove temporary high-volume logging.
Repeat authorized tests before, at and after the target plus invalid-input and early-hangup cases. Record immediate status, observed return time and next priority separately from the final caller outcome. No host, module, dialplan, channel, epoch source, timezone database, clock, packet, scheduler or live call was inspected or tested for this diagnostic.
Sources & applicability
Primary references for the technical details above. Operational examples and planning checklists are VoIP.info editorial guidance.
- Asterisk 23 WaitUntil application ↗
- Asterisk 22 WaitUntil application ↗
- Asterisk 23 TIMEOUT function ↗
- Asterisk 23 STRFTIME function ↗
- Asterisk 23 STRPTIME function ↗
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.