{"workflow":{"id":13615,"name":"Process vendor invoices with UploadToURL, AWS Textract, and Google Sheets","views":27,"recentViews":0,"totalViews":27,"createdAt":"2026-02-23T08:08:34.501Z","description":"# Process invoices with UploadToURL, AWS Textract, and Google Sheets\n\nEliminate manual data entry from your accounts payable process. This workflow transforms raw invoice scans into structured financial records by combining **UploadToURL** for hosting, **AWS Textract** for OCR data extraction, and **Google Sheets** for centralized logging.\n\n## 🎯 What This Workflow Does\n\nTurns any paper or PDF invoice into a verified spreadsheet entry in seconds:\n\n1. **📝 Captures Invoice Scans** - Receives invoices via mobile upload (binary) or remote URL via Webhook.\n2. **☁️ Instant CDN Hosting** - **UploadToURL** hosts the scan and provides a permanent link for your financial audit trail.\n3. **👁️ Intelligent OCR** - **AWS Textract** analyzes the document to extract Vendor Name, Invoice Number, Amount, and Due Date.\n4. **🚦 Validation & Duplicate Check** - Sanitizes currency formats and searches your Google Sheet to prevent double-paying the same invoice.\n5. **📊 Automated Logging** - Records the extracted data directly into **Google Sheets** and pings the finance team in **Slack**.\n\n## ✨ Key Features\n\n- **UploadToURL Integration**: Hosts your financial evidence on a public CDN, making it accessible directly from your spreadsheet cells.\n- **High-Accuracy Extraction**: Uses AWS Textract's specialized invoice processing to handle complex table layouts.\n- **Audit-Ready Records**: Every entry includes the original file URL, upload timestamp, and department metadata.\n- **Smart Formatting**: Automatically normalizes dates and coerces pricing into a standard float format for easy accounting.\n- **Instant Notifications**: Keeps the finance team in the loop with real-time Slack alerts for high-priority bills.\n\n## 💼 Perfect For\n\n- **Finance Teams**: Processing 50+ vendor invoices monthly without manual typing.\n- **Small Business Owners**: Managing utility bills and receipts on the go via smartphone uploads.\n- **Operations Managers**: Tracking departmental spending with a standardized, automated log.\n- **Agencies**: Organizing reimbursable expenses across multiple client projects.\n\n## 🔧 What You'll Need\n\n### Required Integrations\n- **[UploadToURL](https://uploadtourl.com)** - To host invoice scans and provide audit links.\n- **n8n Community Node** - `n8n-nodes-uploadtourl` must be installed.\n- **AWS Account** - Credentials for **AWS Textract** (OCR).\n- **Google Sheets** - OAuth2 credentials to write to your finance spreadsheet.\n\n### Optional Integrations\n- **Slack** - To receive real-time notifications for new invoice entries.\n- **Gmail** - To trigger the workflow automatically when an invoice arrives in your inbox.\n\n## 🚀 Quick Start\n\n1. **Import Template** - Copy the JSON and import it into your n8n canvas.\n2. **Install Node** - Ensure the **UploadToURL** community node is installed.\n3. **Set Credentials** - Link your UploadToURL, AWS, Google Sheets, and Slack accounts.\n4. **Configure Spreadsheet** - Create a sheet with columns: `Invoice No`, `Vendor`, `Amount`, `Due Date`, and `File URL`.\n5. **Set Variables** - Add your `GSHEET_SPREADSHEET_ID` and `SLACK_FINANCE_CHANNEL` to n8n variables.\n6. **Deploy** - Switch the workflow to \"Active\" to begin your automated bookkeeping.\n\n## 🎨 Customization Options\n\n- **Approval Workflow**: Add a \"Wait for Approval\" node so a manager must click a Slack button before the row is finalized.\n- **Tax Calculation**: Insert a code node to automatically calculate VAT or Sales Tax based on the extracted total.\n- **ERP Sync**: Replace Google Sheets with **QuickBooks**, **Xero**, or **NetSuite** to push data directly into your accounting software.\n- **Multi-Currency Support**: Add a Currency Conversion node to normalize all totals into your base company currency.\n\n## 📈 Expected Results\n\n- **90% reduction** in manual data entry time (from minutes to seconds per bill).\n- **Improved Accuracy**: Elimination of typos and transcription errors in financial totals.\n- **Better Audit Compliance**: Every line item in your sheet is permanently linked to the original scan.\n- **Faster Payment Cycles**: Bills are recorded the moment they are received, preventing late fees.\n\n## 🏆 Use Cases\n\n### Accounts Payable\nAutomate the entry of monthly recurring bills (utilities, rent, software) directly into your tracking sheet.\n\n### Employee Reimbursements\nStaff can snap a photo of a business dinner receipt and upload it to the webhook to start the reimbursement process instantly.\n\n### Bulk Document Digitization\nUpload a folder of historical PDF invoices; the workflow will categorize and log them all in one batch.\n\n## 💡 Pro Tips\n\n- **Clear Scans**: Ensure invoices are well-lit and flat; high contrast helps AWS Textract achieve 99% accuracy.\n- **Folder IDs**: Keep your Google Sheet in a shared Drive folder so your entire finance team can access the linked UploadToURL files.\n- **Webhook Security**: Use a unique path or basic auth on your webhook to ensure only authorized devices can submit invoices.\n\n---\n\n**Ready to automate your bookkeeping?** Import this template and connect **UploadToURL** to build a hands-free finance pipeline today.\n\n**Questions about AWS Textract mapping?** The workflow includes detailed sticky notes explaining how to extract custom fields from your specific vendor layouts.","workflow":{"meta":{"instanceId":"277842713620d9f5554de3b1518b865a152c8c4db680008bd8aec536fc18b4a8"},"nodes":[{"id":"d1ba6277-b3f7-487b-a77b-ff5f2c2d1a6d","name":"📋 Overview","type":"n8n-nodes-base.stickyNote","position":[-64,64],"parameters":{"width":560,"height":532,"content":"## invoice data with UploadToURL, AWS Textract, and Google Sheets\nThe Problem: Manually keying data from paper or PDF invoices into spreadsheets is slow and prone to human error.\nThe Solution: An automated Accounts Payable pipeline that hosts scans via UploadToURL, extracts data via AWS Textract, and logs it to Google Sheets.\n\n⚙️ How it Works\nWebhook: Receives an invoice scan (Binary or URL).\n\nUploadToURL: Hosts the file and returns a clean CDN link for the audit trail.\n\nAWS Textract: Automatically reads the document to extract Vendor, Amount, and Due Date.\n\nData Sync: Checks for duplicates and logs the extracted info to Google Sheets and Slack.\n\n🔐 Credentials & Setup\nNode: Install n8n-nodes-uploadtourl via Community Nodes.\n\nAPIs: UploadToURL, AWS (Textract), Google Sheets, and Slack.\n\nVariables: Set GSHEET_SPREADSHEET_ID and SLACK_FINANCE_CHANNEL."},"typeVersion":1},{"id":"6e2da2c6-3c46-44f8-bb2d-90a50d4b780f","name":"Section 1 — Intake","type":"n8n-nodes-base.stickyNote","position":[640,608],"parameters":{"color":7,"width":1048,"height":579,"content":"## 1 — Intake & upload\n\n**Webhook → Validate → Has Remote URL? → Upload to URL (×2) → Extract CDN URL**\n\nAccepts `POST` with `fileUrl` or binary PDF/image. Validates file extension against allowlist (`pdf`, `jpg`, `jpeg`, `png`, `tiff`). UploadToURL hosts the file via the native community node. Both upload paths normalise into a single CDN URL."},"typeVersion":1},{"id":"f64ef54b-433f-4c77-8668-b851e939466f","name":"Section 2 — OCR","type":"n8n-nodes-base.stickyNote","position":[1728,560],"parameters":{"color":7,"width":440,"height":621,"content":"## 2 — OCR extraction\n\n**AWS Textract → Parse & Validate Extracted Data**\n\nTextract runs `AnalyzeExpense` on the CDN URL and returns structured expense fields. The parse node extracts: vendor name, invoice number, total amount, currency, and due date. Flags any missing required fields as `incomplete` status rather than failing hard — so partial extractions still get recorded."},"typeVersion":1},{"id":"5f416608-8948-4a18-8282-fa11699ac19b","name":"Section 3 — Sheets","type":"n8n-nodes-base.stickyNote","position":[2192,560],"parameters":{"color":7,"width":872,"height":749,"content":"## 3 — Duplicate check & Sheets write\n\n**Search Sheets → IF Duplicate? → Append Row or Update Row**\n\nSearches the Google Sheet for an existing row matching the invoice number before writing. Duplicates get flagged with status `duplicate` and skipped. New invoices are appended with status `pending`. Existing rows with the same number but `incomplete` status get updated with the new extraction."},"typeVersion":1},{"id":"a93a57c0-2fbe-478c-bb8f-8834c2614eb2","name":"Section 4 — Notify","type":"n8n-nodes-base.stickyNote","position":[3136,512],"parameters":{"color":7,"width":744,"height":783,"content":"## 4 — Notification & response\n\n**Slack → Build Response → Respond to Webhook**\n\nSlack posts to the finance channel with vendor, amount, due date, status badge, and a direct link to the CDN file. Webhook returns `201` with the full invoice record including the Google Sheets row ID."},"typeVersion":1},{"id":"387f9899-ab39-45c9-962b-e14346742684","name":"Webhook - Receive Invoice","type":"n8n-nodes-base.webhook","position":[672,912],"webhookId":"invoice-webhook-001","parameters":{"path":"invoice-processing","options":{"allowedOrigins":"*"},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2},{"id":"72b70229-44fe-466e-b905-e9d5ef31a89a","name":"Validate Payload","type":"n8n-nodes-base.code","position":[880,912],"parameters":{"jsCode":"const body = $input.first().json.body || $input.first().json;\n\n// ── File source check ────────────────────────────────────────\nif (!body.fileUrl && !body.filename) {\n  throw new Error('Provide either fileUrl (remote document) or filename (for binary upload).');\n}\n\n// ── Filename & extension allowlist ───────────────────────────\nconst filename = body.filename ||\n  body.fileUrl?.split('?')[0].split('/').pop() ||\n  'invoice.pdf';\nconst ext = filename.split('.').pop()?.toLowerCase() || 'pdf';\nconst allowedExts = ['pdf', 'jpg', 'jpeg', 'png', 'tiff'];\nif (!allowedExts.includes(ext)) {\n  throw new Error(`File type .${ext} not allowed. Accepted: ${allowedExts.join(', ')}`);\n}\n\n// ── MIME type map ─────────────────────────────────────────────\nconst mimeMap = {\n  pdf: 'application/pdf',\n  jpg: 'image/jpeg', jpeg: 'image/jpeg',\n  png: 'image/png',\n  tiff: 'image/tiff'\n};\nconst mimeType = mimeMap[ext] || 'application/octet-stream';\n\n// ── Structured filename ───────────────────────────────────────\nconst ts = new Date().toISOString().split('T')[0];\nconst structuredFilename = `invoice_${ts}_${filename.replace(/[^a-zA-Z0-9._-]/g, '_')}`;\n\n// ── Sanitise metadata ─────────────────────────────────────────\nconst sanitise = s => String(s || '').trim().slice(0, 255);\n\nreturn [{\n  json: {\n    fileUrl: body.fileUrl || null,\n    filename,\n    structuredFilename,\n    mimeType,\n    ext,\n    uploadedBy: sanitise(body.uploadedBy) || 'Unknown',\n    department: sanitise(body.department) || 'General',\n    notes: sanitise(body.notes),\n    receivedAt: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"7baa95a9-7c6f-4087-a216-07d673641e1a","name":"Has Remote URL?","type":"n8n-nodes-base.if","position":[1104,912],"parameters":{"options":{},"conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cond-fileurl","operator":{"type":"string","operation":"notEmpty"},"leftValue":"={{ $json.fileUrl }}","rightValue":""}]}},"typeVersion":2},{"id":"1dac0a61-337e-447b-9365-1a7d351c7c8b","name":"Upload to URL - Remote","type":"n8n-nodes-uploadtourl.uploadToUrl","position":[1328,784],"parameters":{"operation":"uploadFile"},"typeVersion":1},{"id":"43224235-9279-4ae6-939c-e110767e89d0","name":"Upload to URL - Binary","type":"n8n-nodes-uploadtourl.uploadToUrl","position":[1328,1024],"parameters":{"operation":"uploadFile"},"typeVersion":1},{"id":"5f4933ee-dce5-4f2c-8c4a-50134010e4ff","name":"Extract CDN URL","type":"n8n-nodes-base.code","position":[1552,912],"parameters":{"jsCode":"const uploadResp = $input.first().json;\nconst meta = $('Validate Payload').first().json;\n\nconst cdnUrl =\n  uploadResp.url ||\n  uploadResp.link ||\n  uploadResp.data?.url ||\n  uploadResp.file?.url ||\n  uploadResp.shortUrl;\n\nif (!cdnUrl) {\n  throw new Error('Upload to URL returned no public URL. Raw: ' + JSON.stringify(uploadResp).slice(0, 300));\n}\n\nreturn [{\n  json: {\n    ...meta,\n    cdnUrl: cdnUrl.replace(/^http:\\/\\//, 'https://'),\n    uploadId: uploadResp.id || uploadResp.data?.id || null,\n    fileSizeBytes: uploadResp.size || uploadResp.data?.size || null\n  }\n}];"},"typeVersion":2},{"id":"06f9c319-8d0c-4229-941c-be1dedb27ece","name":"AWS Textract - Analyse Expense","type":"n8n-nodes-base.httpRequest","notes":"Calls Textract AnalyzeExpense. Alternatively set TEXTRACT_S3_BUCKET variable and upload the CDN file to S3 first, or use the AWS SDK via a Code node if you prefer direct API calls with SigV4 signing.","position":[1760,912],"parameters":{"url":"https://textract.us-east-1.amazonaws.com/","method":"POST","options":{"timeout":30000,"response":{"response":{"responseFormat":"json"}}},"jsonBody":"={\n  \"Document\": {\n    \"S3Object\": {\n      \"Bucket\": \"{{ $vars.TEXTRACT_S3_BUCKET || '' }}\",\n      \"Name\": \"{{ $json.structuredFilename }}\"\n    }\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/x-amz-json-1.1"},{"name":"X-Amz-Target","value":"Textract.AnalyzeExpense"}]}},"typeVersion":4.2},{"id":"ec7c192d-43a4-461a-af7b-6e7ab7a42572","name":"Parse & Validate Extracted Data","type":"n8n-nodes-base.code","notes":"Extracts vendor, invoice number, amount, due date, currency, issue date, and line items from Textract response. Partial extractions are allowed — missing fields are flagged as 'incomplete' rather than throwing an error.","position":[1984,912],"parameters":{"jsCode":"const textractResp = $input.first().json;\nconst meta = $('Extract CDN URL').first().json;\n\n// ── Helper: pull value from Textract ExpenseFields ────────────\nconst getField = (fields, ...labels) => {\n  for (const label of labels) {\n    const match = fields?.find(\n      f => f.Type?.Text?.toUpperCase() === label.toUpperCase()\n    );\n    if (match?.ValueDetection?.Text) return match.ValueDetection.Text.trim();\n  }\n  return null;\n};\n\n// ── Extract summary fields from Textract response ─────────────\nconst summaryFields =\n  textractResp.ExpenseDocuments?.[0]?.SummaryFields || [];\n\nconst rawVendor    = getField(summaryFields, 'VENDOR_NAME', 'NAME', 'SUPPLIER_NAME');\nconst rawInvoiceNo = getField(summaryFields, 'INVOICE_RECEIPT_ID', 'INVOICE_NUMBER', 'RECEIPT_ID', 'PO_NUMBER');\nconst rawAmount    = getField(summaryFields, 'AMOUNT_DUE', 'TOTAL', 'AMOUNT', 'GRAND_TOTAL', 'INVOICE_TOTAL');\nconst rawDueDate   = getField(summaryFields, 'DUE_DATE', 'PAYMENT_DUE_DATE', 'PAY_BY');\nconst rawCurrency  = getField(summaryFields, 'CURRENCY') || 'USD';\nconst rawIssueDate = getField(summaryFields, 'INVOICE_RECEIPT_DATE', 'DATE', 'ISSUE_DATE');\n\n// ── Normalise amount ──────────────────────────────────────────\nconst parseAmount = raw => {\n  if (!raw) return null;\n  const cleaned = raw.replace(/[^0-9.,-]/g, '').replace(',', '');\n  const val = parseFloat(cleaned);\n  return isNaN(val) ? null : val;\n};\n\n// ── Normalise date to YYYY-MM-DD ──────────────────────────────\nconst parseDate = raw => {\n  if (!raw) return null;\n  try {\n    const d = new Date(raw);\n    if (!isNaN(d.getTime())) return d.toISOString().split('T')[0];\n  } catch {}\n  return raw; // return raw if unparseable\n};\n\nconst vendor    = rawVendor || 'Unknown Vendor';\nconst invoiceNo = rawInvoiceNo || `AUTO-${Date.now()}`;\nconst amount    = parseAmount(rawAmount);\nconst dueDate   = parseDate(rawDueDate);\nconst issueDate = parseDate(rawIssueDate);\nconst currency  = rawCurrency.toUpperCase().slice(0, 3);\n\n// ── Determine completeness ────────────────────────────────────\nconst missingFields = [];\nif (!rawVendor)    missingFields.push('vendor');\nif (!rawInvoiceNo) missingFields.push('invoice_number');\nif (amount === null) missingFields.push('amount');\nif (!dueDate)      missingFields.push('due_date');\n\nconst extractionStatus = missingFields.length === 0 ? 'complete' : 'incomplete';\n\n// ── Extract line items (first 10) ────────────────────────────\nconst lineItemGroups =\n  textractResp.ExpenseDocuments?.[0]?.LineItemGroups || [];\nconst lineItems = lineItemGroups\n  .flatMap(g => g.LineItems || [])\n  .slice(0, 10)\n  .map(item => {\n    const fields = item.LineItemExpenseFields || [];\n    return {\n      description: getField(fields, 'ITEM', 'PRODUCT_CODE', 'EXPENSE_ROW') || '',\n      quantity: getField(fields, 'QUANTITY') || '',\n      unitPrice: getField(fields, 'UNIT_PRICE', 'PRICE') || '',\n      total: getField(fields, 'AMOUNT') || ''\n    };\n  });\n\nreturn [{\n  json: {\n    ...meta,\n    // Extracted fields\n    vendor,\n    invoiceNo,\n    amount,\n    currency,\n    dueDate,\n    issueDate,\n    lineItems,\n    // Status\n    extractionStatus,\n    missingFields,\n    invoiceStatus: 'pending',\n    // Raw for audit\n    textractConfidence: textractResp.ExpenseDocuments?.[0]?.SummaryFields?.length || 0\n  }\n}];"},"typeVersion":2},{"id":"ccfa60e6-3bb1-42e1-baad-40101ac8dac7","name":"Sheets - Search for Duplicate","type":"n8n-nodes-base.googleSheets","notes":"Searches the Invoices sheet for an existing row with the same invoice number before appending. Prevents duplicate entries from re-submissions.","position":[2208,912],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"name","value":"={{ $vars.GSHEET_SHEET_NAME || 'Invoices' }}"},"documentId":{"__rl":true,"mode":"id","value":"={{ $vars.GSHEET_SPREADSHEET_ID }}"}},"typeVersion":4.5},{"id":"2decb2b2-38a5-4496-8e6d-4e7ef2a633de","name":"Resolve Write Action","type":"n8n-nodes-base.code","position":[2432,912],"parameters":{"jsCode":"const searchResult = $input.first().json;\nconst invoiceData = $('Parse & Validate Extracted Data').first().json;\n\n// Sheets returns an array of matching rows\nconst existingRows = Array.isArray(searchResult) ? searchResult : (searchResult.values || []);\nconst existingRow = existingRows.length > 0 ? existingRows[0] : null;\n\nlet writeAction = 'append'; // default\nlet isDuplicate = false;\n\nif (existingRow) {\n  const existingStatus = existingRow['Status'] || existingRow.status || '';\n  if (existingStatus.toLowerCase() === 'incomplete' && invoiceData.extractionStatus === 'complete') {\n    // Allow update: previous extraction was partial, this one is complete\n    writeAction = 'update';\n  } else {\n    // True duplicate — skip write\n    writeAction = 'skip';\n    isDuplicate = true;\n  }\n}\n\nreturn [{\n  json: {\n    ...invoiceData,\n    writeAction,\n    isDuplicate,\n    existingRowId: existingRow?.row_number || existingRow?.id || null\n  }\n}];"},"typeVersion":2},{"id":"a896e1e7-badf-4f73-856a-1c24dba5c76a","name":"Route Write Action","type":"n8n-nodes-base.switch","position":[2640,912],"parameters":{"rules":{"values":[{"outputKey":"Append","conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.writeAction }}","rightValue":"append"}]},"renameOutput":true},{"outputKey":"Update","conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.writeAction }}","rightValue":"update"}]},"renameOutput":true},{"outputKey":"Skip","conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.writeAction }}","rightValue":"skip"}]},"renameOutput":true}]},"options":{"fallbackOutput":"extra"}},"typeVersion":3},{"id":"6f449dac-6818-4b2a-8010-ce7aa63621b6","name":"Sheets - Append New Invoice","type":"n8n-nodes-base.googleSheets","position":[2864,784],"parameters":{"columns":{"value":{"Notes":"={{ $json.notes }}","Amount":"={{ $json.amount }}","Status":"={{ $json.invoiceStatus }}","Vendor":"={{ $json.vendor }}","Currency":"={{ $json.currency }}","Due Date":"={{ $json.dueDate }}","File URL":"={{ $json.cdnUrl }}","Department":"={{ $json.department }}","Invoice No":"={{ $json.invoiceNo }}","Issue Date":"={{ $json.issueDate }}","Received At":"={{ $json.receivedAt }}","Uploaded By":"={{ $json.uploadedBy }}","Missing Fields":"={{ $json.missingFields.join(', ') }}","Extraction Status":"={{ $json.extractionStatus }}"},"mappingMode":"defineBelow"},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"name","value":"={{ $vars.GSHEET_SHEET_NAME || 'Invoices' }}"},"documentId":{"__rl":true,"mode":"id","value":"={{ $vars.GSHEET_SPREADSHEET_ID }}"}},"typeVersion":4.5},{"id":"6e3ae140-0628-4065-ab0c-95c462149a66","name":"Sheets - Update Incomplete Row","type":"n8n-nodes-base.googleSheets","notes":"Updates an existing row that was previously marked incomplete. Only runs when a previous extraction was partial and this submission fills in the missing fields.","position":[2864,960],"parameters":{"columns":{"value":{"Amount":"={{ $json.amount }}","Status":"={{ $json.invoiceStatus }}","Vendor":"={{ $json.vendor }}","Currency":"={{ $json.currency }}","Due Date":"={{ $json.dueDate }}","File URL":"={{ $json.cdnUrl }}","Invoice No":"={{ $json.invoiceNo }}","Issue Date":"={{ $json.issueDate }}","Missing Fields":"","Extraction Status":"complete"},"mappingMode":"defineBelow"},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"name","value":"={{ $vars.GSHEET_SHEET_NAME || 'Invoices' }}"},"documentId":{"__rl":true,"mode":"id","value":"={{ $vars.GSHEET_SPREADSHEET_ID }}"}},"typeVersion":4.5},{"id":"e13af7ba-f0c5-446f-847e-72e0b35b174c","name":"Mark as Duplicate","type":"n8n-nodes-base.code","position":[2864,1152],"parameters":{"jsCode":"// Duplicate — skip Sheets write, pass through for Slack + response\nconst data = $input.first().json;\nreturn [{\n  json: {\n    ...data,\n    invoiceStatus: 'duplicate',\n    sheetsRowId: data.existingRowId,\n    skippedWrite: true\n  }\n}];"},"typeVersion":2},{"id":"9c046373-967e-460d-ad0c-f6aa49a9ec8e","name":"Merge Sheets Result","type":"n8n-nodes-base.code","position":[3088,960],"parameters":{"jsCode":"// Normalise response from all three Sheets branches\nconst sheetsResp = $input.first().json;\nconst invoiceData = $('Resolve Write Action').first().json;\n\nconst sheetsRowId =\n  sheetsResp.updatedRange ||\n  sheetsResp.updates?.updatedRange ||\n  invoiceData.sheetsRowId ||\n  null;\n\nreturn [{\n  json: {\n    ...invoiceData,\n    sheetsRowId,\n    sheetsWritten: !invoiceData.skippedWrite\n  }\n}];"},"typeVersion":2},{"id":"f9d2cf02-9a1f-4651-8f00-7a47930b835b","name":"Slack - Notify Finance","type":"n8n-nodes-base.slack","notes":"Posts to the finance channel. Uses emoji badges: ✅ complete, 🟡 incomplete extraction, ⚠️ duplicate. Lists any missing fields so the team knows to review manually.","position":[3312,864],"webhookId":"b53b0856-2ff5-4158-b363-d33646c9a31a","parameters":{"text":"={{ $json.invoiceStatus === 'duplicate' ? '⚠️' : $json.extractionStatus === 'incomplete' ? '🟡' : '✅' }} *Invoice received*\n\n*Vendor:* {{ $json.vendor }}\n*Invoice No:* `{{ $json.invoiceNo }}`\n*Amount:* {{ $json.currency }} {{ $json.amount !== null ? $json.amount.toFixed(2) : 'Not detected' }}\n*Due Date:* {{ $json.dueDate || 'Not detected' }}\n*Status:* {{ $json.invoiceStatus }} | Extraction: {{ $json.extractionStatus }}\n*Uploaded by:* {{ $json.uploadedBy }} ({{ $json.department }})\n{{ $json.missingFields.length > 0 ? '*Missing fields:* ' + $json.missingFields.join(', ') : '' }}\n\n:paperclip: <{{ $json.cdnUrl }}|View invoice document>","otherOptions":{},"authentication":"oAuth2"},"typeVersion":2.2},{"id":"feedd89b-b558-4d47-95c3-c64f26da22d2","name":"Build Final Response","type":"n8n-nodes-base.code","position":[3520,960],"parameters":{"jsCode":"const slackResp = $input.first().json;\nconst data = $('Merge Sheets Result').first().json;\n\nreturn [{\n  json: {\n    success: true,\n    message: data.invoiceStatus === 'duplicate'\n      ? `Invoice ${data.invoiceNo} already exists — skipped write.`\n      : `Invoice ${data.invoiceNo} from ${data.vendor} recorded successfully.`,\n    invoiceNo: data.invoiceNo,\n    vendor: data.vendor,\n    amount: data.amount,\n    currency: data.currency,\n    dueDate: data.dueDate,\n    issueDate: data.issueDate,\n    invoiceStatus: data.invoiceStatus,\n    extractionStatus: data.extractionStatus,\n    missingFields: data.missingFields,\n    fileUrl: data.cdnUrl,\n    sheetsRowId: data.sheetsRowId,\n    sheetsWritten: data.sheetsWritten,\n    uploadedBy: data.uploadedBy,\n    department: data.department,\n    receivedAt: data.receivedAt,\n    processedAt: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"7bd9385e-5445-408b-a413-157e5ce60323","name":"Respond to Webhook","type":"n8n-nodes-base.respondToWebhook","position":[3744,960],"parameters":{"options":{"responseCode":201,"responseHeaders":{"entries":[{"name":"Content-Type","value":"application/json"}]}},"respondWith":"json","responseBody":"={{ $json }}"},"typeVersion":1.1}],"pinData":{},"connections":{"Extract CDN URL":{"main":[[{"node":"AWS Textract - Analyse Expense","type":"main","index":0}]]},"Has Remote URL?":{"main":[[{"node":"Upload to URL - Remote","type":"main","index":0}],[{"node":"Upload to URL - Binary","type":"main","index":0}]]},"Validate Payload":{"main":[[{"node":"Has Remote URL?","type":"main","index":0}]]},"Mark as Duplicate":{"main":[[{"node":"Merge Sheets Result","type":"main","index":0}]]},"Route Write Action":{"main":[[{"node":"Sheets - Append New Invoice","type":"main","index":0}],[{"node":"Sheets - Update Incomplete Row","type":"main","index":0}],[{"node":"Mark as Duplicate","type":"main","index":0}]]},"Merge Sheets Result":{"main":[[{"node":"Slack - Notify Finance","type":"main","index":0}]]},"Build Final Response":{"main":[[{"node":"Respond to Webhook","type":"main","index":0}]]},"Resolve Write Action":{"main":[[{"node":"Route Write Action","type":"main","index":0}]]},"Slack - Notify Finance":{"main":[[{"node":"Build Final Response","type":"main","index":0}]]},"Upload to URL - Binary":{"main":[[{"node":"Extract CDN URL","type":"main","index":0}]]},"Upload to URL - Remote":{"main":[[{"node":"Extract CDN URL","type":"main","index":0}]]},"Webhook - Receive Invoice":{"main":[[{"node":"Validate Payload","type":"main","index":0}]]},"Sheets - Append New Invoice":{"main":[[{"node":"Merge Sheets Result","type":"main","index":0}]]},"Sheets - Search for Duplicate":{"main":[[{"node":"Resolve Write Action","type":"main","index":0}]]},"AWS Textract - Analyse Expense":{"main":[[{"node":"Parse & Validate Extracted Data","type":"main","index":0}]]},"Sheets - Update Incomplete Row":{"main":[[{"node":"Merge Sheets Result","type":"main","index":0}]]},"Parse & Validate Extracted Data":{"main":[[{"node":"Sheets - Search for Duplicate","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":23,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.code":{"count":7},"n8n-nodes-base.slack":{"count":1},"n8n-nodes-base.switch":{"count":1},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.httpRequest":{"count":1},"n8n-nodes-base.googleSheets":{"count":3},"n8n-nodes-base.respondToWebhook":{"count":1},"n8n-nodes-uploadtourl.uploadToUrl":{"count":2}}},"status":"published","readyToDemo":null,"user":{"name":"Jitesh Dugar","username":"jiteshdugar","bio":"AI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.","verified":true,"links":["https://www.linkedin.com/in/jiteshdugar"],"avatar":"https://gravatar.com/avatar/edaa3abb99806b0586dced559d0a5417f24a507e7c4464a63960f0638a4b1b90?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":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":40,"icon":"file:slack.svg","name":"n8n-nodes-base.slack","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/slack/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Slack"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Slack","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":112,"icon":"fa:map-signs","name":"n8n-nodes-base.switch","codex":{"data":{"alias":["Router","If","Path","Filter","Condition","Logic","Branch","Case"],"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/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/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/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"Switch","color":"#506000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"Switch","typeVersion":3,"nodeCategories":[{"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":34,"name":"Invoice Processing"},{"id":49,"name":"AI Summarization"}],"image":[]}}