Billomat API Integration: Automate Accounting with n8n and Make.com
How to connect Billomat with your other business tools.
Billomat is a popular cloud accounting software for freelancers and small businesses in Germany. With the Billomat API, you can automatically create invoices, track payments, and connect your accounting with other systems. In this guide, we show you the most important automations.
Why Automate Billomat?
Typical Manual Tasks:| Task | Manual Effort | Automated |
|---|---|---|
| Create invoice from order | 10 min/invoice | Automatic |
| Send payment reminders | 30 min/week | Automatic |
| Check incoming payments | 20 min/day | Real-time |
| Sync customer data | 5 min/customer | Automatic |
| Prepare month-end closing | 2h/month | 1 click |
Billomat API Basics
Setting Up API Access
API Authentication
// All requests need this header
{
"headers": {
"X-BillomatApiKey": "YOUR_API_KEY",
"Content-Type": "application/json"
}
}
Base URL
https://YOUR_BILLOMAT_ID.billomat.net/api/
Available Endpoints
| Endpoint | Function |
|---|---|
/clients | Manage customers |
/invoices | Invoices |
/offers | Quotes |
/credit-notes | Credit notes |
/recurring | Recurring invoices |
/payments | Payments |
/articles | Articles/Products |
Workflow 1: Automatic Invoice Creation
The Workflow
Shopify/WooCommerce (New Order)
↓
Search/create customer in Billomat
↓
Create invoice
↓
Generate PDF
↓
Send via email
n8n Implementation
Node 1: Webhook from Shop Node 2: Search Customer// Node: HTTP Request
{
"method": "GET",
"url": "https://YOUR_ID.billomat.net/api/clients",
"qs": {
"email": "{{ $json.customer.email }}"
},
"headers": {
"X-BillomatApiKey": "{{ $env.BILLOMAT_API_KEY }}"
}
}
Node 3: Create Customer (if new)
// Node: HTTP Request
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/clients",
"headers": {
"X-BillomatApiKey": "{{ $env.BILLOMAT_API_KEY }}",
"Content-Type": "application/json"
},
"body": {
"client": {
"name": "{{ $json.customer.name }}",
"email": "{{ $json.customer.email }}",
"street": "{{ $json.shipping.address }}",
"zip": "{{ $json.shipping.zip }}",
"city": "{{ $json.shipping.city }}",
"country_code": "US"
}
}
}
Node 4: Create Invoice
// Node: HTTP Request
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/invoices",
"headers": {
"X-BillomatApiKey": "{{ $env.BILLOMAT_API_KEY }}",
"Content-Type": "application/json"
},
"body": {
"invoice": {
"client_id": "{{ $json.clientId }}",
"date": "{{ $now.format('yyyy-MM-dd') }}",
"due_days": 14,
"invoice-items": {
"invoice-item": $json.items.map(item => ({
"title": item.name,
"quantity": item.quantity,
"unit_price": item.price,
"tax_rate": 19
}))
}
}
}
}
Node 5: Finalize & Send Invoice
// Complete invoice
{
"method": "PUT",
"url": "https://YOUR_ID.billomat.net/api/invoices/{{ $json.invoice.id }}/complete",
"headers": { "X-BillomatApiKey": "{{ $env.BILLOMAT_API_KEY }}" }
}
// Send via email
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/invoices/{{ $json.invoice.id }}/email",
"body": {
"email": {
"recipients": { "to": "{{ $json.customer.email }}" },
"subject": "Your Invoice {{ $json.invoice.invoice_number }}",
"body": "Please find your invoice attached..."
}
}
}
Workflow 2: Automatic Dunning
The Workflow
Schedule (daily 9:00 AM)
↓
Billomat: Overdue invoices
↓
For each invoice:
- Check dunning level
- Send appropriate reminder
↓
Report to accounting
Implementation
// Node: HTTP Request - Overdue invoices
{
"method": "GET",
"url": "https://YOUR_ID.billomat.net/api/invoices",
"qs": {
"status": "OPEN",
"due_date_to": "{{ $now.minus(1, 'day').format('yyyy-MM-dd') }}"
}
}
// Node: Code - Determine dunning level
const invoice = $json;
const dueDate = new Date(invoice.due_date);
const today = new Date();
const daysOverdue = Math.floor((today - dueDate) / (1000 <em> 60 </em> 60 * 24));
let dunningLevel, action;
if (daysOverdue <= 7) {
dunningLevel = 1;
action = 'friendly_reminder';
} else if (daysOverdue <= 14) {
dunningLevel = 2;
action = 'first_dunning';
} else if (daysOverdue <= 21) {
dunningLevel = 3;
action = 'second_dunning';
} else {
dunningLevel = 4;
action = 'final_warning';
}
return { dunningLevel, action, daysOverdue };
// Node: Create reminder
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/reminders",
"body": {
"reminder": {
"invoice_id": "{{ $json.invoice.id }}",
"date": "{{ $now.format('yyyy-MM-dd') }}",
"due_days": 7,
"level": {{ $json.dunningLevel }}
}
}
}
Workflow 3: Payment Reconciliation
The Workflow
Bank (new transaction)
↓
Analyze payment reference
↓
Find matching invoice
↓
Record payment in Billomat
↓
Mark invoice as paid
Implementation
// Node: Code - Extract invoice number from reference
const reference = $json.bankTransaction.reference;
// Typical patterns for invoice numbers
const patterns = [
/INV-?\d{4,}/i,
/RE-?\d{4,}/i,
/RG-?\d{4,}/i,
/\d{6,}/ // Fallback: longer numbers
];
let invoiceNumber = null;
for (const pattern of patterns) {
const match = reference.match(pattern);
if (match) {
invoiceNumber = match[0];
break;
}
}
return { invoiceNumber };
// Node: Search invoice
{
"method": "GET",
"url": "https://YOUR_ID.billomat.net/api/invoices",
"qs": {
"invoice_number": "{{ $json.invoiceNumber }}"
}
}
// Node: Record payment
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/incoming-payments",
"body": {
"incoming-payment": {
"invoice_id": "{{ $json.invoice.id }}",
"date": "{{ $json.bankTransaction.date }}",
"amount": {{ $json.bankTransaction.amount }},
"comment": "Automatically matched"
}
}
}
Workflow 4: Recurring Invoices
The Workflow
Schedule (1st of month)
↓
Billomat: Due recurring invoices
↓
Generate invoices
↓
Send
Retrieve Recurring Invoice
// All recurring invoices
{
"method": "GET",
"url": "https://YOUR_ID.billomat.net/api/recurrings"
}
Create Invoice from Template
// Generate invoice from recurring
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/recurrings/{{ $json.recurring.id }}/create"
}
Workflow 5: CRM Synchronization
The Workflow
HubSpot (New deal won)
↓
Create customer in Billomat
↓
Create quote
↓
Convert to invoice
Implementation
// Node: HubSpot Deal Data
// Create customer in Billomat
{
"client": {
"name": "{{ $json.deal.company_name }}",
"email": "{{ $json.deal.contact_email }}",
"note": "HubSpot Deal: {{ $json.deal.id }}"
}
}
// Node: Create quote
{
"offer": {
"client_id": "{{ $json.clientId }}",
"date": "{{ $now.format('yyyy-MM-dd') }}",
"validity": 30,
"offer-items": {
"offer-item": [{
"title": "{{ $json.deal.product_name }}",
"quantity": 1,
"unit_price": {{ $json.deal.amount }}
}]
}
}
}
Make.com Integration
Using HTTP Module
Since Make.com doesn't have a native Billomat module:
Example Scenario
WooCommerce (New Order)
↓
HTTP: Billomat - Search Client
↓
Router:
├─ Client exists → Get ID
└─ Client missing → HTTP: Create Client
↓
HTTP: Create Invoice
↓
HTTP: Complete Invoice
↓
HTTP: Send Invoice Email
Article Management
Sync Articles
// Import articles from shop to Billomat
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/articles",
"body": {
"article": {
"number": "{{ $json.sku }}",
"title": "{{ $json.name }}",
"description": "{{ $json.description }}",
"sales_price": {{ $json.price }},
"tax_rate": 19
}
}
}
Use Articles in Invoices
// Invoice with article reference
{
"invoice-items": {
"invoice-item": [{
"article_id": "{{ $json.articleId }}",
"quantity": 2
}]
}
}
PDF Documents
Retrieve Invoice as PDF
// Get PDF URL
{
"method": "GET",
"url": "https://YOUR_ID.billomat.net/api/invoices/{{ $json.invoiceId }}/pdf"
}
// Response contains PDF URL
// Download via HTTP Request (Binary)
Send PDF via Email
// Via Billomat email function
{
"method": "POST",
"url": "https://YOUR_ID.billomat.net/api/invoices/{{ $json.invoiceId }}/email",
"body": {
"email": {
"recipients": {
"to": "customer@example.com",
"cc": "accounting@company.com"
},
"subject": "Your Invoice No. {{ $json.invoiceNumber }}",
"body": "Dear Sir or Madam,\n\nPlease find your invoice attached.\n\nBest regards",
"attach_pdf": true
}
}
}
Reporting
Revenue Statistics
// Open invoices
{
"method": "GET",
"url": "https://YOUR_ID.billomat.net/api/invoices",
"qs": {
"status": "OPEN"
}
}
// Paid invoices (time period)
{
"method": "GET",
"url": "https://YOUR_ID.billomat.net/api/invoices",
"qs": {
"status": "PAID",
"from": "2024-01-01",
"to": "2024-01-31"
}
}
Automatic Monthly Report
// Node: Code - Calculate statistics
const invoices = $json.invoices.invoice;
const stats = {
total: invoices.length,
paid: invoices.filter(i => i.status === 'PAID').length,
open: invoices.filter(i => i.status === 'OPEN').length,
overdue: invoices.filter(i => i.status === 'OVERDUE').length,
revenue: invoices
.filter(i => i.status === 'PAID')
.reduce((sum, i) => sum + parseFloat(i.total_gross), 0)
};
return stats;
Best Practices
1. Respect Rate Limits
// Maximum 60 requests per minute
// For batch operations: add delays
await wait(1000); // 1 second between requests
2. Error Handling
try {
await createInvoice(data);
} catch (error) {
if (error.status === 401) {
// API key invalid
await alertAdmin('Check Billomat API key!');
} else if (error.status === 422) {
// Validation error
console.log('Error:', error.body.errors);
}
}
3. Idempotency
// Use external reference to avoid duplicates
{
"invoice": {
"client_id": "123",
"number": "SHOP-{{ $json.orderId }}", // Unique
// ...
}
}
Costs
| Component | Cost |
|---|---|
| Billomat | From 6 EUR/month |
| n8n Cloud | From $20/month |
| Make.com | From $9/month |
Conclusion
Billomat automation saves time on:
- Invoice creation from shop systems
- Automatic dunning
- Payment reconciliation
- Reporting
Next Steps
We support you with Billomat automation - from setup to productive use.