The moment it happens
Follow each Zendesk ticket in its own Slack thread
Every new ticket appears in Slack, and each reply or status change lands in that ticket's thread.
- Runs
- The moment it happens
- Apps
- Slack, Zendesk
- AI
- Not needed
- Access
- Zendesk admin to create webhook; chat:write
Send this to your assistant
Create a ClickRuntime automation: when a Zendesk ticket is created, post it to #support. When it's updated, add the latest comment and status as a reply in that ticket's Slack thread.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A product team at a small software company wants to know what customers are reporting without logging into Zendesk. Engineers and product managers do not have agent seats, so they rely on the support lead forwarding the interesting ones. By then the conversation has moved on and nobody can see how it ended.
Giving each ticket its own thread in Slack lets anyone follow a customer issue from the first message to the resolution, in the tool they already have open.
What you get out of it
The whole team sees customer issues
People without a Zendesk seat can read what customers are asking and how support answered. Product decisions are made with the actual words customers used.
One thread per ticket
Updates collect under the original message instead of scattering through the channel. Anyone can open a thread and read the full story in order.
No extra agent licences
Engineers and managers follow tickets in Slack instead of needing a paid seat just to read them.
Faster help from experts
When an engineer sees a ticket thread that needs them, they can jump in early with an answer for the agent instead of waiting for an escalation.
Status at a glance
Each update shows the ticket's status, so solved and pending tickets are easy to spot in the channel.
How it works
What happens, step by step
Zendesk tells ClickRuntime the moment a ticket is created or updated.
For a new ticket, it posts the subject, requester and first message to your #support Slack channel and remembers which Slack message belongs to that ticket.
For an update, it fetches the latest public reply and the new status.
It posts that update as a reply in the ticket's own thread, so each ticket's history stays together.
Before it runs live
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
- Connect Zendesk
- Paste your automation's link into the other app's webhook settings
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Act only on the items that match your own rules, and skip the rest
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Google Sheets
- Combine it with other Slack and Zendesk steps into one automation
Under the hood
The code that runs this automation
from slack_sdk import WebClient
from clickruntime import on_event, http, credentials, state
ZD, AGENT = "https://yourcompany.zendesk.com/api/v2", "you@yourcompany.com"
def zd(method, path, **kw):
r = http.request(method, ZD + path, auth=(f"{AGENT}/token", credentials.secret("ZENDESK_API_TOKEN")), **kw)
return r.raise_for_status() or (r.json() if r.content else None)
@on_event
def handle(event):
t = (event.json or {}).get("ticket", {})
slack = WebClient(token=credentials.connection("slack", "work"))
ts = state.get(f"ts:{t['id']}")
if not ts:
msg = slack.chat_postMessage(channel="#support", text=f"🎫 #{t['id']} {t['subject']} ({t.get('requester', '')})\n{t.get('description', '')[:500]}")
state.set(f"ts:{t['id']}", msg["ts"])
return {"ticket": t["id"], "posted": "new"}
comments = zd("GET", f"/tickets/{t['id']}/comments", params={"sort_order": "desc", "per_page": 1})["comments"]
latest = comments[0]["plain_body"][:800] if comments and comments[0]["public"] else "(internal update)"
slack.chat_postMessage(channel="#support", thread_ts=ts, text=f"Status: {t.get('status')}\n{latest}")
return {"ticket": t["id"], "posted": "update"}FAQ
Common questions
Will internal notes show in Slack?
Can I limit it to certain tickets?
What if a ticket was created before the automation started?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Turn a Slack message into a Zendesk ticket with an emoji
React to any Slack message with 🎫 and it becomes a Zendesk ticket, with the link posted back in the thread.
See how it worksSummarise and prioritise new Zendesk tickets with AI
Each new ticket gets a short summary, a sentiment and a priority, and the urgent ones are flagged in Slack.
See how it worksGet a Slack alert for tickets nobody has picked up
Slack tells you when a ticket has sat unassigned too long or is close to missing its SLA, once per ticket.
See how it worksKeep exploring
Set up “Follow each Zendesk ticket in its own Slack thread” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.