Skip to Content

Permissions

Each role in a tenant holds a fixed set of permissions (see Roles). FlowState checks the permission on every request, in the web app, the API and MCP.


Tenant permissions

A permission applies only in the tenant where you hold the role. Holding tenant:notifications:audit:read in tenant A does not let you read tenant B’s audit log.

Settings and administration

PermissionSelf-scoped?Allows
tenant:settings:readNoRead tenant name, slug, tier, status, features map, region
tenant:settings:writeNoUpdate the tenant name and slug
tenant:members:readNoList all members with their roles and last-seen timestamps
tenant:members:inviteNoCreate, list, and revoke pending invites
tenant:members:removeNoRemove any member except the owner
tenant:members:role:writeNoChange a member’s role (never to or from owner)
tenant:grants:readNoRead each member’s MCP usage limits
tenant:grants:writeNoSet or remove a member’s MCP usage limits
tenant:keys:readNoList all API keys in the tenant (metadata only, no plaintext)
tenant:keys:read:selfYesList own API keys only
tenant:keys:writeNoCreate API keys, and revoke or rotate your own. With tenant:keys:read as well, revoke or rotate any key in the tenant
tenant:billing:readNoRead subscription status, usage summary, invoice list
tenant:billing:writeNoOpen the Stripe billing portal and start a subscription checkout for the tenant
tenant:transfer:ownerNoTransfer ownership to another member. Only the owner holds it
tenant:deleteNoDelete the tenant (restorable for 30 days). Only the owner holds it
tenant:features:readNoRead the tenant feature-flag map
tenant:features:writeNoTurn a feature on or off under Settings → Features. Turning a feature off keeps its data

Integrations

PermissionAllows
tenant:integrations:hubspot:connectConnect a new HubSpot integration or reconnect after token expiry
tenant:integrations:hubspot:disconnectDisconnect the HubSpot integration and delete the stored credentials
tenant:integrations:hubspot:readRead the integration status, HubSpot account id, granted scopes and connection time
tenant:integrations:slack:readRead the Slack integration status, connected workspace, and configured channels
tenant:integrations:slack:writeConnect, configure channels, set routing rules, and disconnect the Slack integration
tenant:integrations:apn:configureConnect, configure catalog (Sandbox/Production), and disconnect APN
tenant:integrations:apn:readRead APN integration status, partner account ID, catalog, and sync statistics

Deals, analysis and sync

PermissionAllows
tenant:hubspot:readCall HubSpot CRM and reporting APIs using the tenant’s stored credentials
tenant:deals:analyzeTrigger a pipeline refresh run; invoke AI deal analysis
tenant:deals:readRead precomputed deal snapshots, pipeline summaries, and deal details
tenant:deals:reanalyzeForce a fresh analysis of one deal
tenant:goals:readRead annual revenue and deal-count goals and rep quotas
tenant:goals:writeSet annual goals and per-rep quota targets
tenant:win-loss:readRead win/loss aggregations and trend analyses
tenant:win-loss:triggerStart a win/loss analysis over up to 48 months. At most one run per tenant every 15 minutes
tenant:slack:testSend a test message to the tenant’s configured Slack channel
tenant:apn:readRead APN sync state for all deals; list opportunities; read conflicts and errors
tenant:apn:sync:triggerTrigger manual syncs; retry failed syncs; resolve conflicts; accept/reject engagement invitations
tenant:marketplace:offers:readRead Marketplace private offers, their draft changesets and release status
tenant:marketplace:offers:writeCreate and amend DRAFT private offers. A released offer’s commercial terms can never be changed
tenant:marketplace:offers:releaseRelease a draft private offer to the buyer. Irreversible — kept separate from write for that reason
tenant:mcp:invokeUse the MCP server in this tenant. Without it, every MCP request, including listing the tools, is refused. Each tool also needs its own permission

Notifications

PermissionSelf-scoped?Allows
tenant:notifications:readNoSee which members of the tenant receive which notification categories
tenant:notifications:read:selfYesRead own global and per-tenant notification preferences
tenant:notifications:write:selfYesUpdate own notification preferences (enable/disable categories, per-tenant overrides)
tenant:notifications:audit:readNoRead the tenant’s audit log (Settings → Notifications → Audit) and its notification send log

Self-scoped permissions

A permission ending in :self works only on your own resources:

  • tenant:keys:read:self: your own API keys, not other members’ keys.
  • tenant:notifications:read:self: your own notification preferences.
  • tenant:notifications:write:self: changes to your own notification preferences.

A :self permission never gives access to another member’s resources. Owners and admins also hold the broader permissions, which cover their own resources too.