
cargo-mailbox-management
Send mail from inboxes Cargo owns — provision mailboxes on a sending domain, run provider warm-up and the 5→40/day send ramp, deliver with the sendEmail action, and read back threads, replies, delivery events, and the workspace suppression list. Triggers: "set up a sending mailbox", "provision inboxes for outbound", "warm up this mailbox", "how many sends do I have left today", "send this from Cargo", "did they reply", "who unsubscribed", "suppress this recipient", "take me off your list", "never email them again", "what do mailboxes cost", "my mailbox is stuck pending". A mailbox is a recurring monthly credit charge, and every send is gated on basis, suppression, and relevance. Skip when: writing the copy or building the audience — use cargo-gtm; the mailbox belongs in git — use cargo-project.
- Installs
- 5.2K
- Last 24h
- +121
- Trending rank
- #1759
- Security
- Warn
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/getcargohq/cargo-skills --skill cargo-mailbox-management- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads cargo-mailbox-management automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
Security audits
Independent scans of the skill's instructions and bundled files.
SKILL.md
The instructions your agent reads when the skill is triggered.
Cargo CLI — Mailbox Management
Mailboxes. A mailbox is a real sending inbox the workspace owns — provisioned through
Cargo on a sending domain the workspace also owns, with SMTP and IMAP credentials Cargo holds
and uses to deliver outbound mail and to read the replies that come back. Two things follow,
and both are easy to get wrong: a mailbox is a recurring monthly credit charge rather than
a per-record one, and this domain does not send. It provisions the inbox, ramps it, and
reports on what it did; the send itself is the sendEmail action, under
cargo-orchestration.
cargo-ai mailboxManagement mailbox … # provision, warm-up, send allowance
cargo-ai mailboxManagement message … # outbound sends
cargo-ai mailboxManagement thread … # conversations, and the replies on them
cargo-ai mailboxManagement event … # sent / opened / clicked / replied / unsubscribed
cargo-ai mailboxManagement suppression … # workspace-wide do-not-send list
cargo-ai mailboxManagement pricing … # monthly credits per mailbox flavour
Version note. Everything on this page is live in the pinned CLI (1.0.66), including
mailbox get-warmup-statsand the--daily-targetdefault of 40 — both of which were merged-but-unpublished when this skill was written. On an older CLI,--daily-targetreads "provider default if omitted" andget-warmup-statssilently prints themailboxgroup help instead of erroring, so a missing subcommand here looks like a usage mistake rather than a stale install.cargo-ai mailboxManagement mailbox --helplists what your CLI actually has; re-run the session refresh in../cargo/SKILL.mdto catch up.
Bootstrap
Already signed in (cargo-ai whoami returns a workspace)? Skip to the next section.
npm install -g @cargo-ai/cli # no global install? prefix every command with `npx @cargo-ai/cli`
cargo-ai login --email you@company.com # emailed code, no browser; creates the account on first use
# alternatives: --oauth (browser) · --token <api-token> (CI)
cargo-ai whoami # confirm the active workspace before any write
Every command prints JSON to stdout; failures exit non-zero with {"errorMessage": "..."}.
Nothing in this domain is asynchronous — every command is a single HTTP call, so there is no
run to poll (the one thing that looks async, a freshly created mailbox sitting at pending,
is polled with mailbox refresh-status, not with run get). Mailboxes are guarded by
mailboxManagement:read / mailboxManagement:write permissions, which an admin and an editor
both hold and a viewer does not; if a create or update returns a permission error, the token is
read-only (../cargo-workspace-management/SKILL.md).
When the full skill bundle is installed, ../cargo/references/prerequisites.md
adds the CLI version pin, token scopes, and the admin-only surface.
Before any send — three checks
This is a blocking gate, not advice. Cargo owning the mailbox changes who presses send; it
changes nothing about whether the message should be sent. The canonical rules are
../cargo-gtm/references/acceptable-use.md §3 and
they apply here unchanged — run all three before the first sendEmail, not after:
- Basis — which permission covers this audience (customers, opted-in contacts, event attendees, or a documented legitimate-interest case for a B2B role)?
- Suppression — subtract the workspace suppression list from the audience before you
enrich or send.
suppression listis free and this domain is the source of truth for it. - Relevance — can you name, per recipient, why this message is for them?
Any check that fails is a stop-and-ask. Two obligations are specific to Cargo-owned sending:
- The ramp is a ceiling, not a target.
get-send-allowancereports what a mailbox may send today; it is not a quota to fill. Asking to raise it, to spread one campaign across a fleet of fresh mailboxes to clear the same volume, or to rotate identities so filters see less from each, is the evasion refusal inacceptable-use.md§2 — not a configuration question. - Unsubscribes are automatic and absolute. Every send carries a signed
List-Unsubscribeheader; a recipient using it writes a workspace-widesuppressionrow, and the next send to that address is refused by the engine. There is no removal command, and that is the point — never route around a suppression to re-contact someone.
The two numbers that govern a mailbox
They look similar and mean opposite things. Confusing them is the most common way to mis-read a mailbox's health.
mailbox get-send-allowance | mailbox get-warmup-stats | |
|---|---|---|
| Measures | Your real outreach | The provider's dummy warm-up traffic |
| Window | Rolling 24 hours | Today, UTC |
| Returns | dailyLimit, rampLimit, sentCount, remainingCount | sentCount, deliveredCount, spamCount, inboxRate, spamRate |
| Answers | "How many more may I send?" | "Is this inbox landing in the inbox or in spam?" |
dailyLimit is not a setting — it is derived from how long warm-up has been running. The
arithmetic, the warmupStatus transitions, and how to size a fleet against it are in
references/warmup-and-allowance.md. Read it before
you promise anyone a send volume.
Commands
All commands output JSON. Reads need mailboxManagement:read; everything that provisions,
updates, deletes, or suppresses needs mailboxManagement:write.
Provision a mailbox
First, the gap you will hit. mailbox create requires --domain-uuid, and there is no
cargo-ai command that lists sending domains — the domainManagement API exists but has no
CLI surface yet. Get the UUID from the Cargo web app, or declare the domain in a project with
defineDomain and read it back from cargo.state.json. Say this to the user rather than
guessing a UUID.
Pricing a domain before buying it has the same gap, and one direct API call closes it:
GET /v1/domainManagement/domains/search?name=<domain> returns available and priceCredits
(where null means not purchasable, not free). The domain side of a fleet — that call,
sizing domains by blast radius rather than capacity, the apex redirect, DMARC, naming, and what
dnsRecords owns once declared — is
references/sending-domains.md.
cargo-ai mailboxManagement mailbox create \
--domain-uuid <domain-uuid> \
--type google \
--username jane \
--first-name Jane \
--last-name Doe \
--signature '<p>Jane Doe · Acme</p>' \
--folder-uuid <folder-uuid>
cargo-ai mailboxManagement mailbox refresh-status <uuid> # repeat until status is "active"
--type—google,shared, orprivate.outlookis accepted by the flag and always fails withtransportNotSupported: the Graph transport has not shipped, so an Outlook mailbox cannot deliver. Pick one of the other three.--username— the local part only (janeforjane@acme.com). Lowercased; letters, digits, dots, dashes and underscores, 1–64 characters, starting and ending alphanumeric.--first-name/--last-name— the From header the recipient sees. Use a real person's name under a real identity; a fabricated sender is a §2 refusal.--signature— HTML, stored on the mailbox (max 10,000 characters).--folder-uuid— a folder of kindmailbox, fromcargo-workspace-management.
create returns immediately with status: "pending" — the provider has not issued credentials
yet. It reaches active when refresh-status says so, or on its own within five minutes; a
send attempted before then fails with mailboxNotActive, which does not retry.
cargo-ai mailboxManagement mailbox list # every mailbox
cargo-ai mailboxManagement mailbox list --statuses active # comma-separated, no spaces
cargo-ai mailboxManagement mailbox list --domain-uuid <uuid>
cargo-ai mailboxManagement mailbox get <uuid>
cargo-ai mailboxManagement mailbox update --uuid <uuid> --first-name Janet
cargo-ai mailboxManagement mailbox update --uuid <uuid> --folder-uuid none # "none" clears
cargo-ai mailboxManagement mailbox remove <uuid> # deletes at the provider too
--statuses—pending,active,inactive,error, comma-separated with no spaces. Aninactivemailbox was disabled by the provider;errorCodesays why (401auth,402spam) and it will not send until it is fixed. Anerrormailbox is one Cargo cannot log into although the provider still calls it active (errorCode: "authenticationFailed"); it is retried hourly and goes back toactiveon the first login that works.noneis the sentinel for "clear it" on--folder-uuidand--signature. Onlist,--folder-uuid nonemeans "mailboxes in no folder".removeis how monthly billing stops. There is no pause.
Warm it up
A mailbox that never starts warm-up is pinned at 5 real sends a day, forever. Warm-up is
what moves it, and it takes 45 days to finish. Warm-up starts on its own (target 40) the first
time a mailbox goes pending → active; start-warmup is the retry after a failed enrolment or
after stop-warmup, and on a mailbox already warming it returns warmupAlreadyStarted.
cargo-ai mailboxManagement mailbox start-warmup <uuid> --daily-target 40
cargo-ai mailboxManagement mailbox get-warmup-stats <uuid>
cargo-ai mailboxManagement mailbox update-warmup --uuid <uuid> --status paused
cargo-ai mailboxManagement mailbox update-warmup --uuid <uuid> --daily-target 25
cargo-ai mailboxManagement mailbox stop-warmup <uuid> # resets the ramp
--daily-target— warm-up messages per day at full ramp, 1–40 (default 40). This is the provider's dummy traffic, not your send allowance.--statusonupdate-warmupaccepts the whole enum, but onlyactiveandpauseddo anything:pendingandfailedare states the provider reaches on its own, anddisabledis whatstop-warmupis for.stop-warmupresets the Cargo send ramp as well as tearing down provider warm-up — the mailbox drops back to 5/day and starts the 45 days over. Pause instead unless you mean it.
Check the allowance before you send
cargo-ai mailboxManagement mailbox get-send-allowance <uuid>
# → {"allowance":{"dailyLimit":12,"rampLimit":12,"sentCount":4,"remainingCount":8}}
Read remainingCount before enrolling a batch. Sends past it do not fail: they wait for the
rolling 24h window to free a slot, so a backlog drains over the following days. A workflow run
lives at most about 15 days, so a backlog deeper than ~15 days of allowance (about 600 sends on a
warmed mailbox) outlives the run waiting for it. rampLimit is where the ramp stands before any
dailySendLimit override tightens it.
Read what happened
cargo-ai mailboxManagement message list --mailbox-uuid <uuid> --statuses sent,replied --limit 50
cargo-ai mailboxManagement message get <uuid>
cargo-ai mailboxManagement thread list --mailbox-uuid <uuid> --search acme
cargo-ai mailboxManagement thread get <uuid>
cargo-ai mailboxManagement event list --kinds replied,unsubscribed --occurred-after 2026-08-01
- Message vs thread vs event. A message is one outbound send. A thread is a
conversation — its
lastEmailandlastEventare what you sort a reply queue on. An event is something that happened to a message (sent,opened,clicked,replied,bounced,unsubscribed). Inbound replies are events, not message rows; only outbound mail is a message. --statusesonmessage list/thread listis the list status —pending,error, or an event kind.successis not in that set: a delivered message reads assentor later.--kinds,--statuses,--reasonsare all comma-separated with no spaces.bouncednever fires yet. Nothing parses delivery-status notifications, so bounces do not produce events and do not auto-suppress. Do not build a deliverability report that treats an empty bounce count as a clean list.message,thread, andeventlists default to--limit 50(max 200) and return acount.mailbox listandsuppression listhave no default limit (max 1000), andmailbox listreturns nocount— seereferences/response-shapes.md.
Suppression
Workspace-wide, not per mailbox: a recipient opting out is opting out of the sender, not of one address the sender happens to own.
cargo-ai mailboxManagement suppression list --reasons unsubscribed,manual
cargo-ai mailboxManagement suppression create --email opted-out@acme.com
- Reasons are
unsubscribed(the recipient's own choice, viaList-Unsubscribe),bounced,complained, andmanual.suppression createalways recordsmanual. - It is idempotent — suppressing an already-suppressed address returns the existing row.
- Addresses are normalised (
trim().toLowerCase()) on both write and check, so casing and stray whitespace cannot slip a suppressed recipient back into a send. - There is no
suppression remove. That is deliberate.
Pricing
cargo-ai mailboxManagement pricing get
# → {"monthlyCredits":{"google":125,"outlook":160,"shared":100,"private":100}}
Read this live before quoting a fleet cost — the figures above are what the workspace returned at the time of writing, not a constant.
Sending: the sendEmail action
Delivery is deliberately not in this CLI domain. It is a native orchestration action so that sends inherit orchestration's pacing, retry, and credit machinery:
cargo-ai orchestration action execute \
--action '{"kind":"native","actionSlug":"sendEmail"}' \
--data '{"mailboxUuid":"<mailbox-uuid>","to":"jane@acme.com","subject":"...","bodyHtml":"<p>…</p>"}' \
--wait-until-finished
- 0.1 credits per send, fixed. The action carries no
config; the inputs go in--data, like every other action (../cargo-orchestration/SKILL.md). - Optional
bodyText(generated from the HTML when omitted),inReplyTo, andreferences. - To keep a reply threaded, send the whole chain.
referencesis everyMessage-IDin the thread so far, oldest first — not just the parent. Mail clients break the thread otherwise. - The action is rate-limited per mailbox: capped at that mailbox's own daily limit, with a random 1 to 3 minute gap between two sends. A burst of 100 on a mailbox with 40 left sends 40 and the other 60 wait for the window to roll rather than failing.
- A refused send is a node error, not a thrown exception.
recipientSuppressed,mailboxNotActive,mailboxSendingPaused,mailboxNotFound, andtransportNotSupportedneed a human and do not retry;dailyLimitReached,credentialsMissing, anddeliveryFailedretry on their own. - There is no dry run from the CLI. The engine has one, but no
action executeflag reaches it — the send is live the moment you run the command. Send to yourself first.
Threading, the full refusal table, and what Cargo injects into every message (unsubscribe
header, open pixel, click redirect) are in references/sending.md.
Reading events back from a workflow: listEmailEvents
mailboxManagement event list is the CLI read, but inside a workflow the delivery events on a
thread come from a native action (CLI ≥ 1.0.86), so a play can branch on whether someone
replied:
cargo-ai orchestration action execute \
--action '{"kind":"native","actionSlug":"listEmailEvents"}' \
--data '{"threadUuid":"<thread-uuid>","kinds":["replied","clicked"],"limit":50}' \
--wait-until-finished
threadUuidis required;kindsis optional (omit for every event on the thread) andlimitdefaults to 50, capped at 200, newest first.- Event kinds are
sent,opened,clicked,replied,bounced,unsubscribed. Note the wire value isopenedeven though the UI labels it "Viewed". - Each event returns
uuid,mailboxUuid,messageUuid,threadUuid,kind,occurredAt,actorEmail, plus nullableurl(onclicked),inboundRfcMessageId, andsnippet. bouncedstill has no producer — nothing parses delivery-status notifications yet, so filtering on it returns nothing and proves nothing. Never report an empty bounce count as a clean list.
Cost discipline
This domain bills differently from the rest of the pack, and the difference is the thing to say out loud before provisioning anything.
- A mailbox is a monthly, recurring charge — 100–160 credits per mailbox, per month, for
as long as it exists. Five mailboxes is 500–625 credits every month, not once.
mailbox removeis the only way to stop it; there is no pause. Quote the fleet size and the monthly credit estimate from a livepricing get, and get an explicit yes, before the firstcreate. - Sends are 0.1 each, so volume is cheap and the fleet is not. Do the arithmetic in that order.
- A play or scheduled tool that calls
sendEmailre-bills on every run — and re-contacts the same people on every run, which is the §6 cadence gate inacceptable-use.mdas much as a spend gate. Checkget-send-allowancebefore enrolling a batch: rows past the allowance wait for later windows, and a backlog deeper than ~15 days of allowance outlives its run. - The full spend rules — sampling before a full enrollment, the approval message, the receipt —
are
../cargo-gtm/references/cost-discipline.md.
Declarative alternative: defineMailbox (project)
For the inbox itself, prefer a project — the mailbox create help says so, and the reason is that
a mailbox is long-lived infrastructure with a monthly cost, which is exactly what belongs in
git and in a plan you can review. defineMailbox (with defineDomain for the sending domain)
covers it; adopt: true binds a mailbox bought in the web app instead of provisioning a second
one. See ../cargo-project/SKILL.md and "Declarative vs imperative" in
../cargo/SKILL.md.
Use this skill's imperative commands for one-off provisioning, and for everything a project does not model at all: warm-up, allowance, messages, threads, events, and suppressions.
When the CLI surprises you
If a documented flag or response shape doesn't match what you observe, re-refresh the CLI and
skills; if it still doesn't add up, file a report — it's read by the team. The missing
domainManagement surface is a live example: mailbox create needs a --domain-uuid that no
command can produce.
cargo-ai workspaceManagement report create \
--title "<one-line summary>" \
--description "<exact command(s), errorMessage verbatim, expected vs actual, UUIDs>"
Presenting results
Follow ../cargo/references/interaction.md: lead with the
outcome ("mailbox active, 8 of today's 12 sends left, 2 replies since Monday"), summarize a
fleet or a reply queue as a compact table, and never dump raw mailbox get or event list JSON
into the conversation. When you report a fleet, report its monthly cost, not a one-off one.
FAQ
What does the cargo-mailbox-management skill do?
Send mail from inboxes Cargo owns — provision mailboxes on a sending domain, run provider warm-up and the 5→40/day send ramp, deliver with the sendEmail action, and read back threads, replies, delivery events, and the workspace suppression list. Triggers: "set up a sending mailbox", "provision inboxes for outbound", "warm up this mailbox", "how many sends do I have left today", "send this from Cargo", "did they reply", "who unsubscribed", "suppress this recipient", "take me off your list", "never email them again", "what do mailboxes cost", "my mailbox is stuck pending". A mailbox is a recurring monthly credit charge, and every send is gated on basis, suppression, and relevance. Skip when: writing the copy or building the audience — use cargo-gtm; the mailbox belongs in git — use cargo-project.
How do I install cargo-mailbox-management?
Run npx skills add https://github.com/getcargohq/cargo-skills --skill cargo-mailbox-management in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/cargo-mailbox-management/ (personal) or .claude/skills/cargo-mailbox-management/ (project).
Which AI agents can use cargo-mailbox-management?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is cargo-mailbox-management safe to install?
Security partners have reviewed it: Gen Agent Trust Hub passed; Socket passed; Snyk flagged items to review. As with any skill, read the SKILL.md and bundled scripts before installing.
Who maintains cargo-mailbox-management?
It is published by getcargohq in getcargohq/cargo-skills. It has 5,175 recorded installs.
More from getcargohq/cargo-skills
cargo-connection
getcargohq/cargo-skills
Connect Cargo to an external system and find out what it can do — authenticate connectors, browse the integration catalog, and resolve the connectorUuid and actionSlug a workflow node needs. Triggers: "connect my HubSpot", "is Salesforce connected", "what integrations do you support", "can Cargo talk to ", "what actions does have", "I need the connector UUID", "set up the API key for", "it is asking for credentials again", "why is this connector failing auth", "list my connectors". Integrations: amplemarket, amplitude, attio, bigQuery, calendly, cargoSignals, closecom, contrast, csv, customerio, dbt, emailBison, expandi, googleAds, googleCalendar, googleSheets, heyReach, http, hubspot, hubspotMcp, instantly, instantlyV2, intercom, jira, kitt, lemlist, lgm, linkedinAds, linkedinMatchedAudience, livestorm, manus, marketo, metaAds, metabase, microsoftTeams, mixpanel, monaco, netsuite, netsuiteSoap, nooks, notionMcp, octave, onesignal, outreach, pipedrive, postgresql,
cargo-gtm
getcargohq/cargo-skills
Do business-to-business go-to-market work on Cargo — research accounts and buying committees, enrich and verify B2B contact records from licensed data providers, score and qualify leads, draft permission-based outreach for the user's own sequencer, sync to CRM, and monitor buying signals. Consent basis, suppression lists, and volume limits gate every step that touches a person (references/acceptable-use.md); bulk unsolicited messaging, purchased or scraped lists, and consumer targeting are refused. Triggers: "build me a list of", "find 50 at ", "who works at", "find work emails for these accounts", "enrich this CSV", "verify these emails", "build a TAM", "who fits our ICP", "who actually buys from us", "what data points should we collect on accounts", "our outbound is reaching the wrong people", "score these leads", "write a first-touch email", "push these to my CRM", "who changed jobs", "who just raised funding", "companies using ", "who is hiring ", "fi
cargo-ai
getcargohq/cargo-skills
Build and configure AI agents inside Cargo — create an agent, choose its model and temperature, write its prompt, attach knowledge for retrieval (RAG), connect MCP tool servers, manage memories, and deploy releases. Triggers: "create an agent", "make an agent that", "give the agent our docs", "attach this knowledge base", "attach this library to the agent", "add resources to the agent release", "connect an MCP server", "expose our tools as an MCP server", "use Cargo from Claude Desktop or ChatGPT", "change the agent model", "what does the agent remember", "deploy the agent", "the agent is answering wrong". Skip when: uploading the knowledge files themselves — use cargo-content; sending the agent a message or running it over records — use cargo-orchestration.
cargo-workspace-management
getcargohq/cargo-skills
Administer a Cargo workspace and talk back to the Cargo team — invite and manage members, mint and rotate API tokens, organize plays, tools, and agents into folders, inspect roles, upload batch input files, and file reports. Triggers: "invite my teammate", "create an API token for CI", "who has access", "organize these into folders", "rotate that token", "upload this CSV for a batch" — and for feedback: "report this bug to Cargo", "send feedback to the Cargo team", "this CLI command is broken", "share this session with Cargo", "request a feature". Most commands need a token with admin access. Skip when: the question is about credits, plans, or invoices — use cargo-billing.
cargo-orchestration
getcargohq/cargo-skills
Make Cargo actually run something, or show what it would run — execute one connector action, run a multi-step workflow, trigger a batch across a whole segment or model, message an AI agent, build or edit a node graph, draw a workflow, tool or play as a diagram, and query the runtime tables (runs, batches, spans, records) with SQL. Triggers: "run this on all my contacts", "execute the action", "kick off a batch", "build a workflow", "schedule a play", "make it run every morning", "ask the agent", "show me the workflow", "what does this tool do", "visualize this play", "draw the graph", "explain this workflow", "how many runs failed today", "what is the output schema for this action", "add a step that". Skip when: explaining why a run misbehaved — use cargo-diagnostics; downloading result files — use cargo-analytics; committing the workflow as code — use cargo-project.
cargo-billing
getcargohq/cargo-skills
Understand what Cargo is costing — remaining credits, usage broken down by workflow, connector, or agent, subscription state, and invoice history. Triggers: "how many credits do I have left", "what did that cost", "why is my bill so high", "am I about to run out", "will this fit in our budget", "show me my invoices", "how much have I spent this month", "what plan am I on", "what do I get for free", "how many free credits", "can I afford this run", "add a card", "update my payment method", "why was my card declined". Needs a token with admin access. Skip when: attributing spend to specific nodes or cutting a play cost — use cargo-diagnostics.
Popular code quality & workflow skills
grill-me
mattpocock/skills
A relentless interview to sharpen a plan or design.
improve-codebase-architecture
mattpocock/skills
Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.
handoff
mattpocock/skills
Compact the current conversation into a handoff document for another agent to pick up.
domain-modeling
mattpocock/skills
Build and sharpen a project's domain model. Use when discussing codebase terminology, writing or editing a GLOSSARY.md, or recording or editing an ADR.
codebase-design
mattpocock/skills
Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
diagnosing-bugs
mattpocock/skills
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.