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:
- Origin — how the mailbox entered Oxygen: managed provisioning, a connected inventory provider, a generic external export, manual registration, or native creation.
- Infrastructure platform — where the mailbox is actually hosted: Google Workspace, Microsoft 365, or Microsoft Azure/Entra.
- 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=trueis the sole authority for automatic warmup; do not infer it from a selected add-on or lifecycle status. Itsscope: "warmup_only",transport: "inboxkit_sequencer_export",mailbox_credentials_required: false, andnative_send_oauth_separate: truemean 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 withoxygen mailboxes oauth-health --jsonbefore 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 --jsonInspect 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 --jsonThis 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 field | Meaning |
|---|---|
data.provider_matrix | The current public product contract, even when --mailboxes filters the checked rows |
data.compatibility | Exact runtime verdicts for the selected mailbox rows |
data.import_methods | Every supported ingestion method, surface, file/API input, credential policy, and command |
data.import_fields | Canonical mailbox fields, accepted aliases, requiredness, and whether each field crosses the network |
data.non_transferable_auth | Authentication material Oxygen will never accept as a mailbox import |
data.summary | Fleet rollup by warmup and EmailGuard state |
data.web_url | The mailbox-pool page where the operator can inspect the same state |
Import methods and surfaces
| Source shape | CLI | MCP/OAuth API | Browser | Credential behavior |
|---|---|---|---|---|
| Local CSV/JSON/JSONL/XLSX identity file | --file plus optional --vendor | Inline identities | Add inboxes → Import a file | Credentials rejected |
| Compatible Google app-password export | --from credentials --vendor <source> --file … | Never | Signed-in Add inboxes → Import a file | Encrypted immediately; seven-day transfer TTL |
| Manual Google/Microsoft identities | Inline import + mailboxes connect-oauth | Identity registration | Add inboxes → Connect existing | Fresh destination OAuth; source grants never transfer |
| Connected Zapmail inventory | --from zapmail | source=zapmail | Connected integration flow | Oxygen reads the authoritative provider inventory; no file password |
| InboxKit / legacy CMR lifecycle | Managed provisioning commands | Managed lifecycle API | Add inboxes → Buy managed | Provider 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 family | Preferred import | Important boundary |
|---|---|---|
| Zapmail | --from zapmail | Connected API pull is authoritative; convert a legacy .xls workbook to CSV because .xls is not an accepted file format |
| InboxKit / legacy CMR | Managed lifecycle | Provider adapter retains lifecycle and credential provenance |
| Instantly, Smartlead, PlusVibe | UI/CLI provider-file import | Treat OAuth grants as non-transferable; use secure mode only for rows that really contain Google app passwords |
| Salesforge / Mailforge / Infraforge / Primeforge | UI/CLI provider-file import | Remove generic SMTP passwords and import identity only; custom SMTP credential handoff is not implemented |
| Lemlist or another sequencer | UI/CLI identity import | Import 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:
- Buy managed opens the existing domain-and-inbox purchase flow.
- 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.
- 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" --jsonIdentity 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 --jsonAll 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 \
--jsonThis 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.
| Origin | Infrastructure platform | Downstream auth | OXYGEN Warm-up | EmailGuard monitoring |
|---|---|---|---|---|
| InboxKit | Google Workspace | Provider-native export | ready | ready |
| InboxKit | Microsoft 365 | Provider-native export | ready | vendor_blocked |
| InboxKit | Microsoft Azure | Provider-native export | ready | vendor_blocked |
| Legacy CMR | Google Workspace | Google app password | ready | ready |
| Legacy CMR | Microsoft 365 | Microsoft tenant consent | consent_required | vendor_blocked |
| Zapmail | Google Workspace | Google app password | ready | ready |
| Zapmail | Microsoft 365 | Microsoft tenant consent | consent_required | vendor_blocked |
| External | Google Workspace | Google app password | verification_required | verification_required |
| External | Microsoft 365 | Microsoft tenant consent | consent_required | vendor_blocked |
| External | Microsoft Azure | Microsoft tenant consent | consent_required | vendor_blocked |
| Manual | Google Workspace | none | credential_required | credential_required |
| Manual | Microsoft 365 | Microsoft tenant consent | consent_required | vendor_blocked |
| Manual | Microsoft Azure | Microsoft tenant consent | consent_required | vendor_blocked |
| Native | Google Workspace | none | credential_required | credential_required |
| Native | Microsoft 365 | Microsoft tenant consent | consent_required | vendor_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
| State | Meaning | Next action |
|---|---|---|
ready | Oxygen 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_required | The 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_required | The 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_required | An 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_blocked | EmailGuard'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-onlypath 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.
Related
- Integrations — how provider credentials are connected.
- Approvals — previews, exact scope, and approval tokens.
- Billing and credits — how recurring managed services consume credits.