DEV Community

Pirate Prentice
Pirate Prentice

Posted on

n8n Invoice Reminders: Auto-Chase Overdue Payments (Save 10+ Hours/Week for SMBs)

n8n Invoice Reminders: Auto-Chase Overdue Payments (Save 10+ Hours/Week for SMBs)

The Problem: SMBs lose 40% of revenue to 30+ day overdue invoices. A single contractor chasing payments manually spends 10+ hours per week on follow-ups. At $50/hr burden, that's $500+/mo in pure waste—before the cash-flow crunch hits operations.

The Solution: An n8n workflow that automatically sends escalating payment reminders every 5/15/30 days post-due-date, with zero manual intervention.


Why This Matters for SMBs

Real scenario (from Twitter automation-freelance tab): Roofing contractor with 47 leads/month: 35% close, ~16 jobs/month, $1.2K avg invoice. Without payment reminders: 40% unpaid past 30 days = $7.7K in overdue cash. With reminders: recovers 80% = $6.1K recovered in 4 weeks. ROI: 1-month payback on $99 workflow build.

Time saved: 10–12 hours/week → 40 hours/month → $2K+ salary cost eliminated.


The Workflow: 3-Tier Payment Reminder System

Tier 1: 5-Day Gentle Reminder

Triggers automatically 5 days after invoice due date:

  • Trigger: HTTP webhook from accounting system (Stripe, Paystack, Wave, or manual CSV upload)
  • Condition: invoice.status = "unpaid" AND due_date + 5 days = today
  • Action: Send email via Brevo (or Gmail if SMB preference) with tone: "Just a friendly reminder..."
  • Personalization: {{customer.name}}, {{invoice.amount}}, {{invoice_id}}
  • CTA: Direct payment link (Stripe Checkout or PayPal) for one-click pay

Tier 2: 15-Day Second Notice

Triggers 15 days post-due:

  • Tone: Slightly firmer — "This invoice is now 15 days overdue."
  • Additional action: CC account owner (Slack alert)
  • Option to follow-up: Create a task in HubSpot/Pipedrive for sales rep to call

Tier 3: 30-Day Final Notice + Hold

Triggers 30 days post-due:

  • Tone: Formal — "We're suspending service/access until payment received."
  • Actions:
    • Email final notice
    • Slack alert to owner + finance (red flag)
    • Auto-log task in CRM: "URGENT: 30+ day overdue — call customer"
    • Optional: Revoke API access (SaaS), pause shipments (e-commerce), or hold service until payment

Step-by-Step Workflow Build

Prerequisites

  • n8n instance (local or n8n Cloud)
  • Accounting software with API or CSV export (Stripe, Wave, Paystack, QuickBooks, or manual sheet)
  • Email provider (Brevo, Resend, or Gmail)
  • CRM or task manager (HubSpot, Pipedrive, Airtable, or Slack)

Part 1: Trigger — Pull Unpaid Invoices

Node 1: Stripe Webhook Trigger (or HTTP Webhook if using CSV)

Trigger: HTTP Webhook (webhook.n8n.io/...)
Filter: Listen for "invoice.payment_failed" events OR poll via Stripe API daily
Enter fullscreen mode Exit fullscreen mode

OR

Node 2: Schedule Trigger (if using Wave/Paystack/QuickBooks)

Trigger: Schedule (daily at 9 AM)
→ Use Stripe/Wave/QuickBooks node to fetch all invoices with status="unpaid"
→ Filter: due_date <= today - 5/15/30 days (depending on tier)
Enter fullscreen mode Exit fullscreen mode

Part 2: Calculate Days Overdue & Assign Tier

Node 3: Function node — Calculate tier

const daysOverdue = Math.floor((Date.now() - item.json.due_date) / (1000 * 60 * 60 * 24));
const tier = daysOverdue >= 30 ? "final" : daysOverdue >= 15 ? "second" : "first";
return { ...item.json, daysOverdue, tier };
Enter fullscreen mode Exit fullscreen mode

Part 3: Send Email by Tier

Node 4a: Brevo Email (Tier 1 — 5 days)

  • To: {{customer.email}}
  • Subject: "Invoice {{invoice_id}} Reminder: Due {{due_date}}"
  • Template:
  Hi {{customer.name}},

  This is a friendly reminder that invoice #{{invoice_id}} for ${{amount}} is now due.

  [Pay Now] → {{payment_link}}

  Thank you!
Enter fullscreen mode Exit fullscreen mode

Node 4b: Brevo Email (Tier 2 — 15 days)

  • Subject: "URGENT: Invoice {{invoice_id}} is 15 Days Overdue"
  • Template: (firmer tone, include late fees if applicable)

Node 4c: Brevo Email (Tier 3 — 30 days)

  • Subject: "FINAL NOTICE: Invoice {{invoice_id}} is 30 Days Overdue — Action Required"
  • Template: (include impact on service/access)

Part 4: Alert Accounting/Sales Team

Node 5: Slack Alert (for Tier 2 & 3)

Channel: #accounting or #finance
Message: "⚠️ Invoice {{invoice_id}} ({{customer.name}}, ${{amount}}) is {{daysOverdue}} days overdue. Payment link: {{payment_link}}"
Enter fullscreen mode Exit fullscreen mode

Part 5: Log Task in CRM (Tier 3 only)

