Freeze one call and its expected branch
Record timestamp and timezone, FreePBX and Dynamic Routes module versions, module signature and state, route name, generated configuration revision, inbound source or prior destination, caller and DID in redacted form, DTMF length and validation result, lookup type, saved-variable names, substitution state, sanitized lookup fingerprint, returned text, configured entries, invalid destination, default destination and the first wrong or missing handoff.
Classify the first divergence as module unavailable, stale generated dialplan, input rejected, variable missing, unintended substitution, lookup failure, malformed result, exact-match miss, wrong entry, invalid branch, default branch or downstream destination failure.
Prove the installed module and loaded route
Confirm the module is installed, enabled and signed according to the selected repository policy, then verify that the intended Dynamic Route exists in the GUI and is referenced by the upstream call flow. Apply configuration through the normal change process and identify the loaded dialplan revision before reproducing.
Do not infer runtime state from the repository or documentation. A saved GUI form, enabled module and loaded dialplan are three separate observations, especially after a restore, module update or failed Apply Config.
Trace input, validation and substitutions
For DTMF routes, compare received digits with the configured maximum length, timeout, validation rule, retries and invalid destination. Then inspect saved input and result names on the same channel. A caller timeout, rejected format and accepted value must not be collapsed into one empty result.
Compare the stored lookup template with the rendered expression. If literal square brackets are present, confirm whether substitutions were intentionally disabled. If substitutions are expected, prove the referenced DYNROUTE_ value exists on that exact channel before the lookup runs.
Test the selected lookup source as its own boundary
Identify whether the route uses MySQL, ODBC, URL, AGI or an Asterisk variable. Capture a credential-safe request or query fingerprint, start and finish time, transport or function result, returned value and error class from the same execution window.
For URL sources, the guide requires text output rather than HTML, XML or JSON. For AGI, prove the script executed and set the configured result variable. For ODBC, prove the intended function and data source. Do not rotate unrelated credentials or expose raw requests until the failing source is known.
Compare returned text with exact entries and fallback
Preserve the returned value exactly and compare it with every configured Dynamic Route entry. The documented routing match is exact, so case, formatting, unexpected wrappers or a different token can explain a miss even when the upstream lookup succeeded.
If no entry matches, follow the configured default destination. The guide warns that lookup failure or an unmatched result can drop the call when no default is defined. Distinguish that behavior from an explicit Terminate Call destination and from a downstream destination that receives the call but then fails.
Correct the first boundary and test all four outcomes
Change only the first demonstrated mismatch: module or loaded state, input rule, variable name, substitution setting, source configuration, result contract, entry value, invalid destination or default destination. Repeat the original call plus one valid match, invalid input, failed lookup and unmatched result.
Retain the pre-change configuration and external-system owner for rollback, and remove sensitive captured data after the evidence is recorded. No PBX, module, database, ODBC source, URL, AGI script, channel, DTMF input, dialplan, destination or 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.
- Sangoma FreePBX Dynamic Routes module ↗
- Sangoma FreePBX Dynamic Routes user guide ↗
- Sangoma FreePBX Dynamic Routes working examples ↗
- Sangoma FreePBX community-supported modules ↗
- Sangoma FreePBX Module Admin user guide ↗
- FreePBX Dynamic Routes call-flow article ↗
- FreePBX Contributed Modules dynroute repository ↗
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.