SIP trunking guide for outbound dialing
Complete guide to SIP trunking — what it is, choosing a provider, configuring with VICIdial, troubleshooting.
SIP trunking is the carrier service that routes your outbound calls to the PSTN (regular phone network). Choosing the right provider + configuring it correctly is the single biggest lever on outbound dialing answer rates and per-minute cost.
This guide is for operators picking + configuring SIP trunks.
What SIP trunking actually is
SIP = Session Initiation Protocol. It's the IP-based protocol that handles call setup, signaling, and teardown. RTP carries the audio.
A "SIP trunk" is your account with a SIP provider that grants you outbound + inbound calling capacity. The trunk has:
- A registration endpoint (the host you connect to)
- Authentication (username/password OR IP whitelist)
- Phone numbers (DIDs) you can use as caller ID
- Call concurrency limit (channels)
- Per-minute pricing
Your VICIdial server registers with the trunk, then places outbound calls through it.
Choosing a SIP provider
Five questions, in order of importance:
1. STIR/SHAKEN attestation level
Mandatory for US outbound since 2021. Three levels:
- A (full attestation) — carrier verified you, your number is yours, you control it. Calls ring normally.
- B (partial) — verified you + gateway, not the number. May get "Likely Spam" labels.
- C (gateway) — pass-through. High probability of being silently blocked.
A vs B vs C is the difference between 12% and 3% answer rates on cold lists. Get A.
Best-in-class for A: Bandwidth, Inteliquent, Telnyx, Twilio Elastic SIP, Voxbeam (US side).
2. Per-minute rate to your top destinations
The headline rate is meaningless. Carriers cross-subsidize: cheap to NYC, expensive to rural NM. Ask for the rate-deck CSV at the NPA-NXX level for the prefixes you actually dial.
Real carriers send the rate-deck. Resellers hedge.
3. POPs map (for latency)
Your VICIdial server → carrier ingress latency affects audio quality + call setup time. Ask where their SIP-handling POPs are.
A carrier with US-East / US-West / Europe / Asia is fine. A carrier with one US-Central POP and you're dialing internationally → audio lag, customer hangs up.
4. Abuse / fraud response time
Outbound dialing → some number gets reported as spam → carrier suspends your trunk. Question is how fast they unsuspend.
Ask:
- Typical response time on an abuse ticket
- Automated review or human
- Appeal process
A good carrier responds in hours. A bad one suspends Friday and you're down for the weekend.
5. Channel pricing + minimum billable duration
Some carriers bill for "completed" calls that actually went to voicemail. Some bill short calls (under 6s) at full minute. These add up at predictive volume.
Ask:
- Minimum billable duration (1s? 6s? 60s?)
- "Connected" vs "answered" billing
- Surcharges for cellular, international, premium-rate numbers
Carriers commonly used
(Not a recommendation — we don't take referrals.)
| Carrier | Strength | Best for | | ---------------------- | ------------------------------------ | ----------------------------- | | Twilio Elastic SIP | Easy, premium, A-attestation | Starting out, B2B sales | | Telnyx | Better rates than Twilio, strong API | Mid-volume, dev-friendly | | Bandwidth | Direct US carrier, A-attestation | High-volume domestic | | Voxbeam | EU + LATAM coverage | Non-US dialing | | Inteliquent | Wholesale, A-attestation | High-volume bulk | | Skyetel | Sub-cent rates at volume | Wholesale-shape operators | | Plivo | API-first, decent rates | Mid-volume, integration-heavy |
Configuring through the dashboard
VICIfast automates the carrier-side wiring so you don't touch VICIdial admin for routing. From your server detail page → Configurations → Manage Trunks → Add trunk:
- Pick the carrier from the curated list (Twilio, Telnyx, Bandwidth, etc.) or "Generic SIP".
- Direction: Outbound only / Inbound only / Both. Real-world setups commonly split — Twilio outbound + Bandwidth inbound on different IPs.
- Trunk name: a short identifier (becomes the PJSIP endpoint name on the box).
- Host + credentials (or IP-auth for partners that support it).
Behind the scenes:
- Renders
pjsip.conffrom the partner's template + your credentials, pushes it over SSH. - Allocates a 4-digit dial prefix (9000-9499 pool) and writes the matching
vicidial_carriersrow. Thedialplan_entrymatches_<prefix>X.and dialsPJSIP/${EXTEN:4}@<trunkname>. - Whitelists the partner's IPs in your firewall (refreshed nightly).
Linking a carrier to campaigns
Click Link on the trunk row → paste the campaign IDs (comma- or newline-separated). We set each campaign's dial_prefix to the trunk's allocated prefix. VICIdial then routes that campaign's outbound calls through this carrier.
If a campaign is already linked to another trunk we'll refuse the second link — unlink the first binding explicitly. No accidental reroutes of in-progress dialing.
Disable a trunk and we cascade-unlink every campaign that pointed at it, so calls fail loudly instead of silently dropping into a dead carrier.
Failover routes
For multi-carrier failover (try Twilio first; if congested, fall through to Bandwidth), create a Failover Route in the same modal:
- Name the route (e.g.
us-outbound-primary). - Pick 2+ outbound trunks in priority order (up/down arrows).
- We allocate a separate prefix from the 9500-9999 pool and render a multi-
Dial()dialplan that fails through on any non-ANSWER status (30s per leg). - Link campaigns to the route the same way you'd link them to a single trunk.
Reorder trunks or rename via the edit pencil — linked campaigns keep their prefix; only the underlying dialplan rewrites.
Per-trunk TCPA / BLA
If you bring your own Blacklist Alliance key, set it once at the server level (Configurations → TCPA Compliance). You can also override per trunk:
- Inherit (default) — use the server's BLA key.
- Custom — use a different BA account / failure mode for this specific trunk. Useful when one trunk has its own compliance posture (e.g. dedicated to a regulated vertical).
- Disabled — skip BLA entirely for this trunk. Use for trunks outside US TCPA scope: Canada-only, EU-only, internal test routes.
The pre-dial AGI hook checks the dialed prefix and looks up the trunk's BLA mode before placing the call.
Inbound DIDs
In the same modal, the Inbound DIDs section lets you bind a phone number reachable on an inbound trunk to a VICIdial ingroup / campaign / extension / IVR. We write to vicidial_inbound_dids so calls landing on the DID route to your target without any manual VICIdial admin work.
Going manual
If you need a config the dashboard doesn't surface (custom DTMF mode, exotic codec list, alternate SIP context), edit the trunk's pjsip block in VICIdial after the dashboard install — we won't overwrite admin edits to entries outside our marker comments. The pjsip.conf block is bracketed by ;;; vicifast-trunk-begin <id> / ;;; vicifast-trunk-end <id> markers; everything else is yours.
See our integration pages for partner-specific notes.
Common gotchas
"All circuits busy" on every test
Carrier IPs not allowed in your firewall. Run:
sudo firewall-cmd --list-all
Look for SIP (5060/UDP) — should allow inbound from carrier signalling IPs (carriers publish these).
Calls connect, no audio one or both directions
NAT/RTP issue. Check:
nat=force_rport,comediaset on carrier definition- RTP port range (10000-20000/UDP) open in firewall
- VICIdial server has a public IP, not behind a NAT'd LB
Calls fail with 403 Forbidden
Authentication. Tail Asterisk log:
sudo tail -f /var/log/asterisk/messages | grep -i sip
Look for REGISTER attempts — the response code reveals the issue.
Per-call DTMF stops working
relaxdtmf=yes on the carrier definition. Some carriers send DTMF as RFC2833, some inband.
Multi-carrier strategy
Why operators run multiple carriers:
- Failover: if Carrier A suspends you, Carrier B keeps you running
- Least-cost routing: international destinations vary in price; dial through whichever's cheapest
- Reputation isolation: separate carriers per campaign so a bad campaign doesn't burn your good DIDs
- Direction split: most production setups use a different carrier inbound vs outbound (the inbound provider hands you DIDs at lower rates than your outbound origination carrier)
On VICIfast: each trunk you add gets its own dial prefix; the campaigns you link to it route through that trunk. For per-campaign failover (try Trunk A first, fall back to Trunk B), use the Failover Routes feature — see the dashboard section above. No need to touch the campaign's Carrier ID Override field directly.
Reputation management
Even at A-attestation, your DIDs can get flagged:
- Drop rate >3% on a campaign using a DID
- Consumer spam reports
- Volume per number too high (>50/min sustained)
Mitigations:
- Don't exceed 50 calls/minute from one DID
- Rotate DIDs per campaign or per hour
- Register with reputation services (TNS, First Orion, Hiya) — fees apply
Pricing benchmarks
Rough US outbound:
- Twilio: $0.0085/min
- Telnyx: $0.0050/min
- Bandwidth: $0.004-0.007/min volume-tiered
- Voxbeam: ~$0.005/min varies
- Skyetel: $0.0028-0.004/min volume-tiered
- Plivo: $0.0080/min
For a 100-agent shop dialing 25,000 minutes/day = 750K min/mo:
- Twilio: $6,375/mo
- Telnyx: $3,750/mo
- Bandwidth (volume): $3,000-3,750/mo
- Skyetel (volume): $2,100-3,000/mo
The savings at scale matter. Run the math at your volume.