Home/Help Center/Recipient statuses

Broadcasts

Recipient Statuses Explained

Every status a broadcast recipient can carry, from pending to read, and what sent, held, suppressed, failed and skipped_quota actually mean for that person.

By Chirag Darji · Updated 27 Aug 2026 · 8 min read

On this page
  1. Before you start
  2. Steps
  3. What you will see
  4. The full status list
  5. Why does "Sent" on the funnel include recipients that have since moved to Delivered or Read?
  6. Why does a status never move backward?
  7. Settings and options
  8. Why does "holdout" exist as its own status rather than just "not sent"?
  9. Troubleshooting
  10. Related reading
WhatsApp broadcast campaign report in VGraple CRM with delivered, read and replied stats per contact

Every recipient of a VGraple CRM broadcast carries one of eight explicit statuses (pending, sent, held, delivered, read, failed, suppressed, cancelled) or skipped_quota, forming a real state machine rather than a single flat "sent" count. This article defines each one precisely and shows how they roll up into the funnel tabs on a campaign's detail page.

Recipient statuses

  1. 1Open a campaign's detail page
  2. 2Read the filter tabs above the recipient
  3. 3Click a tab to see exactly who
  4. 4Check the Status column for an individual
  5. 5Hover or check the Error column for
The steps on this page, in order.

Before you start

  • No setup is needed; every broadcast recipient carries one of these statuses automatically.
  • Open any completed or in-progress campaign's detail page to see the statuses in the recipient table and the filter tabs above it.
  • Understand that a status is a property of one recipient's one attempt at this specific campaign, not the contact's overall history with your business.

Steps

  1. Open a campaign's detail page. From Broadcasts, click into any campaign to see its funnel and recipient table.

New broadcast composer in VGraple CRM: audience selection with segment, tag and CSV options and a live recipient count

  1. Read the filter tabs above the recipient table. They are: All, Pending, Sent, Held by Meta, Delivered, Read, Replied, Clicked, Suppressed, Failed, Cancelled, Over daily limit, Holdout. Each tab, except All, Replied and Clicked, shows a count in parentheses.

  2. Click a tab to see exactly who is in that state. The recipient table filters instantly and stays searchable by name or phone within that filter.

  3. Check the Status column for an individual recipient. The recipient table's Status column shows the current literal status, colored (green for read, blue for delivered, amber for suppressed, held or skipped, red for failed, gray for pending or cancelled), with a retry count shown if the recipient has been retried.

  4. Hover or check the Error column for a failed or suppressed recipient. It shows the human-readable reason (and, on export, the Meta error code where one exists) for exactly why that recipient did not receive the message.

What you will see

The stat tiles at the top of the detail page (Recipients, Sent, Delivered, Read, Replied, Failed, and Held or Suppressed when either is nonzero) summarize the same underlying statuses the filter tabs use. A fully successful small campaign shows most recipients moving quickly from Sent through Delivered to Read; a campaign with a significant Suppressed count is usually working correctly, not failing, since suppression means the platform is protecting your number rather than something going wrong.

The full status list

StatusWhat it meansCounts as sent?Billed?Ever retried automatically?
pendingQueued, not yet attemptedNoNoNot applicable, it has not run yet
sentMeta accepted the messageYesYesN/A, this is a success state
heldMeta accepted it but is withholding delivery, usually during template quality reviewYes (rolls into Sent)YesN/A, resolves on its own through delivery webhooks
deliveredReached the recipient's deviceYesYesN/A
readOpened by the recipientYesYesN/A
failedMeta rejected the send, or a delivery error arrived laterNoNoYes, via "Retry failed," up to 3 attempts
suppressedVGraple CRM's own pre-flight check refused to sendNoNoNo, never, by design
cancelledThe broadcast was stopped before this recipient's turnNoNoYes, via "Retry failed"
skipped_quotaThe daily messaging limit ran out and auto-continue was offNoNoYes, via "Retry failed," once headroom returns
holdoutDeliberately withheld as a control group for measuring the campaign's effectNoNoNo, this is intentional and permanent for this campaign

Why does "Sent" on the funnel include recipients that have since moved to Delivered or Read?

The Sent tab and the sent_count on a campaign mean "accepted by WhatsApp and beyond," not the literal current database value, because delivered and read are strictly later stages of an accepted message. An earlier, simpler implementation of this kind of feature commonly matches "sent" to only the literal status value, which meant the Sent tab hid every recipient whose status had since been moved to delivered or read by an incoming webhook, and a "not yet read" cohort silently excluded delivered recipients that had genuinely not been read yet. VGraple CRM's status logic treats sent, held, delivered and read as one connected group (all "accepted"), so every count and every tab agrees on what accepted actually means, and a fully delivered campaign's Sent tab correctly shows the full number rather than a shrinking one as webhooks arrive.

Why does a status never move backward?

