{"workflow":{"id":14034,"name":"Transform and validate webhook records with configurable type conversion","views":1,"recentViews":0,"totalViews":1,"createdAt":"2026-03-14T07:56:16.356Z","description":"A **self-contained data transformation workflow** that runs entirely inside n8n. No external APIs, no credentials, no third-party services required. Send records via webhook, get transformed and validated data back.\n\nUnlike CRM-specific import workflows, this template is a **standalone data transformer** you can place in front of any system: ERP, CRM, database, or API.\n\n### Who is this for?\nTeams that regularly import data from external sources (suppliers, partners, legacy systems) and need to normalize field names, convert types, and validate records before loading into any target system.\n\n### How it works\n1. **Receive Data**: A webhook accepts a POST request with an array of records (JSON) or a single record\n2. **Configure Mapping**: A Set node defines the field mapping rules, source field, target field, data type, default value, and whether the field is required\n3. **Transform Records**: A Code node applies all mappings: renames fields, converts types (string, number, boolean, date with locale support), fills in defaults, and validates required fields\n4. **Return Result**: The webhook responds with transformed records and a validation report listing any errors per row\n\n### Key features\n- **Zero dependencies**: No credentials, no external services needed\n- **Locale-aware type conversion**: Handles comma decimals (`12,50`), German dates (`DD.MM.YYYY`), and `ja/nein` booleans\n- **Validation report**: Returns per-row errors for required fields and failed type conversions\n- **Flexible input**: Accepts `{ records: [...] }` arrays or single objects\n\n### Setup\n1. Activate the workflow\n2. Edit the **Configure Field Mapping** node to define your mappings\n3. POST your data to the webhook URL\n\n### How to customize\n- Add or remove field mappings in the Set node\n- Set `removeUnmappedFields` to true to strip fields not in the mapping\n- Set `trimStrings` to true to auto-trim whitespace\n- Set `emptyStringToNull` to convert empty strings to null values\n- Adjust `dateInputFormat`, `dateOutputFormat`, and `decimalSeparator` for your locale\n- Connect downstream nodes (database, API, email) after the response to process the output","workflow":{"id":"ECpjYNcNN3deie7g","meta":{"instanceId":"a39a10e1017be5c481194e25798c5c17cd990d01d0f9a443239bb35790ba5b46"},"name":"Transform and map data fields standalone via webhook with configurable type conversion","tags":[],"nodes":[{"id":"6d91c4c4-ce5c-4002-ba1c-4d6e7719db0a","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-640,1424],"parameters":{"color":4,"width":820,"height":952,"content":"## Transform and Map Data Fields, Standalone, No External Services\n\nA **self-contained data transformation workflow** that runs entirely inside n8n. No external APIs, no credentials, no third-party services required. Send records via webhook, get transformed and validated data back.\n\nUnlike CRM-specific import workflows, this template is a **standalone data transformer** you can place in front of any system: ERP, CRM, database, or API.\n\n### Who is this for?\nTeams that regularly import data from external sources (suppliers, partners, legacy systems) and need to normalize field names, convert types, and validate records before loading into any target system.\n\n### How it works\n1. **Receive Data**: A webhook accepts a POST request with an array of records (JSON) or a single record\n2. **Configure Mapping**: A Set node defines the field mapping rules, source field, target field, data type, default value, and whether the field is required\n3. **Transform Records**: A Code node applies all mappings: renames fields, converts types (string, number, boolean, date with locale support), fills in defaults, and validates required fields\n4. **Return Result**: The webhook responds with transformed records and a validation report listing any errors per row\n\n### Key features\n- **Zero dependencies**: No credentials, no external services needed\n- **Locale-aware type conversion**: Handles comma decimals (`12,50`), German dates (`DD.MM.YYYY`), and `ja/nein` booleans\n- **Validation report**: Returns per-row errors for required fields and failed type conversions\n- **Flexible input**: Accepts `{ records: [...] }` arrays or single objects\n\n### Setup\n1. Activate the workflow\n2. Edit the **Configure Field Mapping** node to define your mappings\n3. POST your data to the webhook URL\n\n### How to customize\n- Add or remove field mappings in the Set node\n- Set `removeUnmappedFields` to true to strip fields not in the mapping\n- Set `trimStrings` to true to auto-trim whitespace\n- Set `emptyStringToNull` to convert empty strings to null values\n- Adjust `dateInputFormat`, `dateOutputFormat`, and `decimalSeparator` for your locale\n- Connect downstream nodes (database, API, email) after the response to process the output\n\n**Author:** Florian Eiche, [eiche-digital.de](https://eiche-digital.de)"},"typeVersion":1},{"id":"82078d1b-d018-44a8-8bc1-e949bd5c3adb","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[208,1424],"parameters":{"width":372,"height":548,"content":"### Step 1: Receive Data\nPOST an array of records or a single object:\n```json\n{\n  \"records\": [\n    {\n      \"Artikelnr\": \"A-1001\",\n      \"Bezeichnung\": \"Schraube M8\",\n      \"Preis\": \"12,50\",\n      \"Gewicht_kg\": \"\",\n      \"Aktiv\": \"ja\",\n      \"Erstellt_am\": \"15.03.2026\"\n    }\n  ]\n}\n```\n\nThe webhook accepts both `{ records: [...] }` and a single object `{ field: value }`. Single objects are automatically wrapped in an array."},"typeVersion":1},{"id":"b79d26e2-6033-41f4-b0d0-0b9500ccceee","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[608,1424],"parameters":{"width":340,"height":548,"content":"### Step 2: Configure Field Mapping\nEdit the **Configure Field Mapping** node:\n\n**fieldMappings** — array of rules:\n- `sourceField`: field name in the input data\n- `targetField`: desired field name in the output\n- `dataType`: `string`, `number`, `boolean`, `date`, or `auto`\n- `defaultValue`: value to use when the field is empty or missing\n- `required`: if true, missing values generate an error\n\n**globalSettings**:\n- `removeUnmappedFields`: drop fields not in the mapping\n- `trimStrings`: auto-trim whitespace\n- `emptyStringToNull`: convert `\"\"` to null\n- `dateInputFormat`: expected date format in source data (e.g. `DD.MM.YYYY`)\n- `dateOutputFormat`: output date format (default: `YYYY-MM-DD`)\n- `decimalSeparator`: `.` or `,` for number parsing"},"typeVersion":1},{"id":"976508ce-9c2f-4e3a-830d-e6998b11e019","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[976,1424],"parameters":{"width":300,"height":540,"content":"### Step 3: Transform Records\nThe Code node processes each record:\n1. Iterates over all field mappings\n2. Reads the source field value\n3. Applies type conversion (number, boolean, date)\n4. Falls back to defaultValue if empty\n5. Flags required fields that are still missing\n6. Optionally removes unmapped fields\n\nOutput per record:\n```json\n{\n  \"data\": { /* transformed fields */ },\n  \"errors\": [\"Row 1: 'weight_kg' is required but empty\"]\n}\n```"},"typeVersion":1},{"id":"115b1a34-7165-42b0-bfb9-b4bf7c3836f8","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[1312,1424],"parameters":{"width":308,"height":540,"content":"### Step 4: Return Result\nThe webhook responds with:\n```json\n{\n  \"success\": true,\n  \"totalRecords\": 47,\n  \"validRecords\": 45,\n  \"errorCount\": 2,\n  \"records\": [ /* transformed data */ ],\n  \"errors\": [\n    \"Row 3: 'weight_kg' is required but empty\",\n    \"Row 12: 'price' could not be converted to number\"\n  ]\n}\n```\n\nConnect downstream nodes after the **Return Transformed Data** node to save or forward the result."},"typeVersion":1},{"id":"eb8d97d1-2c25-4ad5-91bf-0466061a53a9","name":"Receive Data","type":"n8n-nodes-base.webhook","position":[336,1984],"webhookId":"8c724893-78a6-419b-9666-c5aeef707db6","parameters":{"path":"transform-data","options":{},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2.1},{"id":"76c80090-9671-4b41-8def-3d186a34bf98","name":"Configure Field Mapping","type":"n8n-nodes-base.set","position":[672,1984],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"fieldMappings\": [\n    {\n      \"sourceField\": \"Artikelnr\",\n      \"targetField\": \"article_number\",\n      \"dataType\": \"string\",\n      \"defaultValue\": \"\",\n      \"required\": true\n    },\n    {\n      \"sourceField\": \"Bezeichnung\",\n      \"targetField\": \"description\",\n      \"dataType\": \"string\",\n      \"defaultValue\": \"\",\n      \"required\": true\n    },\n    {\n      \"sourceField\": \"Preis\",\n      \"targetField\": \"price\",\n      \"dataType\": \"number\",\n      \"defaultValue\": \"0\",\n      \"required\": true\n    },\n    {\n      \"sourceField\": \"Gewicht_kg\",\n      \"targetField\": \"weight_kg\",\n      \"dataType\": \"number\",\n      \"defaultValue\": \"0\",\n      \"required\": false\n    },\n    {\n      \"sourceField\": \"Aktiv\",\n      \"targetField\": \"is_active\",\n      \"dataType\": \"boolean\",\n      \"defaultValue\": \"true\",\n      \"required\": false\n    },\n    {\n      \"sourceField\": \"Erstellt_am\",\n      \"targetField\": \"created_at\",\n      \"dataType\": \"date\",\n      \"defaultValue\": \"\",\n      \"required\": false\n    }\n  ],\n  \"globalSettings\": {\n    \"removeUnmappedFields\": true,\n    \"trimStrings\": true,\n    \"emptyStringToNull\": true,\n    \"dateInputFormat\": \"DD.MM.YYYY\",\n    \"dateOutputFormat\": \"YYYY-MM-DD\",\n    \"decimalSeparator\": \",\"\n  }\n}"},"typeVersion":3.4},{"id":"313f4228-2e63-45a7-895c-9bebc3a1be93","name":"Transform Records","type":"n8n-nodes-base.code","position":[1008,1984],"parameters":{"jsCode":"// Get input data and configuration\nconst raw = $('Receive Data').first().json.body || $('Receive Data').first().json;\nconst config = $('Configure Field Mapping').first().json;\n\nconst mappings = config.fieldMappings || [];\nconst settings = config.globalSettings || {};\n\n// Extract records — support both { records: [...] } and single object\nlet records = [];\nif (raw.records && Array.isArray(raw.records)) {\n  records = raw.records;\n} else if (Array.isArray(raw)) {\n  records = raw;\n} else {\n  // Single object: wrap in array, exclude meta fields\n  const single = {};\n  for (const [k, v] of Object.entries(raw)) {\n    if (k !== 'records') single[k] = v;\n  }\n  records = [single];\n}\n\nif (records.length === 0) {\n  return [{\n    json: {\n      success: false,\n      totalRecords: 0,\n      validRecords: 0,\n      errorCount: 1,\n      records: [],\n      errors: ['No records found in input data']\n    }\n  }];\n}\n\nconst allErrors = [];\nconst transformedRecords = [];\n\n// --- Helper: parse date from input format to output format ---\nfunction parseDate(value, inputFormat, outputFormat) {\n  if (!value || String(value).trim() === '') return null;\n  const v = String(value).trim();\n\n  // Build regex from input format\n  const parts = inputFormat.split(/[.\\-\\/]/);\n  const sep = inputFormat.match(/[.\\-\\/]/)?.[0] || '.';\n  const valueParts = v.split(sep);\n\n  if (valueParts.length !== parts.length) return null;\n\n  let day, month, year;\n  parts.forEach((p, i) => {\n    const upper = p.toUpperCase();\n    if (upper.startsWith('D')) day = parseInt(valueParts[i], 10);\n    else if (upper.startsWith('M')) month = parseInt(valueParts[i], 10);\n    else if (upper.startsWith('Y')) year = parseInt(valueParts[i], 10);\n  });\n\n  if (!day || !month || !year) return null;\n  if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n\n  // Build output\n  const pad = (n) => String(n).padStart(2, '0');\n  return outputFormat\n    .replace('YYYY', String(year))\n    .replace('MM', pad(month))\n    .replace('DD', pad(day));\n}\n\n// --- Helper: parse number with configurable decimal separator ---\nfunction parseNumber(value, decSep) {\n  if (value === null || value === undefined) return null;\n  let v = String(value).trim();\n  if (v === '') return null;\n\n  // Remove thousands separators\n  if (decSep === ',') {\n    v = v.replace(/\\./g, ''); // remove dots (thousands)\n    v = v.replace(',', '.');  // comma to dot\n  } else {\n    v = v.replace(/,/g, ''); // remove commas (thousands)\n  }\n\n  const num = Number(v);\n  return isNaN(num) ? null : num;\n}\n\n// --- Helper: parse boolean ---\nfunction parseBoolean(value) {\n  if (value === null || value === undefined) return null;\n  const v = String(value).trim().toLowerCase();\n  if (['true', '1', 'yes', 'ja', 'y', 'j', 'aktiv', 'active', 'on'].includes(v)) return true;\n  if (['false', '0', 'no', 'nein', 'n', 'inaktiv', 'inactive', 'off'].includes(v)) return false;\n  return null;\n}\n\n// --- Process each record ---\nrecords.forEach((record, rowIndex) => {\n  const rowNum = rowIndex + 1;\n  const transformed = {};\n  const rowErrors = [];\n\n  // Apply each mapping\n  mappings.forEach((mapping) => {\n    const { sourceField, targetField, dataType, defaultValue, required } = mapping;\n    let value = record[sourceField];\n\n    // Trim strings\n    if (settings.trimStrings && typeof value === 'string') {\n      value = value.trim();\n    }\n\n    // Empty string to null\n    if (settings.emptyStringToNull && value === '') {\n      value = null;\n    }\n\n    // Apply default if empty/null/undefined\n    if ((value === null || value === undefined || value === '') && defaultValue !== undefined && defaultValue !== '') {\n      value = defaultValue;\n    }\n\n    // Check required\n    if (required && (value === null || value === undefined || value === '')) {\n      rowErrors.push(`Row ${rowNum}: '${targetField}' is required but empty`);\n      transformed[targetField] = null;\n      return;\n    }\n\n    // Type conversion\n    if (value !== null && value !== undefined && value !== '') {\n      switch (dataType) {\n        case 'number': {\n          const num = parseNumber(value, settings.decimalSeparator || ',');\n          if (num === null) {\n            rowErrors.push(`Row ${rowNum}: '${targetField}' could not be converted to number (value: '${value}')`);\n            value = null;\n          } else {\n            value = num;\n          }\n          break;\n        }\n        case 'boolean': {\n          const bool = parseBoolean(value);\n          if (bool === null) {\n            rowErrors.push(`Row ${rowNum}: '${targetField}' could not be converted to boolean (value: '${value}')`);\n            value = null;\n          } else {\n            value = bool;\n          }\n          break;\n        }\n        case 'date': {\n          const inputFmt = settings.dateInputFormat || 'DD.MM.YYYY';\n          const outputFmt = settings.dateOutputFormat || 'YYYY-MM-DD';\n          const parsed = parseDate(value, inputFmt, outputFmt);\n          if (parsed === null) {\n            rowErrors.push(`Row ${rowNum}: '${targetField}' could not be parsed as date (value: '${value}', expected: '${inputFmt}')`);\n            value = null;\n          } else {\n            value = parsed;\n          }\n          break;\n        }\n        case 'string':\n          value = String(value);\n          break;\n        // 'auto' — keep as-is\n      }\n    }\n\n    transformed[targetField] = value;\n  });\n\n  // Optionally keep unmapped fields\n  if (!settings.removeUnmappedFields) {\n    const mappedSourceFields = mappings.map(m => m.sourceField);\n    for (const [key, val] of Object.entries(record)) {\n      if (!mappedSourceFields.includes(key)) {\n        transformed[key] = val;\n      }\n    }\n  }\n\n  transformedRecords.push(transformed);\n  allErrors.push(...rowErrors);\n});\n\nconst errorCount = allErrors.length;\nconst validRecords = records.length - new Set(allErrors.map(e => {\n  const match = e.match(/Row (\\d+):/);\n  return match ? parseInt(match[1]) : null;\n})).size;\n\nreturn [{\n  json: {\n    success: errorCount === 0,\n    totalRecords: records.length,\n    validRecords,\n    errorCount,\n    records: transformedRecords,\n    errors: allErrors\n  }\n}];"},"typeVersion":2},{"id":"2d4bf337-0bcf-4f0b-afe8-1bf1cd530219","name":"Return Transformed Data","type":"n8n-nodes-base.respondToWebhook","position":[1344,1984],"parameters":{"options":{"responseHeaders":{"entries":[{"name":"Content-Type","value":"application/json"}]}},"respondWith":"json","responseBody":"={{ JSON.stringify($json) }}"},"typeVersion":1.5}],"active":true,"pinData":{},"settings":{"binaryMode":"separate","availableInMCP":false,"executionOrder":"v1"},"versionId":"12ce1d49-c778-4aff-aa43-84036a90e66e","connections":{"Receive Data":{"main":[[{"node":"Configure Field Mapping","type":"main","index":0}]]},"Transform Records":{"main":[[{"node":"Return Transformed Data","type":"main","index":0}]]},"Configure Field Mapping":{"main":[[{"node":"Transform Records","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":9,"nodeTypes":{"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":1},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.respondToWebhook":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Florian Eiche","username":"jagged","bio":"Freelance ERP- und Prozessberater mit 13+ Jahren Erfahrung in Logistik und Pharma. Ich automatisiere Workflows mit n8n, baue Schnittstellen zwischen ERP, CRM und Webshop-Systemen und entwickle individuelle Lösungen für KMU in der DACH-Region. Schwerpunkte: Systemintegration, Workflow-Automatisierung, regulierte Branchen (GxP/Pharma). Zertifizierter Scrum Master (PSM I) und ITIL Foundation.","verified":true,"links":["https://eiche-digital.de/"],"avatar":"https://gravatar.com/avatar/535068ebdbc9fc59003b16ba0ea35ac4b279374067b4ea1732af2a24b6a449de?r=pg&d=retro&size=200"},"nodes":[{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"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/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/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/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/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/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"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/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/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"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/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/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/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.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"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":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"}]}],"categories":[{"id":35,"name":"Document Extraction"}],"image":[]}}