G
Skip to main content

Permissions & Feature Flags

TheGarageOS has two complementary access systems — feature flags (workspace → subscription) and role permissions (user → role). Together they decide what each user sees and what they can do.

Feature flags

Every feature in the platform is either:

  • A parent — an organizational umbrella (Jobs, CRM, Inventory, …).
  • A child — an actual gatable, sellable module (Jobs Core, Quotations, Inventory Vendor Management, …).

Each child feature is independently toggleable, globally and per-tenant, with real-time cache invalidation (changes propagate to running services in under a second, with zero DB hits on the request hot path).

In the UI, disabled features are hidden from the navigation and return 402 Payment Required from the API.

Where they show up

  • Sidebar — nav groups disappear when their feature is disabled.
  • Dashboard — widgets appear only if the relevant feature is on AND the user has read permission.
  • API — endpoints reject requests for disabled features.

This is also the pricing / packaging mechanism — different subscription tiers enable different feature sets.

Role permissions

Every user has exactly one role. Every role has a set of permissions.

A permission is a triple:

feature_slug :: sub_feature :: action

For example:

PermissionWhat it allows
inventory_vendor_management :: vendors :: readView the vendors list.
inventory_vendor_management :: vendors :: writeCreate, update, deactivate vendors.
crm_customer :: customers :: writeCreate and update customers.
jobs_core :: jobs :: readView jobs.
jobs_core :: jobs :: writeCreate and update jobs.
jobs_core :: jobs :: transitionTransition job status (FSM).
jobs_payments :: payments :: recordRecord a payment against a job.
user_management :: users :: inviteInvite new users.
role_management :: roles :: writeCreate / update / delete custom roles.

System roles

The platform ships six immutable system roles:

RoleDescription
ownerFull access. Only owner can deactivate workspace.
adminFull access except workspace deactivation.
managerOperational + reporting access.
staffDay-to-day operations (CRUD without admin).
mechanicBay floor + assigned jobs.
viewerRead-only.

System roles are immutable — you cannot delete or rename them, but you can use them as templates when building custom roles.

Custom roles

Build your own roles with exactly the permissions you need. Bulk permission assignment is supported via a permission matrix.

Custom roles can be deleted, but only if no active user holds the role.

Self-protection

A few invariants the system enforces for you:

  • You cannot change your own role (prevents lock-out).
  • You cannot deactivate yourself (prevents lock-out).
  • Only the owner can deactivate the workspace.
  • An owner cannot be deactivated by anyone (the owner must transfer ownership first, or use the dedicated transfer flow).

Tips

  • Start with system roles — most shops fit with owner / admin / mechanic / viewer.
  • Custom roles grow with you — when a service advisor needs invoice-write but not job-transition, build them a role.
  • Permissions are server-enforced — the UI may hide buttons for cleaner UX, but the backend is the source of truth.

See Settings & Branding for how to configure users and roles in the app.