This is the full catalog of namespaces and fields the template engine resolves. Use it when building post-call push key_mapper templates, opening messages, prompts, and CRM pre-fetch params. The variable set is assembled by the API service (one path for post-call results, another for live prompts).

Resolution rules

  • Explicit namespace ({{result.recording_url}}) always resolves directly.
  • Flat fallback ({{CUSTOMERNAME}}) tries an exact match, then strips any prefix and searches a fixed, limited order: system.crm.call.. It does not reach result.*, analysis.*, or qc.*. Always namespace those explicitly.
  • drop_unresolved differs by context:
    • In prompts/opening messages, an unresolved {{...}} is left as a literal so mistakes are visible.
    • In the post-call push, templates render with drop_unresolved=true: unresolved tokens become empty strings (""), not literals. A typo silently sends blank.

call.* — call / connected-event variables

Every field from the stored connected event (campaign CSV columns, dialout variables, internal _campaign_* fields), plus captured SIP headers.
VariableMeaning
call.<any_field>Any column/variable supplied via CSV or the dialout API (e.g. call.CUSTOMERNAME, call.due_amount).
call.sip_header_<name>An individual filtered SIP X-header captured at call setup (subject to the bot’s sip_header_config).
call.sip_headers_jsonAll captured SIP headers as a single JSON object string, for CRM echo-back.

crm.* — CRM pre-fetch variables

Fields returned by the bot’s CRM pre-fetch call, flattened into the crm. namespace.
VariableMeaning
crm.<field>Any field from the CRM pre-fetch response (e.g. crm.due_amount).

system.* — system-generated values

Current date/time in the bot’s timezone.
VariableExample
system.current_date05 June 2026
system.current_time03:45 PM IST
system.current_datetime05 June 2026, 03:45 PM IST
system.timezoneAsia/Kolkata

result.* — system call outcome

Always present after the call completes.
VariableMeaning
result.call_idThe call’s session id.
result.recording_urlStable public recording URL (per-call access token, not a raw signed URL).
result.call_duration_secondsRounded call duration.
result.disconnected_byRaw disconnect reason (bot, customer, voicemail, RNR, timeout, error, etc.).
result.dispositionCoarse mapped status (Connected / Failed / Unknown).
result.call_start_timeFormatted start time (bot timezone).
result.call_end_timeFormatted end time (bot timezone).
result.call_answer_timeFormatted answer time (same as start on transports that do not report answer separately).
result.transcriptFormatted transcript as a JSON array (sender, message, timestamp).

Transfer-state fields

Populated whenever the bot called the transfer tool; empty otherwise.
VariableMeaning
result.was_transferredyes only if the transfer actually committed (no later failure); else no.
result.transfer_destinationDestination value the call was transferred to.
result.transfer_targetTarget label/id selected.
result.transfer_reasonReason the bot gave for transferring.
result.transfer_methodwebsocket_reverse_transfer or livekit_sip_refer.
result.transfer_atSeconds into the call when the transfer occurred.
result.transfer_failed_reasonFailure reason when a transfer was attempted but did not commit.

analysis.* — LLM post-call analysis

All keys are always present (default empty string) so a mapped template never sends a literal token. Some keys are domain-specific (collections / insurance).
VariableMeaning
analysis.DISPOSITIONBusiness disposition.
analysis.SUB_DISPOSITIONSub-disposition.
analysis.PAID_AMOUNTAmount paid/committed (collections).
analysis.FOLLOUP_PTP_DATEPromise-to-pay date (key name spelled FOLLOUP_PTP_DATE in code).
analysis.ptp_timePromise-to-pay time.
analysis.callback_dateCallback date extracted from the conversation.
analysis.callback_timeCallback time extracted from the conversation.
analysis.rpc_verifiedWhether the right party was contacted/verified.
analysis.voicemail_flow_detectedWhether a voicemail flow was detected.
analysis.languageDetected/used language.
analysis.dispute_reasonDispute reason, if any.
analysis.CALLING_REMARKSFree-text calling remarks.
analysis.call_summaryShort summary of the call.
FOLLOUP_PTP_DATE is spelled exactly that way (with the typo) in code — map it verbatim.
When callback detection is active, the analysis also carries the callback keys described in Callbacks: callback_requested, callback_preferred_time_text, callback_reason, callback_confidence.

qc.* — QC analysis

All keys default to empty string.
VariableMeaning
qc.empathy_scoreEmpathy score.
qc.compliance_scoreCompliance score.
qc.overall_scoreOverall QC score.
qc.remarksQC remarks.

Mapping checklist

  • Use explicit namespaces for result.*, analysis.*, qc.* — flat fallback will not reach them.
  • Map FOLLOUP_PTP_DATE exactly (the misspelling is intentional in code).
  • Remember post-call push drops unresolved tokens to "" — verify the actual payload after a test call.
  • Send {{result.recording_url}} (stable token URL), never a raw signed S3 URL.