{"workflow":{"id":12972,"name":"Handle approval requests with SendGrid email and Baserow records","views":37,"recentViews":0,"totalViews":37,"createdAt":"2026-01-24T15:50:45.405Z","description":"# Approval Workflow Handler – SendGrid & Baserow\n\nThis workflow automates the end-to-end approval process for any request type (e.g., purchase orders, content sign-off, access permissions). It routes the request to designated approvers, records every decision in a Baserow table, and notifies requesters and stakeholders via SendGrid at each stage.\n\n## Pre-conditions/Requirements\n\n### Prerequisites\n- n8n instance (self-hosted, desktop, or n8n cloud)\n- SendGrid account with an API Key\n- Baserow workspace & table set up to store approval records\n- Basic understanding of n8n node configuration\n\n### Required Credentials\n- **SendGrid API Key** – For sending transactional emails\n- **Baserow Personal API Token** – For creating, updating, and querying table rows\n\n### Specific Setup Requirements\n| Baserow Column | Type     | Purpose                              | Example Value |\n| -------------- | -------- | ------------------------------------ | ------------- |\n| `request_id`   | text     | Unique identifier for each request   | 2542          |\n| `title`        | text     | Short description of the request     | “PO &gt; $5K”    |\n| `status`       | single select | Tracks state (Pending, Approved, Rejected) | “Pending”     |\n| `requester`    | text     | Email of person creating the request | alice@acme.io |\n| `approver`     | text     | Email of assigned approver           | bob@acme.io   |\n| `updated_at`   | date     | Last status change timestamp         |               |\n\n## How it works\n\nThis workflow automates the end-to-end approval process for any request type (e.g., purchase orders, content sign-off, access permissions). It routes the request to designated approvers, records every decision in a Baserow table, and notifies requesters and stakeholders via SendGrid at each stage.\n\n## Key Steps:\n- **Trigger**: A Manual Trigger (or any upstream workflow) injects the initial request data.\n- **Create Record (Baserow)**: Store the new request as a “Pending” row.\n- **Notify Approver (SendGrid)**: Email the approver with approval/denial links.\n- **Wait for Action**: Hold execution until the approver clicks a link that calls the workflow’s Webhook URL.\n- **Decision Branch (If node)**: Determine whether the request is Approved or Rejected.\n- **Update Record (Baserow)**: Write the new status and timestamp back to the row.\n- **Notify Requester (SendGrid)**: Send the final decision to the original requester.\n- **Error Handling**: Error Trigger captures any unhandled failures and notifies ops.\n\n## Set up steps\n\n**Setup Time: 15-25 minutes**\n\n1. **Clone or import the template** into your n8n instance.\n2. **Add credentials**  \n   a. Go to Credentials → New → SendGrid and paste your API key.  \n   b. Go to Credentials → New → Baserow and paste your Personal API Token.\n3. **Configure environment variables (optional but recommended)**  \n   - `APPROVER_EMAILS` – Comma-separated list of default approvers.  \n   - `STAKEHOLDER_EMAILS` – Comma-separated list of CC recipients.\n4. **Edit the Baserow node**  \n   - Select your workspace and the “Approvals” table that matches the column schema above.\n5. **Customize email templates** in both SendGrid nodes (subject, HTML content, variables).\n6. **Update Wait node’s webhook URL** if running self-hosted behind a reverse proxy.\n7. **Run a test execution** using the Manual Trigger; confirm emails are delivered and the Baserow table updates correctly.\n8. **Switch the trigger** (optional) from Manual to Webhook or Schedule for production use.\n9. **Enable workflow** to begin processing live approval requests.\n\n## Node Descriptions\n\n### Core Workflow Nodes:\n- **Manual Trigger** – Starts the workflow during testing or via UI.\n- **Set (Initialize Request)** – Normalizes incoming data and generates a unique `request_id`.\n- **Baserow (Create Row)** – Inserts a new “Pending” record.\n- **SendGrid (Notify Approver)** – Sends approval request email with dynamic links.\n- **Wait** – Pauses execution until the approver responds.\n- **If (Decision)** – Routes the flow based on `approved` vs `rejected`.\n- **Baserow (Update Row)** – Writes final status and timestamp.\n- **SendGrid (Notify Requester)** – Communicates final decision.\n- **Merge** – Consolidates parallel branches before ending.\n- **Error Trigger** – Captures errors, logs them, and optionally notifies ops via email.\n- **Sticky Notes** – Contain inline documentation for maintainers.\n\n### Data Flow:\n1. **Manual Trigger** → **Set** → **Baserow (Create Row)** → **SendGrid (Notify Approver)** → **Wait**  \n2. **Wait** → **If** → (Approved ⬅︎ or ➡︎ Rejected) → **Baserow (Update Row)** → **SendGrid (Notify Requester)** → **Merge**\n\n## Customization Examples\n\n### 1. Auto-assign approver based on request amount\n```javascript\n// Code node: Dynamic approver selection\nconst amount = items[0].json.amount;\nitems[0].json.approver =\n  amount &gt; 10000 ? 'cfo@acme.io' : 'manager@acme.io';\nreturn items;\n```\n\n### 2. Slack notification instead of email\n```javascript\n// Replace SendGrid node with Slack node\n{\n  \"channel\": \"#approvals\",\n  \"text\": `Request ${$json[\"request_id\"]} was approved by ${$json[\"approver\"]}`\n}\n```\n\n## Data Output Format\n\nThe workflow outputs structured JSON data:\n\n```json\n{\n  \"request_id\": \"2542\",\n  \"title\": \"PO &gt; $5K\",\n  \"status\": \"Approved\",\n  \"requester\": \"alice@acme.io\",\n  \"approver\": \"bob@acme.io\",\n  \"updated_at\": \"2024-04-27T15:41:22.347Z\"\n}\n```\n\n## Troubleshooting\n\n### Common Issues\n1. **Emails not sending** – Verify SendGrid API key and account sender verification; check node credentials.\n2. **Baserow “permission denied”** – Ensure the Personal API Token has access to the workspace and table.\n3. **Wait node never resumes** – Confirm the public webhook URL is reachable and correctly embedded in email links.\n\n### Performance Tips\n- Batch approvals in a single workflow run when possible to reduce API overhead.\n- Set up Baserow table indexing on `request_id` for faster lookups.\n\n**Pro Tips:**\n- Use the **Error Trigger** to post incidents to a dedicated Slack or Microsoft Teams channel.\n- Store reusable email templates in a separate “Settings” sheet or in n8n’s global static data.\n- Add analytics by sending events to PostHog or Amplitude after each approval.\n\n---\n\n*This is a community-contributed workflow template. It is provided “as-is” without warranty; review and test thoroughly before using in production.*","workflow":{"id":"JZ8C3IFRtHrntshw","meta":{"instanceId":"99f4e9e67f2a926c174453b6675a71cc5fb71c1fb19cfc06d50531053c661324"},"name":"Approval Workflow Handler – SendGrid & Baserow","tags":[],"nodes":[{"id":"d56b5b5a-2256-4126-b430-000c2d4a983d","name":"📝 Workflow Overview","type":"n8n-nodes-base.stickyNote","position":[-224,-80],"parameters":{"width":550,"height":722,"content":"## How it works\nThis workflow orchestrates a complete approval lifecycle from submission to resolution. A manual trigger kicks things off, after which incoming request data is verified for completeness.  Invalid submissions immediately notify the requester and terminate gracefully.  Valid requests are routed to the correct approver, logged as **Pending** in Baserow, and the approver is emailed via SendGrid with a unique approval-link.  The workflow then suspends on a *Wait* node until that link is called, resuming with the approver’s decision.  Depending on the response, the record is updated to **Approved** or **Rejected**, and all stakeholders receive a status email.  Finally, execution metadata is merged and the run is cleanly closed.\n\n## Setup steps\n1. Create a Baserow database/table with fields: Request ID, Requester, Department, Amount, Status, SubmittedAt, DecisionAt.\n2. Add SendGrid credentials in n8n and verify sender addresses.\n3. Replace all placeholder IDs (databaseId, tableId) and email addresses inside the nodes.\n4. Publish the workflow, set it *active*, and manually trigger once to generate sample data.\n5. Provide real request data to the Manual Trigger (or call via REST, e.g., the *Execute Workflow* API).\n6. Share the generated Approval Link with approvers—clicking it will resume the workflow.\n7. Monitor Baserow for live status or extend with additional analytics as needed."},"typeVersion":1},{"id":"82c16db2-2402-474d-81b9-9ef8d6eaaaaa","name":"Section • Trigger & Validation","type":"n8n-nodes-base.stickyNote","position":[432,-48],"parameters":{"color":7,"width":658,"height":782,"content":"## Trigger & Validation\nThis group covers the initial kick-off and data hygiene.  The Manual Trigger acts as the entry point—ideal for testing or external API calls via the *Execute Workflow* endpoint.  Immediately after triggering, the **Validate Request Data** Code node inspects the payload for required properties (requestId, requesterName, department, amount).  An IF node branches the flow: valid data proceeds, while invalid data triggers a SendGrid alert and gracefully ends.  Feel free to add more sophisticated validation (regex, schema checks) or transform raw inputs in the Set node if your upstream system sends fields in different shapes."},"typeVersion":1},{"id":"b047a5f7-ef49-46e4-8c36-fac14d6f5952","name":"Section • Notify & Wait","type":"n8n-nodes-base.stickyNote","position":[1088,-32],"parameters":{"color":7,"width":930,"height":782,"content":"## Notification & Await Response\nOnce a request is verified, we calculate the correct approver (e.g., based on department rules) and send a nicely formatted SendGrid email containing request details and a unique approval link.  The **Wait for Approval Response** node suspends the workflow execution, freeing resources until an approver clicks their link.  That link points to the automatically generated resume-URL of the Wait node, sending back JSON like `{ approved: true, comments: \"Looks good\" }`.  When the workflow resumes, the data is cleaned up and routed to the proper branch."},"typeVersion":1},{"id":"dd65d721-f1ac-4303-a6a8-f4e89c6a0e61","name":"Section • Post-Processing","type":"n8n-nodes-base.stickyNote","position":[2016,-32],"parameters":{"color":7,"width":1074,"height":782,"content":"## Post-Processing & Storage\nAfter resumption, an IF node evaluates the `approved` flag.  Approved requests update the Baserow row to **Approved**, rejected ones to **Rejected**.  Each path sends a follow-up email via SendGrid to inform both requester and approver of the final status.  A Merge node converges all terminal branches for unified logging or further actions (analytics, archival, etc.).  You can expand this section with Slack, Teams, or CRM hooks as business needs evolve."},"typeVersion":1},{"id":"4efef463-7024-4e0c-a425-3d0660a21659","name":"Start Workflow","type":"n8n-nodes-base.manualTrigger","position":[432,304],"parameters":{},"typeVersion":1},{"id":"2198a03b-33e3-48d6-9323-65421cd2f283","name":"Validate Request Data","type":"n8n-nodes-base.code","position":[624,304],"parameters":{"jsCode":"// Basic validation & normalization\nconst item = $json;\nconst required = ['requestId', 'requesterName', 'department', 'amount'];\nlet invalid = false;\nfor (const field of required) {\n  if (!item[field] || item[field] === '') invalid = true;\n}\nreturn [{\n  json: {\n    ...item,\n    invalid,\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"c7233538-6f32-4d57-8f89-94b9c5b74256","name":"Is Request Valid?","type":"n8n-nodes-base.if","position":[832,304],"parameters":{"options":{},"conditions":{"boolean":[{"value1":"={{ $json.invalid }}","value2":true}]}},"typeVersion":2},{"id":"f176b3f4-fb4e-4333-9c0f-d7f3e57385c8","name":"Send Invalid Input Alert","type":"n8n-nodes-base.sendGrid","position":[1024,208],"parameters":{},"typeVersion":1},{"id":"8f89825d-aa55-4139-99e9-1063c55e0458","name":"Determine Approver","type":"n8n-nodes-base.code","position":[1024,416],"parameters":{"jsCode":"// Simple router: choose approver by department\nconst dept = $json.department;\nlet approverEmail = 'user@example.com';\nif (dept === 'Finance') approverEmail = 'user@example.com';\nif (dept === 'HR') approverEmail = 'user@example.com';\nreturn [{ json: { ...$json, approverEmail } }];"},"typeVersion":2},{"id":"237ecb70-492f-4135-b648-6fec9f5de2cd","name":"Notify Approver","type":"n8n-nodes-base.sendGrid","position":[1232,416],"parameters":{},"typeVersion":1},{"id":"41d8e6e9-2139-4234-9492-90c5f7003328","name":"Create Pending Record","type":"n8n-nodes-base.baserow","position":[1424,416],"parameters":{"tableId":"{{YOUR_TABLE_ID}}","operation":"create","databaseId":"{{YOUR_DATABASE_ID}}"},"typeVersion":1},{"id":"03ebac20-7f65-42d5-a8c8-451d1f93d312","name":"Wait for Approval Response","type":"n8n-nodes-base.wait","position":[1632,416],"webhookId":"2ad758c2-64dc-47c9-b99a-3e04f2f97c36","parameters":{"resume":true},"typeVersion":1},{"id":"e42434ae-916a-47b1-b425-22401469640b","name":"Extract Approval Result","type":"n8n-nodes-base.set","position":[1824,416],"parameters":{"options":{}},"typeVersion":3.4},{"id":"37303efd-54c0-40e7-b976-9e423b1b763c","name":"Approved?","type":"n8n-nodes-base.if","position":[2032,416],"parameters":{"options":{},"conditions":{"boolean":[{"value1":"={{ $json.approved }}","value2":true}]}},"typeVersion":2},{"id":"9ce32909-83b8-4918-8e2e-746e06e73ba2","name":"Update Record – Approved","type":"n8n-nodes-base.baserow","position":[2224,304],"parameters":{"rowId":"={{ $json.requestId }}","tableId":"{{YOUR_TABLE_ID}}","operation":"update","databaseId":"{{YOUR_DATABASE_ID}}"},"typeVersion":1},{"id":"b2302eaf-d92e-4b11-a8c7-03c6b3bc4c27","name":"Notify Requester – Approved","type":"n8n-nodes-base.sendGrid","position":[2432,304],"parameters":{},"typeVersion":1},{"id":"c63597b1-3486-414e-a4d2-adfedad9c11c","name":"Update Record – Rejected","type":"n8n-nodes-base.baserow","position":[2224,512],"parameters":{"rowId":"={{ $json.requestId }}","tableId":"{{YOUR_TABLE_ID}}","operation":"update","databaseId":"{{YOUR_DATABASE_ID}}"},"typeVersion":1},{"id":"5f884da2-c06c-48fe-974c-7772e3dac49a","name":"Notify Requester – Rejected","type":"n8n-nodes-base.sendGrid","position":[2432,512],"parameters":{},"typeVersion":1},{"id":"c71ad01e-a594-46bc-9593-d57b852d30fa","name":"Join End Paths","type":"n8n-nodes-base.merge","position":[2624,416],"parameters":{"mode":"mergeInput1And2","options":{}},"typeVersion":2.1},{"id":"37feeb27-667c-4686-aec6-0de4063da06c","name":"Finalize","type":"n8n-nodes-base.code","position":[2832,416],"parameters":{"jsCode":"// Final housekeeping – could push audit logs or metrics\nreturn items;"},"typeVersion":2}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"4bc9f3a1-5fcc-4d8c-86dc-2838b27dedd9","connections":{"Approved?":{"main":[[{"node":"Update Record – Approved","type":"main","index":0}],[{"node":"Update Record – Rejected","type":"main","index":0}]]},"Join End Paths":{"main":[[{"node":"Finalize","type":"main","index":0}]]},"Start Workflow":{"main":[[{"node":"Validate Request Data","type":"main","index":0}]]},"Notify Approver":{"main":[[{"node":"Create Pending Record","type":"main","index":0}]]},"Is Request Valid?":{"main":[[{"node":"Determine Approver","type":"main","index":0}],[{"node":"Send Invalid Input Alert","type":"main","index":0}]]},"Determine Approver":{"main":[[{"node":"Notify Approver","type":"main","index":0}]]},"Create Pending Record":{"main":[[{"node":"Wait for Approval Response","type":"main","index":0}]]},"Validate Request Data":{"main":[[{"node":"Is Request Valid?","type":"main","index":0}]]},"Extract Approval Result":{"main":[[{"node":"Approved?","type":"main","index":0}]]},"Send Invalid Input Alert":{"main":[[{"node":"Join End Paths","type":"main","index":1}]]},"Update Record – Approved":{"main":[[{"node":"Notify Requester – Approved","type":"main","index":0}]]},"Update Record – Rejected":{"main":[[{"node":"Notify Requester – Rejected","type":"main","index":0}]]},"Wait for Approval Response":{"main":[[{"node":"Extract Approval Result","type":"main","index":0}]]},"Notify Requester – Approved":{"main":[[{"node":"Join End Paths","type":"main","index":0}]]},"Notify Requester – Rejected":{"main":[[{"node":"Join End Paths","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":20,"nodeTypes":{"n8n-nodes-base.if":{"count":2},"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":3},"n8n-nodes-base.wait":{"count":1},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.baserow":{"count":3},"n8n-nodes-base.sendGrid":{"count":4},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.manualTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"vinci-king-01","username":"vinci-king-01","bio":"","verified":true,"links":["https://www.linkedin.com/in/marco-vinciguerra-7ba365242/"],"avatar":"https://gravatar.com/avatar/d939eeef03a5fcb5df08bee8196f12ccb248c38209487414e419032004f0c014?r=pg&d=retro&size=200"},"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":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"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/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"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/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/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.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":439,"icon":"file:sendGrid.svg","name":"n8n-nodes-base.sendGrid","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.sendgrid/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/sendgrid/"}]},"categories":["Marketing","Communication"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"transform\"]","defaults":{"name":"SendGrid"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjYgNjUiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZD0iTTAgMjEuMjVoMjEuMzc0djIxLjM3NEgweiIvPjxwYXRoIGZpbGw9IiM5OWUxZjQiIGQ9Ik0wIDIxLjI1aDIxLjM3NHYyMS4zNzRIMHoiLz48cGF0aCBkPSJNMjEuMzc0IDQyLjYyNmgyMS4yNXYyMS4yNWgtMjEuMjV6Ii8+PHBhdGggZmlsbD0iIzk5ZTFmNCIgZD0iTTIxLjM3NCA0Mi42MjZoMjEuMjV2MjEuMjVoLTIxLjI1eiIvPjxwYXRoIGZpbGw9IiMxYTgyZTIiIGQ9Ik0wIDYzLjg3N2gyMS4zNzRWNjRIMHptMC0yMS4yNWgyMS4zNzR2MjEuMjVIMHoiLz48cGF0aCBmaWxsPSIjMDBiM2UzIiBkPSJNMjEuMzc0IDBoMjEuMjV2MjEuMjVoLTIxLjI1em0yMS4yNTIgMjEuMzc0SDY0djIxLjI1SDQyLjYyNnoiLz48cGF0aCBmaWxsPSIjMDA5ZGQ5IiBkPSJNMjEuMzc0IDQyLjYyNmgyMS4yNVYyMS4yNWgtMjEuMjV6Ii8+PHBhdGggZmlsbD0iIzFhODJlMiIgZD0iTTQyLjYyNiAwSDY0djIxLjI1SDQyLjYyNnptMCAyMS4yNUg2NHYuMTIzSDQyLjYyNnoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"SendGrid","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"},{"id":27,"name":"Marketing"}]},{"id":500,"icon":"file:baserow.svg","name":"n8n-nodes-base.baserow","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.baserow/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/baserow/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"output\"]","defaults":{"name":"Baserow"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyBpZD0iV2Fyc3R3YV8xIiBkYXRhLW5hbWU9IldhcnN0d2EgMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjAwIDYwMCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiM0ZDY4YzQ7fS5jbHMtMntmaWxsOiM1MTkwZWY7fS5jbHMtM3tmaWxsOiMyYmMzZjE7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5iYXNlcm93X2xvZ29fZ2x5cGg8L3RpdGxlPjxyZWN0IGNsYXNzPSJjbHMtMSIgeT0iNDUxLjY1MjMzIiB3aWR0aD0iMzc0LjE3MzgzIiBoZWlnaHQ9IjE0OC4zNDc2NyIgcng9IjMyLjI1NTYyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNzQuMTczODMgMTA1MS42NTIzMykgcm90YXRlKDE4MCkiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zMi4yNTYsMjI1LjgyNjE3SDU2Ny43NDRBMzIuMjU2LDMyLjI1NiwwLDAsMSw2MDAsMjU4LjA4MjE3djgzLjgzNTY3YTMyLjI1NiwzMi4yNTYsMCwwLDEtMzIuMjU2LDMyLjI1NkgzMi4yNTU2MkEzMi4yNTU2MiwzMi4yNTU2MiwwLDAsMSwwLDM0MS45MTgyMXYtODMuODM2QTMyLjI1NiwzMi4yNTYsMCwwLDEsMzIuMjU2LDIyNS44MjYxN1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwMCA2MDApIHJvdGF0ZSgxODApIi8+PHJlY3QgY2xhc3M9ImNscy0zIiB4PSIyMjUuODI2MTciIHdpZHRoPSIzNzQuMTczODMiIGhlaWdodD0iMTQ4LjM0NzY3IiByeD0iMzIuMjU2IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4MjUuODI2MTcgMTQ4LjM0NzY3KSByb3RhdGUoMTgwKSIvPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNDUxLjY1MjMzIiB5PSI0NTEuNjUyMzMiIHdpZHRoPSIxNDguMzQ3NjciIGhlaWdodD0iMTQ4LjM0NzY3IiByeD0iMzIuMjU2IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDUxLjY1MjMzIDEwNTEuNjUyMzQpIHJvdGF0ZSgtMTgwKSIvPjxyZWN0IGNsYXNzPSJjbHMtMyIgd2lkdGg9IjE0OC4zNDc2NyIgaGVpZ2h0PSIxNDguMzQ3NjYiIHJ4PSIzMi4yNTYiLz48L3N2Zz4K"},"displayName":"Baserow","typeVersion":1,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":514,"icon":"fa:pause-circle","name":"n8n-nodes-base.wait","codex":{"data":{"alias":["pause","sleep","delay","timeout"],"resources":{"generic":[{"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/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.wait/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Wait","color":"#804050"},"iconData":{"icon":"pause-circle","type":"icon"},"displayName":"Wait","typeVersion":1,"nodeCategories":[{"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":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":35,"name":"Document Extraction"}],"image":[]}}