Send Slack alerts for low Zendesk CSAT scores using Claude Cowork

low complexityCost: Usage-based

Prerequisites

Prerequisites
  • Claude Desktop with Cowork enabled
  • Zendesk subdomain, agent email, and API token
  • Slack Bot Token with chat:write scope and the bot invited to your alert channel
  • Slack channel ID for your CSAT alerts channel

Overview

Claude Cowork lets you set up a recurring task that checks Zendesk for new bad satisfaction ratings and posts a Slack alert — all described in plain text. No code to write or maintain. Claude reads the task description, makes the API calls, and posts alerts on your behalf.

This is the fastest way to get CSAT alerting running if you don't want to set up an n8n workflow or deploy a script.

Step 1: Get Zendesk API credentials

Navigate to Admin Center → Apps and integrations → APIs → Zendesk API:

  1. Enable Token Access if not already enabled
  2. Click Add API token
  3. Give it a description like "CSAT Alert Bot"
  4. Copy the token — you'll paste it into the Cowork task description

You also need your Zendesk subdomain (the xxx part of xxx.zendesk.com) and the email address of the agent account associated with the token.

Step 2: Get Slack bot token and channel ID

Create a Slack app (or use an existing one):

  1. Go to api.slack.com/appsCreate New App
  2. Under OAuth & Permissions, add the chat:write scope
  3. Install the app to your workspace and copy the Bot User OAuth Token
  4. Invite the bot to your alerts channel: /invite @YourBotName in #csat-alerts
  5. Get the channel ID: right-click the channel name → View channel details → copy the ID at the bottom

Step 3: Create the Cowork task

Open Claude Desktop → Cowork tab → + New task.

Title: Alert Slack on bad Zendesk CSAT ratings

Description:

You are a support ops assistant. Check Zendesk for new bad CSAT ratings and alert the team in Slack.
 
Steps:
1. Query the Zendesk satisfaction ratings API for bad scores:
   GET https://SUBDOMAIN.zendesk.com/api/v2/satisfaction_ratings?score=bad&sort_order=desc&per_page=20
   Auth: Basic — username: EMAIL/token, password: API_TOKEN
 
2. Filter to only ratings updated in the last 2 hours (to account for hourly scheduling plus buffer).
 
3. For each bad rating:
   a. Get the ticket details:
      GET https://SUBDOMAIN.zendesk.com/api/v2/tickets/{ticket_id}.json
      Same auth.
   b. Note the subject, requester name, and any customer comment from the rating.
 
4. For each bad rating found, post a message to Slack:
   POST https://slack.com/api/chat.postMessage
   Authorization: Bearer SLACK_BOT_TOKEN
   Body: {"channel": "CHANNEL_ID", "text": "Bad CSAT on #TICKET_ID: SUBJECT\nCustomer comment: COMMENT\nLink: https://SUBDOMAIN.zendesk.com/agent/tickets/TICKET_ID"}
 
5. Print a summary of how many bad ratings were found and alerted.
 
Important:
- Only alert on ratings from the last 2 hours to avoid duplicate alerts.
- If no new bad ratings, just print "No new bad ratings found."
- Zendesk CSAT is binary (Good/Bad), not a 1-5 scale. The score=bad filter handles this.

Replace SUBDOMAIN, EMAIL, API_TOKEN, SLACK_BOT_TOKEN, and CHANNEL_ID with your actual values.

Claude Desktop must be running

Cowork tasks only execute while Claude Desktop is open and your machine is awake. For reliable 24/7 monitoring, use the Agent Skill with a cron job or the n8n approach instead.

Step 4: Set the schedule

Frequency: Every hour

If your support team works 9am-6pm, schedule during business hours only. Bad ratings that arrive overnight will be caught on the first morning run since the 2-hour lookback window overlaps.

For near-real-time alerts, use n8n

Cowork's hourly cadence means some bad ratings won't surface for up to an hour. If you need alerts within 5 minutes of a bad rating, use the n8n approach with a 5-minute schedule trigger.

Step 5: Run manually and review

Click Run now and watch the output. Claude will:

  1. Query the Zendesk satisfaction ratings API
  2. Filter to bad ratings from the last 2 hours
  3. Fetch ticket details for each bad rating
  4. Post a Slack alert for each one
  5. Print a summary

A typical run summary looks like:

Checked 20 recent satisfaction ratings. Found 2 bad ratings from the last 2 hours.
 
#48201 - Bad rating
  Subject: "Billing issue not resolved"
  Customer comment: "Agent kept transferring me"
  -> Slack alert sent
 
#48195 - Bad rating
  Subject: "Slow response to outage report"
  Customer comment: (no comment)
  -> Slack alert sent
 
Summary: 2 alerts sent.

When to use this approach

  • You want CSAT alerting running in under 10 minutes with no code
  • Your team works standard hours and hourly alerts are fast enough
  • You have moderate survey volume (under 50 bad ratings per day)
  • You're already using Claude Desktop and want to keep everything in one place

When to switch to another approach

  • You need near-real-time alerts within minutes of a bad rating → use the n8n approach with a 5-minute poll
  • You need alerts running 24/7 without depending on your laptop → use the Agent Skill with cron or GitHub Actions
  • You want richer Slack formatting with Block Kit buttons and structured fields → use n8n or the Agent Skill

Cost

Usage-based Claude Desktop pricing. Each run typically involves 2-3 API calls to Zendesk and 1 Slack API call per bad rating. The Zendesk and Slack API calls themselves are free.

Need help implementing this?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.