This page covers the two steps of the bot wizard where you tell the bot what to say and how to behave:
  • Step 1: Instructions — the system prompt, per-call runtime context, post-call analysis, quality control, and auto dispositions.
  • Step 2: Policy — the optional conversation policy engine for collection and motor-insurance-renewal calls.
Both steps live inside the bot creation wizard. If you haven’t seen the wizard yet, read Create a bot first. The voice engines and call tools are covered separately in Voice pipeline and Tools & integrations.
You can jump back to any earlier step at any time by clicking its number in the stepper bar at the top of the wizard. Nothing is saved until you click Create Bot on the final step.

How variables work

Throughout these steps you will write {{variable}} tokens. At call time the platform replaces each token with a real value (a customer name, an amount, today’s date). Variables come from a handful of named sources called namespaces.
SourceNamespaceExample token
Campaign CSV column / dialout APIcall.*{{call.CUSTOMERNAME}}
CRM pre-fetchcrm.*{{crm.due_amount}}
System-generated values (date, time)system.*{{system.current_date}}
Post-call result fieldsresult.*{{result.recording_url}}
Post-call analysis outputanalysis.*{{analysis.DISPOSITION}}
Quality-control outputqc.*{{qc.remarks}}
You can also write a flat token without a namespace, which is convenient when ops owns the column names:
Hello {{CUSTOMERNAME}}, your pending amount is {{due_amount}}.
A flat token first tries an exact match, then strips the prefix and searches a fixed, limited order: system.crm.call..
Flat tokens do not reach result.*, analysis.*, or qc.*. So {{DISPOSITION}} will not find analysis.DISPOSITION. Always namespace post-call values explicitly: {{analysis.DISPOSITION}}, {{result.recording_url}}, {{qc.remarks}}.
In prompts and the opening message, an unresolved token is left visible (the bot literally says the curly braces). That is intentional — if you hear {{customer_name}} on a test call, the column is missing or misspelled. Fix the CSV, the CRM mapping, or the prompt. For the complete list of every namespace and field, see Post-call variables.

Step 1: Instructions

This step is where you write the bot’s brain: the standing instructions it always follows, the fresh context it gets for each individual call, and the prompts that run after the call ends to summarise and score it.
If you turn on the policy engine in Step 2, the system prompt you write here is kept only as a fallback and is not used during live calls. The platform builds the runtime prompt from your policy instead. A blue banner appears at the top of this step to remind you.

The two prompt fields

The bot’s instructions are split into two boxes on purpose. The split lets the platform reuse the unchanging part of your prompt across every call, which keeps calls fast and cheap.

Static system prompt

The bot’s permanent personality, rules, and policy. Identical on every call, so keep it free of per-customer values.

Dynamic runtime prompt

The fresh facts for this call — the customer’s name, their due amount, today’s date. This is where {{variables}} belong.
FieldWhat to enterRequiredNotes
Static System PromptThe bot’s role, tone, rules, and conversation flow. Cacheable instructions only.Yes (unless the policy engine is enabled)Do not use {{}} variables here — this text must be byte-for-byte identical across calls so the backend can cache it. A live character count is shown below the box.
Dynamic Runtime PromptPer-call context that changes every call, written with variables, e.g. Customer name: {{crm.CUSTOMERNAME}}. Amount due: {{crm.due_amount}}. Today is {{system.current_date}}.NoVariables from {{crm.*}}, {{call.*}}, and {{system.*}} are allowed and expected here. A live character count is shown.
Putting customer-specific values (names, amounts, account numbers) in the Static System Prompt breaks caching and can leak one customer’s data into another customer’s call. Keep all per-call values in the Dynamic Runtime Prompt.
A worked example of how the two fields combine:
Static System Prompt
You are Kavya, a polite collections agent for Acme Finance.
Speak in Hindi, switch to English only if the customer does.
Never threaten the customer. Always offer the payment link if they agree to pay.
Dynamic Runtime Prompt
Customer: {{crm.CUSTOMERNAME}}
Total due: {{crm.total_due}}
Days past due: {{crm.dpd}}
Today's date: {{system.current_date}}

Post-call analysis

After the call ends, the platform can run the transcript through a language model to produce a structured summary (disposition, intent, notes). Use the collapse/expand control on the Post-Call Analysis section header to show or hide these fields.
FieldWhat to enterRequiredNotes
Post-Call Analysis PromptInstructions describing the summary you want, including the JSON fields to produce (e.g. DISPOSITION, SUB_DISPOSITION, summary).NoThe fields you name here become available as {{analysis.*}} variables in the post-call push. A live character count is shown.
Callback DetectionToggle on to inject callback-extraction fields into the analysis prompt, so the bot records when a customer asks to be called back.NoOnly takes effect if callback detection is also enabled on the campaign. See Callbacks.

