A business management platform for a home-improvement company

Case study. One system for the whole business, from the first enquiry to after-sales service. Client details withheld for confidentiality.

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

Marketing leadSalesQuoteOrderInstallationAccountingAfter-sales

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.

Operations DashboardMarketingSalesQuotesOrdersInstallationAccountingInvoicesAfter-salesSMSUsers Dashboard ● updated just now AHA. Hale · Manager Open orders4241 Awaiting deposit7 Installs this week11 Overdue invoices3 Orders by month JanAprJulOct Recent orders ORD-1042J. Rao$4,850Deposit paidInstallingCompleted ORD-1041M. Chen$12,300Installing ORD-1040S. Williams$2,150Completed ORD-1039R. Singh$7,900Pricing ORD-1038L. Brown$3,400Quote sent Installation calendar · this week MonTueWedThuFri 09:00 InstallTeam A · ORD-1041 10:00 MeasureTeam B 14:00 InstallTeam A · ORD-1037 08:30 InstallTeam B · ORD-1035 11:00 ServiceWarranty · T-218 09:00 InstallDone ✓ 11:26Team A · ORD-1042 9:41 My tasksThursday 23 October · 3 tasks 09:00 – 11:30 · InstallScheduledIn progress 14 Example StreetTeam A · ORD-1042 · J. Rao Start task Directions 13:30 – 14:00 · MeasureScheduled 8 Sample RoadTeam A · Lead L-3310 · M. Chen 15:00 · Service visitWarranty 22 Placeholder AvenueTicket T-218 · S. Williams Installers see only their own tasks My tasks 9:41 ‹ My tasks Install · ORD-1042 14 Example Street · J. Rao · 021 ··· ···· Items 1 × Item A · 4.2 × 3.0 m · charcoal 2 × Item B · 1.8 m · motorised View specification PDF Checklist Site check Installation Customer sign-off + Add photosStored privately with the order Started 09:04 · time recorded automatically Mark complete Report a problem An installer starts the job on their phone and ticks through the checklist.The office dashboard moves with them: the order’s status, the open-order count, the calendar.No refresh and no phone call. Each person sees only what their role needs. Installers see one tab: their own tasks. The installer's phone 9:41 My tasksThursday 23 October · 3 tasks 09:00 – 11:30 · InstallScheduledIn progress 14 Example StreetTeam A · ORD-1042 · J. Rao Start task Directions 13:30 – 14:00 · MeasureScheduled 8 Sample RoadTeam A · Lead L-3310 · M. Chen 15:00 · Service visitWarranty 22 Placeholder AvenueTicket T-218 · S. Williams Installers see only their own tasks My tasks 9:41 ‹ My tasks Install · ORD-1042 14 Example Street · J. Rao · 021 ··· ···· Items 1 × Item A · 4.2 × 3.0 m · charcoal 2 × Item B · 1.8 m · motorised View specification PDF Checklist Site check Installation Customer sign-off + Add photosStored privately with the order Started 09:04 · time recorded automatically Mark complete Report a problem The office dashboard, at the same moment Operations DashboardMarketingSalesQuotesOrdersInstallationAccountingInvoicesAfter-salesSMSUsers Dashboard ● updated just now AHA. Hale · Manager Open orders4241 Awaiting deposit7 Installs this week11 Overdue invoices3 Orders by month JanAprJulOct Recent orders ORD-1042J. Rao$4,850Deposit paidInstallingCompleted ORD-1041M. Chen$12,300Installing ORD-1040S. Williams$2,150Completed ORD-1039R. Singh$7,900Pricing ORD-1038L. Brown$3,400Quote sent Installation calendar · this week MonTueWedThuFri 09:00 InstallTeam A · ORD-1041 10:00 MeasureTeam B 14:00 InstallTeam A · ORD-1037 08:30 InstallTeam B · ORD-1035 11:00 ServiceWarranty · T-218 09:00 InstallDone ✓ 11:26Team A · ORD-1042 Operations DashboardMarketingSalesQuotesOrdersInstallationAccountingInvoicesAfter-salesSMSUsers Dashboard ● updated just now AHA. Hale · Manager Open orders4241 Awaiting deposit7 Installs this week11 Overdue invoices3 Orders by month JanAprJulOct Recent orders ORD-1042J. Rao$4,850Deposit paidInstallingCompleted ORD-1041M. Chen$12,300Installing ORD-1040S. Williams$2,150Completed ORD-1039R. Singh$7,900Pricing ORD-1038L. Brown$3,400Quote sent Installation calendar · this week MonTueWedThuFri 09:00 InstallTeam A · ORD-1041 10:00 MeasureTeam B 14:00 InstallTeam A · ORD-1037 08:30 InstallTeam B · ORD-1035 11:00 ServiceWarranty · T-218 09:00 InstallDone ✓ 11:26Team A · ORD-1042 Operations DashboardMarketingSalesQuotesOrdersInstallationAccountingInvoicesAfter-salesSMSUsers Dashboard ● updated just now AHA. Hale · Manager Open orders4241 Awaiting deposit7 Installs this week11 Overdue invoices3 Orders by month JanAprJulOct Recent orders ORD-1042J. Rao$4,850Deposit paidInstallingCompleted ORD-1041M. Chen$12,300Installing ORD-1040S. Williams$2,150Completed ORD-1039R. Singh$7,900Pricing ORD-1038L. Brown$3,400Quote sent Installation calendar · this week MonTueWedThuFri 09:00 InstallTeam A · ORD-1041 10:00 MeasureTeam B 14:00 InstallTeam A · ORD-1037 08:30 InstallTeam B · ORD-1035 11:00 ServiceWarranty · T-218 09:00 InstallDone ✓ 11:26Team A · ORD-1042
Live: an installer starts a job and completes it on their phone; the office dashboard updates as it happens. Sample data.

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

ReactTypeScriptViteTailwind CSSCloudflare WorkersCloudflare D1Cloudflare R2Supabase AuthDigitalOceanDockerGitHub ActionsVitestPlaywright

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.