This workflow corresponds to n8n.io template #8743 — we link there as the canonical source.
This workflow follows the Gmail → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "zBLlqGzoj4ODSM0v",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Automate follow-ups for pending tickets in Zendesk",
"tags": [],
"nodes": [
{
"id": "616e5acf-cab7-4ef6-a01a-68f158495148",
"name": "Workflow Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-912,
-80
],
"parameters": {
"width": 300,
"height": 304,
"content": "## \ud83c\udfaf Workflow Overview\n\nThis workflow automates Zendesk support ticket management:\n- Fetches pending tickets daily\n- Logs them to Google Sheets for tracking\n- Sends follow-up emails to customers\n- Creates ClickUp tasks for team reminders\n\n**Schedule**: Runs Monday-Friday at 8 PM"
},
"typeVersion": 1
},
{
"id": "4023e848-11cd-4b1e-aa2c-591c83a337cb",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.cron",
"position": [
-576,
-16
],
"parameters": {
"triggerTimes": {
"item": [
{
"mode": "custom",
"cronExpression": "0 0 20 * * 1-5"
}
]
}
},
"typeVersion": 1
},
{
"id": "8033211b-22c8-4cc8-89cf-863df591cbfc",
"name": "Data Retrieval Info",
"type": "n8n-nodes-base.stickyNote",
"position": [
-416,
144
],
"parameters": {
"width": 280,
"height": 240,
"content": "## \ud83d\udcca Data Retrieval\n\nFetches all pending tickets from Zendesk using the API.\n\n**Configuration Required**:\n- Zendesk API credentials\n- Filter: status = 'pending'\n- Returns all matching tickets"
},
"typeVersion": 1
},
{
"id": "59b8a5f0-f5be-4e72-b06e-db5eb64d2047",
"name": "Get Pending Tickets",
"type": "n8n-nodes-base.zendesk",
"position": [
-352,
-16
],
"parameters": {
"options": {
"status": "pending"
},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"zendeskApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "39631916-8779-4cf8-b25b-28d0a6aec0ff",
"name": "Filtering Logic",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-288
],
"parameters": {
"width": 280,
"height": 256,
"content": "## \ud83d\udd0d Smart Filtering\n\nFilters tickets based on status and age:\n- Only processes 'pending' status tickets\n- Helps reduce noise and focus on actionable items\n\n**Logic**: status === 'pending'"
},
"typeVersion": 1
},
{
"id": "47f63b74-86d7-4548-80ce-dedacbe5c2e8",
"name": "Filter Pending Tickets",
"type": "n8n-nodes-base.if",
"position": [
-128,
-16
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition1",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "pending"
}
]
}
},
"typeVersion": 2
},
{
"id": "d536f781-1ad8-45e5-a935-76bf15893c32",
"name": "Data Processing",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
128
],
"parameters": {
"width": 280,
"height": 256,
"content": "## \ud83d\udee0\ufe0f Data Processing\n\nFormats and enriches ticket data:\n- Standardizes field names\n- Calculates ticket age and priority levels\n- Adds computed fields for better analysis\n- Prepares data for downstream nodes"
},
"typeVersion": 1
},
{
"id": "41703a6c-69a3-4b5b-ad23-8c3355a4dee1",
"name": "Format Ticket Data",
"type": "n8n-nodes-base.code",
"position": [
96,
-16
],
"parameters": {
"jsCode": "// N8N Code Node - Zendesk Ticket Formatter\n// This code processes Zendesk ticket data and formats it into clean JSON structure\n\n// Function to format individual ticket data\nfunction formatTicketData(ticketData) {\n const createdAt = new Date(ticketData.created_at);\n const updatedAt = new Date(ticketData.updated_at);\n const now = new Date();\n \n return {\n ticket_id: ticketData.id,\n ticket_url: `https://your-domain.zendesk.com/agent/tickets/${ticketData.id}`,\n subject: ticketData.subject || \"No Subject\",\n priority: ticketData.priority || \"normal\",\n status: ticketData.status,\n created_timestamp: createdAt.toISOString(),\n zendesk_created_at: ticketData.created_at,\n description_preview: cleanDescription(ticketData.description),\n tags: Array.isArray(ticketData.tags) ? ticketData.tags.join(', ') : '',\n requester_id: ticketData.requester_id,\n assignee_id: ticketData.assignee_id || 'Unassigned',\n channel: ticketData.via?.channel || \"unknown\",\n ticket_age_hours: Math.round((now - createdAt) / (1000 * 60 * 60)),\n priority_level: getPriorityLevel(ticketData.priority),\n needs_attention: checkNeedsAttention(ticketData, now, createdAt),\n description: ticketData.description || \"No Description\"\n };\n}\n\n// Helper function to get priority level\nfunction getPriorityLevel(priority) {\n const levels = {\n 'low': 1,\n 'normal': 2,\n 'high': 3,\n 'urgent': 4\n };\n return levels[priority] || 2;\n}\n\n// Helper function to clean description for preview\nfunction cleanDescription(description) {\n if (!description) return \"No description available\";\n \n const cleaned = description\n .replace(/<[^>]*>/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n \n return cleaned.length > 100 ? cleaned.substring(0, 100) + '...' : cleaned;\n}\n\n// Helper function to check if ticket needs attention\nfunction checkNeedsAttention(ticketData, now, createdAt) {\n const ageHours = Math.round((now - createdAt) / (1000 * 60 * 60));\n const hasUrgentTag = (ticketData.tags || []).includes('urgent');\n const isHighPriority = ['high', 'urgent'].includes(ticketData.priority);\n \n return ageHours > 24 || hasUrgentTag || isHighPriority;\n}\n\n// Process all input items\nconst processedItems = [];\n\nfor (const item of $input.all()) {\n const originalTicket = item.json;\n const formattedTicket = formatTicketData(originalTicket);\n \n processedItems.push({\n json: formattedTicket\n });\n}\n\nreturn processedItems;"
},
"typeVersion": 2
},
{
"id": "2525d374-d35a-4c26-8cb0-8b73dcb5c26c",
"name": "Data Logging",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
-368
],
"parameters": {
"width": 280,
"height": 240,
"content": "## \ud83d\udcca Data Logging\n\nLogs formatted ticket data to Google Sheets:\n- Maintains historical record\n- Enables reporting and analytics\n- Updates existing tickets or creates new entries\n- Uses Ticket ID as matching column"
},
"typeVersion": 1
},
{
"id": "9a884edc-ba8b-43db-954b-3af4a9787af9",
"name": "Log to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
320,
-112
],
"parameters": {
"columns": {
"value": {
"Tags": "={{ $json.tags }}",
"Status": "={{ $json.status }}",
"Subject": "={{ $json.subject }}",
"Priority": "={{ $json.priority }}",
"Ticket ID": "={{ $json.ticket_id }}",
"Ticket URL": "={{ $json.ticket_url }}",
"Age (Hours)": "={{ $json.ticket_age_hours }}",
"Needs Attention": "={{ $json.needs_attention }}",
"Created Timestamp": "={{ $json.created_timestamp }}",
"Zendesk Created At": "={{ $json.zendesk_created_at }}",
"Description Preview": "={{ $json.description_preview }}"
},
"schema": [
{
"id": "Ticket ID",
"type": "string",
"display": true,
"removed": false,
"required": true,
"displayName": "Ticket ID",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "Ticket URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Ticket URL",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Subject",
"type": "string",
"display": true,
"required": false,
"displayName": "Subject",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Priority",
"type": "string",
"display": true,
"required": false,
"displayName": "Priority",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Created Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Created Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Zendesk Created At",
"type": "string",
"display": true,
"required": false,
"displayName": "Zendesk Created At",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Description Preview",
"type": "string",
"display": true,
"required": false,
"displayName": "Description Preview",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Tags",
"type": "string",
"display": true,
"required": false,
"displayName": "Tags",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Age (Hours)",
"type": "number",
"display": true,
"required": false,
"displayName": "Age (Hours)",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Needs Attention",
"type": "boolean",
"display": true,
"required": false,
"displayName": "Needs Attention",
"defaultMatch": false,
"canBeUsedToMatch": false
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"Ticket ID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultName": "Pending Tickets"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1ctD4fH-PW_h5X4KvnuPWpai_dgaQcedzvdVZN2sKmQY",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ctD4fH-PW_h5X4KvnuPWpai_dgaQcedzvdVZN2sKmQY/edit?usp=drivesdk",
"cachedResultName": "Pending Zendesk Tickets"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4
},
{
"id": "5cf6fc3f-4ee4-4819-8b41-1f39281acaa3",
"name": "Task Management",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
-352
],
"parameters": {
"width": 280,
"height": 224,
"content": "## \u2705 Task Management\n\nCreates ClickUp tasks for ticket tracking:\n- One task per pending ticket\n- Due date based on ticket priority\n- Tags from Zendesk are preserved\n- Helps team track follow-ups"
},
"typeVersion": 1
},
{
"id": "a382eefa-941b-45d1-9936-6ce29cd751cd",
"name": "Create ClickUp Task",
"type": "n8n-nodes-base.clickUp",
"position": [
544,
-112
],
"parameters": {
"list": "901412904902",
"name": "={{ $json.subject }}",
"team": "9014871666",
"space": "90143687238",
"folderless": true,
"additionalFields": {
"tags": "={{ $json.tags }}",
"status": "to do",
"dueDate": "={{ $json.created_timestamp }}",
"priority": "={{ $json.priority_level }}"
}
},
"credentials": {
"clickUpApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "dbc754e3-990a-430d-b3fc-8b5b5a2dd3c9",
"name": "Email Generation",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
224
],
"parameters": {
"width": 280,
"height": 240,
"content": "## \ud83d\udce7 Email Generation\n\nGenerates personalized follow-up emails:\n- Groups tickets by customer email\n- Creates professional HTML emails\n- Includes ticket details and next steps\n- Maintains brand consistency"
},
"typeVersion": 1
},
{
"id": "b2d57a93-f5ec-4058-b2d7-f24d232c2432",
"name": "Generate Follow-up Emails",
"type": "n8n-nodes-base.code",
"position": [
448,
80
],
"parameters": {
"jsCode": "// N8N Code Node - Zendesk Follow-up Email Generator\n// This processes Zendesk ticket data and generates professional follow-up emails\n\n// Input: items[0].json contains the ticket data array\nconst tickets = $input.all();\n\nfunction generateFollowUpEmail(ticketsData) {\n // Filter only pending tickets\n const pendingTickets = ticketsData.filter(ticket => ticket.status === 'pending');\n \n if (pendingTickets.length === 0) {\n return null; // No pending tickets to follow up on\n }\n\n // Group tickets by requester email for personalized emails\n const ticketsByRequester = {};\n pendingTickets.forEach(ticket => {\n // Extract email from description if not directly available\n const emailMatch = ticket.description.match(/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})/);\n const email = emailMatch ? emailMatch[0] : 'user@example.com';\n \n if (!ticketsByRequester[email]) {\n ticketsByRequester[email] = [];\n }\n ticketsByRequester[email].push(ticket);\n });\n\n const emails = [];\n \n Object.entries(ticketsByRequester).forEach(([email, userTickets]) => {\n const htmlContent = generateEmailHTML(userTickets, email);\n \n emails.push({\n to: email,\n subject: `Follow-up on Your Support Request${userTickets.length > 1 ? 's' : ''} - Action Required`,\n html: htmlContent,\n from: 'user@example.com', // Replace with your support email\n ticketCount: userTickets.length,\n ticketIds: userTickets.map(t => t.ticket_id)\n });\n });\n \n return emails;\n}\n\nfunction generateEmailHTML(tickets, customerEmail) {\n const customerName = extractCustomerName(tickets[0].description);\n const currentDate = new Date().toLocaleDateString('en-US', { \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n });\n\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Follow-up on Your Support Request</title>\n <!--[if mso]>\n <xml>\n <o:OfficeDocumentSettings>\n <o:PixelsPerInch>96</o:PixelsPerInch>\n <o:AllowPNG/>\n </o:OfficeDocumentSettings>\n </xml>\n <![endif]-->\n</head>\n<body style=\"margin: 0; padding: 0; font-family: Arial, sans-serif; line-height: 1.4; background-color: #f4f4f4;\">\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #f4f4f4;\">\n <tr>\n <td align=\"center\" valign=\"top\" style=\"padding: 20px 10px;\">\n <!-- Main Container -->\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"600\" style=\"max-width: 600px; background-color: #ffffff;\">\n \n <!-- Header -->\n <tr>\n <td align=\"center\" style=\"background-color: #667eea; color: #ffffff; padding: 30px 20px;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: bold; color: #ffffff;\">Support Team Follow-up</h1>\n <p style=\"margin: 10px 0 0 0; font-size: 14px; color: #ffffff;\">We're here to help resolve your issues</p>\n </td>\n </tr>\n \n <!-- Content -->\n <tr>\n <td style=\"padding: 30px 20px;\">\n \n <!-- Greeting -->\n <p style=\"font-size: 16px; color: #333333; margin-bottom: 20px;\">Dear ${customerName},</p>\n <p style=\"font-size: 16px; color: #333333; margin-bottom: 30px; line-height: 1.5;\">We hope this email finds you well. We wanted to follow up on your recent support request${tickets.length > 1 ? 's' : ''} that ${tickets.length > 1 ? 'are' : 'is'} currently pending resolution.</p>\n \n <!-- Tickets -->\n ${tickets.map(ticket => `\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"margin: 20px 0; background-color: #f8f9fa; border-left: 4px solid #667eea;\">\n <tr>\n <td style=\"padding: 20px;\">\n \n <!-- Ticket Header -->\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"margin-bottom: 15px;\">\n <tr>\n <td align=\"left\">\n <span style=\"background-color: #667eea; color: #ffffff; padding: 6px 12px; font-size: 12px; font-weight: bold; border-radius: 15px; display: inline-block;\">Ticket #${ticket.ticket_id}</span>\n </td>\n <td align=\"right\">\n <span style=\"background-color: #ffc107; color: #856404; padding: 4px 8px; font-size: 11px; font-weight: bold; text-transform: uppercase; border-radius: 10px; display: inline-block; margin-right: 10px;\">Pending</span>\n <span style=\"color: #dc3545; font-size: 12px; font-weight: bold;\">${ticket.ticket_age_hours} hours old</span>\n </td>\n </tr>\n </table>\n \n <!-- Ticket Subject -->\n <h3 style=\"margin: 0 0 10px 0; font-size: 16px; font-weight: bold; color: #333333;\">${cleanSubject(ticket.subject)}</h3>\n \n <!-- Ticket Description -->\n <p style=\"margin: 0; color: #666666; font-size: 14px; line-height: 1.5;\">${cleanDescription(ticket.description)}</p>\n \n </td>\n </tr>\n </table>\n `).join('')}\n \n <!-- CTA Section -->\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"margin: 30px 0;\">\n <tr>\n <td align=\"center\">\n <p style=\"font-size: 16px; font-weight: bold; color: #333333; margin-bottom: 20px;\">Need immediate assistance or want to provide additional information?</p>\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n <tr>\n <td align=\"center\" style=\"background-color: #667eea; border-radius: 4px;\">\n <a href=\"https://softwarecompany-66332.zendesk.com/hc/en-us\" style=\"display: block; padding: 12px 30px; color: #ffffff; text-decoration: none; font-weight: bold; font-size: 14px;\">Visit Support Portal</a>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n \n <!-- Contact Info Box -->\n <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #e3f2fd; margin: 20px 0;\">\n <tr>\n <td align=\"center\" style=\"padding: 20px;\">\n <p style=\"margin: 0 0 10px 0; font-weight: bold; color: #333333;\">Quick Response Options:</p>\n <p style=\"margin: 0; color: #666666; line-height: 1.6;\">\n \ud83d\udce7 Reply directly to this email<br>\n \ud83d\udcde Call us at: 1-800-SUPPORT<br>\n \ud83d\udcac Live Chat: Available Mon-Fri, 9 AM - 6 PM EST\n </p>\n </td>\n </tr>\n </table>\n \n <!-- Main Content -->\n <p style=\"font-size: 16px; color: #333333; line-height: 1.5; margin: 20px 0;\">Our team is actively working on resolving your ${tickets.length > 1 ? 'requests' : 'request'}, and we appreciate your patience. If you have any additional information that might help us resolve ${tickets.length > 1 ? 'these issues' : 'this issue'} faster, please don't hesitate to reply to this email.</p>\n \n <p style=\"font-size: 16px; color: #333333; line-height: 1.5; margin: 20px 0;\">We value your business and are committed to providing you with the best possible support experience.</p>\n \n <!-- Signature -->\n <p style=\"font-size: 16px; color: #333333; line-height: 1.5; margin: 30px 0 0 0;\">\n Best regards,<br>\n <strong>Customer Support Team</strong><br>\n Software Company\n </p>\n \n </td>\n </tr>\n \n <!-- Footer -->\n <tr>\n <td align=\"center\" style=\"background-color: #f8f9fa; padding: 20px; border-top: 1px solid #dee2e6;\">\n <p style=\"margin: 0 0 10px 0; color: #666666; font-size: 12px;\">This is an automated follow-up email regarding your pending support tickets.</p>\n <p style=\"margin: 0 0 10px 0; color: #666666; font-size: 12px;\">Software Company | 123 Business Ave, Suite 100 | City, State 12345</p>\n <p style=\"margin: 0; color: #666666; font-size: 12px;\">\u00a9 ${new Date().getFullYear()} Software Company. All rights reserved.</p>\n </td>\n </tr>\n \n </table>\n </td>\n </tr>\n </table>\n</body>\n</html>`;\n}\n\nfunction extractCustomerName(description) {\n // Try to extract name from description\n const namePatterns = [\n /Best regards,\\s*([^\\n\\r]+)/i,\n /Sincerely,\\s*([^\\n\\r]+)/i,\n /Thanks,\\s*([^\\n\\r]+)/i,\n /([A-Z][a-z]+ [A-Z][a-z]+)/\n ];\n \n for (const pattern of namePatterns) {\n const match = description.match(pattern);\n if (match && match[1]) {\n return match[1].trim().replace(/[^\\w\\s]/g, '');\n }\n }\n \n return 'Valued Customer';\n}\n\nfunction cleanSubject(subject) {\n // Remove HTML tags and clean up subject\n return subject.replace(/<[^>]*>/g, '').trim() || 'Support Request';\n}\n\nfunction cleanDescription(description) {\n // Clean HTML and extract first meaningful sentence\n const cleaned = description.replace(/<[^>]*>/g, '').replace(/\\s+/g, ' ').trim();\n const firstSentence = cleaned.split('.')[0];\n return firstSentence.length > 100 ? firstSentence.substring(0, 100) + '...' : firstSentence + '.';\n}\n\n// Process the input data\nconst ticketData = tickets.map(item => item.json).flat();\nconst followUpEmails = generateFollowUpEmail(ticketData);\n\n// Return the generated emails for n8n to process\nif (followUpEmails && followUpEmails.length > 0) {\n return followUpEmails.map(email => ({ json: email }));\n} else {\n return [{ json: { message: \"No pending tickets found for follow-up\" } }];\n}"
},
"typeVersion": 2
},
{
"id": "69c121ab-d596-4f78-abb3-7f31528400d5",
"name": "Email Delivery",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
224
],
"parameters": {
"width": 280,
"height": 288,
"content": "## \ud83d\udce4 Email Delivery\n\nSends professional follow-up emails via Gmail:\n- Uses HTML formatted emails\n- Personalizes content per customer\n- Includes all relevant ticket information\n- Maintains professional branding\n\n**Requires**: Gmail OAuth2 credentials"
},
"typeVersion": 1
},
{
"id": "63310af9-28b6-45b7-99ef-638490caf9e1",
"name": "Send Follow-up Email",
"type": "n8n-nodes-base.gmail",
"position": [
800,
80
],
"parameters": {
"toList": [
"={{ $json.to }}"
],
"message": "Follow-up on your pending support request. Please check the detailed information in the HTML version of this email.",
"subject": "={{ $json.subject }}",
"resource": "message",
"htmlMessage": "={{ $json.html }}",
"includeHtml": true,
"additionalFields": {}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "8c857db1-0f63-4cbb-a869-a7eec9bc9d0a",
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Get Pending Tickets",
"type": "main",
"index": 0
}
]
]
},
"Format Ticket Data": {
"main": [
[
{
"node": "Log to Google Sheets",
"type": "main",
"index": 0
},
{
"node": "Generate Follow-up Emails",
"type": "main",
"index": 0
}
]
]
},
"Get Pending Tickets": {
"main": [
[
{
"node": "Filter Pending Tickets",
"type": "main",
"index": 0
}
]
]
},
"Log to Google Sheets": {
"main": [
[
{
"node": "Create ClickUp Task",
"type": "main",
"index": 0
}
]
]
},
"Filter Pending Tickets": {
"main": [
[
{
"node": "Format Ticket Data",
"type": "main",
"index": 0
}
]
]
},
"Generate Follow-up Emails": {
"main": [
[
{
"node": "Send Follow-up Email",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
clickUpApigmailOAuth2googleSheetsOAuth2ApizendeskApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automate Zendesk ticket follow-up management by fetching pending tickets daily, enriching and logging them into Google Sheets, creating ClickUp tasks for team reminders, and sending professional follow-up emails to customers. Keeps your support pipeline clean and ensures no…
Source: https://n8n.io/workflows/8743/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Automatically extract structured information from emails using AI-powered document analysis. This workflow processes emails from specified domains, classifies them by type, and extracts structured dat
This weekly workflow helps you stay on top of SEO visibility losses by automatically detecting when your previously strong keywords fall out of Google’s top 10 results.
What This Flow Does
This n8n workflow sends personalized outreach emails automatically while enforcing strict safety rules such as email validation, spam checks, daily limits, and human-like delays.
This n8n template allows you to automatically monitor your company's budget by comparing live Bexio accounting data against targets defined in Google Sheets, sending automated weekly email reports. It