Using a different model for post-call work

Live calls run on a fast, low-latency language model. Post-call analysis and quality control don’t need to be fast, so you can optionally run them on a slower, higher-accuracy model. Toggle Use a different model for post-call analysis to reveal the override fields.
FieldWhat to enterRequiredNotes
Use a different model for post-call analysisToggle on to run analysis and QC on a separate, higher-accuracy model.NoOff by default — analysis reuses the live-call model.
Post-Call ProviderChoose the language model (LLM) provider that runs analysis.Only when the override is onThe list offers several hosted and self-hosted LLM providers. Pick the one your deployment has credentials for.
Post-Call ModelThe model ID for the chosen provider, e.g. a “pro” or “thinking” tier model.Yes, when the override is onFree-text field. Enter any model ID the selected provider supports.
Thinking Level / Thinking Budget / Reasoning EffortA reasoning-depth control whose label and options change with the model you picked.NoHigher reasoning is more accurate but slower and costlier. For most analysis a low or medium setting is enough.
Project IDThe cloud project that hosts the model.Only for one of the enterprise-cloud providersRequired for that provider; the call fails to start without it.
LocationThe cloud region for the model.NoDefaults to a standard region if left blank.
Because post-call analysis runs after the customer has hung up, latency doesn’t matter. This is the right place to spend accuracy budget — keep live calls on a fast model and use a stronger model here for cleaner dispositions.

Quality control (QC)

The Quality Control section (use its collapse/expand header to show it) lets the bot score each call against criteria you define.
FieldWhat to enterRequiredNotes
QC PromptInstructions for scoring the call, including the score fields and any pass/fail rules you want.NoThe fields you define become {{qc.*}} variables in the post-call push. Runs on the same model as analysis (including the override above, if enabled). A live character count is shown.

Auto dispositions

Not every call reaches the analysis model — very short calls, calls where the customer never spoke, voicemail, timeouts, and system errors are dispositioned by rule instead. The Auto Dispositions section (use its collapse/expand header) lets you map each of those conditions to the disposition values your CRM expects. For each condition you can set up to three text values:
ColumnWhat to enter
DISPOSITIONThe top-level disposition your CRM expects (e.g. RNR, Not Connected).
SUB_DISPOSITIONThe second-level value (e.g. DSCN_PARTIAL).
CALLING_REMARKSA free-text remark to attach.
The conditions you can map:
ConditionWhen it fires
RNRThe customer picked up but stayed silent the whole call (ring-no-response / dead air).
Voicemail / IVRThe bot detected an answering machine or IVR.
No Customer MessageThe customer never spoke a single message, regardless of who hung up.
TimeoutThe call hit the maximum duration and was auto-ended.
System ErrorThe pipeline failed to start or hit an unhandled error.
Leave a condition’s fields empty to send no disposition for that case. Filling them overrides the platform’s built-in defaults for that bot. For the standard disposition meanings, see Dispositions.

Buttons on this step

ButtonWhat it does
Collapse / Expand (Post-Call Analysis)Show or hide the post-call analysis and model-override fields.
Collapse / Expand (Quality Control)Show or hide the QC prompt.
Collapse / Expand (Auto Dispositions)Show or hide the auto-disposition mapping table.
The wizard’s Previous, Continue, and Cancel controls live in the shared wizard footer and behave the same on every step — see Create a bot.

Step 2: Policy

The policy step is an optional guided alternative to writing a system prompt by hand. Instead of free-form instructions, you fill in a structured form — company name, agent name, CRM field names, payment details — and the backend assembles a tested, compliance-aware system prompt for you at call time. It is purpose-built for two India-specific call types: loan collections and motor insurance renewals.
When the policy engine is enabled, an orange banner appears: “The manual system prompt will not be sent for calls while this policy is enabled.” Your hand-written Step 1 prompt becomes a fallback only. Turn the policy engine off to go back to using your manual prompt.

Turning it on

FieldWhat to enterRequiredNotes
Enable Policy EngineToggle on to switch this bot from a manual prompt to the structured policy.NoOff by default. Every other field on this step only appears once this is on.

Template and identity

