n8n Tutorial: Support Ticket Resolved → CSAT Survey + Low-Score Alert Automation
Support tickets get marked "resolved" and then vanish into a black hole. Nobody knows if the customer was actually happy, mildly annoyed, or furious enough to churn next month. By the time a low CSAT
Support tickets get marked "resolved" and then vanish into a black hole. Nobody knows if the customer was actually happy, mildly annoyed, or furious enough to churn next month. By the time a low CSAT shows up in a monthly report, the moment to fix it is long gone. This tutorial shows you how to build an n8n workflow that closes that loop automatically: 30 minutes after a ticket is resolved, the customer gets a one-click 5-emoji CSAT survey. Low scores trigger an instant Slack alert to your team and get logged to your API for trend tracking — no manual follow-up, no missed detractors.
The problem: resolved ≠ satisfied
Most support teams measure the wrong thing. Time-to-resolution and ticket volume tell you how busy your agents are, not whether customers are happy. CSAT is the metric that predicts retention — but collecting it reliably is where teams fail.
The manual approaches all break down:
- Sending surveys by hand — agents forget, or skip it on the tickets that went badly (exactly the ones you need feedback on).
- Batch surveys once a week — the interaction is cold, recall is fuzzy, response rates crater below 5%.
- Firing the survey the instant a ticket closes — the customer is still in their inbox mid-frustration, and you interrupt a resolution they haven't even confirmed works.
The bigger issue is what happens after a low score arrives. If a 1-star response lands in a shared inbox on Friday afternoon, nobody sees it until Monday. The window to save that customer — a follow-up call, a credit, an apology from a lead — is measured in hours, not days. You need the alert to be instant and to reach a human where they already work.
The solution: a 30-minute delayed survey with instant escalation
The workflow has a deliberate shape. When your helpdesk marks a ticket resolved, it fires a webhook into n8n. n8n waits 30 minutes — long enough for the customer to confirm the fix actually worked, short enough that the interaction is still fresh — then sends a CSAT email with five emoji buttons (😡 😞 😐 🙂 😍), each a one-click link. No login, no 10-question form.
When the customer clicks, a second webhook captures the score. Then the logic branches:
- Score 4–5 (happy): log it to your API and stop. No noise.
- Score 1–3 (at risk): log it, and fire a rich Slack alert to your support channel with the ticket ID, customer, score, and a direct link — so a human can intervene within minutes.
Every response, high or low, is stored to your tracking API so CSAT trends become a live dashboard instead of a quarterly guess.
Step-by-step setup in n8n
This is two connected workflows: one to send the survey, one to process responses. Build them in the same n8n instance.
Workflow 1 — Send the survey
1. Webhook node (trigger). Add a Webhook node, method POST, path /ticket-resolved. Configure your helpdesk (Zendesk, Freshdesk, Intercom, HelpScout) to POST to this URL on the "ticket resolved" trigger. Expect a payload with ticket_id, customer_email, customer_name, and agent.
2. Wait node. Add a Wait node set to 30 minutes. n8n persists the execution and resumes it automatically — you don't keep a process alive. This is the single most important config in the workflow; it's why response quality is high.
3. Set node. Build your five survey links here. Each emoji points at your response webhook (Workflow 2) with the score and ticket baked into the query string, for example:
https://your-n8n.com/webhook/csat-response?ticket_id={{$json.ticket_id}}&score=5
Create one URL per score, 1 through 5. Encode the ticket_id so the response is attributable.
4. Send Email node (or Gmail / SendGrid). Compose an HTML email. Keep the subject specific: How did we do with ticket #{{$json.ticket_id}}?. In the body, render the five emoji as clickable anchor tags wrapping each survey link. One line of context ("Your issue was just resolved by {{$json.agent}} — one tap tells us how it went") lifts open and click rates noticeably.
Workflow 2 — Process the response
5. Webhook node (trigger). Method GET, path /csat-response. This catches the customer's click. Immediately after, add a Respond to Webhook node returning a simple "Thanks for your feedback!" HTML page so the click lands somewhere friendly.
6. HTTP Request node — store to API. POST the response to your tracking endpoint. Body: ticket_id, score, customer_email, and a timestamp via {{$now}}. This runs for every response so your CSAT dataset is complete.
7. IF node — branch on score. Condition: {{$json.query.score}} is smaller than or equal to 3. The true branch is your alert path; the false branch simply ends.
8. Slack node. On the true branch, add a Slack node, operation Send Message, targeting your #support-alerts channel. Use Block Kit or a formatted message:
🚨 Low CSAT: {{$json.query.score}}/5 on ticket #{{$json.query.ticket_id}} from {{$json.query.customer_email}} — needs follow-up.
Include a link back to the ticket so an agent is one click from acting.
Activate both workflows. Send yourself a test payload, wait (or temporarily drop the Wait node to seconds), click an emoji, and confirm the row hits your API and — for a low score — the Slack ping fires.
Benefits: what this actually changes
- Response rates that mean something. A single-click emoji survey sent while the interaction is fresh routinely pulls 3–5× the response rate of a delayed multi-question form.
- Detractor recovery in minutes, not weeks. The instant Slack alert turns a silent unhappy customer into a saved account. This is the highest-ROI part of the whole system.
- A real CSAT dataset. Because every response is logged to your API, you can slice satisfaction by agent, ticket type, or week — and spot a declining trend before it becomes churn.
- Zero manual work. No agent has to remember to send anything. The workflow runs whether your team is heads-down or asleep.
- No survey-tool subscription. You own the whole loop in n8n instead of paying per-response to a SaaS survey vendor.
Common pitfalls to avoid
- Firing the survey too early. Skipping the 30-minute Wait and surveying at the instant of resolution is the most common mistake. The customer hasn't confirmed the fix works, and scores come back artificially low. Keep the delay.
- Unencoded ticket IDs in survey links. If the
ticket_idin your query string breaks (special characters, spaces), the response webhook can't attribute the score. Use n8n's expression encoding and test with a real ticket ID format. - Alerting on every score. If the IF node is misconfigured and Slack fires on 4s and 5s too, your team learns to ignore the channel. Alert only on 1–3, and consider a separate low-urgency digest for neutral 3s if they're frequent.
- No idempotency on the response webhook. Customers sometimes click twice or refresh the thank-you page. Either dedupe on
ticket_idin your API, or accept the first response only — otherwise one detractor generates three Slack alerts. - Wait node timezone and persistence. On self-hosted n8n, confirm executions are set to save and that your instance isn't restarting mid-wait without queue mode — otherwise a 30-minute delay can be silently dropped. Test a full cycle before trusting it in production.
- Surveying tickets that were auto-closed. If your helpdesk marks stale tickets "resolved" without a real interaction, you'll survey people who never talked to you. Filter the trigger to human-resolved tickets only.
Wire these two workflows together and you've turned "ticket resolved" from a dead end into a feedback engine — one that flags your unhappiest customers the moment they raise their hand, and builds a satisfaction dataset you can actually steer by.
Ja construimos isso pra voce
Nao comece do zero. O Support Ticket Resolved → CSAT Survey + Low-Score Alert e um workflow n8n pronto para instalar — conecta suas ferramentas em minutos, sem codigo.
Instalar por $79 →