Manual
A quick tour of how LedgerLeaf works. The core is just five things: quotes, invoices, credit notes, ledger reports and customer statements.
Demo data — the fastest way to learn LedgerLeaf
The ledger, statements and reports only get interesting once there's data behind them. Rather than make you type in a company, clients, products and a spread of invoices first, LedgerLeaf can build a worked example for you in one click.
What "Load demo data" creates: one fully branded sample company — Northwind Studio (demo) — populated through the exact same code as data you'd enter by hand:
- 4 clients (three South African, one UK client billed in GBP).
- 5 products & services with units and prices.
- 7 invoices spread on purpose across states so every screen has something to show — two paid, several outstanding dated to land in different aging buckets (Not due, 0–30, 31–60 and 91+ days), and one foreign-currency (GBP) invoice that exercises the FX consolidation on the ledger and reports.
- 1 credit note linked to a real invoice.
- A zero-rated export invoice (the GBP one) and a mixed-rate invoice with one zero-rated courier line, so the per-line VAT breakdown has something to show.
- 4 quotes, one in each state — open, accepted, converted into one of the invoices above, and cancelled.
All dates are anchored relative to today, so the aging buckets stay meaningful whenever you load it.
How to use it:
- Load from the Dashboard or Companies page → Load demo data.
- Remove from the Companies page → Remove demo data. This deletes only the sample company and everything under it — companies you created yourself are never touched. (LedgerLeaf records the IDs it generated and removes exactly those.)
The demo company is ordinary data: edit it, issue more documents, download its PDFs, or delete it by hand like any other. Loading and removing it are both recorded in the audit log. Think of it as a sandbox you can wipe and recreate in two clicks.
1 · Getting started
- Create a company from the dashboard. Defaults are tuned for South Africa: ZAR, en-ZA, 15% VAT, Cape Town, Western Cape.
- Quote the job if you need sign-off first, then Convert to invoice — or issue an invoice directly. The form picker auto-fills clients and products you've already saved.
- Mark invoices as Paid when payment lands.
- Open the Ledger tab for a printable running balance, or Statements to send a client their own statement of account.
2 · Companies
Every record lives under a company. Each one has its own:
- Branding — logo, brand and accent colors used on every PDF.
- Tax rules — currency, locale, default VAT, payment terms.
- Numbering — independent quote, invoice and credit note counters with custom prefixes, plus a default validity window for quotes.
- Banking — bank, account, branch code, SWIFT/BIC and optional IBAN, all printed in the PDF footer.
- Optional password — see the next section.
3 · Passwords (optional)
- Each company can carry an optional password. When set, every per-company page requires the passphrase before it loads.
- Passwords are hashed with scrypt before they touch the database. The unlock state lives in an HMAC-signed cookie that lasts 12 hours per browser.
- Set or change it in the company form's Access protection section. Tick Remove password protection when editing to clear it.
- The "Lock" button on the company page wipes that company from the cookie immediately.
4 · Quotes
A quote (quotation) is a priced offer that is not yet a tax document. It uses the same form as an invoice — client, line items, VAT, currency — but has its own numbering (QUO-YYYY-#### by default) and never touches the ledger, statements or outstanding totals until you convert it.
- Click + Quote on the company page, or open the Quotes tab.
- Set the Valid until date. It defaults to the company's quote validity setting (30 days unless you change it in the company form) and is printed on the PDF. A quote past that date is flagged as expired on screen but stays open until you act on it.
- Send it with Email or Download, exactly like an invoice. Mark it Accepted when the client says yes.
- Convert to invoice creates a brand-new invoice from the quote — the next invoice number, today's issue date, a due date from the company payment terms, and the quote's client details, line items, VAT rate and notes copied across. The quote becomes converted and both documents link to each other. A converted quote can no longer change status or be converted again; edit or delete the invoice instead.
- Cancel quote closes it without invoicing. A cancelled quote can be reopened if the client comes back.
Statuses: Draft → Issued → Accepted → Converted, or Cancelled at any point before conversion. Accepted and cancelled quotes carry an ACCEPTED / CANCELLED stamp on the PDF.
5 · Invoices
- Click + New invoice on the company page — or convert an accepted quote, which fills the whole form for you.
- Pick an existing client or fill the bill-to fields manually.
- For each line, pick a product or write a custom description. Quantity, unit price and VAT recalc live. A product's own VAT rate is applied to its line; the Default VAT rate covers every line without one. Tick Save to price list on a custom line to turn it into a product as you go.
- If you switch the currency away from the company default, a live FX rate appears with a one-click "Convert line items" button (powered by open.er-api.com, no API key required).
- Issue the invoice. The number is generated as PREFIX-YYYY-#### (e.g. INV-2026-0001). The FX rate at issue time is captured on the document.
- Mark the invoice as Paid when payment arrives — that removes it from the open balance on ledgers and statements.
6 · Credit notes
Credit notes work the same as invoices, with two differences:
- You can link one to the original invoice it relates to — the relation is shown on both records.
- All amounts are shown as negatives on screen and on the PDF, and credited totals are subtracted on the ledger and statements.
7 · Ledger reports
The ledger is a chronological journal of every invoice and credit note for a company, with a running outstanding balance.
- Each invoice is a debit (the customer owes more); each credit note is a credit (it reduces what they owe).
- Paid invoices are listed but they don't accrue to the outstanding balance — they're already settled.
- Filter the view by date range and / or a single client.
- Use Print to send it to a physical printer (the sidebar and nav drop out via a print stylesheet), or Download PDF for a landscape branded PDF.
- The four headline numbers — Invoiced · Credited · Paid · Outstanding — are also shown above the table.
8 · Customer statements
A statement is the same data, but cut by a single client and laid out for posting or emailing.
- Open Statements from the tab; pick a client to drill in.
- The statement shows: invoiced and credited totals, the current open balance, and an aging breakdown — Not due / 0–30 / 31–60 / 61–90 / 91+ days.
- Aging is computed from each invoice's due date (or issue date if no due date is set) relative to today in the display timezone.
- Filter by date range to produce a "for the month of …" statement.
- Download PDF renders a portrait branded statement on company letterhead, ready to send.
9 · Clients
Clients are managed per company. When you pick a client on a new invoice, their address and tax ID are copied onto that document — later edits to the client never change historical invoices.
10 · Products & services
- Set a default unit (hour, project, run…) and a unit price.
- Give a product its own VAT rate only when it is zero-rated or exempt. Picking it on a quote or invoice applies that rate to the line; every other line follows the document's default rate. Documents with more than one rate show a per-line VAT column and a VAT breakdown by rate on screen and on the PDF.
- You can also create products while quoting: type a custom line, tick Save to price list, and the product is created from the description, price and VAT rate when you save the document. Ticking it again later for the same name links the existing product instead of duplicating it.
- Leave the SKU blank — it's auto-generated from the name plus the product ID, e.g. BRAN-0007.
11 · CSV imports
You can bulk-create clients, products, quotes, invoices or credit notes from a spreadsheet. Each list page has an Import CSV button that gives you a downloadable template with the right columns.
- Clients and Products imports create independent records.
- Quotes, Invoices and Credit notes imports use one row per line item — group rows together with the same number and the importer treats them as a single document. Quotes and invoices may leave the number blank to have one assigned; credit notes need one.
- Rows missing a name (or a product price, or a client name on documents) are skipped — the rest still import.
12 · PDF tips
- Logos can be PNG, JPG, GIF or WebP (max 4 MB); a PNG with a transparent background around 400 px wide renders best. SVG is not accepted.
- Set both brand and accent colors — every PDF (quote, invoice, credit note, ledger, statement) uses a gradient between them on the header band and total badge.
- PDFs always render on white paper regardless of the screen theme.
- The PDF is regenerated on every request — edit a document and refresh.
13 · Localization & time
- The default South African profile is ZAR · en-ZA · 15% VAT · Cape Town · Western Cape. Each company can override its locale.
- Money renders as R 1 234,56 for ZAR and follows the company locale for any other currency.
- Time is anchored to GMT. The server runs in UTC; the UI converts to the display timezone (default Africa/Johannesburg, GMT+2) — visible in the sidebar footer.
- Override the display timezone with the APP_TZ environment variable.
14 · Database
- LedgerLeaf runs on SQLite by default — a single file under DATA_DIR/ledgerleaf.db.
- To use PostgreSQL, either set DATABASE_URL (Railway) or open /setup and paste a connection URL.
- The env var wins. The setup screen writes to DATA_DIR/config.json and only applies when the env var is unset.
- The schema is created and migrated on first connect — no manual step.
- /healthz reports the active source and engine.
15 · Theme
- LedgerLeaf follows your operating system's light/dark preference on first visit (dark when the browser expresses no preference). The toggle in the sidebar flips between day and night and remembers the choice in this browser.
- An inline script applies the saved theme before the first paint, so there's no flash on reload.
- PDFs always render on white paper regardless of the screen theme.
16 · Install as an app
- LedgerLeaf is a Progressive Web App. On a phone or desktop, use your browser's Install / Add to Home Screen option, or the Install app button that appears in the sidebar when the browser offers it. It then opens in its own window with the LedgerLeaf icon.
- Installing needs a secure connection (HTTPS) — Railway provides this — or localhost when running on your own machine.
- When the connection drops you get a clear You're offline page instead of a browser error, and a banner at the top of the page while offline. Your data lives on the server, so nothing is lost; pages load again as soon as you reconnect.
- Nothing private is stored on the device by the app itself: only the styles, icons and the offline page are cached. Updates are picked up automatically on the next visit after a deploy.
17 · Email signature
Open the Signature tab on a company (or the Signature button on its overview) for a ready-made email signature built from the company's details: the logo with the company name and a tagline on the left; phone, email and website with icons, a rule in the company's accent colour, and a bullet list of what you offer on the right.
- Your name and title (one person — this is built for a single-person business), the tagline and What you offer are edited on the signature page itself (one bullet per line). Leave the list blank and your active products are listed automatically. Untick Show the company name if your logo already carries it.
- Contact details, the logo and the accent colour come from the company form — change them there and the signature follows.
- Copy signature copies the formatted block for Gmail and Apple Mail (paste into the signature box in settings). Copy HTML and Download .html serve clients that take raw HTML, such as Outlook on the web or Thunderbird.
- The signature page itself is public, like the logo: open /companies/ID/signature from anywhere and it renders in full with copy buttons, so you can set it up on a phone or hand the link to whoever manages your mail. Only editing the text needs the company unlocked.
- The logo and icons are linked from your LedgerLeaf server, so recipients see them as long as it is online. They are served with headers that let other sites (Gmail, Outlook on the web) display them — that is what makes pasted signatures show their images.