A dedicated database, not a shared table
Database-per-tenant isolation
Every company that signs up gets its own PostgreSQL database — not a row in a shared table filtered by a tenant ID. A bug in query logic in one workspace cannot leak rows from another, because there is no shared table for it to leak from.
Uploaded files are isolated too
Per-tenant file storage
Documents, logos, and attachments are stored under a path prefixed with your workspace slug and served through an authenticated view — not a raw static file alias. Sensitive files (employee documents, HR attachments) require login; only a small public set (logos, payment QR codes) is served without one.
Encrypted in transit, everywhere
HTTPS enforced, HSTS on
Plain HTTP requests are redirected to HTTPS site-wide, session and CSRF cookies are marked secure-only, and HSTS is enabled so browsers remember to use HTTPS on repeat visits.
Role-based access, with an audit trail
Granular permissions
Every module and admin action is gated by role — HR, accounting, and system settings are separately permissioned, not all-or-nothing. Staff actions on the control plane (plan changes, tenant edits) are written to an audit log.