OXYGENOxygen/ Docs
Providers

Mailbox warmup and monitoring compatibility

The supported mailbox-origin, hosting-platform, and authentication matrix for OXYGEN Warm-up and EmailGuard monitoring.

Mailbox compatibility has three independent axes:

  1. Origin — how the mailbox entered Oxygen: managed provisioning, a connected inventory provider, a generic external export, manual registration, or native creation.
  2. Infrastructure platform — where the mailbox is actually hosted: Google Workspace, Microsoft 365, or Microsoft Azure/Entra.
  3. Downstream authentication — InboxKit's provider-native Sequencer export, a scoped Google SMTP/IMAP app password, a Microsoft OAuth consent, or no safe handoff.

Azure is Microsoft transport, not a separate password protocol. A mailbox's OAuth or delegation mode for native sending is also separate from its warmup and EmailGuard handoff.

Native warmup is presented and operated as OXYGEN Warm-up. Mailboxes already warming on the previous vendor, TrulyInbox, keep reporting there and are wound down there; no new enrollment opens on it. The current managed backend remains an implementation detail in normal customer surfaces.

Warmup vs native sending

Warmup is not send authorization. For a managed InboxKit order, warmup_activation.automatic_after_provisioning=true is the sole authority for automatic warmup; do not infer it from a selected add-on or lifecycle status. Its scope: "warmup_only", transport: "inboxkit_sequencer_export", mailbox_credentials_required: false, and native_send_oauth_separate: true mean the InboxKit→OXYGEN native warm-up export needs no mailbox password or Google/Microsoft OAuth. OXYGEN native campaign sending is a separate, destination-bound OAuth contract. After provisioning, verify that grant for each exact mailbox with oxygen mailboxes oauth-health --json before sending; an existing token for another mailbox proves nothing.

Preview a new managed domain or an expansion without --approved; neither command orders or charges anything:

oxygen managed-inboxes subscribe send-acme.com --provider google \
  --file ./mailboxes.json --billing ./registrant.json --json

oxygen managed-inboxes add-inboxes send-acme.com \
  --file ./more-mailboxes.json --json

Inspect the exact mailboxes, addons, addons_monthly_credits, warmup_activation, and quote_id. A null warmup_activation means the preview grants no automatic warmup authority, even when a warmup add-on appears selected.

Inspect the authoritative report

oxygen mailboxes compatibility --catalog-only --json

This compact, workspace-independent report returns the complete import contract without reading or returning mailbox rows, so large sending pools cannot bury it in logs or agent transcripts. For exact readiness after import, run oxygen mailboxes compatibility --mailboxes <ids-or-addresses> --json. Both commands are pure reads: they cost 0 credits, never decrypt a credential, and never call OXYGEN Warm-up or EmailGuard. The exact report may make a bounded read-only InboxKit warmup-status call so a conflicting source subscription fails before approval.

JSON fieldMeaning
data.provider_matrixThe current public product contract, even when --mailboxes filters the checked rows
data.compatibilityExact runtime verdicts for the selected mailbox rows
data.import_methodsEvery supported ingestion method, surface, file/API input, credential policy, and command
data.import_fieldsCanonical mailbox fields, accepted aliases, requiredness, and whether each field crosses the network
data.non_transferable_authAuthentication material Oxygen will never accept as a mailbox import
data.summaryFleet rollup by warmup and EmailGuard state
data.web_urlThe mailbox-pool page where the operator can inspect the same state

Import methods and surfaces

Source shapeCLIMCP/OAuth APIBrowserCredential behavior
Local CSV/JSON/JSONL/XLSX identity file--file plus optional --vendorInline identitiesAdd inboxes → Import a fileCredentials rejected
Compatible Google app-password export--from credentials --vendor <source> --file …NeverSigned-in Add inboxes → Import a fileEncrypted immediately; seven-day transfer TTL
Manual Google/Microsoft identitiesInline import + mailboxes connect-oauthIdentity registrationAdd inboxes → Connect existingFresh destination OAuth; source grants never transfer
Connected Zapmail inventory--from zapmailsource=zapmailConnected integration flowOxygen reads the authoritative provider inventory; no file password
InboxKit / legacy CMR lifecycleManaged provisioning commandsManaged lifecycle APIAdd inboxes → Buy managedProvider adapter owns the credential handoff

