{"workflow":{"id":14573,"name":"Extract invoice data from PDF with Claude AI and create vendor bill in Odoo 18","views":0,"recentViews":0,"totalViews":0,"createdAt":"2026-04-01T13:15:49.708Z","description":"This workflow automates **accounts payable**: upload a PDF invoice, let Claude AI extract the key fields, and automatically create a vendor bill (incoming invoice) in Odoo 18.\n\n## Who is this for?\nSmall and medium businesses using Odoo 18 who want to automate invoice data entry. Finance teams, bookkeepers, or anyone processing incoming invoices manually.\n\n## How it works\n1. Receive a PDF invoice via webhook (file upload)\n2. Convert the PDF to base64 for AI processing\n3. Claude AI extracts: vendor name, invoice number, date, amounts, tax rate\n4. Authenticate with Odoo 18 via JSON-RPC API\n5. Check for duplicate invoices (by invoice number)\n6. Find or create the vendor (res.partner) in Odoo\n7. Create a **draft** vendor bill (account.move) in Odoo\n8. Return a structured JSON response with the result\n\nThe invoice is created in **draft status** so you can review and confirm it manually in Odoo before posting.\n\n## Extracted fields\n`vendor`, `invoice_number`, `invoice_date`, `total_amount`, `currency`, `net_amount`, `tax_rate`, `tax_amount`\n\n## Setup\n1. Open the **Configuration** node and enter your Odoo URL, database, user, and password\n2. Create an **HTTP Header Auth** credential named `Anthropic API Key` with header name `x-api-key` and your Anthropic API key as value\n3. Activate the workflow and send a test PDF\n\n## Test with curl\n```\ncurl -X POST https://your-n8n-instance.com/webhook/invoice-process -F \"data=@invoice.pdf\"\n```\n\n## Requirements\n- Odoo 18 with Invoicing module installed\n- Anthropic API key (Claude Sonnet 4.5 recommended)\n- n8n 2.x (self-hosted or cloud)\n\n## How to customize\n- Change the AI model in the **Configuration** node (e.g. `claude-haiku-4-5-20251001` for lower cost)\n- Modify the extraction prompt in **Prepare Claude Request** to add custom fields\n- Add a file storage step after invoice creation (e.g. Google Drive, S3, WebDAV)\n- Connect an email trigger instead of the webhook for fully automated processing\n\n## Note on data privacy\nThis workflow sends PDF documents to the Anthropic API for data extraction. Ensure you have a [Data Processing Agreement (DPA)](https://www.anthropic.com/legal/data-processing-addendum) with Anthropic and comply with your local data protection regulations (e.g. GDPR) before processing documents containing personal data.\n\n**Author:** Florian Eiche — [eiche-digital.de](https://eiche-digital.de)","workflow":{"id":"jjHhqwplpaGh6V3b","meta":{"instanceId":"a39a10e1017be5c481194e25798c5c17cd990d01d0f9a443239bb35790ba5b46"},"name":"Extract invoice data from PDF with Claude AI and create vendor bill in Odoo 18","tags":[],"nodes":[{"id":"0bd4b266-d85d-40c5-bbea-278d23dba904","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-976,768],"parameters":{"color":"#FFF5D6","width":940,"height":1072,"content":"## Extract Invoice Data from PDF with Claude AI and Create Vendor Bill in Odoo 18\n\nThis workflow automates **accounts payable**: upload a PDF invoice, let Claude AI extract the key fields, and automatically create a vendor bill (incoming invoice) in Odoo 18.\n\n## Who is this for?\nSmall and medium businesses using Odoo 18 who want to automate invoice data entry. Finance teams, bookkeepers, or anyone processing incoming invoices manually.\n\n## How it works\n1. Receive a PDF invoice via webhook (file upload)\n2. Convert the PDF to base64 for AI processing\n3. Claude AI extracts: vendor name, invoice number, date, amounts, tax rate\n4. Authenticate with Odoo 18 via JSON-RPC API\n5. Check for duplicate invoices (by invoice number)\n6. Find or create the vendor (res.partner) in Odoo\n7. Create a **draft** vendor bill (account.move) in Odoo\n8. Return a structured JSON response with the result\n\nThe invoice is created in **draft status** so you can review and confirm it manually in Odoo before posting.\n\n## Extracted fields\n`vendor`, `invoice_number`, `invoice_date`, `total_amount`, `currency`, `net_amount`, `tax_rate`, `tax_amount`\n\n## Setup\n- [ ] Open the **Configuration** node and enter your Odoo URL, database, user, and password\n- [ ] Create an **HTTP Header Auth** credential named `Anthropic API Key` with header name `x-api-key` and your Anthropic API key as value\n- [ ] Activate the workflow and send a test PDF\n\n## Test with curl\n```\ncurl -X POST https://your-n8n-instance.com/webhook/invoice-process -F \"data=@invoice.pdf\"\n```\n\n## Requirements\n- Odoo 18 with Invoicing module installed\n- Anthropic API key (Claude Sonnet 4.5 recommended)\n- n8n 2.x (self-hosted or cloud)\n\n## How to customize\n- Change the AI model in the **Configuration** node (e.g. `claude-haiku-4-5-20251001` for lower cost)\n- Modify the extraction prompt in **Prepare Claude Request** to add custom fields\n- Add a file storage step after invoice creation (e.g. Google Drive, S3, WebDAV)\n- Connect an email trigger instead of the webhook for fully automated processing\n\n## Note on data privacy\nThis workflow sends PDF documents to the Anthropic API for data extraction. Ensure you have a [Data Processing Agreement (DPA)](https://www.anthropic.com/legal/data-processing-addendum) with Anthropic and comply with your local data protection regulations (e.g. GDPR) before processing documents containing personal data.\n\n**Author:** Florian Eiche — [eiche-digital.de](https://eiche-digital.de)\n"},"typeVersion":1},{"id":"c3c7da18-0bac-49d8-9562-f768a3b4b244","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[0,1232],"parameters":{"color":"#737373","width":1340,"height":312,"content":"## 1. PDF Upload & AI Extraction\nThe webhook receives a PDF file upload. The file is converted to base64, then sent to Claude AI with a structured extraction prompt. Claude returns JSON with all invoice fields."},"typeVersion":1},{"id":"45f83c7f-4d07-47f9-945d-bc6a24de23e1","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[1360,1232],"parameters":{"color":"#737373","width":1172,"height":312,"content":"## 2. Odoo Authentication & Duplicate Check\nAuthenticate via JSON-RPC, then search for existing invoices with the same reference number. If a duplicate is found, the workflow returns a clean response instead of creating a duplicate."},"typeVersion":1},{"id":"10c75ce5-79a5-4600-a7c8-0d20f7b327a2","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[2544,1232],"parameters":{"color":"#737373","width":1404,"height":568,"content":"## 3. Vendor Lookup & Creation\nSearch for the vendor by name in Odoo. If found, use the existing partner. If not, create a new vendor (res.partner) with `supplier_rank: 1`."},"typeVersion":1},{"id":"b75880da-c3df-4e65-b7cb-d366d1da377b","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[3968,1232],"parameters":{"color":"#737373","width":1044,"height":568,"content":"## 4. Invoice Creation & Response\nCreate a draft vendor bill (account.move with move_type `in_invoice`) in Odoo. The invoice is created with one line containing the net amount. Returns a JSON response with the Odoo invoice ID."},"typeVersion":1},{"id":"bf398631-cba8-45af-9934-38ef17a3d88c","name":"Receive Invoice PDF","type":"n8n-nodes-base.webhook","position":[64,1376],"webhookId":"0dae5810-4c3c-42b6-a6b6-4e4f350e64c2","parameters":{"path":"invoice-process","options":{},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2},{"id":"057afa8e-248a-452e-8894-96ece1c0a752","name":"PDF to Base64","type":"n8n-nodes-base.extractFromFile","position":[320,1376],"parameters":{"options":{},"operation":"binaryToPropery"},"typeVersion":1},{"id":"eb9426eb-cc78-473c-9bab-21aa3a736b99","name":"Configuration","type":"n8n-nodes-base.set","position":[592,1376],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"odooUrl\": \"https://your-odoo-instance.com\",\n  \"odooDb\": \"your_database_name\",\n  \"odooUser\": \"admin\",\n  \"odooPassword\": \"your_password_here\",\n  \"anthropicModel\": \"claude-sonnet-4-5-20250929\"\n}"},"typeVersion":3.4},{"id":"67de80c2-861b-4127-8f1e-bd5cc6b3a6d4","name":"Prepare Claude Request","type":"n8n-nodes-base.code","position":[864,1376],"parameters":{"jsCode":"// Build Anthropic API request with PDF as base64 document\nconst base64Item = $('PDF to Base64').first().json;\nconst pdfBase64 = base64Item.data;\n\nif (!pdfBase64 || pdfBase64.length < 100) {\n  throw new Error('No valid PDF data received. Length: ' + (pdfBase64 ? pdfBase64.length : 0));\n}\n\nconst config = $('Configuration').first().json;\n\nconst requestBody = {\n  model: config.anthropicModel || 'claude-sonnet-4-5-20250929',\n  max_tokens: 1024,\n  messages: [{\n    role: 'user',\n    content: [\n      {\n        type: 'document',\n        source: {\n          type: 'base64',\n          media_type: 'application/pdf',\n          data: pdfBase64\n        }\n      },\n      {\n        type: 'text',\n        text: 'Extract the following fields from this invoice and return ONLY valid JSON, no markdown, no explanation:\\n\\n{\\n  \"vendor\": \"Name of the vendor/sender\",\\n  \"invoice_number\": \"Invoice number\",\\n  \"invoice_date\": \"YYYY-MM-DD\",\\n  \"total_amount\": 0.00,\\n  \"currency\": \"EUR\",\\n  \"net_amount\": 0.00,\\n  \"tax_rate\": 19,\\n  \"tax_amount\": 0.00\\n}\\n\\nIf a field is not found, set it to null.'\n      }\n    ]\n  }]\n};\n\nreturn [{ json: { requestBody } }];"},"typeVersion":2},{"id":"5fba2aef-0212-4817-b5d4-c89e9011ee95","name":"Claude AI Extract","type":"n8n-nodes-base.httpRequest","onError":"continueErrorOutput","position":[1152,1376],"parameters":{"url":"https://api.anthropic.com/v1/messages","method":"POST","options":{},"jsonBody":"={{ JSON.stringify($json.requestBody) }}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","headerParameters":{"parameters":[{"name":"anthropic-version","value":"2023-06-01"}]}},"typeVersion":4.2},{"id":"4fffd0e5-cbd0-4ecf-a400-b4bdf41d29c8","name":"Parse Extraction","type":"n8n-nodes-base.code","position":[1392,1376],"parameters":{"jsCode":"// Parse and validate Claude AI response\nconst response = $input.first().json;\n\nif (response.error) {\n  throw new Error('Claude API error: ' + (response.error.message || JSON.stringify(response.error)));\n}\n\nconst text = response.content?.[0]?.text || '';\n\nlet invoice;\ntry {\n  const cleaned = text.replace(/```json\\n?/g, '').replace(/```\\n?/g, '').trim();\n  invoice = JSON.parse(cleaned);\n} catch (e) {\n  throw new Error('Claude response is not valid JSON: ' + text.substring(0, 300));\n}\n\n// Validate required fields\nconst required = ['vendor', 'invoice_number', 'invoice_date', 'total_amount'];\nconst missing = required.filter(f => !invoice[f] && invoice[f] !== 0);\nif (missing.length > 0) {\n  throw new Error('Missing required fields: ' + missing.join(', '));\n}\n\n// Normalize numeric values\ninvoice.total_amount = parseFloat(invoice.total_amount);\ninvoice.net_amount = invoice.net_amount ? parseFloat(invoice.net_amount) : invoice.total_amount;\ninvoice.tax_amount = invoice.tax_amount ? parseFloat(invoice.tax_amount) : 0;\ninvoice.tax_rate = invoice.tax_rate ? parseFloat(invoice.tax_rate) : 0;\ninvoice.currency = invoice.currency || 'EUR';\n\nreturn [{ json: invoice }];"},"typeVersion":2},{"id":"3011122b-d5df-4492-a4ae-9703aed98373","name":"Odoo Authenticate","type":"n8n-nodes-base.httpRequest","onError":"continueErrorOutput","position":[1648,1376],"parameters":{"url":"={{ $('Configuration').first().json.odooUrl }}/jsonrpc","method":"POST","options":{},"jsonBody":"={{ JSON.stringify({ jsonrpc: '2.0', method: 'call', params: { service: 'common', method: 'authenticate', args: [$('Configuration').first().json.odooDb, $('Configuration').first().json.odooUser, $('Configuration').first().json.odooPassword, {}] }, id: 1 }) }}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"72c9312e-7ed7-4131-a1d5-b342cf5b3386","name":"Prepare Duplicate Check","type":"n8n-nodes-base.code","position":[1904,1376],"parameters":{"jsCode":"// Verify Odoo auth and prepare duplicate check\nconst authResult = $input.first().json;\nif (!authResult.result || authResult.error) {\n  throw new Error('Odoo authentication failed: ' + JSON.stringify(authResult.error || 'uid is null'));\n}\n\nconst uid = authResult.result;\nconst config = $('Configuration').first().json;\nconst invoice = $('Parse Extraction').first().json;\n\n// Search for existing invoice with same reference number\nconst dupCheckBody = {\n  jsonrpc: '2.0',\n  method: 'call',\n  params: {\n    service: 'object',\n    method: 'execute_kw',\n    args: [\n      config.odooDb,\n      uid,\n      config.odooPassword,\n      'account.move',\n      'search_read',\n      [[['ref', '=', invoice.invoice_number], ['move_type', '=', 'in_invoice']]],\n      { fields: ['id', 'ref', 'partner_id', 'state', 'amount_total'], limit: 1 }\n    ]\n  },\n  id: 10\n};\n\nreturn [{ json: { uid, dupCheckBody, invoice } }];"},"typeVersion":2},{"id":"f3fe614e-b5d0-4a65-bf9d-124db82c9384","name":"Search Duplicate Invoice","type":"n8n-nodes-base.httpRequest","position":[2144,1376],"parameters":{"url":"={{ $('Configuration').first().json.odooUrl }}/jsonrpc","method":"POST","options":{},"jsonBody":"={{ JSON.stringify($json.dupCheckBody) }}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"50f05a19-ad7d-4596-befd-5612e8781bba","name":"Duplicate Found?","type":"n8n-nodes-base.if","position":[2384,1376],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true},"combinator":"and","conditions":[{"id":"condition-duplicate-exists","operator":{"type":"number","operation":"gt"},"leftValue":"={{ $json.result.length }}","rightValue":0}]}},"typeVersion":2},{"id":"ebbb50ce-d57a-4876-b44f-4557ef378cd5","name":"Handle Duplicate","type":"n8n-nodes-base.code","position":[2624,1376],"parameters":{"jsCode":"// Duplicate found — return clean response\nconst dupResult = $('Search Duplicate Invoice').first().json.result[0];\nconst invoice = $('Prepare Duplicate Check').first().json.invoice;\n\nreturn [{\n  json: {\n    success: false,\n    duplicate: true,\n    message: 'Invoice ' + invoice.invoice_number + ' already exists in Odoo.',\n    existing_invoice: {\n      odoo_id: dupResult.id,\n      status: dupResult.state,\n      amount: dupResult.amount_total,\n      vendor: dupResult.partner_id ? dupResult.partner_id[1] : null\n    },\n    extracted_data: invoice\n  }\n}];"},"typeVersion":2},{"id":"abac0d06-aaea-43d7-bf2c-3cc833de45a0","name":"Prepare Vendor Search","type":"n8n-nodes-base.code","position":[2624,1536],"parameters":{"jsCode":"// No duplicate — prepare vendor search\nconst prev = $('Prepare Duplicate Check').first().json;\nconst config = $('Configuration').first().json;\n\nconst searchBody = {\n  jsonrpc: '2.0',\n  method: 'call',\n  params: {\n    service: 'object',\n    method: 'execute_kw',\n    args: [\n      config.odooDb,\n      prev.uid,\n      config.odooPassword,\n      'res.partner',\n      'search_read',\n      [[['name', 'ilike', prev.invoice.vendor], ['supplier_rank', '>', 0]]],\n      { fields: ['id', 'name'], limit: 1 }\n    ]\n  },\n  id: 2\n};\n\nreturn [{ json: { uid: prev.uid, searchBody, invoice: prev.invoice } }];"},"typeVersion":2},{"id":"eaff093f-d675-4a21-bd52-76df146eb9b6","name":"Search Vendor","type":"n8n-nodes-base.httpRequest","position":[2864,1536],"parameters":{"url":"={{ $('Configuration').first().json.odooUrl }}/jsonrpc","method":"POST","options":{},"jsonBody":"={{ JSON.stringify($json.searchBody) }}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"daeb5b81-3552-4797-bfa7-0b1bc8c26d1b","name":"Vendor Exists?","type":"n8n-nodes-base.if","position":[3104,1376],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true},"combinator":"and","conditions":[{"id":"condition-vendor-exists","operator":{"type":"number","operation":"gt"},"leftValue":"={{ $json.result.length }}","rightValue":0}]}},"typeVersion":2},{"id":"ffd976ba-0a8c-4774-9adf-592736a0fcfd","name":"Use Existing Vendor","type":"n8n-nodes-base.code","position":[3344,1360],"parameters":{"jsCode":"// Use existing vendor\nconst partnerId = $json.result[0].id;\nconst partnerName = $json.result[0].name;\nconst prev = $('Prepare Vendor Search').first().json;\n\nreturn [{\n  json: {\n    partnerId,\n    partnerName,\n    uid: prev.uid,\n    invoice: prev.invoice\n  }\n}];"},"typeVersion":2},{"id":"c34dd409-5f06-4417-8cf4-e3537d607158","name":"Prepare Create Vendor","type":"n8n-nodes-base.code","position":[3344,1488],"parameters":{"jsCode":"// Vendor not found — prepare creation\nconst config = $('Configuration').first().json;\nconst prev = $('Prepare Vendor Search').first().json;\n\nconst createBody = {\n  jsonrpc: '2.0',\n  method: 'call',\n  params: {\n    service: 'object',\n    method: 'execute_kw',\n    args: [\n      config.odooDb,\n      prev.uid,\n      config.odooPassword,\n      'res.partner',\n      'create',\n      [{ name: prev.invoice.vendor, supplier_rank: 1, company_type: 'company' }]\n    ]\n  },\n  id: 3\n};\n\nreturn [{ json: { createBody, uid: prev.uid, invoice: prev.invoice } }];"},"typeVersion":2},{"id":"29db158d-d227-450f-a8e0-53eaa894a00f","name":"Create Vendor in Odoo","type":"n8n-nodes-base.httpRequest","position":[3584,1488],"parameters":{"url":"={{ $('Configuration').first().json.odooUrl }}/jsonrpc","method":"POST","options":{},"jsonBody":"={{ JSON.stringify($json.createBody) }}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"25137c82-5c80-4a18-82c0-9011da543f5e","name":"Get New Vendor ID","type":"n8n-nodes-base.code","position":[3792,1488],"parameters":{"jsCode":"// Extract new vendor ID from create response\nconst result = $input.first().json;\nif (!result.result) {\n  throw new Error('Failed to create vendor: ' + JSON.stringify(result.error || result));\n}\n\nconst prev = $('Prepare Create Vendor').first().json;\n\nreturn [{\n  json: {\n    partnerId: result.result,\n    partnerName: prev.invoice.vendor,\n    uid: prev.uid,\n    invoice: prev.invoice\n  }\n}];"},"typeVersion":2},{"id":"a33d9edb-8a89-413e-8e64-8fd330a2720a","name":"Prepare Invoice","type":"n8n-nodes-base.code","position":[4048,1360],"parameters":{"jsCode":"// Prepare Odoo vendor bill (account.move)\nconst data = $input.first().json;\nconst config = $('Configuration').first().json;\n\nconst invoiceBody = {\n  jsonrpc: '2.0',\n  method: 'call',\n  params: {\n    service: 'object',\n    method: 'execute_kw',\n    args: [\n      config.odooDb,\n      data.uid,\n      config.odooPassword,\n      'account.move',\n      'create',\n      [{\n        move_type: 'in_invoice',\n        partner_id: data.partnerId,\n        ref: data.invoice.invoice_number,\n        invoice_date: data.invoice.invoice_date,\n        invoice_line_ids: [\n          [0, 0, {\n            name: 'Invoice ' + data.invoice.invoice_number + ' - ' + data.invoice.vendor,\n            quantity: 1,\n            price_unit: data.invoice.net_amount\n          }]\n        ]\n      }]\n    ]\n  },\n  id: 4\n};\n\nreturn [{\n  json: {\n    invoiceBody,\n    partnerId: data.partnerId,\n    partnerName: data.partnerName,\n    uid: data.uid,\n    invoice: data.invoice\n  }\n}];"},"typeVersion":2},{"id":"696ad174-97fd-493f-acee-5475b99ca5be","name":"Create Invoice in Odoo","type":"n8n-nodes-base.httpRequest","onError":"continueErrorOutput","position":[4288,1504],"parameters":{"url":"={{ $('Configuration').first().json.odooUrl }}/jsonrpc","method":"POST","options":{},"jsonBody":"={{ JSON.stringify($json.invoiceBody) }}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"19a84d9f-9c13-4ed6-942a-5118bb66a8aa","name":"Build Response","type":"n8n-nodes-base.code","position":[4528,1360],"parameters":{"jsCode":"// Verify invoice creation and build success response\nconst result = $input.first().json;\nif (!result.result) {\n  throw new Error('Failed to create invoice: ' + JSON.stringify(result.error || result));\n}\n\nconst prev = $('Prepare Invoice').first().json;\n\nreturn [{\n  json: {\n    success: true,\n    odoo_invoice_id: result.result,\n    partner_id: prev.partnerId,\n    partner_name: prev.partnerName,\n    invoice: prev.invoice\n  }\n}];"},"typeVersion":2},{"id":"3ccdd767-939e-4d60-b867-71eb57bac30e","name":"Success Response","type":"n8n-nodes-base.respondToWebhook","position":[4768,1360],"parameters":{"options":{},"respondWith":"json","responseBody":"={{ JSON.stringify($json) }}"},"typeVersion":1},{"id":"dcedaa35-36c5-4ac0-b990-caf9cc6e7b72","name":"Duplicate Response","type":"n8n-nodes-base.respondToWebhook","position":[2864,1376],"parameters":{"options":{},"respondWith":"json","responseBody":"={{ JSON.stringify($json) }}"},"typeVersion":1},{"id":"d511e2fd-8ca9-441c-8c16-9059f6170ae3","name":"Error Response","type":"n8n-nodes-base.respondToWebhook","position":[1808,1744],"parameters":{"options":{"responseCode":500},"respondWith":"json","responseBody":"={{ JSON.stringify({ success: false, error: $json.error?.message || $json.message || 'Unknown error', node: $json.node || 'unknown' }) }}"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"binaryMode":"separate","executionOrder":"v1"},"versionId":"9e93180c-b647-4acd-a020-827012ae57ec","connections":{"Configuration":{"main":[[{"node":"Prepare Claude Request","type":"main","index":0}]]},"PDF to Base64":{"main":[[{"node":"Configuration","type":"main","index":0}]]},"Search Vendor":{"main":[[{"node":"Vendor Exists?","type":"main","index":0}]]},"Build Response":{"main":[[{"node":"Success Response","type":"main","index":0}]]},"Vendor Exists?":{"main":[[{"node":"Use Existing Vendor","type":"main","index":0}],[{"node":"Prepare Create Vendor","type":"main","index":0}]]},"Prepare Invoice":{"main":[[{"node":"Create Invoice in Odoo","type":"main","index":0}]]},"Duplicate Found?":{"main":[[{"node":"Handle Duplicate","type":"main","index":0}],[{"node":"Prepare Vendor Search","type":"main","index":0}]]},"Handle Duplicate":{"main":[[{"node":"Duplicate Response","type":"main","index":0}]]},"Parse Extraction":{"main":[[{"node":"Odoo Authenticate","type":"main","index":0}]]},"Claude AI Extract":{"main":[[{"node":"Parse Extraction","type":"main","index":0}],[{"node":"Error Response","type":"main","index":0}]]},"Get New Vendor ID":{"main":[[{"node":"Prepare Invoice","type":"main","index":0}]]},"Odoo Authenticate":{"main":[[{"node":"Prepare Duplicate Check","type":"main","index":0}],[{"node":"Error Response","type":"main","index":0}]]},"Receive Invoice PDF":{"main":[[{"node":"PDF to Base64","type":"main","index":0}]]},"Use Existing Vendor":{"main":[[{"node":"Prepare Invoice","type":"main","index":0}]]},"Create Vendor in Odoo":{"main":[[{"node":"Get New Vendor ID","type":"main","index":0}]]},"Prepare Create Vendor":{"main":[[{"node":"Create Vendor in Odoo","type":"main","index":0}]]},"Prepare Vendor Search":{"main":[[{"node":"Search Vendor","type":"main","index":0}]]},"Create Invoice in Odoo":{"main":[[{"node":"Build Response","type":"main","index":0}],[{"node":"Error Response","type":"main","index":0}]]},"Prepare Claude Request":{"main":[[{"node":"Claude AI Extract","type":"main","index":0}]]},"Prepare Duplicate Check":{"main":[[{"node":"Search Duplicate Invoice","type":"main","index":0}]]},"Search Duplicate Invoice":{"main":[[{"node":"Duplicate Found?","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":29,"nodeTypes":{"n8n-nodes-base.if":{"count":2},"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":10},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.httpRequest":{"count":6},"n8n-nodes-base.extractFromFile":{"count":1},"n8n-nodes-base.respondToWebhook":{"count":3}}},"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":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"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/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"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/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/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"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/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/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/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/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"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-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/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"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.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"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":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"}]},{"id":1235,"icon":"file:extractFromFile.svg","name":"n8n-nodes-base.extractFromFile","codex":{"data":{"alias":["CSV","Spreadsheet","Excel","xls","xlsx","ods","tabular","decode","decoding","Move Binary Data","Binary","File","PDF","JSON","HTML","ICS","iCal","txt","Text","RTF","XML","64","Base64","Convert"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.extractfromfile/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Files","Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Extract from File"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAuOTM3NSAyQzAuNDE5NzMzIDIgMCAyLjQxOTczIDAgMi45Mzc1VjM3LjMyMjFDMCAzNy44Mzk5IDAuNDE5NzMzIDM4LjI1OTYgMC45Mzc1IDM4LjI1OTZIMjYuMjE1NEMyNi43MzMyIDM4LjI1OTYgMjcuMTUyOSAzNy44Mzk5IDI3LjE1MjkgMzcuMzIyMUwyNy4xNTI5IDMwLjY3MTlMMTYuNzk2OSAzMC42NzE5QzE0Ljg5ODQgMzAuNjcxOSAxMy4zNTk0IDI5LjEzMjkgMTMuMzU5NCAyNy4yMzQ0VjI1LjM1OTRDMTMuMzU5NCAyMy40NjA5IDE0Ljg5ODQgMjEuOTIxOSAxNi43OTY5IDIxLjkyMTlIMjcuMTUyOUwyNy4xNTI5IDE1Ljc4MjFIMTQuMzA4M0MxMy43OTA2IDE1Ljc4MjEgMTMuMzcwOCAxNS4zNjI0IDEzLjM3MDggMTQuODQ0NlYySDAuOTM3NVoiIGZpbGw9IiMzNTNGNkUiLz4KPHBhdGggZD0iTTE2LjAyNzEgMkMxNS45NDA4IDIgMTUuODcwOCAyLjA2OTk2IDE1Ljg3MDggMi4xNTYyNVYxMi44MTM0QzE1Ljg3MDggMTMuMDcyMyAxNi4wODA3IDEzLjI4MjEgMTYuMzM5NiAxMy4yODIxSDI2Ljk5NjdDMjcuMDgzIDEzLjI4MjEgMjcuMTUyOSAxMy4yMTIyIDI3LjE1MjkgMTMuMTI1OUwyNy4xNTI5IDEyLjYxNzFDMjcuMTUyOSAxMi4zNjg4IDI3LjA1NDUgMTIuMTMwNyAyNi44NzkxIDExLjk1NUwxNy4yMjI1IDIuMjc1MzhDMTcuMDQ2NiAyLjA5OTA4IDE2LjgwNzkgMiAxNi41NTg4IDJIMTYuMDI3MVoiIGZpbGw9IiMzNTNGNkUiLz4KPHBhdGggZD0iTTI5Ljc2NDIgMzQuNjUwM0MyOS4wMzQgMzMuOTE2IDI5LjAzNzQgMzIuNzI4OCAyOS43NzE2IDMxLjk5ODZMMzMuNjE5NyAyOC4xNzE5TDE2Ljc5NjkgMjguMTcxOUMxNi4yNzkxIDI4LjE3MTkgMTUuODU5NCAyNy43NTIxIDE1Ljg1OTQgMjcuMjM0NFYyNS4zNTk0QzE1Ljg1OTQgMjQuODQxNiAxNi4yNzkxIDI0LjQyMTkgMTYuNzk2OSAyNC40MjE5TDMzLjU0MTIgMjQuNDIxOUwyOS43NzE2IDIwLjY3MzNDMjkuMDM3NCAxOS45NDMxIDI5LjAzNCAxOC43NTU5IDI5Ljc2NDIgMTguMDIxNkMzMC40OTQ0IDE3LjI4NzQgMzEuNjgxNiAxNy4yODQgMzIuNDE1OSAxOC4wMTQyTDM5LjQ0NzEgMjUuMDA2NEMzOS44MDEgMjUuMzU4MyA0MCAyNS44MzY4IDQwIDI2LjMzNTlDNDAgMjYuODM1IDM5LjgwMSAyNy4zMTM1IDM5LjQ0NzEgMjcuNjY1NUwzMi40MTU5IDM0LjY1NzZDMzEuNjgxNiAzNS4zODc4IDMwLjQ5NDQgMzUuMzg0NSAyOS43NjQyIDM0LjY1MDNaIiBmaWxsPSIjMzUzRjZFIi8+Cjwvc3ZnPgo="},"displayName":"Extract from File","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":34,"name":"Invoice Processing"},{"id":49,"name":"AI Summarization"}],"image":[]}}