Zendesk to Google Sheets, tickets always report-ready
Your “quick ticket check” turns into a half-hour rabbit hole. Open Zendesk tickets are scattered, context is missing, and by the time you export anything, the numbers are already stale.
This Zendesk Sheets automation hits support leads first, but ops managers and agency owners juggling client support feel it too. Instead of manual exports and messy pivots, you get a clean Google Sheet that stays current, plus Slack alerts when a ticket actually needs attention.
Below, you’ll see how the workflow pulls open tickets, enriches them with requester details, and keeps one report-ready view that’s easy to scan and hard to argue with.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Zendesk to Google Sheets, tickets always report-ready
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Enrich with Calculated Fields", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check for Priority Alerts", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Save to Google Sheets - Main..", pos: "b", h: 48 }
n4["<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 Summary Statistics"]
n5@{ icon: "mdi:database", form: "rounded", label: "Update Dashboard Sheet", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format Slack Message", 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/slack.svg' width='40' height='40' /></div><br/>Send Slack Alert"]
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/zendesk.svg' width='40' height='40' /></div><br/>Fetch All Zendesk Tickets1"]
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Open Tickets Only1", pos: "b", h: 48 }
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/zendesk.svg' width='40' height='40' /></div><br/>Get Ticket Requester Details1"]
n6 --> n7
n6 --> n3
n2 --> n6
n2 --> n3
n9 --> n10
n8 --> n9
n4 --> n5
n1 --> n2
n10 --> n1
n3 --> n4
n0 --> n8
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 n0 trigger
class n2,n9 decision
class n3,n5 database
class n4 code
classDef customIcon fill:none,stroke:none
class n4,n7,n8,n10 customIcon
The Challenge: Open tickets that never feel “under control”
Open tickets are deceptively hard to manage because the work isn’t just “looking.” It’s switching views, filtering, checking requester context, and trying to remember what “urgent” meant last week. Then comes the reporting dance: export CSV, clean columns, chase down owner names, reformat tags, and hope nobody changes statuses while you’re building your update. Honestly, the worst part is trust. When your sheet is manual, everyone assumes it’s wrong, which means more questions, more digging, and more time spent proving you already did the work.
It adds up fast. Here’s where it breaks down in day-to-day support operations.
- Manual Zendesk exports become a recurring task that quietly steals an hour or two every week.
- Requester details live behind clicks, so priority decisions get made with partial context.
- “Open” can mean a lot of things, and inconsistent filtering leads to confusing status reports.
- High-priority tickets don’t always get surfaced in time because nobody is watching the queue every minute.
The Fix: A Zendesk ticket digest that stays report-ready
This n8n workflow turns Zendesk into a living, structured digest inside Google Sheets. It starts by fetching your Zendesk tickets, then immediately filters down to the ones that are truly open (skipping solved, closed, and anything you don’t want in a “what’s pending” view). Next, it enriches each ticket with requester details like name, email, and organization, so your team doesn’t have to guess who’s behind the issue. From there, it writes clean rows into a main Google Sheet tab and computes summary metrics for a second “dashboard” tab. If something looks urgent, a Slack message is composed and sent so the right people notice it without babysitting Zendesk.
The workflow begins with a manual run for testing, but it’s designed to become a scheduled digest. Zendesk provides the ticket data, Google Sheets becomes the single view your team relies on, and Slack handles the “wake up, this matters” moments.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you run a quick status digest every weekday. Manually, it’s usually 10 minutes to export and format, plus another 20 minutes to open a handful of tickets and grab requester details for “important” ones, so call it about 30 minutes a day. With this workflow, the trigger takes under a minute, Zendesk and Google Sheets do the heavy lifting, and you just read the sheet when it’s ready. That’s roughly 2 hours back each week, and the Slack alerting means urgent tickets don’t wait for your next check-in.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Zendesk to fetch tickets and requester profiles.
- Google Sheets to store the digest and dashboard.
- Slack to notify the team about priority tickets.
- Zendesk API key or OAuth (create it in Zendesk Admin Center).
Skill level: Beginner. You’ll connect accounts, pick the destination spreadsheet, and adjust a couple of filters.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A run is triggered. Start it manually to test, then switch to a Schedule Trigger for a daily or hourly digest, depending on how busy your queue gets.
Zendesk tickets are pulled and filtered. The workflow retrieves tickets from Zendesk, then keeps only the ones with an “open” status so your sheet reflects actual pending work.
Requester context is added. For each open ticket, Zendesk is queried again to fetch the requester profile (name, email, organization), which makes the digest usable without extra clicking.
Priority gets attention and the data lands in Sheets. Computed metrics are added, priority rules are evaluated, and a Slack notice is sent when needed. In parallel, Google Sheets is updated and a summary is recalculated to refresh a simple dashboard tab.
You can easily modify the “open” filter to include pending tickets or specific tags based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts on demand so you can run a ticket sync whenever needed.
- Add the Manual Start Trigger node as the entry point.
- No fields are required for Manual Start Trigger; keep the default configuration.
- Connect Manual Start Trigger to Retrieve Zendesk Tickets.
Step 2: Connect Zendesk and Filter Open Tickets
Pull all tickets from Zendesk and filter only open records for processing.
- Open Retrieve Zendesk Tickets and set Operation to
getAlland Return All totrue. - Credential Required: Connect your zendeskApi credentials in Retrieve Zendesk Tickets.
- In Filter Open Status, set the condition to Left Value
{{ $json.status }}, Operationequals, and Right Valueopen. - Connect Retrieve Zendesk Tickets → Filter Open Status → Fetch Requester Profile.
- In Fetch Requester Profile, set Resource to
user, Operation toget, and ID to{{ $json.requester_id }}. - Credential Required: Connect your zendeskApi credentials in Fetch Requester Profile.
Step 3: Compute Ticket Metrics and Evaluate Alerts
Enrich each ticket with SLA and priority logic, then branch for alert-worthy items.
- In Add Computed Metrics, add the following fields using expressions:
- Set ticket_age_days to
{{ Math.floor((new Date() - new Date($('Filter Open Status').item.json.created_at)) / (1000 * 60 * 60 * 24)) }}. - Set priority_score to
{{ $('Filter Open Status').item.json.priority === 'urgent' ? 4 : $('Filter Open Status').item.json.priority === 'high' ? 3 : $('Filter Open Status').item.json.priority === 'normal' ? 2 : 1 }}. - Set sla_status to
{{ Math.floor((new Date() - new Date($('Filter Open Status').item.json.created_at)) / (1000 * 60 * 60 * 24)) > 7 ? 'BREACHED' : Math.floor((new Date() - new Date($('Filter Open Status').item.json.created_at)) / (1000 * 60 * 60 * 24)) > 5 ? 'AT_RISK' : 'OK' }}. - Set ticket_data to
{{ $('Filter Open Status').item.json }}and user_data to{{ $json }}. - In Evaluate Priority Alerts, set the condition to Left Value
{{ $json.sla_status }}, OperationnotEquals, and Right ValueOK. - Connect Fetch Requester Profile → Add Computed Metrics → Evaluate Priority Alerts.
Step 4: Configure Slack Alerts and Sheet Updates
Create alert messages and send them to Slack while logging ticket rows to Google Sheets.
- In Compose Slack Notice, set alert_message to the multi-line expression that formats the ticket alert, including the URL with
https://[YOUR_ID].zendesk.com/agent/tickets/{{ $json.ticket_data.id }}. - Evaluate Priority Alerts routes alert-eligible tickets to Compose Slack Notice and non-alert tickets directly to Update Main Sheet.
- Compose Slack Notice outputs to both Dispatch Slack Alert and Update Main Sheet in parallel.
- In Dispatch Slack Alert, set Text to
{{ $json.alert_message }}and choose your channel (e.g.,#ticket-alerts). - Credential Required: Connect your slackApi credentials in Dispatch Slack Alert.
- In Update Main Sheet, keep Operation as
appendOrUpdateand map columns like Ticket No. →{{ $json.ticket_data.id }}and Last Updated →{{ $now.toISO() }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Main Sheet.
[YOUR_ID] in the Zendesk link and in Google Sheets Document ID / Sheet Name with real IDs or the workflow will fail.Step 5: Generate Summary Metrics and Refresh the Dashboard
Aggregate open ticket statistics and write the results to a dashboard sheet.
- Review Compute Summary Metrics and keep the JavaScript as provided to calculate counts, SLA stats, and averages.
- Connect Update Main Sheet → Compute Summary Metrics → Refresh Dashboard Sheet.
- In Refresh Dashboard Sheet, keep Operation as
appendOrUpdateand ensure Matching Columns includeMetric. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Refresh Dashboard Sheet.
Step 6: Test and Activate Your Workflow
Run a manual test to verify ticket sync, Slack alerts, and sheet updates before enabling production use.
- Click Execute Workflow from Manual Start Trigger to run the flow end-to-end.
- Confirm open tickets pass through Filter Open Status and are enriched by Add Computed Metrics.
- Verify alert-worthy tickets post to Slack via Dispatch Slack Alert and all tickets append/update in Update Main Sheet.
- Check that Refresh Dashboard Sheet receives summary stats from Compute Summary Metrics.
- When satisfied, toggle the workflow to Active for production use.
Watch Out For
- Zendesk credentials can expire or need specific permissions. If things break, check your Zendesk API token/OAuth scopes in Admin Center first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About 30 minutes if your Zendesk, Sheets, and Slack accounts are ready.
Yes. You’ll mainly connect credentials, choose your spreadsheet, and confirm the “open” ticket filter.
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 plan/API access and normal Google Workspace costs if you use paid accounts.
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.
You can adjust the “Filter Open Status” rule to include pending tickets, exclude certain tags, or focus on a specific group. The “Evaluate Priority Alerts” logic is the other common tweak, since every team defines “urgent” differently (priority field, specific tags, VIP domains, or ticket age). If you want the sheet to look different, change the fields mapped in “Update Main Sheet” and the calculations in “Compute Summary Metrics.”
Usually it’s an expired or incorrect API token, or an OAuth app that lost permission. Regenerate the Zendesk credential, update it in n8n, and confirm the account can read tickets and users. If it fails only on requester enrichment, check access to user/profile endpoints and make sure you aren’t hitting Zendesk rate limits during big runs.
On n8n Cloud you’re limited by your plan’s monthly executions; if you self-host, capacity mostly depends on your server and Zendesk API limits.
Often, yes, when you care about maintaining a “main sheet” plus a computed dashboard and conditional Slack alerts in one flow. n8n is comfortable with branching logic, merging data (tickets + requester profiles), and doing light computation before writing to Sheets, without turning it into five separate automations. Zapier or Make can still work if your use case is simpler, like “new ticket → add row,” and you want the fastest setup. If your digest needs enrichment, filtering rules, and a summary view, n8n tends to stay cleaner as it grows. Talk to an automation expert if you want a quick recommendation based on your volume.
Once this is running, your “ticket status report” stops being a recurring project. The workflow keeps the boring parts tidy, so you can focus on fixing real customer problems.
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.