Word template token reference
The complete list of data paths (bindings) you can use in a Word template. This mirrors the in-product token reference panel and the binding catalog the validator enforces — if a path is not listed here, the editor flags it. For grammar and formatters see Word Template Mode.
How to read this page
- A scalar binding is used in a value token:
${issue.summary}. - A collection binding is used in a loop:
${#each issue.subtasks as sub}…${/each}. Inside the loop, reach an item field through the loop variable:${sub.key}. - Tiers — A is generally available; B ships only because the issue bundle already carries the data; C is visible but not bindable, listed so the product is honest about scope.
- Which roots are available depends on the export context.
Export contexts and their roots
A Word template runs in one of seven contexts, each exposing a different set of top-level roots.
| Context | Available roots |
|---|---|
single-issue | issue, generatedAt |
automation (Jira Automation action) | issue, generatedAt |
multi-issue (JQL / board) | issues, issueGroups, generatedAt |
scheduled | issues, issueGroups, generatedAt |
sprint | issues, issueGroups, sprint, generatedAt |
release | issues, issueGroups, release, generatedAt |
backlog | issues, issueGroups, backlog, generatedAt |
generatedAt (a datetime) is available in every context.
Tier A — the issue surface (issue.*)
Available in single-issue and automation. The same fields are the per-item shape of the issues collection — inside ${#each issues as it} use ${it.key}, ${it.summary} and so on.
Scalars
| Path | Type |
|---|---|
issue.key | string |
issue.summary | string |
issue.description | rich text (ADF) |
issue.status | status |
issue.status.category | string |
issue.priority | priority |
issue.assignee | user |
issue.assignee.displayName | string |
issue.reporter | user |
issue.reporter.displayName | string |
issue.created | datetime |
issue.updated | datetime |
issue.dueDate | date |
issue.parent.key | string |
issue.parent.summary | string |
issue.parent.status | string |
A user-typed value renders the display name by default; use the user formatter to pick a part, e.g. ${issue.assignee | user("displayName")}. A rich-text value renders formatted; use | plain() to strip formatting.
Collections
| Collection | Item fields (relative to the loop variable) |
|---|---|
issue.labels | primitive list — the loop variable is the label string |
issue.components | name |
issue.fixVersions | name, released (boolean) |
issue.affectsVersions | name |
issue.subtasks | key, summary, status, priority, assignee, dueDate |
issue.comments | author (user), author.displayName, body (ADF), created, updated |
issue.attachments | filename, mimeType, size, isImage, created, author.displayName — metadata only, no binary and no URL |
issue.issueLinks | typeName, direction, linkedIssue.key, linkedIssue.summary, linkedIssue.status |
issue.worklogs | author.displayName, timeSpent, timeSpentSeconds, created, started |
Example:
${#each issue.worklogs as wl}
${wl.author.displayName}: ${wl.timeSpentSeconds | duration("hm")} on ${wl.started | date("yyyy-MM-dd")}
${/each}
Tier A — multi-issue roots
Available in multi-issue, scheduled, sprint, release and backlog.
| Path | Kind | Item fields |
|---|---|---|
issues | collection | the full issue surface, relative to the loop variable |
issueGroups.fixVersions | collection | key, title, issues |
issueGroups.sprints | collection | key, title, issues |
issueGroups.assignees | collection | key, title, issues |
issueGroups.worklogAssignees | collection | key, title, issues |
Example — group, then issues within each group:
${#each issueGroups.assignees as group}
## ${group.title}
${#each group.issues as it}
- ${it.key}: ${it.summary}
${/each}
${/each}
Tier A — context bundle roots
Available only in their own context.
sprint
| Path | Type |
|---|---|
sprint.sprint.name | string |
sprint.sprint.goal | string |
sprint.sprint.state | option |
sprint.stats.issueCount | number |
sprint.stats.percentDone | number |
release
| Path | Type |
|---|---|
release.release.name | string |
release.release.releaseDate | date |
release.release.released | boolean |
release.stats.issueCount | number |
release.stats.percentDone | number |
backlog
| Path | Type / item fields |
|---|---|
backlog.board.boardName | string |
backlog.board.boardType | option |
backlog.stats.totalIssueCount | number |
backlog.groups | collection — kind, name, issueCount, issues |
Tier A — metadata
| Path | Type | Contexts |
|---|---|---|
generatedAt | datetime | all |
Tier B — changelog
| Path | Kind | Item fields |
|---|---|---|
issue.changeHistory | collection | author.displayName, created, items |
Tier C — visible but not bindable
These exist conceptually but are not resolvable; they are listed so the editor and validation can be honest about scope.
| Capability | Note |
|---|---|
issue.jsm | Jira Service Management request, SLA and approval surface — deferred. |
| JQL-in-template | Detected by the migration scanner and diagnosed, never executed. |
| Tempo | A Tempo mirror may exist on a worklog, but is not bound. |
| Xray / Zephyr | Test-management fields require a third-party app. |
| Assets / Insight | Object fields are deferred. |
Custom fields
Custom fields are bindable under a single namespace:
${ issue.customFields.<fieldId>.<…> }
- Unknown custom-field ids are soft: the editor shows a warning and the value may render empty, but it is never a hard block — so a template can reference a field this site happens not to have without failing.
- The bare path
issue.customFields(the whole map) is never bindable. - Only safe identifier characters are allowed;
__proto__,prototypeandconstructorsegments are rejected.
Caveats when migrating from Xporter
The migration scanner suggests Exportelier paths for common Xporter field names. Two things to know so a suggested rewrite actually resolves:
- Auto-conversion fixes the syntax, not the existence of a path. The rewrite has the right shape, but the target must still be a real binding on this page, or it produces an
unknown-bindingwarning:- Not in the catalog:
Creator→issue.creator,Resolution→issue.resolution,Project→issue.project,IssueType/Type→issue.issuetype. - Case mismatch:
DueDateis suggested asissue.duedate, but the binding isissue.dueDate. - Kind mismatch:
Labelsis suggested as a scalar, butissue.labelsis a collection — use a loop.
- Not in the catalog:
- Issue links. The alias
Linksis suggested aslinks, but the real binding isissue.issueLinks.
See Xporter syntax: what works for the full migration map.
Paths that are never allowed
For safety, some paths are rejected with an unsafe-template error regardless of context — internal, credential or URL-bearing fields. These include roots such as auth, context, forge, internal, secrets, storage and token, and any path ending in accountId, apiToken, avatarUrl, baseUrl, contentUrl, thumbnailUrl, cookie, session, headers, private or storageRef. Stick to the bindings on this page and you will not hit these.