Documentation

Customer documentation

Threadmaker is the conversations integration, not the notifications add-on: every Jira issue gets one Slack thread, and the discussion lands back on the ticket automatically. This page is everything Slack workspace admins and Jira project admins need to install, configure, and run it. Power users in mapped channels can skim the scenarios + shortcut + mentions sections. If you can't find an answer here, email support@threadmaker.dev.

Install in 5 steps

Prefer to see it? Follow the visual setup guide — the same five steps with a screenshot at each one, plus a short look at the per-project settings.
  1. Add Threadmaker to Slack. Click the Add to Slack button on threadmaker.dev or your Slack App Directory entry and authorize the workspace. After OAuth completes you'll see your connection token — a UUID that pairs the Slack app with its Jira counterpart. Copy it (we DM you a link back to the app — never the token itself; a workspace admin can re-reveal or rotate the token any time from the App Home tab).
  2. Install the Forge plugin from the Atlassian Marketplace. In Jira admin, open Apps → Threadmaker → Global Settings, paste the connection token from step 1, and save. (The App URL is preconfigured — the token is all you enter.)
  3. Enable Threadmaker for the project. Open Project settings → Apps → Threadmaker in Jira and turn on "Threadmaker for this project". Sync is off by default, so a Jira admin opts each project in before any of its comments leave Jira. Per-project options and templates live here too. (Both this and the channel mapping in the next step are needed for sync to flow.)
  4. Pair a Slack channel with that project. In Slack, run /jira-map in the channel you want to use. The modal shows your Jira projects; pick one and confirm.
  5. Try it. Comment on a Jira issue in the paired project. Threadmaker creates a thread in the Slack channel and posts the comment as a reply. Reply in the thread — the message lands as a Jira comment within seconds.

That's it. Everything from here is configuration, edge cases, and optional features.

Three ways teams use Threadmaker

Engineering triage

Your team files bugs in a Jira BUG project and discusses them in #eng-bugs. Pair the channel to BUG once (/jira-map); every new bug spawns a thread. Triage happens in Slack; the ticket gathers the conversation automatically. First-response time drops from "whenever someone checks Jira" to "when someone reads Slack."

Customer support escalation

Your support team escalates to engineering in #escalations. Pair it to a Jira CS project. The agent creates the ticket, a thread spawns in Slack, engineering replies in-thread, and the ticket grows a complete diagnostic log without anyone retyping context — so engineering picks up the escalation with the full history already attached.

On-call incident response

An incident opens a Jira INC ticket. Your team jumps into #incidents. Everyone sees the anchor message — current status, assignee, timeline — and as the ticket moves Investigating → Mitigating → Resolved, the thread title reflects it. After the incident, the thread is the postmortem — no separate timeline to reconstruct.

Full playbooks: engineering triage · support escalation · incident response.

How the sync works

Three ideas drive every feature:

Slash commands (admin)

Who can run these Three of the four — /jira-map, /jira-alerts, and /jira-audit — are gated to Slack workspace admins or owners; only an admin can change channel pairings, set the alerts channel, or read the audit log. Non-admin members get a friendly "this command is admin-only" reply. /jira-create is gated differently: a Jira project admin opts it in per project (default OFF — see project settings), and then any member of the channel can run it.

Pair a channel with a project — /jira-map

Tell Threadmaker which Jira project a channel belongs to. Run inside the channel you want to pair.

Gotchas

Create issues from Slack — /jira-create

Open a Jira create-issue modal without leaving the channel. OFF by default per project; a Jira project admin opts in via Project settings → Apps → Threadmaker → Allow creating Jira issues from Slack. When on, anyone in the channel can run the command.

Running /jira-create opens a create modal scoped to the project; /jira-create <text> opens it with the summary pre-filled. On a Software or Business project it shows an Issue type dropdown with the project's own types (e.g. Task / Story / Bug / Epic) and files a standard issue. On a Jira Service Management project it shows a Request type dropdown listing the desk's portal request types and attempts to file a customer request via the JSM API (with the app as reporter). JSM request creation is best-effort — it depends on your site's Service Management agent configuration; standard Software/Business issue creation is unaffected. Required custom fields surface as additional inputs. Submit to create the issue or request and post a confirmation message linking to it.

Gotchas

Inspect what's been syncing — /jira-audit

Show recent sync events for the project paired to the current channel: timestamp, direction (Slack→Jira or Jira→Slack), action (create / edit / delete, plus issue-level events: created / updated / moved / deleted, plus housekeeping rows — 🧹 dormancy cleanup), issue key, actor, and status (success/failed). Workspace admins only. Events are retained for 90 days.