Treating recipient status as a strict, forward-only state machine (pending to sent to delivered to read, or pending straight to suppressed, cancelled, failed or skipped_quota, with a retry starting a fresh attempt back at pending) means the funnel on a campaign's detail page can never contradict itself. A recipient who was briefly marked failed due to a transient network error and then successfully retried does not silently overwrite its own history; the retry count increments and the row genuinely restarts its journey from pending, so the campaign's record of "this recipient needed 2 attempts before delivering" stays intact and visible rather than being erased by the second attempt's eventual success. This same discipline is what makes the exported CSV, the recipient table, and the funnel's stat tiles all agree with each other at any moment, since all three read from the identical underlying status rather than three different derived views that could drift out of sync.

Settings and options

ConceptWhat it doesWhere to see it
Filter tabsNarrow the recipient table to one status groupTop of the recipient table on the campaign detail page
SearchFind a specific recipient by name or phone within the current filterSearch box next to the filter tabs
Retry countHow many times a recipient has been re-attemptedShown next to Status for a retried recipient
Error reasonHuman-readable explanation for a failed or suppressed recipientError column in the recipient table

Why does "holdout" exist as its own status rather than just "not sent"?

A holdout recipient is deliberately, intentionally never sent to, set aside specifically so a campaign's real effect can be measured against people who received nothing at all, a control group in the statistical sense. Lumping holdout recipients into a generic "not sent" or "skipped" bucket alongside suppressed and cancelled rows would make it impossible to tell, later, whether a recipient was left out because something went wrong or because they were always meant to be part of the comparison. Keeping holdout as its own distinct status means a campaign's revenue attribution and delivery figures can be compared cleanly against the holdout group's own (necessarily zero-send) outcome, answering "did this campaign actually cause anything" rather than just "did this campaign reach people."

Troubleshooting

SymptomLikely causeFix
A recipient shows "sent" but you expected "delivered"The delivery webhook has not arrived yet, which can take a few seconds to minutesWait and refresh; the recipient's row updates automatically once the webhook arrives
Large number of recipients show "held"New or recently edited templates go through Meta's quality assessment period, during which accepted messages are pacedExpected and temporary; held messages still resolve to delivered and read through the normal webhooks
A recipient shows "suppressed" that you expected to receive the messageThe pre-flight check found an opt-out, a block, a frequency-cap window, or no valid WhatsApp number for that contactCheck the contact's own profile for opt-in and blocked status; see why a recipient was suppressed
"Failed" recipients did not get retried automaticallyRetries are manual, triggered by the "Retry failed" action on the campaignUse Retry failed on the campaign detail page; up to 3 attempts per recipient
Some recipients show skipped_quota after a large campaignThe daily portfolio messaging limit was reached and auto-continue was off for that campaignUse Retry failed once daily headroom returns to attempt them

See why a recipient was suppressed for the full list of suppression causes, and retry failed vs retarget for how to act on any of these statuses after a campaign finishes.

Frequently asked questions

What is the difference between "sent" and "delivered"?
Sent means Meta accepted the message from VGraple CRM (it now has a real WhatsApp message id). Delivered means it actually reached the recipient's device, confirmed by Meta's own delivery webhook, which arrives moments to minutes after sent.
Why does the "Sent" tab on the recipient table include delivered and read recipients too?
Because sent means "accepted by WhatsApp and beyond," not the literal current row value. Delivered and read are both later stages of an accepted message, so hiding them from the Sent tab would make a fully delivered campaign look like it barely sent at all.
What does "held" mean?
Meta accepted the message but is temporarily withholding it, usually while a new or recently changed template is under quality assessment. It carries a real message id and resolves through the same delivery webhooks as any other accepted message, so it counts toward Sent, with its own separate Held count shown alongside.
How is "suppressed" different from "failed"?
Suppressed means VGraple CRM's own pre-flight check refused to attempt the send (an opt-out, a block, a frequency-cap window, no valid WhatsApp number). Failed means Meta accepted the attempt and then rejected it, or a delivery error arrived later. Suppressed recipients are never billed and never retried; failed ones can be.
What does "skipped_quota" mean?
The recipient was never attempted because the campaign was over the daily messaging limit and auto-continue was turned off for that campaign, so the remainder was marked skipped instead of waiting to resume automatically.
Can a recipient move backward through these statuses?
No. The state machine only moves forward, for example pending to sent to delivered to read, or pending straight to suppressed, cancelled, failed or skipped_quota. A status is never reverted once set, though a retry creates a fresh attempt starting again from pending.
What does "cancelled" mean for an individual recipient?
The broadcast was stopped mid-send (by clicking Stop sending) before this specific recipient's message was sent. Cancelled recipients were never attempted and are not counted as sent, failed, or billed.

Run your WhatsApp on VGraple CRM

Free forever plan, official Meta WhatsApp Business API, set up in 15 minutes. No card needed.