{"workflow":{"id":13636,"name":"Fast-track expense reimbursements with UploadToURL, Mindee OCR, Expensify, and Slack","views":18,"recentViews":0,"totalViews":18,"createdAt":"2026-02-23T12:11:36.608Z","description":"Stop chasing blurry receipts and manually typing expense data. This workflow creates an intelligent, \"snap-and-submit\" reimbursement pipeline that hosts photos via **UploadToURL**, extracts deep data via **Mindee OCR**, and utilizes a confidence-based gate to auto-approve low-risk expenses while routing high-value items to **Slack** for manager approval.\n\n## 🎯 What This Workflow Does\n\nTransforms receipt photos into verified, approved expense entries in seconds:\n\n1. **📝 Captures Receipt Assets** - Employees submit a receipt via a mobile-friendly n8n form or direct Webhook.\n2. **☁️ Instant CDN Hosting** - **UploadToURL** converts the photo into a permanent CDN link used as \"digital proof\" in Expensify and Google Sheets.\n3. **👁️ Deep OCR Extraction** - **Mindee OCR** parses the image to extract Merchant Name, Total Amount, Tax, Date, and Currency with high precision.\n4. **🚦 Confidence-Based Routing** - A \"Smart Gate\" evaluates the OCR confidence and amount:\n   - **Auto-Approve**: High-confidence extractions below your set threshold (e.g., $50) are approved instantly.\n   - **Manager Review**: Ambiguous or high-value receipts trigger an interactive **Slack** message for 1-click approval.\n5. **🏦 Platform Sync** - Automatically creates the expense record in **Expensify** and logs a detailed audit trail in **Google Sheets**.\n6. **📧 Employee Feedback** - Sends an automated **Gmail** confirmation to the employee with a reimbursement ETA.\n\n## ✨ Key Features\n\n- **UploadToURL Integration**: Native community node hosting ensures that receipt proof is always accessible via a stable URL, eliminating broken attachments.\n- **Intelligent Auto-Approval**: Reduce manager workload by up to 70% by automating approval for small, clearly-read expenses.\n- **Interactive Slack Approvals**: Managers can approve or reject expenses directly from Slack without leaving their chat interface.\n- **Comprehensive Audit Trail**: Every submission is logged in Google Sheets with OCR confidence scores and original asset links for finance audits.\n- **Mobile-First Design**: The n8n form is optimized for \"snap-and-go\" submissions from smartphones.\n\n## 💼 Perfect For\n\n- **Finance & Operations Teams**: Streamlining accounts payable and employee reimbursements.\n- **Fast-Growing Startups**: Scaling internal processes without adding administrative headcount.\n- **Remote-First Companies**: Providing a centralized, digital-only path for global expense tracking.\n- **Managers**: Who want to clear approval queues instantly via mobile Slack notifications.\n\n## 🔧 What You'll Need\n\n### Required Integrations\n- **[UploadToURL](https://uploadtourl.com)** - To host receipt photos and provide CDN links.\n- **n8n Community Node** - `n8n-nodes-uploadtourl` must be installed.\n- **Mindee API** - To perform high-accuracy receipt OCR.\n- **Expensify** - To create the final expense reports.\n- **Google Sheets** - To maintain the master expense audit log.\n\n### Optional Integrations\n- **Slack** - For interactive manager approval buttons.\n- **Gmail** - For employee status notifications.\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, Mindee, Expensify, Google Sheets, and Slack accounts.\n4. **Configure Thresholds** - Set the `AUTO_APPROVE_THRESHOLD` variable (e.g., `50`) in n8n.\n5. **Prepare Sheet** - Create a sheet named `Expense Audit Log` with columns for `Merchant`, `Total`, `Status`, and `CDN URL`.\n6. **Go Live** - Distribute the Form URL to your team and start fast-tracking reimbursements.\n\n## 🎨 Customization Options\n\n- **Multi-Level Approval**: Add a second IF gate for expenses over $500 that requires both a Manager and a VP approval.\n- **Currency Conversion**: Insert a node to automatically convert non-USD receipts into your base company currency using real-time rates.\n- **Policy Enforcement**: Add logic to check if the Merchant is on a \"blacklisted\" list (e.g., gambling or non-business entertainment).\n- **ERP Integration**: Replace Expensify with **NetSuite**, **Xero**, or **QuickBooks** for direct accounting sync.\n\n## 📈 Expected Results\n\n- **80% reduction** in manual data entry for employees.\n- **Zero \"Lost\" Receipts**: Every submission is instantly hosted and backed up on the CDN.\n- **Faster Reimbursements**: Employees get paid in days rather than weeks thanks to auto-approvals.\n- **Finance Peace of Mind**: A perfect, link-verified audit trail in Google Sheets for every single cent spent.\n\n## 🏆 Use Cases\n\n### Travel & Expenses\nEmployees on the road can snap a photo of their hotel bill or taxi receipt; the system hosts the image on **UploadToURL** and files the claim before they even board their flight home.\n\n### Office Supply Procurement\nStandardize small recurring purchases (like Amazon or Staples orders) so they bypass manual review and land straight in your accounting software.\n\n### Client Entertainment\nAutomatically tag meal expenses with a \"Client Gift\" category based on the merchant detected, ensuring tax compliance is handled by the AI.\n\n## 💡 Pro Tips\n\n- **Confidence Scores**: The workflow calculates a composite score. If the AI is unsure about the Merchant Name, it will route to a manager even if the amount is small.\n- **Mobile Form**: Save the n8n form URL as a \"Home Screen\" shortcut on employee iPhones/Androids for an app-like experience.\n- **Expensify Policies**: Ensure your `EXPENSIFY_POLICY_ID` matches the policy where you want the expenses to appear.\n\n---\n\n**Ready to automate your expenses?** Import this template and connect **UploadToURL** to start fast-tracking your reimbursements today.\n\n**Questions about the Slack interactivity setup?** The workflow includes detailed sticky notes explaining how to handle the button response loop.","workflow":{"meta":{"instanceId":"277842713620d9f5554de3b1518b865a152c8c4db680008bd8aec536fc18b4a8"},"nodes":[{"id":"d78dd4ad-7316-454a-b8c9-7e7d7882d8e3","name":"📋 Overview","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"width":560,"height":648,"content":"## Fast-track expense reimbursements with UploadToURL, Mindee OCR, and Expensify\nThe Problem: Employees hate manual expense forms, and finance teams waste hours chasing blurry attachments and missing data.\nThe Solution: A \"snap-and-submit\" pipeline that hosts receipt photos via UploadToURL, extracts data via Mindee OCR, and handles auto-approvals via Slack.\n\n⚙️ How it Works\nSubmission: Employee uploads a receipt photo via mobile form or Webhook.\n\nUploadToURL: Instantly hosts the photo and returns a permanent CDN link for the audit trail.\n\nMindee OCR: Automatically extracts merchant, total, date, and tax with high precision.\n\nSmart Approval: Low-value items are auto-approved; high-value items trigger a 1-click Slack approval for managers.\n\nLogging: Final data is synced to Expensify and Google Sheets.\n\n🔐 Credentials & Setup\nNode: Install n8n-nodes-uploadtourl via Community Nodes.\n\nAPIs: UploadToURL, Mindee, Expensify, and Slack.\n\nVariables: Set AUTO_APPROVE_THRESHOLD and EXPENSIFY_POLICY_ID"},"typeVersion":1},{"id":"8bc2b0d8-6cb8-4f6b-98be-34b9d43ab3c1","name":"Section 1 — Upload","type":"n8n-nodes-base.stickyNote","position":[672,688],"parameters":{"color":7,"width":776,"height":578,"content":"## 1 — Form intake & upload\n\n**Form Trigger → Validate → Has URL? → Upload to URL (×2) → Extract CDN URL**\n\nMobile-friendly form with fields for employee name, email, manager email, and expense category. Validates email format and file extension (`jpg`, `jpeg`, `png`, `pdf`, `heic`). UploadToURL hosts via the native community node. Filename is structured as `EXP-{timestamp}-{employeeSlug}.ext` for audit traceability."},"typeVersion":1},{"id":"88215ffc-3680-4cac-a05d-3235fbee621a","name":"Section 2 — OCR & Gate","type":"n8n-nodes-base.stickyNote","position":[1504,720],"parameters":{"color":7,"width":440,"height":519,"content":"## 2 — Mindee OCR & confidence gate\n\n**Mindee Receipt API → Parse & Score → Confidence Gate (IF)**\n\nMindee's `/expense_receipts/v5/predict` endpoint returns structured fields with per-field confidence scores. The parse node computes a composite confidence score, flags missing required fields, and evaluates the auto-approve rule: `confidence ≥ 0.85 AND total ≤ AUTO_APPROVE_THRESHOLD`. Below that threshold routes to auto-approve; above routes to manager."},"typeVersion":1},{"id":"924cd41e-9f8b-4d9e-b572-a4b3db687b0d","name":"Section 3 — Approval","type":"n8n-nodes-base.stickyNote","position":[2064,672],"parameters":{"color":7,"width":840,"height":631,"content":"## 3 — Dual-path approval\n\n**Auto-approve branch:** Expensify entry created immediately, status set to `approved`, employee emailed with ETA.\n\n**Manager branch:** Slack posts an interactive message with receipt CDN link, extracted data, and Accept/Reject buttons to `MANAGER_SLACK_USER_ID`. On response the Expensify entry is created with the manager's decision. Both paths converge at the Sheets audit log node."},"typeVersion":1},{"id":"949db194-c812-4032-868f-ab68d03d00e9","name":"Section 4 — Audit & Email","type":"n8n-nodes-base.stickyNote","position":[3056,704],"parameters":{"color":7,"width":548,"height":483,"content":"## 4 — Audit log & confirmation\n\n**Sheets - Append Audit Row → Gmail - Employee Confirmation**\n\nEvery expense — regardless of approval path — is written to the Google Sheet with full OCR data, confidence score, CDN URL, Expensify ID, and resolution timestamp. The employee receives a plain-text email confirming approval or review status and their reimbursement timeline."},"typeVersion":1},{"id":"4ac61781-ff01-43b6-873b-b3ca4f72ad75","name":"Form Trigger - Submit Receipt","type":"n8n-nodes-base.formTrigger","position":[688,1008],"webhookId":"b0af21bf-2e23-482d-9772-729e3826483f","parameters":{"options":{},"formTitle":"Expense Reimbursement — Submit Receipt","formFields":{"values":[{"fieldLabel":"Your Full Name","requiredField":true},{"fieldType":"email","fieldLabel":"Your Email","requiredField":true},{"fieldType":"email","fieldLabel":"Manager Email","requiredField":true},{"fieldType":"dropdown","fieldLabel":"Expense Category","fieldOptions":{"values":[{"option":"Meals & Entertainment"},{"option":"Travel & Transport"},{"option":"Accommodation"},{"option":"Office Supplies"},{"option":"Software & Subscriptions"},{"option":"Client Gifts"},{"option":"Other"}]},"requiredField":true},{"fieldLabel":"Receipt Photo or PDF URL","placeholder":"https://... or leave blank and upload below","requiredField":true},{"fieldType":"textarea","fieldLabel":"Business Purpose","placeholder":"e.g. Team lunch with client Acme Corp","requiredField":true},{"fieldLabel":"Project Code","placeholder":"e.g. PROJ-204"}]},"responseMode":"responseNode","formDescription":"Upload your receipt photo or PDF. Expenses under $50 with a clear receipt are approved automatically."},"typeVersion":2.2},{"id":"dba8fc24-bf9f-410c-bc78-396fdd5d935e","name":"Validate & Build Expense Record","type":"n8n-nodes-base.code","position":[832,1040],"parameters":{"jsCode":"const body = $input.first().json;\n\n// ── Pull form fields ──────────────────────────────────────────\nconst employeeName = String(body['Your Full Name'] || body.employeeName || '').trim();\nconst employeeEmail = String(body['Your Email'] || body.employeeEmail || '').trim().toLowerCase();\nconst managerEmail = String(body['Manager Email'] || body.managerEmail || '').trim().toLowerCase();\nconst category = String(body['Expense Category'] || body.category || 'Other').trim();\nconst fileUrl = String(body['Receipt Photo or PDF URL'] || body.fileUrl || '').trim();\nconst businessPurpose = String(body['Business Purpose'] || body.businessPurpose || '').trim();\nconst projectCode = String(body['Project Code'] || body.projectCode || '').trim();\n\n// ── Required field guards ─────────────────────────────────────\nif (!employeeName) throw new Error('Employee name is required.');\nif (!employeeEmail) throw new Error('Employee email is required.');\nif (!managerEmail) throw new Error('Manager email is required.');\nif (!businessPurpose) throw new Error('Business purpose is required.');\nif (!fileUrl && !body.filename) throw new Error('Provide a receipt file URL or binary upload.');\n\n// ── Email format validation ───────────────────────────────────\nconst emailRx = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nif (!emailRx.test(employeeEmail)) throw new Error(`Invalid employee email: ${employeeEmail}`);\nif (!emailRx.test(managerEmail)) throw new Error(`Invalid manager email: ${managerEmail}`);\nif (employeeEmail === managerEmail) throw new Error('Employee and manager email must be different.');\n\n// ── Filename & extension ──────────────────────────────────────\nconst filename = body.filename ||\n  fileUrl.split('?')[0].split('/').pop() ||\n  'receipt.jpg';\nconst ext = filename.split('.').pop()?.toLowerCase() || 'jpg';\nconst allowedExts = ['jpg', 'jpeg', 'png', 'pdf', 'heic', 'webp'];\nif (!allowedExts.includes(ext)) {\n  throw new Error(`File type .${ext} not supported. Accepted: ${allowedExts.join(', ')}`);\n}\n\n// ── Generate expense ID ───────────────────────────────────────\nconst expenseId = `EXP-${Date.now()}`;\nconst employeeSlug = employeeName.toLowerCase().replace(/[^a-z0-9]/g, '-').slice(0, 20);\nconst structuredFilename = `${expenseId}-${employeeSlug}.${ext}`;\n\n// ── Auto-approve threshold from env var ───────────────────────\nconst autoApproveThreshold = parseFloat($vars.AUTO_APPROVE_THRESHOLD || '50');\n\nreturn [{\n  json: {\n    expenseId,\n    employeeName,\n    employeeEmail,\n    managerEmail,\n    category,\n    businessPurpose,\n    projectCode: projectCode || null,\n    fileUrl: fileUrl || null,\n    filename,\n    structuredFilename,\n    ext,\n    autoApproveThreshold,\n    submittedAt: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"e79c9f4b-d787-4170-8bde-fa08154ca8ff","name":"Has Remote URL?","type":"n8n-nodes-base.if","position":[976,1024],"parameters":{"options":{},"conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cond-url","operator":{"type":"string","operation":"notEmpty"},"leftValue":"={{ $json.fileUrl }}","rightValue":""}]}},"typeVersion":2},{"id":"fa8f26ea-dfb7-4e88-af4e-d240a08b89a1","name":"Upload to URL - Remote","type":"n8n-nodes-uploadtourl.uploadToUrl","position":[1168,944],"parameters":{"operation":"uploadFile"},"credentials":{"uploadToUrlApi":{"id":"aTtpEWKPdBd8vRfH","name":"Upload to URL account 3"}},"typeVersion":1},{"id":"afa9624e-6b5b-42db-9900-4f6ff8efa915","name":"Upload to URL - Binary","type":"n8n-nodes-uploadtourl.uploadToUrl","position":[1168,1104],"parameters":{"operation":"uploadFile"},"credentials":{"uploadToUrlApi":{"id":"aTtpEWKPdBd8vRfH","name":"Upload to URL account 3"}},"typeVersion":1},{"id":"0831a344-8c30-4c86-b932-90e19dec8286","name":"Extract CDN URL","type":"n8n-nodes-base.code","position":[1344,1008],"parameters":{"jsCode":"const uploadResp = $input.first().json;\nconst meta = $('Validate & Build Expense Record').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('UploadToURL 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":"8ec4dc59-b870-44bb-b6e0-928da07576ba","name":"Mindee - Extract Receipt Data","type":"n8n-nodes-base.httpRequest","notes":"Calls Mindee's expense_receipts/v5/predict endpoint with the CDN URL. Returns structured fields with per-field confidence scores: total amount, tax, merchant name, date, currency, and category.","position":[1584,1008],"parameters":{"url":"https://api.mindee.net/v1/products/mindee/expense_receipts/v5/predict","method":"POST","options":{"timeout":30000,"response":{"response":{"responseFormat":"json"}}},"sendBody":true,"contentType":"multipart-form-data","sendHeaders":true,"authentication":"genericCredentialType","bodyParameters":{"parameters":[{"name":"document","parameterType":"formBinaryData"}]},"genericAuthType":"httpHeaderAuth","headerParameters":{"parameters":[{"name":"Authorization","value":"Token {{ $credentials.value }}"}]}},"credentials":{"httpHeaderAuth":{"id":"GKgCj9WxmYpiz70D","name":"Stripe Header Auth"}},"typeVersion":4.2},{"id":"3bc45e41-5a93-46e8-ac20-8f74c950f8cb","name":"Parse OCR & Score Confidence","type":"n8n-nodes-base.code","notes":"Extracts Mindee fields with per-field confidence. Composite score weights: total 40%, merchant 30%, date 20%, tax 10%. Auto-approve fires only when score ≥ 0.85 AND total ≤ threshold AND no missing fields.","position":[1760,1008],"parameters":{"jsCode":"const mindeeResp = $input.first().json;\nconst meta = $('Extract CDN URL').first().json;\n\n// ── Navigate Mindee v5 response structure ─────────────────────\nconst prediction = mindeeResp.document?.inference?.prediction || {};\n\n// ── Helper: extract value + confidence from Mindee field ──────\nconst getField = (field) => ({\n  value: field?.value ?? null,\n  confidence: field?.confidence ?? 0\n});\n\n// ── Extract core fields ───────────────────────────────────────\nconst totalField     = getField(prediction.total_amount);\nconst taxField       = getField(prediction.total_tax);\nconst merchantField  = getField(prediction.supplier_name);\nconst dateField      = getField(prediction.date);\nconst currencyField  = getField(prediction.locale?.currency || { value: 'USD', confidence: 0.5 });\nconst categoryField  = getField(prediction.category);\nconst receiptNumField= getField(prediction.receipt_number);\n\n// ── Normalise values ──────────────────────────────────────────\nconst total    = parseFloat(totalField.value) || null;\nconst tax      = parseFloat(taxField.value) || null;\nconst merchant = String(merchantField.value || 'Unknown Merchant').trim();\nconst date     = dateField.value\n  ? new Date(dateField.value).toISOString().split('T')[0]\n  : new Date().toISOString().split('T')[0];\nconst currency = String(currencyField.value || 'USD').toUpperCase().slice(0, 3);\nconst detectedCategory = categoryField.value || meta.category;\nconst receiptNumber = receiptNumField.value || null;\n\n// ── Composite confidence score ────────────────────────────────\n// Weight by importance: total (40%), merchant (30%), date (20%), tax (10%)\nconst compositeConfidence = (\n  totalField.confidence * 0.40 +\n  merchantField.confidence * 0.30 +\n  dateField.confidence * 0.20 +\n  taxField.confidence * 0.10\n);\nconst confidenceScore = Math.round(compositeConfidence * 100) / 100;\n\n// ── Flag missing required fields ─────────────────────────────\nconst missingFields = [];\nif (total === null) missingFields.push('total');\nif (merchantField.confidence < 0.5) missingFields.push('merchant (low confidence)');\nif (!dateField.value) missingFields.push('date');\n\n// ── Auto-approve logic ────────────────────────────────────────\n// Auto-approve only if: high confidence AND total within threshold AND no missing fields\nconst meetsAutoApprove =\n  confidenceScore >= 0.85 &&\n  total !== null &&\n  total <= meta.autoApproveThreshold &&\n  missingFields.length === 0;\n\nconst approvalRoute = meetsAutoApprove ? 'auto' : 'manager';\n\n// ── Format for display ────────────────────────────────────────\nconst totalFormatted = total !== null\n  ? `${currency} ${total.toFixed(2)}`\n  : 'Not detected';\n\nreturn [{\n  json: {\n    ...meta,\n    // Extracted\n    merchant,\n    total,\n    tax,\n    currency,\n    date,\n    detectedCategory,\n    receiptNumber,\n    // Confidence\n    confidenceScore,\n    missingFields,\n    perFieldConfidence: {\n      total: totalField.confidence,\n      merchant: merchantField.confidence,\n      date: dateField.confidence,\n      tax: taxField.confidence\n    },\n    // Routing\n    approvalRoute,\n    meetsAutoApprove,\n    // Display\n    totalFormatted,\n    ocrStatus: missingFields.length === 0 ? 'complete' : 'partial'\n  }\n}];"},"typeVersion":2},{"id":"9ab3672d-fda3-4ee0-9b98-3a11068ee8f7","name":"Confidence Gate — Auto or Manager?","type":"n8n-nodes-base.if","position":[2080,1008],"parameters":{"options":{},"conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cond-auto","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.approvalRoute }}","rightValue":"auto"}]}},"typeVersion":2},{"id":"5cbb6bda-d4b3-4577-bab1-54e088f705a8","name":"Mark Auto-Approved","type":"n8n-nodes-base.code","notes":"Marks the expense as auto-approved. Reimbursement ETA is 3 days for amounts under $25, 5 days otherwise. No manager interaction required.","position":[2256,912],"parameters":{"jsCode":"// Auto-approve path — mark as approved immediately\nconst data = $input.first().json;\nconst reimbursementDays = data.total <= 25 ? 3 : 5;\n\nreturn [{\n  json: {\n    ...data,\n    approvalStatus: 'approved',\n    approvedBy: 'Auto-approval system',\n    approvedAt: new Date().toISOString(),\n    rejectionReason: null,\n    reimbursementEta: `${reimbursementDays} business days`,\n    statusEmoji: '✅'\n  }\n}];"},"typeVersion":2},{"id":"3ceb1d1d-13da-4b67-bb29-ea9495d0579f","name":"Slack - Manager Approval Request","type":"n8n-nodes-base.slack","notes":"Sends a direct Slack message to the manager's user ID with approve/reject buttons. The button values carry expenseId and employeeEmail for the webhook handler to process.","position":[2240,1088],"webhookId":"7c3d6670-6011-4328-95ac-95516b9dbb4c","parameters":{"text":"=💳 *Expense Approval Request*\n\n👤 *{{ $json.employeeName }}* (`{{ $json.employeeEmail }}`)\n🏪 Merchant: *{{ $json.merchant }}*\n💰 Total: *{{ $json.totalFormatted }}*{{ $json.tax ? '  |  Tax: ' + $json.currency + ' ' + $json.tax.toFixed(2) : '' }}\n📅 Date: {{ $json.date }}\n🗂 Category: {{ $json.detectedCategory }}\n📋 Purpose: _{{ $json.businessPurpose }}_\n{{ $json.projectCode ? '🔖 Project: ' + $json.projectCode : '' }}\n\n🔍 OCR Confidence: {{ Math.round($json.confidenceScore * 100) }}%{{ $json.missingFields.length > 0 ? '  ⚠️ Missing: ' + $json.missingFields.join(', ') : '' }}\n\n🧾 <{{ $json.cdnUrl }}|View Receipt>\n\nPlease approve or reject:","otherOptions":{},"authentication":"oAuth2"},"typeVersion":2.2},{"id":"28c39db4-8c0d-41b7-8490-643df3f02cc8","name":"Mark Pending Manager Review","type":"n8n-nodes-base.code","notes":"Sets status to pending_manager. A separate n8n workflow (triggered by Slack's interactivity webhook) handles the button click response and completes the approval loop.","position":[2400,1088],"parameters":{"jsCode":"// Manager path — pending until Slack response received\n// In production: a separate Slack webhook workflow handles the button click\n// and updates the expense status via the Expensify/Sheets nodes\nconst data = $input.first().json;\nconst slackResp = $input.first().json;\n\nreturn [{\n  json: {\n    ...data,\n    approvalStatus: 'pending_manager',\n    approvedBy: null,\n    approvedAt: null,\n    rejectionReason: null,\n    reimbursementEta: 'Awaiting manager approval',\n    statusEmoji: '⏳',\n    slackMessageTs: slackResp.ts || null\n  }\n}];"},"typeVersion":2},{"id":"23228806-6525-4c57-b30b-d3a3beb3db4d","name":"Expensify - Create Expense Entry","type":"n8n-nodes-base.httpRequest","notes":"Creates an Expensify expense entry on both approval paths. Amount is sent in cents (×100). The CDN URL is attached as receipt proof — no re-upload needed. Fires regardless of auto-approve or manager path.","position":[2592,944],"parameters":{"url":"https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations","method":"POST","options":{"timeout":20000,"response":{"response":{"responseFormat":"json"}}},"sendBody":true,"contentType":"form-urlencoded","authentication":"genericCredentialType","bodyParameters":{"parameters":[{"name":"requestJobDescription","value":"={\n  \"type\": \"create\",\n  \"credentials\": {\n    \"partnerUserID\": \"{{ $credentials.username }}\",\n    \"partnerUserSecret\": \"{{ $credentials.password }}\"\n  },\n  \"inputSettings\": {\n    \"type\": \"expenses\",\n    \"policyID\": \"{{ $vars.EXPENSIFY_POLICY_ID }}\",\n    \"employeeEmail\": \"{{ $json.employeeEmail }}\",\n    \"expenses\": [{\n      \"date\": \"{{ $json.date }}\",\n      \"currency\": \"{{ $json.currency }}\",\n      \"amount\": {{ Math.round(($json.total || 0) * 100) }},\n      \"merchant\": \"{{ $json.merchant }}\",\n      \"tag\": \"{{ $json.detectedCategory }}\",\n      \"billable\": false,\n      \"reimbursable\": true,\n      \"comment\": \"{{ $json.businessPurpose }}{{ $json.projectCode ? ' | Project: ' + $json.projectCode : '' }} | ExpenseID: {{ $json.expenseId }}\",\n      \"receipt\": {\n        \"url\": \"{{ $json.cdnUrl }}\",\n        \"filename\": \"{{ $json.structuredFilename }}\"\n      }\n    }]\n  }\n}"}]},"genericAuthType":"httpBasicAuth"},"typeVersion":4.2},{"id":"0168f1e5-f9f1-4b15-ba87-7a6895317a10","name":"Merge Approval + Expensify Result","type":"n8n-nodes-base.code","position":[2784,944],"parameters":{"jsCode":"const expensifyResp = $input.first().json;\n// Get data from whichever approval branch ran\nconst expData =\n  $('Mark Auto-Approved').first()?.json ||\n  $('Mark Pending Manager Review').first()?.json;\n\nconst expensifyId =\n  expensifyResp.reportID ||\n  expensifyResp.transactionID ||\n  expensifyResp.responseMessage ||\n  null;\n\nreturn [{\n  json: {\n    ...expData,\n    expensifyId: String(expensifyId || ''),\n    resolvedAt: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"52b837a4-2156-4a96-b1e1-cac1a26151e6","name":"Sheets - Append Audit Row","type":"n8n-nodes-base.googleSheets","notes":"Appends every expense to the audit log regardless of approval path. Includes full OCR data, confidence score, CDN URL, Expensify ID, and timestamps — complete audit trail for finance.","position":[3136,976],"parameters":{"columns":{"value":{"Tax":"={{ $json.tax }}","Date":"={{ $json.date }}","Total":"={{ $json.total }}","Status":"={{ $json.approvalStatus }}","CDN URL":"={{ $json.cdnUrl }}","Category":"={{ $json.detectedCategory }}","Currency":"={{ $json.currency }}","Employee":"={{ $json.employeeName }}","Merchant":"={{ $json.merchant }}","Expense ID":"={{ $json.expenseId }}","OCR Status":"={{ $json.ocrStatus }}","Approved By":"={{ $json.approvedBy }}","Resolved At":"={{ $json.resolvedAt }}","Expensify ID":"={{ $json.expensifyId }}","Project Code":"={{ $json.projectCode }}","Submitted At":"={{ $json.submittedAt }}","Employee Email":"={{ $json.employeeEmail }}","Missing Fields":"={{ $json.missingFields.join(', ') }}","OCR Confidence":"={{ $json.confidenceScore }}","Business Purpose":"={{ $json.businessPurpose }}"},"mappingMode":"defineBelow"},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"name","value":"Expense Audit Log"},"documentId":{"__rl":true,"mode":"id","value":"={{ $vars.GSHEET_SPREADSHEET_ID }}"}},"credentials":{"googleSheetsOAuth2Api":{"id":"Kz2DdSp11rxqwlFt","name":"Google Sheets account - Deepanshi"}},"typeVersion":4.5},{"id":"28349e90-3589-453b-81db-b797a1135ec9","name":"Gmail - Employee Confirmation","type":"n8n-nodes-base.gmail","notes":"Sends the employee an HTML confirmation email. Auto-approved expenses show green status and reimbursement ETA. Manager-pending expenses show amber status with next-step instructions.","position":[3296,992],"webhookId":"3c71b12e-6894-4156-b064-2b4b76153e58","parameters":{"sendTo":"={{ $json.employeeEmail }}","message":"=<!DOCTYPE html>\n<html>\n<body style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; max-width: 560px; margin: 0 auto; padding: 32px; color: #1a1a1a;\">\n  <h2 style=\"color: {{ $json.approvalStatus === 'approved' ? '#16a34a' : '#d97706' }};\">{{ $json.statusEmoji }} Expense {{ $json.approvalStatus === 'approved' ? 'Approved' : 'Received — Pending Review' }}</h2>\n  <p>Hi {{ $json.employeeName }},</p>\n  <p>{{ $json.approvalStatus === 'approved' ? 'Your expense has been automatically approved and submitted to Expensify.' : 'Your expense has been received and sent to your manager for approval.' }}</p>\n  <table style=\"width:100%;border-collapse:collapse;font-size:14px;margin:16px 0;\">\n    <tr style=\"border-bottom:1px solid #e5e7eb\"><td style=\"padding:8px;color:#6b7280\">Expense ID</td><td style=\"padding:8px;font-weight:600\">{{ $json.expenseId }}</td></tr>\n    <tr style=\"border-bottom:1px solid #e5e7eb\"><td style=\"padding:8px;color:#6b7280\">Merchant</td><td style=\"padding:8px\">{{ $json.merchant }}</td></tr>\n    <tr style=\"border-bottom:1px solid #e5e7eb\"><td style=\"padding:8px;color:#6b7280\">Total</td><td style=\"padding:8px;font-weight:600\">{{ $json.totalFormatted }}</td></tr>\n    <tr style=\"border-bottom:1px solid #e5e7eb\"><td style=\"padding:8px;color:#6b7280\">Date</td><td style=\"padding:8px\">{{ $json.date }}</td></tr>\n    <tr style=\"border-bottom:1px solid #e5e7eb\"><td style=\"padding:8px;color:#6b7280\">Category</td><td style=\"padding:8px\">{{ $json.detectedCategory }}</td></tr>\n    <tr style=\"border-bottom:1px solid #e5e7eb\"><td style=\"padding:8px;color:#6b7280\">Status</td><td style=\"padding:8px\">{{ $json.approvalStatus }}</td></tr>\n    <tr><td style=\"padding:8px;color:#6b7280\">Reimbursement ETA</td><td style=\"padding:8px;font-weight:600;color:#16a34a\">{{ $json.reimbursementEta }}</td></tr>\n  </table>\n  <p><a href=\"{{ $json.cdnUrl }}\" style=\"color:#4F46E5\">View your receipt</a></p>\n  {{ $json.missingFields.length > 0 ? '<p style=\"color:#d97706;font-size:13px;\">⚠️ Note: Some receipt fields could not be read clearly (' + $json.missingFields.join(', ') + '). Your manager may follow up.</p>' : '' }}\n  <p style=\"font-size:13px;color:#9ca3af;margin-top:24px;\">Ref: {{ $json.expenseId }} · Expensify: {{ $json.expensifyId }}</p>\n</body>\n</html>","options":{"senderName":"={{ 'Expense System — ' + $json.employeeName.split(' ')[0] }}"},"subject":"={{ $json.approvalStatus === 'approved' ? '✅ Expense approved — ' + $json.totalFormatted + ' at ' + $json.merchant : '⏳ Expense received — ' + $json.totalFormatted + ' at ' + $json.merchant }}"},"credentials":{"gmailOAuth2":{"id":"r1sEKiELINYOSRri","name":"jitesh0dugar@gmail.com"}},"typeVersion":2.1},{"id":"8f7e0add-6165-483b-bcb1-978c63c76711","name":"Respond to Form","type":"n8n-nodes-base.respondToWebhook","position":[3472,976],"parameters":{"options":{"responseCode":201},"respondWith":"text","responseBody":"={{ $json.approvalStatus === 'approved' \n  ? '✅ Expense approved! ' + $json.totalFormatted + ' at ' + $json.merchant + ' — reimbursement in ' + $json.reimbursementEta + '. Ref: ' + $json.expenseId\n  : '⏳ Expense received! ' + $json.totalFormatted + ' at ' + $json.merchant + ' — sent to your manager for approval. Ref: ' + $json.expenseId }}"},"typeVersion":1.1}],"pinData":{},"connections":{"Extract CDN URL":{"main":[[{"node":"Mindee - Extract Receipt Data","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}]]},"Mark Auto-Approved":{"main":[[{"node":"Expensify - Create Expense Entry","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}]]},"Sheets - Append Audit Row":{"main":[[{"node":"Gmail - Employee Confirmation","type":"main","index":0}]]},"Mark Pending Manager Review":{"main":[[{"node":"Expensify - Create Expense Entry","type":"main","index":0}]]},"Parse OCR & Score Confidence":{"main":[[{"node":"Confidence Gate — Auto or Manager?","type":"main","index":0}]]},"Form Trigger - Submit Receipt":{"main":[[{"node":"Validate & Build Expense Record","type":"main","index":0}]]},"Gmail - Employee Confirmation":{"main":[[{"node":"Respond to Form","type":"main","index":0}]]},"Mindee - Extract Receipt Data":{"main":[[{"node":"Parse OCR & Score Confidence","type":"main","index":0}]]},"Validate & Build Expense Record":{"main":[[{"node":"Has Remote URL?","type":"main","index":0}]]},"Expensify - Create Expense Entry":{"main":[[{"node":"Merge Approval + Expensify Result","type":"main","index":0}]]},"Slack - Manager Approval Request":{"main":[[{"node":"Mark Pending Manager Review","type":"main","index":0}]]},"Merge Approval + Expensify Result":{"main":[[{"node":"Sheets - Append Audit Row","type":"main","index":0}]]},"Confidence Gate — Auto or Manager?":{"main":[[{"node":"Mark Auto-Approved","type":"main","index":0}],[{"node":"Slack - Manager Approval Request","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":22,"nodeTypes":{"n8n-nodes-base.if":{"count":2},"n8n-nodes-base.code":{"count":6},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.slack":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.formTrigger":{"count":1},"n8n-nodes-base.httpRequest":{"count":2},"n8n-nodes-base.googleSheets":{"count":1},"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":356,"icon":"file:gmail.svg","name":"n8n-nodes-base.gmail","codex":{"data":{"alias":["email","human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"transform\"]","defaults":{"name":"Gmail"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"},"displayName":"Gmail","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":535,"icon":"file:webhook.svg","name":"n8n-nodes-base.respondToWebhook","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"}]},"categories":["Core Nodes","Utility"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"transform\"]","defaults":{"name":"Respond to Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Respond to Webhook","typeVersion":2,"nodeCategories":[{"id":7,"name":"Utility"},{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1225,"icon":"file:form.svg","name":"n8n-nodes-base.formTrigger","codex":{"data":{"alias":["table","submit","post"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.formtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Other Trigger Nodes"]}}},"group":"[\"trigger\"]","defaults":{"name":"On form submission"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NiIgaGVpZ2h0PSI0MCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwQjdCQyIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzQuOTc4IDM3LjczMmExLjU2IDEuNTYgMCAwIDEtMS41NjIgMS41NjNINi4yNmExLjU2IDEuNTYgMCAwIDEtMS41NjMtMS41NjNWOS42MDdjMC0uNDA1LjE1Ny0uNzk0LjQzOC0xLjA4Nmw2LjMwNC02LjUzMXY1LjM0NEg4LjIxM2ExLjE3MiAxLjE3MiAwIDEgMCAwIDIuMzQzaDQuNDNhMS4xNyAxLjE3IDAgMCAwIDEuMTcxLTEuMTcxVi4yMzJoMTkuNjAyYTEuNTYgMS41NiAwIDAgMSAxLjU2MiAxLjU2M3YxMC4zMjdsLTIuODYgMi44Ni04LjI1MiA4LjI3NmE0MTMuMDA2IDQxMy4wMDYgMCAwIDEtMS42NTQgMS42NjJsLS4zMzcuMzM3YTIgMiAwIDAgMC0uNTU3IDEuMDhMMjAuMyAzMS45MjJjLS4xMDguNjM4LS4yMTUgMS4wNzkuMjExIDEuNDE4LjQwMy4zMi45LjE3NCAxLjU0LjA2Nmw1LjQwOC0uOTI4YTIgMiAwIDAgMCAxLjA4LS41NTZsNi40NC02LjQyOXptLTI0LjAzLTIxLjI2NWExLjE4IDEuMTggMCAwIDAgMS4xNzEgMS4xNzJoMTMuMTYzYTEuMTcyIDEuMTcyIDAgMSAwIDAtMi4zNDRIMTIuMTE5YTEuMTcgMS4xNyAwIDAgMC0xLjE3MiAxLjE3Mm03LjI5NCAxNC43NjZhMS4xNyAxLjE3IDAgMCAwLTEuMTcyLTEuMTcySDEyLjEyYTEuMTcyIDEuMTcyIDAgMSAwIDAgMi4zNDNoNC45NTFhMS4xNyAxLjE3IDAgMCAwIDEuMTcyLTEuMTcybS44Ni03LjM5MWExLjE3IDEuMTcgMCAwIDAtMS4xNzItMS4xNzJoLTUuODExYTEuMTcyIDEuMTcyIDAgMSAwIDAgMi4zNDNoNS44MWExLjE2NCAxLjE2NCAwIDAgMCAxLjE3My0xLjE3MSIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwQjdCQyIgZD0ibTMzLjUzMiAxNi4zOTcgNC4yODktNC4yODkgMy43NTggMy43MSAxLjYxNy0xLjYxNiAyLjI1OCAyLjI1N2MuMjE4LjIxOC4zNC41MTMuMzQzLjgyLS4wMDIuMzExLS4xMjUuNjA4LS4zNDQuODNsLTYuODA0IDYuNzk2YTEuMTMgMS4xMyAwIDAgMS0uODI4LjM0MyAxLjE1IDEuMTUgMCAwIDEtLjgyOC0uMzQzIDEuMTggMS4xOCAwIDAgMSAwLTEuNjU3bDUuOTc2LTUuOTY4LTEuMzEyLTEuMzEzLTEuMzgzIDEuNDE0LTEzLjE0OSAxMy4xMjUtNC42MTcuNzgyLjc4Mi00LjYxNy4zMzYtLjMzNyAyLjU2MiAyLjU1NWExLjEgMS4xIDAgMCAwIC44MjguMzQ0Yy4zMTIuMDA1LjYxMi0uMTIuODI4LS4zNDRhMS4xOCAxLjE4IDAgMCAwIDAtMS42NTZsLTIuNTYyLTIuNTYyek00NC43MzYgMTIuMjRjMCAuNDE0LS4xNjMuODEtLjQ1NCAxLjEwMmwtLjkyMi45MTQtMy44NTItMy44MjguOTMtLjkzYTEuNTYzIDEuNTYzIDAgMCAxIDIuMjAzIDBsMS42NCAxLjY0MWMuMjkxLjI5My40NTUuNjkuNDU1IDEuMTAyIi8+PC9zdmc+"},"displayName":"n8n Form Trigger","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":34,"name":"Invoice Processing"},{"id":49,"name":"AI Summarization"}],"image":[]}}