Zendesk + Google Sheets: support KPIs made clear
Your support data is probably “somewhere.” A few numbers in Zendesk. Another view in Freshdesk. Then a last-minute spreadsheet that you do not fully trust.
This is where support managers start losing time. Ops leads get pulled into the reporting mess too, and founders feel it when customers complain. With support KPI automation, the weekly scramble turns into one clean dashboard, plus alerts when SLA risk is climbing.
This workflow pulls tickets from Zendesk and Freshdesk, normalizes them, calculates the KPIs that actually matter, logs everything to Google Sheets, posts Slack warnings, and emails a polished weekly report. You’ll see what it does, why it works, and what you need to run it.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Zendesk + Google Sheets: support KPIs made clear
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Send Slack Alert"]
n1@{ icon: "mdi:message-outline", form: "rounded", label: "Send Weekly Email", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Weekly Trigger", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/zendesk.svg' width='40' height='40' /></div><br/>Fetch Tickets From Zendesk"]
n4@{ icon: "mdi:database", form: "rounded", label: "Log KPIs in Google Sheets", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Calculate Support KPIs"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Evaluate Alerts", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Generate Slack Alert Message"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Generate Weekly HTML Report"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Format Ticket Data (Zendesk.."]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/freshdesk.svg' width='40' height='40' /></div><br/>Fetch Tickets From Freshdesk"]
n9 --> n10
n2 --> n3
n2 --> n11
n6 --> n7
n6 --> n8
n5 --> n6
n4 --> n5
n3 --> n9
n8 --> n1
n11 --> n9
n7 --> n0
n10 --> n4
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n6 decision
class n4 database
class n5,n7,n8,n10 code
classDef customIcon fill:none,stroke:none
class n0,n3,n5,n7,n8,n9,n10,n11 customIcon
The Problem: Support KPIs Are Split Across Tools
Zendesk and Freshdesk both tell a story, but not the same story. When tickets live in two places, you end up comparing apples to oranges: different priority labels, different status names, different “first response” definitions, and different ways to filter noise. Then comes the manual part. Someone exports CSVs, cleans columns, pastes into a sheet, and tries to explain the numbers to leadership with a straight face. It’s not hard work. It’s brittle work, and it breaks the moment volume spikes or someone forgets a step.
None of this feels terrible on a quiet week. During a rough week, it’s chaos. Here’s where it usually falls apart.
- You spend about 2 hours each week just pulling exports, cleaning them, and reconciling duplicates between systems.
- SLA breaches get noticed late, so the team reacts after damage is done.
- Metrics change depending on who built the report, which means leadership stops trusting the report.
- You can’t easily audit the “why” behind a KPI because raw ticket logs are missing or incomplete.
The Solution: One Weekly Workflow That Normalizes, Logs, Alerts, and Reports
This n8n workflow runs on a weekly schedule and pulls ticket data from both Zendesk and Freshdesk. It then merges the streams, standardizes each ticket into a consistent structure (so “priority,” “status,” and “channel” mean the same thing everywhere), and logs the cleaned records into Google Sheets for audit-ready tracking. Once the data is in the sheet, it calculates operational KPIs like resolution rate, urgent ticket rate, estimated CSAT health, and SLA breach signals. Finally, it evaluates your alert conditions, sends a Slack message when things look risky, and builds a corporate-style HTML report that gets emailed via Gmail. No more stitched-together dashboards. One source of truth, delivered on time.
The workflow starts with a Cron schedule, then pulls tickets from Zendesk and Freshdesk in parallel. After a merge and cleanup pass, everything lands in Google Sheets, which feeds the KPI calculation and alert logic. Slack gives you fast visibility; Gmail gives leadership the weekly narrative.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you run reports once a week across Zendesk and Freshdesk. Manually, you typically spend about 30 minutes exporting from each tool, then another hour cleaning, mapping statuses, and building a summary for Slack and leadership. Call it 2 hours, and that’s on a good week. With this workflow, you spend maybe 10 minutes setting up the sheet and thresholds, then it runs on schedule and sends Slack + Gmail outputs automatically. The “work” becomes reviewing the report, not creating it.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Zendesk for pulling ticket data via API.
- Freshdesk to consolidate tickets from a second system.
- Google Sheets OAuth (create in Google Cloud console).
- Slack Bot token (get it from Slack API apps).
- Gmail OAuth (enable Gmail API in Google Cloud).
Skill level: Intermediate. You’ll connect credentials, paste IDs (sheet, channel), and tweak a few KPI thresholds.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A weekly schedule kicks everything off. The Cron trigger runs at your chosen time (the template uses a weekly evening run), so you get consistent reporting without anyone remembering to do it.
Tickets are pulled from Zendesk and Freshdesk in parallel. n8n requests the latest ticket data from each platform, then combines both streams into one dataset that’s easier to reason about.
Records are standardized before they hit your spreadsheet. Priorities, statuses, and channels are normalized into a single “house style,” so “Open” and “New” don’t end up as two separate categories in your charts.
KPIs are computed, then the workflow decides what to say. A metrics step calculates things like resolution rate and SLA breach signals, then an alert check determines if Slack should flag risk and what the weekly report should emphasize.
Your outputs go where people already look. Slack gets the fast heads-up and recommendations. Gmail sends the formatted weekly HTML report, while Google Sheets remains the audit log and reporting backbone.
You can easily modify alert thresholds to match your SLA targets based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Weekly Trigger
Set the weekly schedule that starts the workflow and kicks off ticket retrieval from both platforms in parallel.
- Add and open Scheduled Weekly Trigger.
- In Trigger Times, set Mode to
everyWeekand Hour to20. - Connect Scheduled Weekly Trigger to both Retrieve Zendesk Tickets and Retrieve Freshdesk Tickets so they run in parallel.
Scheduled Weekly Trigger outputs to both Retrieve Zendesk Tickets and Retrieve Freshdesk Tickets in parallel.
Step 2: Connect Zendesk and Freshdesk
Pull all tickets from both platforms so the workflow can standardize and combine the data.
- Open Retrieve Zendesk Tickets and set Operation to
getAlland Return All totrue. - Credential Required: Connect your zendeskApi credentials in Retrieve Zendesk Tickets.
- Open Retrieve Freshdesk Tickets and set Operation to
getAlland Return All totrue. - Credential Required: Connect your freshdeskApi credentials in Retrieve Freshdesk Tickets.
- Confirm both nodes connect into Combine Ticket Streams.
Retrieve Zendesk Tickets and Retrieve Freshdesk Tickets feed into Combine Ticket Streams.
Step 3: Set Up Ticket Standardization and KPI Storage
Normalize ticket data, then write each ticket into your KPI spreadsheet for ongoing tracking.
- Open Standardize Ticket Records and review the JavaScript that maps Zendesk and Freshdesk fields into a unified schema.
- Update URL placeholders inside Standardize Ticket Records such as
https://[YOUR_ID].zendesk.com/agent/tickets/${ticketData.id}andhttps://[YOUR_ID].freshdesk.com/helpdesk/tickets/${ticketData.id}. - Open Update KPI Spreadsheet and set Operation to
appendOrUpdate. - Set Document to
[YOUR_ID]and Sheet Name togid=0. - Verify Matching Columns includes
ticket_idand Mapping Mode isautoMapInputData. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Update KPI Spreadsheet.
Combine Ticket Streams → Standardize Ticket Records → Update KPI Spreadsheet.
Step 4: Set Up KPI Computation, Alerts, and Outputs
Compute KPIs, assess alert conditions, then send Slack alerts and an HTML email report in parallel.
- Open Compute Support Metrics to confirm thresholds like
response_time_hours: 4andresolution_time_hours: 24match your SLA policies. - Open Assess Alert Conditions and verify the conditions use
{{ $json.kpis.any_alert }}and{{ $json.kpis.alerts.high_sla_breach }}. - Assess Alert Conditions outputs to both Build Slack Alert Text and Create Weekly HTML Report in parallel.
- In Post Slack Notification, set Text to
{{ $json.text }}and choose your Channel value. - Credential Required: Connect your slackApi credentials in Post Slack Notification.
- In Dispatch Weekly Email, set Message to
Support Dashboard Alert, Subject to{{ $json.subject }}, and HTML Message to{{ $json.html }}. - Credential Required: Connect your gmailOAuth2 credentials in Dispatch Weekly Email.
Build Slack Alert Text → Post Slack Notification, and Create Weekly HTML Report → Dispatch Weekly Email.
Step 5: Test and Activate Your Workflow
Run a manual test to verify data retrieval, KPI calculations, and notification delivery before turning the workflow on.
- Click Execute Workflow and confirm both Retrieve Zendesk Tickets and Retrieve Freshdesk Tickets return data.
- Check Update KPI Spreadsheet to ensure rows are appended or updated with the standardized fields.
- Validate that Compute Support Metrics outputs a
kpisobject and Assess Alert Conditions routes to both outputs. - Confirm a Slack message arrives from Post Slack Notification and an email arrives from Dispatch Weekly Email.
- Switch the workflow to Active to enable weekly scheduled runs.
Common Gotchas
- Google Sheets OAuth credentials can expire or lack spreadsheet write permissions. If rows stop logging, check the n8n credential status and the target spreadsheet sharing settings first.
- Zendesk and Freshdesk API access can fail due to missing scopes or an API key that was rotated. If one side suddenly returns empty data, confirm ticket read access in that platform’s admin panel.
- Slack posting can quietly break if the bot is not invited to the channel or the channel ID is wrong. Check the Slack node output and confirm the bot has permission to post in the chosen channel.
Frequently Asked Questions
About 30–60 minutes if your Zendesk, Freshdesk, Google, and Slack credentials are ready.
No. You will connect accounts and update a few IDs and thresholds.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Zendesk/Freshdesk plan limits and standard Google API usage for Sheets/Gmail (usually negligible at weekly volume).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. Update the thresholds inside the Compute Support Metrics logic, then tweak the Assess Alert Conditions checks to match your definitions of “at risk.” Common changes include different first-response targets, separate rules for urgent tickets, and routing alerts to a different Slack channel via the Post Slack Notification node.
Usually it’s expired credentials or a token that was rotated. Re-check the Zendesk credential in n8n, confirm the account still has ticket read access, and make sure you’re pointing at the correct subdomain. If failures happen only on heavy weeks, you may be hitting rate limits, so pulling a smaller window or adding pagination logic can help. Also check the execution output of Retrieve Zendesk Tickets for the exact API error message; it’s often very specific.
A typical weekly run can handle thousands of tickets, but the practical limit depends on your n8n plan and API rate limits from Zendesk/Freshdesk.
Often, yes, because this workflow benefits from heavier data shaping, merging, and KPI logic that gets awkward (and expensive) in simpler tools. n8n handles branching and code-based calculations cleanly, and self-hosting removes execution caps if you’re processing a lot. Zapier or Make can be fine for “send this to that,” but weekly KPI grading plus a formatted HTML report is where you want more control. If you’re on the fence, Talk to an automation expert and describe your ticket volume and reporting needs.
Once this is running, your weekly support numbers stop being a debate. The workflow does the repetitive reporting work so you can focus on fixing what the KPIs reveal.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.