{
  "workflow": {
    "id": 8814,
    "name": "Track support performance metrics across Zendesk & Freshdesk with Sheets, Slack & Gmail",
    "views": 224,
    "recentViews": 0,
    "totalViews": 224,
    "createdAt": "2025-09-22T06:30:46.576Z",
    "description": "## Description\nAutomatically consolidate Zendesk and Freshdesk ticket data into a unified performance dashboard with KPI calculations, Google Sheets logging, real-time Slack alerts, and weekly Gmail email reports. Provides complete visibility into support operations, SLA compliance, and customer satisfaction across multiple platforms. 📊💬📧\n\n## What This Template Does\n- Runs weekly on schedule to fetch tickets from both Zendesk and Freshdesk. ⏰\n- Merges ticket data into a standardized JSON structure with normalized priorities, statuses, and channels. 🔄\n- Logs all tickets and metadata into Google Sheets for audit-ready performance tracking. 📑\n- Calculates advanced KPIs including resolution rates, SLA breaches, CSAT score estimation, urgent ticket rates, and performance grading. 📊\n- Evaluates alert conditions (e.g., high SLA breach, low CSAT, backlog risk). 🚨\n- Sends formatted Slack alerts with performance grades, key metrics, and recommendations. 💬\n- Generates corporate-style HTML weekly reports and delivers them via Gmail. 📧\n\n## Key Benefits\n- Unifies Zendesk and Freshdesk data into one consistent reporting flow. 🌐\n- Provides actionable KPIs for SLA monitoring, customer satisfaction, and backlog health. ⏱️\n- Ensures leadership visibility with Google Sheets logs and professional email reports. 🧾\n- Alerts the support team instantly on Slack when performance drops. 🚨\n- Reduces manual data analysis with automated grading and recommendations. 🤖\n\n## Features\n- Multi-Platform Ticket Integration – Fetches tickets from Zendesk and Freshdesk. 🎫\n- Data Normalization – Cleans descriptions, maps priorities/statuses, and detects escalations. 🧼\n- Google Sheets Logging – Tracks tickets with IDs, URLs, tags, timestamps, and metadata. 📈\n- KPI Calculation Engine – Computes SLA breach rate, resolution rate, CSAT, escalation %, and more. 🧮\n- Performance Grading – Grades support performance (A–D) with detailed descriptions. 🏅\n- Slack Alerts – Notifies with active alerts, recommendations, and emoji-based health signals. 📢\n- Weekly Gmail Reports – Delivers branded HTML reports for management and audits. ✨\n\n## Requirements\n- n8n instance (cloud or self-hosted).\n- Zendesk API credentials with ticket read access.\n- Freshdesk API credentials with ticket read access.\n- Google Sheets OAuth2 credentials with spreadsheet write permissions.\n- Slack Bot API credentials with posting permissions.\n- Gmail OAuth2 credentials with send email permissions.\n- Pre-configured Google Sheet for KPI logging.\n\n## Target Audience\n- Support managers overseeing multi-platform ticketing systems. 👩‍💻\n- Customer success teams monitoring SLA compliance and CSAT health. 🚀\n- SMBs running Zendesk + Freshdesk who need unified dashboards. 🏢\n- Remote/global support teams needing automated KPI visibility. 🌐\n- Executives requiring weekly performance reports and recommendations. 📈\n\n## Step-by-Step Setup Instructions\n- Connect Zendesk, Freshdesk, Google Sheets, Slack, and Gmail credentials in n8n. 🔑\n- Update the Google Sheet ID in the “Log KPIs in Google Sheets” node. 📊\n- Configure Slack channel ID for alerts (default: zendesk-churn-alerts). 💬\n- Replace {Enter Your Email} in the Gmail node with your recipient email. 📧\n- Adjust thresholds in the KPI calculation node (default: 4h response, 24h resolution). ⏱️\n- Test with sample tickets to validate Sheets logging, Slack alerts, and Gmail reports. ✅\n- Deploy on schedule (default: weekly at 8 PM) for continuous tracking. 🗓️\n",
    "workflow": {
      "id": "QyegIMfwfC0kN3kN",
      "meta": {
        "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
        "templateCredsSetupCompleted": true
      },
      "name": "Unified Support Team Performance Dashboard (Zendesk & Freshdesk → Google Sheets + Slack + Gmail)",
      "tags": [],
      "nodes": [
        {
          "id": "af98b36c-8053-4882-b3ba-2b90fb5c7523",
          "name": "Send Slack Alert",
          "type": "n8n-nodes-base.slack",
          "position": [
            1936,
            -64
          ],
          "webhookId": "830d4420-a0bc-4f78-b5d2-178ee2154efc",
          "parameters": {
            "text": "={{ $json.text }}",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "C09FM9N8UEA",
              "cachedResultName": "zendesk-YOUR_OPENAI_KEY_HERE-alerts"
            },
            "otherOptions": {
              "mrkdwn": true
            }
          },
          "credentials": {
            "slackApi": {
              "id": "credential-id",
              "name": "slackApi Credential"
            }
          },
          "typeVersion": 2.2
        },
        {
          "id": "df0ba9dc-3737-4030-a225-e58cd3c17a86",
          "name": "Send Weekly Email",
          "type": "n8n-nodes-base.gmail",
          "position": [
            1936,
            128
          ],
          "parameters": {
            "toList": [
              "{Enter Your  Email}"
            ],
            "message": "=Support Dashboard Alert",
            "subject": "={{ $json.subject }}",
            "resource": "message",
            "htmlMessage": "={{ $json.html }}",
            "includeHtml": true,
            "additionalFields": {}
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "b96bf81b-8486-4545-b23e-518643ca9b89",
          "name": "Weekly Trigger",
          "type": "n8n-nodes-base.cron",
          "position": [
            0,
            32
          ],
          "parameters": {
            "triggerTimes": {
              "item": [
                {
                  "hour": 20,
                  "mode": "everyWeek"
                }
              ]
            }
          },
          "typeVersion": 1
        },
        {
          "id": "bb68236c-376b-4c00-80fd-6db781100bc2",
          "name": "Fetch Tickets From Zendesk",
          "type": "n8n-nodes-base.zendesk",
          "position": [
            368,
            -64
          ],
          "parameters": {
            "options": {},
            "operation": "getAll",
            "returnAll": true
          },
          "credentials": {
            "zendeskApi": {
              "id": "credential-id",
              "name": "zendeskApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "972d1914-47a0-48a3-8018-46519599bc2f",
          "name": "Log KPIs in Google Sheets",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            1040,
            32
          ],
          "parameters": {
            "columns": {
              "value": {},
              "schema": [
                {
                  "id": "platform",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "platform",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "ticket_id",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "ticket_id",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "ticket_url",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "ticket_url",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "subject",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "subject",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "priority",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "priority",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "priority_level",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "priority_level",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "status",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "status",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "status_normalized",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "status_normalized",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "created_timestamp",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "created_timestamp",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "updated_timestamp",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "updated_timestamp",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "original_created_at",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "original_created_at",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "description_preview",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "description_preview",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "description",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "description",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "tags",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "tags",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "requester_id",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "requester_id",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "assignee_id",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "assignee_id",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "channel",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "channel",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "ticket_age_hours",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "ticket_age_hours",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "needs_attention",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "needs_attention",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "ticket_type",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "ticket_type",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "due_by",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "due_by",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "is_escalated",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "is_escalated",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "sentiment_score",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "sentiment_score",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                }
              ],
              "mappingMode": "autoMapInputData",
              "matchingColumns": [
                "ticket_id"
              ],
              "attemptToConvertTypes": false,
              "convertFieldsToString": false
            },
            "options": {},
            "operation": "appendOrUpdate",
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": "gid=0",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VLAw8-Om4ULgGFfG_xwYdgni1uggTAP0UA24Nfop3RQ/edit#gid=0",
              "cachedResultName": "Sheet1"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "1VLAw8-Om4ULgGFfG_xwYdgni1uggTAP0UA24Nfop3RQ",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1VLAw8-Om4ULgGFfG_xwYdgni1uggTAP0UA24Nfop3RQ/edit?usp=drivesdk",
              "cachedResultName": "Performance Report Support"
            }
          },
          "credentials": {
            "googleSheetsOAuth2Api": {
              "id": "credential-id",
              "name": "googleSheetsOAuth2Api Credential"
            }
          },
          "typeVersion": 4.4
        },
        {
          "id": "42d5b2ac-2c2b-44ad-bb68-654213112f67",
          "name": "Calculate Support KPIs",
          "type": "n8n-nodes-base.code",
          "position": [
            1264,
            32
          ],
          "parameters": {
            "jsCode": "// Unified KPI Calculation Code Node for n8n Support Team Performance\n// Handles both Zendesk and Freshdesk tickets\n// Get all input items from n8n\nconst inputItems = $input.all();\nlet tickets = [];\n\n// Extract tickets from all input items\ninputItems.forEach(item => {\n  if (item.json) {\n    if (Array.isArray(item.json)) {\n      // If the item contains an array of tickets\n      tickets = tickets.concat(item.json);\n    } else {\n      // If the item is a single ticket\n      tickets.push(item.json);\n    }\n  }\n});\n\nconsole.log('Total tickets processed:', tickets.length);\n\n// Configuration thresholds (you can adjust these or get from previous node)\nconst thresholds = {\n  response_time_hours: 4,     // 4 hours response time threshold\n  resolution_time_hours: 24,  // 24 hours resolution time threshold\n  csat_threshold: 4.0,        // Minimum CSAT score\n  high_priority_threshold: 48, // Hours for high priority escalation\n};\n\n// Initialize KPI tracking variables\nlet totalTickets = tickets.length;\nlet resolvedTickets = 0;\nlet openTickets = 0;\nlet urgentTickets = 0;\nlet highPriorityTickets = 0;\nlet slaBreachedTickets = 0;\nlet channelDistribution = {};\nlet priorityDistribution = { low: 0, medium: 0, normal: 0, high: 0, urgent: 0 };\nlet platformDistribution = { zendesk: 0, freshdesk: 0, unknown: 0 };\nlet totalAgeHours = 0;\nlet needsAttentionCount = 0;\nlet escalatedTickets = 0;\nlet overdueTickets = 0;\n\n// Enhanced status mapping for both platforms\nfunction isTicketResolved(ticket) {\n  const resolvedStatuses = {\n    zendesk: ['solved', 'closed'],\n    freshdesk: ['resolved', 'closed']\n  };\n  \n  const platform = ticket.platform || 'zendesk';\n  const normalizedStatus = ticket.status_normalized || ticket.status;\n  \n  return resolvedStatuses[platform]?.includes(normalizedStatus) || \n         resolvedStatuses[platform]?.includes(ticket.status) ||\n         ['solved', 'closed', 'resolved'].includes(normalizedStatus);\n}\n\n// Enhanced priority normalization\nfunction normalizePriority(ticket) {\n  const platform = ticket.platform || 'zendesk';\n  let priority = ticket.priority;\n  \n  // Handle Freshdesk numeric priorities that weren't converted\n  if (platform === 'freshdesk' && typeof priority === 'number') {\n    const freshdeskPriorityMap = {\n      1: 'low',\n      2: 'medium',\n      3: 'high',\n      4: 'urgent'\n    };\n    priority = freshdeskPriorityMap[priority] || 'normal';\n  }\n  \n  // Normalize medium to normal for consistency\n  if (priority === 'medium') {\n    priority = 'normal';\n  }\n  \n  return priority || 'normal';\n}\n\n// Check if ticket is overdue (for Freshdesk)\nfunction isTicketOverdue(ticket) {\n  if (ticket.platform === 'freshdesk' && ticket.due_by) {\n    const dueDate = new Date(ticket.due_by);\n    const now = new Date();\n    return dueDate < now;\n  }\n  return false;\n}\n\n// Process each ticket\ntickets.forEach(ticket => {\n  // Platform distribution\n  const platform = ticket.platform || 'unknown';\n  platformDistribution[platform] = (platformDistribution[platform] || 0) + 1;\n  \n  // Basic counts\n  if (isTicketResolved(ticket)) {\n    resolvedTickets++;\n  } else {\n    openTickets++;\n  }\n  \n  // Priority analysis with normalization\n  const priority = normalizePriority(ticket);\n  priorityDistribution[priority] = (priorityDistribution[priority] || 0) + 1;\n  \n  if (priority === 'urgent') {\n    urgentTickets++;\n  }\n  if (priority === 'high' || priority === 'urgent') {\n    highPriorityTickets++;\n  }\n  \n  // Channel distribution\n  const channel = ticket.channel || 'unknown';\n  channelDistribution[channel] = (channelDistribution[channel] || 0) + 1;\n  \n  // Age and SLA analysis\n  const ageHours = ticket.ticket_age_hours || 0;\n  totalAgeHours += ageHours;\n  \n  // Escalation tracking (Freshdesk specific)\n  if (ticket.platform === 'freshdesk' && ticket.is_escalated) {\n    escalatedTickets++;\n  }\n  \n  // Overdue tracking (Freshdesk specific)\n  if (isTicketOverdue(ticket)) {\n    overdueTickets++;\n  }\n  \n  // Enhanced SLA breach conditions for both platforms\n  let isSLABreached = false;\n  \n  if (isTicketResolved(ticket)) {\n    // For resolved tickets, check if resolution time exceeded threshold\n    if (ageHours > thresholds.resolution_time_hours) {\n      isSLABreached = true;\n    }\n  } else {\n    // For open tickets, check various conditions\n    if (priority === 'urgent' && ageHours > thresholds.response_time_hours) {\n      isSLABreached = true;\n    } else if ((priority === 'high' || priority === 'urgent') && ageHours > thresholds.high_priority_threshold) {\n      isSLABreached = true;\n    } else if (ageHours > thresholds.resolution_time_hours) {\n      isSLABreached = true;\n    }\n    \n    // Additional Freshdesk-YOUR_OPENAI_KEY_HERE SLA conditions\n    if (ticket.platform === 'freshdesk') {\n      if (ticket.is_escalated || isTicketOverdue(ticket)) {\n        isSLABreached = true;\n      }\n    }\n  }\n  \n  if (isSLABreached) {\n    slaBreachedTickets++;\n  }\n  \n  // Needs attention count\n  if (ticket.needs_attention) {\n    needsAttentionCount++;\n  }\n});\n\n// Calculate averages and percentages\nconst avgTicketAge = totalTickets > 0 ? Math.round(totalAgeHours / totalTickets) : 0;\nconst resolutionRate = totalTickets > 0 ? Math.round((resolvedTickets / totalTickets) * 100) : 0;\nconst slaBreachRate = totalTickets > 0 ? Math.round((slaBreachedTickets / totalTickets) * 100) : 0;\nconst urgentTicketRate = totalTickets > 0 ? Math.round((urgentTickets / totalTickets) * 100) : 0;\nconst highPriorityRate = totalTickets > 0 ? Math.round((highPriorityTickets / totalTickets) * 100) : 0;\nconst attentionRate = totalTickets > 0 ? Math.round((needsAttentionCount / totalTickets) * 100) : 0;\nconst escalationRate = totalTickets > 0 ? Math.round((escalatedTickets / totalTickets) * 100) : 0;\nconst overdueRate = totalTickets > 0 ? Math.round((overdueTickets / totalTickets) * 100) : 0;\n\n// Platform-specific rates\nconst platformRates = {};\nObject.keys(platformDistribution).forEach(platform => {\n  if (platformDistribution[platform] > 0) {\n    platformRates[platform] = Math.round((platformDistribution[platform] / totalTickets) * 100);\n  }\n});\n\n// Enhanced response and resolution time estimation\nconst avgResponseTimeHours = Math.round(avgTicketAge * 0.15); // Estimate 15% of total age\nconst avgResolutionTimeHours = avgTicketAge;\n\n// Enhanced CSAT score calculation\n// In production, fetch actual satisfaction ratings from both platforms\nlet csatScore = 0;\nlet csatCount = 0;\n\n// Simulate CSAT based on platform and performance metrics\ntickets.forEach(ticket => {\n  if (isTicketResolved(ticket)) {\n    // Simulate CSAT based on resolution time and priority\n    let simulatedCsat = 4.5;\n    \n    if (ticket.ticket_age_hours > thresholds.resolution_time_hours * 2) {\n      simulatedCsat -= 1.0;\n    } else if (ticket.ticket_age_hours > thresholds.resolution_time_hours) {\n      simulatedCsat -= 0.5;\n    }\n    \n    if (ticket.priority === 'urgent' || ticket.priority === 'high') {\n      simulatedCsat -= 0.2;\n    }\n    \n    // Add some randomness\n    simulatedCsat += (Math.random() - 0.5) * 0.6;\n    \n    // Ensure bounds\n    simulatedCsat = Math.max(1, Math.min(5, simulatedCsat));\n    \n    csatScore += simulatedCsat;\n    csatCount++;\n  }\n});\n\nconst avgCsatScore = csatCount > 0 ? Math.round((csatScore / csatCount) * 100) / 100 : 4.0;\n\n// Current timestamp\nconst now = new Date();\nconst dateString = now.toISOString().split('T')[0];\nconst timestamp = now.toISOString();\n\n// Build comprehensive KPI object\nconst kpis = {\n  // Metadata\n  date: dateString,\n  timestamp: timestamp,\n  calculation_time: now.toLocaleString(),\n  platforms_included: Object.keys(platformDistribution).filter(p => platformDistribution[p] > 0),\n  \n  // Volume Metrics\n  total_tickets: totalTickets,\n  open_tickets: openTickets,\n  resolved_tickets: resolvedTickets,\n  urgent_tickets: urgentTickets,\n  high_priority_tickets: highPriorityTickets,\n  needs_attention_count: needsAttentionCount,\n  sla_breached_tickets: slaBreachedTickets,\n  escalated_tickets: escalatedTickets,\n  overdue_tickets: overdueTickets,\n  \n  // Performance Metrics\n  avg_ticket_age_hours: avgTicketAge,\n  avg_response_time_hours: avgResponseTimeHours,\n  avg_resolution_time_hours: avgResolutionTimeHours,\n  csat_score: avgCsatScore,\n  csat_sample_size: csatCount,\n  \n  // Rate Metrics (Percentages)\n  resolution_rate: resolutionRate,\n  sla_breach_rate: slaBreachRate,\n  urgent_ticket_rate: urgentTicketRate,\n  high_priority_rate: highPriorityRate,\n  attention_required_rate: attentionRate,\n  escalation_rate: escalationRate,\n  overdue_rate: overdueRate,\n  \n  // Distribution Analysis\n  priority_distribution: priorityDistribution,\n  channel_distribution: channelDistribution,\n  platform_distribution: platformDistribution,\n  platform_rates: platformRates,\n  \n  // Thresholds for Reference\n  thresholds: thresholds\n};\n\n// Enhanced Alert Conditions\nkpis.alerts = {\n  high_sla_breach: slaBreachRate > 20,\n  high_urgent_rate: urgentTicketRate > 15,\n  high_backlog: openTickets > 10,\n  low_resolution_rate: resolutionRate < 70,\n  high_attention_rate: attentionRate > 50,\n  long_avg_age: avgTicketAge > thresholds.resolution_time_hours,\n  low_csat: avgCsatScore < thresholds.csat_threshold,\n  high_escalation_rate: escalationRate > 10,\n  high_overdue_rate: overdueRate > 5\n};\n\n// Overall Alert Flag\nkpis.any_alert = Object.values(kpis.alerts).some(alert => alert === true);\nkpis.alert_count = Object.values(kpis.alerts).filter(alert => alert === true).length;\n\n// Enhanced Performance Grading System\nlet gradePoints = 0;\n\n// Resolution rate (20 points max)\nif (resolutionRate >= 90) gradePoints += 20;\nelse if (resolutionRate >= 80) gradePoints += 16;\nelse if (resolutionRate >= 70) gradePoints += 12;\nelse if (resolutionRate >= 60) gradePoints += 8;\n\n// SLA compliance (20 points max)\nif (slaBreachRate <= 5) gradePoints += 20;\nelse if (slaBreachRate <= 10) gradePoints += 16;\nelse if (slaBreachRate <= 15) gradePoints += 12;\nelse if (slaBreachRate <= 20) gradePoints += 8;\n\n// Response time performance (20 points max)\nif (avgResponseTimeHours <= 2) gradePoints += 20;\nelse if (avgResponseTimeHours <= 4) gradePoints += 16;\nelse if (avgResponseTimeHours <= 8) gradePoints += 12;\nelse if (avgResponseTimeHours <= 12) gradePoints += 8;\n\n// Customer satisfaction (20 points max)\nif (avgCsatScore >= 4.5) gradePoints += 20;\nelse if (avgCsatScore >= 4.0) gradePoints += 16;\nelse if (avgCsatScore >= 3.5) gradePoints += 12;\nelse if (avgCsatScore >= 3.0) gradePoints += 8;\n\n// Platform-specific metrics (20 points max)\nlet platformBonus = 0;\nif (escalationRate <= 5) platformBonus += 10;\nelse if (escalationRate <= 10) platformBonus += 6;\n\nif (overdueRate <= 2) platformBonus += 10;\nelse if (overdueRate <= 5) platformBonus += 6;\n\ngradePoints += platformBonus;\n\nkpis.performance_grade = gradePoints >= 85 ? 'A' : gradePoints >= 70 ? 'B' : gradePoints >= 55 ? 'C' : 'D';\nkpis.grade_percentage = gradePoints;\nkpis.grade_description = \n  gradePoints >= 85 ? 'Excellent Performance' :\n  gradePoints >= 70 ? 'Good Performance' :\n  gradePoints >= 55 ? 'Needs Improvement' : 'Critical Issues';\n\n// Enhanced Productivity Insights\nkpis.insights = {\n  busiest_channel: Object.keys(channelDistribution).length > 0 ? \n    Object.keys(channelDistribution).reduce((a, b) => \n      channelDistribution[a] > channelDistribution[b] ? a : b) : 'none',\n  dominant_priority: Object.keys(priorityDistribution).length > 0 ?\n    Object.keys(priorityDistribution).reduce((a, b) => \n      priorityDistribution[a] > priorityDistribution[b] ? a : b) : 'none',\n  primary_platform: Object.keys(platformDistribution).length > 0 ?\n    Object.keys(platformDistribution).reduce((a, b) => \n      platformDistribution[a] > platformDistribution[b] ? a : b) : 'none',\n  tickets_per_priority: priorityDistribution,\n  tickets_per_channel: channelDistribution,\n  tickets_per_platform: platformDistribution,\n  oldest_ticket_age: tickets.length > 0 ? Math.max(...tickets.map(t => t.ticket_age_hours || 0)) : 0,\n  multi_platform: Object.keys(platformDistribution).filter(p => platformDistribution[p] > 0).length > 1\n};\n\n// Enhanced Recommendations based on KPIs\nkpis.recommendations = [];\n\nif (slaBreachRate > 15) {\n  kpis.recommendations.push(\"High SLA breach rate detected - consider increasing support staff or reviewing priority workflows\");\n}\nif (urgentTicketRate > 20) {\n  kpis.recommendations.push(\"High percentage of urgent tickets - review escalation criteria or provide customer education\");\n}\nif (avgTicketAge > 36) {\n  kpis.recommendations.push(\"Long average ticket age - implement automated routing and priority queue management\");\n}\nif (needsAttentionCount > totalTickets * 0.4) {\n  kpis.recommendations.push(\"High attention-required rate - consider workflow automation or additional training\");\n}\nif (resolutionRate < 75) {\n  kpis.recommendations.push(\"Low resolution rate - focus on closing resolved tickets and improving first-contact resolution\");\n}\nif (escalationRate > 10) {\n  kpis.recommendations.push(\"High escalation rate - review first-line resolution capabilities and knowledge base\");\n}\nif (overdueRate > 5) {\n  kpis.recommendations.push(\"High overdue rate - implement better due date tracking and reminder systems\");\n}\nif (kpis.insights.multi_platform) {\n  kpis.recommendations.push(\"Multi-platform support detected - ensure consistent SLA and quality standards across platforms\");\n}\n\n// Platform-specific insights\nif (platformDistribution.freshdesk > 0) {\n  kpis.freshdesk_metrics = {\n    escalated_tickets: escalatedTickets,\n    overdue_tickets: overdueTickets,\n    escalation_rate: escalationRate,\n    overdue_rate: overdueRate\n  };\n}\n\n// Return the comprehensive KPI data (n8n format)\nreturn [{ \n  json: {\n    kpis: kpis,\n    raw_ticket_count: totalTickets,\n    processing_timestamp: timestamp\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "9bf80187-1b1f-4810-baa7-7234d65f5099",
          "name": "Evaluate Alerts",
          "type": "n8n-nodes-base.if",
          "position": [
            1488,
            32
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 1,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "or",
              "conditions": [
                {
                  "id": "d65c4d80-4613-4790-a08c-57b20182df82",
                  "operator": {
                    "type": "boolean",
                    "operation": "equal"
                  },
                  "leftValue": "={{ $json.kpis.any_alert }}",
                  "rightValue": true
                },
                {
                  "id": "998efe97-543f-42d3-8950-55f7fd4ccbac",
                  "operator": {
                    "type": "boolean",
                    "operation": "true",
                    "singleValue": true
                  },
                  "leftValue": "={{ $json.kpis.alerts.high_sla_breach }}",
                  "rightValue": ""
                }
              ]
            }
          },
          "typeVersion": 2
        },
        {
          "id": "d9a716a3-9732-4d92-b5c3-d84881ca015f",
          "name": "Generate Slack Alert Message",
          "type": "n8n-nodes-base.code",
          "position": [
            1712,
            -64
          ],
          "parameters": {
            "jsCode": "// N8N Code Node - Format Support KPIs for Slack Alert\nconst data = $json.kpis;\n\n// Function to get grade emoji\nfunction getGradeEmoji(grade) {\n  const gradeEmojis = {\n    'A': '🟢',\n    'B': '🟡',\n    'C': '🟠',\n    'D': '🔴',\n    'F': '⛔'\n  };\n  return gradeEmojis[grade] || '❓';\n}\n\n// Function to get alert emoji\nfunction getAlertEmoji(hasAlert) {\n  return hasAlert ? '🚨' : '✅';\n}\n\n// Format priority distribution\nfunction formatPriorityDistribution(priorities) {\n  return Object.entries(priorities)\n    .filter(([_, count]) => count > 0)\n    .map(([priority, count]) => `${priority.charAt(0).toUpperCase() + priority.slice(1)}: ${count}`)\n    .join(' | ');\n}\n\n// Format channel distribution\nfunction formatChannelDistribution(channels) {\n  return Object.entries(channels)\n    .map(([channel, count]) => `${channel.toUpperCase()}: ${count}`)\n    .join(' | ');\n}\n\n// Build the main message\nlet message = `${getAlertEmoji(data.any_alert)} *Support Ticket Dashboard Alert*\\n`;\nmessage += `📊 *Performance Grade:* ${getGradeEmoji(data.performance_grade)} ${data.performance_grade} (${data.grade_percentage}%) - ${data.grade_description}\\n\\n`;\n\n// Key Metrics Section\nmessage += `*📈 Key Metrics*\\n`;\nmessage += `• Total Tickets: ${data.total_tickets}\\n`;\nmessage += `• Open: ${data.open_tickets} | Resolved: ${data.resolved_tickets}\\n`;\nmessage += `• Resolution Rate: ${data.resolution_rate}%\\n`;\nmessage += `• CSAT Score: ${data.csat_score}/5.0\\n\\n`;\n\n// Performance Metrics\nmessage += `*⏱️ Performance Metrics*\\n`;\nmessage += `• Avg Response Time: ${data.avg_response_time_hours}h\\n`;\nmessage += `• Avg Resolution Time: ${data.avg_resolution_time_hours}h\\n`;\nmessage += `• Avg Ticket Age: ${data.avg_ticket_age_hours}h\\n\\n`;\n\n// Priority & Channel Breakdown\nmessage += `*🎯 Breakdown*\\n`;\nmessage += `• Priority: ${formatPriorityDistribution(data.priority_distribution)}\\n`;\nmessage += `• Channels: ${formatChannelDistribution(data.channel_distribution)}\\n\\n`;\n\n// Alerts Section (only if there are alerts)\nif (data.any_alert) {\n  message += `*🚨 Active Alerts (${data.alert_count})*\\n`;\n  \n  if (data.alerts.high_sla_breach) {\n    message += `• ⚠️ High SLA Breach Rate: ${data.sla_breach_rate}%\\n`;\n  }\n  if (data.alerts.high_attention_rate) {\n    message += `• ⚠️ High Attention Required Rate: ${data.attention_required_rate}%\\n`;\n  }\n  if (data.alerts.long_avg_age) {\n    message += `• ⚠️ Long Average Ticket Age: ${data.avg_ticket_age_hours}h\\n`;\n  }\n  if (data.alerts.high_urgent_rate) {\n    message += `• ⚠️ High Urgent Ticket Rate: ${data.urgent_ticket_rate}%\\n`;\n  }\n  if (data.alerts.high_backlog) {\n    message += `• ⚠️ High Backlog: ${data.open_tickets} open tickets\\n`;\n  }\n  if (data.alerts.low_resolution_rate) {\n    message += `• ⚠️ Low Resolution Rate: ${data.resolution_rate}%\\n`;\n  }\n  if (data.alerts.low_csat) {\n    message += `• ⚠️ Low CSAT Score: ${data.csat_score}/5.0\\n`;\n  }\n  message += `\\n`;\n}\n\n// Recommendations Section\nif (data.recommendations && data.recommendations.length > 0) {\n  message += `*💡 Recommendations*\\n`;\n  data.recommendations.forEach(rec => {\n    message += `• ${rec}\\n`;\n  });\n  message += `\\n`;\n}\n\n// Footer with timestamp\nconst reportTime = new Date(data.timestamp).toLocaleString();\nmessage += `_Report generated: ${reportTime}_`;\n\n// Return the formatted message for Slack\nreturn {\n  json: {\n    text: message,\n    // Optional: Add structured blocks for better formatting\n    blocks: [\n      {\n        \"type\": \"header\",\n        \"text\": {\n          \"type\": \"plain_text\",\n          \"text\": `${getAlertEmoji(data.any_alert)} Support Dashboard Alert`,\n          \"emoji\": true\n        }\n      },\n      {\n        \"type\": \"section\",\n        \"text\": {\n          \"type\": \"mrkdwn\",\n          \"text\": message\n        }\n      }\n    ]\n  }\n};"
          },
          "typeVersion": 2
        },
        {
          "id": "fbdbe576-9d94-4328-933e-062e2ba090fb",
          "name": "Generate Weekly HTML Report",
          "type": "n8n-nodes-base.code",
          "position": [
            1712,
            128
          ],
          "parameters": {
            "jsCode": "// N8N Code Node - Generate Corporate Style HTML Email Report\n// Handle different data structures\nlet data;\nif ($json.kpis) {\n    data = $json.kpis;\n} else if ($json[0] && $json[0].kpis) {\n    data = $json[0].kpis;\n} else if (Array.isArray($json) && $json[0] && $json[0].kpis) {\n    data = $json[0].kpis;\n} else {\n    data = $json;\n}\n\n// Validate data\nif (!data || !data.performance_grade) {\n    return {\n        json: {\n            error: \"Invalid data structure. Expected KPIs object with performance_grade property.\",\n            receivedData: $json\n        }\n    };\n}\n\n// Function to get grade styling\nfunction getGradeStyle(grade) {\n    const styles = {\n        'A': { color: '#059669', bg: '#ECFDF5', border: '#10B981' },\n        'B': { color: '#D97706', bg: '#FFFBEB', border: '#F59E0B' },\n        'C': { color: '#DC2626', bg: '#FEF2F2', border: '#EF4444' },\n        'D': { color: '#B91C1C', bg: '#FEF2F2', border: '#DC2626' },\n        'F': { color: '#991B1B', bg: '#FEF2F2', border: '#B91C1C' }\n    };\n    return styles[grade] || { color: '#6B7280', bg: '#F9FAFB', border: '#D1D5DB' };\n}\n\n// Format timestamp\nfunction formatTimestamp(timestamp) {\n    return new Date(timestamp).toLocaleDateString('en-US', {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit'\n    });\n}\n\nconst gradeStyle = getGradeStyle(data.performance_grade);\nconst alertStatus = data.any_alert ? 'ALERT' : 'HEALTHY';\nconst alertColor = data.any_alert ? '#DC2626' : '#059669';\n\n// Generate corporate-style HTML email\nconst htmlReport = `\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Support Dashboard Report</title>\n    <!--[if mso]>\n    <noscript>\n        <xml>\n            <o:OfficeDocumentSettings>\n                <o:PixelsPerInch>96</o:PixelsPerInch>\n            </o:OfficeDocumentSettings>\n        </xml>\n    </noscript>\n    <![endif]-->\n</head>\n<body style=\"margin: 0; padding: 0; font-family: Arial, sans-serif; background-color: #f4f4f4;\">\n    <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #f4f4f4; padding: 20px 0;\">\n        <tr>\n            <td align=\"center\">\n                <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"600\" style=\"background-color: #ffffff; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1);\">\n                    \n                    <!-- Header -->\n                    <tr>\n                        <td style=\"background: linear-gradient(135deg, #1e40af 0%, #3730a3 100%); padding: 30px; text-align: center;\">\n                            <h1 style=\"color: #ffffff; margin: 0; font-size: 24px; font-weight: 600;\">Support Dashboard Report</h1>\n                            <p style=\"color: #e0e7ff; margin: 8px 0 0 0; font-size: 16px;\">Daily Performance Analysis</p>\n                        </td>\n                    </tr>\n\n                    <!-- Status Banner -->\n                    <tr>\n                        <td style=\"padding: 0;\">\n                            <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                <tr>\n                                    <td style=\"background-color: ${alertColor}; color: #ffffff; text-align: center; padding: 12px; font-weight: 600; font-size: 14px; letter-spacing: 0.5px;\">\n                                        SYSTEM STATUS: ${alertStatus}\n                                    </td>\n                                </tr>\n                            </table>\n                        </td>\n                    </tr>\n\n                    <!-- Performance Grade Section -->\n                    <tr>\n                        <td style=\"padding: 30px;\">\n                            <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                <tr>\n                                    <td style=\"text-align: center; padding: 25px; background-color: ${gradeStyle.bg}; border: 2px solid ${gradeStyle.border}; border-radius: 8px;\">\n                                        <div style=\"font-size: 48px; font-weight: 900; color: ${gradeStyle.color}; line-height: 1; margin-bottom: 10px;\">${data.performance_grade}</div>\n                                        <div style=\"font-size: 18px; color: ${gradeStyle.color}; font-weight: 600;\">${data.grade_percentage}% - ${data.grade_description}</div>\n                                    </td>\n                                </tr>\n                            </table>\n                        </td>\n                    </tr>\n\n                    <!-- Key Metrics Grid -->\n                    <tr>\n                        <td style=\"padding: 0 30px 30px 30px;\">\n                            <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                <tr>\n                                    <td style=\"padding-right: 10px; width: 25%;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px;\">\n                                            <tr>\n                                                <td style=\"text-align: center; padding: 20px;\">\n                                                    <div style=\"font-size: 28px; font-weight: 700; color: #1e40af; line-height: 1; margin-bottom: 5px;\">${data.total_tickets}</div>\n                                                    <div style=\"font-size: 12px; color: #64748b; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px;\">Total Tickets</div>\n                                                </td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                    <td style=\"padding-right: 10px; width: 25%;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 6px;\">\n                                            <tr>\n                                                <td style=\"text-align: center; padding: 20px;\">\n                                                    <div style=\"font-size: 28px; font-weight: 700; color: #059669; line-height: 1; margin-bottom: 5px;\">${data.resolved_tickets}</div>\n                                                    <div style=\"font-size: 12px; color: #064e3b; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px;\">Resolved</div>\n                                                </td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                    <td style=\"padding-right: 10px; width: 25%;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: ${data.open_tickets > 0 ? '#fef3c7' : '#f0fdf4'}; border: 1px solid ${data.open_tickets > 0 ? '#fbbf24' : '#bbf7d0'}; border-radius: 6px;\">\n                                            <tr>\n                                                <td style=\"text-align: center; padding: 20px;\">\n                                                    <div style=\"font-size: 28px; font-weight: 700; color: ${data.open_tickets > 0 ? '#d97706' : '#059669'}; line-height: 1; margin-bottom: 5px;\">${data.open_tickets}</div>\n                                                    <div style=\"font-size: 12px; color: ${data.open_tickets > 0 ? '#92400e' : '#064e3b'}; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px;\">Open</div>\n                                                </td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                    <td style=\"width: 25%;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #faf5ff; border: 1px solid #d8b4fe; border-radius: 6px;\">\n                                            <tr>\n                                                <td style=\"text-align: center; padding: 20px;\">\n                                                    <div style=\"font-size: 28px; font-weight: 700; color: #7c3aed; line-height: 1; margin-bottom: 5px;\">${data.csat_score}</div>\n                                                    <div style=\"font-size: 12px; color: #581c87; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px;\">CSAT Score</div>\n                                                </td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                </tr>\n                            </table>\n                        </td>\n                    </tr>\n\n                    <!-- Performance Metrics Section -->\n                    <tr>\n                        <td style=\"padding: 0 30px 30px 30px;\">\n                            <h2 style=\"color: #1f2937; font-size: 18px; font-weight: 600; margin: 0 0 15px 0; border-bottom: 2px solid #e5e7eb; padding-bottom: 8px;\">Performance Metrics</h2>\n                            <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #f8fafc; border-radius: 6px; border: 1px solid #e2e8f0;\">\n                                <tr>\n                                    <td style=\"padding: 15px 20px; border-bottom: 1px solid #e2e8f0;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                            <tr>\n                                                <td style=\"font-weight: 500; color: #374151;\">Average Response Time</td>\n                                                <td align=\"right\" style=\"font-weight: 600; color: ${data.avg_response_time_hours <= data.thresholds.response_time_hours ? '#059669' : '#dc2626'};\">${data.avg_response_time_hours}h</td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                </tr>\n                                <tr>\n                                    <td style=\"padding: 15px 20px; border-bottom: 1px solid #e2e8f0;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                            <tr>\n                                                <td style=\"font-weight: 500; color: #374151;\">Average Resolution Time</td>\n                                                <td align=\"right\" style=\"font-weight: 600; color: ${data.avg_resolution_time_hours <= data.thresholds.resolution_time_hours ? '#059669' : '#dc2626'};\">${data.avg_resolution_time_hours}h</td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                </tr>\n                                <tr>\n                                    <td style=\"padding: 15px 20px; border-bottom: 1px solid #e2e8f0;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                            <tr>\n                                                <td style=\"font-weight: 500; color: #374151;\">Resolution Rate</td>\n                                                <td align=\"right\" style=\"font-weight: 600; color: #059669;\">${data.resolution_rate}%</td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                </tr>\n                                <tr>\n                                    <td style=\"padding: 15px 20px;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                            <tr>\n                                                <td style=\"font-weight: 500; color: #374151;\">SLA Breach Rate</td>\n                                                <td align=\"right\" style=\"font-weight: 600; color: ${data.sla_breach_rate > 20 ? '#dc2626' : '#059669'};\">${data.sla_breach_rate}%</td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                </tr>\n                            </table>\n                        </td>\n                    </tr>\n\n                    ${data.any_alert ? `\n                    <!-- Alerts Section -->\n                    <tr>\n                        <td style=\"padding: 0 30px 30px 30px;\">\n                            <h2 style=\"color: #dc2626; font-size: 18px; font-weight: 600; margin: 0 0 15px 0; border-bottom: 2px solid #fecaca; padding-bottom: 8px;\">⚠️ Active Alerts (${data.alert_count})</h2>\n                            <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #fef2f2; border-radius: 6px; border: 1px solid #fecaca;\">\n                                ${data.alerts.high_sla_breach ? `\n                                <tr>\n                                    <td style=\"padding: 12px 20px; border-bottom: 1px solid #fecaca; color: #b91c1c; font-weight: 500;\">\n                                        🔴 High SLA Breach Rate: ${data.sla_breach_rate}%\n                                    </td>\n                                </tr>` : ''}\n                                ${data.alerts.high_attention_rate ? `\n                                <tr>\n                                    <td style=\"padding: 12px 20px; ${data.alerts.long_avg_age ? 'border-bottom: 1px solid #fecaca;' : ''} color: #b91c1c; font-weight: 500;\">\n                                        🟠 High Attention Required Rate: ${data.attention_required_rate}%\n                                    </td>\n                                </tr>` : ''}\n                                ${data.alerts.long_avg_age ? `\n                                <tr>\n                                    <td style=\"padding: 12px 20px; color: #b91c1c; font-weight: 500;\">\n                                        ⏰ Long Average Ticket Age: ${data.avg_ticket_age_hours}h\n                                    </td>\n                                </tr>` : ''}\n                            </table>\n                        </td>\n                    </tr>\n                    ` : ''}\n\n                    ${data.recommendations && data.recommendations.length > 0 ? `\n                    <!-- Recommendations Section -->\n                    <tr>\n                        <td style=\"padding: 0 30px 30px 30px;\">\n                            <h2 style=\"color: #1e40af; font-size: 18px; font-weight: 600; margin: 0 0 15px 0; border-bottom: 2px solid #dbeafe; padding-bottom: 8px;\">💡 Recommendations</h2>\n                            <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #eff6ff; border-radius: 6px; border: 1px solid #bfdbfe;\">\n                                ${data.recommendations.map((rec, index) => `\n                                <tr>\n                                    <td style=\"padding: 12px 20px; ${index < data.recommendations.length - 1 ? 'border-bottom: 1px solid #bfdbfe;' : ''} color: #1e40af; font-weight: 500;\">\n                                        • ${rec}\n                                    </td>\n                                </tr>`).join('')}\n                            </table>\n                        </td>\n                    </tr>\n                    ` : ''}\n\n                    <!-- Distribution Section -->\n                    <tr>\n                        <td style=\"padding: 0 30px 30px 30px;\">\n                            <h2 style=\"color: #1f2937; font-size: 18px; font-weight: 600; margin: 0 0 15px 0; border-bottom: 2px solid #e5e7eb; padding-bottom: 8px;\">Distribution Analysis</h2>\n                            <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                <tr>\n                                    <td style=\"padding-right: 15px; width: 50%; vertical-align: top;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #ffffff; border: 1px solid #e2e8f0; border-radius: 6px;\">\n                                            <tr>\n                                                <td style=\"padding: 15px 20px; background-color: #f8fafc; font-weight: 600; color: #374151; border-bottom: 1px solid #e2e8f0;\">Priority Distribution</td>\n                                            </tr>\n                                            ${Object.entries(data.priority_distribution).map(([priority, count]) => `\n                                            <tr>\n                                                <td style=\"padding: 10px 20px; border-bottom: 1px solid #f1f5f9;\">\n                                                    <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                                        <tr>\n                                                            <td style=\"text-transform: capitalize; color: #64748b;\">${priority}</td>\n                                                            <td align=\"right\" style=\"font-weight: 600; color: #1f2937;\">${count}</td>\n                                                        </tr>\n                                                    </table>\n                                                </td>\n                                            </tr>`).join('')}\n                                        </table>\n                                    </td>\n                                    <td style=\"width: 50%; vertical-align: top;\">\n                                        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #ffffff; border: 1px solid #e2e8f0; border-radius: 6px;\">\n                                            <tr>\n                                                <td style=\"padding: 15px 20px; background-color: #f8fafc; font-weight: 600; color: #374151; border-bottom: 1px solid #e2e8f0;\">Channel Distribution</td>\n                                            </tr>\n                                            ${Object.entries(data.channel_distribution).map(([channel, count]) => `\n                                            <tr>\n                                                <td style=\"padding: 10px 20px; border-bottom: 1px solid #f1f5f9;\">\n                                                    <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n                                                        <tr>\n                                                            <td style=\"text-transform: uppercase; color: #64748b;\">${channel}</td>\n                                                            <td align=\"right\" style=\"font-weight: 600; color: #1f2937;\">${count}</td>\n                                                        </tr>\n                                                    </table>\n                                                </td>\n                                            </tr>`).join('')}\n                                        </table>\n                                    </td>\n                                </tr>\n                            </table>\n                        </td>\n                    </tr>\n\n                    <!-- Footer -->\n                    <tr>\n                        <td style=\"background-color: #f8fafc; padding: 20px; text-align: center; border-top: 1px solid #e2e8f0;\">\n                            <p style=\"margin: 0; color: #64748b; font-size: 14px; line-height: 1.5;\">\n                                <strong>Report Generated:</strong> ${formatTimestamp(data.timestamp)}<br>\n                                Support Dashboard Analytics System\n                            </p>\n                        </td>\n                    </tr>\n\n                </table>\n            </td>\n        </tr>\n    </table>\n</body>\n</html>\n`;\n\n// Return the corporate-style HTML report\nreturn {\n    json: {\n        html: htmlReport,\n        subject: `Support Dashboard Report - Grade ${data.performance_grade} | ${alertStatus}`,\n        plainText: `Support Ticket Dashboard Report\n\nPerformance Grade: ${data.performance_grade} (${data.grade_percentage}%) - ${data.grade_description}\nStatus: ${alertStatus}\n\nKey Metrics:\n- Total Tickets: ${data.total_tickets}\n- Open: ${data.open_tickets} | Resolved: ${data.resolved_tickets}\n- Resolution Rate: ${data.resolution_rate}%\n- CSAT Score: ${data.csat_score}/5.0\n\nPerformance:\n- Avg Response Time: ${data.avg_response_time_hours}h\n- Avg Resolution Time: ${data.avg_resolution_time_hours}h\n- SLA Breach Rate: ${data.sla_breach_rate}%\n\n${data.any_alert ? `Active Alerts: ${data.alert_count}` : 'No active alerts'}\n\nReport generated: ${formatTimestamp(data.timestamp)}`\n    }\n};"
          },
          "typeVersion": 2
        },
        {
          "id": "a8dd2d83-a156-4290-a846-19cf9abd1591",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -288,
            -96
          ],
          "parameters": {
            "height": 352,
            "content": "## ⏰ Weekly Cron Trigger\n\nThis node runs the workflow automatically on a **weekly schedule**.  \nConfigured to execute every week at the specified hour (20:00).\n\n**Purpose:**\n- Ensures weekly performance reporting.\n- Automates ticket fetching and KPI calculations.\n"
          },
          "typeVersion": 1
        },
        {
          "id": "94e3f206-14af-4b8d-a162-f08942b823a2",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            112,
            -368
          ],
          "parameters": {
            "height": 336,
            "content": "## 🎟️ Fetch Tickets from Zendesk\n\nFetches all ticket data from your **Zendesk account**.\n\n**Details:**\n- Uses Zendesk API credentials.\n- Retrieves tickets with statuses (open, pending, solved, closed).\n- Provides raw ticket data for further formatting."
          },
          "typeVersion": 1
        },
        {
          "id": "862bbe05-8d70-4c61-aeab-9e8c0983610e",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1392,
            192
          ],
          "parameters": {
            "height": 400,
            "content": "## 🚨 Evaluate Alerts\n\nChecks if KPI thresholds have been exceeded and if alerts need to be triggered.\n\n**Alert Triggers:**\n- SLA breach > 20%\n- Low resolution rate\n- High backlog\n- Low CSAT score\n- High urgent or attention rate\n- Long average ticket age\n\n**Output:**\n- Boolean flag `any_alert`\n- Alert count\n"
          },
          "typeVersion": 1
        },
        {
          "id": "811a9d1b-4a72-4aad-8cd6-b369ca74025e",
          "name": "Sticky Note3",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            976,
            224
          ],
          "parameters": {
            "height": 336,
            "content": "## 📑 Log Alerts in Google Sheets\n\nStores ticket and performance data into a **Google Sheet** for auditing.\n\n**Purpose:**\n- Provides a compliance audit trail.\n- Enables historical trend analysis.\n- Logs KPIs and alerts  for future reporting."
          },
          "typeVersion": 1
        },
        {
          "id": "4eb74eb7-93c5-4cc1-bf16-2ae9cac49d59",
          "name": "Sticky Note4",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1200,
            -512
          ],
          "parameters": {
            "height": 528,
            "content": "## 📊 Calculate Support KPIs\n\nProcesses formatted ticket data to compute **key performance metrics**.\n\n**Metrics Calculated:**\n- SLA breach rate\n- Resolution rate\n- Avg response & resolution times\n- CSAT score (simulated or from Zendesk API)\n- Ticket distributions (priority, channel)\n- Attention required tickets\n\n**Also:**\n- Applies thresholds for alerts\n- Generates performance grade (A–D)\n- Builds recommendations list"
          },
          "typeVersion": 1
        },
        {
          "id": "7dc027d7-e021-47c7-9f57-e2b8ac3d0a41",
          "name": "Sticky Note5",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            736,
            -400
          ],
          "parameters": {
            "height": 416,
            "content": "## 🧹 Format Ticket Data (Zendesk & FreshDesk)\n\nCleans and standardizes raw ticket data from both platforms.\nSteps:\n\nAuto-detects platform source (Zendesk vs FreshDesk)\nNormalizes priority, status, and channel fields across platforms\nAdds calculated fields: ticket age, needs_attention flag\nCreates unified JSON output structure"
          },
          "typeVersion": 1
        },
        {
          "id": "f858aee3-3dd8-4f92-a0af-e3c2dcd9aa5d",
          "name": "Sticky Note6",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1648,
            -496
          ],
          "parameters": {
            "height": 416,
            "content": "## 💬 Generate Slack Alert Message\n\nFormats KPI and alert details into a **Slack-ready message**.\n\n**Message Includes:**\n- Performance grade & percentage\n- Key metrics (tickets, SLA, CSAT)\n- Breakdown by priority & channel\n- Active alerts with emojis\n- Recommendations for improvement\n- Timestamp for traceability"
          },
          "typeVersion": 1
        },
        {
          "id": "a0ac0fc2-4ee4-4cda-a16c-01171d483515",
          "name": "Sticky Note7",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1664,
            288
          ],
          "parameters": {
            "height": 464,
            "content": "## 📧 Generate Weekly HTML Report\n\nBuilds a **corporate-style HTML email report**.\n\n**Report Sections:**\n- System status (Healthy / Alert)\n- Performance grade (A–D)\n- Key ticket metrics\n- KPI values with thresholds\n- Active alerts\n- Recommendations\n- Distribution analysis (priority & channel)\n\n**Format:** HTML + plain text fallback"
          },
          "typeVersion": 1
        },
        {
          "id": "eaf1f4d6-c806-40d7-80d7-f6a44185a923",
          "name": "Sticky Note8",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2048,
            -400
          ],
          "parameters": {
            "height": 336,
            "content": "## 📢 Send Alert to Slack\n\nDelivers the formatted alert message into a configured **Slack channel**.\n\n**Purpose:**\n- Immediate visibility for critical issues.\n- Alerts team to SLA breaches, backlog spikes, or low CSAT."
          },
          "typeVersion": 1
        },
        {
          "id": "6bfaa7e3-eb49-4c03-b069-f679de45574a",
          "name": "Sticky Note9",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            2064,
            224
          ],
          "parameters": {
            "height": 336,
            "content": "## ✉️ Email Weekly Report\n\nSends the **weekly HTML report** via Gmail.\n\n**Recipients:** Configured in this node.  \n**Purpose:**\n- Provides managers with weekly performance summaries.\n- Ensures leadership visibility into support KPIs."
          },
          "typeVersion": 1
        },
        {
          "id": "1eb5d03c-4862-4cde-b580-e4c5b6fbf479",
          "name": "Merge",
          "type": "n8n-nodes-base.merge",
          "position": [
            608,
            32
          ],
          "parameters": {},
          "typeVersion": 3.2
        },
        {
          "id": "db824881-6986-4114-a95b-e3dfd6a3e7d1",
          "name": "Sticky Note10",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            96,
            224
          ],
          "parameters": {
            "height": 352,
            "content": " ## 🎫 Fetch Tickets from FreshDesk\nFetches all ticket data from your FreshDesk account.\nDetails:\n\nUses FreshDesk API credentials (API Key authentication).\nRetrieves tickets with statuses (Open, Pending, Resolved, Closed).\nSupports filtering by status, priority, and date ranges.\nProvides raw ticket data for further formatting."
          },
          "typeVersion": 1
        },
        {
          "id": "ced09d5d-a36c-4979-82e1-4375f87df16d",
          "name": "Sticky Note11",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            528,
            192
          ],
          "parameters": {
            "height": 352,
            "content": "## 🔗 Merge Ticket Data\nCombines formatted ticket data from multiple sources into a single stream.\nSteps:\n\nMerges Zendesk and FreshDesk ticket arrays\nMaintains unified data structure from formatter\nPasses combined dataset to KPI calculator\nHandles different input timing and batch sizes"
          },
          "typeVersion": 1
        },
        {
          "id": "3860e769-9d69-4564-9c3a-5584c01e4510",
          "name": "Format  Ticket Data (Zendesk & Freshdesk)",
          "type": "n8n-nodes-base.code",
          "position": [
            816,
            32
          ],
          "parameters": {
            "jsCode": "// N8N Code Node - Unified Ticket Formatter (Zendesk & Freshdesk)\n// This code processes both Zendesk and Freshdesk ticket data and formats them into a clean unified JSON structure\n\n// Function to detect ticket source\nfunction detectTicketSource(ticketData) {\n  // Zendesk tickets have 'via' field and specific URL structure\n  if (ticketData.via || ticketData.url?.includes('zendesk.com')) {\n    return 'zendesk';\n  }\n  // Freshdesk tickets have 'source' as number and different structure\n  if (typeof ticketData.source === 'number' || ticketData.email_config_id) {\n    return 'freshdesk';\n  }\n  return 'unknown';\n}\n\n// Function to format Zendesk ticket data\nfunction formatZendeskTicket(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    platform: 'zendesk',\n    ticket_id: ticketData.id,\n    ticket_url: `https://softwarecompany-66332.zendesk.com/agent/tickets/${ticketData.id}`,\n    subject: ticketData.subject || \"No Subject\",\n    priority: ticketData.priority || \"normal\",\n    priority_level: getZendeskPriorityLevel(ticketData.priority),\n    status: ticketData.status,\n    status_normalized: normalizeZendeskStatus(ticketData.status),\n    created_timestamp: createdAt.toISOString(),\n    updated_timestamp: updatedAt.toISOString(),\n    original_created_at: ticketData.created_at,\n    description_preview: cleanDescription(ticketData.description),\n    description: ticketData.description || \"No 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    needs_attention: checkZendeskNeedsAttention(ticketData, now, createdAt),\n    ticket_type: ticketData.type || 'ticket'\n  };\n}\n\n// Function to format Freshdesk ticket data\nfunction formatFreshdeskTicket(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    platform: 'freshdesk',\n    ticket_id: ticketData.id,\n    ticket_url: `https://your-domain.freshdesk.com/helpdesk/tickets/${ticketData.id}`, // Update with your domain\n    subject: ticketData.subject || \"No Subject\",\n    priority: getFreshdeskPriorityText(ticketData.priority),\n    priority_level: ticketData.priority || 1,\n    status: getFreshdeskStatusText(ticketData.status),\n    status_normalized: normalizeFreshdeskStatus(ticketData.status),\n    created_timestamp: createdAt.toISOString(),\n    updated_timestamp: updatedAt.toISOString(),\n    original_created_at: ticketData.created_at,\n    description_preview: cleanDescription(ticketData.structured_description),\n    description: ticketData.structured_description || \"No Description\",\n    tags: Array.isArray(ticketData.tags) ? ticketData.tags.join(', ') : '',\n    requester_id: ticketData.requester_id,\n    assignee_id: ticketData.responder_id || 'Unassigned',\n    channel: getFreshdeskSourceText(ticketData.source),\n    ticket_age_hours: Math.round((now - createdAt) / (1000 * 60 * 60)),\n    needs_attention: checkFreshdeskNeedsAttention(ticketData, now, createdAt),\n    ticket_type: ticketData.type || 'ticket',\n    due_by: ticketData.due_by,\n    is_escalated: ticketData.is_escalated || false,\n    sentiment_score: ticketData.sentiment_score\n  };\n}\n\n// Helper functions for Zendesk\nfunction getZendeskPriorityLevel(priority) {\n  const levels = {\n    'low': 1,\n    'normal': 2,\n    'high': 3,\n    'urgent': 4\n  };\n  return levels[priority] || 2;\n}\n\nfunction normalizeZendeskStatus(status) {\n  const statusMap = {\n    'new': 'open',\n    'open': 'open',\n    'pending': 'pending',\n    'solved': 'closed',\n    'closed': 'closed'\n  };\n  return statusMap[status] || status;\n}\n\nfunction checkZendeskNeedsAttention(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// Helper functions for Freshdesk\nfunction getFreshdeskPriorityText(priority) {\n  const priorityMap = {\n    1: 'low',\n    2: 'medium',\n    3: 'high',\n    4: 'urgent'\n  };\n  return priorityMap[priority] || 'medium';\n}\n\nfunction getFreshdeskStatusText(status) {\n  const statusMap = {\n    2: 'open',\n    3: 'pending',\n    4: 'resolved',\n    5: 'closed'\n  };\n  return statusMap[status] || 'open';\n}\n\nfunction normalizeFreshdeskStatus(status) {\n  const statusMap = {\n    2: 'open',\n    3: 'pending',\n    4: 'closed',\n    5: 'closed'\n  };\n  return statusMap[status] || 'open';\n}\n\nfunction getFreshdeskSourceText(source) {\n  const sourceMap = {\n    1: 'email',\n    2: 'portal',\n    3: 'phone',\n    7: 'chat',\n    8: 'mobihelp',\n    9: 'feedback_widget',\n    10: 'outbound_email'\n  };\n  return sourceMap[source] || 'unknown';\n}\n\nfunction checkFreshdeskNeedsAttention(ticketData, now, createdAt) {\n  const ageHours = Math.round((now - createdAt) / (1000 * 60 * 60));\n  const isHighPriority = ticketData.priority >= 3; // High or Urgent\n  const isEscalated = ticketData.is_escalated;\n  const isOverdue = ticketData.due_by ? new Date(ticketData.due_by) < now : false;\n  \n  return ageHours > 24 || isHighPriority || isEscalated || isOverdue;\n}\n\n// Common 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, '') // Remove HTML tags\n    .replace(/\\s+/g, ' ') // Replace multiple spaces with single space\n    .trim();\n  \n  return cleaned.length > 100 ? cleaned.substring(0, 100) + '...' : cleaned;\n}\n\n// Main processing function\nfunction formatTicketData(ticketData) {\n  const source = detectTicketSource(ticketData);\n  \n  switch (source) {\n    case 'zendesk':\n      return formatZendeskTicket(ticketData);\n    case 'freshdesk':\n      return formatFreshdeskTicket(ticketData);\n    default:\n      console.warn('Unknown ticket source:', ticketData);\n      return {\n        platform: 'unknown',\n        ticket_id: ticketData.id,\n        subject: ticketData.subject || \"No Subject\",\n        error: 'Unable to determine ticket platform',\n        raw_data: ticketData\n      };\n  }\n}\n\n// Process all input items\nconst processedItems = [];\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": "dda2d4aa-d81e-4066-b650-8f4e749889c3",
          "name": "Fetch Tickets From Freshdesk",
          "type": "n8n-nodes-base.freshdesk",
          "position": [
            368,
            128
          ],
          "parameters": {
            "options": {},
            "operation": "getAll",
            "returnAll": true
          },
          "credentials": {
            "freshdeskApi": {
              "id": "credential-id",
              "name": "freshdeskApi Credential"
            }
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "d4fc6ea9-a3dc-436c-bf4d-a3777e8b2827",
      "connections": {
        "Merge": {
          "main": [
            [
              {
                "node": "Format  Ticket Data (Zendesk & Freshdesk)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Weekly Trigger": {
          "main": [
            [
              {
                "node": "Fetch Tickets From Zendesk",
                "type": "main",
                "index": 0
              },
              {
                "node": "Fetch Tickets From Freshdesk",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Evaluate Alerts": {
          "main": [
            [
              {
                "node": "Generate Slack Alert Message",
                "type": "main",
                "index": 0
              },
              {
                "node": "Generate Weekly HTML Report",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Calculate Support KPIs": {
          "main": [
            [
              {
                "node": "Evaluate Alerts",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Log KPIs in Google Sheets": {
          "main": [
            [
              {
                "node": "Calculate Support KPIs",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Tickets From Zendesk": {
          "main": [
            [
              {
                "node": "Merge",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Generate Weekly HTML Report": {
          "main": [
            [
              {
                "node": "Send Weekly Email",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Tickets From Freshdesk": {
          "main": [
            [
              {
                "node": "Merge",
                "type": "main",
                "index": 1
              }
            ]
          ]
        },
        "Generate Slack Alert Message": {
          "main": [
            [
              {
                "node": "Send Slack Alert",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format  Ticket Data (Zendesk & Freshdesk)": {
          "main": [
            [
              {
                "node": "Log KPIs in Google Sheets",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 24,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 1
        },
        "n8n-nodes-base.code": {
          "count": 4
        },
        "n8n-nodes-base.cron": {
          "count": 1
        },
        "n8n-nodes-base.gmail": {
          "count": 1
        },
        "n8n-nodes-base.merge": {
          "count": 1
        },
        "n8n-nodes-base.slack": {
          "count": 1
        },
        "n8n-nodes-base.zendesk": {
          "count": 1
        },
        "n8n-nodes-base.freshdesk": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 12
        },
        "n8n-nodes-base.googleSheets": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Rahul Joshi",
      "username": "rahul08",
      "bio": "Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.\n\n",
      "verified": true,
      "links": [
        "https://www.linkedin.com/in/callrahul/"
      ],
      "avatar": "https://gravatar.com/avatar/b6cf57822463143589b36ada06fbf6cb1509223a740fae3160b28f1ce41ccc12?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 7,
        "icon": "fa:clock",
        "name": "n8n-nodes-base.cron",
        "codex": {
          "data": {
            "alias": [
              "Time",
              "Scheduler",
              "Polling",
              "Cron",
              "Interval"
            ],
            "details": "The Cron node uses Cron under the hood - a time-based job scheduler in Unix-like computer operating systems. Use this node when you want to trigger workflows periodically, especially in more complex scenarios like \"every Tuesday at 9 am\" or \"Weekdays\".",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-goals-level-up-your-vocabulary-with-vonage-and-n8n/",
                  "icon": "🎯",
                  "label": "2021 Goals: Level Up Your Vocabulary With Vonage and n8n"
                },
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/why-i-chose-n8n-over-zapier-in-2020/",
                  "icon": "😍",
                  "label": "Why I chose n8n over Zapier in 2020"
                },
                {
                  "url": "https://n8n.io/blog/how-to-host-virtual-coffee-breaks-with-n8n/",
                  "icon": "☕️",
                  "label": "How to host virtual coffee breaks with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-sync-data-between-two-systems/",
                  "icon": "🏬",
                  "label": "How to synchronize data between two systems (one-way vs. two-way sync"
                },
                {
                  "url": "https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/",
                  "icon": "📡",
                  "label": "Database Monitoring and Alerting with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/world-poetry-day-workflow/",
                  "icon": "📜",
                  "label": "Celebrating World Poetry Day with a daily poem in Telegram"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/",
                  "icon": "🎨",
                  "label": "Automate Designs with Bannerbear and n8n"
                },
                {
                  "url": "https://n8n.io/blog/tracking-time-spent-in-meetings-with-google-calendar-twilio-and-n8n/",
                  "icon": "🗓",
                  "label": "Tracking Time Spent in Meetings With Google Calendar, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-error-workflows-in-n8n/",
                  "icon": "🌪",
                  "label": "Creating Error Workflows in n8n"
                },
                {
                  "url": "https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/",
                  "icon": "💪",
                  "label": "Using Automation to Boost Productivity in the Workplace"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/",
                  "icon": "🤟",
                  "label": "Creating scheduled text affirmations with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"trigger\",\"schedule\"]",
        "defaults": {
          "name": "Cron",
          "color": "#29a568"
        },
        "iconData": {
          "icon": "clock",
          "type": "icon"
        },
        "displayName": "Cron",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 18,
        "icon": "file:googleSheets.svg",
        "name": "n8n-nodes-base.googleSheets",
        "codex": {
          "data": {
            "alias": [
              "CSV",
              "Sheet",
              "Spreadsheet",
              "GS"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/",
                  "icon": "⏲",
                  "label": "Creating triggers for n8n workflows using polling"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/",
                  "icon": "🍔",
                  "label": "How Honest Burgers Use Automation to Save $100k per year"
                },
                {
                  "url": "https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/",
                  "icon": "💻",
                  "label": "How a digital strategist uses n8n for online marketing"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Data & Storage",
              "Productivity"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\",\"output\"]",
        "defaults": {
          "name": "Google Sheets"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="
        },
        "displayName": "Google Sheets",
        "typeVersion": 5,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          },
          {
            "id": 4,
            "name": "Productivity"
          }
        ]
      },
      {
        "id": 20,
        "icon": "fa:map-signs",
        "name": "n8n-nodes-base.if",
        "codex": {
          "data": {
            "alias": [
              "Router",
              "Filter",
              "Condition",
              "Logic",
              "Boolean",
              "Branch"
            ],
            "details": "The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/",
                  "icon": "🤬",
                  "label": "Create a toxic language detector for Telegram in 4 step"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/",
                  "icon": "🏷️",
                  "label": "How to automatically manage contributions to open-source projects"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "If",
          "color": "#408000"
        },
        "iconData": {
          "icon": "map-signs",
          "type": "icon"
        },
        "displayName": "If",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 24,
        "icon": "file:merge.svg",
        "name": "n8n-nodes-base.merge",
        "codex": {
          "data": {
            "alias": [
              "Join",
              "Concatenate",
              "Wait"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/how-to-sync-data-between-two-systems/",
                  "icon": "🏬",
                  "label": "How to synchronize data between two systems (one-way vs. two-way sync"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Merge"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Merge",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 40,
        "icon": "file:slack.svg",
        "name": "n8n-nodes-base.slack",
        "codex": {
          "data": {
            "alias": [
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/slack/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Slack"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Slack",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 65,
        "icon": "file:freshdesk.svg",
        "name": "n8n-nodes-base.freshdesk",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.freshdesk/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/freshdesk/"
                }
              ]
            },
            "categories": [
              "Communication"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Freshdesk"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE5Ljk5IDM5Ljk3NDlDMTQuNjg5NiAzOS45NzM2IDkuNjA2NTggMzcuODY3NyA1Ljg1ODE3IDM0LjEyMDNDMi4xMDk3NiAzMC4zNzI4IDAuMDAyNjYyNjggMjUuMjkwMyAwIDE5Ljk5QzAuMDAxMzMxNDcgMTQuNjg4NyAyLjEwNzg0IDkuNjA0OTUgNS44NTYzOSA1Ljg1NjM5QzkuNjA0OTUgMi4xMDc4NCAxNC42ODg3IDAuMDAxMzMxNDcgMTkuOTkgMEwzNC45Nzc0IDBDMzYuMzA5NSAwIDM3LjU4NyAwLjUyOTE2NSAzOC41Mjg5IDEuNDcxMDlDMzkuNDcwOCAyLjQxMzAxIDQwIDMuNjkwNTIgNDAgNS4wMjI2VjE5Ljk5QzM5Ljk5ODcgMjIuNjE2MiAzOS40OCAyNS4yMTY0IDM4LjQ3MzYgMjcuNjQyMUMzNy40NjczIDMwLjA2NzggMzUuOTkyOSAzMi4yNzE1IDM0LjEzNDcgMzQuMTI3NEMzMi4yNzY2IDM1Ljk4MzIgMzAuMDcxIDM3LjQ1NDggMjcuNjQ0IDM4LjQ1ODFDMjUuMjE3IDM5LjQ2MTUgMjIuNjE2MiAzOS45NzY5IDE5Ljk5IDM5Ljk3NDlaIiBmaWxsPSIjMjBBODQ5Ii8+CjxwYXRoIGQ9Ik0xOS45NjQ5IDkuOTk1QzE4Ljg3NjIgOS45ODkgMTcuNzk3MiAxMC4xOTkgMTYuNzkwMiAxMC42MTI5QzE1Ljc4MzMgMTEuMDI2NyAxNC44Njg0IDExLjYzNjIgMTQuMDk4NiAxMi40MDZDMTMuMzI4OCAxMy4xNzU4IDEyLjcxOTMgMTQuMDkwNyAxMi4zMDU1IDE1LjA5NzZDMTEuODkxNiAxNi4xMDQ2IDExLjY4MTYgMTcuMTgzNiAxMS42ODc2IDE4LjI3MjJWMjMuNzk3MUMxMS42ODc2IDI0LjUzMTUgMTEuOTc5IDI1LjIzNiAxMi40OTc5IDI1Ljc1NThDMTMuMDE2NyAyNi4yNzU2IDEzLjcyMDYgMjYuNTY4MyAxNC40NTUxIDI2LjU2OTZIMTYuNzYwNVYyMC4wOTA0SDEzLjU2MTFWMTguMjcyMkMxMy41NjExIDE3LjQyNiAxMy43Mjc3IDE2LjU4ODEgMTQuMDUxNiAxNS44MDYyQzE0LjM3NTQgMTUuMDI0NCAxNC44NTAxIDE0LjMxNCAxNS40NDg1IDEzLjcxNTdDMTYuMDQ2OCAxMy4xMTczIDE2Ljc1NzIgMTIuNjQyNiAxNy41MzkgMTIuMzE4OEMxOC4zMjA5IDExLjk5NDkgMTkuMTU4OCAxMS44MjgyIDIwLjAwNTEgMTEuODI4MkMyMC44NTEzIDExLjgyODIgMjEuNjg5MiAxMS45OTQ5IDIyLjQ3MTEgMTIuMzE4OEMyMy4yNTI5IDEyLjY0MjYgMjMuOTYzMyAxMy4xMTczIDI0LjU2MTYgMTMuNzE1N0MyNS4xNiAxNC4zMTQgMjUuNjM0NyAxNS4wMjQ0IDI1Ljk1ODUgMTUuODA2MkMyNi4yODI0IDE2LjU4ODEgMjYuNDQ5MSAxNy40MjYgMjYuNDQ5IDE4LjI3MjJWMjAuMDkwNEgyMy4yMzk2VjI2LjU1NDVIMjUuMzk5M1YyNi43MDAyQzI1LjM5MTUgMjcuMzU1OCAyNS4xMjc2IDI3Ljk4MjMgMjQuNjY0IDI4LjQ0NkMyNC4yMDAzIDI4LjkwOTYgMjMuNTczOCAyOS4xNzM1IDIyLjkxODIgMjkuMTgxM0gyMC40MDY5QzIwLjMwMiAyOS4xODI2IDIwLjIwMTkgMjkuMjI0OSAyMC4xMjc3IDI5LjI5OUMyMC4wNTM2IDI5LjM3MzEgMjAuMDExNCAyOS40NzMzIDIwLjAxMDEgMjkuNTc4MUMyMC4wMTE0IDI5LjY4MyAyMC4wNTM2IDI5Ljc4MzEgMjAuMTI3NyAyOS44NTczQzIwLjIwMTkgMjkuOTMxNCAyMC4zMDIgMjkuOTczNiAyMC40MDY5IDI5Ljk3NDlIMjIuODE3N0MyMy4yNTM0IDI5Ljk3NjIgMjMuNjg1MSAyOS44OTE0IDI0LjA4NzggMjkuNzI1M0MyNC40OTA2IDI5LjU1OTIgMjQuODU2NiAyOS4zMTUgMjUuMTY0NyAyOS4wMDY5QzI1LjQ3MjggMjguNjk4OSAyNS43MTY5IDI4LjMzMjkgMjUuODgzIDI3LjkzMDFDMjYuMDQ5MSAyNy41MjczIDI2LjEzNCAyNy4wOTU3IDI2LjEzMjYgMjYuNjZWMjYuNDg0MkMyNi43MTg0IDI2LjMyNDIgMjcuMjM1OCAyNS45NzY5IDI3LjYwNTggMjUuNDk1NEMyNy45NzU4IDI1LjAxMzggMjguMTc4MSAyNC40MjQ1IDI4LjE4MTggMjMuODE3MlYxOC4yOTIzQzI4LjE5NDUgMTcuMjA2IDI3Ljk5MTIgMTYuMTI3OSAyNy41ODM3IDE1LjEyMDhDMjcuMTc2MiAxNC4xMTM3IDI2LjU3MjggMTMuMTk3NSAyNS44MDgzIDEyLjQyNTZDMjUuMDQzOCAxMS42NTM2IDI0LjEzMzYgMTEuMDQxMiAyMy4xMzA0IDEwLjYyNEMyMi4xMjczIDEwLjIwNjcgMjEuMDUxMyA5Ljk5MjkzIDE5Ljk2NDkgOS45OTVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K"
        },
        "displayName": "Freshdesk",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          }
        ]
      },
      {
        "id": 123,
        "icon": "file:zendesk.svg",
        "name": "n8n-nodes-base.zendesk",
        "codex": {
          "data": {
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.zendesk/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/zendesk/"
                }
              ]
            },
            "categories": [
              "Communication"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Zendesk"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTAgMjRDMCAxMC43NDUgMTAuNzQ1IDAgMjQgMHMyNCAxMC43NDUgMjQgMjQtMTAuNzQ1IDI0LTI0IDI0UzAgMzcuMjU1IDAgMjQiLz48cGF0aCBmaWxsPSIjMDMzNjNEIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNS40NDggMTguNjUzYzQuMDUgMCA3LjMzMi0zLjM3NSA3LjMzMi03LjUzOEg4LjExNmMwIDQuMTYzIDMuMjgzIDcuNTM4IDcuMzMyIDcuNTM4bTcuMzMyIDE3LjE5OVYxNy42NDhMOC4xMTYgMzUuODUyem0yLjQxNSAwYzAtNC4xNjQgMy4yODMtNy41NCA3LjMzMi03LjU0IDQuMDUgMCA3LjMzMiAzLjM3NiA3LjMzMiA3LjU0em0wLTI0LjczN3YxOC4yMDNMMzkuODYgMTEuMTE1eiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+"
        },
        "displayName": "Zendesk",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          }
        ]
      },
      {
        "id": 356,
        "icon": "file:gmail.svg",
        "name": "n8n-nodes-base.gmail",
        "codex": {
          "data": {
            "alias": [
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/",
                  "icon": "💪",
                  "label": "Using Automation to Boost Productivity in the Workplace"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Gmail"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"
        },
        "displayName": "Gmail",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 40,
        "name": "Support Chatbot"
      }
    ],
    "image": []
  }
}