Freshdesk Placeholders & Dynamic Content Explained
A placeholder is a small piece of shorthand — something like {{ticket.id}} — that Freshdesk swaps out for the real value the moment a message goes out, so one template can greet thousands of customers by name and quote their exact ticket back to them. They are what makes an automated acknowledgement feel written rather than stamped, and they are the reason a single canned response can serve an entire team without anyone editing the details by hand. This guide walks through the {{ticket.*}} library, where each placeholder is allowed to live, how the Insert Placeholders picker actually works, which fields are plan-gated or context-dependent, and the honest points where dynamic content stops being enough.
What a placeholder actually is
Placeholders are dynamic variables that automatically insert ticket-specific or user-specific information into your outbound messages. Per Freshworks' Understanding dynamic content and placeholders documentation, they're written in double curly braces and resolved at send time — you type {{ticket.requester.firstname}} once, and every recipient sees their own first name.
The mental model worth holding onto: a placeholder is a read against the ticket (or the requester, or the company, or your help desk settings) at the instant the message fires. It doesn't compute anything, it doesn't branch, and it doesn't fetch data from outside Freshdesk. It looks up a value that already exists on the record and drops it into the text. That simplicity is exactly why placeholders are reliable — and, as we'll see later, exactly where they run out of road.
The three places placeholders live
The same {{ticket.*}} syntax works in three different surfaces, and knowing which is which saves a lot of confusion about why a placeholder "isn't showing up."
- Email Notifications — the automatic emails Freshdesk sends customers and agents on events like ticket creation, reply, or resolution. Configured under Admin → Workflows → Email Notifications, these templates are the most placeholder-heavy thing in the product because every notification has to speak to a different ticket.
- Canned Responses — reusable reply snippets agents insert by hand. Managed under Admin → Agent Productivity → Canned Responses (and inserted inline from the reply editor). A canned response with {{ticket.requester.firstname}} and {{ticket.id}} reads as a personal reply even though it's boilerplate. We cover the wider workflow in Freshdesk canned responses.
- Automations — the rules engine at Admin → Workflows → Automations. When a rule sends a reply or a notification as its action, that action body can carry placeholders too, so a "ticket created" rule can auto-acknowledge with the customer's name and the ticket number baked in. If automations are new to you, start with Freshdesk automations explained.
The Insert Placeholders picker
You don't have to memorise the syntax. Above any text box that supports dynamic content, Freshdesk shows an Insert Placeholders button. Click it and a panel opens listing the available variables grouped into categories — typically Helpdesk, Tickets, Ticket Fields, Requester, and Company. Each entry has a green plus icon; click it and the correctly-formatted placeholder drops into your template at the cursor. It's the difference between guessing whether the token is ticket.requestor or ticket.requester and just picking it from a list.
The grouping is a useful map of what's readable. Helpdesk covers your portal-level values like {{helpdesk_name}}. Tickets holds the core fields — id, subject, status, priority, url. Ticket Fields is where any custom fields you've built show up. Requester and Company reach into who filed the ticket and which account they belong to.
The core {{ticket.*}} library
Most day-to-day templates are built from a small, dependable set of ticket placeholders. Here's the working shortlist, drawn from the Freshdesk documentation:
| Placeholder | Inserts |
|---|---|
{{ticket.id}} | The unique ticket number |
{{ticket.subject}} | The ticket's subject line |
{{ticket.description}} | The original ticket body |
{{ticket.url}} | A link to the ticket for a logged-in user |
{{ticket.status}} | The current status |
{{ticket.priority}} | The priority level (Urgent/High/Medium/Low) |
{{ticket.requester.firstname}} | The customer's first name |
{{ticket.requester.name}} | The customer's full name |
{{ticket.agent.name}} | The assigned agent's name |
{{ticket.portal_name}} | The name of the support portal |
Custom fields join the library automatically. This is the part people underuse: every custom field you create under Ticket Fields or Customer Fields gets its own placeholder generated for it once you save the form. So if you add an "Order Number" ticket field, {{ticket.order_number}} (or the equivalent generated token) becomes insertable — no extra configuration. If your status placeholders read as numbers rather than words, that's expected behaviour tied to how statuses are stored, which we unpack in Freshdesk ticket statuses explained.
Plan-gated and context-dependent placeholders
Not every placeholder is available everywhere, and two rules explain most of the surprises.
Some placeholders depend on a feature or plan. Time-tracking fields such as {{ticket.billable_hours}} and {{ticket.total_time_spent}} only resolve if time tracking is enabled and available on your plan — reference them without the underlying feature and they won't populate. If you're modelling a template around a niche field, confirm your plan actually surfaces it before you rely on it.
Some placeholders are context-dependent and are deliberately hidden from the picker. Per Freshworks' note on why some placeholders are unavailable in the popup, variables like {{comment.body}} and {{comment.commenter.name}} only make sense when a specific comment is already known — for example, inside the email notification that fires because an agent or requester just added a comment. Because they'd have nothing to reference in a general canned response, they're intentionally excluded from the standard Insert Placeholders panel. For a context-independent alternative, {{ticket.latest_public_comment}} pulls the most recent public reply and works more broadly.
The practical takeaway: match the placeholder to the surface. A comment placeholder in a canned response is a blank; the same placeholder in the "new comment" notification is exactly right.
The honest limits — and where an AI layer picks up
Placeholders are excellent at what they are: a fast, deterministic, zero-cost way to personalize outbound text. They never hallucinate, they render instantly, and once a template is right it stays right. Credit where it's due — for acknowledgements, signatures, and consistent formatting, dynamic content is the correct tool and you don't need anything cleverer.
But be clear about the ceiling. A placeholder can only insert a value that already exists on the ticket. It can drop in {{ticket.subject}}, but it can't read that subject, understand that the customer is asking about a delayed refund, and write the paragraph that resolves it. It can print {{ticket.id}}, but it can't fetch the order status behind that ticket from your commerce backend — placeholders don't reach outside Freshdesk. And a canned response full of placeholders is still a template a human chose and sent; the reasoning, the judgement about which template even applies, stays entirely with the agent.
This is the seam where an AI agent layer fits, and it's worth understanding the broader category of AI agents for customer service before reaching for one. Macha is one such layer: it runs on top of the Freshdesk you already use as a native connector — it does not replace Freshdesk, its notifications, or its canned responses. You connect Macha to Freshdesk with your subdomain and API key, and it reads and writes the same tickets your templates already personalize: drafting a grounded, ticket-specific reply rather than a fill-in-the-blank one, and — where a placeholder would only print an order number — using a custom tool to actually call your REST API and fetch the live order status to answer with. If you want to see how that stacks alongside native dynamic content, how to automate Freshdesk with AI walks through it. (Macha's connector is for Freshdesk specifically — not Freshchat, Freshservice, or Freshcaller. And credits are consumed per AI action, not per resolution — see the pricing breakdown.)
The clean division of labour: keep placeholders doing the deterministic personalization they're perfect for — names, IDs, links, formatting — and layer an agent on top for the reasoning-heavy part a {{ticket.*}} token can never do, which is understanding the ticket and composing the answer.
FAQ
Where do I find the list of placeholders in Freshdesk? Click the Insert Placeholders button above any text box that supports dynamic content — in an Email Notification template, a Canned Response, or an Automation reply action. The picker groups placeholders under Helpdesk, Tickets, Ticket Fields, Requester, and Company, and a green plus icon inserts the correctly-formatted token.
What are the most common ticket placeholders? The everyday set includes {{ticket.id}}, {{ticket.subject}}, {{ticket.description}}, {{ticket.url}}, {{ticket.status}}, {{ticket.priority}}, {{ticket.requester.firstname}}, and {{ticket.agent.name}}. Custom fields you create under Ticket Fields or Customer Fields also generate their own placeholders automatically.
Why is a placeholder I expected missing from the popup? Usually because it's context-dependent. Placeholders like {{comment.body}} and {{comment.commenter.name}} only make sense when a specific comment is known, so they're deliberately excluded from the general picker and only work in comment-triggered notifications. Others, like time-tracking fields, depend on a feature or plan being enabled.
Can I use placeholders in automations and canned responses, not just emails? Yes. The same {{ticket.*}} syntax works across Email Notifications, Canned Responses, and Automation reply/notification actions. The only caveat is context: a placeholder still needs the underlying value to exist on the ticket in that surface.
Can I add AI to Freshdesk without replacing my templates? Yes. An AI agent layer like Macha connects to Freshdesk as a native connector and runs on top of your existing notifications and canned responses — it doesn't replace them. It handles the reasoning placeholders can't, like understanding a ticket and drafting a grounded reply, or fetching live data through a custom tool, while your dynamic content keeps doing the deterministic personalization it's good at.
Ready to go beyond fill-in-the-blank templates? Start a free trial of Macha and connect it to your Freshdesk in minutes.
Add AI agents to your Freshdesk
Macha resolves tickets end to end on Freshdesk — no migration, no code.
Shopify
Stripe
Slack
Notion
Google Workspace
Confluence

