# Supervising your agents

Source: https://molted.email/docs/portal

What a person sees and clicks in the Molted portal - the Needs you stack, decision links, bulk send review, the email viewer, keyboard shortcuts, Activity, and Settings.

The portal is the signed-in side of Molted, at `/app`. Your agents do the work through the API, the CLI and MCP. You use the portal to watch what they did and to decide the few things they are not allowed to decide alone: sends held for approval, emails held by a safety rule, a conversation an agent handed to you, a deleted mailbox, a setup step only a person can finish.

Decisions are for a person. A portal session that an agent holds cannot see the queue or decide anything. When another page of these docs says "a person decides", this is where they do it.

## Home

Home (`/app`) is one headline, one sentence of numbers, one card, and a timeline.

- **The headline** counts what needs you: "3 things need you.", "1 thing needs you." or "All clear."
- **The sentence** under it summarizes the last 7 days: how many emails your agents sent, how many replies came back, and the bounce rate with a plain verdict ("healthy", or a warning when it climbs). Each number opens [Analytics](#analytics) on that metric.
- **The card** in the middle is the next decision. See [The Needs you stack](#the-needs-you-stack).
- **The timeline** under it is [Activity](#activity-timeline).

Home updates by itself while it is open. When an agent asks for something, the card appears without a reload. When nothing is waiting, the card says "Nothing needs you."

Two more things can show up. A pill in the top bar that reads "23 waiting" (with a card under the queue) means emails arrived that Molted stored but is holding back from your agents, because the plan's incoming-email allowance is used up or the plan has ended. It links to **Settings > Plan**. The mail is released once the allowance resets or the plan is active. And on your first visit a short tour points at the queue, the Activity controls, the search button and the account menu.

## The Needs you stack

Decisions queue up as cards, one in front at a time with the next ones peeking out behind it. Along the left of the card (above it on a phone) is a row of pills, one per kind of card, such as "2 handoffs" or "214 sends". Click a pill to jump to the first card of that kind. A small amber dot on a pill marks something that is about to expire.

The most urgent kinds come first: agent invites, then handoffs, held emails, emails to review and deleted mailboxes, then setup steps, then sends and templates. Inside a kind the card that expires soonest comes first, then the oldest.

Every card has a secondary button on the left and a primary button on the right, and each button shows a one-letter shortcut. Press the letter to press the button. The primary button is usually **A**, and A is always the safe choice: where the safe choice is to look first, A opens the thing instead of deciding it.

A card you decide plays a short animation and the next one comes forward. If someone else decided it first, or it expired, the card clears with "Already handled." or "That one expired before it was decided." If a decision fails, the card stays so you can try again, and a line under it says why.

### The nine cards

| Card | What it says | Buttons |
| - | - | - |
| **New agent wants in** (agent invite) | "Agent invite "support-agent" is waiting to be claimed", with a countdown to its expiry. | **Deny** (D) revokes the invite. **Let it in** (A) opens [Connect an agent](#connect-an-agent), because the agent claims its own invite, you do not approve it here. |
| **Handed to you** (handoff) | "[tom@acme.com](mailto:tom@acme.com) is waiting on a person", with the agent's note, or "[tom@acme.com](mailto:tom@acme.com) replied" (**They replied**) when the contact wrote again on a conversation you took over. | **Hand back** (H) gives the conversation back to your agent. **Open thread** (O). Links under the card: **No reply needed** and **Spam**, see [Handoffs](#handoffs). |
| **Held before your agent saw it** (held email) | "Message from [x@y.com](mailto:x@y.com) held for review", why a safety rule held it, and the start of its text as plain text. | **Delete** (D) rejects it: your agent does not receive it. **Open** (A) opens the [email viewer](#the-email-viewer). **Release to agent** exists only inside the viewer. |
| **Review an incoming email** (inbound approval) | An email the classifier routed to a person, quoting its start, with flags such as "Low confidence" or "In a conversation with you". | **Reject** (R) and **Approve** (A). For a request to stop receiving mail the buttons read **Not an unsubscribe** and **Unsubscribe them**, and when the classifier was not confident **Not an unsubscribe** takes A and **Unsubscribe them** takes U. Link: **Open thread**. See [Approval queues](https://molted.email/docs/approval-queues.md#inbound-and-template-approvals-in-the-portal). |
| **Approve a send** | "Email to [tom@acme.com](mailto:tom@acme.com) waiting for your approval", and which agent or journey wrote it. | **Reject** (R) and **Approve** (A). |
| **Approve these sends** (bulk send) | "214 emails waiting for your approval", a sample email you can open, and the oldest wait. | **Review** (V) opens [bulk review](#bulk-send-review). **Approve all 214** (A). Links: **Reject all**, and **Stop asking for [sales@acme.dev](mailto:sales@acme.dev)**, which opens that mailbox's page where you can change its approval rule. |
| **An agent deleted a mailbox** | "support-bot archived [support@acme.dev](mailto:support@acme.dev). It's deleted for good on October 15, 2026." with the days left. | **Restore** (A) brings back the mailbox with its mail and conversations. **Dismiss** (X) only clears the card, the mailbox is still deleted for good on its date. See [Mailboxes](https://molted.email/docs/mailboxes.md#deleting-a-mailbox). |
| **Approve a template** | "Template "welcome" (version 3) is waiting for your approval" and its lint result. A template that fails lint can still be approved. | **Reject** (R) and **Approve** (A). Link: **Preview** opens the version as written in the email viewer. |
| **Setup** | One of three: activate billing, connect an agent, or verify a domain's DNS. | See [Setup cards](#setup-cards). |

A bulk send is any group of pending sends from the same agent, journey and mailbox. One pending send on its own is an **Approve a send** card.

### Held sends

A send held for approval by a mailbox's [autonomy level](https://molted.email/docs/autonomy-levels.md) shows as **Approve a send**: the recipient, the agent or journey that wrote it, and how long ago. **Approve** queues it for delivery. **Reject** drops it. A held send that nobody decides expires after 24 hours and is not delivered.

To read the draft before you decide, open its conversation (press **⌘K** and type the contact or the subject). The conversation page shows the held draft as its main card with **Approve** (A) and **Reject** (R), and **View email** opens it in the [email viewer](#the-email-viewer), which has the same two buttons.

### Handoffs

An agent can [hand a conversation to a person](https://molted.email/docs/threads.md#hand-a-thread-to-a-human). You see it as a **Handed to you** card, and its page (`/app/thread/<id>`) has the job in one card:

- **Take over** (T) stops your agent sending to that contact from that mailbox until you hand it back.
- Once you have it, the card reads "It's yours" and the button is **Hand back to your agent** (H). On Home the **Hand back** button takes the thread and hands it back in one step.
- **No reply needed** closes the handoff without sending anything. The conversation becomes `resolved`, and your agent's drafts on it and pending follow-ups are cancelled.
- **Spam** does the same and moves the conversation to the Spam page, where **Not spam** undoes it.
- If the contact writes again while you hold the conversation, the card comes back as **They replied**, with the same buttons. Your agent will not answer; you reply, hand it back, or close it.

Under the card there is always a reply box. Whatever you write there is sent from the conversation's mailbox as you, not as your agent: it goes through the same policy, suppression and rate checks as any send, it is never held for approval, and it is never rewritten by the [humanizer](https://molted.email/docs/humanizer.md). **Replying takes the conversation over** if you had not already, so your agent stays off it until you hand it back.

**Assign to** under the reply box hands the conversation to one of your registered agents instead: pick the agent and press **Assign**.

### Setup cards

A setup card is something your agents cannot do for themselves.

| Card | Why it appears | Buttons |
| - | - | - |
| **Activate billing to start sending** or **Your plan has expired** | The plan blocks sends. | **Settings** (S) opens Settings. **Activate billing** (A) opens **Settings > Plan**. |
| **Connect an agent** | No agent has an active key for this workspace yet. | **Read the docs** (S) and **Connect an agent** (A), which opens [Connect an agent](#connect-an-agent). |
| **Verify DNS for acme.dev** | A custom domain is not verified, so mail from it cannot send. | **Show records** (S) and **Connect DNS** (A), both to that domain's DNS page. See [Domains](https://molted.email/docs/domains.md#the-dns-page-in-the-portal). |

## Decision links

When an agent tries something only a person may do, the API answers `403 human_decision_required` with a `decisionUrl`. The agent is meant to stop and give you that link. It always looks like `/app/decide/<kind>/<id>`.

Open it and sign in if you are asked to; you come straight back. Then one of these happens:

| `kind` | Where you land |
| - | - |
| `send` | The card on Home. A send that sits inside a bulk card opens that batch's [Review page](#bulk-send-review). |
| `thread` | The conversation's page. |
| `held` | The held email's conversation, or its card on Home. |
| `inbound` | The inbound approval's card on Home. Older than 30 days, it is not on Home, so the link shows the card itself with a note above it. |
| `template` | The template approval's card on Home. |
| `billing` | **Settings > Plan**. |
| `autonomy`, `mailbox-resume` | That mailbox's page. |
| `mailbox-address` | That mailbox's page, at **Address**. |
| `humanizer` | That mailbox's page for a mailbox's own style, otherwise **Settings > Safety**. |
| `safety-settings` | **Settings > Safety**. |
| `api-key` | **Settings > Access**. |
| `adopt-invite` | [Connect an agent](#connect-an-agent). |
| `account-resume` | Home. |
| `contact` | The contact, where the owner can erase it. |
| `inbound-intent` | A note that approving every email of one kind at once is an API action; you approve them one by one on Home. |
| `suppression`, `domain-warmup`, `domain-rate-limits`, `tenant-settings`, `agent-config` | A page that says what the agent asked for and points at the docs, because these have no portal screen. See [Loosening a control](https://molted.email/docs/errors.md#loosening-a-control). |

The pages that explain a request say "This needs a person." and tell you what was asked. Nothing is stored from the agent's request: the link is the blocked ask, not a pending change. If the thing is already decided, expired, or the link is out of date, the page says "Already handled." with a **Go Home** button. If Molted could not be reached to check, it says "Can't check this right now." and asks you to try the link again.

## Bulk send review

A bulk card's **Review** opens `/app/review/<batchKey>`, where the key in the address names the batch. The page lists the pending sends of that batch, riskiest first, so you check the few that look off and then let the rest go in one click.

Each row shows the recipient, one line saying why it is ranked where it is, the subject and two lines of the email. Rows are ordered by these signals, strongest first:

1. This recipient complained about an earlier email.
2. The recipient is suppressed or unsubscribed.
3. An earlier email to this recipient bounced.
4. Another recipient at the same company domain complained.
5. Another email to that domain bounced.
6. A role address such as `info@` or `support@`, likely not a person.
7. First contact with this recipient.

Gmail, Outlook and other free-mail domains are never used for the domain signals, because a stranger's bounce there says nothing about this recipient. A row with none of the signals reads "Low risk". Ties keep the order the sends arrived.

On each row **Reject** and **Approve** decide that one send. The keys **R** and **A** decide the row you are in, or the top row when focus is elsewhere. **Approve rest** and **Reject rest** at the bottom decide everything still listed.

Two guards keep a decision to exactly what you saw:

- **Approve all** on the Home card sends the batch's count and the moment the card was drawn (`expectedCount` and `asOf`). **Approve rest** on the Review page sends the exact list of sends you were shown (`expectedIds`). If a send was added, removed or decided in the meantime, nothing is decided. The page or card says the batch changed, and **Refresh** shows the new list.
- One decision covers at most **500** sends. For a bigger batch, Review shows the oldest 500, riskiest first, and the rest-buttons are hidden until the batch fits: decide those rows one at a time, then **Reload** for the next 500. The Home card's **Approve all** and **Reject all** do not cover a batch over 500, so use Review for it.

When every row is decided the page returns to Home and the card is gone.

## The email viewer

Any email in the portal opens in the same viewer: a held email, a held draft, a bulk card's sample, a template version, or a message on a conversation page.

- The header shows the subject, **From**, **To** and, if you open **All headers**, the rest of the headers.
- **Desktop**, **Mobile** and **Plain text** switch how it is shown. Your choice sticks for the session.
- The email is shown inside a locked box: no scripts run, nothing is loaded from the internet, and links are turned off. A link's address is kept as a hover title so you can read where it points. The viewer says "Remote images and links are off in this preview." This is on purpose: a tracking pixel in an incoming email would tell the sender that a person opened it.
- If an email's HTML cannot be shown safely, the viewer shows its plain text instead and says so. A body over 512 KB is cut there.
- Attachments are listed, with a warning when the email is held or quarantined.
- **Esc** closes the viewer. If you clicked inside the email, use the **✕**.

The footer holds the decision. For a held email that is **Delete** and **Release to agent**, and Release is disabled until the email has loaded, so you can only release something you have looked at. A held draft has **Reject** and **Approve**; a template approval has the same two. Neither footer has a letter shortcut.

## Command menu and shortcuts

Press **⌘K** (Ctrl+K on Windows and Linux) from any page, even from inside a text field, to open the command menu. Press it again to close. Type to search; the arrow keys move, **↵** opens, **Tab** reaches the shortcuts around it, **Esc** closes.

| Type | What you get |
| - | - |
| A name | Mailboxes, contacts, pages, and **Conversations** from the whole history of the workspace, see [Threads](https://molted.email/docs/threads.md#search-conversations-in-the-dashboard). |
| `pause`, `pause sales` | **Pause everything**, or one mailbox. `resume` lifts a pause. |
| `new mailbox` | A form to create a mailbox, see [Mailboxes](https://molted.email/docs/mailboxes.md#creating-a-mailbox-in-the-portal). |
| `add domain`, `remove domain` | Add a domain or remove one, see [Domains](https://molted.email/docs/domains.md). |
| `api key` | **Settings > Access** with the create-key form open. |
| `mailboxes`, `contacts` | The full list of either. |
| `label`, `filter label` | On a conversation, add or remove a [label](https://molted.email/docs/labels.md); anywhere, filter Home by label. |

With the menu open and nothing typed, side panels show **Go to** (Home, Analytics, Settings, Journeys, Templates, Lists, Mailboxes, Agents, Domains), **Look up** (Contacts, Filtered as spam, Held as suspicious, each with a count), and **Actions** (Pause everything, or Resume everything, Connect an agent, Export data).

Letter shortcuts work on the page itself, never while a text field, a menu or a dialog has the keyboard. Holding a key decides one card, not the next.

| Where | Keys |
| - | - |
| A Home card | The letter on each button, as in [the nine cards](#the-nine-cards). |
| A bulk review page | **A** and **R** on the row you are in, or the top row. |
| A handoff conversation | **T** take over, **H** hand back. |
| A held draft conversation | **A** approve, **R** reject. |
| A held email conversation | **A** open it, **D** delete it. |

## Activity timeline

Under the card, Activity lists what your agents and the system did, newest first. A conversation row opens its page; an action row (an agent changed a rule, a reply deadline was missed) is read-only. The controls above it:

- **All, Clean, Spam, Quarantine, Trash** filter conversations by what happened to them. Spam and Quarantine rows carry a chip saying why, and offer **Not spam**, **Release** or **Restore** right on the row. An agent-held session sees the chips but not the buttons.
- **Labels** filters by one or more [labels](https://molted.email/docs/labels.md), and whether a conversation needs any or all of them. The filter is in the address, so you can link to a filtered view.
- **All, Conversations, Emails** switch the list. **Emails** shows one row per message, marked Received or Sent.
- **Search** narrows the rows already loaded. For the whole history, use the command menu.
- **Load more** pages further back.

A mailbox's page shows the same timeline for that mailbox only.

## Analytics

`/app/analytics` answers "how is it going?" with one metric at a time. **Sent**, **Replies** and **Bounce rate** are tabs over one chart, with the change against the previous period under the big number. Hover the chart for a day, use the arrow keys to step through days, or open **Show as table**.

- **Range**: 7, 30 or 90 days.
- **Mailbox scope**: all mailboxes, or one. The heading says which ("All mailboxes · all agents" or "[sales@acme.dev](mailto:sales@acme.dev) only"). The address carries the range, metric and mailbox, so a link keeps them.
- **Bounce rate** card with a verdict. **Spam complaints**, **Unsubscribes** (always the whole workspace, since an unsubscribe is not tied to a mailbox) and **Reply rate** cards.
- **Sent by agent**: each agent's share of sends.
- **Plan usage** for the month, always for the whole workspace.
- **Outcomes**: the conversions your agents record, when there are any.

It is deliberately not a reporting tool. For detail your agents read the same numbers through the API, see [Analytics](https://molted.email/docs/analytics.md).

## Workspace, pause and account menu

The top bar is the only chrome.

- **The workspace name** on the left goes Home. The small arrow next to it lists your other workspaces; picking one reloads the portal in that workspace so nothing from the old one stays on screen. If you switch workspace in another tab, a decision you press in this one reloads the page instead of being made in the wrong workspace.
- **The status pill** says whether mail can go out. **Sending** means every mailbox is sending. **3 paused** means some mailboxes are paused. **Paused** means everything is. **Sends blocked** means the plan blocks sends and nothing is paused. Click it to resume a paused mailbox, pause one mailbox (it opens the command menu on `pause`), or **Pause everything** and **Resume everything**. A pause holds outgoing mail; your agents can still read. See [Pause and resume sending](https://molted.email/docs/account-pause.md) for what a pause blocks and how it is lifted.
- **The avatar menu** has **Settings**, **Connect an agent**, the docs, and **Sign out**.

## Connect an agent

**Connect an agent** (`/app/welcome`, from the avatar menu, the **Connect an agent** setup card or the command menu) gives you one prompt to hand to an agent. Underneath, it creates an [invite](https://molted.email/docs/adoption.md#invite-flow) with a claim code for you:

- The code is **single-use** and expires in **one hour**, and the page shows the time left. It gives the agent access to every mailbox, so treat the prompt like a password until it is claimed.
- **Prompt** is a sentence for an agent ("Read .../skill.md and connect to my Molted account with claim code ..."); edit the "Set up email for" part to say what you want set up. **CLI** is the `molted adopt claim <code>` command instead. **Copy** copies whichever is shown.
- Reloading the same tab shows the same code. Opening the page in a new tab, or pressing **New code**, revokes your older Welcome codes first, so there is at most one live code at a time; an agent holding a replaced code is told it was replaced.
- The page then follows along: "Waiting for your agent…", then "Your agent connected", then a list of what is still left for you, such as **Connect DNS** or **Choose plan**, each with a button. When nothing is left it says "Your agent is set up." and offers **Continue to Home**.

## Settings

`/app/settings` is the account-wide page. A mailbox's own rules live on its page, reached from the mailbox list at the top of Settings (filter it by typing), the command menu, or a card.

| Section | What you do there |
| - | - |
| **Mailboxes** | See every mailbox grouped by domain, open one. Deleted mailboxes with days left show here with **Restore**. |
| **Access** | See your API keys, create one (all mailboxes or chosen ones, shown once, with an MCP config to paste), **Revoke** one, or **Undo changes…** to roll back what a key changed, see [Undo what an agent changed](https://molted.email/docs/undo-agent-changes.md). Only the workspace owner creates keys. |
| **Plan** | See your plan and usage, manage billing, or start the plan, see [Billing](https://molted.email/docs/billing.md). |
| **Domains** | Add a domain, open its DNS page, remove it, see [Domains](https://molted.email/docs/domains.md). |
| **Safety** | The spam filter's rules and the [humanizer](https://molted.email/docs/humanizer.md), see [Safety settings](https://molted.email/docs/safety-settings.md). |
| **Workspace** | Rename the workspace (owner only). |
| **Workspace data** | Export your data, or schedule the workspace for deletion (owner only), see [Privacy](https://molted.email/docs/privacy.md). |

If your email is not verified yet, a row at the top asks you to verify it.

## Other pages

| Page | What it is for |
| - | - |
| `/app/journeys`, `/app/journeys/<id>` | See how each [journey](https://molted.email/docs/journeys.md) is doing, its steps and runs, and its [experiment results](https://molted.email/docs/experimentation.md#results-in-the-portal). You can pause a journey, cancel runs, or delete one that is not active. Agents enroll people. |
| `/app/templates` | Read any template, check its lint, approve a version that waits for you, or delete one. Agents write them. |
| `/app/lists` | The [lists](https://molted.email/docs/lists.md#the-portals-lists-page) your agents built. |
| `/app/spam` and `/app/quarantine` | Mail the spam filter or a safety check kept from your agents, until you decide. See [Approval queues](https://molted.email/docs/approval-queues.md). |
| `/app/mailboxes/<id>` | One [mailbox](https://molted.email/docs/mailboxes.md): pause or resume it, choose its approval rule (**Asks every time**, **Asks for new contacts**, **Sends freely**), and more. |

The phone app is not covered here.
