ledgerlou

n8n community node for LedgerLou — AI-native accounting infrastructure (journal, bank, debtors, creditors, periods, reports).

Documentation

n8n-nodes-ledgerlou

Official n8n community node for LedgerLou — the AI-native
accounting infrastructure for German GmbHs. Automate bookkeeping, bank
reconciliation, incoming invoices, period locking, reports and more — directly
from your n8n self-hosted workflows.

Why

LedgerLou is designed as an API + MCP general ledger. n8n is the de-facto
EU-friendly workflow automation platform (self-hosted, GDPR, Hetzner-ready).
With this node you get:

  • 1:1 parity with all API-key-capable REST endpoints of LedgerLou.
  • Built-in authentication — no hand-rolled Authorization headers.
  • Polling trigger for new bank transactions, journal entries and invoices.
  • Multipart upload support for document inbox and bank-statement imports.
  • Idempotency via external_reference (e.g. {{$execution.id}}).
  • Deterministic codegen — when the LedgerLou API grows, this node follows
    automatically; no hand-sync drift.

Use cases

  1. Stripe / PayPal → LedgerLou — auto-post revenue from payment webhooks.
  2. Banking → LedgerLou — CAMT/CSV feeds in, banktransactions + optional
    reconciliation out.
  3. Inbox workflows — PDFs from mail / cloud drive → document upload →
    creditor + incoming-invoice creation.

Installation

n8n self-hosted (recommended)

  1. Open Settings → Community Nodes.
  2. Click Install a community node.
  3. Enter package name: n8n-nodes-ledgerlou.
  4. Tick the risk acknowledgement and click Install.
  5. Restart n8n if prompted.

Manual (CLI)

cd ~/.n8n/custom
npm install n8n-nodes-ledgerlou

n8n Cloud

Currently only the Verified Community Nodes channel is supported on n8n Cloud.
A Verified application for this node is planned post-MVP. For now, use
self-hosted.

Credentials

Create a LedgerLou API credential:

Field Value
Base URL https://api.ledgerlou.de (default) or your self-hosted host
API Key ll_… (64 hex). Generate in LedgerLou Dashboard → API-Keys.

The credential is sent as Authorization: Bearer ll_…. Use the Test
button to verify — it calls GET /v1/accounts?limit=1.

Required scopes

Grant the API key the scopes matching the operations you'll call. Scope labels
follow <module>:<read|write|review>, e.g. journal:write, bank:read.
The per-operation scope is shown in each operation's description.

Nodes

Two nodes are shipped:

  • LedgerLou — action node. One operation per REST endpoint.
  • LedgerLou Trigger — polling trigger for new bank transactions, journal
    entries and invoices.

Journal

Operation Method Path Scope
listAccounts GET /v1/accounts config:read
listAccountsSearch GET /v1/accounts/search config:read
createAccounts POST /v1/accounts config:write
getAccountsEntries GET /v1/accounts/:number/entries config:read
createDocuments POST /v1/documents journal:write
getDocumentsFile GET /v1/documents/:id/file journal:read
createBookings POST /v1/bookings journal:write
openingBalancesBookings POST /v1/bookings/opening-balances journal:write
listJournal GET /v1/journal journal:read
getJournal GET /v1/journal/:intent_id journal:read
reverseJournal POST /v1/journal/reverse journal:write

Bank

Operation Method Path Scope
listBankAccounts GET /v1/bank-accounts bank:read
getBankAccounts GET /v1/bank-accounts/:id bank:read
getBankAccountsBalanceHistory GET /v1/bank-accounts/balance-history bank:read
createBankAccounts POST /v1/bank-accounts bank:write
replaceBankAccounts PUT /v1/bank-accounts/:id bank:write
listBankTransactions GET /v1/bank-transactions bank:read
getBankTransactions GET /v1/bank-transactions/:id bank:read
createBankTransactions POST /v1/bank-transactions bank:write
importFileBankTransactions POST /v1/bank-transactions/import-file bank:write
uploadBankAccounts POST /v1/bank-accounts/:id/upload bank:write
getBankAccountsReconciliation GET /v1/bank-accounts/:id/reconciliation bank:read
listBankTransactionsUnreconciledCount GET /v1/bank-transactions/unreconciled-count bank:read
getBankTransactionsSuggestions GET /v1/bank-transactions/suggestions bank:read
reconcileBankTransactions POST /v1/bank-transactions/:id/reconcile bank:write
unmatchBankTransactions POST /v1/bank-transactions/:id/unmatch bank:write
createBankTransactionsDismiss POST /v1/bank-transactions/:id/dismiss bank:write
createBankTransactionsBatchReconcile POST /v1/bank-transactions/batch-reconcile bank:write
createBankMatchGroups POST /v1/bank-match-groups bank:write
unmatchBankMatchGroups POST /v1/bank-match-groups/:id/unmatch bank:write
getBankTransactionsEvidence GET /v1/bank-transactions/:id/evidence bank:read
replaceBankTransactionsEvidence PUT /v1/bank-transactions/:id/evidence bank:write