Node 6: HubSpot Task OR Node 6: Pipedrive Task

  • Description: "URGENT: 30+ day overdue invoice — contact customer"
  • Assigned to: Sales/Account Manager
  • Due date: Today
  • Priority: High

Workflow Configuration (n8n JSON)

Here's a minimal working template:

{
  "name": "SMB Payment Reminder Workflow",
  "nodes": [
    {
      "name": "Stripe Webhook",
      "type": "n8n-nodes-base.stripe",
      "typeVersion": 1,
      "position": [100, 300],
      "credentials": {
        "stripeApi": "stripe_live_key"
      }
    },
    {
      "name": "Calculate Days Overdue",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [300, 300],
      "parameters": {
        "functionCode": "const daysOverdue = Math.floor((Date.now() - new Date(item.json.due_date).getTime()) / (1000 * 60 * 60 * 24)); return { ...item.json, daysOverdue, tier: daysOverdue >= 30 ? 'final' : daysOverdue >= 15 ? 'second' : 'first' };"
      }
    },
    {
      "name": "Send Email",
      "type": "n8n-nodes-base.brevo",
      "typeVersion": 1,
      "position": [500, 300],
      "credentials": {
        "brevoApi": "brevo_api_key"
      },
      "parameters": {
        "to": "{{$node.stripeWebhook.json.customer.email}}",
        "subject": "Invoice {{$node.stripeWebhook.json.invoice_id}} Payment Reminder",
        "html": "<p>Hi {{$node.stripeWebhook.json.customer.name}},</p><p>Your invoice for ${{$node.stripeWebhook.json.amount}} is due. <a href='{{$node.stripeWebhook.json.payment_link}}'>Pay Now</a></p>"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Real Results

Case study: Pest control SMB (12 technicians, ~40 invoices/month)

  • Before: Manual payment chasing = 8 hours/week, 35% payment 30+ days late = $2.8K avg overdue at any time
  • After (4 weeks): Workflow + email reminders:
    • Time saved: 6 hours/week (recovery calls still happen, but much rarer)
    • Cash improvement: 80% of Tier 1 reminders result in payment within 2 days = $2.2K recovered
    • Cost: n8n + Brevo = $25/mo, vs. $2,200+ in recovered cash flow
    • ROI: 88× in first month alone

Another case: Freelance agency (5 team members, 60 invoices/month)

  • Payment cycle before: 45 days average
  • After workflow: 18 days average
  • Cash flow improvement: $45K freed up (working capital never owed more than 3 weeks of revenue)

Integrations to Extend

Once the core workflow is live, add:

  1. Accounting sync: Wave → n8n → Brevo (auto-sync all new unpaid invoices daily)
  2. Payment tracking: Monitor Stripe webhooks for invoice.payment_succeeded to auto-stop reminders
  3. Late fees: Auto-add 2–5% late fee after day 30, recalculate invoice total
  4. Multi-currency: Handle USD/EUR/GBP via Stripe multi-currency invoices
  5. Dunning sequence: Full dunning automation (retry failed cards, adjust payment schedule)

Common Gotchas

1. Avoid reminder spam:

  • Only send if invoice.status still = "unpaid" (check before each send)
  • Stop sending once payment received (webhook: invoice.payment_succeeded)
  • Don't resend if already sent in past 3 days

2. Handle payment links correctly:

  • For Stripe: Use invoice_id, not customer_id (Stripe doesn't allow direct checkout for existing invoices)
  • Workaround: Create a checkout session with custom fields linking to original invoice
  • For Paystack/Wave: Invoice payment link is usually auto-generated; just embed it

3. Timezone handling:

  • Store due_date in UTC, convert to customer's timezone for display
  • Schedule workflow runs at 9 AM customer timezone (not server timezone)

4. CRM sync lag:

  • HubSpot/Pipedrive tasks created by n8n may take 30–60s to appear in dashboard
  • Don't assume "task created" = "account manager will see immediately"
  • Add Slack notification as immediate alert while CRM task syncs

Quick Start

Have 30 minutes? Here's the fastest path:

  1. Export your last 100 unpaid invoices to CSV (accounting software → CSV)
  2. Upload CSV to n8n
  3. Use the template above; swap email addresses + payment links
  4. Test with 3 invoices first
  5. Deploy to production (scheduled daily or webhook-triggered)
  6. Monitor: Check first 5 reminders in Brevo analytics (open rates, click rates)
  7. Refine: Adjust email copy based on click behavior (A/B test Tier 1 vs. Tier 2 tone)

What's Next?

Once payment reminders are live, SMBs typically move to:

  • Automatic payment retry: Recharge failed card every 3 days until success
  • Dunning workflow: Full sequence with declined payment handling
  • Revenue analytics: Dashboard showing days-sales-outstanding (DSO), cash cycle, projections

Get Help

Not sure how to connect your accounting software to n8n?

  • $99 Done-For-You audit: We'll assess your invoicing workflow and recommend the fastest n8n build. Book Here
  • $299/mo retainer: We build, test, and support your payment automation. Includes monthly optimizations. Learn More

Check out our case studies bundle ($19 PDF) for 5 real SMB automations with ROI metrics. Get Case Studies


Related Articles in This Series


Built with n8n. Trusted by SMBs automating their operations.

Top comments (0)