The generic Tables upload is not a mailbox import. It creates table rows and never registers a sending mailbox.

Current vendor map

Provider brands do not create new authentication protocols. Use the safest available method for the export you actually have:

Vendor/export familyPreferred importImportant boundary
Zapmail--from zapmailConnected API pull is authoritative; convert a legacy .xls workbook to CSV because .xls is not an accepted file format
InboxKit / legacy CMRManaged lifecycleProvider adapter retains lifecycle and credential provenance
Instantly, Smartlead, PlusVibeUI/CLI provider-file importTreat OAuth grants as non-transferable; use secure mode only for rows that really contain Google app passwords
Salesforge / Mailforge / Infraforge / PrimeforgeUI/CLI provider-file importRemove generic SMTP passwords and import identity only; custom SMTP credential handoff is not implemented
Lemlist or another sequencerUI/CLI identity importImport identities; reconnect OAuth at the destination rather than exporting tokens

The live direct inventory pull is currently Zapmail. Adding another connected API adapter does not change the mailbox contract: it must emit the same bounded identity/platform/tenant/provenance fields, declare external reads, and never relay an OAuth grant from the source application.

Add inboxes in the web app

Open Accounts → Email → Add inboxes and choose one path:

  1. Buy managed opens the existing domain-and-inbox purchase flow.
  2. Connect existing accepts up to 500 exact Google Workspace or Microsoft 365/Entra addresses, previews the 0-credit OAuth scope, and queues them in review batches of at most 10 before creating one account-bound authorization link per mailbox after you confirm.
  3. Import a file accepts CSV, JSON, JSONL, or XLSX from any compatible provider. The signed-in browser parses and policy-checks the complete file in memory first. Until you click Import, it makes no network request or workspace write. The preview shows aggregate counts plus the exact Google and Microsoft review batches that the supplied addresses will enter.

Secret-bearing files are accepted only by this authenticated, same-origin web flow or Oxygen CLI credentials. MCP, OAuth, Copilot, and Agent identities remain identity-only. When you approve import, the browser submits only canonical mailbox fields; raw vendor columns and SMTP/IMAP hosts never leave it. The server encrypts a canonical Google app password immediately and never returns it.

After registration, complete the fresh destination OAuth shown in the same wizard. The Accounts list marks incomplete rows Needs connection and exposes Connect/Reconnect again from the mailbox detail. An imported source OAuth grant never counts as an OXYGEN connection.

Manual connection never discovers a domain or enumerates Google Workspace or Microsoft directory users. Every address is supplied explicitly, and every grant is accepted only for the exact account that completes consent. The 10-address boundary is the size of one review, consent-link, audit, and retry unit—not a total workspace or domain cap. Connecting a whole domain would be a separate administrator-directory integration with privileged scopes, an exact mailbox selection preview, and explicit approval.

For Microsoft native sending, both the exact-account authorization and the optional tenant-administrator setup cost 0 Oxygen credits. Try each exact mailbox link first. Only when Microsoft requests administrator approval should the tenant administrator open the single setup link returned for that resolved tenant; Microsoft may show separate Graph and Exchange approval screens. This setup approves the app permissions only: it never enumerates or imports the directory, creates no mailbox token, and never replaces the exact mailbox sign-in. Retry each selected mailbox link after setup.

Remove selected mailboxes

Select one or more rows in Accounts → Email and choose Delete. This disconnects those exact addresses from OXYGEN; it does not delete the Google or Microsoft accounts themselves. The confirmation shows any active or paused Sequences that reference the selection and the mailbox credits that stop on future renewals.

