Organizations
An organization is one workspace boundary for data, context, integrations, runs, members, and credits.
Every table, row, run, integration, wiki page, member, and credit belongs to exactly one organization, and each org's data sits in its own tenant database schema. Nothing crosses that line except a billing link (below).
Projects
Within an org, tables and workflows can be grouped into projects. The default project is general.
oxygen projects list --json
oxygen projects create "Outbound Q1" --json
oxygen projects rename outbound-q1 --name "Pipeline Q1" --json
oxygen projects delete pipeline-q1 --json # dry-run preview
oxygen projects delete pipeline-q1 --live --confirm --expected-table-ids "<table-id-1>,<table-id-2>" --jsonA project is a grouping for navigation, not a separate billing or permission boundary. Rename changes its name and slug without renaming the physical database schema. Deleting a folder also deletes its tables: they disappear from normal listings immediately and enter the standard 14-day recovery period. You do not need to move them first. Restoring a table also restores its folder. CRM-backed tables remain protected, and the default general project cannot be renamed or deleted.
A bare delete previews every affected table without changing anything. For a nonempty folder, copy those table IDs into --expected-table-ids when confirming with --live --confirm. Changed folder contents require a fresh preview. Empty folders need only --live --confirm. The web confirmation handles the table IDs for you and lists the affected tables before deletion.
Projects also carry workspace tags: oxygen projects tag <project> --tags <csv>.
Each project is tinted in the Tables rail so folders are distinguishable at a glance. The colour is assigned automatically from the workspace's project order; set your own with oxygen projects color <project> --color <name> (gray means no tint), and --color auto restores the automatic one.
Switching orgs
oxygen orgs list --json
oxygen orgs use <slug>
oxygen whoami --jsonoxygen whoami returns the active org with its plan_tier, entitled, shared_billing, billing_owner_organization_id, and monthly_credit_cap, plus your membership and the API key in use. --summary-json prints the same identity with no credential-shaped fields, for health probes and logs.
Multi-org users
Agencies typically use one org per client. Org switching is per CLI profile or MCP session, so check the active org before importing client data or running paid work.
If an MCP client returns organization_selection_required, ask it to call oxygen_orgs_list and then oxygen_orgs_select for the intended workspace.
Billing ownership
Each org owns its own credit balance by default. A workspace with no plan of its own can be covered by a plan you already pay for in another org instead of buying a second subscription.
oxygen orgs billing-owners --json # which of your orgs may pay, and why the rest may not
oxygen orgs billing-link --owner <org> --json # omit --owner when exactly one is eligible
oxygen orgs billing-link --owner <org> --monthly-credit-cap 50000 --json
oxygen orgs billing-unlink --jsonCredit billing moves; data access does not — a billing owner gains no read of the linked workspace. billing-link targets the active org unless you pass --organization. Omitting --monthly-credit-cap leaves any existing cap untouched rather than clearing it.
Linking needs admin in both organizations, and the workspace being linked must not already have its own subscription.
Everything a plan unlocks resolves through the billing owner. A linked workspace passes the paid-plan gates (connecting a sending mailbox, LinkedIn account, or WhatsApp number, dispatching, publishing) on the owner's plan, and it connects senders against the owner's sending seats: a LinkedIn account or WhatsApp number is a $30/month seat, a phone number $10/month, a bring-your-own mailbox $1/month, billed in dollars on the owner's seat subscription. Seats are bought on the owner — oxygen billing seats set inside a linked workspace is refused with shared_billing — and oxygen billing seats --json run from either workspace reports the owner's purchased and grandfathered capacity. A refusal such as "Connecting a sending account requires a paid plan." on a workspace with no plan of its own names the organization you already pay for and the exact billing-link command; run it as an admin of both and connect again.
Members
oxygen orgs member-role <email> --role admin|member # admin onlyInviting people is still done in workspace settings; this only moves an existing member between the two workspace roles. Demote an admin to member before granting them the restricted client role — an admin's role overrides the restriction.
Related
- Workspace context — what to put in your org once it's created.
- Billing — credit balance and subscription per org.