npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

n8n-nodes-ledgerlou

v0.1.0

Published

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

Downloads

141

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