Deletion immediately removes the selected rows from sending and clears their OXYGEN OAuth credentials. Conversation, message, and delivery history remains inspectable. The current billing period is not refunded; each selected sending mailbox stops its 1,000-credit monthly commitment for the next renewal.

Managed mailbox subscriptions, warmup, and deliverability monitoring have independent recurring lifecycles. The deletion preview blocks until those lines are cancelled through their own controls, preventing a hidden subscription from continuing after its mailbox row disappears. Re-importing a deleted address restores that exact row and requires fresh destination OAuth.

CLI and MCP use the same two-step contract:

oxygen mailboxes delete --mailboxes ada@send-acme.com --json
oxygen mailboxes delete --mailboxes ada@send-acme.com \
  --approved --plan-hash <fresh-plan-hash> \
  --confirmation "DELETE 1 MAILBOX" --json

Identity files from any export vendor

oxygen mailboxes import --file ./mailboxes.csv --vendor instantly --json

# Validate the actual export first: no authentication, network request, or write.
oxygen mailboxes import --file ./mailboxes.csv --vendor instantly \
  --validate-only --json

All local files accept up to 500 rows and 5 MB. Canonical fields are email_address, provider, optional workspace_external_id, optional infrastructure_platform, and optional Microsoft tenant_id. Common aliases include Email, From Email, ESP, Mailbox ID, Mailbox UID, and Entra Tenant ID. SMTP/IMAP hosts are used only when they exactly match the standard Google or Microsoft endpoints; custom SMTP hosts fail closed. OAuth tokens, refresh tokens, MFA/TOTP seeds, client secrets, private/delegation keys, and all password fields are rejected in identity mode.

The web file picker enforces the same limits, aliases, and rejection policy with the shared parser. Choose Identity-only export when a file should contain no credential material. Local validation returns oauth_review_plan: the supplied mailbox count and batch sizes for each provider, a 10-account review maximum, and directory_discovery: false. Because this checkpoint is deliberately offline, it does not inspect existing workspace grants; the authenticated OAuth preview can skip accounts that are already connected.

Generic secure credential file

oxygen mailboxes import \
  --from credentials \
  --vendor mailforge \
  --file ./mailboxes.csv \
  --validate-only \
  --json

This path is for an authorized export whose Google rows contain real Google app passwords. It does not convert an arbitrary SMTP password or an OAuth token into a Google credential. The validated vendor slug is retained as provenance. Once the safe aggregate validation report is correct, re-run without --validate-only to register the rows. In the web app, choose Credential export, optionally name the source for provenance, review the local aggregate and provider-specific OAuth batches, and click Import.

The file may be CSV, JSON, JSONL, or XLSX, up to 500 rows and 5 MB. Common headers such as Email Address, Provider, App Password, SMTP Password, and IMAP Password are normalized locally. Standard Google and Microsoft SMTP/IMAP hosts can identify the provider when the export omits it.

Canonical JSON:

{
  "mailboxes": [
    {
      "email_address": "ada@send-acme.com",
      "provider": "google",
      "app_password": "<Google mailbox app password>"
    }
  ]
}

Only Google rows need an app password. Someone who can sign in to that exact mailbox creates it from the mailbox's Google Account after enabling 2-Step Verification; never export a super-admin credential. Microsoft rows should omit password fields because the browser/CLI parser discards them locally. Imported non-InboxKit Microsoft rows use per-mailbox Outlook OAuth for OXYGEN Warm-up; managed InboxKit rows use provider-native export instead.

Import costs 0 Oxygen credits, but registration is state-changing. The browser preview performs no request until Import is clicked. In the CLI, add --validate-only to parse and normalize the complete real file locally without authentication, network access, or a workspace write; the result contains only aggregate provider/platform/credential counts and never addresses or secrets. Without that flag, the complete file is still parsed before the first request. Any parse, shape, provider/platform/tenant, secret-policy, duplicate, or credential-conflict error rejects the entire file before the first mailbox write and names the failing row as mailboxes[index]. A later infrastructure failure can interrupt the server upsert; re-run the same file because import is idempotent by mailbox address.

