The Trunks screen edits one 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

The transport 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 with transport: whatsapp, the screen shows two values fetched from the control plane:
  • Callback URL
  • Verify token
Both are derived server-side from the trunk id. Nothing is stored and nothing is generated for you to keep safe — they exist as soon as the trunk row exists, and they are stable for that trunk. If the panel reports the URL as unavailable, the trunk has not yet been saved with the WhatsApp transport. Paste both into the Meta app console under Webhooks → whatsapp_business_account, then subscribe the app to the calls and messages fields. Without the calls subscription, inbound WhatsApp calls never reach the trunk.

Carrier and SBC fields, ports and registration

These apply to sip 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 — include Remote-Party-ID, P-Asserted-Identity and P-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.
Selecting an edge also patches the trunk’s address fields to that edge’s values, so the addresses you advertise to the carrier match the edge you pinned. Whitelist the edge on the carrier side before you save, otherwise the carrier will see traffic from an address it does not recognise.

Inbound routing precedence: DID rule, trunk rule, default park

The effective route panel is not a guess: the control plane’s admin.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 are sip_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:
  1. Stored secrets are never hydrated into the form. When you expand a trunk, the secret inputs are blank even though a secret exists.
  2. Blank on save means “keep what is stored.” The control plane’s keepTrunkSecrets handling reads an empty secret as no change.
  3. Typing a value rotates it. The new value replaces the stored one.
Because of rule 2, the secret fields are only mandatory when the trunk is first created. On edit they are optional, and the form’s validation reflects that: 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 to active = 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.
  • Authentication — API keys for the control-plane procedures behind this screen
  • Telemetry — the trunk label on metrics and CDRs comes from trunk_id
  • Telephony metrics — channel limits, trunk utilisation and ASR