Home/Help Center/Broadcast stuck sending

Troubleshooting

Broadcast Stuck in Sending

A campaign shows Sending but the count has not moved in a while. What is actually happening underneath, what resumes automatically, and when to act.

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

On this page
  1. Symptom
  2. Why it happens
  3. Fix
  4. How VGraple CRM handles it automatically
  5. Prevention
  6. How is this different from "held" recipients?
WhatsApp broadcast campaign report in VGraple CRM with delivered, read and replied stats per contact

A broadcast that looks stuck in Sending almost always has a real, visible reason on the campaign itself, pacing, a pause condition, or a worker temporarily unavailable, rather than being genuinely frozen. Knowing where to look first tells you within seconds whether to wait, act, or contact support.

Symptom

A campaign's status reads Sending, but the count of delivered or attempted recipients has stopped increasing, or is increasing much more slowly than expected for the campaign's size. Recipients further down the list still show Pending. There is no error shown to the person viewing the campaign at first glance, which is what makes this symptom disorienting: nothing visibly failed, sending simply appears to have stalled.

Why it happens

The first and most common explanation is not a bug at all: pacing. Every send passes through a token-bucket pacer that deliberately sends below Meta's throughput ceiling, 50 messages a second by default, and this rate drops automatically if the number's quality rating is YELLOW (25/s) or RED (5/s), or if Meta has returned a throughput error mid-campaign (which halves the rate further and does not recover automatically for the rest of that run). A large campaign on a number at RED quality, sending at a tenth of the default rate, can look alarmingly slow compared to what an earlier, faster campaign trained expectations around, without anything actually being wrong.

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

The second explanation is a pause the campaign already recorded but that is easy to miss if not looked for directly: a template pause, a portfolio pacing halt, a quality rating collapse to RED, a conversation quota limit, or the failure-rate circuit breaker tripping. Every one of these writes a specific reason onto the campaign, visible on the campaign detail page, rather than leaving it in an unexplained stall.

The least common, and genuinely rare, explanation is the sending worker itself being temporarily unavailable, for instance during a deploy. Sending runs on a durable, Postgres-backed queue precisely so this does not lose progress: a campaign resumes from wherever it left off once the worker returns, rather than restarting or losing recipients, though it can appear to pause briefly during the transition.

Fix

  1. Check the campaign's pause reason field first, before assuming anything is broken. If a reason is shown, the campaign is not stuck, it is doing exactly what it is designed to do; the reason tells you what to expect next.
  2. If no pause reason is shown and the status is genuinely Sending, check the number's quality rating. A YELLOW or RED rating alone explains a much slower pace than a GREEN number would show, without any pause being needed.
  3. Check whether the campaign recently hit a throughput limit (error 130429). If so, expect it to finish more slowly than it started, since the pacer's rate reduction after a throughput hit is deliberate and does not bounce back for the remainder of that run.
  4. If the campaign shows Sending with genuinely no pause reason and no progress for an extended period (well beyond what pacing alone would explain), this is the case worth contacting support about rather than continuing to wait.
  5. If you need the campaign to stop regardless of cause, cancel it. Cancelling is immediate and marks the untouched remainder as cancelled, never as sent, so nothing is billed or double-counted; you can build a new campaign to the remaining audience afterward.

How VGraple CRM handles it automatically

Sending itself runs on a dedicated, durable worker backed by a Postgres queue, meaning a deploy or an unexpected crash mid-campaign does not lose the campaign's place; it resumes from the recipients still pending rather than restarting the whole send or leaving it abandoned. Every one of the five conditions that can stop a campaign, a paused template, portfolio-level pacing, a collapsed quality rating, a conversation quota limit, or the failure-rate breaker tripping, writes its specific reason directly onto the campaign the instant it is detected, rather than leaving the campaign in an ambiguous "stopped, unclear why" state. Campaigns paused for a reason with a known resume time, a portfolio budget refilling at a specific hour, quiet hours ending, resume automatically and continue from exactly where they left off, with no manual restart needed. A cancelled-mid-send campaign correctly marks its untouched recipients as cancelled specifically because an earlier version of this counting logic let a cancelled campaign show zero sent while delivered and read counts kept climbing from webhooks arriving for messages already in flight, a confusing state that has since been fixed at the source.

Example

A D2C brand's 8,000-contact win-back campaign is sending at the default rate when the number's quality rating drops to YELLOW partway through, from an unrelated earlier send. The pacer halves the rate to 25/s automatically for the rest of the run. The campaign detail page shows no pause, since YELLOW slows a campaign rather than stopping it, but the remaining recipients now take roughly twice as long to finish as the first half did; nothing needs to be done, and the campaign completes on its own, just later than it would have at GREEN.

Prevention

The clearest prevention against mistaking pacing for a genuine stall is simply knowing, before launching a large campaign, what the number's current quality rating is; a campaign launched while the number is already YELLOW or RED will predictably take longer, and that is expected behaviour rather than a fault to investigate later. For campaigns sensitive to timing, avoid scheduling a very large send immediately after a smaller one to the same number, since a throughput hit from the first can leave the pacer at a reduced rate that carries into the second. Reviewing pacing, daily limit budget and auto-resume before a large launch sets accurate expectations for how long it should realistically take.

How is this different from "held" recipients?

A held recipient is a specific, individual row within an otherwise normally progressing campaign, one Meta has accepted the send for but is pacing at the message level, most commonly tied to a new or recently changed template under quality review. The rest of the campaign's recipients continue sending and completing normally around a held one; a held status describes one row's state, not the whole campaign's. A campaign that looks stuck in Sending, by contrast, describes the campaign's overall pace or a pause condition affecting everyone still pending. See messages delayed or held for the held-recipient case specifically, since the two are frequently confused but need different explanations.

Frequently asked questions

My broadcast says Sending but the delivered count has not moved in 20 minutes. Is it actually stuck?
Not necessarily. Pacing alone can make a large campaign progress slowly, particularly if the number's quality rating is YELLOW or RED, or if it recently hit a throughput limit and the pacer deliberately slowed further. Check the campaign's pause reason field before assuming it is frozen; a genuinely stuck campaign shows sending with no reason and no progress, while a paused one names why.
What happens to a broadcast if the app deploys or restarts while it is sending?
Sending runs on a durable, Postgres-backed queue specifically so a deploy or crash mid-campaign resumes from the recipients still pending rather than losing progress or restarting from the beginning.
Does a broadcast ever just silently die?
It should not, by design. Every stop condition, a template pause, a quality collapse, a portfolio budget limit, a failure-rate breaker trip, is written on the campaign in plain language. A campaign showing Sending with no pause reason and genuinely no movement over an extended period is the one case worth reporting rather than waiting out.
Can I cancel a stuck broadcast and start over?
Yes. Cancelling stops the campaign immediately and marks the untouched remainder as cancelled rather than sent, so cancelled recipients are never counted as delivered or billed; you can then create a new campaign to the remaining audience if needed.
Why does a paused campaign sometimes resume on its own and sometimes need a manual click?
A campaign paused for a reason with a known end time, a portfolio budget refilling, a quiet-hours window closing, resumes automatically at that time. A campaign paused for a reason with no predictable end, most template pauses, a RED quality rating, needs a human decision before resuming.
Is a held recipient the same as a stuck broadcast?
No. A held recipient is one specific row Meta has accepted but is pacing individually, most often tied to a template quality review; the rest of the campaign continues normally around it. See messages delayed or held for that distinct situation.

Run your WhatsApp on VGraple CRM

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