> ## Documentation Index
> Fetch the complete documentation index at: https://docs.findtempo.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Variables

> Inject data and steer the model. The two kinds of variable tokens and the full variable catalog.

A **variable token** is an inline placeholder inside a template. There are two kinds: **data** variables get replaced with live values at render time, and **instruction** variables are model directives that don't appear in the output literally.

## Inserting a variable

In the editor, position your cursor where you want the variable, then press `#`. A picker opens. Choose the variable you want. The picker is searchable — start typing to filter.

Data chips render in **blue** with the variable name. Instruction chips render in **pink** with an instruction icon and the directive text.

## Data variables

A **data variable** is a pointer to a value Deal Brain knows about. At render time, the chip is replaced with the actual value from the bound opportunity (or other context object).

<Note>
  The exact variables available in your editor depend on your Deal Brain organization's CRM integration and configuration. Variables are **not a fixed list** — they're populated dynamically from the field definitions Deal Brain has loaded from your CRM (Salesforce, HubSpot) plus your workspace settings. The `#` picker is the authoritative source for your account.
</Note>

Variables generally fall into four categories. The examples below are illustrative — your account may have more, fewer, or differently-named variables.

<Tabs>
  <Tab title="Identity">
    Information about who's invoking the template and when. Identity variables come from your Deal Brain session and don't depend on your CRM.

    Typical examples: the calling user, the user's organization, the current date and time.

    Use identity variables for greetings, signatures, and date-anchored text.
  </Tab>

  <Tab title="Opportunity & CRM">
    Information about the bound deal — name, stage, account, state-of-deal context, and so on. These variables are driven by your **CRM field definitions**, so the exact set depends on which fields Deal Brain has loaded for opportunities, contacts, and accounts.

    If your CRM exposes a field on opportunities, Deal Brain pulls it in and surfaces it in the picker. If a custom field exists only in your CRM and not in another customer's, only your team sees it.

    Opportunity variables are the workhorses of most Canvas templates.
  </Tab>

  <Tab title="Custom fields">
    Any custom field defined on your CRM's opportunities, contacts, or accounts shows up automatically. The variable name in the picker tracks the field label in your CRM.

    The picker groups custom fields under their parent entity (Opportunity / Contact / Account), so you can browse what's available.
  </Tab>

  <Tab title="Workspace config">
    Shared values your team has set in Deal Brain's workspace configuration — used for things every template wants but isn't tied to a specific deal. Common examples: a preferred tone of voice, a sign-off style, qualification criteria.

    Workspace config is authored by your team admin and visible to every template in the org.
  </Tab>
</Tabs>

<Tip>
  Don't try to memorize the variable list — open the `#` picker and search. The picker shows your account's current catalog with previews, so you always see exactly what's available.
</Tip>

### Render behavior

| Situation                                                   | What happens                                                                                                              |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| The bound opportunity has the value                         | Variable renders inline as the live value.                                                                                |
| The bound opportunity is missing the value                  | Variable renders as an empty string, *not* a placeholder like `(no value)`. Plan for missing data in your template prose. |
| The variable type is multi-line (e.g. last meeting summary) | Renders as a block of text. Surround with a heading or list item if you want structure.                                   |
| The template is rendered without an opportunity             | Opportunity variables render empty. Identity and workspace variables still work.                                          |

## Instruction variables

An **instruction variable** is a model directive — it changes how the LLM behaves at render time, but the directive text itself doesn't appear in the output.

To insert an instruction, press `#` and pick **Instruction** at the top of the picker. Type the directive inline.

### When to use instructions

Instructions are how you steer tone, length, format, and behavior:

| Use case         | Example instruction                                                                                                |
| ---------------- | ------------------------------------------------------------------------------------------------------------------ |
| Length control   | *"Write 3–5 sentences. Do not exceed 100 words."*                                                                  |
| Tone             | *"Use a confident, direct tone. No hedging language."*                                                             |
| Format           | *"Output as a bulleted list. Each bullet is 1 sentence."*                                                          |
| Faithfulness     | *"Only include facts present in the bound opportunity's data. Do not invent participants, dates, or commitments."* |
| Style guardrails | *"Avoid these phrases: 'circle back', 'touch base', 'reach out'."*                                                 |

<Tip>
  Instructions compose. You can stack several short instructions in different blocks — one for tone, one for length, one for faithfulness — and the model will honor all of them. Long single instructions tend to get partially ignored; short scoped ones don't.
</Tip>

### Instructions vs. paragraph prose

If you write *"Summarize the last meeting in two sentences"* as **paragraph prose**, it appears literally in the output — *the template generates the words "Summarize the last meeting in two sentences"* and the model doesn't follow it.

If you write the same words as an **instruction variable**, the model follows them and the output has the actual summary in their place.

When in doubt: anything you don't want appearing literally in the output should be an instruction, not prose.

## The `#` picker, in detail

| Action        | Result                               |
| ------------- | ------------------------------------ |
| `#`           | Open picker.                         |
| `#name`       | Filter to variables matching "name". |
| `Esc`         | Close without inserting.             |
| `Enter`       | Insert the highlighted variable.     |
| `↑` / `↓`     | Navigate options.                    |
| Click outside | Close without inserting.             |

The picker shows the variable's source (Identity / Opportunity / Custom / Config) and a one-line preview so you can pick the right one without ambiguity.

## Common patterns

<AccordionGroup>
  <Accordion title="A greeting line with identity variables">
    ```
    Hi {{user name}}, here's your {{day of week}} brief for {{current date}}.
    ```

    Renders as: *Hi Nick, here's your Wednesday brief for 2026-06-03.*
  </Accordion>

  <Accordion title="A deal-context line">
    ```
    {{opportunity name}} — {{account name}} — stage {{current stage}}.
    ```

    Renders as: *Acme — Platform expansion — Acme Inc. — stage Proposal sent.*
  </Accordion>

  <Accordion title="A constrained summary block">
    Paragraph 1:

    ```
    {{instruction: Summarize the last meeting in 2 sentences. Only use facts present in the data.}}
    ```

    Plus the data variable `{{last meeting summary}}` in a separate block for context.

    The model produces 2 sentences. The instruction never appears in the output.
  </Accordion>

  <Accordion title="A team-styled output">
    ```
    {{instruction: Use this tone: {{company tone of voice}}.}}
    ```

    Composes a workspace config variable into an instruction. The team admin can update tone-of-voice in one place and every template that references it picks up the change.
  </Accordion>
</AccordionGroup>

## See also

* [Concepts](/canvas/concepts) — the broader Canvas mental model.
* [Publishing](/canvas/publishing) — how templates become visible to agents.
