Freeze the target and symptom before another qualify
Record node, installed release, loaded modules, manager identity, unique ActionID, exact endpoint, referenced AoRs, every current contact URI, pre-action status, RTT, qualify settings and symptom time. Preserve a completed contact snapshot rather than a cropped endpoint summary.
Classify the first divergence: action missing or denied; endpoint absent; action accepted; no observable OPTIONS; request used an unexpected route; response arrived but policy rejected it; status did not change; event was missing; snapshot was incomplete; or another contact was mistaken for the target.
Resolve action, authorization and object-scope failures first
Verify the installed action inventory exposes PJSIPQualify, that res_pjsip is loaded and that the manager identity has only the required write and event access. The action accepts an endpoint name. Supplying an AoR, contact URI, registration name or channel can fail or target nothing useful.
Re-read the endpoint object and its AoR list on the same node. In realtime or clustered deployments, confirm object availability and node ownership instead of widening the target or repeating the action across every server.
Do not wait for a terminal event the action does not define
A successful action response is not an OPTIONS result. ContactStatus is a state-change event rather than a documented action-completion event, and it does not expose ActionID. If the contact remains in the same state, there may be no new status event to correlate.
Check manager read permissions, event filters, connection continuity and observation start time. Then take a new PJSIPShowContacts snapshot and retain ContactListComplete; without its terminal boundary, a timeout or parser stop can masquerade as a missing contact.
Trace the actual URI, route and qualification policy
For the exact contact, compare URI, transport, outbound proxy, stored Path, DNS result, source socket, OPTIONS request, response or timeout and elapsed time. The documented timeout includes DNS work, so no packet on the expected interface is not automatically proof that the action was ignored.
Check qualify_timeout, periodic frequency and qualify_2xx_only support on the installed maintenance release. A received non-2xx response can demonstrate network reachability while still being classified unavailable under the configured policy.
Distinguish one contact result from endpoint and call readiness
An endpoint may reference multiple AoRs and contacts. Match the event and snapshot row by URI and AoR before attributing it to the endpoint symptom. A reachable sibling contact does not repair an unreachable target, while one unreachable contact does not prove every route for the endpoint is down.
Registration expiry, contact replacement, NAT rebinding and stale realtime data have their own evidence. Qualification does not validate inbound identify rules, dialplan selection, authentication, call setup, media or user experience.
Correct one evidenced layer and retest once
Correct only the demonstrated owner: installed capability, manager permission or filter, endpoint-to-AoR relationship, contact URI, DNS, proxy or Path, transport, qualify policy, registration freshness or remote OPTIONS handling. Retest one endpoint with a new action ID and bounded observation window.
Require an accepted or rejected action response, a complete before-and-after inventory and the exact network result. Keep reachable status separate from call and media validation. No PBX, manager action, endpoint, contact, DNS answer, OPTIONS exchange, 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.
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.