Multi-Tenant SaaS Field Service Management — Built for small appliance repair companies
SimpleFieldPro is a multi-tenant SaaS application purpose-built for small appliance repair companies (1–10 employees). It covers the entire service lifecycle — from customer creation and job scheduling through parts tracking, estimates, invoicing, and payment — without the complexity or cost of enterprise platforms like Rossware or Walkabout.
Each repair company is an isolated tenant on its own subdomain (slug.app.com). Companies self-onboard at the root portal, and all business records are scoped to their company — enforced at both the query layer and the app layout. The architecture is Stripe-ready with manual payments in the MVP; live billing is Phase 2.
Modern full-stack TypeScript throughout — the same toolchain used in the HTS Client Portal, hardened further for multi-tenant isolation.
Tenant resolution is middleware-first — every request extracts the company slug from the hostname via
src/lib/tenant.ts
before any route handler runs. All Prisma queries receive a
companyId
filter so cross-tenant data leakage is structurally impossible, not just convention.
Every feature covers a real pain point in the daily operation of a small appliance repair shop.
The engineering decisions that make this more than a CRUD app.
Each company operates at its own subdomain. Tenant identity is resolved in middleware from the request hostname — before any route handler runs — and injected into the request context. All database queries are scoped to the resolved companyId. The app layout enforces that authenticated users can only access their own company's subdomain, preventing subdomain spoofing. Local dev runs on localhost with a single-host fallback when ROOT_DOMAIN is unset.
Jobs move through a carefully designed state machine spanning the full repair workflow: scheduled → in progress → diagnosis → waiting for parts → ready for return visit → complete → invoiced → paid. Each transition is intentional and drives which queues, dispatch views, and technician route entries a job appears in. Status is never a free-text field.
The technician route view is designed to be the only screen a field tech needs during their workday. It shows their ordered jobs with one-tap status updates, tap-to-call for customers, and direct links to open the address in Apple or Google Maps. All state changes from the route view write back to the shared job record in real time.
New repair companies sign up independently at the root portal. The signup flow creates the company record, the first owner account, and the full set of default communication templates in a single transaction — no admin intervention required. The company's subdomain is available immediately after signup.
Payment infrastructure is designed for Stripe from day one. The data model carries all fields needed for Stripe Customer, Payment Intent, and Subscription objects. Manual payment recording in the MVP uses the same code paths that live Stripe webhooks will update in Phase 2 — swapping in live keys activates billing without schema changes.
The repo ships everything needed to go to production: a multi-stage Dockerfile producing a thin standalone runtime, a docker-compose.yml with resource limits, a docker-entrypoint.sh that runs migrations on every start, GitHub Actions CI/CD to GHCR, a pg_dump backup drop-in, and a GET /healthz health check endpoint.
The MVP supports the complete real-world repair lifecycle from first contact to final payment.
The MVP is feature-complete. Phase 2 adds billing infrastructure and integrations.
Engineering skills and product thinking exercised in building SimpleFieldPro from scratch.
SimpleFieldPro shows what a focused SaaS MVP looks like when it's engineered to grow. If you have a field service, scheduling, or operations tool in mind — let's talk.