Skip to content
Carlo Miguel Dy
← Back to the specimen catalogue

Acc. XII · Lavandula seminarium — laundry-shop order tracker, cultivated 2026

Labada — mobile-first laundry-shop operations

Technical founder · Product engineer · 2026 · Independent studio

A Taglish PWA that digitises Philippine laundry-shop order intake, kanban status tracking, and no-login customer notification, replacing paper claim stubs.

Lavandula seminarium — laundry-shop order tracker, cultivated 2026

Field notes

The context

Philippine laundry shops track orders on paper claim stubs — no status visibility for the customer, no record if the stub is lost, and no way to see daily revenue or unpaid balances without counting by hand. Labada replaces that stub with a digitised order lifecycle a shop owner and staff can run from a phone.

Cultivation

What I built

  • Built a 60-second intake form with customer autocomplete and live pricing pulled off each shop's own rate card.
  • Built a six-stage kanban status board (received → washing → drying → folding → ready → released) with one-tap advancement for staff.
  • Built public, no-login order-tracking pages styled as a digital claim stub, keyed by a per-order claim token rather than an account.
  • Built the owner's daily dashboard — orders, revenue, kilos processed, unpaid balances — and rate-card and add-on management with shop branding.
  • Built staff accounts with owner/staff roles, manual GCash billing with screenshot verification, and a Labada HQ ops console for verifying shop submissions and account status.

Root system

How it works

A three-app Turborepo, each with an independent Vercel deploy: apps/landing (Next.js 16) serves marketing and the public /t/<token> tracking route, apps/web is a Vite SPA PWA for shop staff, and apps/admin is a Vite SPA PWA for Labada HQ ops. Shared packages (@labada/core for domain and pricing logic, plus /db, /ui, /config) keep the three surfaces consistent. Supabase Postgres enforces row-level security gated on shop_id and role, Realtime pushes live status to the orders table, and a public track_order(token) RPC is the only anonymous read path. turbo-ignore scopes CI to the app that actually changed.

Harvest

Outcomes

  • MVP complete and deployed to an interim domain (labada.carlomigueldy.dev) — the production labada.app DNS cutover has not been validated yet.
  • No users, revenue, or adoption to date.
  • Billing is manual GCash with screenshot verification; there is no payment gateway integration.
  • Six-stage order lifecycle and no-login tracking pages are functioning end to end in the deployed environment.

Herbarium

The work itself

