n8n-nodes-ledgerlou
v0.1.0
Published
n8n community node for LedgerLou — AI-native accounting infrastructure (journal, bank, debtors, creditors, periods, reports).
Downloads
141
Maintainers
Readme
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
Authorizationheaders. - 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
- Stripe / PayPal → LedgerLou — auto-post revenue from payment webhooks.
- Banking → LedgerLou — CAMT/CSV feeds in, banktransactions + optional reconciliation out.
- Inbox workflows — PDFs from mail / cloud drive → document upload → creditor + incoming-invoice creation.
Installation
n8n self-hosted (recommended)
- Open Settings → Community Nodes.
- Click Install a community node.
- Enter package name:
n8n-nodes-ledgerlou. - Tick the risk acknowledgement and click Install.
- Restart n8n if prompted.
Manual (CLI)
cd ~/.n8n/custom
npm install n8n-nodes-ledgerloun8n 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 catalogCodegen input: packages/docs/src/data/endpoints/*.json.
License
MIT — see LICENSE.
