This page lists every permission seeded into a workspace and shows which of the six default roles holds it. Use it as the reference when configuring custom roles or auditing access.
Workspace-scoped. Roles and their permission grants live per workspace (per companyId). Every seeded workspace gets its own copy of the six default roles, and every tenant query is scoped to the workspace by a tenant guard, so a permission grant in one workspace never leaks into another. The platform operator manages workspaces from a separate /operator console that does not use this matrix at all.
Grants, not hard-coding. A user's effective permissions are the union of the grants on every role assigned to them. Endpoints are protected with a permissions decorator, and the guard checks that the caller actually holds the required permission — there is no implicit Super Admin bypass. Super Admin can do everything only because it is seeded with the full permission set.
Editable. The matrix below is the seeded default. Admins with roles.manage can add or remove any grant on any role (system roles included) from the access-control screen, so a live workspace may differ from what is shown here.
Country packs affect which permissions matter
Payroll, tax, and statutory rules follow the workspace's country pack, so some financial permissions only do something under certain packs. For example tax.configure / tax.certificates drive income-tax handling for a pack that has income tax (such as the Pakistan pack), but carry no tax logic under a pack with no income tax (such as the UAE pack). The permission still exists everywhere; the behaviour behind it is pack-dependent.
Legend: SA = Super Admin, HRM = HR Manager, HRO = HR Officer, ACC = Accountant, DH = Department Head, EMP = Employee.
The employment-agreement portal endpoints (GET /api/contracts/portal/my-contract and POST /api/contracts/portal/my-contract/accept) do not require any of the permissions above. They authorize solely on the authenticated user being linked to an employee record, so an employee can only ever read or accept their own contract regardless of role.
Recruitment permissions are seeded to Super Admin only by default. Grant them to HR roles (or a custom role) from the access-control screen when you roll the module out.
Permission
Description
SA
HRM
HRO
ACC
DH
EMP
recruitment.manage
Manage jobs, postings, candidates, applications, interviews, offers, convert to employee
✅
❌
❌
❌
❌
❌
recruitment.interview
Submit interview feedback (participant gate enforced in the service)
✅
❌
❌
❌
❌
❌
recruitment.view
Read openings, candidates, applications (no edits)
Configure the performance module (settings, scorecard profiles, any task); override daily-report AI verdicts; triage AI-flagged reviews and void scores; link integration identities
✅
✅
❌
❌
❌
❌
performance.review
Assign and grade tasks. Team-scoped on its own: reaches only the holder's direct reports; combined with performance.manage or performance.view_all it becomes company-wide. Recurring task schedules always require the company-wide combination
The employee portal reads a user's own data through the view_own / *_own permissions (for example employees.view_own, attendance.view_own, leave.view_own, payroll.salary_view_own, salary_slips.view_own, loans.view_own, hr_letters.view_own, assets.view_own, expenses.submit_own, performance.view_own). These are granted to every default role, and the endpoints resolve the employee from the JWT — so a user can only ever reach their own records. The employment-agreement portal endpoints (see the Contracts note above) bypass the matrix entirely and authorize on the linked employee record.
The six default roles are seeded per workspace with these grant counts (out of 112 total permissions). Super Admin holds all of them.
Role
Default permissions
Super Admin
112
HR Manager
92
Accountant
50
HR Officer
50
Department Head
33
Employee
23
info
This matrix reflects the default grants at workspace creation. Admins with roles.manage can change any role's permissions at any time; users must re-login to pick up a changed grant. See Custom roles and Default roles for more.