Billing & credits
What consumes credits, automation actions, plan allowances, managed vs BYOK, lifecycle.
Oxygen meters paid work on two meters, both scoped to one organization:
- Credits meter managed provider work: paid provider calls and AI column outputs on Oxygen's keys. One credit ≈ one paid provider call or AI column output.
- Automation actions meter workflow compute: steps, tool calls, row writes, and retries, drawn from a separate per-plan monthly allowance. They never consume credits.
oxygen billing balance --json returns both meters.
What consumes credits
Only managed work — provider calls and AI columns that run on Oxygen's keys:
| Work | What it draws |
|---|---|
| Managed enrichment or domain provider call (Oxygen's key) | Credits, per call |
| AI column run on Oxygen's keys | Credits, per output |
| The same provider or AI call on your own key (BYOK) | 0 credits |
| Live workflow steps, tool calls, row writes, retries | Automation actions, never credits |
| Sequence sends through your connected email accounts | Nothing — no credits, no actions |
Reads, schema changes, dry_run / smoke_test | Nothing — no credits, no automation actions |
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.
Automation actions
Workflow compute is not billed per run and never consumes credits. Only live runs draw automation actions — dry_run and smoke_test bill nothing — from a monthly plan allowance, 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.
At the allowance cap, work pauses instead of billing you: new live runs fail with automation_actions_exceeded, and the scheduler stops enqueuing cron-due runs until the monthly window resets — the workflow page and oxygen workflows get show Schedule paused with the resume date. Overage is opt-in and off by default; with overage enabled, extra actions bill at the plan's per-million rate instead of pausing.
oxygen billing balance --json
oxygen billing usage --meter automation_actions --jsonFor cron cadence limits and a worked 24/7 sizing example, see Triggers.
Plan allowances
| Plan | Price / mo | Monthly credits | Weekly credit limit | Rollover cap | Automation actions / mo | Action overage (opt-in) | BYOK |
|---|---|---|---|---|---|---|---|
| Free | $0 | 500 | 500 | 500 | 10,000 | — | No |
| Starter | $99 | 5,000 | 2,000 | 5,000 | 250,000 | $10 per extra 1M | Yes |
| Pro | $249 | 12,500 | 5,000 | 12,500 | 2,000,000 | $10 per extra 1M | Yes |
| Team | $749 | 37,500 | 15,000 | 37,500 | 10,000,000 | $5 per extra 1M | Yes |
| Scale | Contact sales | 500,000 | 500,000 | 500,000 | 50,000,000 | — | Yes |
Scale numbers are the baseline — limits are set with sales. Enterprise is fully custom (credit pool, action allowance, invoicing).
- Weekly credit limit — the most credits an org can spend in any 7-day window; it smooths spend inside the month.
- Rollover cap — unused monthly credits carry over up to this ceiling.
- Plans do not cap table rows. Row counts are unlimited; plans cap monthly managed credits and automation actions.
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 --meter automation_actions --json
oxygen billing usage --category byok --type byok_usage --json
oxygen billing audit --group-by category --json--meter defaults to credits; pass automation_actions for the workflow-compute meter. Usage 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 | No — they draw automation actions, never credits |
| 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
Plans are managed through Stripe. Manage at oxygen-agent.com/subscribe. Plan changes apply at the next billing cycle by default; prorated upgrades available mid-cycle.
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:
oxygen-agent.com/subscribe(the manage-plan page — shows your current plan, trial end date, and the upcoming charge) or Settings → Billing → Cancel trial / Cancel subscription. - 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.
The Stripe billing portal (Settings → Billing → "Open billing portal") remains available for payment methods, invoices, and cancellation too.
Related
- Spend caps — per-run limit.
- Approvals — gate before credits are spent.
- Integrations — BYOK setup.
- Triggers — cron cadence and scheduled-run sizing.