Skip to main content
Business February 13, 2026 12 min read

Automating Billing and Accounting with n8n: A Practical Guide for Small Businesses

Learn how to automate your billing and accounting with n8n. Complete guide for small businesses: configuration, workflows, and practical integrations.

M
Mohamed Boukri

Introduction: Why Automate Billing for Small Businesses?

As a small business owner, I know you probably spend 30% of your time on repetitive administrative tasks. Creating invoices, following up on overdue payments, entering accounting records: these manual processes waste precious time you could dedicate to growing your business.

Human errors in billing are costly: forgotten taxes, duplicates, delayed follow-ups. I regularly work with small businesses that discover unsent invoices or unrecorded payments months later.

n8n solves these problems with a no-code approach. This automation platform lets you create visual workflows that connect your business tools. No development needed: you drag and drop nodes to automate your processes.

The benefits are immediate: save 15-20 hours per week, reduce data entry errors by 90%, improve customer payment times.

Prerequisites and Basic Setup

To get started, you need n8n. I recommend Docker installation for small businesses that want to maintain control of their data:

Terminal window
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n

For business tools, you’ll need to connect:

  • Your billing software (Stripe, PayPal, or solutions like FreshBooks)
  • Your accounting system (QuickBooks, Xero, or Sage)
  • Your bank (Open Banking API or automatic export)
  • Your email (Gmail, Outlook)
Get your API keys before starting. Each service has its specific authentication procedure.

The n8n interface works through workflows: chains of nodes that execute sequential actions. Each node receives data, transforms it, and passes it to the next one.

Creating Your First Workflow: From Order to Invoice

Let’s start by automating invoice creation. The trigger will be an order received via web form.

Create a new workflow and add a Webhook node. Configure the reception URL:

{
"httpMethod": "POST",
"path": "new-order",
"responseMode": "onReceived"
}

Add a Set node to format the received data:

// In the Set node, configure these fields
return [
{
json: {
client_name: $json.body.name,
client_email: $json.body.email,
products: $json.body.items,
net_amount: $json.body.total_net,
tax: $json.body.total_net * 0.20,
invoice_number: "INV-" + new Date().getFullYear() + "-" + Date.now()
}
}
];

Connect an HTTP Request node configured for your billing API. For Stripe, the configuration looks like:

{
"method": "POST",
"url": "https://api.stripe.com/v1/invoices",
"authentication": "headerAuth",
"headers": {
"Authorization": "Bearer {{$credentials.stripeApi.accessToken}}"
},
"body": {
"customer": "{{$json.client_email}}",
"amount": "{{$json.net_amount + $json.tax}}"
}
}

Finish with a Gmail node for automatic sending:

Subject: Invoice {{$json.invoice_number}}
Hello {{$json.client_name}},
Please find attached your invoice for €{{$json.net_amount + $json.tax}}.
Best regards,
Mohamed Boukri
Key Takeaway
An n8n workflow transforms an order into a sent invoice in less than 30 seconds, without human intervention.

Test your workflow with dummy data. The “Execute Workflow” button simulates an order and shows you the result at each step.

Automating Payment Tracking and Follow-ups

Automatic follow-ups drastically improve your payment times. Create a new workflow with a Cron trigger that runs daily:

0 9 * * *

Add an HTTP Request node to retrieve unpaid invoices from your billing software. Then an IF node to test follow-up conditions:

// Condition: invoice overdue for more than 7 days
const due_date = new Date($json.due_date);
const today = new Date();
const days_overdue = Math.floor((today - due_date) / (1000 * 60 * 60 * 24));
return days_overdue > 7;

Create three branches based on delay:

  • 7-15 days: friendly reminder
  • 15-30 days: second notice
  • 30+ days: final notice

Each branch uses a different email template in a Gmail node. For the friendly reminder:

Subject: Payment reminder — Invoice {{$json.invoice_number}}
Hello {{$json.client_name}},
Your invoice {{$json.invoice_number}} for €{{$json.total_amount}}
is {{$json.days_overdue}} days past due.
Could you please arrange payment at your earliest convenience?
Integrate your bank via Open Banking API to automatically check received payments before sending reminders.

For complex cases (disputes, partial payments), add a Slack node that notifies you rather than sending an automatic reminder.

Automatic Synchronization with Accounting