Admin-gated and channel-scoped by design The admin gate is the first line of defence: only workspace admins can read the audit log at all. Channel scoping is the second: the log shows only events for the project paired to this channel, so teams using different channels for different projects can't read each other's history. Running the command in an unpaired channel replies "⚠️ This channel isn't mapped to a Jira project." Workspace-wide audit access is available to operators via the internal admin portal — email support@threadmaker.dev if your security team needs it.

Choose where alerts go — /jira-alerts

Pick the Slack channel that receives failure alerts when a sync attempt fails permanently (after 5 delivery attempts). The same channel also gets license-transition notices (grace-period start, sync paused) — not just delivery failures. Without an alerts channel these are silent — the audit log captures failures but no human gets pinged. Every /jira-alerts form is workspace-admin only.

Most admins prefer a dedicated #threadmaker-alerts channel so the bot can post freely. Invite the bot first.

Forward any message to Jira

Use case: a message in a mapped channel — a side comment, a customer note, a decision — belongs on a live ticket in that channel's project. Right-click it (or hover → three-dots menu), pick Send to Jira, and name the issue. Threadmaker posts that message as a comment on the Jira issue, and — when the issue already has a Slack thread — drops a mirror copy into that thread ("↪ Forwarded from #channel by Alice"), so the team following the ticket sees the forwarded context without opening Jira. (If the message you forward already lives in that thread, the mirror is skipped — it's already there.)

Live status in the thread title

The first time a Jira ticket has activity in a paired channel, Threadmaker posts an anchor message — the thread root for all subsequent activity on that ticket. Default format:

WEB-1234 — Add export to PDF
Type: Story · Status: In Progress · Priority: High · Assignee: Alice

When issue type, status, priority, summary, or assignee change in Jira, your anchor updates in place to reflect the new value — the thread title in Slack always shows the current state. Updates edit the existing message silently; they don't create new notifications.

Per-project toggle: live updates can be disabled in Project settings → Apps → Threadmaker → Sync anchor on Jira field changes (default ON). When OFF, the anchor posts once at thread creation and never updates. Useful if your team prefers immutable thread roots.

The anchor format is a configurable template (live preview in the settings page). The most-used variables:

…plus admin-defined custom-field aliases ({{issue.<alias>}}, configured in Project settings, up to 20 per project) — the list grows as we add fields.

{{tm.anchor}} is optional and renders nothing — the anchor is tracked invisibly via Slack message metadata, so it is no longer required in the template. The default template also uses {{issue.key}} and {{issue.url}} to build the clickable link, but those are your choice.

Deep dive: live Jira status in the Slack thread →

Edits and deletes flow both ways

If a Slack reply or a Jira comment is edited, the corresponding message on the other side updates within seconds. Same for deletes — deleting a Slack reply removes the matching Jira comment, and vice versa.

Per-project toggle: Project settings → Apps → Threadmaker → Sync comment edits and deletes (default ON). Turn off if your team needs synced comments to be immutable for compliance or audit reasons; edits and deletes then stop syncing in both directions — a Slack-side edit is not written to Jira, and a Jira-side edit or delete is not written to Slack. New comments still sync both ways.

Gotchas

Deep dive: edits and deletes between Jira and Slack →

Reactions become Jira signals

OFF by default. A Jira project admin opts in via Project settings → Apps → Threadmaker → Sync Slack reactions to Jira.

When on, reacting on a synced message in Slack posts a lightweight Jira issue comment that deep-links back to the reacted comment, e.g.

Alice reacted to (comment) with :eyes:

