Use Cases

Billomat API Integration: Automate Accounting with n8n and Make.com

How to connect Billomat with your other business tools.

12 min read

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:
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

  • Billomat → Settings → Interfaces
  • Activate API
  • Generate API key
  • 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 <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:

  • HTTP → Make a request
  • URL: Billomat API Endpoint
  • Headers: API Key
  • 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

  • Generate API key
  • Create first workflow (e.g., invoice creation)
  • Automate dunning
  • Set up reporting
  • We support you with Billomat automation - from setup to productive use.

    Questions About Automation?

    Our experts will help you make the right decisions for your business.