Building Ledgerlane: a calmer way to control client invoices
I recently built and shipped Ledgerlane, a mobile-first workspace for a finance and supply-chain executive who needed a clearer way to manage client invoices.
The goal was practical: bring client records, invoice intake, payment status, return notes, original proof files, and reporting into one focused place. The result is now live at ledgerlane-app.web.app.
The problem
Invoice work often lives across spreadsheets, email attachments, and ad hoc follow-ups. That makes it harder to answer simple questions: what is still pending, what is overdue, which client does a record belong to, and where is the original proof?
Ledgerlane brings those answers into a single workspace without trying to automate away the review itself.
What I built
- A client directory with safe create, edit, and delete workflows.
- Invoice tracking with validation, due dates, RM formatting, categories, sorting, filtering, and overdue visibility.
- Return Note / Good Return Note tracking alongside invoices.
- Proof-file uploads for Excel, CSV, images, and PDFs, with up to five files per record.
- Optional first-row spreadsheet prefill that remains a suggestion and must be checked before saving.
- Consolidated and per-client dashboards with totals, overdue alerts, category breakdowns, monthly trends, and payment status.
- Excel exports for handover and a downloadable blank invoice template.
- A responsive interface that works on desktop and mobile, plus an installable PWA.
The decisions behind it
The product is deliberately manual-review-first. A person enters and verifies the important invoice details, while the original spreadsheet, image, or PDF remains available as proof. Ledgerlane does not send documents to AI, OCR, or external model services; spreadsheet suggestions and reporting calculations run locally in the browser.
On the engineering side, the React interface talks to a small DataStore boundary rather than importing Firebase directly. That keeps the UI independent from persistence and leaves room to change the backend later. The reporting logic is pure TypeScript, so calculations such as totals and overdue status can be tested without a browser or a live database.
The production workspace uses Firebase Authentication, Firestore, Storage, and Hosting. Access requires a verified and approved email address, keeping the single-workspace boundary explicit while the product is still focused on one trusted business workflow.
Shipping the first version
The first release includes automated type checks, unit tests, Firebase security-rule tests, staging and production deployment paths, route-level code splitting, responsive loading states, and an offline app shell for the PWA.
That work matters because the product is not just a screen for entering data. It is a small operational system: it needs to be trustworthy when records are added, understandable when access is not approved, and easy to hand over when a report is exported.
Ledgerlane is a v1, so it intentionally does not include OCR, automated approvals, foreign-exchange conversion, or a multi-tenant client portal. Keeping those boundaries clear made it possible to ship a useful workflow with the review responsibility in the right place: with the person who owns the financial decision.