Zendesk CSAT Drop + Intercom Volume Spike: Correlated Support Health Alert to Microsoft Teams via Zapier
Detect a CSAT drop and an Intercom volume spike at the same time — and get a Teams alert before your support queue hits 200 tickets deep.
The stack in the order it runs — data flows from the source through to where it lands.
If you run Zendesk for ticketing and CSAT alongside Intercom for live chat, you almost never see a crisis coming until it's already on top of you. A CSAT drop alone is noisy. A volume spike alone is noisy. Both happening together in the same hour is a real signal — and right now, nobody is joining those two signals in real time.
Zapier handles this cleanly because both Zendesk and Intercom have mature integrations with webhook-based triggers. No custom API code needed for the event layer. Zapier's Zendesk module fires on new ticket or survey completion; Intercom's fires on conversation created. The intelligence layer is a Zapier Filter plus Formatter combination, not code.
The correlated alert pattern needs a place to store a rolling count between the two Zaps. Google Sheets works as a lightweight stateful counter that Zapier can read and write inside the same Zap. No database. No infrastructure. It's not pretty, but it holds.
One real tradeoff: Zapier's multi-step Zaps require a paid plan — Starter at minimum. The correlation logic also forces a two-Zap setup: Zap 1 increments an Intercom counter in Google Sheets when volume crosses your threshold, Zap 2 checks CSAT on Zendesk survey completion and then reads that counter. Not elegant, but it works. If you want a single-workflow solution, use Make or n8n instead. And skip this entire playbook if you're only on one platform — a single-platform alert is simpler to build natively inside Zendesk's triggers or Intercom's own webhooks. This playbook exists specifically for the cross-platform correlation gap.
The stack (5)
The universal data scratchpad.
Still the fastest place to land tabular data everyone can read.
Chat + channels for Microsoft-365 shops.
If the company is on Outlook/365, Teams is where reports get read — push there, not a separate tool.
How it runs
- 1
Set up a Google Sheets counter tab for hourly volume tracking
Create a Google Sheet named `support-health-monitor`. Add a tab called `counters` with four columns: `timestamp`, `intercom_conversations_last_hour`, `zendesk_csat_score_last_10`, `alert_fired_at`. Both Zaps will write to this sheet. The `intercom_conversations_last_hour` cell — B2 — starts at 0 and gets incremented on every Intercom conversation. This is your stateful layer. Zapier has no native memory, so Google Sheets substitutes for it.
- 2
Build Zap 1: Intercom conversation created → increment Google Sheets counter
In Zapier, create Zap 1. Trigger: Intercom → New Conversation (fires each time a new conversation starts). Action 1: Google Sheets → Get Spreadsheet Row — read the current value of B2, the hourly counter. Action 2: Google Sheets → Update Spreadsheet Row — write B2 = current value + 1. Action 3: Zapier Filter — only continue if `B2 >= your threshold`. Set that threshold based on your actual normal hourly volume; start with 2x your average. Action 4 (conditional): Google Sheets → Update Row, writing the current timestamp to the `intercom_spike_at` cell. This Zap runs on every single Intercom conversation but only writes the spike timestamp when the counter crosses the threshold.
- 3
Build Zap 2: Zendesk CSAT submission → check correlation and alert
Create Zap 2. Trigger: Zendesk → New Satisfaction Rating. Add a Zapier Formatter step to extract the rating value — Good/Bad in Zendesk maps to 1/0. Action: Google Sheets → Get Row to read your rolling CSAT average and the `intercom_spike_at` timestamp. Then add a Zapier Filter: only continue if `csat_score < your threshold` (e.g., 70%) AND `intercom_spike_at` is within the last 60 minutes — use Zapier's datetime formatter to calculate that gap. This filter is the correlation gate. Both conditions must be true or the Zap stops.
- 4
Update the rolling CSAT average in Google Sheets
Before the Teams notification fires, add a Google Sheets → Update Row step in Zap 2 to recalculate the rolling CSAT. Use the last 10 ratings: read the `csat_history` column — a comma-separated string of the last 10 scores — append the new score, drop the oldest, recalculate the average. This requires a Zapier Code step in Python or JavaScript, roughly 8 lines. It's the one place in this Zap where you actually need to write logic. Store the new average back to the `zendesk_csat_score_last_10` cell.
- 5
Construct the Microsoft Teams alert message
Add a Zapier Code step or Formatter step to build the Teams Adaptive Card JSON. Include: alert header `🚨 Support Health Alert`, current CSAT score vs. your threshold, Intercom conversation count in the last hour vs. your normal baseline, time of first spike, and a diagnosis line: `High volume + dropping CSAT = likely product issue or bad release. Check release log and tag engineering.` Teams Adaptive Cards support formatted text and action buttons — add a button linking to your Zendesk dashboard filtered to low-CSAT tickets.
- 6
Post to Microsoft Teams via Webhook
In Zapier, add a Webhooks by Zapier action → POST. Use your Teams Incoming Webhook URL — create it in Teams under the channel → Connectors → Incoming Webhook. Set Content-Type to `application/json`, paste the Adaptive Card payload. Post to your `#support-ops` Teams channel. Test with a manually triggered Zap run first. Teams webhooks are strict about malformed JSON and will silently drop messages without throwing an error — you won't know it failed unless you check.
- 7
Reset the Intercom counter on an hourly schedule
Create a third short Zap — or use a Google Apps Script trigger: every hour on the hour, reset the `intercom_conversations_last_hour` cell in Google Sheets to 0. Without this reset, the counter grows forever and your alert fires permanently. A Zapier Schedule trigger set to every 1 hour → Google Sheets Update Row is sufficient. This is the most commonly forgotten step in counter-based alerting patterns. Don't skip it.
- 8
Test the full correlation scenario end to end
Don't test with one scenario and call it done. Run two. First: manually set `intercom_conversations_last_hour` to your threshold value and `intercom_spike_at` to now, then submit a low-CSAT rating in Zendesk using a test ticket. Verify the Teams alert fires with correct data. Second: reset both cells, then submit a low-CSAT rating without the Intercom spike present — verify the alert does NOT fire. Both tests passing is the minimum bar before you enable this in production.
Want me to build this for you instead?
Product Audit and CTO Mode run out of this same thinking. If you’re reading this thinking “I want this, but in my product” — let’s talk.
See servicesMore like this
Gmail Thread Aging + Stripe Invoice Overdue: Unified AR Follow-Up Digest to Slack via Zapier
Surface overdue Stripe invoices and the exact age of your last Gmail thread with that customer — every morning at 8:30, automatically — so AR follow-up stops living in someone's head.
Intercom Ticket Volume + Razorpay Failed Payments: Daily Support-Cost-per-Revenue Alert to Slack via Zapier
Catch the support cost blowout from Razorpay failed payments before your agents are already buried.
Google Analytics 4 + HubSpot Lifecycle Stage: Weekly Acquisition-Quality Digest to Slack via Pipedream with Claude Narrative
Stop reporting traffic numbers. Report whether the traffic you paid for last week actually became pipeline — with a one-paragraph executive summary written by Claude.