Desktop board view for Wash Depot with top nav Labada / Wash Depot / Board / Bagong Order / Dashboard / Settings / Billing, heading 'Board — Wash Depot', a 'Board (10) / Na-release (1)' toggle, and five kanban columns — Received (4), Washing (1), Drying (2), Folding (1), Ready (2) — with order cards showing numbers LB-0001 through LB-0011, customer first names (Marco, Marites, Divine, JM, Karen, Lola, Grace, Randy), masked mobile numbers like '0918 ··· 6655', kilo weights, 'Wash · Dry · Fold' service, peso amounts, RUSH / UNPAID / PAID badges, and a per-column action link such as 'START WASHING →' or 'MARK AS READY'.
Fig. 1The board tracks every order through five stages — received to ready — with rush and payment status visible at a glance.
'Bagong order' intake form with subtitle 'Target: tapos bago pa matapos ang kanta sa radyo.'; CUSTOMER field with 'Marites Aquino' and 'Walang match — gagawa ng bagong customer:' with mobile 0917 555 0143; SERBISYO chips Wash·Dry·Fold selected among Dry clean, Plantsa, Comforter; TIMBANG stepper at 4.5 kg noting '₱40/kg · min 3 kg galing sa rate card mo'; ADD-ONS with Rush (same day) +₱80 and Hangers +₱30 checked and Fabcon +₱15 unchecked; a NOTES field scrolled to show only the tail '...anggas, tanggalin muna bago i-wash.'; READY BY 08/08/2026, 05:00 PM; and a summary card for Wash Depot #LB-0011 totalling ₱290 with a 'Confirm order · i-share ang stub' button and 'Intake time 0:02 — target < 1:00'.
Fig. 2Intake turns a phone call into a structured order — service, weight, add-ons, and a ready-by time — with a summary before it's confirmed.
Order detail side sheet for LB-0011 titled 'Natanggap na', customer 'Marites Aquino' with masked number '0917 ··· 0143'; Wash · Dry · Fold 4.5 kg with Subtotal ₱180, Add-ons +₱30, Rush fee +₱80, TOTAL ₱290; a five-segment progress bar with the first segment filled; NOTES showing staff note 'Maingat sa puting damit — may mantsa sa manggas, tanggalin muna bago i-wash.'; STATUS TIMELINE '🧺 Natanggap na · Aling Nena · 2:12 AM'; and PAYMENTS with a 'Balance ₱290' badge, 'Wala pang bayad na natatala.', and an 'Idagdag na bayad' row with amount 290, method 'cash', and an 'I-record' button.
Fig. 3Order status, staff notes, and payment recording sit on one detail sheet, tracked through a five-step progress timeline.
Dashboard greeting 'Magandang gabi, Aling Nena! 🌙' with chip 'Wash Depot · Sabado, Ago 8' and a '+ Bagong Order' button; stat cards KITA NGAYONG ARAW ₱1,795, KILOS PROCESSED 26.5 kg, ORDERS TODAY 5, UNPAID + STALE ₱1,080 · 0; a 'Hindi pa bayad' list of four orders — #LB-0009 Randy Ocampo ₱175 '5 araw na', #LB-0001 Marco Villanueva ₱295, #LB-0002 Divine Santos ₱320, #LB-0011 Marites Aquino ₱290 — each with 'Buksan sa Board →'; and a 'Nakatambay sa shelf' card reading 'Walang nakatambay sa shelf — maayos ang daloy ng pickup! 👍'.
Fig. 4The dashboard gives shop owners a daily snapshot — today's totals, unpaid balances, and shelf status — in Taglish, at a glance.
'Presyo' settings page noting pricing changes apply to new orders only and will not affect existing orders; 'Presyo per kilo' rows for Wash · Dry · Fold ₱40/kg min 3 kg, Dry clean ₱150/kg min 1 kg, Plantsa ₱50/kg min 1 kg, and Comforter ₱180/kg min 1 kg, each with an on/off toggle; an Add-ons section with Fabcon ₱15 per load and Hangers ₱30 per load both toggled on, plus a 'Bagong add-on' row with a '+ Idagdag' button; and a 'Rush fee & stale pickup' section with RUSH FEE ₱80 and I-FLAG PAG STALE NANG 3 araw.
Fig. 5Rates, add-ons, and rush-fee rules sit in shop settings, editable without touching code and scoped to future orders only.
'Subscription ng Wash Depot' billing page showing current PLANO 'Negosyo', STATUS 'Aktibo', MAG-E-EXPIRE Sep 7, 2026; a 'Pumili ng plan' section with Suki ₱299/mo (1 branch, 2 staff, 300 orders/mo), Negosyo ₱499/mo (Unlimited staff & orders, SMS, badged 'Pinaka-sulit', selected), and Empire ₱799/mo (Up to 3 branches, priority support); a 'PAANO MAGBAYAD' panel with GCash number 0917 000 0000 and Taglish instructions to send the exact amount then submit the reference number and screenshot; and a form with Halagang binayad 499, GCash reference no., a 'Screenshot ng resibo' file picker, and an 'I-submit ang payment' button.
Fig. 6Billing runs on manual GCash — a plan is selected, payment sent, then the reference number and screenshot submitted for confirmation.
Pressed leaf — what it taught
Splitting the tracking surface out as a token-keyed public route, rather than bolting login onto a customer-facing page, kept the core loop honest to how a paper stub actually works. Multi-tenant RLS gated on shop_id up front made the staff/HQ split straightforward later instead of a retrofit.