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 200,000. Purchased credits never expire.
During the trial, the workspace has a fixed 20,000-credit grant instead of the full Starter allowance. Plans do not cap table rows.
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.
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 |
oxygen onboarding start | No for the CLI command itself |
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 a 7-day Starter trial: the full workspace with 20,000 credits, credit card required up front. There is no card-less tier. The card is only charged when the trial converts to paid Starter — at the end of day 7, or earlier if the trial credits are exhausted. Cancel any time before then: the trial stays fully usable until its end date and the card is never charged.
If a card is a hard blocker on your side (company policy, procurement), book a call 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.
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:
- During a trial: the trial stays fully usable until its end date and your card is never charged. Trials are card-required, so cancelling is how you opt out of the automatic conversion.
- 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: the workspace returns to the choose-a-plan wall; your data is retained.
- Managed email-infrastructure add-ons (whitelabel inboxes, dedicated IPs) are billed separately and are not affected by cancelling the plan — cancel those via
oxygen managed-inboxes cancel. - 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.
Related
- Spend caps — per-run limit.
- Approvals — gate before credits are spent.
- Integrations — BYOK setup.
- Triggers — cron cadence and scheduled-run sizing.