> For the complete documentation index, see [llms.txt](https://docs.usepylon.com/pylon-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.usepylon.com/pylon-docs/platform/triggers/template-variables.md).

# Template variables

Every variable you can insert into trigger actions, webhook payloads, and macros, with exact syntax and formatting rules.

Template variables fill in details such as the issue title, requester email, or latest message when a trigger action runs or a macro is applied.

## Syntax

Wrap the variable name in double curly braces:

```
Hi {{ issue.requester.first_name }}, we're looking into "{{ issue.title }}".
```

* Type `{` in any field that supports variables to open the variable menu. It lists only the variables available for the trigger's object and inserts the correct syntax for you.
* Names are lowercase and dot-separated, for example `issue.last_message.author.name`.
* In triggers, spaces inside the braces are optional: `{{issue.id}}` and `{{ issue.id }}` both work. Extra braces such as `{{{ issue.id }}}` are treated as two. The **Send webhook** action warns you when it finds them.
* In macros, insert variables from the `{` menu. If you type one by hand, use exactly one space on each side: `{{ issue.id }}`.
* There are no filters, conditionals, loops, or default values. To send different content in different cases, use separate trigger flows with their own conditions.

## Where you can use them

**Triggers:** the message, subject, and body fields of these actions:

* Send issue message
* Send Slack notification
* Send email notification (subject and body)
* Forward issue to email (subject and body)
* Send message to account Slack channel
* Send message to account contacts (subject and body)
* Send webhook (the **JSON payload**, and the webhook's **Target URL**)
* Create internal thread
* Send form
* Create new task (title and body)

**Macros:** the macro's reply, internal note, or email text. See [Macros](/pylon-docs/platform/triggers/template-variables.md#macros) for the variables macros support. Actions inside a macro, such as **Send Slack notification**, use the issue trigger variables.

### Which variables a trigger can use

The variables available depend on the object the trigger runs on. If a trigger has more than one kickoff, you can only use variables that every kickoff supports. Saving a trigger with a variable its kickoff doesn't support fails with an error such as `Variable "{{ csat.score }}" is not available for this trigger type.`

* **Issues** (issue, SLA, and **Phone call comes in** kickoffs): [Issue](/pylon-docs/platform/triggers/template-variables.md#issue), issue and issue-account [custom fields](/pylon-docs/platform/triggers/template-variables.md#custom-fields), [related custom objects](/pylon-docs/platform/triggers/template-variables.md#related-custom-objects), and `{{ holiday.name }}`. Plus [CSAT](/pylon-docs/platform/triggers/template-variables.md#csat-and-nps) on **CSAT survey completed**, `issue.product_ticket.*` on **Issue product ticket status changed**, and `{{ team.name }}` on team SLA kickoffs.
* **Accounts:** [Account](/pylon-docs/platform/triggers/template-variables.md#account) and account custom fields.
* **Contacts:** [Contact](/pylon-docs/platform/triggers/template-variables.md#contact), contact custom fields, and the contact's primary [account](/pylon-docs/platform/triggers/template-variables.md#account) and its custom fields. Plus [NPS](/pylon-docs/platform/triggers/template-variables.md#csat-and-nps) on **NPS survey completed**.
* **Tasks:** [Task](/pylon-docs/platform/triggers/template-variables.md#tasks-and-projects), task custom fields, and the task's account custom fields.
* **Projects and milestones:** [Project](/pylon-docs/platform/triggers/template-variables.md#tasks-and-projects), project custom fields, and the project's account custom fields.
* **Meetings:** [Meeting](/pylon-docs/platform/triggers/template-variables.md#meetings), meeting custom fields, and the meeting's [account](/pylon-docs/platform/triggers/template-variables.md#account) and its custom fields.
* **Opportunities:** the opportunity's [account](/pylon-docs/platform/triggers/template-variables.md#account), opportunity custom fields, and account custom fields.
* **Feature requests:** [Feature request](/pylon-docs/platform/triggers/template-variables.md#feature-requests) and feature request custom fields.
* **User status changed**, **New out of office event created**: [User](/pylon-docs/platform/triggers/template-variables.md#team-and-calendar), plus `calendar_event.*` on the out of office kickoff.
* **Out of office gap detected**: `{{ team.name }}`, `{{ calendar_event.start_time }}`, and `{{ calendar_event.end_time }}`.
* **Article published**: [Article](/pylon-docs/platform/triggers/template-variables.md#other-kickoffs).
* **Email blocked**, **Email suppressed**, **Anomaly detected**: the kickoff's own variables. See [Other kickoffs](/pylon-docs/platform/triggers/template-variables.md#other-kickoffs).

## How values are formatted

Pylon formats each value for the field it's inserted into:

| Field                                                             | How values are inserted                                                                                                                                                                                             |
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Message bodies (issue messages, notifications, macros, and so on) | Text is HTML-escaped. `*_html` variables are inserted as HTML. Link variables (`issue.pylon_link`, `issue.customer_portal_link`, `issue.body.attachment_links`) become clickable links.                             |
| Email subjects                                                    | Plain text, not escaped. Link variables become their text, such as `#123`.                                                                                                                                          |
| Webhook **JSON payload**                                          | Escaped for use inside a JSON string, without surrounding quotes. `*_html` and link variables arrive as HTML strings. See [Webhook payloads](/pylon-docs/platform/triggers/template-variables.md#webhook-payloads). |
| Webhook **Target URL**                                            | Not URL-encoded. Use URL-safe values such as IDs.                                                                                                                                                                   |

Every value is text:

* **Missing values** are empty. For example, `{{ issue.assignee.name }}` is blank on an unassigned issue, and `{{ holiday.name }}` is blank on a normal working day.
* **Unrecognized names**, such as a typo, are left in the message as literal text.
* **Timestamps** use RFC 3339, for example `2026-10-10T14:03:00Z`.
* **Lists** are comma-separated with no spaces, for example `billing,urgent` for `{{ issue.tags }}`.
* **Yes/no values** are `true` or `false`.

## Webhook payloads

The **Send webhook** action's **JSON payload** must be valid JSON before variables are filled in. Put every variable inside a JSON string. Pylon escapes quotes, backslashes, and line breaks in the value but doesn't add the quotes for you.

```json
{
  "issue_id": "{{ issue.id }}",
  "issue_number": "{{ issue.number }}",
  "title": "{{ issue.title }}",
  "status": "{{ issue.status }}",
  "tags": "{{ issue.tags }}",
  "account_id": "{{ issue.account.id }}",
  "requester_email": "{{ issue.requester.email }}",
  "message": {
    "id": "{{ issue.last_message.id }}",
    "body_html": "{{ issue.last_message.body_html }}",
    "is_private": "{{ issue.last_message.is_private }}",
    "sent_at": "{{ issue.last_message.sent_at }}",
    "author_name": "{{ issue.last_message.author.name }}",
    "author_user_id": "{{ issue.last_message.author.user_id }}",
    "author_contact_id": "{{ issue.last_message.author.contact_id }}",
    "author_email": "{{ issue.last_message.author.email }}"
  }
}
```

* Numbers and `true`/`false` arrive as strings, such as `"42"` and `"false"`. Convert them on your side.
* List values arrive as one string. Split `"billing,urgent"` on commas to get the tags.
* `*_external_ids_json` variables contain JSON text, so they arrive as a string you parse a second time, for example `"[{\"label\":\"Stripe\",\"external_id\":\"cus_123\"}]"`.
* `issue.last_message.*` can be an internal note. Pylon shows a warning when your payload uses it. To send only customer-visible messages, filter the **Issue has a new message** kickoff by message type, or use `issue.last_public_message.*`.

See [Webhooks](/pylon-docs/developer/webhooks.md) to set up the endpoint, verify signatures, and handle retries.

## Variable reference

Variables marked † aren't in the `{` menu. Type them in.

### Issue

| Variable                                   | Value                                                                                                |
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| `{{ issue.id }}`                           | The issue's unique ID.                                                                               |
| `{{ issue.number }}`                       | The issue number, for example `123`.                                                                 |
| `{{ issue.title }}`                        | The issue's title or subject.                                                                        |
| `{{ issue.body }}`                         | The issue's original description (not its latest message) as Markdown.                               |
| `{{ issue.body_html }}`                    | The issue's original description as HTML.                                                            |
| `{{ issue.body.attachment_urls }}`         | URLs of files attached to the issue description. Links expire after 7 days.                          |
| `{{ issue.body.attachment_links }}`        | The same attachments as clickable file-name links.                                                   |
| `{{ issue.status }}`                       | The status name, as shown in Pylon.                                                                  |
| `{{ issue.source }}`                       | Where the issue came from, such as `Slack`, `Email`, or `Chat Widget`.                               |
| `{{ issue.created_at }}`                   | When the issue was created.                                                                          |
| `{{ issue.tags }}`                         | The issue's tags.                                                                                    |
| `{{ issue.team.name }}`                    | The issue's team.                                                                                    |
| `{{ issue.link }}`                         | The URL of the issue in Pylon.                                                                       |
| `{{ issue.pylon_link }}`                   | A clickable issue number, such as #123, that opens the issue in Pylon. Recipients need Pylon access. |
| `{{ issue.customer_portal_url }}`          | The URL of the issue in the [customer portal](/pylon-docs/customer-portal/overview.md).              |
| `{{ issue.customer_portal_link }}`         | A clickable issue number that opens the issue in the customer portal.                                |
| `{{ issue.product_issue_links }}`          | Links to linked Linear, Jira, GitHub, and other product tickets.                                     |
| `{{ issue.external_support_ticket_id }}`   | The ticket ID in a connected support tool, such as a Zendesk ticket number.                          |
| `{{ issue.external_support_ticket_type }}` | The connected support tool, such as `zendesk` or `intercom`.                                         |
| `{{ issue.slack.channel_id }}`             | The Slack channel ID the issue was created in.                                                       |
| `{{ issue.slack.permalink }}`              | A link to the issue's Slack thread.                                                                  |

#### Product ticket

Available on the **Issue product ticket status changed** kickoff. Each refers to the ticket whose status changed.

| Variable                            | Value                              |
| ----------------------------------- | ---------------------------------- |
| `{{ issue.product_ticket.title }}`  | The product ticket's title.        |
| `{{ issue.product_ticket.key }}`    | The ticket key, such as `ENG-123`. |
| `{{ issue.product_ticket.link }}`   | The ticket's URL.                  |
| `{{ issue.product_ticket.status }}` | The ticket's new status.           |

#### People and account

| Variable                                | Value                                                                                   |
| --------------------------------------- | --------------------------------------------------------------------------------------- |
| `{{ issue.requester.id }}`              | The requester's contact ID.                                                             |
| `{{ issue.requester.name }}`            | The requester's full name.                                                              |
| `{{ issue.requester.first_name }}`      | The requester's first name.                                                             |
| `{{ issue.requester.last_name }}`       | The requester's last name.                                                              |
| `{{ issue.requester.email }}`           | The requester's email address.                                                          |
| `{{ issue.requester.phone_number }}`    | The requester's phone number.                                                           |
| `{{ issue.assignee.id }}`               | The assignee's user ID.                                                                 |
| `{{ issue.assignee.name }}`             | The assignee's full name.                                                               |
| `{{ issue.assignee.first_name }}`       | The assignee's first name.                                                              |
| `{{ issue.assignee.last_name }}`        | The assignee's last name.                                                               |
| `{{ issue.assignee.email }}`            | The assignee's email address.                                                           |
| `{{ issue.account.id }}`                | The issue's account ID.                                                                 |
| `{{ issue.account.name }}`              | The issue's account name.                                                               |
| `{{ issue.account.domains }}`           | The account's domains, primary domain first.                                            |
| `{{ issue.account.owner.name }}`        | The account owner's name.                                                               |
| `{{ issue.account.owner.email }}`       | The account owner's email address.                                                      |
| `{{ issue.account.external_ids_json }}` | The account's external IDs as a JSON array of `label` and `external_id` pairs, or `[]`. |

#### Latest message

`issue.last_message.*` is the most recent message on the issue, including internal notes. On the **Issue has a new message** kickoff it's the message that started the trigger. `issue.last_public_message.*` skips internal notes and hidden messages.

| Variable                                            | Value                                                         |
| --------------------------------------------------- | ------------------------------------------------------------- |
| `{{ issue.last_message.id }}`                       | The message ID.                                               |
| `{{ issue.last_message.body }}`                     | The message as Markdown.                                      |
| `{{ issue.last_message.body_html }}`                | The message as HTML.                                          |
| `{{ issue.last_message.is_private }}`               | `true` if the message is an internal note, otherwise `false`. |
| `{{ issue.last_message.author.name }}`              | The author's name.                                            |
| `{{ issue.last_message.author.user_id }}`           | The author's user ID, if a teammate wrote it.                 |
| `{{ issue.last_message.author.contact_id }}`        | The author's contact ID, if a customer wrote it.              |
| `{{ issue.last_message.author.email }}`             | The author's email address, when Pylon has one.               |
| `{{ issue.last_message.sent_at }}`                  | When the message was sent.                                    |
| `{{ issue.last_message.source }}`                   | The message's channel, such as `slack` or `email`.            |
| `{{ issue.last_message.to }}`                       | Email addresses in the To field. Email messages only.         |
| `{{ issue.last_message.ccs }}`                      | Email addresses in the CC field. Email messages only.         |
| `{{ issue.last_message.attachment_urls }}`          | URLs of the message's attachments. Links expire after 7 days. |
| `{{ issue.last_public_message.id }}`                | The ID of the latest customer-visible message.                |
| `{{ issue.last_public_message.body }}`              | That message as Markdown.                                     |
| `{{ issue.last_public_message.body_html }}`         | That message as HTML.                                         |
| `{{ issue.last_public_message.author.name }}`       | Its author's name.                                            |
| `{{ issue.last_public_message.author.user_id }}`    | Its author's user ID, if a teammate wrote it.                 |
| `{{ issue.last_public_message.author.contact_id }}` | Its author's contact ID, if a customer wrote it.              |
| `{{ issue.last_public_message.author.email }}`      | Its author's email address, when Pylon has one.               |
| `{{ issue.last_public_message.sent_at }}`           | When it was sent.                                             |
| `{{ issue.last_public_message.source }}`            | Its channel, such as `slack` or `email`.                      |

#### SLAs

The breach variables are blank when the issue has no [SLA](/pylon-docs/support-workflows/slas-and-timers.md) of that type.

| Variable                                   | Value                                                                        |
| ------------------------------------------ | ---------------------------------------------------------------------------- |
| `{{ issue.resolution_time }}`              | When the issue was resolved. Blank until then.                               |
| `{{ issue.first_response_time }}` †        | When the first response was sent to the customer. Blank until then.          |
| `{{ issue.first_response_breached }}` †    | `true` if the first response SLA breached, otherwise `false`.                |
| `{{ issue.resolution_breached }}` †        | `true` if the resolution SLA breached, otherwise `false`.                    |
| `{{ issue.first_response_breach_time }}` † | When the first response SLA breaches. Blank once the SLA is met or canceled. |
| `{{ issue.next_reply_breach_time }}` †     | When the next response SLA breaches. Blank once the SLA is met or canceled.  |
| `{{ issue.resolution_breach_time }}` †     | When the resolution SLA breaches. Blank once the SLA is met or canceled.     |

#### Holiday and team

| Variable             | Value                                                                                                                                    |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `{{ holiday.name }}` | The holiday in effect for the issue's [support hours](/pylon-docs/support-workflows/support-hours.md), or blank when it isn't a holiday. |
| `{{ team.name }}` †  | On team SLA kickoffs, the team whose SLA changed or breached.                                                                            |

### Account

On issue triggers, use the `issue.account.*` variables instead.

| Variable                          | Value                                                                                   |
| --------------------------------- | --------------------------------------------------------------------------------------- |
| `{{ account.id }}`                | The account ID.                                                                         |
| `{{ account.name }}`              | The account name.                                                                       |
| `{{ account.domains }}`           | The account's domains, primary domain first.                                            |
| `{{ account.owner }}`             | The account owner's name.                                                               |
| `{{ account.owner.email }}`       | The account owner's email address.                                                      |
| `{{ account.external_ids_json }}` | The account's external IDs as a JSON array of `label` and `external_id` pairs, or `[]`. |

### Contact

| Variable                            | Value                                                              |
| ----------------------------------- | ------------------------------------------------------------------ |
| `{{ contact.id }}`                  | The contact ID.                                                    |
| `{{ contact.name }}`                | The contact's full name.                                           |
| `{{ contact.email }}`               | The contact's email address.                                       |
| `{{ contact.customer_portal_url }}` | A customer portal sign-in link with the contact's email filled in. |

### CSAT and NPS

| Variable              | Value                           | Kickoff                   |
| --------------------- | ------------------------------- | ------------------------- |
| `{{ csat.score }}`    | The CSAT score.                 | **CSAT survey completed** |
| `{{ csat.feedback }}` | The written feedback.           | **CSAT survey completed** |
| `{{ nps.score }}`     | The NPS score, 0 to 10.         | **NPS survey completed**  |
| `{{ nps.feedback }}`  | The follow-up answer.           | **NPS survey completed**  |
| `{{ survey.id }}`     | The ID of this survey delivery. | Both                      |

### Custom fields

Insert any custom field by its slug. The `{` menu lists your fields by name and inserts the slug for you.

| Variable                                    | Trigger object                              |
| ------------------------------------------- | ------------------------------------------- |
| `{{ issue.custom_field.<slug> }}`           | Issues, macros                              |
| `{{ issue.account.custom_field.<slug> }}`   | Issues, macros                              |
| `{{ account.custom_field.<slug> }}`         | Accounts, contacts, meetings, opportunities |
| `{{ contact.custom_field.<slug> }}`         | Contacts                                    |
| `{{ task.custom_field.<slug> }}`            | Tasks                                       |
| `{{ task.account.custom_field.<slug> }}`    | Tasks                                       |
| `{{ project.custom_field.<slug> }}`         | Projects                                    |
| `{{ project.account.custom_field.<slug> }}` | Projects                                    |
| `{{ meeting.custom_field.<slug> }}`         | Meetings                                    |
| `{{ opportunity.custom_field.<slug> }}`     | Opportunities                               |
| `{{ feature_request.custom_field.<slug> }}` | Feature requests                            |

How custom field values come out:

* **Select and multi-select:** the option's stored value. Add `:label` to get the display label instead, for example `{{ issue.custom_field.priority_tier:label }}`. Multi-select values are comma-separated.
* **Date:** `YYYY-MM-DD`.
* **Number:** the number, rounded to the field's decimal places if set. Currency symbols and thousands separators aren't added.
* **User:** the user's name.
* **Empty field:** blank.

### Related custom objects

If a [custom object](/pylon-docs/platform/custom-objects.md) has a relationship field that links it to issues, issue triggers can read the linked records:

* `{{ issue.custom_object.<object_slug>.id }}`, `.name`, and `.created_at`
* `{{ issue.custom_object.<object_slug>.custom_field.<slug> }}`, with `:label` for select fields

When several records are linked, their values are comma-separated, without duplicates, up to 10 records. The `{` menu lists these under **Related custom object fields**.

### Tasks and projects

| Variable                                                      | Value                                                                   |
| ------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `{{ task.id }}`                                               | The task ID.                                                            |
| `{{ task.title }}`                                            | The task title.                                                         |
| `{{ task.status }}`                                           | The task status.                                                        |
| `{{ task.link }}`                                             | The URL of the task in Pylon.                                           |
| `{{ task.assignee }}`                                         | The assignee's name.                                                    |
| `{{ task.account.id }}`                                       | The task's account ID.                                                  |
| `{{ task.account.name }}`                                     | The task's account name.                                                |
| `{{ task.account.domains }}`                                  | The account's domains.                                                  |
| `{{ task.account.owner.name }}`                               | The account owner's name.                                               |
| `{{ task.account.crm_account_id }}`                           | The account's ID in your CRM.                                           |
| `{{ task.account.external_ids_json }}`                        | The account's external IDs as a JSON array.                             |
| `{{ task.product_ticket.title }}`, `.key`, `.link`, `.status` | The linked product ticket. **Task product ticket status changed** only. |
| `{{ project.id }}`                                            | The project ID.                                                         |
| `{{ project.name }}`                                          | The project name.                                                       |
| `{{ project.owner }}`                                         | The project owner's name.                                               |
| `{{ project.link }}`                                          | The URL of the project in Pylon.                                        |
| `{{ project.status }}`                                        | The project status.                                                     |
| `{{ project.progress }}`                                      | Percent complete, such as `75%`.                                        |
| `{{ project.start_date }}`                                    | The project start date.                                                 |
| `{{ project.end_date }}`                                      | The project end date.                                                   |
| `{{ project.account.id }}`                                    | The project's account ID.                                               |
| `{{ project.account.name }}`                                  | The project's account name.                                             |
| `{{ project.account.domains }}`                               | The account's domains.                                                  |
| `{{ project.account.owner.name }}`                            | The account owner's name.                                               |
| `{{ project.account.crm_account_id }}`                        | The account's ID in your CRM.                                           |
| `{{ project.account.external_ids_json }}`                     | The account's external IDs as a JSON array.                             |

### Feature requests

| Variable                                                                 | Value                                                                              |
| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------- |
| `{{ feature_request.id }}`                                               | The feature request ID.                                                            |
| `{{ feature_request.title }}`                                            | The title.                                                                         |
| `{{ feature_request.description }}`                                      | The description.                                                                   |
| `{{ feature_request.link }}`                                             | The URL of the feature request in Pylon.                                           |
| `{{ feature_request.created_at }}`                                       | When it was created.                                                               |
| `{{ feature_request.status_slug }}`                                      | The current status slug.                                                           |
| `{{ feature_request.status_label }}`                                     | The current status name.                                                           |
| `{{ feature_request.previous_status_slug }}`                             | The previous status slug. **Feature request status changed** only.                 |
| `{{ feature_request.previous_status_label }}`                            | The previous status name. **Feature request status changed** only.                 |
| `{{ feature_request.product_ticket.title }}`, `.key`, `.link`, `.status` | The linked product ticket. **Feature request product ticket status changed** only. |

### Meetings

| Variable                           | Value                                                   |
| ---------------------------------- | ------------------------------------------------------- |
| `{{ meeting.id }}`                 | The meeting ID.                                         |
| `{{ meeting.title }}`              | The meeting title.                                      |
| `{{ meeting.source }}`             | Where the meeting came from, such as its call recorder. |
| `{{ meeting.start_time }}`         | When the meeting starts.                                |
| `{{ meeting.end_time }}`           | When the meeting ends.                                  |
| `{{ meeting.duration_ms }}`        | The meeting length in milliseconds.                     |
| `{{ meeting.has_call_recording }}` | `true` if the meeting has a call recording.             |
| `{{ meeting.call_recording_id }}`  | The call recording ID, or blank.                        |

### Team and calendar

| Variable                          | Value                                                                      |
| --------------------------------- | -------------------------------------------------------------------------- |
| `{{ user.name }}`                 | The teammate's full name.                                                  |
| `{{ user.first_name }}`           | The teammate's first name.                                                 |
| `{{ user.last_name }}`            | The teammate's last name.                                                  |
| `{{ user.link }}`                 | The URL of the teammate in Pylon.                                          |
| `{{ user.status }}`               | The new status. **User status changed** only.                              |
| `{{ user.previous_status }}`      | The status before the change. **User status changed** only.                |
| `{{ team.name }}`                 | The team. **Out of office gap detected** only.                             |
| `{{ calendar_event.title }}`      | The out of office event's title. **New out of office event created** only. |
| `{{ calendar_event.start_time }}` | When the out of office event or gap starts.                                |
| `{{ calendar_event.end_time }}`   | When the out of office event or gap ends.                                  |

### Other kickoffs

* **Article published**: `{{ article.id }}`, `{{ article.title }}` (as published), `{{ article.link }}`, `{{ article.knowledge_base.id }}`, `{{ article.knowledge_base.title }}`, `{{ article.published_version_id }}`
* **Email blocked**: `{{ blocked_email.email }}`, `{{ blocked_email.blocked_at }}`
* **Email suppressed**: `{{ email_suppression.email }}`, `{{ email_suppression.reason }}`, `{{ email_suppression.created_at }}`
* **Anomaly detected**: `{{ anomaly.title }}`, `{{ anomaly.description }}`, `{{ anomaly.link }}`

## Macros

Macro text supports a smaller set of variables. They fill in when you open the macro on an issue, so you can review the result before sending.

* `{{ issue.id }}`, `{{ issue.number }}`, `{{ issue.title }}`, `{{ issue.status }}`: As in [Issue](/pylon-docs/platform/triggers/template-variables.md#issue).
* `{{ issue.body }}`, `{{ issue.body_html }}`: the issue's original description.
* `{{ issue.link }}`, `{{ issue.customer_portal_url }}`, `{{ issue.customer_portal_link }}`: links to the issue.
* `{{ issue.requester.name }}`, `.first_name`, `.last_name`, `.email`: the requester.
* `{{ issue.assignee.name }}`, `.first_name`, `.last_name`: the assignee.
* `{{ issue.team.name }}`: the issue's team.
* `{{ issue.account.id }}`, `{{ issue.account.name }}`, `{{ issue.account.owner.name }}`: the issue's account.
* `{{ actor.name }}`, `{{ actor.first_name }}`, `{{ actor.last_name }}`: you, the teammate applying the macro.
* `{{ issue.custom_field.<slug> }}`, `{{ issue.account.custom_field.<slug> }}`: [Custom fields](/pylon-docs/platform/triggers/template-variables.md#custom-fields).
* `{{ issue.source }}` †, `{{ issue.requester.phone_number }}` †, `{{ issue.account.external_ids_json }}` †, `{{ issue.external_support_ticket_id }}` †, `{{ issue.external_support_ticket_type }}` †: As in [Issue](/pylon-docs/platform/triggers/template-variables.md#issue).

Other issue variables, such as `issue.last_message.*` and `issue.tags`, aren't filled in by macro text.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.usepylon.com/pylon-docs/platform/triggers/template-variables.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
