trunk row per carrier connection. A
trunk is the thing TeleQuick places calls out of and receives calls
on. This page explains what each group of fields on that form controls,
and how the read-only panels on the screen (effective inbound route,
WhatsApp webhook coordinates) are derived.
The form validates on submit: messages stay hidden until the first
failed save attempt, then update live as you fix fields. Numeric fields
hold real numbers, so an emptied or garbled port is rejected rather
than sent to the engine as 0 or NaN.
Transport: SIP carrier trunk vs WhatsApp Business Calling
Thetransport field picks which kind of carrier connection this trunk
is, and it changes which sections of the form exist.
For a WhatsApp trunk there is no SBC, no registration and no RTP
configuration. Inbound calls arrive over the hosted webhook rather
than as an INVITE from an SBC, so the SIP-only sections are hidden when
transport is whatsapp. The fields that remain required at creation
time are:
WhatsApp Business Calling is an override-only entitlement. The
transport option is hidden when the tenant’s entitlement certificate
explicitly denies
modalities.whatsapp. A deployment with no
entitlements configured keeps the option visible; the control-plane
addTrunk / updateTrunk procedures apply the same deny-on-false gate,
so the UI and the API agree.
WhatsApp webhook callback URL and verify token
Once a trunk is saved withtransport: whatsapp, the screen shows two
values fetched from the control plane:
- Callback URL
- Verify token
calls and
messages fields. Without the calls subscription, inbound WhatsApp
calls never reach the trunk.
Carrier and SBC fields, ports and registration
These apply tosip trunks only.
Signalling and media addresses
The internal/external pairs exist because the gateway commonly sits behind NAT: the internal address is what it binds, the external address is what it advertises in SIP and SDP.
All five are validated as IP addresses when present.
Media
Realm and compliance headers
realm classifies what sits on the far end of the trunk. It drives
transfer policy, the implicit toolset advertised to in-call LLMs, and
CDR billing categorisation.
compliance_headers_mode controls identity headers on outbound
INVITEs:
full— includeRemote-Party-ID,P-Asserted-IdentityandP-Access-Network-Info. This is the regulator-friendly default.minimal— suppress all three. Use this for carriers that drop calls when the customer edge asserts identity.
Pinning a regional SIP edge for data residency
sip_edge_id pins the trunk’s signalling to a specific regional SIP
edge. The picker lists the enabled rows from the platform’s sip_edge
registry, plus a direct option.
- Choosing a named edge routes this trunk’s SIP through that region, which is how you keep signalling inside a residency boundary.
- Leaving the selector on the direct option stores
null— no edge is pinned and the trunk talks to the carrier directly.
Inbound routing precedence: DID rule, trunk rule, default park
The effective route panel is not a guess: the control plane’sadmin.dialplanRoutes procedure reads the same rules blob that the
dialplan module routes on, and applies the same precedence. For each
trunk it returns a default decision plus a list of per-DID
overrides.
Each decision carries a reason telling you which rule won:
The decision also reports the
action and args the engine will
execute, and an agentId when the action is
ai_bidirectional_stream. The panel renders these as a sentence — the
target agent’s name, the vector program, or an explicit warning for
park.
The trunk-level fields that feed a trunk_rule decision are:
An empty
park decision is the single most common cause of “the call
connects and then there is dead air”. If the panel shows
PARK — no rule matches, the trunk has no routing target and no DID
rule covers the number being called.
Why the panel lags a save
The control plane rebuilds the rules blob fire-and-forget after a trunk save, so the screen waits briefly before re-reading the routes after each save. The panel is advisory: if the query fails it is silently skipped rather than blocking the screen.How secrets are stored and rotated
Secret fields aresip_password, wa_access_token and
wa_app_secret. Redis, sealed, is canonical for all three.
The rules are the same for every one of them:
- Stored secrets are never hydrated into the form. When you expand a trunk, the secret inputs are blank even though a secret exists.
- Blank on save means “keep what is stored.” The control plane’s
keepTrunkSecretshandling reads an empty secret as no change. - Typing a value rotates it. The new value replaces the stored one.
sip_password is required only on create, and the
WhatsApp wa_access_token likewise.
This also means you cannot read a secret back out of the console. If
you have lost a carrier password, rotate it with the carrier and type
the new one here.
Deleting a trunk
Deleting a trunk from the list does not remove the row outright — the console works against active trunks, and the list is filtered toactive = true. A deleted trunk therefore stops being offered as a
routing target and stops appearing in the list.
Before you delete, check the effective-route panel of any other
trunk that might have been pointed at the same agent or VDN, and
confirm the carrier has stopped sending traffic to the addresses this
trunk advertised. Inbound calls that still arrive for a trunk with no
matching rule end in default_park, which the caller experiences as
silence.
Related
- Authentication — API keys for the control-plane procedures behind this screen
- Telemetry — the
trunklabel on metrics and CDRs comes fromtrunk_id - Telephony metrics — channel limits, trunk utilisation and ASR