# Billing & Plans

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

Plans, email limits, free tier, upgrading via Stripe, and managing your subscription.

Plans are priced by mailbox: you pick how many mailboxes your agents run, and each plan comes with separate monthly allowances for sends and inbound email. Every plan gets the whole product, including all the security features below. The public [pricing page](https://molted.email/pricing) has the same numbers.

## Plans

| Plan | Price | Mailboxes | Custom domains | Sends/mo | Daily limit | Hourly limit | Inbound/mo | Humanizer rewrites/mo | Storage | Retention |
| - | - | - | - | - | - | - | - | - | - | - |
| **Free** | $0 | 3 (shared domain) | 0 | 3,000 | 100 (ramps up, see [Free plan](#free-plan)) | 40 | 1,000 | 0 | 100 MB | 14 days |
| **Solo** | $19/mo | 10 | 3 | 10,000 | 1,000 | 200 | 5,000 | 50 | 3 GB | 30 days |
| **Team** | $79/mo | 50 | 10 | 50,000 | 5,000 | 1,000 | 25,000 | 300 | 10 GB | 90 days |
| **Contact us** | Custom | More than 50 | Custom | Custom | Custom | Custom | Custom | Custom | Custom | Custom |

## Inbound allowance

Email you receive has its own monthly allowance (the Inbound/mo column) and never uses your send allowance, so nobody outside can use up your sending by emailing you. Mail quarantined as spam, phishing or malware, or for prompt injection, never counts. Inbound email is never rejected or bounced:

- **Solo and Team** -- past the allowance everything is still delivered, and inbound email past it is billed as overage (about $0.50 per 1,000) on your next invoice.
- **Free** (and a new account before it picks a plan) -- past the allowance new email is still received and stored, but it's held from your agents until the start of next month, or until you move to a paid plan, which releases it right away. The account owner gets an email when this starts.
- **A paid plan's 3-day trial** -- the trial includes 300 inbound emails; past that, new email is held until the trial ends and your plan starts (or you start it now).
- **Expired accounts** (the plan ended, or a failed payment's grace period ran out) -- new email is still received and stored, but all of it is held from your agents until you pay for a plan (or Molted support sets one), which releases it right away. Free is not available once a paid plan has ended. It is not released at the start of a month while the account stays expired. The owner gets one email a month saying how many are waiting. Mail delivered before the plan ended isn't affected, and your data is kept for at least 30 days after the plan ends.
- **Solo and Team** also email the owner once a month if inbound reaches twice the allowance, so a spike doesn't go unnoticed.

While a message is held, agents don't see its subject, sender name, body or attachments, and a thread it started doesn't show in the thread list. Further mail from the same sender joins that thread rather than starting new ones, so the conversation stays in one thread. When it's released, the thread shows up as new mail and an `inbound.released` event fires (SSE and webhooks). Held messages can't be released or rejected by hand.

The portal shows how many emails are waiting (a "23 waiting" badge in the top bar, a card on Home, a count per mailbox, and next to inbound usage in Settings > Plan), and why. `molted billing status` has an `inbound` block (`allowance`, `used`, `remaining`, `overage`, `held`, `heldReason`: `over_allowance`, `paid_trial` or `plan_expired`, `overAllowanceBehavior`, `warning`), and `molted budget` shows `inbound` next to the send windows. A message held for the allowance shows up in the inbox list with `inbound_quota_held: true` and its body hidden until it's released.

## Sends to your team

Sends to your own verified team addresses don't count toward your send allowance, on every plan including Free: not toward the monthly or daily limits, a trial's total or overage. They still count toward the hourly limit and go through every other check. Verified team addresses are your members' verified emails plus notification addresses someone confirmed through the link we email them, up to 3 on Free, 10 on Solo and 25 on Team. See [Rate Limits](https://molted.email/docs/rate-limits.md#sends-to-your-team-are-free).

## On every plan

Plans differ in mailboxes, domains and volume, not in security. Free included, every plan gets:

- **Prompt-injection screening** of every inbound email, with high-risk messages quarantined by default. See [Safety settings](https://molted.email/docs/safety-settings.md).
- **Canary tokens** in every thread: a reply that repeats one is blocked by default.
- **Thread checks**: a sender new to a thread who flips what it's about is held for a person by default, and for seven days after a high-risk message, your agent's replies on that thread wait for a person.
- **The send policy**: duplicates, cooldowns, suppressions and send limits, checked before anything leaves. See [Rules](https://molted.email/docs/rules.md) and [Suppressions](https://molted.email/docs/suppressions.md).
- **Autonomy levels and approvals** per mailbox, and thread handoff to a person. See [Autonomy levels](https://molted.email/docs/autonomy-levels.md).
- **An audit log** of sends, policy blocks, approval decisions and mailbox changes.
- **API keys scoped to mailboxes**, with read, send or manage rights on each. See [API keys](https://molted.email/docs/api-keys.md).

## Overage and credits

Solo and Team keep working when you pass the monthly allowance, once the trial is over:

- **Sends**: about $1.50 per 1,000 past the allowance, billed on your next renewal invoice (everything sent since the previous one, whatever day your plan renews), up to twice the allowance. Past that cap a send is refused with `overage_cap_exceeded`. The daily and hourly limits still apply.
- **Inbound email**: about $0.50 per 1,000 past the allowance, on the next invoice. Quarantined spam never counts. See [Inbound allowance](#inbound-allowance).
- **Humanizer rewrites**: credits at $0.02 each, up to twice the allowance, billed on the next renewal invoice (not on a plan set by Molted support, which gets the allowance only). Past that (and on Free, which doesn't include the humanizer) emails still send, just not rewritten. See [Humanizer](https://molted.email/docs/humanizer.md#plans-and-limits).

Overage and credits count against the plan you were on when you used them: after a mid-month upgrade, overage from before it is still on the next invoice. If a subscription ends, overage and credits from its last period are not billed, and a new subscription starts clean.

Free and a paid plan's trial have no overage: their monthly send allowance is a hard stop until the next month (or the end of the trial).

See [Mailboxes](https://molted.email/docs/mailboxes.md) and [Storage](https://molted.email/docs/storage.md) for details on mailbox and storage limits.

## Free plan

Every new account starts in a **trial** state. Sends are blocked until you activate a plan.

Before your trial ends, you can activate the **Free** plan to keep sending without a credit card:

- **No credit card required** -- activate it in **Settings > Plan** in the portal.
- **3,000 sends a month**, up to 100 a day and 40 an hour.
- **A ramp for new accounts** -- Free sends from our shared domain, so a new Free account starts lower and steps up by age: **20 a day in week 1, 50 a day in week 2**, then the full 100 a day. The weeks count from when you activated Free. If your emails bounce or draw spam complaints (a bounce rate above 5% or a complaint rate above 0.1%), the ramp holds at its current step until that recovers. `molted budget` shows the daily limit in effect, and during the ramp `daily.freeRamp` shows the step, whether it's held, and when the next step applies.
- **1,000 inbound emails a month**. Past that, new email is still received but held from your agents until next month or until you upgrade (see [Inbound allowance](#inbound-allowance)).
- **3 mailboxes on the shared domain, 100 MB storage, 14-day retention**.
- **Every security feature** -- injection screening, the send policy, approvals, API keys, everything.

**Free is for verified humans only, on a real email address.** It's the one plan that needs no card and no checkout, which makes it the easiest path to abuse, so it activates only when the account owner is a verified human -- signed up through the portal with a confirmed email address that isn't a disposable/throwaway domain. This rule always applies; it isn't something a workspace's human-gate setting can loosen.

An account created through the CLI or the API (`molted auth signup`, or any signup that identifies itself as an agent) is **agent-owned** and cannot activate Free:

```bash
curl -X POST https://mailbox.molted.email/v1/billing/activate-free \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
# -> 403 { "error": "free_plan_requires_human", "plans": ["solo", "team"], "setupLinkRoute": "/v1/billing/setup-link", ... }
```

For Free, run `molted auth login-link --next "/app/settings#plan"` and follow what it returns: your human takes the account over by email (when its address is their own inbox) or claims the workspace with a link you give them (see [Links for your human](https://molted.email/docs/authentication.md#links-for-your-human-take-over-claim-or-sign-in)), and then `activate-free` works, also with your existing key. Or buy a paid plan -- see [Free trial (paid plans)](#free-trial-paid-plans) below. A human owner whose email isn't verified yet gets `403 { "error": "email_verification_required" }` until they verify. A verified human owner on a disposable email domain (mailinator.com and the like) gets `403 { "error": "disposable_email_not_allowed", "plans": [...], "setupLinkRoute": "..." }` -- use a real address, or buy a paid plan. A false positive can be allowlisted with the `DISPOSABLE_EMAIL_ALLOWLIST` env var (comma-separated domains).

For a verified human owner, activation works from the portal (**Settings > Plan**, click **Activate free plan**) or the CLI:

```bash
molted billing activate-free
# -> { "plan": "free" }
```

The route needs a key with `manage` scope on all mailboxes. Two more refusals are `400`: activating from any plan other than `trial` (`Cannot activate free plan from "<plan>" plan. Only trial accounts can activate the free tier.`), and a workspace whose plan is set by Molted support.

Existing Free tenants (activated before this rule shipped, or granted by an admin) keep their plan -- nothing here claws it back.

**Free sending can be paused platform-wide.** Free accounts share our sending infrastructure, so if it's being abused, Molted can pause sending for every Free account at once. While it's paused, sends from a Free account are blocked with the reason `free_sends_paused` (see [Errors](https://molted.email/docs/errors.md)); journeys and scheduled follow-ups wait and resume on their own, and approvals stay pending. Paid plans are never paused this way.

You can upgrade to a paid plan at any time.

## Free trial (paid plans)

When a new account picks Solo or Team for the first time, it starts with a 3-day free trial. Upgrading from Free has no trial: the paid plan and its full limits start right away (and any inbound held for the Free allowance is released). An email address whose earlier account was deleted can sign up again, but its new account gets no second trial: its first paid plan starts right away, as if you had skipped the trial. `GET /v1/billing/status` reports this as `trialEligible`.

- **Credit card required** -- collected via Stripe Checkout upfront. You won't be charged until the trial ends.
- **Trial limits** -- 100 emails in total, 3 mailboxes, 1 custom domain, 300 inbound emails and 5 humanizer rewrites.
- **Auto-converts** -- after 3 days your chosen plan activates, billing begins and the full plan limits apply.

### Skipping the trial

Don't need the trial? Skip it at checkout and your plan starts right away:

```bash
molted billing setup --plan solo --skip-trial
```

Or send `"skipTrial": true` to `POST /v1/billing/setup-link`.

`POST /v1/billing/setup-link` takes `plan` (`solo` or `team`, default `solo`; the legacy names `starter` and `growth` are aliases), `skipTrial`, and optional `successUrl` / `cancelUrl` (http or https; they default to the portal's **Settings > Plan**). It returns `{ "url": "<Stripe Checkout URL>", "plan": "solo" }`, needs a key with `manage` scope on all mailboxes, and is refused with `400` when the workspace already has an active paid subscription (change plans in the billing portal instead). The CLI flags are `--plan`, `--skip-trial`, `--success-url` and `--cancel-url`. MCP: `billing_checkout_link` (`plan`, `skip_trial`).

### Start your plan now

Already in a trial and need the full limits? End the trial early. Your card is charged now and the full plan limits apply immediately. In the portal, go to **Settings > Plan** and click **Start my plan now**, or:

```bash
molted billing start-now
# -> { "started": true, "plan": "solo", "status": "active" }
```

Or call `POST /v1/billing/start-now`. `molted billing status` shows `"canStartNow": true` while this is possible. If the payment fails, nothing changes and your trial continues; if your bank asks for 3D Secure, finish the payment from **Manage** in **Settings > Plan**.

Starting a plan spends money, so it's a human decision. Through the API or CLI it needs an admin-scoped key on all mailboxes, and on the default (`enforce`) human gate an agent gets `403 human_decision_required` (`kind: "billing"`) with a link to hand to a person, who clicks **Start my plan now** in the portal. A workspace whose human gate is `warn` lets it through with a deprecation header, and `off` allows it. Without a trialing subscription the call is a `400`; if the payment fails it returns `402` (`payment_action_required` when the bank wants 3D Secure, `payment_failed` otherwise).

## Expired state

Your account enters the **expired** state when:

- Your paid subscription is cancelled, or stops paying (including a paid plan's trial that doesn't convert)
- A payment fails and the grace period (7 days by default) expires
- A plan set by Molted support ends

A new account that hasn't picked a plan yet stays in the `trial` state; it doesn't expire on its own.

In expired state the portal remains accessible (read-only) but all sends are blocked with reason `subscription_expired`, and attachment uploads (`POST /v1/attachments`) are refused with `402` and error `subscription_expired`. You can still list and download your attachments. To resume sending, subscribe to a paid plan:

```bash
molted billing setup --plan solo
# Returns a Stripe Checkout URL -- open it, or hand the workspace to your human
# (a take-over email or a claim link while no person owns it, else the portal):
molted auth login-link
```

Note: `activate-free` is only available from the trial state. Once expired, you must subscribe to a paid plan.

## Checking billing status

Run `molted billing status` (`GET /v1/billing/status`; MCP `billing_status`) to see your current plan, whether sends are blocked, and what actions are available.

```json
{
  "plan": "trial",
  "state": "needs_payment_setup",
  "sendBlocked": true,
  "hasPaymentMethod": false,
  "actions": ["setup_billing", "activate_free"],
  "sellablePlans": ["solo", "team"]
}
```

The full response also carries `inTrial`, `trialDaysRemaining`, `trialEligible`, `canStartNow`, `inGrace`, `graceDaysRemaining`, `limits` (the plan limits in effect), `activateFreeBlockedReason`, and usage blocks: `overage`, `humanizer`, `inbound`, `mailboxes`, `storage` and `domains`.

`actions` includes `"activate_free"` only when the account owner is a verified human on a non-disposable email domain -- an agent-owned account (e.g. one created through the CLI), an unverified human owner, or a verified human owner on a disposable domain all see `actions: ["setup_billing"]` instead, since `activate-free` would just 403 for them. When it's missing, `activateFreeBlockedReason` says why (`"free_plan_requires_human"`, `"email_verification_required"`, or `"disposable_email_not_allowed"`; `null` otherwise). `sellablePlans` always lists the paid plans a checkout will sell.

The `actions` array tells you what you can do next. Here is what each billing state means and the commands to run:

| State | Sends | What to do |
| - | - | - |
| `needs_payment_setup` | Blocked | Activate the free plan or upgrade to a paid plan (see commands below). `actions`: `setup_billing`, plus `activate_free` when the owner qualifies. |
| `payment_ok` | Allowed | No action needed -- you're all set (paid, Free, a paid trial with a card, or a plan set by Molted support). `actions` is empty. |
| `payment_action_required` | Allowed (temporarily) | `actions`: `update_payment_method`. Update your payment method in the portal: `molted auth login-link` gets a link for your human (they sign in with their own account), then **Settings > Plan** and **Manage**. |
| `payment_failed_grace` | Allowed (grace period) | `actions`: `update_payment_method`. Update your payment method before the grace period ends. `molted auth login-link` gets your human a link to the portal. |
| `billing_paused` | Blocked | The account is expired (see [Expired state](#expired-state)). `actions`: `setup_billing`. Subscribe to a paid plan to resume sending. |

### Next steps by action

When `actions` includes `"activate_free"` -- activate the free plan (no credit card; only offered to a verified human owner):

```bash
molted billing activate-free
# -> { "plan": "free" }
```

When `actions` includes `"setup_billing"` -- upgrade to a paid plan:

```bash
molted billing setup --plan solo
# Returns a Stripe Checkout URL -- open it in a browser, or get a link for your human with:
molted auth login-link
```

After activating, run `molted billing status` again to confirm `sendBlocked` is `false`.

## Upgrading

1. Go to **Settings > Plan** in the portal (`/app/settings#plan`).
2. Select the plan you want (Solo or Team).
3. You'll be redirected to Stripe Checkout to enter payment details.
4. If this is your first time on a paid plan, you get a 3-day free trial. To start the plan right away instead, tick **Skip the 3-day trial** (next to the plan buttons) before you choose the plan, or pass `--skip-trial` on the CLI. The checkbox only shows when checkout would start a trial: upgrading from Free, or re-subscribing after expiry, is charged right away and has none.
5. Once confirmed, your new limits take effect immediately.

Have a promo code? Enter it at checkout.

## Managing your subscription

Click **Manage** in **Settings > Plan** to open the Stripe Customer Portal. From there you can:

- Update your payment method
- View invoices and payment history
- Change or cancel your plan

## Usage tracking

Your current usage against plan limits is shown in **Settings > Plan** and available via the API: `molted budget` (`GET /v1/agent/budget`, MCP `check_budget`) shows the send windows and inbound, and `molted billing status` everything else. See [Rate Limits](https://molted.email/docs/rate-limits.md#checking-usage).

Billing status also carries a `humanizer` block with this month's rewrites:

```json
"humanizer": {
  "allowance": 50,
  "cap": 100,
  "used": 57,
  "remaining": 43,
  "creditsUsed": 7,
  "creditsEligible": true,
  "creditPriceCents": 2,
  "enabled": true,
  "warning": null
}
```

`warning` is set (for example `humanizer_not_in_plan`) when the humanizer is switched on but rewrites are being skipped.

## Send quota emails

Molted emails the workspace owner as your monthly send allowance fills up. Each email goes out once per month (UTC) per threshold, and whichever send crosses the threshold triggers it, including a journey step or a scheduled follow-up:

| When | Subject | What it says |
| - | - | - |
| The month's sends reach 80% of the allowance | You're approaching your email sending limit | You've used 80% of the monthly limit; consider upgrading if you expect to pass it. |
| Free and trials: the allowance is reached | You've reached your email sending limit | Sending is paused until next month; upgrade to continue. |
| Solo and Team: the first send past the allowance | You've exceeded your email limit - overage is active | Overage sending is now active and further emails are billed at the overage rate. |

The email goes to the workspace owner. A workspace with no owner on record gets none. Sends to a [team address](https://molted.email/docs/rate-limits.md#team-addresses) don't count toward the allowance, so they never trigger it.

## Exceeding limits

When a send would pass a limit, it is blocked with a reason naming the window:

| Reason | When |
| - | - |
| `monthly_limit_exceeded` | The monthly allowance on Free, or the trial's allowance during a paid plan's trial |
| `overage_cap_exceeded` | Solo and Team: past the overage cap (twice the monthly allowance) |
| `daily_limit_exceeded` | The plan's daily limit, on every plan |
| `hourly_limit_exceeded` | The plan's hourly limit, on every plan |

On Solo and Team the monthly allowance is soft: sends continue as [overage](#overage-and-credits) until the cap. Check your current usage with `molted budget`, then upgrade your plan or wait for the current window to reset.
