Laundry Near Me
"Uber-for-laundry" marketplace connecting customers, drivers, and partner laundries — real-time tracking, in-app payments, and automated supplier settlements across four apps and an admin console.
The problem
The goal was an 'Uber for laundry' — a two-sided marketplace where independent laundries list services, customers book a wash-dry-fold pickup, and drivers move the laundry between them. The hard part isn't the screens; it's the money and the trust: charging the right amount for a load whose price isn't known until it's weighed, splitting each order between platform and supplier, and paying everyone correctly and on time — across four user types at once.
What I built
A single TypeScript backend serving four apps and an admin console in one pnpm monorepo: customer, driver, and laundry-owner Expo apps, a React/Vite admin console, and a Fastify API as the single source of truth for pricing, state, and settlement. Shared logic lives in dedicated packages — a pure pricing engine, Zod schemas + types, tunable business config, and a shared UI kit.
Engineering highlights
Authorize-at-booking, capture-at-weigh-in payments
A load's real cost isn't known until it's weighed. Stripe manual capture authorizes a hold at booking and captures the exact weighed amount later — capped at the hold, never overcharging. Clients never compute money.
Automated revenue segmentation & supplier settlement
Every order splits into delivery fee, commission, and a weekly listing subscription, all overridable per supplier. A scheduled, idempotent settlement sweep pays suppliers 48h after delivery via Stripe Connect, nets clawbacks, and is never negative.
Catalog-driven marketplace (no fixed menu)
Each shop owns its own catalog — products, units (per-kg or per-item), and prices. Customers order against a specific shop's catalog, which is what makes it a true marketplace rather than a single-vendor app.
"Choose for me" auto-assignment — without a Maps bill
Resolves the best nearby laundry from postcode/suburb (nearest by local haversine when GPS is known → most spare capacity → best SLA), so the core flow runs without a paid Google Maps key.
Real-time everything + provider-agnostic integrations
Order status is pushed live over Socket.IO across all surfaces. Payments, SMS, email, push, storage, and CRM are all selected by environment config — swapping a provider is a config change, not a code change.
Results
- ✓A working end-to-end platform across five surfaces (4 apps + admin) on a shared backend.
- ✓A fully automated money pipeline: booking hold → weighed capture → revenue split → 48h auto-payout → refund clawback.
- ✓Heavily type-safe (Zod + TypeScript throughout, no any) with targeted tests on the pricing engine and API.
Full tech stack
Built at Nextbit — the source lives in a private repository, so it isn't publicly available. A live screen-share demo and code walkthrough are available on request for hiring managers.