Current supported matrix

This table is the current executable product contract. A pairing omitted from it is not silently inferred or supported. External means an identity or secure credential file carrying exact source_provider provenance; its Google row says verification_required because only the runtime vault check can distinguish identity-only from credential-bearing imports.

OriginInfrastructure platformDownstream authOXYGEN Warm-upEmailGuard monitoring
InboxKitGoogle WorkspaceProvider-native exportreadyready
InboxKitMicrosoft 365Provider-native exportreadyvendor_blocked
InboxKitMicrosoft AzureProvider-native exportreadyvendor_blocked
Legacy CMRGoogle WorkspaceGoogle app passwordreadyready
Legacy CMRMicrosoft 365Microsoft tenant consentconsent_requiredvendor_blocked
ZapmailGoogle WorkspaceGoogle app passwordreadyready
ZapmailMicrosoft 365Microsoft tenant consentconsent_requiredvendor_blocked
ExternalGoogle WorkspaceGoogle app passwordverification_requiredverification_required
ExternalMicrosoft 365Microsoft tenant consentconsent_requiredvendor_blocked
ExternalMicrosoft AzureMicrosoft tenant consentconsent_requiredvendor_blocked
ManualGoogle Workspacenonecredential_requiredcredential_required
ManualMicrosoft 365Microsoft tenant consentconsent_requiredvendor_blocked
ManualMicrosoft AzureMicrosoft tenant consentconsent_requiredvendor_blocked
NativeGoogle Workspacenonecredential_requiredcredential_required
NativeMicrosoft 365Microsoft tenant consentconsent_requiredvendor_blocked

The downstream-auth value provider_native_export means InboxKit performs the destination handoff without transferring a mailbox password or OAuth grant to OXYGEN. microsoft_tenant_consent remains the stable enum for eligible non-InboxKit Microsoft fallbacks: the current warm-up grant is issued per mailbox, not per Entra tenant. See Microsoft 365 and Azure below.

What the states mean

StateMeaningNext action
readyOxygen has a safe handoff contract. A fresh managed-order quote can already authorize exact post-provisioning warmup; otherwise execution starts with the standalone cost and side-effect preview.Inspect the managed-order activation, or preview the applicable standalone warmup / EmailGuard action.
verification_requiredThe origin can support the handoff, but this fleet-level matrix has not checked a mailbox-scoped vault/provider credential.Run oxygen mailboxes compatibility and use the exact mailbox verdict.
credential_requiredThe Google mailbox has no credential-capable origin. Oxygen never exports its own OAuth refresh token as an app password.Re-import through a compatible secure credential file, or use source-provider warmup.
consent_requiredAn eligible non-InboxKit Microsoft mailbox needs one Outlook OAuth authorization before OXYGEN Warm-up can warm it.Preview oxygen mailboxes warmup microsoft, approve the 0-credit plan, then poll --status and open the returned consent_url.
vendor_blockedEmailGuard's public mailbox-account API has no Microsoft OAuth or tenant-consent handoff. Exchange Online password fallback is retired.Keep continuous EmailGuard monitoring off; Oxygen's native Microsoft placement-test send remains available.

Google Workspace

For OXYGEN Warm-up, managed InboxKit Google mailboxes use provider-native Sequencer export and never materialize an app password. EmailGuard monitoring still receives InboxKit's scoped Google SMTP/IMAP app password just in time after its own approval. Legacy CMR, Zapmail, and compatible external credential files retain the scoped app-password handoff for both compatible destinations. Preview never materializes it. Secret-bearing transfers are accepted only through the signed-in first-party web app or local CLI, encrypted immediately, and deleted after compatible provider handoffs confirm the same revision or expire unused after seven days.

Manual and native Google rows remain credential_required: Oxygen does not turn its Gmail OAuth refresh token into a third-party password.

For non-InboxKit Google origins, the credential path is unchanged: the managed warm-up rail receives the scoped app password only after approval.

