Skip to content
HRTEQDocs
Documentation API

DocsGet started

Roles and permissions

The nine staff roles, the read-all write-by-module matrix behind them, who may move an application into which stage, and who may override a blocking requirement.

The authorization model is three rules: read all, write by module, advance by owning role. Every officer can see every applicant and application, because the entire point of the platform is the handoff between officers. Writing is scoped to the module a role owns. Moving an application forward is limited to the role that owns the stage being entered.

Enforced on the server, every time. Permissions funnel through one function and are asserted inside the API route handlers. Hiding a button is presentation; it is never the control. Tenant isolation is enforced separately and independently at the database layer.

The nine roles#

Staff roles, their labels, and the modules each can write.
RoleLabelResponsibilityWrites
OWNEROwnerFull access including organization settings and subscription.Everything, including settings, user, automation and billing.
SYSTEM_ADMINSystem AdministratorFull data and user management. No subscription access.Everything the Owner can write except billing.
MARKETING_OFFICERMarketing OfficerGenerates applicants and promotes job opportunities.marketing fully; applicant, jobBoard, email, chat, task.
RECRUITMENT_OFFICERRecruitment OfficerOwns the recruitment lifecycle from sourcing to Employment Offer.applicant, jobOrder, application, interview, endorsement fully; principal, jobBoard, email, chat, task.
DOCUMENT_OFFICERDocument OfficerManages applicant files, compliance, and document control.document and govClearance fully; applicant, email, chat, task.
LIAISON_OFFICERLiaison OfficerGovernment agencies, embassies, clinics, visas, travel, airport coordination.liaison fully; govClearance, email, chat, task.
WELFARE_OFFICERWelfare OfficerDeployment readiness, PDOS, welfare, post-arrival support.welfare fully; email, chat, task.
ACCOUNTSAccountsCollections, employer billing, financial clearance, financial reporting.accounts fully; email, chat, task.
RECEPTIONISTReceptionist / Admin AssistantWalk-in applicants, reception, administrative assistance.applicant read and create only; chat, task.

“Fully” means create, read, update and delete. Where a module is listed without qualification the role has read, create and update but not delete.

What everyone can read#

Regardless of role, every staff member can read these modules. A Liaison Officer chasing a visa can look at the applicant’s screening notes without anyone granting them anything.

  • applicant, application, endorsement, interview
  • principal, jobOrder, jobBoard
  • document, govClearance, liaison, welfare
  • accounts, marketing, email, chat, task, report

Notably absent from that list: settings, user, billing, automation and audit. Those are administrator surfaces. report and audit are read-only even for an Owner.

Who can move an application#

Stage advancement is a separate check from module write permission, and both must pass. The rule is:

  • An Owner or System Administrator may move an application into any stage.
  • Any other staff member may move it only into a stage whose owningRole matches their own role.
  • A stage with no owning role is open to any staff member who can write applications.
  • Terminal stages are always open. Withdrawals, rejections and disqualifications come from anywhere in the process, so blocking them would strand records.

In practice this is what makes the seeded stage tree a workflow: Medical Examination is owned by the Liaison Officer, Document Processing by the Document Officer, Payment Status by Accounts. A recruitment officer cannot quietly walk an application through another officer’s stage.

One further constraint comes from the transition list itself: from any stage you may move to the immediate next active stage or to a terminal stage. You cannot skip three stages ahead. See Stage gates.

Overriding a blocking requirement#

Only OWNER and SYSTEM_ADMIN may override a blocking stage requirement, and an override is not a click. It needs a written reason of at least ten characters, the reason is stored, and the full set of unmet requirements is snapshotted onto the stage-history row as it was at the moment of the override.

The move is then recorded as application.stage_overridden rather than application.stage_advanced, which means overrides are countable and separable in the audit trail rather than blending into ordinary progress.

This is the number to watch. An agency with a rising override count is an agency whose configured requirements no longer match how it actually works. Treat the count as a signal to fix the stage configuration, not as a workflow.

The receptionist exception#

A receptionist can create an applicant but cannot update applicants generally. That would make walk-in intake unusable — a typo in a surname would need another officer. So there is one narrow exception: a receptionist may update an applicant record they created themselves. Anyone else’s record stays read-only to them.

Portal users are not in this matrix#

The staff matrix returns false for every non-staff user type. Applicant and employer portals have their own guards and their own payloads; they cannot reach staff modules by any path through this model.

What is not built yet#

No invites, no role assignment, no seat enforcement. The roles above are real and enforced. What does not exist is any way to *use* them from the product: there is no screen or endpoint to invite a staff member, change someone’s role, or deactivate them. Subscription.seats is stored and never checked. The assignable-role list and the seat-availability check are both written but unreferenced. Additional staff users currently come from a seeded or operator-provisioned database.

The audit trail already reserves the action names user.invited, user.role_changed and user.deactivated for when that arrives. Nothing emits them today.

Was this page helpful?