FieldWhat to enterRequiredNotes
TemplateThe kind of call this bot makes. Options: Collection — Recovery, Collection — Soft Early DPD, Collection — Soft Pre-Due, Collection — Decremental, Insurance — Motor Renewal.No (but it drives the whole form)Your choice decides which field groups below appear — collection templates show collection fields, the insurance template shows product fields.
Language PolicyHow the bot handles language. Options: Hindi primary with English switch, or Hindi / Hinglish only.NoChoose the second option for audiences who don’t switch to English.
Company NameThe company the bot represents (spoken to the customer).Yese.g. Acme Finance.
Agent NameThe name the bot uses for itself.Yese.g. Kavya.

Collection-specific fields

These appear when the template is any of the four Collection types.
FieldWhat to enterRequiredNotes
High DPD ThresholdDays-past-due above which the bot treats the account as seriously overdue.NoDefaults to 90.
Payment URLThe link to your payment portal.NoThe bot offers this when the customer agrees to pay.
Payment Channel (Hindi / English)The spoken name for the payment portal in each language, e.g. भुगतान लिंक / payment link.NoThis is what the bot says when it refers to the link, so phrase it naturally.
Settlement FallbackToggle on to allow strict recovery calls to offer a settlement after the payment pushes have been made.NoCollection templates only.

Insurance-renewal-specific fields

These appear only when the template is Insurance — Motor Renewal.
FieldWhat to enterRequiredNotes
Expiring Soon WindowNumber of days before policy expiry within which the bot frames the renewal as “expiring soon”.NoDefaults to 30.
Product NameThe product’s spoken name, used if the customer asks what they are being called about.No
Coverage SummaryA one-line recap of what the policy covers, spoken if the customer asks.NoKeep it to a single sentence.
Customer Care NumberA support number the bot can offer.NoSpoken digit-by-digit so the customer can note it down.
Vehicle Noun (Hindi / English)The everyday word for the insured vehicle, e.g. गाड़ी / vehicle for a car, बाइक / bike for a two-wheeler.NoMakes the bot sound natural in both languages.

CRM field mapping

Your CRM’s column names rarely match the names the policy expects. This section maps each policy field to the raw column name in your data, so the bot can quote real figures to the customer. The list of fields shown depends on the template.
Map these policy concepts to your CRM column names: Customer Name, Vehicle Make, Model, Registration Number, Age, Policy Number, Expiry Date, Renewal Date, NCB %, Previous NCB, OD Discount %, Premium, Previous Premium, IDV, Previous IDV, PA Cover, Add-On Plan, Times Renewed, and Email.
Map these policy concepts to your CRM column names: Customer Name, Total Due, EMI Overdue, CBC Charges, LPP, Loan Number, DPD, and Product.
The values you map here flow in as {{crm.*}} variables. If a figure comes out wrong or empty on a test call, check that the CRM column name you typed exactly matches your data source.

Compliance scenarios

These toggles arm the bot with safe, pre-written handling for sensitive situations. Which ones appear depends on the template.
ScenarioWhat it handlesTemplates
DND / do-not-callThe customer asks not to be contacted again.Collection
Deceased borrowerThe person called is reported deceased.Collection (as “deceased borrower”); Insurance (as “deceased customer revealed”)
LPP explicit disclosureRequired disclosure of late-payment penalties.Collection
Abusive customer handlingThe customer becomes abusive.Collection and Insurance
Each scenario is an independent on/off toggle — enable the ones your compliance team requires.

Redial context

When you call the same customer more than once, this section lets the bot open differently based on what happened last time.
FieldWhat to enterRequiredNotes
TELE_REMARKS FieldThe name of the CRM column that holds the notes from the previous call.No
Opening Map (JSON)A JSON object mapping each possible remark value to an opening instruction for the bot.NoFree-text JSON. A typo here means the bot falls back to its standard opening.
A small example:
Opening Map
{
  "promised_to_pay": "Gently remind the customer of their earlier promise to pay.",
  "wrong_number": "Apologise briefly and confirm you have reached the right person.",
  "asked_callback": "Acknowledge that the customer asked to be called back at this time."
}

Buttons on this step

ButtonWhat it does
Collapse / Expand (section headers)Show or hide each form group: Template & Identity, CRM Field Mapping, Collection Actions, Compliance Scenarios, Redial Context, and (insurance only) Product Identity.
As on every step, Previous, Continue, and Cancel live in the shared wizard footer.

Where these settings show up later

  • The values flow into live calls as the bot’s instructions and as {{crm.*}} / {{call.*}} / {{system.*}} variables.
  • The fields you define in the analysis and QC prompts become {{analysis.*}} and {{qc.*}} variables you can push to your CRM — configure that in Tools & integrations.
  • Once the bot is created, you can edit any of these fields again from the bot detail page — see Bot detail.
  • Before going live, place a test call to hear the opening and confirm variables resolve — see Test calls.