Freeze one ordering claim with comparable callers
Record the queue, caller channels, arrival times, source routes, expected priority classes, member availability and first observed divergence. Classify the symptom: priority object not selected, wrong value, value lost on a new leg, queue not entered, caller rejected or exited, or admitted callers apparently offered out of order.
Do not use answer time alone. Preserve queue-entry, offer, answer, abandon and exit events for every compared caller, plus the installed FreePBX, Queue Priorities, Queues and Asterisk versions.
Prove the intended priority object executed
Resolve the inbound route, IVR key, time condition or other source to the stable Queue Priorities destination ID. Compare its saved value and next destination with the generated and loaded app-queueprio target. A familiar description or correct GUI value does not prove the live call executed that record.
If Apply Config failed or the loaded target is stale, repair that boundary through supported controls before changing the numeric priority.
Follow QUEUE_PRIO on the exact queue-entering channel
Capture the value immediately after the priority target and again on the channel that invokes Queue. The release/17.0 source uses inherited _QUEUE_PRIO, but Local channels, transfers, callbacks and custom dialplan can create or optimize legs or replace variables. Map channel names and unique identifiers instead of relying on a shared linked identifier.
A value on the original leg is not proof that the admitted queue channel retained it. Find the first creation or handoff where the value diverges.
Separate queue admission from ordering
Confirm that each compared call entered the same queue and was accepted into its waiting population. Join-empty rules, maximum callers, timeouts, leave-empty behavior, failover destinations and caller abandonment can remove a call before priority ordering is relevant.
Keep queue priority separate from member penalty, member pause or device state, ring strategy and queue weight. Changing an agent-side control to fix a missing caller variable can reorder unrelated calls.
Reconstruct offers, not just answers
Use queue-log and channel evidence to order arrivals, effective priorities, member offers, ringing intervals, answers and exits. A lower-priority call may appear to answer first because it was already offered, the higher-priority call had not been admitted, different members were eligible, or the first offer was not accepted.
Do not claim strict SLA compliance from a small test. Preserve simultaneous-event resolution, clock sources and logging gaps as limitations.
Correct one owner and retest the class matrix
Correct the first proven divergence: source selection, saved value, Apply Config, loaded target, variable inheritance, queue destination or a separate member-policy defect. Retest one lower, equal and higher class under controlled availability, plus an unauthorized source path.
Accept only the intended ordering without starving ordinary callers or changing unrelated queues. Roll back the value or path if evidence diverges. This workflow is documentation-derived and was not reproduced on an installed or laboratory FreePBX system.
Sources & applicability
Primary references for the technical details above. Operational examples and planning checklists are VoIP.info editorial guidance.
- Sangoma Queue Priorities user guide ↗
- Sangoma Queue Priorities module overview ↗
- FreePBX Queue Priorities release/17.0 repository ↗
- FreePBX Queue Priorities release/17.0 metadata ↗
- FreePBX Queue Priorities release/17.0 dialplan source ↗
- Asterisk standard channel variable QUEUE_PRIO ↗
- Asterisk Queue application ↗
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.