Roles and permissions

A role is a named set of permissions, assigned to members of a workspace. The vocabulary is deliberately small: thirteen domains, two verbs.

Two verbs

Every permission is Resource__Read or Resource__Write. There is no "manage" and no "execute".

__Write implies __Read for the same domain, so a role never needs to list both.

Two domains carry only one of the two verbs, because the other would have nothing to govern: Activity has no write half (nothing may edit an audit trail) and Flow Access has no read half (reading flows is already workspace-wide).

The domains

DomainCovers
FlowFlows, versions, draft files, static assets, shares, libraries, publishing, flow folders
Flow AccessEditing, sharing and deleting any flow in the workspace — not just your own. Write only
DeploymentDeployments, their input config, their granted permissions, deployment folders
TriggerWebhooks, schedules, event sources, trigger bindings, recorded events and their payloads
ExecutionExecutions, logs, results, payloads — and every route that starts, replays, cancels, resumes, releases or discards a run
DataStoreStores, columns, records, lookups
ConnectionConnections, the OAuth2 flow, reconnect
ServiceWorkspace service definitions (platform services are read-only for everyone)
WorkspaceVariableWorkspace environment variables
MemberMembers, invitations, role and ownership changes
RoleRoles and their permission sets
WorkspaceWorkspace settings and the activity dashboard
ActivityThe audit trail — read-only, no write half

A permission covers a domain, not a table. Flow__Read covers the flow, its versions, its draft files, its shares and its libraries, because those are all "the flow" to the person ticking the box.

Three independent checks

A request has to clear all three. None substitutes for another:

CheckQuestion
PermissionMay this caller do this kind of thing at all?
TenancyIs this row in a workspace they belong to?
Object accessIs this particular flow one they may see or edit?

So Flow__Read decides whether you may read flows — all of them, workspace-wide — and Flow__Write plus a share decides which ones you may change. Granting the permission does not widen what a share allows, and a share does not substitute for the permission.

Deployments, executions, webhooks and schedules inherit the flow's verdict rather than computing their own — for reading and for editing alike.

Editing every flow without owning the workspace

FlowAccess__Write is the grant for a lead developer or an on-call engineer: it gives the flow author's standing on every flow in the workspace, so they can edit, publish, share and delete one they never wrote and were never shared.

It is the only permission that answers "which flows" rather than "what kind of thing", and it exists because the alternatives were both bad: making that person a workspace owner also hands them billing, the member list and the role editor, while sharing every flow with them is one write per flow that goes stale as soon as somebody writes another.

Ticking it implies Flow__Write, so the box is enough on its own. What it does not widen:

Roles this makes possible

RolePermissionsWhat it cannot do
Operator / on-callDeployment__Read, Execution__Write, Trigger__ReadEdit source, publish, or repoint an ingress URL
Developer, no productionFlow__Write, Execution__ReadStart a run, release held deliveries, change a deployment
Lead developerFlowAccess__Write, Execution__ReadChange a deployment, touch billing, invite members, or edit roles
IntegratorTrigger__Write, Deployment__Read, Connection__WriteRead run payloads, edit flow source
AuditorActivity__Read, Execution__Read, Member__ReadWrite anything at all
SupportExecution__Read, Flow__Read, DataStore__ReadSee connections, variables or the member list

What a role does not affect

Owners. A workspace owner bypasses every check; assigning them a role changes nothing.

The navigation. The app hides sections whose list route the caller cannot read, so a narrow role sees a shorter sidebar rather than a menu of error pages. That is presentation — the gate is enforced on the API regardless.

Deployments have permissions too

A deployment runs as its own machine identity with its own granted permissions, set on the deployment rather than inherited from whoever deployed it. A flow can be allowed to read executions while being unable to create deployments.

This is why repointing a deployment at a different version is permission-checked: new code will act with that identity's authority, so whoever repoints it must hold everything the identity holds. See Versions and rollout.

Next