> ## 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. Each drafted step either holds the person's run
until someone decides (**Draft and wait**) or queues the message and lets the run
carry on (**Draft and continue**, see [below](#draft-and-continue)). A journey's
**Send reward** step always waits in Drafts: see [Gift card rewards](#gift-card-rewards).

## 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 a draft mode">
    Under **Delivery**, change the select from **Send now** to **Draft and wait**
    or **Draft and continue**. Each option shows a one-line description of what
    happens to the customer. With **Draft and wait** the step gains a third exit,
    **Rejected**, next to **Sent** and **Capped, not sent**. **Draft and
    continue** adds no exit: the run always carries on through **Sent**.
  </Step>

  <Step title="Wire the Rejected exit (optional, Draft and wait only)">
    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>

## Draft and continue

**Draft and continue** queues each message in Drafts and lets the person's run
move on right away, as if the message had gone out. Use it to check a sample of a
journey's messages without holding anyone back, for example while you move
campaigns from another tool: send events to Boom, review what the journeys would
send for a few days, delete the queue, then switch the steps to **Send now**.

* **Send** sends that one message, exactly as previewed. The person's journey does
  not change: they already moved on.
* **Delete** discards the message. Nothing is sent and nothing else changes.
* Queued drafts show a **Queued** label in the list, and their run history says
  "Queued for review", then whether the message was sent, deleted or expired.
* Reports count a queued message as sent only once it actually goes out.
* A **Wait for reply** right after a queued WhatsApp message starts its timer
  before the message is sent, so publishing shows a warning. Replies still reach
  the run; give the wait a timeout longer than your review takes.
* The step's send window still applies: an approved message outside it shows
  "Sends at …" and goes out when the window opens.

## Expiring drafts

Under the **Delivery** select of a draft step, tick **Discard drafts nobody
reviews in** and set the number of days (1 to 30, 3 by default) to expire drafts
nobody decided in time. An expired draft
is never sent. With **Draft and wait**, the run then continues through
**Rejected**; with **Draft and continue**, nothing else changes. Off by default:
a draft waits until someone decides it.

## 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.

### By template

The tab opens **By template**: pending drafts grouped by what you are actually
approving, one row per template version at each step. A row shows the template
(and, if the template has changed since, which version these drafts were made
from), the step, how many are pending, and how many have waited more than 24
hours. Click a group, or move with **J** and **K**, to see one example message
from it, rendered exactly as it would be sent, plus a warning if the template was
edited after the drafts were created.

**Approve N…** and **Reject N…** decide the whole group. The confirmation, just
above the example, gives the count, how many have waited more than 24 hours, and
that drafts arriving later are not included. The same 5 second undo applies. The
group then shows how many were sent and, if any could not be, how many, with a
link that opens them in **One by one**.

**Approve all…** in this view lists each group and its count before you confirm.

### Odd values

Some messages would go out wrong: a name that came through empty, or an amount
of zero. For a WhatsApp group, **Variables in this group** lists each template
variable with how many distinct values it takes and how many drafts have it
empty or at zero (a value such as `$0.00` or `0,00 MXN`). The **To review** column in
the group list shows how many drafts in each group have at least one.

These drafts are left out of **Approve N…** and **Approve all…** by default. The confirmation says
how many stay behind for review, and **Include the N with odd values** adds them
back. Click a count, or **Review them one by one**, to open just those drafts in
**One by one** (the **To review** chip; remove it to see the rest). In the
preview, an odd value is shaded amber with a solid underline, an empty one reads
**Empty** in the variables list, and a notice names each odd variable.

Odd values are checked for WhatsApp only. Email drafts do not store their
variables yet, so for email, check the example.

### One by one

Switch to **One by one** to review drafts individually. It can be narrowed to a
single group (the **Template: …** chip; remove it to see every draft again).

The list shows 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. In a
WhatsApp preview, the values filled into the template are lightly shaded with a
dotted underline, so you can check each one. On a narrower screen the preview
opens as a drawer from the bottom, only when you tap a row. 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. There is no
  confirmation step, and the preview moves to the next pending draft right away.
* **A selection**, by ticking rows and choosing **Approve selected** or **Reject
  selected**. Approving, or rejecting more than one, asks you to confirm the count
  first, just above the list.
* **Everything matching the current filter**, with **Approve all…**, or **Reject
  all pending…** in the **⋯** menu. Drafts created after you opened the page are
  not included, so you never approve something you have not had the chance to see.
  The confirmation shows how many messages will go out and how many have waited
  more than 24 hours. Approving leaves out WhatsApp drafts with
  [odd values](#odd-values) unless you tick them in. Rejecting everything confirms in red and says that nothing
  will be sent.

### Five seconds to undo

Every decision waits 5 seconds before Boom acts on it. The preview, and a notice
at the bottom of the screen, count down (**Sending to Ana in 5s**) with an
**Undo** button. Undo inside those 5 seconds and nothing happens: the draft stays
pending and nothing was sent. You can keep reviewing other drafts while one counts
down. If you leave the page during the countdown, the decision is dropped and the
draft stays pending.

After the countdown, an approved draft shows **Sending…**, then **Sent**, or
**Could not send** with what happened and what to do, for example that Meta no
longer approves the template. A draft that could not be sent stays in the list
with that reason. If someone else decided the draft first, the preview says who
and when instead.

Once you click into the list or a preview, the keyboard works too: the arrow keys
move through the list, **Space** ticks a row and **Enter** opens it. **J** and
**K** move between drafts, **A** approves, **R** rejects, and **Esc** closes the
preview. Holding a key down does nothing extra, and **A** is ignored for a moment
after the preview moves on, so a double press cannot approve two people. Screen
readers hear the open draft's name and its position in the list.

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.

For a **Draft and continue** step the run never waited, so **Send** only sends the
message and **Delete** only discards it.

### 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: the run takes **Capped, not sent**, or ends if that path is not connected.
  Re-enroll the person later if the message is still needed.
* **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, Expired) and
the reason, so the tab shows what happened to it.

## Gift card rewards

<Note>
  Reward steps in journeys are in early access. Contact Boom support to turn them
  on for your organization.
</Note>

A journey's **Send reward** step gives a customer a gift card, and every one waits
in Drafts first: nothing is ordered, and no money is spent, until someone approves
it. When a run reaches the step, Boom checks the step's **Who qualifies** rule
against the conversation. A customer who qualifies (or everyone, when the rule is
empty) gets a reward draft; one who does not takes the step's **Not eligible**
exit and no draft is made.

When an initiative has rewards waiting, the Drafts tab shows **All**, **Messages**
and **Rewards**, each with its pending count. A reward row shows the customer, the
amount and a one-line reason. Its preview, titled for example **MX\$50 to Ana**,
shows:

* how the gift card reaches the customer: a link sent on WhatsApp with your
  reward template, or an email;
* **Who qualifies**: the step's rule, a **Qualifies** mark and a short reason, in
  Boom's words rather than a quote from the customer;
* the last few messages of the conversation, with **Open in inbox**. These need
  access to the inbox; without it the preview says so.

**Approve and send MX\$50** orders the gift card for the amount, delivery and
address in the preview, records you as the person who approved it, and the run
continues on **Sent**. The same 5 second undo applies. If the order cannot be
placed (your rewards account is not connected, it refused the order, there is no
approved reward template, or the customer has no email or WhatsApp number), the
draft shows **Could not send** with the reason, nothing is charged, and the run
takes the step's **Failed** exit.

**Reject** orders nothing. The run takes the step's **Rejected** exit, or ends if
nothing is connected to it.

**By template** groups reward drafts by step and amount, so a whole step's rewards
can be approved at once; the confirmation says the gift cards will be ordered and
that this spends money. **Approve all…** on the **All** view says when it includes
both messages and gift cards.

If the journey is stopped while a reward waits, the draft is canceled and nothing
is ordered.

### The Rewards page and the budget

Each campaign or initiative with a reward step has a **Rewards** page in its
sidebar, under **Extra**. Before the journey has a reward step it explains how
rewards work and offers **Add a reward step**, which opens the journey builder
with a new **Send reward** step placed and open (on a published journey it
first offers to start a draft). Once there is a step, the page shows:

* **Sent**: what the initiative has paid in gift cards, and how many.
* **Waiting for approval**: rewards pending in Drafts, with a link to them.
* **Budget**: an optional spending cap for the initiative, with how much of it
  is used. Set or change it with **Set** or **Edit** (this needs permission to
  send rewards). The budget is in one currency, the same as the reward steps.
* The journey's reward steps, each with **Edit in journey**.
* **Sent rewards**: every reward with its status (**Delivered**, **Processing**,
  **Not delivered**, **Not sent** or **Rejected in review**), who approved it and
  when.

If your rewards account is not connected, the page says so: approvals fail until
it is connected again in **Settings › Rewards**.

**In Drafts, with a budget.** Under **Approve** and **Reject** a reward shows a
short budget line, for example **MX$50 · MX$1,150 of MX\$5,000 used**. When
approving it would pass the budget, the line says so and the approval is
refused: nothing is approved or ordered, and the reward keeps waiting. Raise the
budget on the Rewards page, or approve fewer. A bulk approval is checked as a
whole and refused whole. If someone else is approving rewards for the same
initiative at that moment, you may see **Another approval is in progress**; try
again a moment later.

**Resend link.** When a reward was paid but its WhatsApp message failed, the
**Sent rewards** list shows **Not delivered** and offers **Resend link**. It
sends the same redemption link again and never orders a second gift card. It
needs permission to send rewards. Check the customer's WhatsApp number and your
reward template if it fails again.

## Limits

* **Supported steps.** WhatsApp template messages and email. Free-text WhatsApp,
  SMS, Instagram and Messenger sends cannot be drafted.
* **Transactional messages: all or nothing.** A [transactional
  message](/transactional-messages) holds every message or none, with **Review
  before sending** under its **Options**, not per step. While one waits, that
  customer's next event sends nothing unless the Transactional sends **One per
  field value**.
* **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 only expire when the step says so.** Unless **Discard drafts
  nobody reviews in** is ticked on the step, a draft waits until someone decides it, however long that takes.
* **A waiting draft keeps the person in the journey.** While their **Draft and
  wait** draft is pending, the same person cannot be enrolled again in that
  journey. Approve or reject it first. A **Draft and continue** draft does not
  hold the run.
* **Transactional messages and campaigns hold their runs.** Their **Review before
  sending** works like **Draft and wait**.
* **Stopping the journey cancels its drafts.** Pending drafts move to Canceled
  and those runs end.
* **Drafts can be turned off for an organization.** When they are, the
  **Delivery** option is gone from the builder, and a journey with a drafted step
  cannot be published. Drafts already waiting stay on the
  Drafts tab and can still be approved or rejected. A waiting draft is never sent
  without approval. Contact Boom support to turn drafts off or back on.

## Permissions

Two permissions control drafts, in the app and over MCP alike. Approving a reward
also takes a third, because it spends money.

| Permission | Lets someone | Roles that have it |
| - | - | - |
| `org:drafts:read` | See the Drafts tab, its count and the previews. | Owner, Admin, Member, Viewer |
| `org:drafts:update` | Approve and reject drafts. | Owner, Admin |
| `org:rewards:send` | Together with `org:drafts:update`, approve a gift card reward. | Owner, Admin |

Someone who can approve drafts but lacks `org:rewards:send` can still reject a
reward, but sees no approve button on it, and **Approve all…** approves only the
messages. Over MCP, approving a reward without it is refused and nothing is
decided.

Someone with read but not update sees the list and previews, without checkboxes
or approve and reject buttons. Over MCP, `drafts_list`, `drafts_get` and
`drafts_count` need read and `drafts_decide` needs update, so a Member can review what is waiting
but only an Owner or Admin can send it. See
[roles and permissions](/use-mcp#roles-and-permissions).

## 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. It returns `asOf`, the server time of the read.
* `drafts_get` returns one draft by id: its full preview, and who decided it,
  when and why.
* `drafts_count` counts the pending drafts a filter matches. Pass the `asOf`
  from `drafts_list` as `createdTo` to get the exact number a filter decide
  would change.
* `drafts_decide` approves or rejects drafts by id, or everything matching a
  filter. Approving sends **real messages**. A filter decide needs the `asOf`
  from `drafts_list` and an `expectedCount` from `drafts_count`. If the number
  of matching drafts has changed, it is refused and nothing is decided.
  To decide one template version at one step, the same group the Drafts tab
  shows, filter by `workflowId`, `nodeId`, `templateId` and `templateUpdatedAt`,
  taking the last two from a `drafts_list` row.
* Every filter takes `kind`: `"message"` for WhatsApp and email sends, `"reward"`
  for gift cards (or `channel: "REWARD"`). A reward's preview has the amount,
  currency, delivery, recipient, the step's rule and the reason the customer
  qualifies. Approving a reward with `drafts_decide` orders a real gift card.
* If the initiative has a rewards budget, `drafts_decide` checks rewards against
  it before approving anything, and refuses the **whole** request when it can't
  approve all of it. Nothing is decided and the drafts stay pending:
  * `reward_budget_exceeded`: approving would take the initiative past its
    budget. Raise the budget on the initiative's Rewards page, or approve fewer.
  * `reward_budget_currency_mismatch`: a reward pays in another currency than
    the budget.
  * `reward_draft_unreadable`: a reward under a budget can't be read, so its
    amount can't be checked. Reject that draft.
  * `reward_budget_unverifiable`: some of the initiative's past spend can't be
    counted in the budget's currency. Contact support, or remove the budget.
  * `reward_budget_batch_too_large`: too many rewards to check at once. Approve
    them in smaller groups.
  * `reward_budget_busy`: another approval for the same initiative is in
    progress. Try again in a moment.
* Every filter takes `odd`: `"only"` for WhatsApp drafts with an empty or zero
  variable value, `"exclude"` for all the others (to approve a group without
  them, as the Drafts tab does).

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` (also for a draft that expired, with `output.decision: "expired"`).
A **Draft and continue** step records `QUEUED`; once its draft is decided, the
step's `output.draftResolution.status` says whether it was sent.

## 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>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.