Each org member holds one role. Owner, admin, member, and viewer sit on a strict hierarchy (owner > admin > member > viewer). Billing and executive are orthogonal personas — billing sees only invoices and cost rollups; executive is read-only across data, cost, and billing.
| Capability | owner | admin | member | viewer | billing | executive |
|---|---|---|---|---|---|---|
Manage organization Rename org, set billing email, delete org. | ● | ○ | ○ | ○ | ○ | ○ |
Manage members & invites Invite, change roles, remove members. | ● | ● | ○ | ○ | ○ | ○ |
Manage API keys Issue and disable proxy bearer tokens. | ● | ● | ○ | ○ | ○ | ○ |
Manage tag rules Create and delete server-side tagging rules. | ● | ● | ○ | ○ | ○ | ○ |
Manage budgets Set and remove spend budgets. | ● | ● | ○ | ○ | ○ | ○ |
Manage ROI settings Configure value-per-token calculations. | ● | ● | ○ | ○ | ○ | ○ |
View usage & analytics Access overview, usage breakdowns, tag analytics. | ● | ● | ● | ● | ○ | ● |
View billing See invoices and billing email (Stripe wiring TBD). | ● | ○ | ○ | ○ | ● | ● |
View cost & ROI See cost dashboards, budgets, ROI rollups. | ● | ● | ● | ● | ● | ● |
Server-side enforcement lives in apps/api-backend/internal/auth/rbac.go — this matrix is a faithful mirror; the API will 403 if the UI ever drifts.