Kreditoren (AP)

Operation Method Path Scope
listInbox GET /v1/inbox kreditoren:read
getInbox GET /v1/inbox/:id kreditoren:read
confirmInbox POST /v1/inbox/:id/confirm kreditoren:write
createInboxReject POST /v1/inbox/:id/reject kreditoren:write
listInboxAddress GET /v1/inbox/address kreditoren:read
listVendors GET /v1/vendors kreditoren:read
createVendors POST /v1/vendors kreditoren:write
getVendors GET /v1/vendors/:id kreditoren:read
replaceVendors PUT /v1/vendors/:id kreditoren:write
deleteVendors DELETE /v1/vendors/:id kreditoren:write
listInvoices GET /v1/invoices kreditoren:read
createInvoices POST /v1/invoices kreditoren:write
getInvoices GET /v1/invoices/:id kreditoren:read
updateInvoices PATCH /v1/invoices/:id kreditoren:write
listInvoicesOpenItems GET /v1/invoices/open-items kreditoren:read
createOcrExtract POST /v1/ocr/extract kreditoren:read + journal:write

Debitoren (AR)

Operation Method Path Scope
listCustomers GET /v1/customers debitoren:read
createCustomers POST /v1/customers debitoren:write
getCustomers GET /v1/customers/:id debitoren:read
replaceCustomers PUT /v1/customers/:id debitoren:write
deleteCustomers DELETE /v1/customers/:id debitoren:write
listOutgoingInvoices GET /v1/outgoing-invoices debitoren:read
createOutgoingInvoices POST /v1/outgoing-invoices debitoren:write
getOutgoingInvoices GET /v1/outgoing-invoices/:id debitoren:read
updateOutgoingInvoices PATCH /v1/outgoing-invoices/:id debitoren:write
listOutgoingInvoicesOpenItems GET /v1/outgoing-invoices/open-items debitoren:read

Perioden

Operation Method Path Scope
listPeriods GET /v1/periods perioden:read
softLockPeriods POST /v1/periods/:period/soft-lock perioden:write
lockPeriods POST /v1/periods/:period/lock perioden:write
approvePeriodsLock POST /v1/periods/:period/lock/:requestId/approve perioden:write
createPeriodsLockCancel POST /v1/periods/:period/lock/:requestId/cancel perioden:write
getPeriodsLockStatus GET /v1/periods/:period/lock/status perioden:read
reopenPeriods POST /v1/periods/:period/reopen perioden:write

Auswertungen

Operation Method Path Scope
listReports GET /v1/reports auswertungen:read
getReportsMonthlyRevenueExpenses GET /v1/reports/monthly-revenue-expenses auswertungen:read
getReportsDatevExport GET /v1/reports/datev-export auswertungen:read

Config

Operation Method Path Scope
listTenant GET /v1/tenant config:read
listTaxCodes GET /v1/tax-codes config:read
createTaxCodes POST /v1/tax-codes config:write
updateTaxCodes PATCH /v1/tax-codes/:code config:write
deleteTaxCodes DELETE /v1/tax-codes/:code config:write

Idempotency tip

For every create-style operation, set external_reference to
{{$execution.id}} (or a stable per-workflow key). LedgerLou uses this to
dedupe reruns and to link LedgerLou activity back to the originating n8n
execution.

Troubleshooting

Symptom Likely cause
401 UNAUTHORIZED API key missing/invalid. Re-issue in LedgerLou Dashboard.
403 FORBIDDEN Key lacks the required scope. Grant the scope shown in description.
409 DUPLICATE_SUSPECTED Content-hash collision; use skip_duplicate_check only if intended.
400 PERIOD_LOCKED Target period is hard-locked. Unlock in LedgerLou or change date.
Polling finds nothing Trigger interval too short or API key lacks :read scope.

Development

This package lives inside the LedgerLou monorepo.
Contributions via PR against main. Releases are tagged n8n-nodes-v<semver>.

pnpm --filter n8n-nodes-ledgerlou build
pnpm --filter n8n-nodes-ledgerlou lint
pnpm docs:generate   # regenerates descriptions + node catalog

Codegen input: packages/docs/src/data/endpoints/*.json.

License

MIT — see LICENSE.

Discussion