Incident field templates
Build the text Xyte writes into ServiceNow, Freshdesk and Jira tickets from your own wording plus placeholders for incident, device and space values — with date formatting, fallbacks and length limits, set separately for when the ticket is created, updated and closed.
A template is text with {key} placeholders. When Xyte creates, updates or closes a ticket, each placeholder is replaced with that incident's value:
{priority}: {device} offline in {space_name}renders as High: Front Lobby Camera offline in Room 301.
Where templates are used
| Integration | Where | Tabs | Title and description | Extra field rows |
|---|---|---|---|---|
| ServiceNow | Field Mapping step | Create, Update, Close | Short description (Create, Update), Description (Create) | Yes — Template on text columns |
| Freshdesk | Ticket Fields step | Create, Update, Close | Subject (Create, Update), Description (Create) | Yes — Template on single-line and multi-line text custom fields |
| Jira | Field mapping step | Create, Update | Summary (Create, Update), Description (Create) | No |
| Autotask | Templates step | — | Title template and Description template, saved with Save templates | No |
Leave a title or description template blank to keep Xyte's default: the incident title, or the full structured details for the description. Jira differs in two ways — see Jira wiki markup below and this note:
Jira summary and blank resultsIn Jira the summary is sent as one line and cut to 255 characters. If a Jira summary or description template renders completely empty, Xyte sends the default instead (the incident title, or the full structured details).
Create, Update and Close tabs
In ServiceNow, Freshdesk and Jira, the step has one tab per ticket event:
| Tab | Sent | Pinned fields |
|---|---|---|
| Create | When Xyte opens the ticket | Title (short description, subject or summary) and description |
| Update | On every incident change while the ticket is open | Title only |
| Close | When the incident closes — ServiceNow and Freshdesk only | None |
- Pinned fields sit at the top of a tab. Each shows its current template — or No template — the incident title is used / No template — the full structured details are used — and an Edit button. The description is pinned on Create only: Xyte sets it when the ticket is opened and never rewrites it, so a two-way sync can't echo it back and forth.
- Field rows (ServiceNow and Freshdesk) sit below. Click Add field to add one. A row is sent only on its own tab's event — to keep a field current on every change, add it on both Create and Update.
- The close details —
{closed_reason},{closed_by},{closed_method}and{duration}— only have a value once the incident closes, so only the Close tab offers them, as a Xyte field or inside a template. - One save button saves every tab: Save fields in ServiceNow and Jira, Save ticket settings in Freshdesk. Switching tabs saves nothing.
Set up before the tabs existed?Your existing templates and field rows were carried over: the title template onto Create and Update, the description template onto Create, and each field row onto every tab where it applies.
Field mapping rows
Each field row on a tab sends one of three things to the target field:
| Row type | Sends | Example |
|---|---|---|
| Static value | A fixed value | Hardware |
| Xyte field | One incident, device or space value, as-is | Device serial |
| Template | Your text with {key} placeholders filled in | {vendor} {model} ({serial}) |
Template is offered only where the target field takes free text:
- ServiceNow — text columns. Not offered on date, date/time, time, duration, number (integer, decimal, float, currency, price, percent), true/false, reference, choice, list, document ID, domain ID, class name or table name columns — map those with a static value or a Xyte field.
- Freshdesk — only single-line text and multi-line text custom fields (
cf_…). Dropdowns, checkboxes, numbers, dates andticket_typetake a static value or a Xyte field; group, agent, product and source take a static value only.
If Xyte couldn't read the field list from your instance or account, the field type can't be checked, so Template stays available — make sure the target really is a text field.
Editing a template
A pinned field and a Template row (which shows No template yet until you write one) both have an Edit button. It opens the template window:
- A text box for the template.
- Validate — checks the template now and shows Template is valid or what's wrong.
- Supported fields — click a key to insert it at the cursor; Search fields narrows the list. On the Create and Update tabs the close details aren't listed.
- Template options — a short reminder of the filters and date codes below, plus a link back to this page (Full template reference).
- Apply puts the text into the field or row; Cancel discards it.
Apply only updates the tab — click the step's save button (Save fields in ServiceNow and Jira, Save ticket settings in Freshdesk) to save. That's when every tab is validated.
Keys
| Key | Value | Example |
|---|---|---|
{title} | Incident title | Camera offline |
{description} | Incident description | Device stopped responding |
{incident_id} | Short incident ID | INC-A7K2Q9 |
{status} | Incident status — active, fixed or closed | active |
{priority} | Priority — Critical, High, Moderate, Low or Planning | High |
{assignee} | Assigned user (empty when unassigned) | Jane Doe |
{created_at} | When the incident was created | 2026-09-10T08:14:02Z |
{closed_at} | When the incident was closed (empty while open) | 2026-09-10T10:02:41Z |
{fixed_at} | When the incident was marked fixed | 2026-09-10T09:55:12Z |
{updated_at} | When the incident was last updated | 2026-09-10T09:20:00Z |
{xyte_link} | Link to the incident in Xyte | https://app.xyte.io/incident/… |
{organization} | Organization name | Acme Corp |
{customer} | Customer (top-level space) name | Acme Retail |
{device} | Device name | Front Lobby Camera |
{device_link} | Link to the device in Xyte | https://app.xyte.io/devices?deviceId=… |
{device_status} | Device status — offline, online, unavailable or error | offline |
{vendor} | Device vendor | Axis |
{model} | Device model | P3245 |
{submodel} | Device sub-model | P3245-LVE |
{serial} | Device serial number | ACCC8E1F2A3B |
{mac} | Device MAC address | AC:CC:8E:1F:2A:3B |
{ip} | Device IP address | 10.20.30.41 |
{firmware} | Device firmware version | 11.9.62 |
{last_seen} | When the device was last seen | 2026-09-10T08:12:55Z |
{connection} | How the device connects to Xyte (method / name) | edge / HQ Edge |
{parent} | Parent device name | Floor 3 Switch |
{device_url} | The device's own web interface, when known | https://10.20.30.41 |
{space_name} | Space name (the room itself) | Room 301 |
{space_path} | Full space path of the device | HQ / Floor 3 / Room 301 |
{space_link} | Link to the space in Xyte | https://app.xyte.io/overview/… |
{affected_devices} | Room incidents: names of the devices involved, comma-separated | Display 1, Codec, Touch Panel |
{opened_by} | What opened the incident | device |
{closed_reason} | Why the incident was closed — Close tab only | Device is back online |
{closed_by} | User who closed the incident (empty when no user did) — Close tab only | Jane Doe |
{closed_method} | How the incident was closed — Close tab only | manually |
{duration} | How long the incident lasted, until it was fixed or closed — Close tab only | about 2 hours |
- A key with no value for the incident renders as nothing; the rest of the text is kept. In Jira, a summary or description that renders completely empty falls back to the default.
- Dates (
created_at,closed_at,fixed_at,updated_at,last_seen) render as ISO-8601 in UTC unless you add adatefilter. - Keys are letters, digits and underscores only:
{space_name}is a key,{space name}is plain text.
An integration connected before a key was added may show a shorter key list. Every key in the table above still works if you type it by hand.
Room (space) incidents
A room incident covers several devices but is attached to the first one that dropped. For these incidents:
{device}is the room name and{model}isMultiple devices.{title}isRoom offline: <room name>and{description}isMultiple devices offline in <room name>. Affected so far: <devices>.{affected_devices}lists the devices involved.{last_seen}is empty. The other device keys ({serial},{ip},{vendor}, …) still come from the first device that dropped.
Filters
Add a filter after the key with |: {key|filter:argument}. Chain several and they apply left to right. The examples assume a space with no time zone set (UTC) unless they say otherwise.
| Filter | Does | Example | Renders |
|---|---|---|---|
date:<format> | Formats a date in the device space's time zone | {created_at|date:%d/%m/%Y %H:%M} | 10/09/2026 08:14 |
default:<text> | Uses <text> when the value is empty | {assignee|default:Unassigned} | Unassigned |
truncate:<n> | Cuts to at most n characters, ending with ... | {title|truncate:20} on Projector lamp failure in Board Room | Projector lamp fa... |
date
- Works only on
created_at,closed_at,fixed_at,updated_atandlast_seen. - Needs a format —
{created_at|date}is rejected. - Times are in the time zone of the device's space (or its customer's, if the space has none), and in UTC when neither has one. Add
%Zto show which. Without adatefilter, dates stay ISO-8601 in UTC. datemust be the first filter on a key:{closed_at|date:%Y-%m-%d|default:still open}works,{closed_at|default:still open|date:%Y-%m-%d}is rejected.- Use the codes below and any literal text. Widths and flags (
%-d,%_m,%4Y,%^a) aren't supported. - On an empty date (e.g.
closed_atwhile the incident is open) the filter does nothing — pair it withdefault.
| Code | Meaning | Code | Meaning |
|---|---|---|---|
%a | Weekday, short (Mon) | %A | Weekday (Monday) |
%b | Month, short (Jan) | %B | Month (January) |
%d | Day, 01–31 | %e | Day, 1–31, space-padded |
%H | Hour, 00–23 | %I | Hour, 01–12 |
%j | Day of year, 001–366 | %m | Month, 01–12 |
%M | Minute, 00–59 | %p | AM / PM |
%S | Second, 00–60 | %y | Year, 2 digits |
%Y | Year, 4 digits | %Z | Time zone name (UTC) |
%z | UTC offset (+0000) | %% | A literal % |
default
- Needs a text —
{assignee|default}is rejected. - Applies when the value is empty or only spaces.
truncate
- Needs a whole number of at least 4 —
truncate:3andtruncate:tenare rejected. - The result, including the
..., is at mostncharacters. Shorter values are left alone.
Examples
| Template | Renders |
|---|---|
{created_at|date:%b %e, %Y} | Sep 10, 2026 |
{created_at|date:%A %I:%M %p %Z} | Thursday 10:14 AM CEST, for a space in Berlin |
{closed_at|date:%Y-%m-%d|default:still open} | 2026-09-10, or still open while the incident is open |
{assignee|default:Unassigned|truncate:12} | Unassigned, or the assignee's name cut to 12 characters |
[{priority}] {title|truncate:80} — {space_path} | [High] Camera offline — HQ / Floor 3 / Room 301 |
Validation
Templates are checked when you save the step — every pinned field and Template row, on every tab. The save is rejected, with the offending placeholder named, when a template has:
- An unknown key — e.g.
{devise}. - An unknown filter — only
date,defaultandtruncateexist. - A malformed filter chain, or a filter argument containing
|,{or}. - A filter that doesn't fit —
dateon a non-date key,dateafter another filter, a missing argument, an unsupported date code, ortruncatebelow 4. - A close detail on the wrong tab —
{closed_reason},{closed_by},{closed_method}or{duration}on Create or Update, in a template or as a Xyte field. - On a field row: a Template on a field that isn't a text field (see Field mapping rows).
- Freshdesk: ticket_type, group, agent, product, source or tags on the Update tab. Those are set on Create only, so an update never undoes a reassignment made in Freshdesk.
Jira wiki markupJira descriptions often use wiki macros such as
{code},{quote}or{noformat}. In Jira templates, a bare{word}that isn't a key is left as written instead of rejected. A placeholder with filters ({word|…}) must still use a real key.
Autotask's Templates step doesn't check templates when you save. There, and in a template saved before validation existed, a mistake can still slip through. At send time, any placeholder Xyte can't resolve is written out as typed, so the mistake shows in the ticket rather than being dropped.
Updated 2 days ago
