This workflow corresponds to n8n.io template #14313 — we link there as the canonical source.
This workflow follows the Gmail → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"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": {
"name": "<your credential>"
}
},
"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": {
"name": "<your credential>"
}
},
"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": {
"name": "<your credential>"
}
},
"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>\ud83d\udcb3 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": {
"name": "<your credential>"
}
},
"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": {
"name": "<your credential>"
}
},
"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": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "4fbdfb57-adf5-431b-a792-1e98d5697a79",
"name": "Send an Email",
"type": "n8n-nodes-base.gmail",
"position": [
1648,
16
],
"parameters": {
"sendTo": "={{ $json.Client.Email }}",
"message": "={{ $json[\"Message Content\"] }}",
"options": {},
"subject": "={{ $json[\"Email Subject\"] }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"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>\u2696\ufe0f Legal Consequences</h2>\n <p style=\"font-size: 14px;\">If payment is not received, we will initiate litigation which may include:\n <br>\u2022 Filing a claim in the Civil Court\n <br>\u2022 Recovery of all legal fees and court costs from your assets\n <br>\u2022 Statutory interest for late payment</p>\n </div>\n\n <div class=\"payment-section\">\n <h2>\ud83d\udcb3 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
],
"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": {
"name": "<your credential>"
}
},
"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
}
],
"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
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2httpCustomAuthnocoDbApiTokenslackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This 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…
Source: https://n8n.io/workflows/14313/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow is an end-to-end AI video generation, review, and delivery pipeline. It takes a plain-text creative prompt via webhook, generates a video using an AI model, continuously checks job statu
Stop chasing blurry receipts and manually typing expense data. This workflow creates an intelligent, "snap-and-submit" reimbursement pipeline that hosts photos via UploadToURL, extracts deep data via
Loxone MCP Client - Integration Hub. Uses start, googleCalendar, slack, mcp. Event-driven trigger; 20 nodes.
Automatically transform resume submissions into comprehensive candidate profiles with AI-powered parsing, GitHub analysis, and instant team notifications. Monitors Gmail for incoming resume attachment
Hiring teams often struggle with document follow-ups, offer letter generation, and stakeholder communication. Manual checks, email back-and-forth, and missing files slow down hiring and create chaos d