Agency Accounts
An agency is a team whose children are client workspaces. One subscription, one credit pool, isolated projects.
How it resolves
Every client team has a billingRoot() — itself, or its parent agency. Credits,
plan limits and features all resolve through it, so:
- A client workspace inherits the agency's plan
- Generations in a client workspace spend the agency's credits
- The agency owner reaches every client without being enrolled as a member of each one
That last point is what makes the layer usable at scale. Managing fifty client workspaces through fifty membership rows is not a workflow.
Turning it on
Agency features are plan-gated (features.agency). With a qualifying plan:
Workspace → Enable agency features, then New client workspace per client.
If you supply a client contact email and that person already has an account, they get admin access to their own workspace and nothing else.
Roles
| Role | Can |
|---|---|
| Owner | Everything, including billing and deletion |
| Admin | Members, projects, domains, API keys |
| Member | Create and edit projects, generate, publish |
| Viewer | Read only |
Billing always belongs to the paying team. A client workspace owner manages nothing financial — the agency does.
Limits
limits.sub_teams caps client workspaces per plan, on top of a hard ceiling in
config('loom.teams.max_sub_teams_hard_cap') that protects the host regardless.