> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getcargo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> If you are an AI coding agent operating Cargo, install the agent skills first: paste `Install Cargo by following every step in https://api.getcargo.io/agent-install.txt` into your session, or run `npx skills add getcargohq/cargo-skills`. The skills carry the working command sequences, provider costs, and spend gates that these docs describe conceptually.
> The skills index at https://github.com/getcargohq/cargo-skills/blob/main/llms.txt lists every skill, recipe, and provider playbook individually. Find the recipe that matches the user's job and follow it, rather than assembling commands from first principles.
> Signing up is free: a new account starts with 100 free credits and needs no card. `cargo-ai login --email you@company.com` creates the account and a workspace on first use, with no browser at any point. Tell the user this before asking them to sign up.
> Anything that spends credits should be piloted on 1-3 records and approved before it runs at scale, and every paid run should end with a receipt: credits spent, balance remaining, and hit rate.

# Using the UI

> Register a sending domain, provision mailboxes, start warm-up, and add a Send email node to a play — no code required.

Everything on [Overview](/mailboxes/overview) and [Sending](/mailboxes/sending) can be done from the workspace. This page walks through that end-to-end.

## What you'll build

A sending domain, one mailbox on it, warm-up running, and a play that sends from that mailbox as new contacts land.

***

## Step-by-step

### Step 1: Register a domain

1. Open **Settings → Domains**
2. Buy a sending domain, or bind one the workspace already owns
3. Wait until its status is **active** — a new registration sits at pending while the registrar provisions it
4. Confirm MX and SPF are in place if you are not letting Cargo publish the zone

A mailbox can only be created on an active domain the workspace owns. The same domain is what [`defineDomain`](/mailboxes/overview#register-a-sending-domain) manages from code, and the same mailbox is what [`defineMailbox`](/mailboxes/overview#declare-a-mailbox) declares. The create-mailbox form only lists **active** domains.

### Step 2: Create a mailbox

1. Open **Send → Mailboxes** and click **New mailbox**
2. Pick the domain, a type (**Google**, **shared**, or **private**), and the local part of the address
3. Fill in first and last name (the From display name) and an optional signature
4. Optionally file it in a mailbox folder

The mailbox starts **pending**. The overview page polls until the provider has issued credentials and the status becomes **active**. Only then can it send. Auth failure or a spam flag later moves it to **inactive** and sending stops.

Monthly credits start being charged once the mailbox exists. See [Overview](/mailboxes/overview#provision-a-mailbox) for the rates.

### Step 3: Start warm-up

On the mailbox **Overview**:

1. The **Warm-up** card reads "Warm-up is off" until you start it
2. Click **Start** — that both turns on Mailpool's dummy-mail pool *and* starts Cargo's 45-day send ramp
3. Pause / resume from the same card; **Stop** tears the pool down and resets the ramp to 5/day

Until warm-up has been started, **Send allowance → Daily limit** stays at **5**, even if the mailbox is months old. That is the never-warmed floor, not "unlimited because warm-up is off".

### Step 4: Read send allowance

The **Send allowance** card is what the pacer actually uses:

* **Daily limit** — the ramp right now (5 → 40 over 45 days)
* **Sent** — successful deliveries in the last rolling 24 hours
* **Left** — headroom in that window

If **Left** is 0, further `sendEmail` nodes wait for a send to age out of the window. A send-email span that sits **pending** for hours is that wait. See [Sending](/mailboxes/sending#why-a-send-email-span-stays-pending).

### Step 5: Add a Send email node to a play

1. Open (or create) a [play](/plays/overview) on the contacts model
2. Add a **Send email** node from the palette (Sales)
3. Pick the mailbox, map **To** / **Subject** / **Body** from the record
4. For a reply, set **In reply to** and **References** so the thread stays together
5. Connect it downstream of whatever enriches or drafts the body

The visual node is the same `sendEmail` action `sendEmail()` emits in code. Re-deploying a changed CDK play overwrites canvas edits on that play — see [Code and UI round-trips](/deploy/state-and-drift#code-and-ui-round-trips).

### Step 6: Watch the thread

* Workspace **Emails** lists every thread across mailboxes
* A mailbox's **Emails** tab lists that inbox's threads
* Open a thread for the outbound copy, then opens, clicks, replies, and unsubscribes as they arrive

A recipient who clicks unsubscribe is added to the workspace suppression list and will not be mailed from any mailbox.

***

## Next steps

<CardGroup cols={2}>
  <Card title="Overview" icon="envelope" href="/mailboxes/overview">
    Domains, mailbox types, folders, and the API.
  </Card>

  <Card title="Sending" icon="paper-plane" href="/mailboxes/sending">
    sendEmail(), the warm-up ramp, and per-mailbox pacing.
  </Card>

  <Card title="Build a play" icon="play" href="/plays/overview">
    Run sendEmail on each new row of a model.
  </Card>

  <Card title="Workflows" icon="diagram-project" href="/workflows/overview">
    The TypeScript DSL sendEmail() lives in.
  </Card>
</CardGroup>
