MVP principle: ship fast, validate, then invest
Cut everything that doesn't get a job from created to invoiced. That loop — Dispatcher creates job → Tech completes it in the field → Invoice sent — is the entire MVP. Every feature outside that loop is Phase 2.
Zero-cost stack — what changes and why
Frontend & calendar
FullCalendar Pro ($400/yr)
FullCalendar CommunityFree
Includes Month + Week views. Timeline (Gantt) view is Pro-only — use Week view with tech rows as a free Gantt substitute for MVP.
Custom component library
shadcn/ui + TailwindFree
Copy-paste components, zero licence. Fastest way to professional UI.
Backend & database
Railway Starter ($20/mo)
Supabase Edge FunctionsFree
Runs server logic inside Supabase — no separate API host needed for MVP. 500k invocations/mo free.
Supabase Pro ($25/mo)
Supabase Free tierFree
500MB DB, 1GB storage, 50k MAU, Realtime included. More than enough for beta with 10–50 companies.
Mobile
EAS Build ($99/yr Apple fee still applies)
Expo Go (beta) → EAS free tierFree
Beta testers run via Expo Go — no app store needed. EAS free tier gives 30 builds/mo when you need APK/IPA for real devices without store submission.
WatermelonDB (complex setup)
AsyncStorage + queueFree
Simpler offline-first: cache current jobs in AsyncStorage, queue writes, sync on reconnect. Good enough for MVP; migrate to WatermelonDB at scale.
Payments & comms
Stripe Terminal (tap-to-pay)
Stripe payment linksFree to integrate
Tech shares a payment URL via SMS/email. No hardware. Stripe charges 2.9%+30¢ per transaction — zero setup cost.
Twilio SMS ($4–20/mo)
Resend (email) + Twilio trialFree
Resend: 3k emails/mo free. Twilio trial gives ~$15 credit — enough for 1,000+ SMS to validate the ETA notification feature.
MVP scope — in vs. out
In MVP (builds the core loop)
Dispatcher web app — Job creation wizard
Dispatch board — Month + Week calendar views
Drag-drop reassign + reschedule (Week view)
Status colours + event indicators (urgent, SA, time-off)
3-tier Customer CRM (Head Office → Billing → Service)
Team + Certifications module
Mobile field view — all 9 sections
Photo capture + annotation
Customer e-signature
Basic invoice generation + Stripe payment link
Offline job caching (AsyncStorage)
ETA email notification (Resend)
Role-based access (Admin, Dispatcher, Technician)
Post-MVP (Phase 2 — after first paying customers)
QuickBooks sync
Gantt timeline view (FullCalendar Pro)
Stripe tap-to-pay hardware
Service Agreements / PM contracts
Dynamic form builder (admin UI)
Advanced BI dashboards
AI routing suggestions
App Store submission (use Expo Go for beta)
Twilio SMS (use email for MVP)
Timecard payroll approval flow
Custom report builder
Build phases — 10 weeks total (click to expand)
1
Project setup + auth + database
Week 1 · ~3–4 days
Create Supabase project, define all tables + RLS
Vite + React + TypeScript + Tailwind + shadcn/ui boilerplate
Supabase Auth (email/password), session management
Role enum: ADMIN, DISPATCHER, TECHNICIAN — stored on profiles table
Expo project init, Supabase JS client wired up in mobile
Vercel deploy hooked to GitHub — preview URL on every PR
End of Week 1: login screen works on web and in Expo Go on a real phone. Schema is frozen — no structural changes after this point without a migration.
2
Customers + Team modules
Week 2 · ~4–5 days
3-tier customer CRUD: head_office → billing_location → service_location
Customer search (Postgres ilike + trigram index) with debounced UI
Equipment records per service location (model, S/N, install date)
Team CRUD: name, role, team, email, mobile, active toggle
Certifications sub-section: active / expired, issuer, expiry date
Employee search with same pattern
Both modules are pure CRUD — fast to build. Build them first so jobs can reference real customers and real technicians.
3
Jobs + Dispatch board (web)
Weeks 3–5 · ~10–12 days
Job creation: 5-step wizard (customer → location → equipment → schedule → assign)
Job card: all fields from WorkflowOS spec (complaint, symptoms, priority, access notes)
FullCalendar Community: Month view with status-coloured blocks
Event indicators: dot overlays for urgent, SA job, time-off (hatched CSS), NFPA deficiency
Week view: technicians as resource rows — acts as free Gantt substitute
Drag-drop reschedule + reassign (FullCalendar Community supports this)
Unassigned jobs panel (left sidebar)
Supabase Realtime: board updates live when tech changes status on mobile
Status legend popup (matching competitor screenshot exactly)
Day / Week / Month toggle in toolbar
FullCalendar Community's resourceTimeGrid plugin is free and gives technician-row Week view with drag-drop. That's the Gantt substitute — dispatchers won't miss the Pro timeline view on an MVP.
4
Mobile technician app — all 9 field sections
Weeks 6–8 · ~12–14 days
Job list screen: today's assigned jobs, status pills, Navigate CTA (deep-link to Maps)
§1 Status flow: Assigned → Driving → On-site → Working → Awaiting Parts → Complete
§2 Customer & access: account name, contact, access instructions, priority flag
§3 Equipment: S/N, model, install date, warranty status, last service note
§4 Diagnostic readings: job-type-driven numeric fields (PSI, °F, etc.) from JSONB template
§5 Tasks checklist: tick-off items from job type template, with notes per item
§6 Parts & labour: pricebook lookup, line items, qty, running total
§7 Photos: before / nameplate / after, Expo Camera, compress + upload to Supabase Storage
§8 Work summary: free text, voice-to-text via Expo Speech, visible on sign-off sheet
§9 Customer sign-off: signature pad, cost summary, "Submit to office" button
Offline: AsyncStorage caches job data, queues status + form writes, syncs on reconnect
Dark mode, large pill buttons, thumb-friendly layout throughout
This is the longest phase. Build one section per day — each is self-contained. Test on a real device daily, not just the simulator. Glove-friendly tap targets (min 48px) from day one.
5
Invoicing + Stripe payment link
Week 9 · ~4–5 days
Auto-generate invoice from completed job (parts + labour line items pre-filled)
Flat-rate pricebook: categories, items, labour codes (admin-managed)
Stripe Checkout: create payment session via Supabase Edge Function, send link by email
Webhook: Stripe → Supabase marks invoice as paid on payment confirmation
PDF invoice export (pdf-lib, free) — downloadable from web + emailed to customer
ETA email: Resend sends "Tech is on the way" when status → Driving
Stripe's free integration + Resend's free tier closes the revenue loop at zero cost. Stripe takes their standard transaction fee only when a customer actually pays.
6
QA, polish + beta launch
Week 10 · ~5 days
End-to-end test: full job lifecycle from creation to payment on real devices
Cross-browser check: Chrome, Safari, Firefox for web app
iOS + Android real device testing via Expo Go (send QR to beta testers)
Onboarding flow: create org, invite team members, import customers (CSV)
Basic Reports tab: revenue this month, unpaid invoices, open jobs count
Seed 2–3 beta companies with real data, run a live dispatch day with their team
Don't aim for perfection — aim for one real company running their entire day through JobFlow without switching to another tool. That's the MVP definition of done.
10-week timeline
W1
W2
W3–5
W6–8
W9
W10
Setup CRM Dispatch board Mobile field app Billing QA + beta
Total infrastructure cost
ServiceFree tier coversMonthly
Supabase Free500MB DB, 1GB storage, 50k MAU, Realtime, Edge Functions$0
Vercel FreeWeb app hosting, unlimited preview deploys$0
Expo / EAS FreeExpo Go for beta, 30 builds/mo for APK/IPA distribution$0
Resend Free3,000 emails/mo — ETA notifications, invoices$0
StripeNo monthly fee — 2.9%+30¢ per transaction only when paid$0
FullCalendar CommunityMonth + Week views, drag-drop, resource rows$0
GitHubPrivate repos, Actions CI (2,000 min/mo)$0
Twilio trial credit~$15 one-time — enough to test SMS feature end-to-end$0
Total for MVPScales to paying plan only when you have paying customers$0/mo
Who builds it
Solo developer — 10 weeks
Works if developer is comfortable with React, React Native, and Postgres
Web + mobile in same codebase (shared types, shared Supabase client)
Risk: mobile phase (W6–8) is the hardest solo — plan for 1 buffer week
Two developers — 6–7 weeks
Dev A: web app (Phases 1–3, 5–6)
Dev B: mobile app (Phases 1, 4 in parallel with Phase 3)
Week 1 shared: schema + auth. Then diverge. Merge in Week 9 for billing.