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

# Drafts

> Hold a journey's sends for a person to review, then approve or reject each one before it reaches the customer.

A **draft** is a journey send that waits for approval. Boom prepares the message
exactly as it would send it, with the recipient, the sender and every variable
filled in, and holds it. Nothing reaches the customer until someone on your team
approves it.

Use drafts when a person should see a message before it goes out:

* **The first sends to a new audience.** Check a few real messages before you let
  the rest go.
* **Sensitive content.** Collections, account changes, or anything where a wrong
  variable would hurt.
* **Compliance review.** When your process needs a named person to sign off on
  each outbound message.

Drafting is set per send step, so one journey can draft its first message and
send the follow-ups on its own.

## Turn it on

<Steps>
  <Step title="Open the send step">
    In the journey builder, select a **Send message** step (WhatsApp, template
    mode) or a **Send email** step.
  </Step>

  <Step title="Pick Draft for approval">
    Under **Delivery**, switch from **Send immediately** to **Draft for
    approval**. The step gains a third exit, **Rejected**, next to **Sent** and
    **Capped, not sent**.
  </Step>

  <Step title="Wire the Rejected exit (optional)">
    Connect **Rejected** to whatever should happen when a reviewer says no: a
    different message, a wait and another try, or an exit. Leave it unconnected
    and the person's run ends quietly.
  </Step>

  <Step title="Publish">
    Publish the journey as usual. From then on, every send from that step waits
    for review.
  </Step>
</Steps>

## Review drafts

Drafts are reviewed inside the campaign or initiative they belong to. Open it and
choose **Drafts** in its sidebar, under **Operational**, after **Executions**. The
sidebar shows how many drafts are pending (up to "99+"). The initiative page shows
an **N drafts waiting** button, and the journey builder toolbar shows the same count
as a badge. Both open the Drafts tab.

The tab lists every draft with its recipient, step, status and age, plus the first
line of its message (the WhatsApp text or the email subject). A pending draft older
than 24 hours is marked in amber, because its content was fixed when it was drafted.
Use **Filter**
to narrow it by status, channel, journey version, step or when it was created, and
**Refresh** to pick up new ones.

Click a row to see the preview: the exact message that will be sent, with the
template, the variables, and for email the From, Reply-To and subject. On a
narrower screen the preview opens as a drawer from the bottom. The preview also
shows how old the draft is, and warns **Template edited since drafted** if the
template changed after the draft was made. For email, **Show full email** opens
the whole message. A draft that has been decided shows who approved or rejected it,
and when.

You can decide:

* **One draft**, with **Approve** or **Reject** in its preview. This acts at once,
  with no confirmation step, and the preview moves to the next pending draft. It
  cannot be undone, so read the preview first.
* **A selection**, by ticking rows and choosing **Approve selected** or **Reject
  selected**.
* **Everything matching the current filter**, with **Approve all pending** or
  **Reject all pending**. Drafts created after you opened the page are not
  included, so you never approve something you have not had the chance to see.
  Both bulk options ask you to confirm the count, and warn you if any of the drafts
  are older than 24 hours.

With the Drafts tab open, the keyboard works too: **J** and **K** move between
drafts, **A** approves, **R** rejects, and **Esc** closes the preview.

When you reject, you can add an optional reason. It is kept on the draft as the
reviewer's note.

## What happens next

**Approve** sends the message you previewed, exactly as it is. Boom does not
render it again, so a template edit made after the draft was created does not
change what goes out. The journey's send window and your channel's rate limits
still apply, so a large approval goes out at the same pace as live traffic. The
run then continues on **Sent**.

**Reject** sends nothing. The run takes the **Rejected** exit, or ends if nothing
is connected to it. A rejected draft costs no credits: credits are only used when a
message is actually sent.

### Checked again at delivery

Some things can change while a draft waits. These are checked again when an
approved draft is delivered, and the draft is not sent if any fails. The
**Rejected** exit is only for a reviewer's rejection, so it never catches these.
Each one takes the path below:

