Product · Operating layer for car washes
WashOrbit
The operating layer I'm building for car washes, on top of the point-of-sale. The POS runs the wash; WashOrbit runs the business around it — turning the raw stream of members, visits, and equipment into the three things owners actually lose sleep over: keeping members, keeping machines running, and making every bad wash right.
Role
Product, design, and build
Stack
Next.js, TypeScript, Postgres, Prisma
Status
In development
The gap I kept hitting
A complaint comes in — and nobody can say what really happened.
Doing marketing for two local car washes, I kept watching the same thing: a customer reports a bad wash, someone hands out a free one to smooth it over, and the real problem — a clogged applicator, a worn mitter — never gets traced or fixed. So it happens again. I started there, with one wedge: turn a complaint into an owned case, link it to the cause, and don't let it close until the machine and the customer are both actually made right.
But the data that fixes a complaint — who the member is, what they pay, which machine touched their car — is the same data that keeps them from cancelling and keeps that machine from breaking. That's the bigger idea: WashOrbit isn't a complaint tool, it's the operating layer around the wash.
Not just a CRM
The operating layer, on top of the point-of-sale.
The point-of-sale runs the wash — identity, memberships, visits, payments. WashOrbit reads that read-only and runs the business around it, across four things owners care about. One is live today; the rest are where it's headed.
Retention and churn — the recurring-revenue heartbeat. Spot at-risk members before they cancel and win them back.
Uptime and maintenance. A down tunnel is zero revenue, so equipment health ties straight to the complaints it causes.
Making every bad wash right — complaint to incident to approved recovery to a verified fix. The part that's built.
What every issue costs and what every save is worth, per location — so operations shows up in the P&L.
A calm, dense command center. Warm branding lives on the marketing site; the operator's tool is built to be legible under pressure.
Moments · Dashboard
The whole operation on one screen.
Open cases, overdue SLAs, approvals waiting on a decision, live incidents, and open claims — the queues a manager actually watches, each one clickable straight into the work.
Operations Dashboard
Sunshine Car Wash · signed in as Alice Admin
Recent cases
| # | Title | Customer | Loc | Severity | Status |
|---|---|---|---|---|---|
| #1042 | Tires not cleaned after Premium Wash | Maria Alvarez | L3 | High | In Progress |
| #1041 | Scratch on driver-side door alleged after wash | James Chen | L1 | Critical | Awaiting Approval |
| #1039 | Requests credit for two missed washes | Robert Okafor | L4 | Medium | Awaiting Approval |
| #1040 | Charged after membership pause | Priya Natarajan | L2 | Medium | Triaged |
Moments · Case detail
Everything about one complaint, in one place.
What happened, which customer and visit, who owns it, the incident that caused it, what was promised, the recovery that needed approval, whether the machine and the customer were both verified — and what it all cost.
Case #1042 · Tires not cleaned after Premium Wash
Wash Quality · opened Jul 18, 9:24 AM by Carmen Service
What happened
Member reports the tire shine was not applied and tires still looked dirty after a Premium Wash + Tire Shine at Northgate.
Ownership & what's due next
- DoneInspect tire-shine coverage at NorthgateAssigned to Liam Location
- DoneClear applicator #2 nozzle & restore pressureAssigned to Morgan Maint.
- DoneConfirm return visit with memberAssigned to Carmen Service
Recovery & approvals
Recovery offers require leadership approval before delivery.
Verify resolution & close
Post-repair test cycles show full tire coverage; supervisor confirmed on 5 vehicles.
Member returned for the complimentary wash; tires cleaned and shined correctly.
Linked incident
Financial impact
POS sync
SyncedCustomer, vehicle, visit, and membership mirrored from the point-of-sale. Cached read-only — no card data stored.
Audit trail
- Case opened · Carmen Service
- Linked to shared incident · Carmen Service
- Corrective action recorded · Morgan Maint.
- Recovery approved · Alice Admin
- Both outcomes verified · case closed
Moments · Approvals
No make-good goes out unapproved.
Recovery offers and claim payouts land in a leadership queue before they ever reach a customer. Every approve or deny is written to the audit log in the same transaction.
Approvals
Recovery offers and claim payouts require leadership sign-off before delivery
Every approval decision is written to the immutable audit log in the same transaction.
Members · Retention
The same data that fixes a wash keeps the member.
A concept for the next pillar: read the point-of-sale's membership and visit history to surface who's about to cancel — a paused plan, a visit streak that stopped, a recent complaint — and turn it into a win-back before the churn hits the recurring revenue.
Member Retention
Sunshine Car Wash · unlimited memberships — the recurring-revenue heartbeat
At-risk members
signals from POS visits & memberships| Member | Plan | Churn signal | Risk | Action |
|---|---|---|---|---|
| Emily Novak | Unlimited Basic | Paused 14 days — no restart scheduled | High | Win-back |
| Robert Okafor | Unlimited Basic | Open credit request for two missed washes | High | Save offer |
| Maria Alvarez | Unlimited Premium | Recent complaint (resolved) — watch next visit | Medium | Follow up |
| Priya Natarajan | Unlimited Premium | Visits down 60% over 30 days | Medium | Re-engage |
Concept — retention reads the same point-of-sale membership and visit data WashOrbit already mirrors, and a resolved complaint (Moments) becomes a retention signal here.
The rules underneath
Guarantees, not good intentions.
The parts that matter aren't UI — they're invariants enforced in the service layer and covered by tests, so the workflow can't be shortcut even by a rushed operator.
Verified resolution before closure
A case can't be closed until the operational correction and the customer outcome are both verified, with no approval still pending. No quietly-dropped complaints.
Approvals gate the money
Recovery offers and claim payouts require a leadership decision before delivery — and every decision is recorded.
One incident, many cases
Complaints that share a cause link to a single incident instead of spawning one per person, so a real equipment problem is seen for what it is.
History can't drift from state
Every important change appends an immutable audit row in the same transaction, so the record always matches what actually happened.
The point-of-sale stays the source of truth
Customer identity, memberships, visits, and payments are mirrored read-only from the wash's point-of-sale system. WashOrbit never stores card data or an editable copy of billing truth.
Tenant isolation, proven
Multi-tenant with six roles; every query is scoped to the organization and the test suite proves one org can't read another's cases, customers, or files.