Roles and permissions

The permission model in detail, and how to design roles for your shop.

Every staff account carries one role, and a role is a set of permissions.

Which permissions are enforced on the server

Nine are checked server-side today, and a request without one is refused with a 403 naming the permission:

pos.refund · pos.discount · inventory.adjust · inventory.stocktake · inventory.transfer · invoicing.send · invoicing.payments · marketing.send · settings.access_levels

The rest of the matrix currently shapes what the interface offers rather than being enforced at the API. Treat those as an organising tool, not as a security boundary — the real boundaries are company tenancy, store assignment on store-scoped requests, and the PIN gate.

The roles

RoleWhat it is
staffCounter staff. Sell and look things up.
supervisorRuns a shift. Refunds, discounts, the register, stock.
adminRuns the business. Everything, always.
superadminPlatform role. Not a tenant role.

What each role can do by default

A new company starts with this matrix. staff gets:

  • Point of Sale — process sales, hold sales, view products
  • View-only access to Inventory, Invoicing, CRM, Repairs and the Dashboard

supervisor adds:

  • Point of Sale — refunds, discounts, price overrides, voids, opening and closing the register, and POS reports
  • Inventory — adjustments, transfers and stocktakes
  • Invoicing — create, send and take payments
  • CRM — edit customers
  • Repairs — create and update tickets
  • Marketing — view
  • Settings — products, targets and receipts

admin holds every permission. That is not a default you can edit away — see below.

Settings — Access Levels
Staff
Supervisor
Admin
Point of Sale
POS-001Process sales
POS-002Hold / park sales
POS-003Process refunds
POS-004Apply discounts
POS-005Override a price
POS-008Open / close register
The permission matrix, showing the Point of Sale group. Every permission carries a short codePOS-003is "Process refunds" — which is the quickest way to be precise about one in a support conversation. The admin column is switched on and disabled: admin always holds every permission, because the matrix is edited by admins and a save that could strip their own rights would lock them out of this very screen. Toggles shown are the shipped defaults. Source: SettingsModule.tsx, PERMISSION_CODES / PERMISSION_LABELS / DEFAULT_ROLE_PERMISSIONS in pos/types.ts.

Editing the matrix

Only the staff and supervisor columns are editable. The admin column is fixed at full access on purpose: the matrix is edited by admins, so a save that could strip admin rights would lock every admin out of the screen needed to undo it.

An empty matrix is a real setting

A company can deliberately grant staff and supervisors nothing at all. Because admin's full row set is always written alongside, that choice is stored and honoured rather than being mistaken for "this company has never customised its permissions" and silently reset to the defaults.

Permission names and codes

Every permission has a short code as well as a name — POS-003 is "Process refunds", INV-002 is stock adjustments. The code is shown beside the permission on the Access Levels screen and is the least ambiguous way to refer to one.

Permissions are grouped by area — pos.*, inventory.*, invoicing.*, crm.*, repairs.*, marketing.*, dashboard.* and settings.*. The ones that come up most often at the counter:

PermissionAllowsstaffsupervisor
pos.sellProcess salesYesYes
pos.holdHold / park salesYesYes
pos.view_productsSee the product listYesYes
pos.refundProcess refundsNoYes
pos.discountApply discountsNoYes
pos.price_overrideOverride a priceNoYes
pos.voidVoid a saleNoYes
pos.open_close_registerOpen / close the tillNoYes
pos.view_reportsPOS reportingNoYes

Roles are not the only gate

Two further checks sit alongside permissions. Staff are restricted to the store locations they are assigned to, on reads as well as on changes; owners and admins reach every shop. And a number of actions additionally require a staff PIN at the moment they are performed.

Still stuck? We answer every message.Contact support