* **Do Not Contact.** A person who opted out in the meantime is skipped. On
  WhatsApp the run ends. On email the run continues on **Sent**, the same as an
  email step that skips an opted-out person without drafts.
* **The template.** A WhatsApp template no longer approved by Meta, or an email
  template no longer published, stops the send and the run ends.
* **The sender.** A WhatsApp number or email sender that is no longer available
  stops the send and the run ends.
* **The journey.** If the journey was stopped, the draft is not sent and the run
  ends.
* **Smart Sending.** The [message limit](/smart-sending) is checked at delivery, not
  when the draft is created. An approved draft that would go over the limit is not
  sent and the run takes **Capped, not sent**.
* **A reply (WhatsApp only).** If the person replies while an approved WhatsApp
  draft is waiting for its send window, the draft is skipped and the run
  continues on **Sent**. Email drafts have no send window, so this never applies
  to them.

Each draft keeps its final status (Sent, Skipped, Failed, Canceled) and the
reason, so the tab shows what happened to it.

## Limits

* **Supported steps.** WhatsApp template messages and email. Free-text WhatsApp,
  SMS, Instagram and Messenger sends cannot be drafted.
* **Not in Transactional messages.** A [transactional
  message](/transactional-messages) has to go out when its event fires, so its
  journey cannot use drafts.
* **Several runs at once.** On a journey with [several runs per
  person](/journeys#several-runs-at-once), a send that waits for a send window
  cannot be drafted.
* **Drafts do not expire yet.** A draft waits until someone decides it, however
  long that takes.
* **A waiting draft keeps the person in the journey.** While their draft is
  pending, the same person cannot be enrolled again in that journey. Approve or
  reject it first.
* **Stopping the journey cancels its drafts.** Pending drafts move to Canceled
  and those runs end.

## Permissions

In the app, two permissions control drafts. Both are on the Admin and Member
roles.

| Permission | Lets someone |
| - | - |
| `org:drafts:read` | See the Drafts tab, its count and the previews. |
| `org:drafts:update` | Approve and reject drafts. |

Someone with read but not update sees the list and previews, without checkboxes
or approve and reject buttons.

<Warning>
  These permissions apply in the app only. Over MCP, `drafts_list` and
  `drafts_decide` are allowed for anyone with the Admin or Member role, whether
  or not they have `org:drafts:update`. Removing that permission does not stop
  someone approving drafts over MCP. To do that, change their role or remove them
  from the organization.
</Warning>

## Over MCP

An AI agent connected over [MCP](/use-mcp) can review drafts too:

* `drafts_list` lists drafts, with a preview of each, filtered by initiative,
  status and more.
* `drafts_decide` approves or rejects drafts by id, or everything matching a
  filter. Approving sends **real messages**.

When authoring a journey over MCP or the API, set `delivery: "draft"` on a
`SEND_MESSAGE` (template mode) or `SEND_EMAIL` node. See [journeys](/journeys).

There is no REST endpoint for deciding drafts. Approving a send has to name the
person who approved it, and an organization API key identifies the integration,
not a person. See [one uniform surface](/one-surface).

If you use [webhooks](/webhooks), a run that ended because its draft was
rejected reports `journey_run.ended` with `reason: completed`. To tell it apart,
read the participant's step history: the send step's `emittedSignal` is
`REJECTED`.

## Related

<CardGroup cols={2}>
  <Card title="Journeys" icon="route" href="/journeys">
    Build the workflow whose send steps you draft.
  </Card>

  <Card title="Smart Sending" icon="gauge" href="/smart-sending">
    The message limit an approved draft is checked against.
  </Card>

  <Card title="Use MCP" icon="plug" href="/use-mcp">
    Review and decide drafts from an AI tool.
  </Card>

  <Card title="Webhooks" icon="webhook" href="/webhooks">
    How a rejected draft shows up on `journey_run.ended`.
  </Card>
</CardGroup>