Accounting synchronization eliminates duplicate entries and ensures data consistency. Create a workflow triggered by each new paid invoice.

Configure a Webhook node that receives payment notifications from your processor (Stripe, PayPal). Add a Set node to map data to your accounting format:

return [
{
json: {
debit_account: "1200", // Accounts Receivable
credit_account: "4000", // Sales Revenue
net_amount: $json.amount / 1.20,
tax_amount: $json.amount - ($json.amount / 1.20),
tax_account: "2300", // VAT / Sales Tax Collected
operation_date: new Date().toISOString().split('T')[0],
description: "Invoice " + $json.invoice_number
}
}
];

Connect your accounting software via its API. For Xero, use an HTTP Request node:

{
"method": "POST",
"url": "https://api.xero.com/api.xro/2.0/Invoices",
"headers": {
"Authorization": "Bearer {{$credentials.xeroApi.token}}",
"Content-Type": "application/json"
},
"body": {
"entries": [
{
"account": "{{$json.debit_account}}",
"debit": "{{$json.net_amount + $json.tax_amount}}"
},
{
"account": "{{$json.credit_account}}",
"credit": "{{$json.net_amount}}"
},
{
"account": "{{$json.tax_account}}",
"credit": "{{$json.tax_amount}}"
}
]
}
}
Verify your chart of accounts before going live. A numbering error can distort your entire accounting.

For bank reconciliation, create a workflow that automatically compares received transfers with pending invoices. A simple IF checks amount/customer reference matching.

Automated Reporting and Dashboards

Automated reports give you real-time visibility into your business. I recommend a weekly workflow that generates your essential KPIs.

Configure a Cron trigger for Monday morning:

0 8 * * 1

Add several HTTP Request nodes to collect data:

  • Weekly revenue
  • Outstanding invoices
  • New customers
  • Average payment time

Use a Spreadsheet File node to create an Excel table:

const data = [
['Indicator', 'Value', 'Change'],
['Weekly revenue', '$' + $json.weekly_revenue, $json.revenue_change + '%'],
['Outstanding', '$' + $json.outstanding_amount, ''],
['New customers', $json.new_clients, ''],
['Payment time', $json.avg_payment_days + ' days', $json.payment_time_change + '%']
];
return [{ binary: { data: createExcelFile(data) } }];

Finish with a Gmail node that sends the report to your inbox. For advanced analytics, connect Google Sheets directly with a dedicated node.

Create specific alerts: revenue drop > 20%, outstanding > $10K, new large customer. An IF node triggers immediate Slack notification.

Visual dashboards work well with tools like Grafana connected to your n8n database.

Error Handling and System Optimization

A robust system anticipates failures. First configure error notifications in n8n global settings:

{
"errorWorkflow": "error-handling-workflow",
"saveDataErrorExecution": "all",
"saveDataSuccessExecution": "all"
}

Create a dedicated error workflow that receives failures from other workflows. Use a Switch node to handle different error types:

// Based on error type
switch($json.error.type) {
case 'API_TIMEOUT':
return 0; // Automatic retry
case 'AUTH_FAILED':
return 1; // Admin alert
case 'DATA_INVALID':
return 2; // Log and ignore
default:
return 3; // Unknown error
}

For automatic retries, add this configuration to your critical nodes:

{
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 1000
}
Back up your workflows regularly. n8n offers JSON export of all your workflows via the admin interface.

For security, encrypt your sensitive credentials and use environment variables for API tokens. Enable two-factor authentication on your n8n instance.

Monitor performance with built-in monitoring. If your workflows slow down, optimize by parallelizing independent tasks or reducing trigger frequency.

Conclusion and Future Developments

Automating your billing with n8n saves you 15-20 hours per week while eliminating 90% of data entry errors. Your payment times improve through automatic follow-ups, and you finally have real-time visibility into your cash flow.

Logical next steps include integrating your CRM to automate the complete sales cycle, automating purchase and supplier management, or creating multi-level validation workflows for large amounts.

To maintain your system, plan quarterly workflow reviews. APIs evolve, your business processes too. Document your changes and test regularly in a development environment.

Need help? At Kodixar, I help businesses automate their business processes with n8n. From initial audit to production deployment, I help you identify and automate your time-consuming tasks.

Available for new projects

Need help with this topic?

Contact us to discuss your project and see how we can help.

Free quote
No commitment
24h response