Case study
Business Operations Hub
A self-hosted business system that follows one piece of client work from the first inquiry to a paid invoice: leads, quotes, client approval, projects, time, expenses, invoices, payments, and reports, with emailed links so clients can review and approve without an account.
The code lives in a private repository. I am happy to walk through it or share access on request.

The goal
I run a small web design studio, Sagebrush Sites, and the paperwork around client work was scattered: a proposal here, a time sheet there, an invoice in a separate tool. I had already built three small tools for pieces of it (a proposal generator, a time tracker and invoicer, and a website audit tool). This project merges them into one system so a piece of work can be followed from the first inquiry to the final payment, and so the whole business can run at no recurring cost.
What I built
- Quote to cash. Leads and intake, scoping and pricing, quotes and proposals, client approval by link, projects and tasks, time tracking, expenses, invoices, partial payments, and change orders, all connected so each step feeds the next.
- Client links instead of client logins. Clients review and approve quotes, proposals, and invoices through secure emailed links, so there are no client accounts to manage or secure. I first built a client login portal, then replaced it with these links.
- Reports and exports. Revenue, profitability, expense, time, and inventory reports; CSV exports of ten datasets; branded PDFs; and a full backup file that carries checksums and is verified before a restore writes anything.
- Website audits. An audit engine with seven modules (technical, SEO, performance, mobile, accessibility, security, and local-business data) that reports "unable to test" rather than guessing.
- Everything around the work. Documents with expiring share links, inventory, assets, and vendors, a calendar, an activity log, and role-based access for owners, admins, employees, and contractors.
In numbers: about 10,000 lines of TypeScript for the server, about 6,400 for the interface, 27 database migrations, and about 250 API routes, with documentation covering the architecture, API, security model, backups, and deployment.
Decisions that mattered
- Money is never a decimal. Amounts are stored as whole cents, quantities as thousandths, and rates as basis points, and all of the arithmetic lives in one small, unit-tested module, so totals cannot drift by a fraction of a cent.
- Permissions are enforced on the server. The interface hides what a person should not use, but the server decides what they can read or change. A record someone may not see answers "not found," and a full code review called all of the roughly 250 routes as six kinds of user to check it.
- Approvals work as evidence. A sent quote cannot be edited, an approval link shows exactly one version, and each decision stores a fingerprint of the exact content that was approved, so a later change is detectable.
- Money-handling code is built for two things happening at once. Sending an invoice and recording a payment run under database row locks, payments are append-only (a mistake is voided with a reason, not erased), and a unique index allows only one live invoice per quote.
- Zero-cost by design. One SQL dialect, PostgreSQL, runs embedded for local use or on any hosted Postgres. Email and other paid services are optional, and the app works fully without them.
- Review, then regression tests. Six structured reviews (after milestones 5, 8, 11, and 14, after merging in my earlier tools, and a full review by area) are written up in the repository's QA report. Each finding was reproduced, fixed, and given its own test, including authorization leaks in activity feeds and race conditions around invoices.
What shipped
All 14 planned milestones are complete, and the project has over 550 automated tests. Since then I have kept improving it: merging in my earlier proposal, time-tracking, and website-audit tools, adding coupon codes, a security log, and archive and restore across the lists, and simplifying the data model by merging duplicate tables. Because it is a self-hosted application with its own server and database, there is no public live demo, so the screenshots here use made-up sample data. It is an operations tool, not accounting, tax, or payroll software, and the documentation says so.
Skills this project shows
- Relational data modeling in SQL: migrations, constraints, indexes, and transactions
- Turning a business process (quote to cash) into a connected system
- Role-based access control and keeping one customer's data separate from another's
- Automated testing, including tests written to reproduce bugs before fixing them
- Reporting, data export, backup and restore, and writing documentation for other people