Skip to content

On Call Features (in-call DTMF transfer + conference + hold music)

Org-level controls that let agents transfer and conference a live call from their phone keypad, plus the hold music a caller hears during those operations. Configured from the "On Call Features" sheet next to Add User on the Users page — applies org-wide, no per-user setup.

Keypad codes (FreePBX/Asterisk de-facto standard)

Codes were chosen to match what staff already know from other PBXes (zero relearning), and are all *-prefixed except the blind transfer (so they don't clash with sending DTMF to a 3rd-party IVR).

Code Action
## + ext Blind transfer — caller is sent straight to the extension; agent drops off immediately
*2 + ext Attended transfer — caller goes on hold, agent talks to the target, hangs up to complete
*8 + ext Directed pickup — grab a colleague's ringing call

During an attended consult (*2, customer on hold):

Code Action
*3 3-way conference — keep all three in the call
*4 Swap — toggle the agent between the customer and the 3rd party
*1 End consult — drop the 3rd party, return to the customer
(hang up) Complete the transfer (agent drops out)

Conference is the native continuation of the *2 attended transfer — there's one consult mechanism; the next key decides the outcome. It is NOT a separate ConfBridge feature.

Who can use it / which calls

The codes work on any agent-answered call where the org toggle is on — both direct extension calls and queue calls (both Dial paths carry the t/T flags). The agent presses the code during the live call (after answer), and their softphone must send DTMF as RFC2833 / SIP-INFO (the default on Zoiper/Grandstream).

The "On Call Features" sheet

Users page → On Call Features (right-side sheet). Org-level settings, saved to Organization.settings; each save regenerates the dialplan + reloads Asterisk (non-disruptive) and shows a progress bar.

  • In-Call Transfer & Conference toggle — one switch (conference rides on the same attended-transfer t/T gate, so they move together). Backed by settings.features.call_transfer / conference (default ON).
  • Hold Music (direct calls) dropdown — what a caller hears when an agent holds them during a transfer/conference on a direct call. Populated from the same GET /moh source as Departments. Queue calls keep their department's MOH (the queue sets its own musicclass). Stored as settings.moh_class (full class name, e.g. org_<ctx>__custom); "Default (Asterisk)" clears it.

Architecture

  • features.conf (global, in sip-gateway/cloud-{staging,prod}/, deployed verbatim by deploy-api-{staging,prod}.yml + module reload features):
  • [featuremap]: blindxfer => ##, atxfer => *2, plus pickupexten = *8.
  • [general] attended-transfer controls: atxferabort = *1, atxfercomplete = *2, atxferthreeway = *3, atxferswap = *4, featuredigittimeout = 1500.
  • It is a global file — the feature DIGITS are the same for every org. Per-org enable/disable is done in the dialplan, not here.
  • Per-org gating (dialplanGenerator): the Dial() t/T flags are emitted only when settings.features.call_transfer is true (default ON), via the _callFeatureFlags(org) helper, on every agent-facing Dial. With no t/T flag on a leg, that leg can't invoke any feature regardless of the featuremap. TRANSFER_CONTEXT is set so the dialed <ext> resolves in <org>_internal.
  • Hold music: the generator sets CHANNEL(musicclass)=<settings.moh_class> on the direct-call leg only; queue paths set their own.
  • API: PATCH /api/v1/organizations/:id/settings accepts { features: { call_transfer, conference }, moh_class }, persists + regenerates + reloads.

Per-org key customization

Not available. The transfer codes live in Asterisk's global featuremap, so per-org custom keys aren't cleanly possible (would need a heavier per-channel DYNAMIC_FEATURES setup). A platform-wide admin customization (one scheme for all orgs) is possible if ever needed.