At a glance
- Client: a company that sells and installs made-to-order products for homes, with sales, installation, accounting and management staff
- What they needed: one internal system covering marketing leads, sales, quotes, orders, installation scheduling, accounting, invoicing and after-sales
- Status: in production and in active development, with changes shipping through an automated pipeline
- My role: solo developer, from design through build, deployment and ongoing development
The brief
Every customer passes through the same stages: an enquiry becomes a lead, a lead becomes a quote, a quote becomes an order, the order is installed, paid for and supported afterwards. The business wanted all of that in one place, where each person sees exactly what their job needs and nothing else: sales staff their leads and quotes, installers the day's tasks, accountants the payments and reports.
One thing made it more than a standard CRM: the accounting side spans two currencies, so the books needed exchange rates and dual-currency reporting built in rather than bolted on.
The pipeline, end to end
Leads move through a marketing pipeline and a sales pipeline with calendar and list views. A won lead becomes an order that carries its own items, product specifications, pricing and attachments through twenty-one statuses, from pending pricing and deposit to installation and completion. Every stage is visible on a role-specific dashboard that refreshes itself.
See it in action
A live illustration with sample data. The names, figures and addresses are invented, and these are not the client's screens.
What I built
Thirteen areas of the business, each with its own screens, permissions and rules. The highlights:
Dashboard
Role-specific metrics and charts, recent orders and upcoming work, refreshing automatically so the morning view is always current.
Marketing and sales pipelines
Leads move from new to contacted, qualified and converted; sales from lead to quote sent and won. Calendar and list views, appointments, and reminders sent automatically.
Quotes and orders
Quotes as PDFs, converted into orders that carry items, product specifications, pricing, attachments and a deposit step through twenty-one statuses from pending pricing to completion.
Accounting
A payment-approval workflow, a pending-pricing queue, cost approvals, and a dual-currency logbook with exchange rates and starting balances. Everything exports to Excel and PDF.
Invoices and receipts
Invoices created, sent, voided and chased from one list, with payment reminders and receipts emailed to the customer automatically.
Installation
Task scheduling, teams, a calendar and staff assignment for the office; measurement records for the measurer; and a single My Tasks view for installers, with actual times recorded as they work.
After-sales
Warranties, service tickets and a repair workflow, so a problem reported months after installation lands with the right person and stays tracked until it is closed.
Customer messaging
Transactional email with PDFs attached, SMS with templates and a full history, and daily appointment reminders. Replies go to the staff member who sent the message.
Users and security
Invite-only accounts, nine positions with distinct permissions, private storage for customer and accounting documents, and file access checked per record, not just per role.
Tested and automated
Unit and end-to-end tests, a pipeline that lints, tests and checks the database schema on every change, and scheduled daily and monthly jobs.
Technology
The API runs on Cloudflare Workers with the database in Cloudflare D1 and files in R2, so there are no servers to patch and the data sits at the edge. Authentication is Supabase Auth with invite-only sign-up. The web app is React and TypeScript, deployed in a container behind Nginx.
Outcome
One system now runs the business from first enquiry to after-sales service, with each person seeing only what their role needs. It has been in continuous development since late 2025, with well over a thousand changes shipped through the automated pipeline, each one tested before it reaches the team.
Need something similar?
Internal systems like this one are where I do my best work: a real operation, several roles, and software that has to be dependable every day. The client's name and details stay private, but I'm happy to walk through how it was built on a call. Get in touch.