← All work

FleetServ: quote to invoice in one place

0→1 · Working prototype in early use Specced in Claude · Built with Claude Code
Role
Product manager, discovery to launch
Client
New fleet-services company, one operator, Oʻahu

The reel above walks through FleetServ's real interface in motion, driven by the same design tokens and the same Hawaiʻi GET tax math the live app runs, so every total on screen is the number a customer would actually see. Nothing is mocked. I built it to explain the product to people who will never open the app, which is most of the job: turning what got shipped into something a stakeholder can follow in ninety seconds.

The user and the problem

A mobile fleet mechanic going out on their own already knows the trade cold. What a new one-person business lacks is the back office: quoting, invoicing, job records, and a client-ready PDF, all handled between jobs with no one to hand the admin to. I scoped FleetServ around that specific operator, quoting in the yard on a phone, in the sun, sometimes with gloves on. Designing around how the real workflow runs, rather than how software usually models it, drove most of what follows.

One job record, three audiences

Everything in FleetServ hangs off a single job record that changes shape depending on who is looking at it. The admin runs the business from it. The customer only ever sees the documents it generates. The technician feeds it from the field, logging the service and inspection that back a quote, though a dedicated technician view is still on the roadmap.

What's shipped today covers the admin and the customer, and the technician's capture along the way. On the admin side: the job and quote pipeline with status tracking; per-visit service logging with fields tailored to each job (oil grade and quantity, fluid and fuel type, fuel gallons, tire PSI and location, and a pass/fail visual-inspection checklist) and photos attached to the visit; a quote builder that recomputes each line as quantities and rates change; customer and vehicle records with service history per truck; and print-ready PDF quotes, invoices, and service reports, with the invoice handed off to QuickBooks for payment rather than collected in the app. The customer's side of the same record is what lands in their hands, first the quote, then the itemized invoice document.

The deeper technician module is what's still on the roadmap. Today an inspection is a pass or fail per category and photos attach to the visit as a whole. The planned version walks section by section, records a value for each item, and binds each photo to the specific item it documents, so a completed inspection becomes the structured evidence behind the quote: the admin builds from findings, and the customer can see where each line came from.

What I prioritized, and what I cut

A judgment call on data I'd stand behind

A customer view wanted lifetime-billed and open-balance totals. The live data layer was frozen and couldn't produce them honestly, so I left them out and documented why, rather than show a figure that might be wrong. Less on the screen, but every number on it is one the operator can defend to a customer.

How I'll know it's working

The business isn't open yet, so there's no usage data yet. I defined the signals I'll track as it ramps: quotes sent per week, the time from a job finishing to an invoice going out, and the share of quotes that convert to accepted work. The clearest failure signal is simpler, whether the operator ever falls back to a spreadsheet. Each of those also points to the next build. First in line is the deeper technician inspection module described above, because it changes what a quote is made of: findings and photos bound to each item, not a checklist and loose photos. Behind it sit a reusable line-item catalog to speed quoting, and a small dashboard once there's enough history to make one honestly.

Where it stands

  • Concept to a deployed product the owner runs on: brand, quoting, invoicing, service logging, and job history in one place instead of four.
  • A working prototype in early real use by the owner. The business itself hasn't launched or named itself yet, so FleetServ is the working name.
  • Specced and built 0-to-1 with Claude and Claude Code, including a custom design system (tokens, components, brand mark) built alongside the product, not retrofitted.
  • A React single-page app on Supabase for data, auth, and photo storage, with PDFs via react-pdf, hosted on Vercel.

Screens

FleetServ quote document on a phone: header, line items for parts and labor, and totals.
Quote detail: the customer-facing document, and the object that becomes the invoice.
The same record shown as an invoice: identical line items with GET itemized and a balance due.
One object, two states: accept the quote and this same record is the invoice, GET itemized, no re-entry.
Jobs list sorted by urgency, money owed and open quotes at the top, each row with a labeled status chip.
Money owed and open quotes up top; status is always a labeled chip, never color alone.
Quote builder on a phone: line-item steppers with a line total and running total updating as items are added.
Building a quote in the yard. Steppers sized for gloved hands; the line total and running total recompute as you go.
Customer detail: one-tap call, text, and email actions above each truck's service history.
A customer at a glance: contact up top, and every truck's service history in one place.