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

# Read broadcast results

> Understand the Sent, Delivered, Opened and Failed numbers on a broadcast, and what a failure usually means.

After a broadcast sends, DMLY reports how it went — on the **Broadcasts** list and on each
individual broadcast. The numbers are useful, but only some of them are real on some channels.
Read this first so you don't chase a zero that was never going to be anything else.

## What DMLY actually measures

<Note>
  A broadcast only ever counts **Delivered** and **Opened** on WhatsApp and SMS, and SMS
  reports **Delivered** but not **Opened**. Telegram sends no delivery confirmations at all.
  Facebook and Instagram do send them, and DMLY records them against the individual message in
  the [Inbox](/inbox/overview) — but it doesn't add them up onto the broadcast, so **Delivered**
  and **Opened** stay at 0 on Meta channels no matter how well the broadcast performed.
</Note>

Two things on these pages are not measurements at all:

* **Replies** is always 0. Nothing in DMLY counts replies to a broadcast, on any channel. It
  appears as a stat card and as the last step of the funnel, and it will read 0 forever.
* **Engagement over time** is placeholder data. It shows the same fixed shape for every
  broadcast and is not derived from your send. Ignore it.

To see whether a campaign actually landed, use **Delivered** and **Opened** on WhatsApp, and
the [Inbox](/inbox/overview) — every broadcast send is recorded in the contact's conversation
thread, so replies arrive there like any other message.

## Where to find the numbers

<Steps>
  <Step title="Open Broadcasts">
    Go to **Broadcasts**. The four cards at the top — **Sent**, **Delivered**, **Replies** and
    **Failed** — are totals across every broadcast on the channel you're currently working in.
    Switch channel and the totals change with it.
  </Step>

  <Step title="Open one broadcast">
    Select **View analytics** on any broadcast to see its own **Sent**, **Delivered**,
    **Opened**, **Replies** and **Failed**, plus the **Conversion funnel**.
  </Step>
</Steps>

## What each number means

| Number        | What it counts                                                                                                                | Reported on   |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------- |
| **Sent**      | Messages DMLY successfully handed to the channel                                                                              | All channels  |
| **Delivered** | The channel confirmed the message reached the contact                                                                         | WhatsApp, SMS |
| **Opened**    | The contact read the message. Counted once per contact — a late confirmation can't drag it back down                          | WhatsApp      |
| **Replies**   | Nothing. Always 0                                                                                                             | Nowhere       |
| **Failed**    | Recipients the message never went out for — plus, on WhatsApp and SMS, recipients the channel later reported as undeliverable | All channels  |

**Sent** means accepted by WhatsApp, Meta, your SMS gateway or Telegram — not that it arrived.
That is what **Delivered** is for, which is why a WhatsApp broadcast is the only kind where you
can tell the difference.

The **Conversion funnel** is these same numbers as a percentage of **Sent**. On Facebook,
Instagram and Telegram it will show a full first bar and three empty ones, for the reasons
above rather than because of anything you did.

<Note>
  A broadcast that reads **Sent** with 0 recipients isn't broken — its audience matched nobody.
  Check the segment under [Audiences](/broadcasts/audiences).
</Note>

## Messenger delivery (Facebook and Instagram)

Facebook and Instagram broadcasts get one extra panel, **Messenger delivery**, and it is real.
It splits recipients by how Meta let the message through: those reached inside Meta's 24-hour
messaging window, those reached because the contact had opted in to notifications, and those
skipped because neither applied.

This is the panel to read on Meta channels. It answers the question **Delivered** can't.

<Note>
  Failed recipients count toward this panel's total but don't get a row of their own, so on a
  broadcast with failures the three percentages add up to less than 100%.
</Note>

## What a failure actually means

DMLY records a reason for every failed recipient, but **the broadcast page doesn't show it** —
there is no per-contact failure list in the app. The reasons aren't lost, though: the API
returns them, one row per recipient, each with its own `error`.

```
GET /api/v1/broadcasts/{broadcast_uuid}/recipients?status=failed
```

If you'd rather not go through the API, work through the likely causes in order:

<Accordion title="The contacts had opted out (most common)">
  Every channel blocks opted-out contacts at the moment of sending. They receive nothing — but
  they still count as recipients and still increment **Failed**.

  This happens because **Reachable contacts only** in the broadcast's audience step is off
  unless you tick it, so opted-out contacts are pulled into the audience in the first place.
  Tick it to keep them out and your **Failed** number honest. It doesn't change who receives
  the broadcast — opted-out contacts were never going to get it either way.
</Accordion>

<Accordion title="WhatsApp: the template is no longer approved">
  DMLY re-checks template approval at send time, not just when you schedule. If Meta revoked or
  paused the template between scheduling and sending, every recipient fails. See
  [Message templates](/broadcasts/message-templates) and
  [WhatsApp rules and limits](/broadcasts/whatsapp-rules-and-limits).
</Accordion>

<Accordion title="Facebook and Instagram: the 24-hour window closed">
  If a contact hasn't messaged you in the last 24 hours and hasn't opted in to notifications,
  Meta won't accept the message. Those recipients fail and appear as skipped in **Messenger
  delivery**.
</Accordion>

<Accordion title="The contact can't be reached on that channel">
  No phone number, no identity on the broadcast's channel, or a channel whose connection has
  broken. Check the channel is still connected under [Channels](/channels/overview).
</Accordion>

<Accordion title="Every single recipient failed">
  If a broadcast fails 100%, suspect the broadcast rather than the contacts: a revoked WhatsApp
  template, a disconnected channel, or a broadcast saved with no message content at all —
  nothing stops you saving an empty one.
</Accordion>

<Tip>
  **Sent** plus **Failed** may not equal the recipient count, in either direction. It can fall
  short because contacts deleted between scheduling and sending are skipped without counting as
  failures. On WhatsApp and SMS it can also overshoot: a message accepted by the channel counts
  as **Sent**, and if the channel later reports it as undeliverable that same recipient also
  counts as **Failed**.
</Tip>

## Getting results out of DMLY

Broadcast results are available as [webhooks](/api-reference/webhooks) if you want them in
another system. Note what they mean: `broadcast.sent` fires when sending **starts**, not when
it finishes. The one carrying the final counts is `broadcast.completed`.
