Skip to Content

RBAC & impersonation

Active Reach uses role-based access control (RBAC) to manage who can do what within an organization, a workspace, and (since the 2026-05 location-scoped permissions phase) a specific outlet.

Role hierarchy

RoleScopeCapabilities
OwnerOrganizationFull access — billing, team, settings, all workspaces
AdminOrganization or workspaceEverything except billing and deletion
MemberWorkspaceCreate/edit campaigns, segments, journeys. Cannot manage team or settings.
ViewerWorkspaceRead-only access to analytics and campaign results
CustomWorkspace or org unitGranular permissions defined by the admin

Permission categories

CategoryPermissions
campaignscreate, edit, send, approve, delete
journeyscreate, edit, publish, pause, delete
contactsread, create, edit, delete, export
segmentscreate, edit, delete
analyticsread, export
settingsview, edit, manage_channels, manage_billing
teaminvite, remove, assign_roles
adscreate, manage_budgets, approve_spend

Custom roles

Create custom roles at Settings → Team → Roles → Create Role:

  1. Name the role
  2. Toggle individual permissions on/off
  3. Scope to a specific org unit (optional — for multi-workspace orgs)
  4. Save and assign to team members

Permission checks

The platform enforces RBAC at:

  • UI level — buttons and pages are hidden/disabled based on the user’s permissions
  • API level — every API endpoint checks the requesting user’s permissions; unauthorized requests return 403
  • Server Action level — Next.js server actions verify permissions before executing

Location-scoped permissions

A user can be granted access at three scopes — org, workspace, or a specific location (outlet). The resolver UNIONs across all three. The relevant substrate (control-plane):

TableWhat it stores
user_org_accessOrg-tier role binding (cascades to all workspaces / locations)
user_location_accessDirect location-tier role binding (one row per user × location)
location_group_role_bindingsRole binding for a named group of locations

user_location_access is backfilled from user_org_access on first use so existing org-tier grants keep working under the new model.

The location middleware reads the user’s bindings and stamps a resolved (workspace_id, location_id) pair onto every request. Outlet-scoped endpoints then validate against the resolved pair. Final permissions are the union of: org-tier cascade + direct location bindings + location-group bindings.

For developers shipping new endpoints: outlet-scoped writes must validate the resolved location_id against the user’s binding set before mutating data.

Impersonation

Admin and agency impersonation uses a separate auth layer:

  • A short-lived aegis_sim_token cookie is set when impersonation starts
  • All actions during impersonation are logged with the impersonator’s identity
  • Sessions expire automatically (configurable timeout)
  • Full details in Impersonation

API access

RBAC for API consumers:

  • SDK write keys — scoped to a workspace, can only send events (no admin access)
  • Clerk JWT — carries the user’s org ID and role claims; validated by the gateway
  • Internal API secret — service-to-service only, not exposed to tenants

What’s next