
FreePBX Outbound Route Configuration for High-Volume Outbound Teams
Outbound route configuration is where dial plan meets carrier selection — get it wrong and calls fail silently or route to the wrong trunk.
1. How FreePBX Routes Outbound Calls
When an extension dials a number, FreePBX walks your outbound route list from top to bottom and sends the call to the first route whose dial pattern matches. Routes also carry a trunk sequence: if trunk 0 fails (no response, 503, or 403), FreePBX tries trunk 1, and so on. For flat-rate trunks like UnlimCall, you want your primary route to point exclusively at your SIP trunk — there is no reason to route around it on price because there is no per-minute cost to avoid.
If you haven't configured your PJSIP trunk yet, start with FreePBX PJSIP trunk setup before continuing here.
2. Route Architecture for Outbound Call Centers
A well-organized outbound FreePBX system typically runs three to five outbound routes:
- Domestic (US/CA): matches 10-digit and 1+10-digit patterns, primary trunk is your flat-rate SIP provider
- International: matches 011+country code patterns, same or separate SIP trunk depending on your agreement
- Emergency: 911/933 only, routes to a PSTN gateway — never through a VoIP-only trunk
- Internal test: routes to a loopback extension for dialer QA without burning live channels
Keep emergency routes at the top of the list regardless of ordering logic.
3. Dial Pattern Syntax
FreePBX dial patterns use four columns: prepend, prefix, match pattern, and CallerID override.
For a US/Canada outbound center connecting to UnlimCall across all 33 markets:
Domestic US/CA route:
| prepend | prefix | match pattern | CallerID |
|---|---|---|---|
| 1 | NXXNXXXXXX | ||
| 1NXXNXXXXXX | |||
| 011. |
The 011. pattern (period = one or more digits) catches all international dialing in E.164 style. If your dialers send numbers in +1NXXNXXXXXX format, add that as a separate pattern row with a blank prepend.
International route (if separated):
| prepend | prefix | match pattern | CallerID |
|---|---|---|---|
| 011 | . |
Strip the 011 prefix so the trunk receives a clean E.164 number without the exit code. UnlimCall's network expects digits in E.164 without a leading +.
4. Route-Level CallerID vs. Extension-Level CallerID
FreePBX allows you to set a CallerID at the route level, the extension level, or the trunk level. For multi-campaign outbound operations — particularly call centers using a predictive or power dialer — you almost always want to set CallerID at the campaign or outbound route level, not the extension.
Why: individual agent extensions typically have no meaningful CallerID for outbound PSTN calls. The number presented to the called party should reflect your campaign's provisioned DID for that geographic market, not the agent's internal extension number.
Leave the route-level CallerID field blank if your dialer software injects the P-Asserted-Identity or Remote-Party-ID header per call. UnlimCall honors both headers for caller ID pass-through. See caller ID per outbound campaign for per-DID configuration.
5. Trunk Failover in the Route
Add your UnlimCall PJSIP trunk as position 0 in the trunk sequence. If you have a secondary SIP provider or a local PSTN gateway, add it at position 1.
FreePBX triggers failover on:
- No response within the SIP timeout (default 32 seconds)
- 503 Service Unavailable
- 403 Forbidden (when the primary trunk rejects the call)
- 408 Request Timeout
It does not failover on 404 (destination not found) or 480 (temporarily unavailable) by default — those are treated as final responses. Adjust sip.conf / pjsip.conf match_auth_username and outbound_proxy settings if your trunk requires per-call proxy routing.
For a more detailed failover configuration, see FreePBX failover trunk setup.
6. Testing Routes Without Live Calls
Before going live, use the FreePBX dialplan test tool (Admin > Dialplan Test) or the Asterisk CLI:
`` asterisk -rx "dialplan show from-internal" ``
To simulate a call without actually dialing:
`` asterisk -rx "dialplan show 15551234567@from-internal" ``
This shows which route and trunk Asterisk would select for that number. Cross-check the output trunk name against your SIP trunk configuration.
After routing is confirmed, run a single live call to a controlled number (your own cell, a verification service) and confirm the caller ID, codec, and call quality before enabling the full dialer.
Takeaways
Outbound route configuration in FreePBX is straightforward but has sharp edges: dial pattern ordering, prefix stripping, and CallerID injection points all interact. Keep your routes purpose-separated (domestic, international, emergency), strip exit codes so your trunk receives clean E.164, and let the campaign layer — not the extension — control which caller ID appears on the called party's screen.
Flat-Rate Outbound: Simpler Cost Model, Simpler Operations
UnlimCall seats are billed monthly at $99/seat for US/CA markets — no per-minute charges to route around, no trunk-shopping logic needed. Pricing for all 33 markets at /pricing/.