{
  "workflow": {
    "id": 9489,
    "name": "Process customer feedback with OpenAI, PDF reports, Gmail & Slack notifications",
    "views": 206,
    "recentViews": 0,
    "totalViews": 206,
    "createdAt": "2025-10-11T09:28:26.496Z",
    "description": "# AI-Powered Feedback Automation with PDF Reports & Team Notifications\n\n**Transform customer feedback into actionable insights automatically with AI analysis, professional PDF reports, personalized emails, and real-time team notifications.**\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Features](#features)\n- [Demo](#demo)\n- [Prerequisites](#prerequisites)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n- [Usage](#usage)\n- [Troubleshooting](#troubleshooting)\n- [License](#license)\n\n---\n\n## Overview\n\n**AI-Powered Feedback Automation** is a complete, production-ready n8n workflow that automatically processes customer feedback submissions with artificial intelligence, generates beautiful branded PDF reports, sends personalized email responses, logs data for analytics, and notifies your team in real-time.\n\n### What Problem Does This Solve?\n\nManual feedback processing is time-consuming and inconsistent. This workflow eliminates all manual work by:\n- **Automatically analyzing** sentiment and extracting key insights using OpenAI\n- **Generating professional** PDF reports with custom branding\n- **Sending personalized** thank-you emails to customers\n- **Logging everything** to Google Sheets for analytics and reporting\n- **Notifying your team** instantly via Slack with actionable summaries\n\n### Perfect For\n\n- **Product Teams** - Collect and analyze user feedback systematically\n- **Educational Institutions** - Process student/parent feedback efficiently\n- **Customer Support** - Track customer satisfaction and sentiment trends\n- **E-commerce** - Manage product reviews and customer suggestions\n- **Healthcare** - Collect patient feedback and satisfaction scores\n- **Event Management** - Gather attendee feedback post-event\n- **Consulting Firms** - Streamline client feedback collection\n\n---\n\n## Features\n\n### AI-Powered Analysis\n- **Sentiment Classification** - Automatically categorizes feedback as Positive, Neutral, or Negative\n- **Key Highlights Extraction** - Identifies the most important points from customer comments\n- **Actionable Recommendations** - AI generates specific suggestions based on feedback\n- **Executive Summaries** - Creates concise 2-3 sentence overviews of each submission\n\n### Professional Report Generation\n- **Beautiful PDF Reports** - Branded, professional documents with custom styling\n- **Visual Elements** - Star ratings, color-coded sentiment badges, organized sections\n- **Responsive Design** - Mobile-friendly and print-optimized layouts\n- **30-Day Hosting** - PDF reports automatically hosted with expiration dates\n\n### Automated Email Communications\n- **Personalized Messages** - Thank-you emails customized with customer name and feedback\n- **PDF Attachments** - Direct download links to full feedback reports\n- **Sentiment Indicators** - Color-coded visual feedback summaries\n- **Professional Templates** - Modern, responsive email designs\n\n### Data Logging & Analytics\n- **Google Sheets Integration** - Automatic logging of all feedback submissions\n- **Complete Audit Trail** - Tracks submission IDs, timestamps, and processing status\n- **Analytics Ready** - Structured data perfect for dashboards and trend analysis\n- **Historical Records** - Permanent storage of all feedback data\n\n### Team Notifications\n- **Slack Integration** - Real-time alerts to team channels\n- **Rich Formatting** - Structured messages with highlights and action items\n- **Direct Links** - Quick access to full PDF reports from Slack\n- **Thread Discussions** - Enable team conversations around feedback\n\n### Robust Error Handling\n- **Email Validation** - Automatically checks and handles invalid email addresses\n- **Fallback Mechanisms** - Continues workflow even if email sending fails\n- **Data Cleaning** - Sanitizes and normalizes all input data\n- **Graceful Degradation** - AI parsing failures handled with intelligent fallbacks\n\n---\n\n## Demo\n\n### Workflow Overview\n```\nUser Submits Feedback\n        ↓\n  Data Cleaning & Validation\n        ↓\n  AI Sentiment Analysis (OpenAI)\n        ↓\n  HTML Report Generation\n        ↓\n  PDF Conversion\n        ↓\n  Email Validation ─┬─ Valid → Send Email\n                    └─ Invalid → Skip\n        ↓\n  Log to Google Sheets\n        ↓\n  Notify Team (Slack)\n        ↓\n  Webhook Response\n```\n\n### Sample Input\n```json\n{\n  \"name\": \"Sarah Johnson\",\n  \"email\": \"sarah@example.com\",\n  \"rating\": 4,\n  \"comments\": \"Great product! Delivery was a bit slow but customer service was helpful.\",\n  \"suggestions\": \"Improve shipping speed and tracking updates.\"\n}\n```\n\n### Sample Output\n- ✅ AI Analysis: \"Positive\" sentiment with 3 key highlights\n- ✅ PDF Report: Professional 2-page document with branding\n- ✅ Email Sent: Personalized thank-you message delivered\n- ✅ Data Logged: New row added to Google Sheet\n- ✅ Team Notified: Slack message with summary posted\n- ✅ Webhook Response: 200 OK with submission details\n\n---\n\n## Prerequisites\n\n### Required Services & Accounts\n\n1. **n8n Instance** (v0.220.0 or higher)\n   - Self-hosted or n8n Cloud\n   - [Installation Guide](https://docs.n8n.io/hosting/)\n\n2. **OpenAI Account**\n   - API key with GPT-3.5-turbo or GPT-4 access\n   - [Sign Up](https://platform.openai.com/signup)\n\n3. **Google Account** (Gmail + Google Sheets)\n   - OAuth2 setup for Gmail API\n   - OAuth2 setup for Google Sheets API\n   - [Setup Guide](https://docs.n8n.io/integrations/builtin/credentials/google/)\n\n4. **Slack Workspace**\n   - Admin access to create apps or OAuth\n   - Bot token with `chat:write` and `channels:read` scopes\n   - [Create Slack App](https://api.slack.com/apps)\n\n5. **HTML to PDF API Service**\n   - GET at: [PDFMunk](https://pdfmunk.com)\n   - API key required\n\n6. **VerifiEmail API**\n   - GET at: [VerfiEmail](https://verifi.email)\n   - API key required\n---\n\n## Quick Start\n\n### 1. Import Template\n\n**Option A: Import via URL**\n```bash\nCopy the workflow JSON URL and paste in n8n:\nSettings → Import from URL → [Paste URL]\n```\n\n**Option B: Import via File**\n1. Download `workflow.json`\n2. In n8n: Workflows → Import from File\n3. Select the downloaded JSON file\n4. Click \"Import\"\n\n### 2. Configure Credentials (5 minutes)\n\nNavigate to: **Settings → Credentials** and add:\n\n- ✅ **OpenAI API** - Add API key from OpenAI dashboard\n- ✅ **Gmail OAuth2** - Connect and authorize your Gmail account\n- ✅ **Google Sheets OAuth2** - Use same Google account\n- ✅ **Slack OAuth2** - Install app to workspace and authorize\n- ✅ **HTML to PDF API** - Add API key from your PDF service\n- ✅ **VerifiEmail API** - Add API key from VerifiEmail dashboard\n\n### 3. Create Google Sheet (2 minutes)\n\nCreate a new Google Sheet named **\"Feedback Log\"** with these column headers:\n\n```\nSubmission ID | Timestamp | Name | Email | Rating | Sentiment | Comments | Suggestions | AI Summary | PDF URL | PDF Available Until | Email Sent\n```\n\n### 4. Configure Workflow (3 minutes)\n\n1. Open the imported workflow\n2. Click **\"Log Feedback Data\"** node\n3. Select your \"Feedback Log\" spreadsheet\n4. Click **\"Notify Team\"** node\n5. Select your Slack channel (e.g., #feedback)\n\n### 5. Test & Activate (5 minutes)\n\n1. Execute the **\"Webhook\"** node to get test URL\n2. Send test POST request (see test data below)\n3. Verify all nodes execute successfully\n4. Check email, Google Sheet, and Slack\n5. Click **\"Active\"** toggle to enable workflow\n\n**Total Setup Time: ~15-20 minutes**\n\n---\n\n## Configuration\n\n### Webhook Configuration\n\nThe workflow receives feedback via POST webhook:\n\n**URL Format:**\n```\nhttps://your-n8n-domain.com/webhook/feedback-submission\n```\n\n**Expected Payload:**\n```json\n{\n  \"name\": \"string (required)\",\n  \"email\": \"string (optional, validated)\",\n  \"rating\": \"integer 1-5 (required)\",\n  \"comments\": \"string (optional)\",\n  \"suggestions\": \"string (optional)\"\n}\n```\n---\n\n## Usage\n\n### Testing the Workflow\n\n**Using Postman/Insomnia:**\n\n1. Create new POST request\n2. URL: `https://your-n8n-domain.com/webhook/feedback-submission`\n3. Headers: `Content-Type: application/json`\n4. Body (raw JSON):\n\n```json\n{\n  \"name\": \"Test User\",\n  \"email\": \"your-email@example.com\",\n  \"rating\": 5,\n  \"comments\": \"This is a test feedback submission. Everything works great!\",\n  \"suggestions\": \"Maybe add more features in the future.\"\n}\n```\n\n5. Send request\n6. Expected response (200 OK):\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Thank you for your feedback! We've sent you a detailed report via email.\",\n  \"data\": {\n    \"submissionId\": \"FB-1234567890123-abc123xyz\",\n    \"name\": \"Test User\",\n    \"email\": \"your-email@example.com\",\n    \"rating\": \"5\",\n    \"sentiment\": \"Positive\",\n    \"emailSent\": \"true\",\n    \"reportUrl\": \"https://generated-pdf-url.com/report.pdf\",\n    \"reportAvailableUntil\": \"2025-11-10\"\n  }\n}\n```\n\n**Using cURL:**\n\n```bash\ncurl -X POST https://your-n8n-domain.com/webhook/feedback-submission \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Sarah Johnson\",\n    \"email\": \"sarah@example.com\",\n    \"rating\": 4,\n    \"comments\": \"Great product! Delivery was a bit slow but customer service was helpful.\",\n    \"suggestions\": \"Improve shipping speed and tracking updates.\"\n  }'\n```\n\n### Monitoring & Maintenance\n\n**Daily:**\n- Check Slack for new feedback notifications\n- Review Google Sheet for any anomalies\n\n**Weekly:**\n- Verify workflow execution success rate\n- Check OpenAI API usage and costs\n- Review sentiment trends in Google Sheet\n\n**Monthly:**\n- Analyze feedback patterns and trends\n- Update AI prompts if needed\n- Check PDF service usage limits\n- Review and optimize workflow performance\n\n### Best Practices\n\n1. **Rate Limiting**\n   - Monitor for spam submissions\n   - Add rate limiting to webhook if needed\n   - Use n8n's built-in throttling\n\n2. **Data Privacy**\n   - Ensure GDPR/privacy compliance\n   - Add data retention policies\n   - Implement data deletion workflow\n\n3. **Error Handling**\n   - Set up error notifications\n   - Create error logging workflow\n   - Monitor execution failures\n\n4. **Performance**\n   - Keep Google Sheet under 50,000 rows\n   - Archive old data quarterly\n   - Use database for high volume (1000+/month)\n\n---\n\n## Troubleshooting\n\n### Common Issues\n\n#### Issue 1: Webhook Not Receiving Data\n\n**Symptoms:**\n- Webhook node shows no executions\n- Forms submit but nothing happens\n\n**Solutions:**\n1. ✅ Verify workflow is **Active** (toggle at top right)\n2. ✅ Check webhook URL is correct in form\n3. ✅ Test webhook with Postman/cURL first\n4. ✅ Check n8n logs for errors: Settings → Log Streaming\n5. ✅ Verify firewall/network allows incoming webhooks\n\n#### Issue 2: OpenAI Node Fails\n\n**Symptoms:**\n- Error: \"API key invalid\"\n- Error: \"Insufficient credits\"\n- Node times out\n\n**Solutions:**\n1. ✅ Verify API key is correct and active\n2. ✅ Check OpenAI account has sufficient credits\n3. ✅ Check API usage limits: [platform.openai.com/usage](https://platform.openai.com/usage)\n4. ✅ Increase node timeout in workflow settings\n5. ✅ Try with shorter feedback text\n\n#### Issue 3: PDF Not Generating\n\n**Symptoms:**\n- \"PDF generation failed\" error\n- Empty PDF URL\n- 404 when accessing PDF\n\n**Solutions:**\n1. ✅ Verify PDF API key is valid\n2. ✅ Check API service status\n3. ✅ Verify HTML content is valid (test in browser)\n4. ✅ Check API usage limits/quota\n5. ✅ Try alternative PDF service\n\n#### Issue 4: Email Not Sending\n\n**Symptoms:**\n- Gmail node shows error\n- Email doesn't arrive\n- \"Permission denied\" error\n\n**Solutions:**\n1. ✅ Re-authenticate Gmail OAuth2 credential\n2. ✅ Check email address is valid\n3. ✅ Check spam/junk folder\n4. ✅ Verify Gmail API is enabled in Google Console\n5. ✅ Check daily sending limits not exceeded\n6. ✅ Test with different email address\n\n#### Issue 5: Google Sheets Not Updating\n\n**Symptoms:**\n- No new rows added\n- \"Spreadsheet not found\" error\n- Permission errors\n\n**Solutions:**\n1. ✅ Verify spreadsheet ID is correct\n2. ✅ Check sheet name matches exactly (case-sensitive)\n3. ✅ Verify column headers match exactly\n4. ✅ Re-authenticate Google Sheets credential\n5. ✅ Check spreadsheet isn't protected/locked\n6. ✅ Verify spreadsheet isn't full (limit: 10M cells)\n\n#### Issue 6: Slack Not Posting\n\n**Symptoms:**\n- Slack node fails\n- Message doesn't appear in channel\n- \"Channel not found\" error\n\n**Solutions:**\n1. ✅ Verify bot is invited to channel: `/invite @BotName`\n2. ✅ Check bot has `chat:write` permission\n3. ✅ Re-authenticate Slack credential\n4. ✅ Verify channel ID is correct\n5. ✅ Check Slack workspace isn't on free plan limits\n6. ✅ Test with different channel\n\n### Debugging Tips\n\n1. **Enable Debug Mode**\n   - Settings → Executions → Save execution progress\n   - Watch each node execute step-by-step\n\n2. **Check Execution Logs**\n   - Click on failed node\n   - View \"Input\" and \"Output\" tabs\n   - Check error messages\n\n3. **Test Nodes Individually**\n   - Click \"Execute Node\" on each node\n   - Verify output before proceeding\n\n4. **Use Browser Console**\n   - Open Developer Tools (F12)\n   - Check for JavaScript errors\n   - Monitor network requests\n\n5. **Enable Verbose Logging**\n   ```bash\n   # For self-hosted n8n\n   N8N_LOG_LEVEL=debug npm start\n   ```\n\n---\n\n## 📄 License\n\nThis template is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.\n",
    "workflow": {
      "id": "",
      "meta": {
        "instanceId": "",
        "templateCredsSetupCompleted": false
      },
      "name": "Personalized Feedback Summary Generator",
      "tags": [
        {
          "id": "feedback",
          "name": "Feedback"
        },
        {
          "id": "ai",
          "name": "AI"
        },
        {
          "id": "automation",
          "name": "Automation"
        },
        {
          "id": "pdf",
          "name": "PDF Generation"
        },
        {
          "id": "email",
          "name": "Email"
        }
      ],
      "nodes": [
        {
          "id": "1673a4f2-dac3-4a2f-89cf-8c95d02c0fc6",
          "name": "Sticky Note - Credentials Setup1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -7264,
            -880
          ],
          "parameters": {
            "color": 7,
            "width": 389,
            "height": 656,
            "content": "## 🔐 CREDENTIALS SETUP REQUIRED\n\n**Before running this workflow, configure these credentials:**\n\n1. **OpenAI Account**\n   - Model: GPT-3.5-turbo (cost-effective) or GPT-4 (more accurate)\n\n2. **Gmail OAuth2**\n   - Connect via OAuth2 in n8n credentials\n\n3. **Google Sheets OAuth2**\n   - Create spreadsheet: \"Feedback Log\"\n   - Add columns: Submission ID, Timestamp, Name, Email, Rating, Sentiment, Comments, Suggestions, AI Summary, PDF URL, PDF Available Until, Email Sent\n\n4. **Slack OAuth2**\n   - Required scopes: chat:write, channels:read\n\n5. **HTML to PDF API**\n   - Sign up at hhttps://pdfmunk.com\n\n6. VerifiEmail API\n   - GET API at https://verifi.email"
          },
          "typeVersion": 1
        },
        {
          "id": "4959077e-1f6a-43f8-ad2c-30bd0baa7c8f",
          "name": "Sticky Note - Trigger1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -6160,
            -864
          ],
          "parameters": {
            "color": 7,
            "width": 392,
            "height": 657,
            "content": "## STEP 1: WEBHOOK TRIGGER\n\n**Expected Input Format:**\n```json\n{\n  \"name\": \"Customer Name\",\n  \"email\": \"email@example.com\",\n  \"rating\": 1-5,\n  \"comments\": \"Feedback text\",\n  \"suggestions\": \"Improvement ideas\"\n}\n```\n\n**Test URL:**\nGenerated when you execute this node in test mode.\n\n**Production URL:**\nActivate workflow to get permanent webhook endpoint.\n\n**Integration:**\nConnect Google Forms, Typeform, or any service that can send POST requests to this webhook."
          },
          "typeVersion": 1
        },
        {
          "id": "14577162-c367-452e-8fcc-0d444ea3ce14",
          "name": "Webhook - Receive Feedback1",
          "type": "n8n-nodes-base.webhook",
          "position": [
            -6032,
            -368
          ],
          "webhookId": "feedback-webhook-trigger",
          "parameters": {
            "path": "feedback-submission",
            "options": {},
            "httpMethod": "POST",
            "responseMode": "responseNode"
          },
          "typeVersion": 2
        },
        {
          "id": "4457ca3c-f600-407e-aa74-562cbb6ffe4d",
          "name": "Sticky Note - Clean Data1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -5744,
            -656
          ],
          "parameters": {
            "color": 7,
            "width": 392,
            "height": 449,
            "content": "## STEP 2: DATA CLEANING\n\n**Data Transformations:**\n- Empty name → \"Anonymous\"\n- Invalid email → empty string + flag false\n- Missing rating → 0\n- Missing comments → \"No comments provided\"\n- Missing suggestions → \"No suggestions provided\"\n\n**Output:**\nClean, structured JSON ready for AI analysis with guaranteed data consistency."
          },
          "typeVersion": 1
        },
        {
          "id": "525aaa53-9a12-4379-8baa-47c91cabc443",
          "name": "Clean & Normalize Data1",
          "type": "n8n-nodes-base.code",
          "position": [
            -5664,
            -368
          ],
          "parameters": {
            "jsCode": "// Get input data\nconst items = $input.all();\nconst cleanedItems = [];\n\nfor (const item of items) {\n  const data = item.json;\n  \n  // Access the body object where the actual form data is\n  const formData = data.body || data;\n  \n  // Normalize and clean data\n  const cleaned = {\n    name: formData.name?.trim() || 'Anonymous',\n    email: formData.email?.trim().toLowerCase() || '',\n    rating: parseInt(formData.rating) || 0,\n    comments: formData.comments?.trim() || 'No comments provided',\n    suggestions: formData.suggestions?.trim() || 'No suggestions provided',\n    timestamp: new Date().toISOString(),\n    submissionId: `FB-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n  };\n  \n  // Validate email format\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  if (cleaned.email && !emailRegex.test(cleaned.email)) {\n    cleaned.email = '';\n    cleaned.hasValidEmail = false;\n  } else {\n    cleaned.hasValidEmail = true;\n  }\n  \n  cleanedItems.push({ json: cleaned });\n}\n\nreturn cleanedItems;"
          },
          "typeVersion": 2
        },
        {
          "id": "bee6365c-320f-426d-b90d-d421e15e2c4a",
          "name": "Sticky Note - AI Analysis1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -5328,
            -816
          ],
          "parameters": {
            "color": 7,
            "width": 408,
            "height": 609,
            "content": "## STEP 3: AI ANALYSIS\n\n**AI Instructions:**\nAnalyzes feedback and returns JSON with:\n1. **sentiment**: \"Positive\" | \"Neutral\" | \"Negative\"\n2. **highlights**: Array of 2-3 key points\n3. **suggestions**: Array of actionable recommendations\n4. **summary**: 2-3 sentence executive summary\n\n**Input Data:**\n- Customer name\n- Rating (1-5)\n- Comments\n- Suggestions\n\n**Output:**\nJSON response in `message.content` field containing structured analysis.\n\n**Tip:** Use GPT-4 for more nuanced analysis if budget allows."
          },
          "typeVersion": 1
        },
        {
          "id": "7359e419-7366-4629-b78d-9b3e6eb8e963",
          "name": "Generate AI Summary1",
          "type": "@n8n/n8n-nodes-langchain.openAi",
          "position": [
            -5168,
            -368
          ],
          "parameters": {
            "modelId": {
              "__rl": true,
              "mode": "list",
              "value": "gpt-3.5-turbo",
              "cachedResultName": "GPT-3.5-TURBO"
            },
            "options": {},
            "messages": {
              "values": [
                {
                  "content": "=Analyze this feedback:\n\nName: {{ $json.name }}\nRating: {{ $json.rating }}/5\nComments: {{ $json.comments }}\nSuggestions: {{ $json.suggestions }}"
                },
                {
                  "role": "system",
                  "content": "=You are a feedback analysis assistant. You MUST respond with ONLY valid JSON, no other text.\n\nAnalyze the feedback and return this exact structure:\n{\n  \"sentiment\": \"Positive\" or \"Neutral\" or \"Negative\",\n  \"highlights\": [\"highlight 1\", \"highlight 2\", \"highlight 3\"],\n  \"suggestions\": [\"suggestion 1\", \"suggestion 2\"],\n  \"summary\": \"2-3 sentence summary\"\n}\n\nDo not include any text outside the JSON structure. Respond with valid JSON only."
                }
              ]
            }
          },
          "credentials": {
            "openAiApi": {
              "id": "credential-id",
              "name": "openAiApi Credential"
            }
          },
          "typeVersion": 1.3
        },
        {
          "id": "176eab7c-6456-459b-b295-1b4952562509",
          "name": "Sticky Note - Parse Response1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -4896,
            -816
          ],
          "parameters": {
            "color": 7,
            "width": 360,
            "height": 593,
            "content": "## STEP 4: PARSE AI RESPONSE\n\n**Key Operations:**\n1. **Extracts** AI response from `message.content`\n2. **Cleans** markdown code blocks if present\n3. **Parses** JSON string to object\n4. **Validates** required fields (sentiment, highlights, suggestions, summary)\n5. **Maps** sentiment to color codes:\n   - Positive → Green (#10b981)\n   - Neutral → Orange (#f59e0b)\n   - Negative → Red (#ef4444)\n6. **Ensures** arrays are properly formatted\n7. **Merges** AI analysis with original feedback data\n\n\n**Output:**\nComplete feedback object with AI analysis ready for HTML generation."
          },
          "typeVersion": 1
        },
        {
          "id": "c4deea1d-d92a-4afa-9cb1-ff35adb28393",
          "name": "Parse AI Response1",
          "type": "n8n-nodes-base.code",
          "position": [
            -4736,
            -368
          ],
          "parameters": {
            "jsCode": "const items = $input.all();\nconst outputItems = [];\n\nfor (let i = 0; i < items.length; i++) {\n  const feedbackData = $node[\"Clean & Normalize Data1\"].json;\n  const aiResponse = items[i].json.message.content;\n  \n  let aiAnalysis;\n  \n  try {\n    // Clean the response - remove any markdown code blocks if present\n    let cleanedResponse = aiResponse.trim();\n    \n    // Remove markdown code block markers if they exist\n    cleanedResponse = cleanedResponse.replace(/```json\\n?/g, '');\n    cleanedResponse = cleanedResponse.replace(/```\\n?/g, '');\n    cleanedResponse = cleanedResponse.trim();\n    \n    // Parse the JSON\n    aiAnalysis = JSON.parse(cleanedResponse);\n    \n    // Validate that we have all required fields\n    if (!aiAnalysis.sentiment || !aiAnalysis.highlights || !aiAnalysis.suggestions || !aiAnalysis.summary) {\n      throw new Error(\"Missing required fields in AI response\");\n    }\n    \n    console.log(\"Successfully parsed AI response as JSON\");\n    \n  } catch (e) {\n    console.log(\"Failed to parse as JSON, using fallback:\", e.message);\n    \n    // Fallback: Extract data intelligently from text\n    let sentiment = \"Neutral\";\n    const lowerResponse = aiResponse.toLowerCase();\n    \n    if (lowerResponse.includes(\"positive\") || \n        lowerResponse.includes(\"great\") || \n        lowerResponse.includes(\"excellent\")) {\n      sentiment = \"Positive\";\n    } else if (lowerResponse.includes(\"negative\") || \n               lowerResponse.includes(\"poor\") || \n               lowerResponse.includes(\"disappointed\")) {\n      sentiment = \"Negative\";\n    }\n    \n    // Create fallback structure\n    aiAnalysis = {\n      sentiment: sentiment,\n      highlights: [\n        feedbackData.comments || \"Customer provided feedback\",\n        `Rating: ${feedbackData.rating}/5 stars`\n      ],\n      suggestions: [feedbackData.suggestions || \"No specific suggestions\"],\n      summary: aiResponse.substring(0, 300)\n    };\n  }\n  \n  // Sentiment color mapping\n  const sentimentColors = {\n    'Positive': '#10b981',\n    'Neutral': '#f59e0b',\n    'Negative': '#ef4444'\n  };\n  \n  // Build output object\n  outputItems.push({\n    json: {\n      ...feedbackData,\n      aiSummary: aiAnalysis.summary,\n      sentiment: aiAnalysis.sentiment,\n      sentimentColor: sentimentColors[aiAnalysis.sentiment] || '#6b7280',\n      highlights: Array.isArray(aiAnalysis.highlights) ? aiAnalysis.highlights : [aiAnalysis.highlights],\n      aiSuggestions: Array.isArray(aiAnalysis.suggestions) ? aiAnalysis.suggestions : [aiAnalysis.suggestions]\n    }\n  });\n}\n\nreturn outputItems;"
          },
          "typeVersion": 2
        },
        {
          "id": "6c726077-7bca-4b66-864d-79074e097c2b",
          "name": "Sticky Note - HTML Generation1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -4512,
            -1008
          ],
          "parameters": {
            "color": 7,
            "width": 424,
            "height": 785,
            "content": "## STEP 5: BUILD HTML REPORT\n\n**HTML Components:**\n1. **Header Section**\n   - Gradient purple background\n   - \"📊 Feedback Report\" title\n   - Subtitle: \"AI-Powered Customer Feedback Analysis\"\n\n2. **User Information**\n   - Customer name (28px, bold)\n   - Email address\n   - Unique submission ID\n\n3. **Rating & Sentiment**\n   - Visual star rating (★★★★☆)\n   - Rating text (X out of 5 stars)\n   - Color-coded sentiment badge\n\n4. **AI Summary Section**\n   - Executive summary paragraph\n   - Easy-to-read format\n\n5. **Original Feedback**\n   - Comments box\n   - Suggestions box\n\n**Output:**\nComplete HTML string in `htmlContent` field ready for PDF conversion."
          },
          "typeVersion": 1
        },
        {
          "id": "35382397-13ee-46d0-9eaf-41aae3e4cce9",
          "name": "Build HTML Report1",
          "type": "n8n-nodes-base.code",
          "position": [
            -4320,
            -368
          ],
          "parameters": {
            "jsCode": "const data = $json;\n\n// Generate star rating HTML\nconst starRating = '★'.repeat(data.rating) + '☆'.repeat(5 - data.rating);\n\n// Format highlights list\nconst highlightsList = data.highlights.map(h => `<li>${h}</li>`).join('');\n\n// Format AI suggestions list\nconst suggestionsList = data.aiSuggestions.length > 0 \n  ? data.aiSuggestions.map(s => `<li>${s}</li>`).join('')\n  : '<li>No additional suggestions</li>';\n\n// Generate complete HTML document\nconst html = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Feedback Report - ${data.name}</title>\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n    \n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n      background: #f9fafb;\n      padding: 40px 20px;\n      line-height: 1.6;\n    }\n    \n    .container {\n      max-width: 800px;\n      margin: 0 auto;\n      background: white;\n      border-radius: 12px;\n      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.07);\n      overflow: hidden;\n    }\n    \n    .header {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      padding: 40px;\n      text-align: center;\n    }\n    \n    .header h1 {\n      font-size: 32px;\n      margin-bottom: 8px;\n      font-weight: 700;\n    }\n    \n    .header p {\n      opacity: 0.9;\n      font-size: 16px;\n    }\n    \n    .content {\n      padding: 40px;\n    }\n    \n    .user-info {\n      border-bottom: 2px solid #e5e7eb;\n      padding-bottom: 24px;\n      margin-bottom: 24px;\n    }\n    \n    .user-name {\n      font-size: 28px;\n      font-weight: 700;\n      color: #111827;\n      margin-bottom: 8px;\n    }\n    \n    .user-email {\n      color: #6b7280;\n      font-size: 15px;\n      margin-bottom: 8px;\n    }\n    \n    .submission-id {\n      color: #9ca3af;\n      font-size: 12px;\n      font-family: 'Courier New', monospace;\n    }\n    \n    .rating-section {\n      margin: 24px 0;\n      text-align: center;\n      padding: 24px;\n      background: #f9fafb;\n      border-radius: 8px;\n    }\n    \n    .stars {\n      font-size: 40px;\n      color: #fbbf24;\n      letter-spacing: 6px;\n      margin-bottom: 12px;\n    }\n    \n    .rating-text {\n      font-size: 18px;\n      color: #374151;\n      font-weight: 600;\n      margin-bottom: 12px;\n    }\n    \n    .sentiment-badge {\n      display: inline-block;\n      padding: 10px 20px;\n      border-radius: 24px;\n      font-weight: 600;\n      font-size: 15px;\n      color: white;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n    \n    .section {\n      margin: 32px 0;\n    }\n    \n    .section-title {\n      font-size: 20px;\n      font-weight: 700;\n      color: #111827;\n      margin-bottom: 16px;\n      display: flex;\n      align-items: center;\n    }\n    \n    .section-title::before {\n      content: '';\n      width: 4px;\n      height: 28px;\n      background: #667eea;\n      margin-right: 12px;\n      border-radius: 2px;\n    }\n    \n    .section-content {\n      color: #374151;\n      line-height: 1.8;\n      font-size: 16px;\n    }\n    \n    .feedback-box {\n      background: #f9fafb;\n      padding: 24px;\n      border-radius: 8px;\n      border-left: 4px solid #667eea;\n      margin: 16px 0;\n    }\n    \n    .feedback-box strong {\n      color: #111827;\n      display: block;\n      margin-bottom: 8px;\n      font-size: 14px;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n    \n    ul {\n      list-style: none;\n      padding-left: 0;\n    }\n    \n    ul li {\n      padding: 12px 0;\n      padding-left: 32px;\n      position: relative;\n      color: #374151;\n      line-height: 1.6;\n    }\n    \n    ul li::before {\n      content: '●';\n      color: #667eea;\n      font-weight: bold;\n      font-size: 24px;\n      position: absolute;\n      left: 0;\n      top: 8px;\n    }\n    \n    .footer {\n      background: #f9fafb;\n      padding: 32px 40px;\n      text-align: center;\n      color: #6b7280;\n      font-size: 14px;\n      border-top: 1px solid #e5e7eb;\n    }\n    \n    .footer p {\n      margin: 4px 0;\n    }\n    \n    .footer strong {\n      color: #111827;\n    }\n    \n    @media print {\n      body {\n        padding: 0;\n        background: white;\n      }\n      \n      .container {\n        box-shadow: none;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>📊 Feedback Report</h1>\n      <p>AI-Powered Customer Feedback Analysis</p>\n    </div>\n    \n    <div class=\"content\">\n      <!-- User Information -->\n      <div class=\"user-info\">\n        <div class=\"user-name\">${data.name}</div>\n        <div class=\"user-email\">${data.email || 'No email provided'}</div>\n        <div class=\"submission-id\">Submission ID: ${data.submissionId}</div>\n      </div>\n      \n      <!-- Rating and Sentiment -->\n      <div class=\"rating-section\">\n        <div class=\"stars\">${starRating}</div>\n        <div class=\"rating-text\">${data.rating} out of 5 stars</div>\n        <div class=\"sentiment-badge\" style=\"background-color: ${data.sentimentColor};\">\n          ${data.sentiment} Feedback\n        </div>\n      </div>\n      \n      <!-- AI Summary -->\n      <div class=\"section\">\n        <div class=\"section-title\">AI Summary</div>\n        <div class=\"section-content\">${data.aiSummary}</div>\n      </div>\n      \n      <!-- Key Highlights -->\n      <div class=\"section\">\n        <div class=\"section-title\">Key Highlights</div>\n        <ul>${highlightsList}</ul>\n      </div>\n      \n      <!-- Original Feedback -->\n      <div class=\"section\">\n        <div class=\"section-title\">Original Feedback</div>\n        <div class=\"feedback-box\">\n          <strong>Comments</strong>\n          ${data.comments}\n        </div>\n        <div class=\"feedback-box\">\n          <strong>Suggestions</strong>\n          ${data.suggestions}\n        </div>\n      </div>\n      \n      <!-- AI Recommendations -->\n      ${data.aiSuggestions.length > 0 ? `\n      <div class=\"section\">\n        <div class=\"section-title\">Recommended Actions</div>\n        <ul>${suggestionsList}</ul>\n      </div>\n      ` : ''}\n    </div>\n    \n    <div class=\"footer\">\n      <p><strong>Report Generated:</strong> ${new Date(data.timestamp).toLocaleString('en-US', { \n        weekday: 'long', \n        year: 'numeric', \n        month: 'long', \n        day: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit'\n      })}</p>\n      <p style=\"margin-top: 16px;\">Thank you for your valuable feedback! 🙏</p>\n    </div>\n  </div>\n</body>\n</html>\n`;\n\n// Return the HTML content along with all data\nreturn [{\n  json: {\n    ...data,\n    htmlContent: html\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "06215d6b-d83c-4ef6-9560-6bad2005f079",
          "name": "Sticky Note - PDF Generation1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -4064,
            -784
          ],
          "parameters": {
            "color": 7,
            "width": 376,
            "height": 561,
            "content": "## STEP 6: GENERATE PDF\n\n**API Response:**\n```json\n{\n  \"success\": true,\n  \"pdf_url\": \"https://generated-image.s3.ap-south-1.amazonaws.com/pdfs/[uuid].pdf\",\n  \"file_size_bytes\": 136164,\n  \"file_deletion_date\": \"2025-11-09\",\n  \"source_type\": \"html\"\n}\n```\n\n**Output:**\n- PDF URL (hosted on AWS S3)\n- File size in bytes\n- Expiration date (30 days from generation)\n- Success status"
          },
          "typeVersion": 1
        },
        {
          "id": "d10efd0f-df5c-43f1-b744-4287a0d32a02",
          "name": "Sticky Note - Process PDF1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -3664,
            -688
          ],
          "parameters": {
            "color": 7,
            "width": 392,
            "height": 465,
            "content": "## STEP 7: MERGE PDF METADATA\n\n**Key Operations:**\n1. **Retrieves** previous feedback data from \"Build HTML Report\" node\n2. **Extracts** PDF metadata from current node:\n   - pdf_url: Direct link to generated PDF\n   - file_size_bytes: PDF file size\n   - file_deletion_date: When PDF expires (30 days)\n3. **Generates** descriptive filename: `Feedback-Report-[SubmissionID].pdf`\n4. **Adds** `pdfReady: true` flag for downstream nodes\n5. **Merges** all data into single JSON object\n"
          },
          "typeVersion": 1
        },
        {
          "id": "ede437b3-bbcc-4ac4-8848-d92d7a351cf8",
          "name": "Process PDF Response1",
          "type": "n8n-nodes-base.code",
          "position": [
            -3552,
            -368
          ],
          "parameters": {
            "jsCode": "const items = $input.all();\nconst previousData = $node[\"Build HTML Report1\"].json;\nconst pdfInfo = items[0].json; // This is the output from HTML to PDF node\n\nreturn [{\n  json: {\n    ...previousData,\n    pdfUrl: pdfInfo.pdf_url,\n    pdfFileSize: pdfInfo.file_size_bytes,\n    pdfDeletionDate: pdfInfo.file_deletion_date,\n    pdfFileName: `Feedback-Report-${previousData.submissionId}.pdf`,\n    pdfReady: true\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "8f4b800d-8889-46c8-8fb0-234d4728f6b4",
          "name": "Sticky Note - Email Validation1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -3232,
            -672
          ],
          "parameters": {
            "color": 7,
            "width": 392,
            "height": 434,
            "content": "## STEP 8: EMAIL VALIDATION CHECK\n\n**Condition:**\n- Checks: `hasValidEmail` boolean flag\n- Operation: Equals `true`\n\n**🟢 TRUE Branch (Valid Email):**\n- Routes to \"Email User Report\" node\n- Sends personalized email with PDF link\n- User receives thank you message\n- Then proceeds to logging\n"
          },
          "typeVersion": 1
        },
        {
          "id": "171bdb6d-4c98-49d9-9928-0f7c11a0eb57",
          "name": "Check Valid Email1",
          "type": "n8n-nodes-base.if",
          "position": [
            -3136,
            -368
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 1,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "1668e9a2-47cc-4a7b-8dd2-29de8771f4c5",
                  "operator": {
                    "type": "boolean",
                    "operation": "true",
                    "singleValue": true
                  },
                  "leftValue": "={{ $json.hasValidEmail }}",
                  "rightValue": ""
                }
              ]
            }
          },
          "typeVersion": 2
        },
        {
          "id": "70c0fcc0-cb4b-4ffc-8a5a-bab1f0e71c3e",
          "name": "Email User Report1",
          "type": "n8n-nodes-base.gmail",
          "position": [
            -2688,
            -384
          ],
          "webhookId": "email-webhook",
          "parameters": {
            "sendTo": "={{ $json.email }}",
            "message": "=<div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px;\">\n  <div style=\"text-align: center; margin-bottom: 32px;\">\n    <h1 style=\"color: #667eea; margin: 0; font-size: 28px;\">Thank You for Your Feedback! 🎉</h1>\n  </div>\n  \n  <p style=\"font-size: 16px; line-height: 1.6;\">Hi <strong>{{ $json.name }}</strong>,</p>\n  \n  <p style=\"font-size: 16px; line-height: 1.6;\">Thank you for taking the time to share your thoughts with us. Your feedback is invaluable in helping us improve our services.</p>\n  \n  <div style=\"background: linear-gradient(135deg, #667eea15 0%, #764ba215 100%); padding: 24px; border-radius: 12px; margin: 32px 0; border-left: 4px solid {{ $json.sentimentColor }};\">\n    <p style=\"margin: 0; font-size: 16px;\"><strong>📊 Your Rating:</strong>{{ $json.rating }}/5</p>\n    <p style=\"margin: 12px 0 0 0; font-size: 16px;\"><strong>💭 Sentiment:</strong> <span style=\"color: {{ $json.sentimentColor }}; font-weight: 700;\">{{ $json.sentiment }}</span></p>\n  </div>\n  \n  <div style=\"background: #f9fafb; padding: 20px; border-radius: 8px; margin: 24px 0;\">\n    <p style=\"margin: 0 0 12px 0; font-weight: 600; color: #111827;\">📄 Your Personalized Feedback Report</p>\n    <p style=\"margin: 0 0 16px 0; font-size: 14px; line-height: 1.6; color: #6b7280;\">We've prepared a detailed AI-powered analysis of your feedback including key highlights, sentiment analysis, and recommended actions.</p>\n    <a href=\"{{ $json.pdfUrl }}\" style=\"display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 14px 28px; border-radius: 8px; text-decoration: none; font-weight: 600; font-size: 16px;\">📥 Download Your Report</a>\n    <p style=\"margin: 12px 0 0 0; font-size: 12px; color: #9ca3af;\">⏰ Report available until: {{ $json.pdfDeletionDate }}</p>\n  </div>\n  \n  <div style=\"background: white; border: 1px solid #e5e7eb; padding: 20px; border-radius: 8px; margin: 24px 0;\">\n    <p style=\"margin: 0 0 8px 0; font-weight: 600; color: #111827;\">✨ Your Report Includes:</p>\n    <ul style=\"margin: 0; padding-left: 20px; line-height: 1.8; color: #374151;\">\n      <li>AI-generated summary of your feedback</li>\n      <li>Key highlights and main points</li>\n      <li>Sentiment analysis with visual indicators</li>\n      <li>Actionable recommendations based on your input</li>\n      <li>Complete feedback history</li>\n    </ul>\n  </div>\n  \n  <p style=\"font-size: 16px; line-height: 1.6;\">If you have any questions or would like to discuss your feedback further, please don't hesitate to reach out. We're here to help!</p>\n  \n  <div style=\"margin-top: 40px; padding-top: 24px; border-top: 2px solid #e5e7eb;\">\n    <p style=\"margin: 0; font-size: 16px;\">Warm regards,</p>\n    <p style=\"margin: 4px 0 0 0; font-size: 18px; font-weight: 700; color: #667eea;\">The Team</p>\n  </div>\n  \n  <div style=\"margin-top: 32px; padding: 20px; background: #f9fafb; border-radius: 8px; text-align: center;\">\n    <p style=\"margin: 0; font-size: 12px; color: #6b7280;\">Submission ID: <code style=\"background: #e5e7eb; padding: 2px 8px; border-radius: 4px; font-family: monospace;\">{{ $json.submissionId }}</code></p>\n    <p style=\"margin: 8px 0 0 0; font-size: 12px; color: #9ca3af;\">Generated on {{ new Date($json.timestamp).toLocaleString() }}</p>\n  </div>\n</div>",
            "options": {},
            "subject": "Your Feedback Summary Report – Thank You for Sharing!"
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 2.1
        },
        {
          "id": "f9b4ca97-21e0-4a4f-9b42-43e1390a87c8",
          "name": "Sticky Note - Log Data1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2480,
            -768
          ],
          "parameters": {
            "color": 7,
            "width": 424,
            "height": 546,
            "content": "## STEP 10: LOG TO GOOGLE SHEETS\n\n\n**Columns Logged:**\n1. **Submission ID** - Unique identifier\n2. **Timestamp** - ISO 8601 date/time\n3. **Name** - Customer name\n4. **Email** - Customer email\n5. **Rating** - 1-5 star rating\n6. **Sentiment** - Positive/Neutral/Negative\n7. **Comments** - Original feedback text\n8. **Suggestions** - Customer suggestions\n9. **AI Summary** - Generated summary\n10. **PDF URL** - Link to report\n11. **PDF Available Until** - Expiration date\n12. **Email Sent** - Yes/No tracking"
          },
          "typeVersion": 1
        },
        {
          "id": "1d12b1e5-a8cb-436a-8a7f-4e093faaf42b",
          "name": "Log Feedback Data1",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            -2336,
            -384
          ],
          "parameters": {
            "columns": {
              "value": {
                "Name": "={{ $('Check Valid Email1').item.json.name }}",
                "Email": "={{ $('Check Valid Email1').item.json.email }}",
                "Rating": "={{ $('Check Valid Email1').item.json.rating }}",
                "PDF URL": "={{ $('Check Valid Email1').item.json.pdfUrl }}",
                "Comments": "={{ $('Check Valid Email1').item.json.comments }}",
                "Sentiment": "={{ $('Check Valid Email1').item.json.sentiment }}",
                "Timestamp": "={{ $('Check Valid Email1').item.json.timestamp }}",
                "AI Summary": "={{ $('Check Valid Email1').item.json.aiSummary }}",
                "Email Sent": "={{ $('Check Valid Email1').item.json.hasValidEmail ? 'Yes' : 'No' }}",
                "Suggestions": "={{ $('Check Valid Email1').item.json.suggestions }}",
                "Submission ID": "={{ $('Check Valid Email1').item.json.submissionId }}",
                "PDF Available Until": "={{ $('Check Valid Email1').item.json.pdfDeletionDate }}"
              },
              "schema": [
                {
                  "id": "Submission ID",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "Submission ID",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Timestamp",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Timestamp",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Name",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Name",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Email",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Email",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Rating",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Rating",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Sentiment",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Sentiment",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Comments",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Comments",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Suggestions",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Suggestions",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "AI Summary",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "AI Summary",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "PDF Available Until",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "PDF Available Until",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "PDF URL",
                  "type": "string",
                  "display": true,
                  "removed": false,
                  "required": false,
                  "displayName": "PDF URL",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "Email Sent",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "Email Sent",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                }
              ],
              "mappingMode": "defineBelow",
              "matchingColumns": [
                "Submission ID"
              ],
              "attemptToConvertTypes": false,
              "convertFieldsToString": false
            },
            "options": {},
            "operation": "appendOrUpdate",
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": "gid=0",
              "cachedResultUrl": "",
              "cachedResultName": "Sheet1"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "YOUR_GOOGLE_SHEET_ID",
              "cachedResultUrl": "",
              "cachedResultName": "Feedback Log"
            }
          },
          "credentials": {
            "googleSheetsOAuth2Api": {
              "id": "credential-id",
              "name": "googleSheetsOAuth2Api Credential"
            }
          },
          "typeVersion": 4.4
        },
        {
          "id": "c0c1f555-140d-448f-ba78-399971e374a6",
          "name": "Sticky Note - Team Alert1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2032,
            -800
          ],
          "parameters": {
            "color": 7,
            "width": 520,
            "height": 578,
            "content": "## STEP 11: SLACK TEAM NOTIFICATION\n\n**Message Contents:**\n1. **Header** - \"🆕 New Feedback Received!\"\n2. **Customer Info**\n   - Name\n   - Email address\n3. **Feedback Metrics**\n   - Star rating (X/5 ⭐)\n   - Sentiment (Positive/Neutral/Negative)\n4. **AI Summary** - Quick overview\n5. **Key Highlights** - Top 2 points from AI analysis\n6. **Recommended Actions** - AI suggestions\n7. **PDF Link** - Direct link to full report\n8. **Footer** - Submission ID & confirmation of logging\n\n**Alternative:** Can use Teams, Discord, or email notifications instead."
          },
          "typeVersion": 1
        },
        {
          "id": "6deba6a0-a406-4865-8254-694ab11bd1e0",
          "name": "Notify Team1",
          "type": "n8n-nodes-base.slack",
          "position": [
            -1920,
            -384
          ],
          "webhookId": "slack-webhook",
          "parameters": {
            "text": "=🆕 *New Feedback Received!*\n\n*Customer:* {{ $json.Name }}\n*Email:* {{ $json.Email }}\n*Rating:* {{ $json.Rating }}/5 ⭐\n*Sentiment:* {{ $json.Sentiment }}\n\n*AI Summary:*\n{{ $json['AI Summary'] }}\n\n*Key Highlights:*\n- {{ $('Check Valid Email1').item.json.highlights[0] }}\n- {{ $('Check Valid Email1').item.json.highlights[1] }}\n\n*Recommended Actions:*\n- {{ $('Check Valid Email1').item.json.aiSuggestions[0] }}\n- {{ $('Check Valid Email1').item.json.aiSuggestions[1] }}\n\n📄 *View Full Report:* {{ $json['PDF URL'] }}\n\n_Submission ID: {{ $json['Submission ID'] }}_\n_✅ Logged to tracking sheet_",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "YOUR_SLACK_CHANNEL_ID",
              "cachedResultName": "feedback-notifications"
            },
            "otherOptions": {}
          },
          "credentials": {
            "slackApi": {
              "id": "credential-id",
              "name": "slackApi Credential"
            }
          },
          "typeVersion": 2.2
        },
        {
          "id": "a569c084-e6ac-4ca0-8060-f952fa7e0589",
          "name": "Sticky Note - Final Response1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1472,
            -864
          ],
          "parameters": {
            "color": 7,
            "width": 568,
            "height": 642,
            "content": "## STEP 12: WEBHOOK RESPONSE\n\n**Response Structure:**\n```json\n{\n  \"success\": true,\n  \"message\": \"Thank you for your feedback! We've sent you a detailed report via email.\",\n  \"data\": {\n    \"submissionId\": \"FB-xxx\",\n    \"name\": \"Customer Name\",\n    \"email\": \"customer@email.com\",\n    \"rating\": 4,\n    \"sentiment\": \"Positive\",\n    \"emailSent\": true,\n    \"reportUrl\": \"https://...\",\n    \"reportAvailableUntil\": \"2025-11-09\"\n  }\n}\n```\n\n**Use Case:**\nIf integrating with custom forms, this response can trigger:\n- Success confirmation page\n- Download PDF button\n- Redirect to thank you page\n- Track submission in analytics\n"
          },
          "typeVersion": 1
        },
        {
          "id": "3b59493a-e441-49ac-9627-9dd157254c3f",
          "name": "Send Success Response1",
          "type": "n8n-nodes-base.respondToWebhook",
          "position": [
            -1184,
            -384
          ],
          "parameters": {
            "options": {
              "responseCode": 200
            },
            "respondWith": "json",
            "responseBody": "={\n  \"success\": true,\n  \"message\": \"Thank you for your feedback! We've sent you a detailed report via email.\",\n  \"data\": {\n    \"submissionId\": \"={{ $('Log Feedback Data1').item.json['Submission ID'] }}\",\n    \"name\": \"={{ $('Log Feedback Data1').item.json.Name }}\",\n    \"email\": \"={{ $('Log Feedback Data1').item.json.Email }}\",\n    \"rating\": \"={{ $('Log Feedback Data1').item.json.Rating }}\",\n    \"sentiment\": \"={{ $('Log Feedback Data1').item.json.Sentiment }}\",\n    \"emailSent\": \"={{ $('Check Valid Email1').item.json.hasValidEmail }}\",\n    \"reportUrl\": \"={{ $('Check Valid Email1').item.json.pdfUrl }}\",\n    \"reportAvailableUntil\": \"={{ $('Check Valid Email1').item.json.pdfDeletionDate }}\"\n  } \n}\n"
          },
          "typeVersion": 1.1
        },
        {
          "id": "0fc941d8-3ae3-4334-aaad-456b75177c35",
          "name": "Sticky Note - Testing Guide1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -6768,
            -880
          ],
          "parameters": {
            "color": 7,
            "width": 549,
            "height": 600,
            "content": "## 🚀 TESTING YOUR WORKFLOW\n\n**Step-by-Step Testing Guide:**\n\n**1. Initial Setup**\n- ✅ Verify all credentials are configured\n- ✅ Check Google Sheet has correct columns\n- ✅ Confirm Slack bot is in channel\n- ✅ Test webhook URL is active\n\n**2. Test Data**\nUse this JSON in Postman/curl:\n```json\n{\n  \"name\": \"Sarah Johnson\",\n  \"email\": \"your-email@example.com\",\n  \"rating\": 4,\n  \"comments\": \"Great product! Delivery was slow but customer service was helpful.\",\n  \"suggestions\": \"Improve shipping speed and tracking updates.\"\n}\n```\n\n**3. Execution Steps**\n- Execute \"Webhook\" node to get test URL\n- Send POST request with test data\n- Watch nodes execute sequentially\n- Check for green checkmarks on all nodes\n"
          },
          "typeVersion": 1
        },
        {
          "id": "749a54d2-50ac-40ab-b3a0-792e9fdc4387",
          "name": "HTML to PDF1",
          "type": "n8n-nodes-htmlcsstopdf.htmlcsstopdf",
          "position": [
            -3936,
            -368
          ],
          "parameters": {
            "html_content": "={{ $json.htmlContent }}"
          },
          "credentials": {
            "htmlcsstopdfApi": {
              "id": "credential-id",
              "name": "htmlcsstopdfApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "f210d49f-ebe2-4e23-823e-e29412a330e8",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2800,
            -528
          ],
          "parameters": {
            "color": 7,
            "width": 288,
            "height": 304,
            "content": "## STEP 9:EMAIL USER REPORT\n\nSends an email user report to the email id of the user"
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "",
      "connections": {
        "HTML to PDF1": {
          "main": [
            [
              {
                "node": "Process PDF Response1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Notify Team1": {
          "main": [
            [
              {
                "node": "Send Success Response1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Build HTML Report1": {
          "main": [
            [
              {
                "node": "HTML to PDF1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Check Valid Email1": {
          "main": [
            [
              {
                "node": "Email User Report1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Email User Report1": {
          "main": [
            [
              {
                "node": "Log Feedback Data1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Log Feedback Data1": {
          "main": [
            [
              {
                "node": "Notify Team1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Parse AI Response1": {
          "main": [
            [
              {
                "node": "Build HTML Report1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Generate AI Summary1": {
          "main": [
            [
              {
                "node": "Parse AI Response1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Process PDF Response1": {
          "main": [
            [
              {
                "node": "Check Valid Email1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Clean & Normalize Data1": {
          "main": [
            [
              {
                "node": "Generate AI Summary1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Webhook - Receive Feedback1": {
          "main": [
            [
              {
                "node": "Clean & Normalize Data1",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 26,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 1
        },
        "n8n-nodes-base.code": {
          "count": 4
        },
        "n8n-nodes-base.gmail": {
          "count": 1
        },
        "n8n-nodes-base.slack": {
          "count": 1
        },
        "n8n-nodes-base.webhook": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 14
        },
        "n8n-nodes-base.googleSheets": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.openAi": {
          "count": 1
        },
        "n8n-nodes-base.respondToWebhook": {
          "count": 1
        },
        "n8n-nodes-htmlcsstopdf.htmlcsstopdf": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Jitesh Dugar",
      "username": "jiteshdugar",
      "bio": "AI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.",
      "verified": true,
      "links": [
        "https://www.linkedin.com/in/jiteshdugar"
      ],
      "avatar": "https://gravatar.com/avatar/edaa3abb99806b0586dced559d0a5417f24a507e7c4464a63960f0638a4b1b90?r=pg&d=retro&size=200"
    },
    "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": 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": 47,
        "icon": "file:webhook.svg",
        "name": "n8n-nodes-base.webhook",
        "codex": {
          "data": {
            "alias": [
              "HTTP",
              "API",
              "Build",
              "WH"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "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/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "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/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/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/",
                  "icon": "📹",
                  "label": "The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"
                },
                {
                  "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/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/creating-custom-incident-response-workflows-with-n8n/",
                  "label": "How to automate every step of an incident response workflow"
                },
                {
                  "url": "https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/",
                  "icon": "🧰",
                  "label": "Learn to Build Powerful API Endpoints Using Webhooks"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "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.webhook/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"trigger\"]",
        "defaults": {
          "name": "Webhook"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"
        },
        "displayName": "Webhook",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "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": 535,
        "icon": "file:webhook.svg",
        "name": "n8n-nodes-base.respondToWebhook",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"
                }
              ]
            },
            "categories": [
              "Core Nodes",
              "Utility"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Respond to Webhook"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"
        },
        "displayName": "Respond to Webhook",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 7,
            "name": "Utility"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "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"
          }
        ]
      },
      {
        "id": 1250,
        "icon": "file:openAi.svg",
        "name": "@n8n/n8n-nodes-langchain.openAi",
        "codex": {
          "data": {
            "alias": [
              "LangChain",
              "ChatGPT",
              "Sora",
              "DallE",
              "whisper",
              "audio",
              "transcribe",
              "tts",
              "assistant"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-langchain.openai/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Agents",
                "Miscellaneous",
                "Root Nodes"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "OpenAI"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg1IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NiAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MSA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K"
        },
        "displayName": "OpenAI",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 40,
        "name": "Support Chatbot"
      },
      {
        "id": 49,
        "name": "AI Summarization"
      }
    ],
    "image": []
  }
}