Write the instructions an agent runs on, use placeholders that fill in from the CRM, and schedule text that only applies for a week.
The Agent Instructions field is the agent. Everything else on the form —
voice, timing, tools — decides how it sounds and what it can reach; the
instructions decide what it does. This article covers what goes in that field,
the placeholders that fill themselves in at call time, what Goals is
actually for, and how to schedule text that applies only for a week.
Everything here is on the Conversation tab (Instructions & Greeting and Temporary instructions) and the Tools tab's Optional Prompt Components card.
agents:voice:manage permission.What the model receives on a call is assembled in a fixed order, and your field is one layer of it:
flowchart TB
A["Platform rules<br/>(Karmaflow.ai, every voice agent)"] --> B["Your workspace's<br/>prompt components"]
B --> C["<b>Agent Instructions</b><br/>(this field)"]
C --> D["Workspace append components<br/>+ transfer cascade + knowledge rules"]
D --> E["Final platform gate<br/>(checked last, every turn)"]
Two consequences worth knowing before you write:
Your workspace's own components — shared text you want on several agents rather than copy-pasted into each — are created by a tenant admin at Settings (the gear icon) → Agents & AI → Prompt Components, and switched on per agent under Tools → Optional Prompt Components. System components are always included and are not listed there.
Two shortcuts sit in the card header:
Write {{key}} in your instructions or greeting and the agent gets its value
for this call. Always available:
| Placeholder | Filled with |
|---|---|
{{first_name}} |
The resolved contact's first name — empty if the caller is unknown |
{{last_name}} |
The resolved contact's last name |
{{caller_number}} |
The number at the other end of the call |
{{current_time}} |
Today's date and time in your workspace time zone |
{{limited_time_prompts}} |
Whichever temporary instructions are active right now |
Also available, depending on how the call started:
Where the value goes depends on the field.
{{key}} as the value given there. Your instructions are then the same
text on every call, which lets the AI provider reuse them from its cache
and answer sooner. {{limited_time_prompts}} is the one exception: it is
replaced where you put it.Names match exactly or ignoring case, so {{First_Name}} works too. A hyphen
is not read as an underscore: {{first-name}} is not filled, and the form
warns you under the instructions box.
A placeholder nobody provides is left on the page as written. If a caller
is unknown, {{first_name}} has no value: in the instructions the agent is
told it was not provided, and in the greeting it resolves to an empty string —
so write Hi {{first_name}} and an unknown caller hears "Hi". Guard it in the
instructions ("if you do not have their name, do not guess it") rather than
relying on the greeting.
Goals sits directly under the instructions and does something different from everything around it: it is not sent to the model. It is the list the performance dashboard scores completed calls against, which is where goal-attainment numbers on the agent's performance page come from.
Write one outcome per line, each one observable in a transcript:
Book a demo call
Collect the caller's email
Resolve without escalation
If you also want the agent to pursue a goal, say so in the instructions as well. Putting it only in Goals measures without asking.
Static Greeting is spoken verbatim as the agent's first turn — no paraphrase, no variation. It only plays when Who speaks first, right above it in the Opening group, is set to The agent speaks first; the default, The caller speaks first, waits for the caller to speak. Full detail in Voices, Greetings and Pronunciation.
The card was called Limited Time Prompts until November 2026; it works the same way. Use a temporary instruction for anything with an end date: a promotion, a holiday closure, a product recall script, "we are moving offices on the 14th". It saves you editing the main instructions twice and remembering to undo it.
How it works: the text is injected at {{limited_time_prompts}} while its
window is open, and when nothing is active the placeholder is removed
entirely.
{{limited_time_prompts}} somewhere in Agent Instructions — ideally
where a temporary note makes sense in context. Nothing in this card
reaches the model until you do, and the card shows an amber warning while
the placeholder is missing. Copy placeholder puts it on your clipboard.Times are shown and stored in your workspace's timezone, and the row tells you how long until it starts or ends.
Several prompts can be active at once, and they all inject. Keep them short and non-contradictory — two active prompts arguing about the same policy is the failure mode here.
{{limited_time_prompts}} placeholder is missing from the instructions, or
the row's Enabled switch is off.{{first_name}} comes out blank. The caller was not resolved to a
contact. That is correct behaviour, not a bug — the alternative is the agent
guessing a name.