Row-level security on every table
Tenant isolation is enforced in Postgres, not in application code. Every tenant-scoped table carries RLS policies, and a runtime test suite queries as the authenticated role with forged JWT claims to prove a tenant cannot read another's rows.
Card data never touches us
Payments go through Stripe. Card numbers are entered into Stripe's own elements and we store a token, so the PCI surface stays with the processor.
Role-based access
Six roles out of the box — Owner, Admin, Dispatcher, Salesperson, Technician, Viewer — with thirteen distinct permissions, enforced server-side and again at the database.
Encrypted in transit and at rest
HSTS, a strict content-security policy, and Postgres storage managed by Supabase with encryption at rest.
Signed webhooks and scoped API keys
Outbound webhooks are HMAC-signed. Public API keys are minted per workspace, rate-limited, and revocable.
Audit log
Material changes are written to an activity log per workspace, readable from Reports.