The moment it happens
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.
- Runs
- The moment it happens
- Apps
- Slack, Zendesk
- AI
- Not needed
- Access
- reactions:read, channels:history, chat:write; Zendesk write
Send this to your assistant
Create a ClickRuntime automation: when someone reacts to a Slack message with :ticket:, create a Zendesk ticket from the message text and reply in the thread with the ticket link.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Customers and partners raise problems in shared Slack channels. Account managers promise to look into it, then the message scrolls away. A week later nobody can remember who was meant to follow up, and there is no record in Zendesk of the issue at all.
A single emoji turns the message into a proper ticket, so the request is tracked, assigned and reported on like everything else support handles.
What you get out of it
Requests are not lost in chat
Anything worth tracking becomes a ticket in seconds, before it scrolls out of view.
Support keeps one queue
Issues raised in Slack join the same Zendesk queue as email and chat, with the same SLAs and reporting.
Everyone can see it was picked up
The ticket link appears in the Slack thread, so the person who asked knows it is being handled.
Nothing to learn
Anyone in the channel can raise a ticket with a reaction, with no form to fill in and no Zendesk login.
How it works
What happens, step by step
Slack tells ClickRuntime when someone adds the 🎫 reaction to a message.
It fetches the text of that message and who wrote it.
It checks the message has not already been turned into a ticket.
A new Zendesk ticket is created with the message, the channel name and a link back to Slack.
The ticket link is posted as a reply in the message's thread.
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):
body = event.json or {}
if body.get("type") == "url_verification":
return {"challenge": body["challenge"]}
ev = body["event"]
if ev.get("reaction") != "ticket" or state.get(f"done:{ev['item']['ts']}"):
return {"created": False}
slack = WebClient(token=credentials.connection("slack", "work"))
channel, ts = ev["item"]["channel"], ev["item"]["ts"]
msg = slack.conversations_history(channel=channel, latest=ts, inclusive=True, limit=1)["messages"][0]
link = slack.chat_getPermalink(channel=channel, message_ts=ts)["permalink"]
ticket = zd("POST", "/tickets", json={"ticket": {"subject": msg["text"][:80],
"comment": {"body": f"{msg['text']}\n\nRaised from Slack: {link}"}, "tags": ["from_slack"]}})["ticket"]
slack.chat_postMessage(channel=channel, thread_ts=ts, text=f"Ticket #{ticket['id']} created: https://yourcompany.zendesk.com/agent/tickets/{ticket['id']}")
state.set(f"done:{ts}", ticket["id"])
return {"created": ticket["id"]}FAQ
Common questions
Can anyone in the channel create a ticket?
Which details go into the ticket?
What if two people react with the same emoji?
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
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.
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 “Turn a Slack message into a Zendesk ticket with an emoji” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.