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.

Before you read on
Does automation actually pay off for you? Take the 5-minute analysis — score, maturity level and an honest read on whether this path fits your situation. Free, report by email.
Start 5-min analysis →

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..."
        }
      }
    }

    Build it or have it built?
    We implement this workflow for you — fully tested in 1-4 weeks. Fixed-price quote within 24h.
    Get a Quote →

    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"
    }

    Training or implementation?
    Whether you want to learn it yourself or have us build it — we offer both. Custom workshops from 2h or turnkey solutions.
    See Options →

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