A per-account table of permission presets in two flavours: a built-in override that replaces one of the five standard roles for this account only, and a named custom preset anchored to a base role. The standard matrix remains the fallback for any role without an override.
Also called: custom permissions · edit role permissions · permission preset · our own roles
- 1Presets are stored per account and read through the account-scoped data proxy.
- 2A built-in override is flagged as such and names which standard role it replaces.
- 3resolveBuiltinPermissions() is the single read path for 'what does role X look like for this tenant'.
- 4Writes to the presets table are admin-only, enforced server-side as well as in the settings UI.
- 5Any role without an override falls back to the canonical matrix.
Post-frame builders don't run identically — one owner wants crew leaders approving time, another wants that with the office only. The module documents the two flavours precisely so the override case can never be confused with a new role: a built-in override is 'a tenant-specific replacement for one of the five hardcoded role presets', identified by its flag and the role it replaces. Making resolveBuiltinPermissions() the single read path is what stops a screen rendering the canonical matrix while the server enforces the tenant's override.
- Fixed roles never match every company's division of labour.
- Per-person checkboxes make 'who can see billing' a query rather than a glance.
- Two code paths reading permissions differently causes UI and server to disagree.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →