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. If you are looking for other accounting tools, also check out our guides on Lexoffice automation and DATEV automation.

Why Automate Billomat?

Typical Manual Tasks:

TaskManual EffortAutomated
Create invoice from order10 min/invoiceAutomatic
Send payment reminders30 min/weekAutomatic
Check incoming payments20 min/dayReal-time
Sync customer data5 min/customerAutomatic
Prepare month-end closing2h/month1 click

Billomat API Basics

Setting Up API Access

  1. Billomat → Settings → Interfaces
  2. Activate API
  3. Generate API key
  4. Store key securely

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

EndpointFunction
/clientsManage customers
/invoicesInvoices
/offersQuotes
/credit-notesCredit notes
/recurringRecurring invoices
/paymentsPayments
/articlesArticles/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 * 60 * 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:

  1. HTTP → Make a request
  2. URL: Billomat API Endpoint
  3. Headers: API Key
  4. Body: JSON Payload

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

ComponentCost
BillomatFrom 6 EUR/month
n8n CloudFrom $20/month
Make.comFrom $9/month

Conclusion

Billomat automation saves time on:

  • Invoice creation from shop systems
  • Automatic dunning
  • Payment reconciliation
  • Reporting

Next Steps

  1. Generate API key
  2. Create first workflow (e.g., invoice creation)
  3. Automate dunning
  4. Set up reporting

We support you with Billomat automation - from setup to productive use. Get in touch for a free consultation. For the budget side of automating your finances, read our guide to what automating your finance stack costs.