where (comment) is a link to the specific Jira comment. Removing the reaction removes that comment. Reactions on the anchor message itself link to the Jira issue instead (there's no per-comment target). Jira has no comment-on-comment, so every one of these is an ordinary issue comment — the only difference is where the link points.

Why opt-in On busy channels, reactions are sometimes accidents (a misclick on :100: instead of :+1:). Most teams don't want a Jira mini-comment for every accidental reaction. The default OFF respects that.

Customisable mini-comment template lives in the same project-settings page. Customise the body via {{reaction.actor}}, {{reaction.emoji}}, {{reaction.link}}, and {{reaction.targetUrl}} variables.

Limitation: sync is one-way (Slack → Jira). Native Jira comment reactions aren't yet exposed via Atlassian's public API (JRACLOUD-78153); we'll add the reverse direction once Atlassian ships it.

@-mentions cross the boundary

Slack @alice in a synced message becomes a real clickable Jira mention if Alice's Slack email matches her Jira account email — and vice versa. The mention pings the right person on the destination side.

Three-tier graceful fallback (no admin action required):

  1. Match. Emails align on both sides → real ping with a clickable link.
  2. Display-name fallback. Email aligns on one side but not the other → the message renders as @DisplayName plain text (no ping, but readable).
  3. Literal fallback. The raw ID (@U12345 in Jira or @accountid in Slack) shows only when the user lookup fails entirely — a deleted account or an API error — or, on the Slack→Jira side, for mentions past the 10-per-comment cap (those render as the raw @U12345 in Jira). A merely missing email still falls back to the readable @DisplayName tier above, not to the raw ID.

Lookups are cached for 24 hours per workspace. Up to 10 distinct mentions resolve per comment (Cloudflare subrequest cap).

Privacy Emails live only in our Cloudflare D1 database (encrypted at rest), isolated per workspace, refreshed about every 24 hours, deleted 30 days after last refresh, and deleted immediately when the workspace uninstalls. We never share them with third parties or use them for profiling. See Privacy Policy §8 (Data Retention) for the full PII boundary.

Deep dive: @-mention mapping between Jira and Slack →

Files, screenshots, inline images

File attachments sync in both directions:

Cap: 5 files × 2 MB each per comment Files over the cap are dropped (Slack→Jira) with an ephemeral warning to the uploader explaining what happened. Best-effort: a failed file upload doesn't abort the comment delivery — the text still syncs.

Inline images. When you attach an image (PNG, JPEG, JPG, GIF, WebP) to a Jira comment, it renders inline in the Jira comment body — not just in the Attachments tab. SVG and other formats aren't inlined for security reasons but still appear as attachments.

Why the cap? Threadmaker forwards file bytes through the Cloudflare Workers + Atlassian Forge proxies, both of which have fixed body-size budgets. The 5×2 MB shape covers the vast majority of triage attachments (screenshots, log snippets, PDFs, small CSVs). For large files (videos, log dumps, full database dumps), upload to your team's storage system and paste a link in the comment.

Deep dive: files, screenshots and inline images →

Per-project configuration

Every behaviour is per-project. Open Project settings → Apps → Threadmaker in Jira to configure:

Per-project settings, defaults, and when to change them.
SettingDefaultWhat it does
Enable Threadmaker for this project OFF Master switch — OFF by default (per-project data-egress opt-in). A Jira admin must turn this ON in Jira → Project Settings → Apps → Threadmaker before any comments sync; mapping a channel with /jira-map alone does not enable it — both steps are required. When OFF, no syncing happens regardless of other settings.
Sync comment edits and deletes ON Bidirectional propagation of edits and deletes. Turn OFF if your team needs Jira comments to be immutable.
Sync anchor on Jira field changes ON Live updates to the anchor message when type / status / priority / assignee / summary change in Jira. See live status.
Sync Slack reactions to Jira OFF Posts a lightweight issue comment that deep-links to the reacted comment when someone reacts in Slack. See reactions.
Allow creating Jira issues from Slack OFF Enables /jira-create for this project. See /jira-create.
Sync messages from other Slack apps OFF Mirrors a reply that another Slack app posts inside a mapped ticket thread into Jira as a comment. Only apps that reply in a thread — a top-level channel post (most alert/incident integrations) has no thread to attach to, so it is not synced. Off by default; rate-limited and guarded against bot-to-bot echo loops.
Notify in thread when an issue moves projects OFF Posts a 🔀 notice in the thread when a Jira issue is moved to a different project. The thread follows the issue automatically; this only adds a heads-up message.
JSM: public comments only ON JSM projects only. When ON, internal Jira agent notes stay in Jira and never sync to Slack — only customer-visible comments cross over. Default ON keeps internal notes private.
JSM: post Slack comments as internal OFF JSM projects only. When ON, Slack replies post as agent-internal (not customer-visible) and internal Jira comments begin syncing to Slack — an agent-only channel. Mutually exclusive with "public comments only" above. Default OFF = customer-visible.
Anchor template 2 visible lines Customise the anchor format. Live preview in the settings page. {{tm.anchor}} is optional — the anchor's orphan-recovery marker is tracked invisibly via Slack message metadata.
Slack-comment template (Jira side) [{{slack.author}} via Slack] {{slack.text}} How a Slack reply renders as a Jira comment. Vars: slack.author, slack.text, slack.channel.{id,name}, slack.message.{url,ts}. The sync marker is tracked invisibly via a Jira comment property, so no template token is needed.
Jira-comment template (Slack side) *{{comment.author}}* (Jira): {{comment.body}} How a Jira comment renders as a Slack thread reply. Vars: comment.author, comment.body, comment.url, comment.{created,updated}, comment.kind (JSM only — 🔒 Internal note / 💬 Public reply / 👤 Customer for the mirrored comment; empty on non-JSM projects), issue.key. (This Jira→Slack template does not carry a marker — the reply is matched by its Slack thread position.)
Reaction-comment template (Jira side) Sensible default Active only when reaction sync is ON. Vars: reaction.{emoji,actor,link,targetUrl}, plus the shared slack.* / issue.* scopes. The sync marker is tracked invisibly via a Jira comment property, so no template token is needed.

How {{comment.kind}} is decided (JSM): Threadmaker classifies the mirrored comment by the author's Jira account type, not by where it was written. A portal customer (an account with no Jira licence) shows as 👤 Customer; an agent — any licensed Jira user — shows as 💬 Public reply even when they reply through the portal; an agent's internal note shows as 🔒 Internal note (and only reaches Slack when the project is not set to “Public comments only”).

Saving any setting pushes the change to the Threadmaker backend within seconds. Workspace admins on the Slack side don't need to do anything — the new behaviour applies to the next event.

App Home tab in Slack

Open Threadmaker from the Slack sidebar (or Apps → Threadmaker) to see the App Home tab:

Glossary

Anchor message
The thread root posted by Threadmaker when the first Jira activity hits a mapped channel. Displays the issue key, summary, type, status, priority, and assignee. All synced comments become replies to this message. Updated in place when Jira fields change.
Mapped channel (or "paired channel")
A Slack channel linked to a Jira project via /jira-map. Issues from that project create anchor messages in that channel. One channel = one project.
Connection token
A UUID generated at OAuth that pairs a Slack workspace with its Forge plugin. A Jira admin pastes this token into Apps → Threadmaker → Global Settings in Jira admin. Rotatable from the App Home tab.
Marker
A short machine-readable correlation id Threadmaker stores invisibly alongside each synced message — as a Jira comment property on the Jira side and as Slack message metadata on the Slack side. It is never shown in the comment or message text. It lets Threadmaker recover from partial failures by finding the right Jira comment on retry. The {{tm.marker}} template variable remains in the Slack-comment template for compatibility but now renders nothing (the marker moved out of the visible body). (Anchor templates use the sibling {{tm.anchor}} for the same purpose.)
Live updates
The behaviour where an anchor message in Slack edits itself when the underlying Jira issue's status, type, priority, or assignee changes. Toggle in Project settings → Sync anchor field updates.

Pricing tiers

Threadmaker is free for 1–10 users. Paid tiers (Team / Business / Enterprise) bill through the Atlassian Marketplace by Jira user count; no feature gates — every tier gets the full feature set (edit sync, reactions, /jira-create, custom templates, live anchors). The Slack app itself is always free; Atlassian handles the billing.

See threadmaker.dev pricing for tier details and annual discounts. The free tier (up to 10 users) needs no credit card; paid tiers come with Atlassian Marketplace's standard free trial and are billed by Atlassian — Threadmaker never charges you directly.

Roadmap and current constraints

Coming soon

Architecture constraints (not priorities)

Disable or uninstall cleanly

You can back out of Threadmaker without losing data. Three levels:

For an immediate full-data wipe (GDPR data-subject request), email dpo@threadmaker.dev with subject "Data deletion request".

Troubleshooting

Comments aren't syncing

  1. Ask a workspace admin to run /jira-audit in the channel (the command is admin-only) — it shows the last 20 sync events including failures. Check for any "failed" rows.
  2. Confirm the channel is paired: a workspace admin can re-run /jira-map PROJ and look for the "✅ This channel is now synced with Jira project PROJ" confirmation.
  3. Confirm the project is enabled in Project settings → Apps → Threadmaker.
  4. Confirm the bot is invited to the channel (/invite @Threadmaker) — Slack bots only receive events from channels they're a member of, both public and private.
  5. Check the App Home tab for a license-paused banner. A lapsed Atlassian Marketplace subscription pauses sync after a 2-day grace period.

The anchor message shows the wrong status

Live updates are disabled in Project settings → Apps → Threadmaker → Sync anchor on Jira field changes, or the anchor predates the channel mapping. Manually re-run any operation on the issue (add a comment, transition it) to trigger a fresh anchor render. Or re-enable the toggle.

A Jira comment didn't appear in Slack

A Jira issue moved to another project

The thread follows the issue automatically — its key updates (e.g. ABC-1XYZ-5) and the existing Slack thread stays attached. If the destination project isn't paired to a channel, pair it (/jira-map) to resume syncing new comments. With Notify in thread when an issue moves projects enabled, a 🔀 notice is posted; otherwise the move is silent.

An attachment didn't sync

Most likely it's over the 2 MB cap. Slack senders see an ephemeral warning when one or more files are dropped. Jira-side attachments over 2 MB simply don't appear in Slack — the comment text still syncs. Upload to your team's storage and paste a link.

"Sync paused" banner

The Atlassian Marketplace license has lapsed past the 2-day grace period. Reactivate the subscription in Atlassian admin to resume sync. The audit log preserves events that fired during the grace + paused period (90-day retention).

Connection token leaked

Rotate it from the App Home tab → Rotate connection token. The old token becomes invalid immediately. Paste the new token in Apps → Threadmaker → Global Settings in Jira admin to re-establish the connection. Until you re-paste, Jira-side activity won't deliver to Slack.

Where to get help