Multi-tenant application platform
Build the capability once. Configure it for many.
A barbershop booking clients and a church scheduling volunteers are the same problem wearing different words. 4Word runs both from one codebase — one deployment, one database, and a tenant boundary the database itself enforces.
- One deployment
- serving every tenant
- Row-level security
- isolation in the database
- Per-tenant config
- not per-tenant code
Shared by everyone
These are written once and inherited by every vertical. A new industry does not reimplement them; it configures them.
Scheduling
Availability rules, exceptions, and DST-correct slot generation. Double-booking is prevented by a database exclusion constraint, not a check-then-insert race.
Contacts
One record per person per tenant. Each vertical decides what to call them — clients, guests, students, members — without a fork.
Staff & roles
Membership, permissions, and an audit trail the tenant can read themselves, rather than a support ticket and a log search.
Branding
Colours, logo, and vocabulary per tenant, injected as CSS variables. Text colours are computed for contrast, so a tenant picks colours and never colour pairs.
Different by industry
A vertical adds only what is genuinely its own — and renames what everyone already has. The row below is the whole difference between a barbershop and a church.
| Industry | Contacts are called | Adds | |
|---|---|---|---|
| Barbershops | clients | Chairs, walk-in queue, barber profiles | live |
| Catering | customers | Menus, events, headcounts | planned |
| Education | students | Cohorts, sessions, enrolment | planned |
| Churches | members | Ministries, volunteers, rotas | planned |
How a tenant is isolated
- 01
The hostname decides
Every request resolves its tenant from the host, validated in one place. An unknown host gets nothing — never a default tenant.
- 02
The database enforces it
Every table carries a row-level security policy and FORCE RLS. Delete every WHERE clause in the application and a tenant still cannot read another tenant.
- 03
Keys make it unrepresentable
Foreign keys carry the tenant id, so a row that points across the boundary cannot be written at all.