Billing & credits
What consumes credits, plan allowances, managed vs BYOK, and the credit lifecycle.
Oxygen uses one credit pool per organization. Managed enrichment, AI, infrastructure, and live workflow actions all draw from that pool. Prices vary by operation and are shown before live execution.
oxygen billing balance --json returns the available and reserved balance.
What consumes credits
| Work | What it draws |
|---|---|
| Managed enrichment or domain provider call (Oxygen's key) | Credits at the catalog price |
| AI column run on Oxygen's keys | Credits by model tier, plus web-search cost when enabled |
| The same provider or AI call on your own key (BYOK) | 0 credits |
| Live workflow steps, tool calls, row writes, retries | 0.01 credits per action |
| Sequence sends through your connected email accounts | 0 credits |
Reads, schema changes, dry_run / smoke_test | 0 credits |
BYOK calls still appear in the ledger as zero-credit byok_usage entries, so provider usage stays auditable even when Oxygen bills nothing:
oxygen billing usage --category byok --type byok_usage --json
oxygen billing audit --group-by category --jsonEvery ledger entry carries a category — managed_ai, managed_enrichment, managed_domain, managed_mailbox, or byok (plus free, subscription, and admin for grants) — so audit --group-by category splits managed spend from BYOK at a glance.
Workflow actions
Only live runs draw workflow-action credits; dry_run and smoke_test cost nothing. Actions are counted like this:
- Plain workflows: 1 action per step execution.
- Recipes: 1 action per run attempt, plus 1 per checkpoint the recipe code emits at runtime — every
ctx.tools.run,ctx.step,ctx.rows.upsert, or similar call. Loops multiply: a run that processes 100 items bills 100+ actions, regardless of how few steps the visual plan shows. - Bulk row writes (
rows_upsert): 1 action per row written, not per call. - Retries: a retried attempt bills its re-executed steps again (already-completed checkpoints replay free).
The number on the workflow page next to the schedule is a static minimum derived from the manifest. Trust the observed actions/run and the 30-day projection shown beside it (also in oxygen workflows get --json under usage.observed) — they come from your real run history.
The flat 0.01-credit action price is a capacity guard, not a second allowance or invoice meter. The workflow page and oxygen workflows get --json show observed actions per run so hot schedules remain predictable. For cadence guidance, see Triggers.
Plan allowances
| Plan | Price / mo | Credits / mo | BYOK |
|---|---|---|---|
| Starter | $99 | 99,000 | Yes |
| Pro | $249 | 249,000 | Yes |
| Team | $749 | 749,000 | Yes |
Plans convert at $1 per 1,000 credits. On-demand credits cost $1.25 per 1,000 and can be purchased in any 1,000-credit increment from 8,000 to 1,000,000. Purchased credits never expire.
On the free tier, the workspace has one-time grants — 5,000 credits at signup and 5,000 more on connecting the CLI or MCP — instead of a monthly allowance. They do not renew, and top-ups are available at any time.
Plans do not impose different stored-row or database-size entitlements. One plan-independent infrastructure guard applies to every workspace: 3,000,000 retained rows per Table, 25,000,000 retained Table rows per workspace, a database warning at 20 GiB, and refusal of net-new PostgreSQL Workspace Table growth at 30 GiB. The byte guard covers Table heap, indexes, and TOAST; S3/object storage is separate. Per-operation safety limits still bound one import, request, or action run; inspect current usage and effective limits with oxygen limits show --json.
At a row or 30 GiB hard limit, Oxygen blocks only writes that would increase the exceeded counter. Reads, previews, queries, exports, row deletion, permanent Table purge, and updates that do not grow measured database storage remain available. To recover database space immediately, delete rows or preview and approve oxygen tables delete <table> --now --yes; archiving a Table or scheduling its default 14-day deletion does not reclaim space until the physical purge completes. Capacity writes resume automatically after usage falls below the boundary. See Tables for the deletion lifecycle.
A full monthly plan allowance is granted only after Stripe confirms the billing period with invoice.paid. A subscription status change or an unpaid renewal never grants the next allowance.
Credit lifecycle
| State | Trigger |
|---|---|
| Granted | Plan refill or top-up |
| Reserved | A run starts; estimated cost held against balance |
| Captured | Run item succeeds with cost > 0 |
| Released | Run item fails before billing; reservation returned |
oxygen billing balance returns available and reserved.
Managed vs BYOK
| Mode | Who pays | What it covers |
|---|---|---|
| Managed | Oxygen credits | Oxygen holds the provider API key. Default for enrichment providers. |
| BYOK | You pay the provider directly | You connect your own provider account. Required for CRMs, outbound sequencers, LinkedIn. |
BYOK provider calls consume no Oxygen credits — they are logged as zero-credit byok_usage ledger entries (category byok). BYOK requires a paid plan.
The plan-scaled BYOK daily value is a monitoring threshold by default, not a blocking entitlement cap. oxygen limits show --json reports both byok_provider_daily_call_warning_threshold and byok_provider_daily_call_enforcement_mode; observe_only means calls continue after the threshold, while enforced means they stop. Explicit workspace policies created with oxygen limits provider set are enforced independently and appear in oxygen limits provider list --json.
oxygen integrations list --json shows the mode per provider. See Integrations.
Reading balance and usage
oxygen billing balance --json
oxygen billing usage --limit 50 --json
oxygen billing usage --category byok --type byok_usage --json
oxygen billing audit --group-by category --jsonUsage entries include run, provider, tool, credit, and timestamp fields when available. Group by provider or by day:
oxygen billing usage --limit 200 --json | jq '.data.entries | group_by(.provider) | map({provider: .[0].provider, total: (map(.credits) | add)})'The web app at oxygen-agent.com/billing renders the same data with charts.
Cost estimation
Before running anything paid:
oxygen tools get <tool-id> --json | jq '.estimated_credits_per_call'
oxygen columns run <table-id> <column-key> --limit 1 --json
oxygen workflows templates preflight <template-id> --input-json '{...}' --mode dry_run --jsonSpend caps enforce predictability per run.
What's free
| Action | Costs credits |
|---|---|
tables query, rows history, cells inspect | No |
tools search, tools get, integrations list | No |
dry_run or smoke_test of any tool/column/workflow | No |
context profile get/update, assets * | No |
columns add, tables rename, schema changes | No |
skills list/doctor/install | No |
live provider or AI call on your own key (BYOK) | No — logged as a zero-credit byok_usage entry |
| Live workflow steps, row writes, retries | Yes — 0.01 credits per action |
| Sequence sends through your connected email accounts | No |
live AI/tool/enrichment column run on managed keys | Yes (per call) |
Failure billing
| Failure point | Credit treatment |
|---|---|
| Pre-billing (auth, validation, 429 before charge) | Released |
| Post-billing (provider charged then returned error) | Captured |
| Partial provider cascade | Captured for paid attempts only |
Subscriptions
Every new workspace starts on the free tier: no card, no clock, nothing that expires. You get the full CRM, Tables, Workflows, Knowledge, Recipes, Agents, and the Workspace Copilot, plus 5,000 credits to start and 5,000 more once you connect the CLI or MCP. Sequences are fully authorable — build steps, preview, and enrol recipients — on the free tier.
A plan is what lets you act on the outside world through OXYGEN: connecting a sending mailbox, LinkedIn account, or WhatsApp number; dispatching a sequence; connecting a publishing account and delivering; buying managed email infrastructure; and bringing your own provider keys.
If a card is a hard blocker on your side (company policy, procurement), email support and we'll find a path.
Plans, invoices, discounts, payment methods, and cancellation are managed through Stripe from Settings → Billing. Oxygen keeps plan selection and credit usage inside the product.
Each org has its own subscription and credit balance. Agencies running many client orgs see one balance per org.
If a renewal payment fails
- Oxygen does not grant the next monthly plan allowance.
- Stripe retries payment for no longer than seven days (up to seven attempts in that recovery window).
- During that recovery window, the workspace can keep using its existing balance.
- At the seven-day boundary, execution stops everywhere: web mutations, CLI/MCP actions, Copilot, Agents, workflows, schedules, feeds, sequences, publishing, and background worker jobs. Remaining plan and purchased credits are frozen rather than deleted.
- Billing recovery, support, and read/export access remain available. Successful payment restores execution and queued work can resume.
The signup grant is issued once per workspace, at creation. Cancelling or downgrading never mints another one, and a returning customer can start a paid subscription immediately.
Cancelling your plan
Cancel any time, self-serve, from any of these surfaces:
- Web: Settings → Billing → Manage subscription in Stripe.
- CLI:
oxygen billing cancel— undo withoxygen billing resume. - MCP: the
oxygen_billing_canceltool (action: "cancel"or"resume").
What cancelling means:
- On the free tier: there is nothing to cancel. The workspace has no subscription and no card on file, so nothing is ever charged.
- On a paid plan: the plan stays active until the end of the current billing period; no further charges. Remaining credits stay usable until then.
- Reversible: until the period actually ends, "Resume subscription" (or
oxygen billing resume) removes the scheduled cancellation and renewal continues normally. - After it takes effect: execution is suspended and the workspace returns to the choose-a-plan wall; your data is retained, and billing recovery plus read/export access remain available.
- Managed email-infrastructure add-ons are billed separately and are not affected by cancelling the plan. Cancel managed inbox subscriptions with
oxygen managed-inboxes cancel. Cancel a dedicated sending IP withoxygen egress dedicated cancel --approve. - Deleting your workspace (Settings → General → delete organization) cancels its subscriptions — plan and email-infrastructure — immediately. A deleted workspace is never billed again.
The Stripe billing portal remains the source of truth for payment methods, invoices, discounts, plan changes, and cancellation.
Dedicated sending IP billing
A dedicated sending IP costs 25,000 credits per 30-day period ($25 at face value). oxygen egress dedicated request is a free preview; adding --approved provisions one minimal Fly send-drain app and one static egress IP for the workspace, then debits the first period immediately. Renewal is 30 days after purchase and every 30 days thereafter—not on the first day of the calendar month.
The routing scope is the whole workspace: every current and future send uses the dedicated Fly app automatically. This isolates the source address that Google or Microsoft sees when Oxygen calls their sending API. It is an account-safety and tenant-isolation feature, not an inbox-placement or deliverability lever. Recipients still see Google or Microsoft relay addresses in their message headers, never the Fly IP.
If the workspace does not have enough credits at renewal, the add-on enters a seven-day grace period and keeps sending while Oxygen retries. If it is still unpaid after seven days, Oxygen retires the dedicated IP and returns workspace sending to the shared Fly worker. Top up with oxygen billing topup during the grace period to keep the dedicated IP.
Cancellation is approval-gated. Preview it with oxygen egress dedicated cancel, then execute it with oxygen egress dedicated cancel --approve. Cancellation takes effect at the end of the 30-day period already paid for: there is no refund or early cutoff, the IP keeps sending until that date, and no further renewal is charged.
Related
- Spend caps — per-run limit.
- Approvals — gate before credits are spent.
- Integrations — BYOK setup.
- Triggers — cron cadence and scheduled-run sizing.