Roles and capabilities
Front desk, housekeeping, back office, manager, administrator — and under each role a catalogue of capabilities that reach down to the button, gated by the module the account has bought.
A role is a starting point, not a wall. Under each role sits a catalogue of capabilities — post a charge, void one, give a discount up to a ceiling, name a rate, pass a room, assign a room, change a vendor's bank, run the audit — and an administrator turns them on and off per login.
Where it is enforced
In the database. A route that forgets to check is still refused by the function it calls, because the function asks the same catalogue. The refusal is a sentence: "Only a supervisor may say a room is ready."
Gated by the module
A capability belongs to a module. A login in an account that has not bought housekeeping has no housekeeping capabilities to be given; the menu does not show the screen; the API refuses the route. A subscription is a fact the catalogue reads.
Team and access
Logins, roles, which hotels, and what each may do — on one screen for the account administrator, with an invitation flow that sets no password on our side.