Microsoft 365 and Azure

Microsoft warmup never uses a mailbox password or app password. Exchange Online retired that authentication, and Oxygen refuses it categorically; OXYGEN Warm-up uses OAuth instead.

Managed InboxKit Microsoft 365 and Azure mailboxes use native InboxKit Sequencer export. For a fresh Google, Microsoft, or Azure managed order, warmup defaults on when available. The order preview itemizes the recurring add-on and exact future addresses under warmup_activation; approving that quote authorizes the worker to export and start only those mailboxes after they provision. No separate mailboxes warmup enable approval is required. An approved expansion quote does the same for its new addresses when the order's warmup selection is enabled. auto_export_enabled remains off: Oxygen performs explicit scoped exports, while InboxKit never exports an unscoped workspace by itself. Any non-cancelled InboxKit warmup subscription blocks the handoff; cancel it and let the worker retry. There is no Outlook browser step for this warmup handoff. OXYGEN native campaign sending still uses its separate destination-bound OAuth contract, which must be verified for each exact mailbox after provisioning.

Standalone mailboxes warmup enable is for BYOK/imported mailboxes, a managed order that opted out, or a later separate enrollment. Legacy automatic scope repair is narrower than the normal path: only qualifying pre-scope Microsoft/ Azure orders can infer their complete exact mailbox set. Google is excluded only from that legacy inference, not from fresh managed-order activation.

Eligible non-InboxKit Microsoft mailboxes retain one Outlook OAuth authorization per mailbox. OXYGEN Warm-up has no tenant-wide shortcut, so imported, external-vendor, manual, or native rows receive a link that someone who can sign in to that exact mailbox must open.

# Non-InboxKit fallback only. Managed InboxKit rows use order activation or standalone warmup enable.
# 1. Preview the exact mailbox scope and plan hash. 0 credits.
oxygen mailboxes warmup microsoft --mailboxes ada@send-acme.com --json

# 2. Approve minting the exact per-mailbox consent link. Still 0 credits.
oxygen mailboxes warmup microsoft --mailboxes ada@send-acme.com \
  --approved --plan <plan_hash> --max-credits 0 --json

# 3. Poll. Open a returned consent_url only for the mailboxes that have one.
oxygen mailboxes warmup microsoft --mailboxes ada@send-acme.com --status --json

--status reports one headline consent_state plus a per-mailbox reason. A mailbox counts as authorized only once the managed warm-up rail confirms it.

Links are reused rather than re-minted on a repeat run, and minting is bounded per run, so a large non-InboxKit fallback pool takes several passes. Warmup stays off throughout: starting it is a separate priced approval (oxygen mailboxes warmup enable). A mailbox that is not authorized yet reports consent_required and is never reported as warming or billed.

A Microsoft warmup consent cannot be relayed into EmailGuard. Continuous EmailGuard mailbox monitoring is therefore vendor_blocked for Microsoft 365 and InboxKit Azure until EmailGuard exposes a supported OAuth or tenant-consent API.

Cost boundary

  • Compatibility inspection: 0 credits, no downstream mutation or credential materialization; exact InboxKit rows may trigger a read-only source-warmup check.
  • Browser/CLI identity or credential validation: 0 credits, no network request, provider call, or workspace write. The CLI --validate-only path also requires no authentication.
  • Browser/CLI identity or credential import: 0 credits, but it immediately writes mailbox registrations in Oxygen; no downstream provider call.
  • Non-InboxKit Microsoft per-mailbox Outlook consent: 0 credits, explicit approval, warmup remains off.
  • OXYGEN Warm-up: billed at the displayed per-inbox monthly credit price. A fresh managed-order quote itemizes and authorizes its default-on exact-address activation; BYOK, opt-out, and later separate enrollment use a standalone warmup preview.
  • EmailGuard monitoring: managed mode is 1,000 credits per inbox-month ($1 face value); BYOK is 0 Oxygen credits. Microsoft/Azure is blocked before credential access or billing.

On this page