Four states, not two
The word "not delivered" gets used for all of these, which is why the fixes get confused with each other.
- Failed at submission — Meta rejected the send. A bad number format, a paused template, or a limit already reached.
- Accepted but not delivered — the number is unreachable, has no WhatsApp account, or the handset has not come online.
- Delivered but not read — it arrived. This is an engagement problem, not a delivery one.
- Blocked by the recipient — delivery stops permanently for that person, and the signal counts against your quality rating.
The reasons worth recognising
Meta returns an error with each failure, and a handful account for most of what operators see.
- Messaging limit reached — you have hit the unique-recipient cap for the rolling 24 hours. The send resumes when the window moves.
- Template paused or disabled — a quality problem caught up with the template, and it cannot send until its approved status is restored.
- Invalid or unregistered number — no WhatsApp account on that number, which is common in lists assembled from other channels.
- Re-engagement outside a window — a free-form message attempted when no customer service window is open. That needs a template.
- Account restriction — messaging blocked at the account level rather than for this message.
Reading it per recipient rather than per campaign
A campaign summary tells you a percentage. What you need is which numbers, because the pattern in the failures is the diagnosis: failures spread evenly across a list usually mean an account or template problem, while failures concentrated in one segment usually mean that segment’s numbers are wrong or its consent is not real.
In this product each recipient of a campaign carries its own status and Meta’s own failure reason, and the failed portion can be retried on its own rather than by resending to everybody.
What not to do
Resending immediately to the whole list is the common reflex and the expensive one. Under per-message pricing every delivery is billed, so a blanket resend pays again for the messages that already arrived, and it repeats whatever caused the failures for the ones that did not.
If the reason is a messaging limit, waiting is the fix. If it is a paused template, the template is the fix. If it is the list, sending it again harder is the opposite of the fix.
