{"workflow":{"id":14313,"name":"Send multi-stage overdue invoice reminders with NocoDB, Gmail, PostGrid and Slack","views":14,"recentViews":1,"totalViews":14,"createdAt":"2026-03-25T12:46:14.762Z","description":"## What Is This?\n\nThis workflow is an automated invoice payment tracking and vindication system that monitors unpaid and overdue invoices stored in NocoDB, then sends escalating reminders to clients based on configurable time thresholds. The system handles three escalation levels: friendly payment reminders before/at due date, formal warning notices for overdue invoices, and legal action notifications for severely overdue accounts.\n\nIt works with any accounting system that can populate a NocoDB database, making it ideal for businesses using custom invoicing systems, international accounting software, or multiple invoice sources.\n\n## Who Is It For?\n\nDesigned for small to medium-sized businesses, IT service providers, consulting agencies, and accounting departments that need professional payment enforcement without expensive debt collection services. This workflow is particularly valuable for companies experiencing cash flow challenges due to late-paying clients.\n\nB2B service providers, software development agencies, consultancies, and freelancers managing multiple client invoices will benefit from automated, multi-channel payment reminders that maintain professional relationships while firmly enforcing payment terms.\n\nWhether you're tracking 5 high-value contracts or managing 200+ monthly invoices, this automation ensures no payment deadline slips through the cracks. It's especially useful for businesses operating internationally or using accounting systems without built-in reminder features.\n\n## How Does It Work?\n\nThis comprehensive invoice vindication automation consists of four main stages:\n\n**1. Configuration & Company Details Setup**  \nDefines critical parameters including escalation timeframes (Days before Due Date for reminder, Days after Due Date for warning, Days after Due Date for Legal action), and toggles for notification channels (Send Email, Send Physical Letter). The workflow also captures complete company information for professional correspondence including banking details, tax identification numbers, and contact information.\n\n![image.png](fileId:5153)\n\n**2. Invoice & Client Data Retrieval**  \nConnects to NocoDB to fetch all invoices with their associated client information. The workflow uses a Split in Batches node to process each invoice individually, retrieving complete client details (name, email, full address) from the linked Clients table. This two-step fetch ensures all necessary data is available for personalized communications.\n\n![image.png](fileId:5151)\n\n**3. Intelligent Filtering & Categorization**  \nInvoices are filtered to remove already-paid invoices (checking both Invoice Status ≠ \"Paid\" and Payment Date = empty), then categorized into three escalation groups:\n\n- **Today/Upcoming Invoices**: Due date is today OR X days away → Sends friendly payment reminder\n- **Overdue for Warning**: Exactly Y days past due date → Sends formal warning about potential legal action\n- **Overdue for Legal Notice**: Exactly Z days past due date → Sends notice of commenced legal proceedings\n\n![image.png](fileId:5152)\n\n**4. Multi-Channel Notification Dispatch**  \nFor each escalation level, the workflow generates professionally formatted HTML content with complete invoice details, payment instructions, and appropriate urgency levels. Notifications are dispatched via:\n\n- **Email** (Gmail): Professional HTML emails with company branding\n- **Physical Mail** (PostGrid): Printed letters delivered via postal service for serious escalations\n- **Slack**: Internal team notifications for tracking sent reminders\n\n![image.png](fileId:5150)\n\nEach notification includes invoice number, amounts, due dates, payment details (bank account, SWIFT code), and clear call-to-action based on escalation level.\n\n![image.png](fileId:5154)\n\n## How To Set It Up?\n\n**Prerequisites:**\n\n- An active N8N account or self-hosted instance\n- A NocoDB instance (hosted at your domain or using NocoDB Cloud)\n- A Slack workspace with bot permissions\n- (Optional) Gmail account configured for sending emails\n- (Optional) PostGrid account for physical mail delivery\n\n**Step 1: Create NocoDB Tables**\n\nExecute the \"Create Tables\" manual trigger to automatically create two tables in your NocoDB base:\n\n**Invoices Table** with fields:\n\n- Invoice Id (SingleLineText)\n- Amount (Currency, PLN)\n- Issue Date (Date)\n- Due Date (Date)\n- Invoice Status (SingleSelect: Unpaid, Partial, Paid, Overdue)\n- Vindication Status (SingleSelect: None, Reminder Sent, Warning Sent, Legal Notice Sent)\n- Reminder Sent Date, Warning Sent Date, Legal Notice Sent Date (Date fields)\n- Payment Date (Date)\n\n![image.png](fileId:5155)\n\n\n**Clients Table** with fields:\n\n- Name (SingleLineText)\n- Email (Email)\n- Country Code, Province, City, Postal Code, Address (SingleLineText)\n\n![image.png](fileId:5156)\n\n\nThe workflow automatically creates a one-to-many relationship between Clients and Invoices.\n\n**Step 2: Configure NocoDB Connection**\n\nIn the \"NocoDB Config\" node:\n\n- **Base ID**: Your NocoDB base identifier (e.g., `pksfpoc943gwhvy`)\n- **NocoDB Url**: Your NocoDB instance URL (e.g., `https://noco.sbyte.eu/`)\n\nUpdate all NocoDB credentials to point to your instance using the \"NocoDB Token\" authentication.\n\n**Step 3: Set Escalation Timing**\n\nIn the \"Config\" node, configure:\n\n- **Days before Due Date for reminder**: How early to send friendly reminders (default: 7 days before)\n- **Days after Due Date for warning**: When to escalate to formal warning (default: 7 days overdue)\n- **Days after Due Date for Legal action**: When to send legal notices (default: 10 days overdue)\n\n**Critical**: Ensure \"Days after Due Date for Legal action\" &gt; \"Days after Due Date for warning\" to maintain proper escalation sequence. Setting legal action earlier than warning will confuse clients.\n\n**Step 4: Configure Notification Channels**\n\nIn the \"Config\" node:\n\n- **Send Email**: Toggle to enable/disable Gmail notifications\n- **Send Physical Letter**: Toggle to enable/disable PostGrid physical mail\n\n**Step 5: Add Your Company Details**\n\nIn the \"Your Company Details\" node, provide:\n\n- Company Name, Email, Phone\n- Full address (Country Code, City, Street, Postal Code)\n- Banking information (Bank Name, Bank Account Number, SWIFT Code)\n- Tax Identification Number (TIN)\n\nThis information appears in all correspondence and legal notices.\n\n**Step 6: Configure Credentials**\n\nSet up the following credentials:\n\n- **NocoDB API Token**: From your NocoDB account settings\n- **Gmail OAuth2**: For email delivery (if Send Email = true)\n- **PostGrid API**: For physical letter delivery (if Send Physical Letter = true)\n- **Slack OAuth2**: For internal team notifications\n\n**Step 7: Customize Slack Channel**\n\nIn the \"Send a message\" node, update the Slack channel ID to your desired notification channel.\n\n**Step 8: Schedule Execution**\n\nThe workflow runs automatically daily at 7:00 AM via the \"Run daily\" trigger node. Adjust timing in the Schedule Trigger node as needed. For testing, execute manually using the \"Execute workflow\" button.\n\n## What's More?\n\n**Professional HTML Email Templates:**  \nThree distinct HTML email templates provide escalating urgency levels while maintaining professional communication standards. Each template includes:\n\n- Company branding and letterhead\n- Clear invoice details with formatting\n- Payment instructions with bank details\n- Appropriate tone for escalation level (friendly → formal → legal)\n- Contact information for questions\n\n**Smart Date Calculations:**  \nThe workflow uses N8N's DateTime functions to calculate:\n\n- Days until due date for upcoming invoices\n- Days overdue for late payments\n- Exact matching for escalation thresholds (uses `equals` operator, not ranges)\n\nThis ensures invoices are processed exactly once at each escalation stage, preventing duplicate notifications.\n\n**Flexible Data Model:**  \nThe NocoDB schema supports tracking:\n\n- Multiple vindication stages with dedicated date fields\n- Invoice status progression (Unpaid → Partial → Overdue → Paid)\n- Vindication status history (None → Reminder Sent → Warning Sent → Legal Notice Sent)\n- Payment reconciliation via Payment Date field\n\n**Multi-Format Address Handling:**  \nThe workflow correctly formats addresses for:\n\n- Email recipients (standard format)\n- PostGrid API (structured JSON with country codes, provinces, postal codes)\n- HTML templates (human-readable format)\n\n**Batch Processing with Error Isolation:**  \nThe Split in Batches node processes invoices individually, ensuring one failed notification (e.g., invalid email address) doesn't block processing of remaining invoices. Each invoice proceeds through the workflow independently.\n\n**Conditional Notification Routing:**  \nIF nodes check configuration flags before sending notifications, allowing granular control:\n\n- Send only emails for low-cost operations\n- Send only physical letters for serious escalations\n- Send both for maximum impact\n- Disable specific channels temporarily without modifying workflow\n\n**Slack Notification Intelligence:**  \nSlack messages include structured blocks showing:\n\n- Email subject (escalation type)\n- Invoice number and amount\n- Contractor name\n- Days overdue calculation\n- Payment deadline and issue date\n\nThis provides at-a-glance visibility into which invoices triggered notifications and why.\n\n**Table Creation Automation:**  \nRather than requiring manual NocoDB table setup, the workflow includes HTTP Request nodes that programmatically create tables with exact field types, validation rules, and relationships using NocoDB's Meta API. This ensures consistent schema across deployments and eliminates manual configuration errors.\n\n**Currency Support:**  \nWhile defaulting to PLN (Polish Złoty), the Amount field uses NocoDB's Currency type, which can be easily changed to EUR, USD, GBP, or 150+ other currencies via the table schema without modifying workflow logic.\n\n## Thank You, Perfect!\n\nVisit my profile for other free business automations. And if you're looking for dedicated software development or custom n8n workflow solutions, don't hesitate to reach out at [developers@sailingbyte.com](mailto:developers@sailingbyte.com) or on [sailingbyte.com](sailingbyte.com)!\n","workflow":{"meta":{"instanceId":"bdce9ec27bbe2b742054f01d034b8b468d2e7758edd716403ad5bd4583a8f649","templateCredsSetupCompleted":true},"nodes":[{"id":"ba74def9-0738-4005-a4c6-3aa33c827ed1","name":"Config","type":"n8n-nodes-base.set","position":[-1600,-80],"parameters":{"options":{},"assignments":{"assignments":[{"id":"ff4e72f5-a740-4026-859e-1f80fb143f9c","name":"Days before Due Date for reminder","type":"number","value":7},{"id":"3e91c215-361e-4b23-a171-730dfe40e957","name":"Days after Due Date for warning","type":"number","value":7},{"id":"9ae7394e-635b-4c50-acda-62fb6b8a6c71","name":"Days after Due Date for Legal action","type":"number","value":10},{"id":"311725b4-8c8b-4afe-944c-a7e5f0fceda9","name":"Send Email","type":"boolean","value":true},{"id":"f99ad4ab-8f3d-45d6-9c5b-0d9dc39d0bb2","name":"Send Physical Letter","type":"boolean","value":true}]}},"typeVersion":3.4},{"id":"0fae7a0d-5b5e-4a59-b47c-fce948bd208b","name":"Get overdue invoices for warning","type":"n8n-nodes-base.filter","position":[320,-80],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"77b7ab90-eb96-4740-8599-6bf241e73c74","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $json.Invoice[\"Due Date\"].toDateTime().diffTo($now.format('yyyy-LL-dd'), 'days') }}","rightValue":"={{ -$('Config').first().json['Days after Due Date for warning'] }}"}]}},"typeVersion":2.3},{"id":"8c4fe34f-813d-481c-aaac-c16e4adeb53b","name":"Get overdue invoices for Legal notice","type":"n8n-nodes-base.filter","position":[320,112],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"77b7ab90-eb96-4740-8599-6bf241e73c74","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $json.Invoice[\"Due Date\"].toDateTime().diffTo($now.format('yyyy-LL-dd'), 'days') }}","rightValue":"={{ -$('Config').first().json['Days after Due Date for Legal action'] }}"}]}},"typeVersion":2.3},{"id":"983f7d04-28f3-40ea-85cf-f3c820c5c4f5","name":"Create Tables","type":"n8n-nodes-base.manualTrigger","position":[-2096,320],"parameters":{},"typeVersion":1},{"id":"88359c76-5faf-4a7c-a3de-61c46647f0ff","name":"NocoDB Config","type":"n8n-nodes-base.set","position":[-1888,320],"parameters":{"options":{},"assignments":{"assignments":[{"id":"54aae501-d2c2-4d1e-b268-341126fcfb9b","name":"Base ID","type":"string","value":""},{"id":"697fc737-8f87-403e-83fe-b82d4ce4ab48","name":"NocoDB Url","type":"string","value":""}]}},"typeVersion":3.4},{"id":"b7cec8e9-9e10-41e3-863c-796c00e4d1e3","name":"Create NocoDB Invoices Table","type":"n8n-nodes-base.httpRequest","position":[-2096,512],"parameters":{"url":"={{ $json[\"NocoDB Url\"] }}api/v3/meta/bases/{{$('NocoDB Config').first().json['Base ID']}}/tables","method":"POST","options":{},"jsonBody":"{\n  \"title\": \"Invoices\",\n  \"table_name\": \"Invoices\",\n  \"fields\": [\n    {\n      \"title\": \"Invoice Id\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Amount\",\n      \"type\": \"Currency\",\n      \"options\": {\n        \"code\": \"PLN\"\n      }\n    },\n    {\n      \"title\": \"Issue Date\",\n      \"type\": \"Date\"\n    },\n    {\n      \"title\": \"Due Date\",\n      \"type\": \"Date\"\n    },\n    {\n      \"title\": \"Invoice Status\",\n      \"type\": \"SingleSelect\",\n      \"options\": {\n        \"choices\": [\n          {\n            \"title\": \"Unpaid\",\n            \"color\": \"#FF9800\"\n          },\n          {\n            \"title\": \"Partial\",\n            \"color\": \"#2196F3\"\n          },\n          {\n            \"title\": \"Paid\",\n            \"color\": \"#4CAF50\"\n          },\n          {\n            \"title\": \"Overdue\",\n            \"color\": \"#F44336\"\n          }\n        ]\n      }\n    },\n    {\n      \"title\": \"Vindication Status\",\n      \"type\": \"SingleSelect\",\n      \"options\": {\n        \"choices\": [\n          {\n            \"title\": \"None\",\n            \"color\": \"#9E9E9E\"\n          },\n          {\n            \"title\": \"Reminder Sent\",\n            \"color\": \"#2196F3\"\n          },\n          {\n            \"title\": \"Warning Sent\",\n            \"color\": \"#FF9800\"\n          },\n          {\n            \"title\": \"Legal Notice Sent\",\n            \"color\": \"#F44336\"\n          }\n        ]\n      }\n    },\n    {\n      \"title\": \"Reminder Sent Date\",\n      \"type\": \"Date\"\n    },\n    {\n      \"title\": \"Warning Sent Date\",\n      \"type\": \"Date\"\n    },\n    {\n      \"title\": \"Legal Notice Sent Date\",\n      \"type\": \"Date\"\n    },\n    {\n      \"title\": \"Payment Date\",\n      \"type\": \"Date\"\n    }\n  ]\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"nocoDbApiToken"},"credentials":{"nocoDbApiToken":{"id":"kAY3Nntg4Ze5X5sG","name":"NocoDB Token Kazor"}},"typeVersion":4.3},{"id":"5dac7c2c-4be0-48d7-9e81-c9c36f33589d","name":"Create NocoDB Clients Table","type":"n8n-nodes-base.httpRequest","position":[-1888,512],"parameters":{"url":"={{ $('NocoDB Config').first().json['NocoDB Url'] }}api/v3/meta/bases/{{$('NocoDB Config').first().json['Base ID']}}/tables","method":"POST","options":{},"jsonBody":"=\n    {\n  \"title\": \"Clients\",\n  \"table_name\": \"Clients\",\n  \"source_id\": \"{{ $json.source_id }}\",\n  \"fields\": [\n    {\n      \"title\": \"Name\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Email\",\n      \"type\": \"Email\"\n    },\n    {\n      \"title\": \"Country Code\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Province\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"City\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Postal Code\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Address\",\n      \"type\": \"SingleLineText\"\n    }\n  ]\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"nocoDbApiToken"},"credentials":{"nocoDbApiToken":{"id":"kAY3Nntg4Ze5X5sG","name":"NocoDB Token Kazor"}},"typeVersion":4.3},{"id":"f5c86ebf-a0f0-4a28-bd2c-dbe8ea5c4e5c","name":"Your Company Details","type":"n8n-nodes-base.set","position":[-1200,-80],"parameters":{"options":{},"assignments":{"assignments":[{"id":"61884a08-afef-4e5d-9e73-860e5bebe76a","name":"Company Name","type":"string","value":""},{"id":"03b6e8b6-a48a-4e06-939d-6fd32f0c3234","name":"Email","type":"string","value":""},{"id":"e5c56d54-f4cb-4856-9cc8-1e99483b1dbe","name":"Phone","type":"string","value":""},{"id":"e383c8f2-1c46-406e-a079-82228e65859b","name":"Country Code","type":"string","value":""},{"id":"c7d26305-a13e-43a6-a9c3-025b6f5929fa","name":"City","type":"string","value":""},{"id":"7c59db00-640e-411f-9ff0-a0aa05e97488","name":"Street","type":"string","value":""},{"id":"c2bd2535-112b-4766-a4fb-6117fc44d56a","name":"Postal Code","type":"string","value":""},{"id":"1ef4679e-421a-428a-94d8-93efa37dd951","name":"Swift Code","type":"string","value":""},{"id":"1c48a217-2fe0-40ff-bdc6-2d31da4ea887","name":"Bank Name","type":"string","value":""},{"id":"6d70aba1-efe4-4818-be1d-f130538ba642","name":"Bank Account Number","type":"string","value":""},{"id":"da47e651-5c03-410b-9600-3846411ebafd","name":"TIN (Tax Identification Number)","type":"string","value":""}]}},"typeVersion":3.4},{"id":"9d8dd6db-dcef-4680-9944-0c96cf484c2c","name":"Create relation between tables","type":"n8n-nodes-base.httpRequest","position":[-2096,704],"parameters":{"url":"={{ $('NocoDB Config').first().json['NocoDB Url'] }}api/v3/meta/bases/{{$('NocoDB Config').first().json['Base ID']}}/tables/{{ $json.id }}/fields","method":"POST","options":{},"jsonBody":"={\n      \"title\": \"Invoices\",\n      \"type\": \"Links\",\n      \"options\": {\n        \"relation_type\": \"hm\",\n        \"related_table_id\": \"{{ $('Create NocoDB Invoices Table').first().json['id'] }}\"\n      }\n    }","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"nocoDbApiToken"},"credentials":{"nocoDbApiToken":{"id":"kAY3Nntg4Ze5X5sG","name":"NocoDB Token Kazor"}},"typeVersion":4.3},{"id":"6c738bf5-db2d-4663-bfcf-f1e6663e1e9b","name":"Get todays / upcoming invoices","type":"n8n-nodes-base.filter","position":[320,-256],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"d1efa0f8-83de-4067-88c0-bd11e8b4bf35","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $json.Invoice[\"Due Date\"].toDateTime().diffTo($now.format('yyyy-LL-dd'), 'days') }}","rightValue":"={{ $('Config').first().json['Days before Due Date for reminder'] }}"},{"id":"22f50058-557f-4463-8e62-c8d7c4a5ea18","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.Invoice[\"Due Date\"] }}","rightValue":"={{ $now.format('yyyy-LL-dd') }}"}]}},"typeVersion":2.3},{"id":"3ef37ac4-f190-42a3-93cd-5f225a850451","name":"Prepare Reminder Mail and Letter HTML","type":"n8n-nodes-base.set","position":[848,-256],"parameters":{"options":{},"assignments":{"assignments":[{"id":"393b8e7b-fc27-4d99-bd11-152e16609e25","name":"Message Content","type":"string","value":"=<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <style>\n    body {\n      font-family: Arial, Helvetica, sans-serif;\n      line-height: 1.6;\n      color: #333333;\n      margin: 0;\n      padding: 0;\n      background-color: #ffffff;\n    }\n    .container {\n      max-width: 650px;\n      margin: 0 auto;\n      padding: 40px 30px;\n    }\n    .header {\n      border-bottom: 3px solid #1976d2;\n      padding-bottom: 20px;\n      margin-bottom: 30px;\n    }\n    .company-name {\n      font-size: 24px;\n      font-weight: bold;\n      color: #1976d2;\n      margin: 0 0 5px 0;\n    }\n    .company-tagline {\n      font-size: 14px;\n      color: #666666;\n      margin: 0;\n    }\n    h1 {\n      color: #1976d2;\n      font-size: 22px;\n      margin: 0 0 20px 0;\n    }\n    .notice-box {\n      background-color: #e3f2fd;\n      border-left: 4px solid #1976d2;\n      padding: 15px 20px;\n      margin: 25px 0;\n    }\n    .notice-box p {\n      margin: 5px 0;\n      font-size: 15px;\n    }\n    .invoice-details {\n      background-color: #f5f5f5;\n      padding: 20px;\n      border-radius: 5px;\n      margin: 25px 0;\n    }\n    .invoice-details table {\n      width: 100%;\n      border-collapse: collapse;\n    }\n    .invoice-details td {\n      padding: 8px 0;\n      font-size: 15px;\n    }\n    .invoice-details td:first-child {\n      color: #666666;\n      width: 45%;\n    }\n    .invoice-details td:last-child {\n      font-weight: bold;\n      text-align: right;\n    }\n    .amount-due {\n      font-size: 20px;\n      color: #1976d2;\n    }\n    .payment-section {\n      background-color: #fff3cd;\n      border-left: 4px solid #ffc107;\n      padding: 20px;\n      margin: 25px 0;\n    }\n    .payment-section h2 {\n      color: #333333;\n      font-size: 18px;\n      margin: 0 0 15px 0;\n    }\n    .payment-details {\n      font-size: 14px;\n      line-height: 1.8;\n    }\n    .payment-details strong {\n      display: inline-block;\n      width: 140px;\n      color: #666666;\n    }\n    .footer {\n      margin-top: 40px;\n      padding-top: 20px;\n      border-top: 1px solid #e0e0e0;\n      font-size: 13px;\n      color: #666666;\n      text-align: center;\n    }\n    .button {\n      display: inline-block;\n      background-color: #1976d2;\n      color: #ffffff;\n      padding: 12px 30px;\n      text-decoration: none;\n      border-radius: 5px;\n      font-weight: bold;\n      margin: 20px 0;\n    }\n    @media print {\n      body { background-color: #ffffff; }\n      .button { display: none; }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <!-- Header -->\n    <div class=\"header\">\n      <p class=\"company-name\">{{$('Your Company Details').first().json['Company Name']}}</p>\n      <p class=\"company-tagline\">Software Development & Automation Solutions</p>\n    </div>\n\n    <!-- Main Content -->\n    <h1>Upcoming Payment Reminder</h1>\n    \n    <p>Dear {{$json['Name (from Invoice Clients)']}},</p>\n    \n    <p>This is a friendly reminder that payment for the following invoice will be due soon:</p>\n\n    <!-- Notice Box -->\n    <div class=\"notice-box\">\n      <p><strong>Invoice #{{$json.Invoice['Invoice Id']}}</strong> is due on <strong>{{$json.Invoice['Due Date']}}</strong></p>\n      <p>That's in <strong>{{$('Config').first().json['Days before Due Date for reminder']}} days</strong> from today.</p>\n    </div>\n\n    <!-- Invoice Details -->\n    <div class=\"invoice-details\">\n      <table>\n        <tr>\n          <td>Invoice Number:</td>\n          <td>{{$json.Invoice['Invoice Id']}}</td>\n        </tr>\n        <tr>\n          <td>Issue Date:</td>\n          <td>{{$json.Invoice['Issue Date']}}</td>\n        </tr>\n        <tr>\n          <td>Due Date:</td>\n          <td>{{$json.Invoice['Due Date']}}</td>\n        </tr>\n        <tr style=\"border-top: 2px solid #dddddd;\">\n          <td style=\"padding-top: 15px;\">Amount Due:</td>\n          <td class=\"amount-due\" style=\"padding-top: 15px;\">{{$json.Invoice.Amount}} PLN</td>\n        </tr>\n      </table>\n    </div>\n\n    <!-- Payment Information -->\n    <div class=\"payment-section\">\n      <h2>💳 Payment Details</h2>\n      <div class=\"payment-details\">\n        <p><strong>Bank Name:</strong> {{$('Your Company Details').first().json['Bank Name']}}</p>\n        <p><strong>Account Number:</strong> {{$('Your Company Details').first().json['Bank Account Number']}}</p>\n        <p><strong>SWIFT Code:</strong> {{$('Your Company Details').first().json['Swift Code']}}</p>\n        <p><strong>Payment Reference:</strong> {{$json.Invoice['Invoice Id']}}</p>\n      </div>\n    </div>\n\n    <p>To ensure uninterrupted service, please process payment before the due date. If you have already sent payment, please disregard this reminder.</p>\n\n    <p>If you have any questions or need assistance, please don't hesitate to contact us:</p>\n    \n    <p>\n      <strong>Email:</strong> {{$('Your Company Details').first().json['Email']}}<br>\n      <strong>Phone:</strong> {{$('Your Company Details').first().json['Phone']}}<br>\n      <strong>Office Hours:</strong> Mon-Fri, 9:00 AM - 5:00 PM CET\n    </p>\n\n    <p>Thank you for your business!</p>\n\n    <p>\n      Best regards,<br>\n      <strong>Accounts Receivable Team</strong><br>\n      \n    </p>\n\n    <!-- Footer -->\n    <div class=\"footer\">\n      <p>{{$('Your Company Details').first().json['Company Name']}} | {{$('Your Company Details').first().json['Country Code']}} | {{$('Your Company Details').first().json['City']}}, {{$('Your Company Details').first().json['Street']}} | {{$('Your Company Details').first().json['Postal Code']}}</p>\n      <p>TIN (Tax Identification Number): {{$('Your Company Details').first().json['TIN (Tax Identification Number)']}}</p>\n      <p>This is an automated reminder. Please do not reply to this message.</p>\n    </div>\n  </div>\n</body>\n</html>"},{"id":"160ee970-1929-459c-8c95-13d5ca128557","name":"=Email Subject","type":"string","value":"=Reminder to pay invoice {{ $json.Invoice[\"Invoice Id\"] }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"aa2337d5-dd9f-4e29-8473-177116350d98","name":"Get only unpaid invoices","type":"n8n-nodes-base.filter","position":[96,-80],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"2408a46d-add7-4e1f-8e0d-3964ba88a30b","operator":{"type":"string","operation":"notEquals"},"leftValue":"={{ $json.Invoice[\"Invoice Status\"] }}","rightValue":"Paid"},{"id":"5c6744ba-43a1-4313-9ffb-b9dbbf25a32e","operator":{"type":"dateTime","operation":"before"},"leftValue":"={{ Date($json.Invoice[\"Due Date\"]) }}","rightValue":"={{ $now.minus($('Config').first().json['Days before Due Date for reminder'],'days') }}"},{"id":"faab20e0-bc3c-4847-9dcd-6e82eadac6f9","operator":{"type":"string","operation":"notExists","singleValue":true},"leftValue":"={{ $json.Invoice[\"Payment Date\"] }}","rightValue":""}]}},"typeVersion":2.3},{"id":"e5d15f68-c2bf-41e5-ac72-b346e77844f6","name":"Send Letter?","type":"n8n-nodes-base.if","position":[1440,-176],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"b8d997ba-efa5-48b8-b594-1d0163854688","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $('Config').item.json[\"Send Physical Letter\"] }}","rightValue":false}]}},"typeVersion":2.3},{"id":"44dde35d-d858-4698-aa81-c771b74a222e","name":"Send Email?","type":"n8n-nodes-base.if","position":[1440,16],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d2ad82ea-1a83-428d-8dc3-05aeceaaaee1","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $('Config').item.json[\"Send Email\"] }}","rightValue":false}]}},"typeVersion":2.3},{"id":"4cdb7df3-5d90-4517-855b-e9fa18155ccf","name":"Add client info to invoice","type":"n8n-nodes-base.set","position":[-304,16],"parameters":{"options":{},"assignments":{"assignments":[{"id":"78b2c4c7-5956-4d02-9ff1-3f5ae8cdd23c","name":"Invoice","type":"object","value":"={{ $('Get client info for invoice').item.json }}"},{"id":"494c23e4-14fd-4afc-ad4b-6a816aa2126e","name":"Client","type":"object","value":"={{ $json }}"}]}},"typeVersion":3.4},{"id":"5f145b09-5911-4657-bf0f-e3e9301d9944","name":"Get Invoices","type":"n8n-nodes-base.nocoDb","position":[-880,-80],"parameters":{"table":"mi7ptepxqhw71hw","options":{"fields":[]},"operation":"getAll","projectId":"pksfpoc943gwhvy","returnAll":true,"authentication":"nocoDbApiToken"},"credentials":{"nocoDbApiToken":{"id":"kAY3Nntg4Ze5X5sG","name":"NocoDB Token Kazor"}},"typeVersion":3},{"id":"ffe70cec-3415-49c4-9143-17d800e68a5c","name":"Get client info for invoice","type":"n8n-nodes-base.splitInBatches","position":[-688,-80],"parameters":{"options":{}},"typeVersion":3},{"id":"c61ae08d-68c2-4183-a425-e5cda6ae2af3","name":"Get client row","type":"n8n-nodes-base.nocoDb","position":[-512,16],"parameters":{"id":"={{ $json.Clients_id }}","table":"mjsltidf4t9ex0m","projectId":"pksfpoc943gwhvy","authentication":"nocoDbApiToken"},"credentials":{"nocoDbApiToken":{"id":"kAY3Nntg4Ze5X5sG","name":"NocoDB Token Kazor"}},"typeVersion":3},{"id":"de671e93-dcb8-4d20-b45d-81ff45d20ec5","name":"Run daily","type":"n8n-nodes-base.scheduleTrigger","position":[-2000,-80],"parameters":{"rule":{"interval":[{"triggerAtHour":7}]}},"typeVersion":1.3},{"id":"1c04e1fc-0b3d-4943-a40c-ce2e86211903","name":"Combine all inputs","type":"n8n-nodes-base.set","position":[1056,-80],"parameters":{"options":{},"includeOtherFields":true},"typeVersion":3.4},{"id":"8d033053-54c9-4d73-9957-106969e6ba6b","name":"Send Letter using PostGrid API","type":"n8n-nodes-base.httpRequest","position":[1648,-176],"parameters":{"url":"https://api.postgrid.com/print-mail/v1/letters","method":"POST","options":{},"jsonBody":"={\n  \"to\": {\n    \"companyName\": \"{{ $json.Client.Name }}\",\n    \"addressLine1\": \"{{ $json.Client.Address }}\",\n    \"city\": \"{{ $json.Client.City }}\",\n    \"provinceOrState\": \"{{ $json.Client.Province }}\",\n    \"postalOrZip\": \"{{ $json.Client[\"Postal Code\"] }}\",\n    \"countryCode\": \"{{ $json.Client[\"Country Code\"] }}\"\n  },\n  \"from\": {\n    \"companyName\": \"{{$('Your Company Details').first().json['Company Name']}}\",\n    \"addressLine1\": \"{{$('Your Company Details').first().json['Street']}}\",\n    \"city\": \"{{$('Your Company Details').first().json['City']}}\",\n    \"postalOrZip\": \"{{$('Your Company Details').first().json['Postal Code']}}\",\n    \"countryCode\": \"{{$('Your Company Details').first().json['Country Code']}}\"\n  },\n  \"html\": {{JSON.stringify($json['Message Content'])}},\n  \"description\": \"Overdue Invoice Reminder - {{$json.Invoice['Invoice Id']}}\",\n  \"color\": false,\n  \"doubleSided\": false,\n  \"addressPlacement\": \"top_first_page\"\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpCustomAuth"},"credentials":{"httpCustomAuth":{"id":"u60ImDk8exL0i2Gg","name":"PostGrid API Test Key"}},"typeVersion":4.3},{"id":"4fbdfb57-adf5-431b-a792-1e98d5697a79","name":"Send an Email","type":"n8n-nodes-base.gmail","position":[1648,16],"webhookId":"2e662219-e8b7-45ff-9bb6-48c03eb86d83","parameters":{"sendTo":"={{ $json.Client.Email }}","message":"={{ $json[\"Message Content\"] }}","options":{},"subject":"={{ $json[\"Email Subject\"] }}"},"credentials":{"gmailOAuth2":{"id":"kOLXjbBz9Jun0U57","name":"Google OAuth2 Kazor"}},"typeVersion":2.2},{"id":"3ed48f87-8135-46a2-ba20-e350d2e81046","name":"Prepare Court summon Mail and Letter HTML","type":"n8n-nodes-base.set","position":[848,112],"parameters":{"options":{},"assignments":{"assignments":[{"id":"393b8e7b-fc27-4d99-bd11-152e16609e25","name":"Message Content","type":"string","value":"=<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <style>\n    body { font-family: Arial, Helvetica, sans-serif; line-height: 1.6; color: #333333; margin: 0; padding: 0; background-color: #ffffff; }\n    .container { max-width: 650px; margin: 0 auto; padding: 40px 30px; border: 1px solid #1976d2; }\n    .header { border-bottom: 3px solid #1976d2; padding-bottom: 20px; margin-bottom: 30px; }\n    .company-name { font-size: 24px; font-weight: bold; color: #1976d2; margin: 0 0 5px 0; }\n    .company-tagline { font-size: 14px; color: #666666; margin: 0; text-transform: uppercase; letter-spacing: 1px; }\n    h1 { color: #1976d2; font-size: 22px; margin: 0 0 20px 0; text-align: center; border: 2px solid #1976d2; padding: 10px; }\n    .notice-box { background-color: #e3f2fd; border-left: 4px solid #1976d2; padding: 15px 20px; margin: 25px 0; }\n    .notice-box p { margin: 5px 0; font-size: 15px; font-weight: bold; }\n    .invoice-details { background-color: #f5f5f5; padding: 20px; border-radius: 5px; margin: 25px 0; }\n    .invoice-details table { width: 100%; border-collapse: collapse; }\n    .invoice-details td { padding: 8px 0; font-size: 15px; }\n    .invoice-details td:first-child { color: #666666; width: 45%; }\n    .invoice-details td:last-child { font-weight: bold; text-align: right; }\n    .amount-due { font-size: 20px; color: #1976d2; }\n    .footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #e0e0e0; font-size: 11px; color: #999999; text-align: justify; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <p class=\"company-name\">{{$('Your Company Details').first().json['Company Name']}}</p>\n      <p class=\"company-tagline\">Official Litigation Notice</p>\n    </div>\n\n    <h1>NOTICE OF COMMENCEMENT OF LEGAL PROCEEDINGS</h1>\n    <p><strong>TO THE DEFENDANT:</strong> {{$json['Name (from Invoice Clients)']}}</p>\n    \n    <p>You are hereby notified that a legal claim has been prepared for filing in the Civil Court against you. This action follows your failure to satisfy the debt associated with the following records:</p>\n\n    <div class=\"notice-box\">\n      <p>CASE REF: LIT-{{$json.Invoice['Invoice Id']}}</p>\n      <p>STATUS: AWAITING COURT FILING / JUDICIAL REVIEW</p>\n    </div>\n\n    <div class=\"invoice-details\">\n      <table>\n        <tr><td>Claimant:</td><td>{{$('Your Company Details').first().json['Company Name']}}</td></tr>\n        <tr><td>Debt Reference:</td><td>#{{$json.Invoice['Invoice Id']}}</td></tr>\n        <tr style=\"border-top: 2px solid #dddddd;\">\n          <td style=\"padding-top: 15px;\">Principal Claim Amount:</td>\n          <td class=\"amount-due\" style=\"padding-top: 15px;\">{{$json.Invoice.Amount}} PLN</td>\n        </tr>\n      </table>\n    </div>\n\n    <p>Please be advised that once this matter is registered with the Court, you may be liable for additional costs, including court filing fees and statutory interest, which will significantly increase the total amount owed.</p>\n\n    <p><strong>RESOLUTION:</strong> To prevent the formal registration of this lawsuit, full payment must be received within 48 hours. Use the bank details provided in previous correspondence.</p>\n\n    <p>Best regards,<br><strong>Legal Department</strong></p>\n\n    <div class=\"footer\">\n      <p><strong>LEGAL DISCLAIMER:</strong> This email serves as an official notification of legal action. If you have already settled this debt, please provide a stamped bank confirmation immediately to stay the proceedings. Failure to respond will result in the entry of a default judgment where applicable.</p>\n    </div>\n  </div>\n</body>\n</html>"},{"id":"160ee970-1929-459c-8c95-13d5ca128557","name":"=Email Subject","type":"string","value":"=Entering Legal route over invoice  {{ $json.Invoice[\"Invoice Id\"] }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"9e024b59-a5af-461b-ae98-7b98d11d692d","name":"Prepare Pre-trial summon Mail and Letter HTML","type":"n8n-nodes-base.set","position":[848,-80],"parameters":{"options":{},"assignments":{"assignments":[{"id":"393b8e7b-fc27-4d99-bd11-152e16609e25","name":"Message Content","type":"string","value":"=<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <style>\n    body { font-family: Arial, Helvetica, sans-serif; line-height: 1.6; color: #333333; margin: 0; padding: 0; background-color: #ffffff; }\n    .container { max-width: 650px; margin: 0 auto; padding: 40px 30px; }\n    .header { border-bottom: 3px solid #d32f2f; padding-bottom: 20px; margin-bottom: 30px; } /* Changed to Red for Warning */\n    .company-name { font-size: 24px; font-weight: bold; color: #d32f2f; margin: 0 0 5px 0; }\n    .company-tagline { font-size: 14px; color: #666666; margin: 0; }\n    h1 { color: #d32f2f; font-size: 22px; margin: 0 0 20px 0; text-transform: uppercase; }\n    .notice-box { background-color: #ffebee; border-left: 4px solid #d32f2f; padding: 15px 20px; margin: 25px 0; }\n    .notice-box p { margin: 5px 0; font-size: 15px; font-weight: bold; color: #b71c1c; }\n    .invoice-details { background-color: #f5f5f5; padding: 20px; border-radius: 5px; margin: 25px 0; }\n    .invoice-details table { width: 100%; border-collapse: collapse; }\n    .invoice-details td { padding: 8px 0; font-size: 15px; }\n    .invoice-details td:first-child { color: #666666; width: 45%; }\n    .invoice-details td:last-child { font-weight: bold; text-align: right; }\n    .amount-due { font-size: 20px; color: #d32f2f; }\n    .payment-section { background-color: #f5f5f5; border-left: 4px solid #333333; padding: 20px; margin: 25px 0; }\n    .payment-section h2 { color: #333333; font-size: 18px; margin: 0 0 15px 0; }\n    .payment-details { font-size: 14px; line-height: 1.8; }\n    .payment-details strong { display: inline-block; width: 140px; color: #666666; }\n    .footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #e0e0e0; font-size: 13px; color: #666666; text-align: center; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <p class=\"company-name\">{{$('Your Company Details').first().json['Company Name']}}</p>\n      <p class=\"company-tagline\">Legal & Debt Recovery Department</p>\n    </div>\n\n    <h1>Pre-Trial Summons: Final Demand for Payment</h1>\n    <p>Dear {{$json['Name (from Invoice Clients)']}},</p>\n    <p>This is a <strong>formal pre-trial summons</strong> regarding your outstanding debt. Despite previous reminders, your account remains unpaid.</p>\n\n    <div class=\"notice-box\">\n      <p>FINAL WARNING: Invoice #{{$json.Invoice['Invoice Id']}} is severely overdue.</p>\n      <p>Failure to settle this debt within 7 days will result in immediate legal action.</p>\n    </div>\n\n    <div class=\"invoice-details\">\n      <table>\n        <tr><td>Invoice Number:</td><td>{{$json.Invoice['Invoice Id']}}</td></tr>\n        <tr><td>Original Due Date:</td><td>{{$json.Invoice['Due Date']}}</td></tr>\n        <tr style=\"border-top: 2px solid #dddddd;\">\n          <td style=\"padding-top: 15px;\">Total Outstanding Amount:</td>\n          <td class=\"amount-due\" style=\"padding-top: 15px;\">{{$json.Invoice.Amount}} PLN</td>\n        </tr>\n      </table>\n    </div>\n\n    <div class=\"payment-section\">\n      <h2>⚖️ Legal Consequences</h2>\n      <p style=\"font-size: 14px;\">If payment is not received, we will initiate litigation which may include:\n      <br>• Filing a claim in the Civil Court\n      <br>• Recovery of all legal fees and court costs from your assets\n      <br>• Statutory interest for late payment</p>\n    </div>\n\n    <div class=\"payment-section\">\n      <h2>💳 Immediate Settlement Details</h2>\n      <div class=\"payment-details\">\n        <p><strong>Bank Name:</strong> {{$('Your Company Details').first().json['Bank Name']}}</p>\n        <p><strong>Account Number:</strong> {{$('Your Company Details').first().json['Bank Account Number']}}</p>\n        <p><strong>Payment Reference:</strong> SETTLEMENT-{{$json.Invoice['Invoice Id']}}</p>\n      </div>\n    </div>\n\n    <p>To halt this process, please send proof of transfer to <strong>{{$('Your Company Details').first().json['Email']}}</strong> immediately.</p>\n\n    <div class=\"footer\">\n      <p>{{$('Your Company Details').first().json['Company Name']}} | Legal Notice</p>\n      <p>This document constitutes a formal notice of intent to sue.</p>\n    </div>\n  </div>\n</body>\n</html>"},{"id":"160ee970-1929-459c-8c95-13d5ca128557","name":"=Email Subject","type":"string","value":"=Will to enter legal route over invoice {{ $json.Invoice[\"Invoice Id\"] }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"645703d0-3ba6-400c-9d4f-6c402796656a","name":"Send a message","type":"n8n-nodes-base.slack","position":[1856,-80],"webhookId":"9c7c8cb9-9162-4f2e-b27b-9b8fe7b3fa19","parameters":{"select":"channel","blocksUi":"={\n\t\"blocks\": [\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\"text\": \"Message: {{ $('Combine all inputs').item.json['Email Subject'] }}\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"fields\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Invoice No:*\\n{{$(\"Combine all inputs\").item.json.Invoice[\"Invoice Id\"]}}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Overdue:*\\n{{$now.diffTo($(\"Combine all inputs\").item.json.Invoice[\"Due Date\"].toDateTime(), 'days').floor()}} days\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Contractor:*\\n{{$(\"Combine all inputs\").item.json.Client[\"Name\"]}}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Payment Deadline:*\\n{{$(\"Combine all inputs\").item.json.Invoice[\"Due Date\"]}}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Amount:*\\n{{$(\"Combine all inputs\").item.json.Invoice[\"Amount\"]}} PLN\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Issue Date:*\\n{{$(\"Combine all inputs\").item.json.Invoice[\"Issue Date\"]}}\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","channelId":{"__rl":true,"mode":"list","value":"C0AEYD2PSLT","cachedResultName":"overdue-invoice-vindication"},"messageType":"block","otherOptions":{},"authentication":"oAuth2"},"credentials":{"slackOAuth2Api":{"id":"IvZCxNWZUk2WLNfY","name":"N8N Connector Kazor"}},"typeVersion":2.4},{"id":"d9a18d1e-8a60-4569-8fd4-9080edba120b","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2784,-688],"parameters":{"width":640,"height":800,"content":"## Automatic vindication of overdue or incoming invoices\n\n### How it works\n\nThis workflow automates sending reminders about invoices that due date is comming soon.\nIts using [PostGrid](https://www.postgrid.com) for traditional mail, [NocoDB](https://nocodb.com) for storing information about invoices and Gmail for sending E-mails, as well as Slack for notifying user (you!) about notifications that has been sent. \n\n### Set up\n\n- Fill out \"Config\" node containing all time spans when each type of notification should be sent\n- Fill out \"Your Company Details\" node containing information about your company. It will be used in E-mail/letter templates as well as used in API call to PostGrid.\n- Prepare auth for \"Send Letter using PostGrid API\" node.\n  - Use \"Custom Auth\" and paste:\n```\n{\n\t\"headers\": {\n\t\t\"x-api-key\": \"<Your API Key>\"\n\t}\n}\n```\n\n### Customize\n\nIf you already have tables \"Clients\" or \"Invoices\" in NocoDB, you can use different names. In order to do that, you must edit:\n1. JSON Body in \"Create NocoDB Invoices Table\" and \"Create NocoDB Clients Table\" nodes\n2. Row ID Value in \"Get client row\" node\n\n\nNeed help? Contact us at developers@sailingbyte.com\n\nHappy hacking!"},"typeVersion":1},{"id":"e9a38ad4-efbc-4e2c-9581-a69f30ad9bb4","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-2128,-160],"parameters":{"color":7,"width":368,"height":272,"content":"## Run daily"},"typeVersion":1},{"id":"212f0a0b-4219-49fd-a92a-7def9baab96c","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1744,-544],"parameters":{"color":3,"width":784,"height":656,"content":"## Fill out configs\n\"Config\" node describes when notifications should be sent as well if autmation should send Email, letter, or both.\n\n\"Your Company Details\" node is necessary for contents of both Email and letter. Make sure that provided data is correct"},"typeVersion":1},{"id":"9ffea25d-8e29-4405-95e0-e850c447dadc","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-2128,128],"parameters":{"color":3,"width":368,"height":752,"content":"## Set up NocoDB Tables first!\nThis short 'script' will create necessary tables inside NocoDB for you. One thing less to worry about. Make sure you don't have table called `Clients` or `Invoices`"},"typeVersion":1},{"id":"50012954-a527-4a59-bb8c-ecc23ea5c8fe","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-944,-544],"parameters":{"color":7,"width":912,"height":896,"content":"## Step 1: Fetch invoices and client info from NocoDB\nIn this step we fetch invoice data from NocoDB, then we find matching client for each invoice and merge both together"},"typeVersion":1},{"id":"a154b8ce-c28d-448e-bba9-5d2f4154f9c8","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-16,-544],"parameters":{"color":7,"width":672,"height":896,"content":"## Step 2: Filter out invoices we don't care about\nWe filter out invoices based on couple values like:\n- Invoice Status - Must not be \"Paid\"\n- Payment Date - Must not be specified\n- Due Date - Combined with config we check if date in the invoice is today or later\n\nThen we split remaining invoices into 3 groups:\n- Today/Incoming - These will result in reminder to pay\n- For warning - These will result in a message about will to enter legal route\n- For legal notice - These will result in a message about fact that we entered legal route"},"typeVersion":1},{"id":"81e7881d-bb84-4ca0-9970-6bd900337c59","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[672,-544],"parameters":{"color":7,"width":624,"height":896,"content":"## Step 3: Prepare Email / Letter contents\nIn this step you can paste your own HTML and use data from previous nodes to customize it.\n\nEmail Subject is used not only in Email, but also in Slack Notification. This will make it easier to know what given notification really is about\n\nAt the end we combine all 3 inputs into one. It server only aesthetic purpose (increases readability)"},"typeVersion":1},{"id":"3f779fb6-ba72-4c2d-a83b-d141407e4d6b","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[1312,-544],"parameters":{"color":7,"width":688,"height":896,"content":"## Step 4: Send a notification\nIn this step we send notification to the client, and notification to Slack channel about it so that we can keep track of what invoices has been processed"},"typeVersion":1}],"pinData":{},"connections":{"Config":{"main":[[{"node":"Your Company Details","type":"main","index":0}]]},"Run daily":{"main":[[{"node":"Config","type":"main","index":0}]]},"Send Email?":{"main":[[{"node":"Send an Email","type":"main","index":0}]]},"Get Invoices":{"main":[[{"node":"Get client info for invoice","type":"main","index":0}]]},"Send Letter?":{"main":[[{"node":"Send Letter using PostGrid API","type":"main","index":0}]]},"Create Tables":{"main":[[{"node":"NocoDB Config","type":"main","index":0}]]},"NocoDB Config":{"main":[[{"node":"Create NocoDB Invoices Table","type":"main","index":0}]]},"Send an Email":{"main":[[{"node":"Send a message","type":"main","index":0}]]},"Get client row":{"main":[[{"node":"Add client info to invoice","type":"main","index":0}]]},"Combine all inputs":{"main":[[{"node":"Send Letter?","type":"main","index":0},{"node":"Send Email?","type":"main","index":0}]]},"Your Company Details":{"main":[[{"node":"Get Invoices","type":"main","index":0}]]},"Get only unpaid invoices":{"main":[[{"node":"Get todays / upcoming invoices","type":"main","index":0},{"node":"Get overdue invoices for warning","type":"main","index":0},{"node":"Get overdue invoices for Legal notice","type":"main","index":0}]]},"Add client info to invoice":{"main":[[{"node":"Get client info for invoice","type":"main","index":0}]]},"Create NocoDB Clients Table":{"main":[[{"node":"Create relation between tables","type":"main","index":0}]]},"Get client info for invoice":{"main":[[{"node":"Get only unpaid invoices","type":"main","index":0}],[{"node":"Get client row","type":"main","index":0}]]},"Create NocoDB Invoices Table":{"main":[[{"node":"Create NocoDB Clients Table","type":"main","index":0}]]},"Create relation between tables":{"main":[[]]},"Get todays / upcoming invoices":{"main":[[{"node":"Prepare Reminder Mail and Letter HTML","type":"main","index":0}]]},"Send Letter using PostGrid API":{"main":[[{"node":"Send a message","type":"main","index":0}]]},"Get overdue invoices for warning":{"main":[[{"node":"Prepare Pre-trial summon Mail and Letter HTML","type":"main","index":0}]]},"Get overdue invoices for Legal notice":{"main":[[{"node":"Prepare Court summon Mail and Letter HTML","type":"main","index":0}]]},"Prepare Reminder Mail and Letter HTML":{"main":[[{"node":"Combine all inputs","type":"main","index":0}]]},"Prepare Court summon Mail and Letter HTML":{"main":[[{"node":"Combine all inputs","type":"main","index":0}]]},"Prepare Pre-trial summon Mail and Letter HTML":{"main":[[{"node":"Combine all inputs","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":33,"nodeTypes":{"n8n-nodes-base.if":{"count":2},"n8n-nodes-base.set":{"count":8},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.slack":{"count":1},"n8n-nodes-base.filter":{"count":4},"n8n-nodes-base.nocoDb":{"count":2},"n8n-nodes-base.stickyNote":{"count":8},"n8n-nodes-base.httpRequest":{"count":4},"n8n-nodes-base.manualTrigger":{"count":1},"n8n-nodes-base.splitInBatches":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Łukasz","username":"lukaszpp","bio":"Developer, automation architect and CTO/CEO helping businesses turn complex processes into scalable systems. I build smart automations and SaaS solutions for Real Estate, advertising, logistics and more.\n\nMy focus is to remove manual work, increase efficiency, and create measurable business impact.\n\nI support founders and decision-makers in turning ideas into structured, automated operations.\n\nLet’s connect 🤝","verified":true,"links":["https://sailingbyte.com"],"avatar":"https://gravatar.com/avatar/aae1a29225cc13556a92db7f75050da4bb664bf68e1d73407da6c9cd5a7a9a8a?r=pg&d=retro&size=200"},"nodes":[{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":39,"icon":"fa:sync","name":"n8n-nodes-base.splitInBatches","codex":{"data":{"alias":["Loop","Concatenate","Batch","Split","Split In Batches"],"resources":{"generic":[{"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/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"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Loop Over Items","color":"#007755"},"iconData":{"icon":"sync","type":"icon"},"displayName":"Loop Over Items (Split in Batches)","typeVersion":3,"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":510,"icon":"file:nocodb.svg","name":"n8n-nodes-base.nocoDb","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.nocodb/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/nocodb/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"NocoDB"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiBmaWxsPSJub25lIj48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzNENDNENSIgcng9IjI1Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTM4IDkzLjkwNyAyOS43NiAyOS4wMDZ2NDUuOTJIMzh6bTEyNS02MS42NjV2MTI1LjQxN2MwIDguMDc4LTQuNDk4IDExLjM0MS0xMS43NDIgMTEuMzQxLTEuMzMzIDAtMy43MjUtLjUwMS01Ljc5My0yLjUwMkwzOCA2NS4zMjhWNDIuODRDMzggMzQuNzYzIDQxLjM2MyAzMS41IDQ5LjcyMyAzMS41YzEuMzMzIDAgNC4wMS41MiA2LjA2IDIuNTAybDc3LjQzOCA3MS45MjNWMzIuMjQyeiIvPjwvc3ZnPg=="},"displayName":"NocoDB","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"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":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"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":844,"icon":"fa:filter","name":"n8n-nodes-base.filter","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The Filter node can be used to filter items based on a condition. If the condition is met, the item will be passed on to the next node. If the condition is not met, the item will be omitted. Conditions can be combined together by AND(meet all conditions), or OR(meet at least one condition).","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Filter","color":"#229eff"},"iconData":{"icon":"filter","type":"icon"},"displayName":"Filter","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":34,"name":"Invoice Processing"}],"image":[{"id":5150,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_89126d63f4.png"},{"id":5151,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_56ab6a9ccd.png"},{"id":5152,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_d9a32e0c18.png"},{"id":5153,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_5208cbd455.png"},{"id":5154,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_631b895ca1.png"},{"id":5155,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_9af30e825c.png"},{"id":5156,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_320319460d.png"},{"id":5269,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_2cad25a69c.png"},{"id":5270,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_70a5f0e8e5.png"},{"id":5271,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_4ab3264f0c.png"},{"id":5272,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_940474d6a8.png"},{"id":5273,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_52bc656cdc.png"},{"id":5274,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_91990eb6c2.png"},{"id":5275,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_c7ffecbf18.png"},{"id":5276,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_6e58b2663e.png"},{"id":5277,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_bdf5713e56.png"},{"id":5278,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_de5b6b01c9.png"},{"id":5279,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/image_900c596dbf.png"},{"id":5280,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Pasted_image_20260330194132_4deb413fe3.png"},{"id":5281,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Pasted_image_20260330194209_79b7de5bc0.png"},{"id":5282,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Pasted_image_20260330194158_8b4782ee56.png"},{"id":5283,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Pasted_image_20260330194147_cfc5457327.png"},{"id":5284,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Pasted_image_20260330193836_40d3699acf.png"},{"id":5285,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Pasted_image_20260330193825_69d9153677.png"},{"id":5286,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Pasted_image_20260330193909_428d84dba6.png"}]}}