{
  "workflow": {
    "id": 8947,
    "name": "Stripe customer duplicate detection & management with Airtable & Slack notifications",
    "views": 29,
    "recentViews": 0,
    "totalViews": 29,
    "createdAt": "2025-09-26T10:04:55.449Z",
    "description": "## Description\nAutomatically scan your Stripe customers daily to detect duplicates and keep your customer database clean. This workflow uses advanced fuzzy matching for emails and names, logs results to Airtable for review, and notifies your team in Slack with actionable insights. 💳🧹💬\n\n## What This Template Does\n- Runs every day at 2:00 AM via scheduled trigger ⏰\n- Fetches all customers from Stripe 💳\n- Analyzes for potential duplicates using email and name similarity 🔍\n- Logs duplicate suggestions into Airtable for review 📊\n- Sends formatted Slack notifications with detailed reports 💬\n\n## Key Benefits\n- Keeps your Stripe customer database clean and deduplicated 🧹\n- Reduces errors in reporting and billing 💵\n- Provides confidence scoring for duplicate matches 🔑\n- Centralized review and approval in Airtable 📋\n- Real-time team notifications in Slack with actionable insights 📲\n\n## Features\n- Daily 2 AM schedule with cron expression 0 2 * * *\n- Email-based duplicate detection 📧\n- Name similarity matching using Levenshtein distance 👤\n- Smart grouping: oldest record becomes the primary 🏷️\n- Logs duplicates to Airtable with status tracking 🔄\n- Slack notifications with statistics, match types, and Airtable link ⚡\n\n## Requirements\n- n8n instance (cloud or self-hosted)\n- Stripe API credentials with customer read access\n- Airtable account with a table for duplicate tracking\n- Slack App & Bot Token with chat:write permission\n- Target Audience\n- SaaS companies managing large Stripe customer databases 🏢\n- Finance and billing teams wanting clean records 💰\n- Support teams reducing customer confusion from duplicates 🎧\n- Growth and marketing teams ensuring CRM accuracy 📈\n- Any business that relies on Stripe for recurring billing 💼\n\n## Step-by-Step Setup Instructions\n- Set up Stripe API credentials in n8n (use your Secret Key).\n- Create an Airtable base and table with required fields (Customer IDs, Email, Similarity Score, Status).\n- Add Slack API credentials and choose your target channel.\n- Replace environment variables for Airtable (AIRTABLE_BASE_ID, AIRTABLE_TABLE_ID) and Slack (SLACK_CHANNEL_ID).\n- Import this workflow into n8n and connect your credentials.\n- Run the workflow once manually to validate data flows.\n- Enable the workflow for daily automated duplicate detection. ✅\n",
    "workflow": {
      "id": "Rr0vbFBRhTCMYSuP",
      "meta": {
        "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
        "templateCredsSetupCompleted": true
      },
      "name": "Stripe Customer Duplicate Detection & Management",
      "tags": [],
      "nodes": [
        {
          "id": "38d831a3-05c2-4de0-94db-a1669fa98ec7",
          "name": "Workflow Description",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -928,
            352
          ],
          "parameters": {
            "width": 389,
            "height": 672,
            "content": "## 🎯 Stripe Customer Duplicate Detection & Management\n\nThis workflow automatically scans your Stripe customers daily to identify potential duplicates and helps you maintain a clean customer database.\n\n### What this workflow does:\n• Fetches all customers from Stripe daily at 2 AM\n• Uses advanced fuzzy matching to detect duplicates by email and name\n• Logs findings to Airtable for review and approval\n• Sends detailed Slack notifications with actionable insights\n\n### Key Features:\n• Email-based duplicate detection (99% confidence)\n• Name similarity matching using Levenshtein distance\n• Automated logging with status tracking\n• Smart grouping and prioritization\n• Detailed Slack reports with statistics\n\n### Setup Requirements:\n1. Stripe API credentials\n2. Airtable base with duplicate tracking table\n3. Slack workspace integration\n"
          },
          "typeVersion": 1
        },
        {
          "id": "3a339de6-55b4-45ae-82e5-77455a181e74",
          "name": "Schedule Setup",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -512,
            48
          ],
          "parameters": {
            "width": 236,
            "height": 408,
            "content": "## ⏰ Daily Trigger Setup\n\nScheduled to run every day at 2 AM to avoid peak business hours.\n\n**Cron Expression:** `0 2 * * *`\n- 0: minute (0)\n- 2: hour (2 AM)\n- *: any day of month\n- *: any month\n- *: any day of week\n\n💡 **Tip:** You can modify the schedule based on your timezone and business needs."
          },
          "typeVersion": 1
        },
        {
          "id": "6994f890-98d7-47fc-9e77-2b25d636ae13",
          "name": "Daily Schedule Trigger",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            -432,
            480
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "field": "cronExpression",
                  "expression": "0 2 * * *"
                }
              ]
            }
          },
          "typeVersion": 1.1
        },
        {
          "id": "8cf9c8a7-38fc-47c9-a83c-68537ae947c3",
          "name": "Stripe Setup",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -336,
            656
          ],
          "parameters": {
            "width": 300,
            "height": 444,
            "content": "## 💳 Stripe Customer Fetch\n\nRetrieves all customers from your Stripe account for duplicate analysis.\n\n**Setup Steps:**\n1. Create Stripe API credentials in n8n\n2. Use your Stripe Secret Key (starts with sk_)\n3. Ensure the key has read permissions for customers\n\n**Security Note:** Never hardcode API keys - always use n8n credentials manager.\n\n⚠️ **Important:** This fetches ALL customers. For large datasets (10k+ customers), consider adding pagination or filters."
          },
          "typeVersion": 1
        },
        {
          "id": "8e276971-d826-4307-bd90-547ec767a7bd",
          "name": "Fetch All Stripe Customers",
          "type": "n8n-nodes-base.stripe",
          "position": [
            -208,
            480
          ],
          "parameters": {
            "filters": {},
            "resource": "customer",
            "operation": "getAll",
            "returnAll": true
          },
          "credentials": {
            "stripeApi": {
              "id": "credential-id",
              "name": "stripeApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "5f0f09fd-3d34-4839-8a51-d865eed0bc88",
          "name": "Detection Algorithm",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -80,
            -64
          ],
          "parameters": {
            "width": 300,
            "height": 532,
            "content": "## 🔍 Duplicate Detection Logic\n\nAdvanced algorithm that identifies potential duplicates using:\n\n**Email Matching (99% confidence):**\n- Exact email matches across customers\n- Case-insensitive comparison\n- Highest priority for merging\n\n**Name Similarity (80%+ threshold):**\n- Uses Levenshtein distance algorithm\n- Handles typos and variations\n- Configurable similarity threshold\n\n**Smart Grouping:**\n- Oldest customer becomes primary\n- All others suggested for merge\n- Prevents duplicate processing\n\nThe algorithm processes customers efficiently and avoids false positives."
          },
          "typeVersion": 1
        },
        {
          "id": "3f53c9e4-9a5a-4519-ae46-8e27b60f3890",
          "name": "Analyze Customer Duplicates",
          "type": "n8n-nodes-base.function",
          "position": [
            32,
            480
          ],
          "parameters": {
            "functionCode": "// Function to calculate Levenshtein distance\nfunction levenshteinDistance(str1, str2) {\n  const matrix = [];\n  \n  for (let i = 0; i <= str2.length; i++) {\n    matrix[i] = [i];\n  }\n  \n  for (let j = 0; j <= str1.length; j++) {\n    matrix[0][j] = j;\n  }\n  \n  for (let i = 1; i <= str2.length; i++) {\n    for (let j = 1; j <= str1.length; j++) {\n      if (str2.charAt(i - 1) === str1.charAt(j - 1)) {\n        matrix[i][j] = matrix[i - 1][j - 1];\n      } else {\n        matrix[i][j] = Math.min(\n          matrix[i - 1][j - 1] + 1,\n          matrix[i][j - 1] + 1,\n          matrix[i - 1][j] + 1\n        );\n      }\n    }\n  }\n  \n  return matrix[str2.length][str1.length];\n}\n\n// Function to calculate similarity percentage\nfunction calculateSimilarity(str1, str2) {\n  if (!str1 || !str2) return 0;\n  \n  const maxLength = Math.max(str1.length, str2.length);\n  if (maxLength === 0) return 100;\n  \n  const distance = levenshteinDistance(str1.toLowerCase(), str2.toLowerCase());\n  return Math.round(((maxLength - distance) / maxLength) * 100);\n}\n\n// Extract customers array from items - each item contains one customer\nconst customers = items.map(item => item.json);\nconst suggestions = [];\nconst processedCustomers = new Set();\n\nconsole.log(`Processing ${customers.length} customers for duplicates`);\n\n// Group customers by email and name for efficient duplicate detection\nconst emailGroups = new Map();\nconst nameGroups = new Map();\n\ncustomers.forEach(customer => {\n  // Group by email\n  if (customer.email) {\n    const emailKey = customer.email.toLowerCase();\n    if (!emailGroups.has(emailKey)) {\n      emailGroups.set(emailKey, []);\n    }\n    emailGroups.get(emailKey).push(customer);\n  }\n  \n  // Group by name (for name similarity matching)\n  if (customer.name) {\n    const nameKey = customer.name.toLowerCase();\n    if (!nameGroups.has(nameKey)) {\n      nameGroups.set(nameKey, []);\n    }\n    nameGroups.get(nameKey).push(customer);\n  }\n});\n\n// Process email-based duplicates\nemailGroups.forEach((group, email) => {\n  if (group.length > 1) {\n    // Sort by creation date to make the oldest one primary\n    group.sort((a, b) => a.created - b.created);\n    const primary = group[0];\n    \n    // Create suggestions for all others against the primary\n    for (let i = 1; i < group.length; i++) {\n      const secondary = group[i];\n      if (!processedCustomers.has(secondary.id)) {\n        let confidenceScore = 95;\n        let matchReason = 'Email match';\n        \n        // Higher confidence if names also match\n        if (primary.name && secondary.name && primary.name.toLowerCase() === secondary.name.toLowerCase()) {\n          confidenceScore = 99;\n          matchReason = 'Email + Name exact match';\n        }\n        \n        suggestions.push({\n          primary_customer_id: primary.id,\n          secondary_customer_id: secondary.id,\n          email: primary.email || secondary.email || '',\n          name_similarity_score: confidenceScore,\n          primary_name: primary.name || '',\n          secondary_name: secondary.name || '',\n          match_reason: matchReason,\n          status: 'Pending Review'\n        });\n        \n        processedCustomers.add(secondary.id);\n      }\n    }\n    processedCustomers.add(primary.id);\n  }\n});\n\n// Process name-based duplicates (only for customers not already processed by email)\nnameGroups.forEach((group, name) => {\n  if (group.length > 1) {\n    // Filter out customers already processed by email matching\n    const unprocessedGroup = group.filter(customer => !processedCustomers.has(customer.id));\n    \n    if (unprocessedGroup.length > 1) {\n      // Sort by creation date to make the oldest one primary\n      unprocessedGroup.sort((a, b) => a.created - b.created);\n      const primary = unprocessedGroup[0];\n      \n      // Create suggestions for all others against the primary\n      for (let i = 1; i < unprocessedGroup.length; i++) {\n        const secondary = unprocessedGroup[i];\n        const nameSimilarity = calculateSimilarity(primary.name, secondary.name);\n        \n        if (nameSimilarity >= 80) {\n          suggestions.push({\n            primary_customer_id: primary.id,\n            secondary_customer_id: secondary.id,\n            email: primary.email || secondary.email || '',\n            name_similarity_score: nameSimilarity,\n            primary_name: primary.name || '',\n            secondary_name: secondary.name || '',\n            match_reason: 'Name similarity',\n            status: 'Pending Review'\n          });\n        }\n      }\n    }\n  }\n});\n\nconsole.log(`Found ${suggestions.length} duplicate suggestions`);\n\n// Return suggestions as n8n items format\nreturn suggestions.map(suggestion => ({ json: suggestion }));"
          },
          "typeVersion": 1
        },
        {
          "id": "31ac8a3a-a2ac-4468-96d3-43eefb377823",
          "name": "Airtable Configuration",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            144,
            624
          ],
          "parameters": {
            "width": 320,
            "height": 524,
            "content": "## 📊 Airtable Logging Setup\n\nLogs all duplicate suggestions to Airtable for review and approval workflow.\n\n**Required Table Fields:**\n- Primary Customer ID (Text)\n- Secondary Customer ID (Text)\n- Email (Email)\n- Name Similarity Score (Number)\n- Primary Name (Text)\n- Secondary Name (Text)\n- Match Reason (Single Select)\n- Status (Single Select: Pending Review, Approved, Rejected)\n\n**Setup Steps:**\n1. Create Airtable Personal Access Token\n2. Replace the hardcoded base and table IDs with your own\n3. Set up the table structure as described above\n\n"
          },
          "typeVersion": 1
        },
        {
          "id": "2a1648e3-4276-45b6-8dd1-37e9cd9f6b70",
          "name": "Log to Airtable Database",
          "type": "n8n-nodes-base.airtable",
          "position": [
            256,
            480
          ],
          "parameters": {
            "table": {
              "__rl": true,
              "mode": "id",
              "value": "{{ $env.AIRTABLE_TABLE_ID }}"
            },
            "options": {},
            "operation": "append",
            "application": {
              "__rl": true,
              "mode": "id",
              "value": "{{ $env.AIRTABLE_BASE_ID }}"
            },
            "authentication": "airtableTokenApi"
          },
          "credentials": {
            "airtableTokenApi": {
              "id": "credential-id",
              "name": "airtableTokenApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "c8a3224a-1da5-4230-9edd-909afa20757a",
          "name": "Message Format",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            368,
            -48
          ],
          "parameters": {
            "width": 300,
            "height": 520,
            "content": "## 📝 Message Formatting\n\nCreates a detailed Slack message with:\n\n**Summary Statistics:**\n- Total duplicate suggestions found\n- Number of customer groups affected\n- Total customers involved\n\n**Match Type Breakdown:**\n- Email matches (highest confidence)\n- Name similarity matches\n- Combined email + name matches\n\n**Top Duplicate Groups:**\n- Shows the most problematic duplicates\n- Includes customer count per group\n- Limited to top 3 for readability\n\n**Action Items:**\n- Direct link to Airtable for review\n- Clear next steps for the team"
          },
          "typeVersion": 1
        },
        {
          "id": "dfbf1b63-22a0-4d4c-a4e9-07565b5cab82",
          "name": "Format Notification Message",
          "type": "n8n-nodes-base.function",
          "position": [
            464,
            480
          ],
          "parameters": {
            "functionCode": "const suggestions = items;\nconst count = suggestions.length;\nconst airtableLink = `https://airtable.com/${process.env.AIRTABLE_BASE_ID}/${process.env.AIRTABLE_TABLE_ID}`;\n\n// Initialize these variables outside the if/else blocks\nconst emailGroups = new Map();\nconst matchReasons = new Map();\n\nlet message = '';\n\nif (count === 0) {\n  message = '✅ No duplicate customers found in today\\'s scan.';\n} else {\n  // Analyze the suggestions for better insights\n  suggestions.forEach(item => {\n    const suggestion = item.json ? item.json : item.fields; // Handle both formats\n    \n    // Group by email\n    const email = suggestion.email;\n    if (email) {\n      if (!emailGroups.has(email)) {\n        emailGroups.set(email, new Set());\n      }\n      emailGroups.get(email).add(suggestion.primary_customer_id);\n      emailGroups.get(email).add(suggestion.secondary_customer_id);\n    }\n    \n    // Count match reasons\n    const reason = suggestion.match_reason || 'Unknown';\n    matchReasons.set(reason, (matchReasons.get(reason) || 0) + 1);\n  });\n  \n  // Create detailed message\n  const uniqueCustomerGroups = emailGroups.size;\n  const totalDuplicateCustomers = Array.from(emailGroups.values()).reduce((sum, customerSet) => sum + customerSet.size, 0);\n  \n  message = `⚠️ *Duplicate Customer Alert*\\n\\n`;\n  message += `📊 *Summary:*\\n`;\n  message += `• ${count} duplicate suggestion${count > 1 ? 's' : ''} found\\n`;\n  message += `• ${uniqueCustomerGroups} customer group${uniqueCustomerGroups > 1 ? 's' : ''} affected\\n`;\n  message += `• ${totalDuplicateCustomers} total customers involved\\n\\n`;\n  \n  // Add breakdown by match reason\n  if (matchReasons.size > 0) {\n    message += `🔍 *Match Types:*\\n`;\n    for (const [reason, reasonCount] of matchReasons) {\n      let emoji = '📧';\n      if (reason && reason.includes && reason.includes('Name')) emoji = '👤';\n      if (reason && reason.includes && reason.includes('Email + Name')) emoji = '💯';\n      \n      message += `${emoji} ${reason}: ${reasonCount}\\n`;\n    }\n    message += `\\n`;\n  }\n  \n  // Add top duplicate groups (limit to 3 for brevity)\n  const sortedGroups = Array.from(emailGroups.entries())\n    .sort((a, b) => b[1].size - a[1].size)\n    .slice(0, 3);\n  \n  if (sortedGroups.length > 0) {\n    message += `🎯 *Top Duplicate Groups:*\\n`;\n    sortedGroups.forEach(([email, customerIds], index) => {\n      message += `${index + 1}. ${email} (${customerIds.size} customers)\\n`;\n    });\n    message += `\\n`;\n  }\n  \n  message += `👀 *Action Required:* Please review and approve merges in Airtable\\n`;\n  message += `🔗 *Review Link:* ${airtableLink}`;\n}\n\nreturn [{\n  json: {\n    message: message,\n    count: count,\n    unique_groups: emailGroups.size || 0,\n    total_customers_affected: Array.from(emailGroups.values()).reduce((sum, customerSet) => sum + customerSet.size, 0) || 0,\n    match_reasons: Object.fromEntries(matchReasons),\n    airtable_link: airtableLink\n  }\n}];"
          },
          "typeVersion": 1
        },
        {
          "id": "b3d6a5cd-e852-4694-a27e-3d5f53b4a81d",
          "name": "Slack Setup",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            640,
            640
          ],
          "parameters": {
            "width": 300,
            "height": 600,
            "content": "## 💬 Slack Notification Setup\n\nSends detailed duplicate reports to your team Slack channel.\n\n**Setup Steps:**\n1. Create Slack App with Bot Token\n2. Add bot to your target channel\n3. Replace hardcoded channel ID with your channel\n4. Grant necessary permissions (chat:write)\n\n**Message Features:**\n- Markdown formatting for better readability\n- Emoji indicators for different match types\n- Direct links to Airtable for action\n- Summary statistics for quick overview\n\n**Security:** Use environment variables for sensitive channel IDs and tokens.\n\n💡 **Tip:** Consider using different channels for different alert levels."
          },
          "typeVersion": 1
        },
        {
          "id": "228175d2-da58-4ccc-afda-b7f358f6a3d1",
          "name": "Send Slack Notification",
          "type": "n8n-nodes-base.slack",
          "position": [
            672,
            480
          ],
          "webhookId": "1a3b3a22-c489-4a9d-ae15-80fb2b6f0ea5",
          "parameters": {
            "text": "={{ $json.message }}",
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "list",
              "value": "{{ $env.SLACK_CHANNEL_ID }}",
              "cachedResultName": "duplicate-alerts"
            },
            "otherOptions": {
              "mrkdwn": true
            }
          },
          "credentials": {
            "slackApi": {
              "id": "credential-id",
              "name": "slackApi Credential"
            }
          },
          "typeVersion": 2.3
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "15516be5-62fa-4865-a572-48dd92f7294b",
      "connections": {
        "Daily Schedule Trigger": {
          "main": [
            [
              {
                "node": "Fetch All Stripe Customers",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Log to Airtable Database": {
          "main": [
            [
              {
                "node": "Format Notification Message",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch All Stripe Customers": {
          "main": [
            [
              {
                "node": "Analyze Customer Duplicates",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Analyze Customer Duplicates": {
          "main": [
            [
              {
                "node": "Log to Airtable Database",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Notification Message": {
          "main": [
            [
              {
                "node": "Send Slack Notification",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 13,
      "nodeTypes": {
        "n8n-nodes-base.slack": {
          "count": 1
        },
        "n8n-nodes-base.stripe": {
          "count": 1
        },
        "n8n-nodes-base.airtable": {
          "count": 1
        },
        "n8n-nodes-base.function": {
          "count": 2
        },
        "n8n-nodes-base.stickyNote": {
          "count": 7
        },
        "n8n-nodes-base.scheduleTrigger": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Rahul Joshi",
      "username": "rahul08",
      "bio": "Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.\n\n",
      "verified": true,
      "links": [
        "https://www.linkedin.com/in/callrahul/"
      ],
      "avatar": "https://gravatar.com/avatar/b6cf57822463143589b36ada06fbf6cb1509223a740fae3160b28f1ce41ccc12?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 2,
        "icon": "file:airtable.svg",
        "name": "n8n-nodes-base.airtable",
        "codex": {
          "data": {
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-goals-level-up-your-vocabulary-with-vonage-and-n8n/",
                  "icon": "🎯",
                  "label": "2021 Goals: Level Up Your Vocabulary With Vonage and n8n"
                },
                {
                  "url": "https://n8n.io/blog/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/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/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/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "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/learn-to-build-powerful-api-endpoints-using-webhooks/",
                  "icon": "🧰",
                  "label": "Learn to Build Powerful API Endpoints Using Webhooks"
                },
                {
                  "url": "https://n8n.io/blog/sending-sms-the-low-code-way-with-airtable-twilio-programmable-sms-and-n8n/",
                  "icon": "📱",
                  "label": "Sending SMS the Low-Code Way with Airtable, Twilio Programmable SMS, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/automating-conference-organization-processes-with-n8n/",
                  "icon": "🙋‍♀️",
                  "label": "Automating Conference Organization Processes with n8n"
                },
                {
                  "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/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "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.airtable/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/airtable/"
                }
              ]
            },
            "categories": [
              "Data & Storage"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Airtable"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcwIj48cGF0aCBmaWxsPSIjZmNiNDAwIiBkPSJNODkgNC44IDE2LjIgMzQuOWMtNC4xIDEuNy00IDcuNC4xIDkuMWw3My4yIDI5YzYuNCAyLjYgMTMuNiAyLjYgMjAgMGw3My4yLTI5YzQuMS0xLjYgNC4xLTcuNC4xLTkuMWwtNzMtMzAuMUMxMDMuMiAyIDk1LjcgMiA4OSA0LjgiLz48cGF0aCBmaWxsPSIjMThiZmZmIiBkPSJNMTA1LjkgODguOXY3Mi41YzAgMy40IDMuNSA1LjggNi43IDQuNWw4MS42LTMxLjdjMS45LS43IDMuMS0yLjUgMy4xLTQuNVY1Ny4yYzAtMy40LTMuNS01LjgtNi43LTQuNUwxMDkgODQuM2MtMS45LjgtMy4xIDIuNi0zLjEgNC42Ii8+PHBhdGggZmlsbD0iI2Y4MmI2MCIgZD0ibTg2LjkgOTIuNi0yNC4yIDExLjctMi41IDEuMkw5LjEgMTMwYy0zLjIgMS42LTcuNC0uOC03LjQtNC40VjU3LjVjMC0xLjMuNy0yLjQgMS42LTMuM3EuNi0uNiAxLjItLjljMS4yLS43IDMtLjkgNC40LS4zbDc3LjUgMzAuN2M0IDEuNSA0LjMgNy4xLjUgOC45Ii8+PHBhdGggZmlsbD0iI2JhMWU0NSIgZD0ibTg2LjkgOTIuNi0yNC4yIDExLjctNTkuNC01MHEuNi0uNiAxLjItLjljMS4yLS43IDMtLjkgNC40LS4zbDc3LjUgMzAuN2M0IDEuNCA0LjMgNyAuNSA4LjgiLz48L3N2Zz4="
        },
        "displayName": "Airtable",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          }
        ]
      },
      {
        "id": 14,
        "icon": "fa:code",
        "name": "n8n-nodes-base.function",
        "codex": {
          "data": {
            "alias": [
              "Code",
              "Javascript",
              "Custom Code",
              "Script",
              "cpde"
            ],
            "details": "The Function node allows you to execute JavaScript in your workflow. Unlike the Function Item node, this node does not operate on incoming node data per-item. Instead, you must iterate over multiple items of incoming data yourself. This can be useful if you're performing data transformation where you want to manipulate the number of items being outputted by the node (i.e. 1 item is inputted in with nested object, 10 items are outputted without any nested objects)",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-goals-level-up-your-vocabulary-with-vonage-and-n8n/",
                  "icon": "🎯",
                  "label": "2021 Goals: Level Up Your Vocabulary With Vonage and n8n"
                },
                {
                  "url": "https://n8n.io/blog/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/why-i-chose-n8n-over-zapier-in-2020/",
                  "icon": "😍",
                  "label": "Why I chose n8n over Zapier in 2020"
                },
                {
                  "url": "https://n8n.io/blog/how-to-host-virtual-coffee-breaks-with-n8n/",
                  "icon": "☕️",
                  "label": "How to host virtual coffee breaks with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/",
                  "icon": "📡",
                  "label": "Database Monitoring and Alerting with 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/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/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-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/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/tracking-time-spent-in-meetings-with-google-calendar-twilio-and-n8n/",
                  "icon": "🗓",
                  "label": "Tracking Time Spent in Meetings With Google Calendar, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-error-workflows-in-n8n/",
                  "icon": "🌪",
                  "label": "Creating Error Workflows in n8n"
                },
                {
                  "url": "https://n8n.io/blog/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/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "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.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Function",
          "color": "#FF9922"
        },
        "iconData": {
          "icon": "code",
          "type": "icon"
        },
        "displayName": "Function",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "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": 499,
        "icon": "file:stripe.svg",
        "name": "n8n-nodes-base.stripe",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.stripe/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/stripe/"
                }
              ]
            },
            "categories": [
              "Finance & Accounting",
              "Sales"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Stripe"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjU0IC04MCAzNjAgMzYwIj48cGF0aCBkPSJNNDE0IDExMy40YzAtMjUuNi0xMi40LTQ1LjgtMzYuMS00NS44LTIzLjggMC0zOC4yIDIwLjItMzguMiA0NS42IDAgMzAuMSAxNyA0NS4zIDQxLjQgNDUuMyAxMS45IDAgMjAuOS0yLjcgMjcuNy02LjV2LTIwYy02LjggMy40LTE0LjYgNS41LTI0LjUgNS41LTkuNyAwLTE4LjMtMy40LTE5LjQtMTUuMmg0OC45YzAtMS4zLjItNi41LjItOC45bS00OS40LTkuNWMwLTExLjMgNi45LTE2IDEzLjItMTYgNi4xIDAgMTIuNiA0LjcgMTIuNiAxNnptLTYzLjUtMzYuM2MtOS44IDAtMTYuMSA0LjYtMTkuNiA3LjhsLTEuMy02LjJoLTIydjExNi42bDI1LTUuMy4xLTI4LjNjMy42IDIuNiA4LjkgNi4zIDE3LjcgNi4zIDE3LjkgMCAzNC4yLTE0LjQgMzQuMi00Ni4xLS4xLTI5LTE2LjYtNDQuOC0zNC4xLTQ0LjhtLTYgNjguOWMtNS45IDAtOS40LTIuMS0xMS44LTQuN2wtLjEtMzcuMWMyLjYtMi45IDYuMi00LjkgMTEuOS00LjkgOS4xIDAgMTUuNCAxMC4yIDE1LjQgMjMuMyAwIDEzLjQtNi4yIDIzLjQtMTUuNCAyMy40bS03MS4zLTc0LjggMjUuMS01LjRWMzZsLTI1LjEgNS4zem0wIDcuNmgyNS4xdjg3LjVoLTI1LjF6bS0yNi45IDcuNC0xLjYtNy40aC0yMS42djg3LjVoMjVWOTcuNWM1LjktNy43IDE1LjktNi4zIDE5LTUuMnYtMjNjLTMuMi0xLjItMTQuOS0zLjQtMjAuOCA3LjRtLTUwLTI5LjEtMjQuNCA1LjItLjEgODAuMWMwIDE0LjggMTEuMSAyNS43IDI1LjkgMjUuNyA4LjIgMCAxNC4yLTEuNSAxNy41LTMuM1YxMzVjLTMuMiAxLjMtMTkgNS45LTE5LTguOVY5MC42aDE5VjY5LjNoLTE5ek03OS4zIDk0LjdjMC0zLjkgMy4yLTUuNCA4LjUtNS40IDcuNiAwIDE3LjIgMi4zIDI0LjggNi40VjcyLjJjLTguMy0zLjMtMTYuNS00LjYtMjQuOC00LjZDNjcuNSA2Ny42IDU0IDc4LjIgNTQgOTUuOWMwIDI3LjYgMzggMjMuMiAzOCAzNS4xIDAgNC42LTQgNi4xLTkuNiA2LjEtOC4zIDAtMTguOS0zLjQtMjcuMy04djIzLjhjOS4zIDQgMTguNyA1LjcgMjcuMyA1LjcgMjAuOCAwIDM1LjEtMTAuMyAzNS4xLTI4LjItLjEtMjkuOC0zOC4yLTI0LjUtMzguMi0zNS43IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojNjM1YmZmIi8+PC9zdmc+"
        },
        "displayName": "Stripe",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 2,
            "name": "Sales"
          },
          {
            "id": 8,
            "name": "Finance & Accounting"
          }
        ]
      },
      {
        "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": 839,
        "icon": "fa:clock",
        "name": "n8n-nodes-base.scheduleTrigger",
        "codex": {
          "data": {
            "alias": [
              "Time",
              "Scheduler",
              "Polling",
              "Cron",
              "Interval"
            ],
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\",\"schedule\"]",
        "defaults": {
          "name": "Schedule Trigger",
          "color": "#31C49F"
        },
        "iconData": {
          "icon": "clock",
          "type": "icon"
        },
        "displayName": "Schedule Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 39,
        "name": "CRM"
      }
    ],
    "image": []
  }
}