4WordTechConsole

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.

IndustryContacts are calledAdds
BarbershopsclientsChairs, walk-in queue, barber profileslive
CateringcustomersMenus, events, headcountsplanned
EducationstudentsCohorts, sessions, enrolmentplanned
ChurchesmembersMinistries, volunteers, rotasplanned

How a tenant is isolated

  1. 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.

  2. 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.

  3. 03

    Keys make it unrepresentable

    Foreign keys carry the tenant id, so a row that points across the boundary cannot be written at all.