Switching from the regular app to the official API provides information that was previously unavailable: each message now has a status history returned by Meta directly to the company's system. It’s the difference between seeing two check marks on the screen and having a report on what happened with thirty thousand messages. The problem is that these statuses are often misinterpreted, and a wrong interpretation leads to costly decisions — resending messages that already arrived, changing a healthy number, blaming the contact base for a window issue. This article is about reading the correct report.
In this article
- The path of a message
- The four statuses and what each one means
- Accepted is not delivered
- Why delivery can be delayed
- What the absence of read does not prove
- Failure: the important patterns
- How to read the delivery curve of a blast
- What decision to make based on each pattern
- Where the status arrives and why it disappears
- A numerical reading
- Five reading mistakes
- The numbers to track
- Frequently Asked Questions
The path of a message
In the regular app, the only information about a message is the check marks beside it. In the official API, the same message goes through distinct stages, and the company’s system receives a notification at each change.
The path is this: the company requests sending; Meta responds if it accepted the request and returns an identifier; the message goes out to the WhatsApp network; the recipient’s device receives it; the person opens the conversation. Each of these stages can fail for different reasons, and the API’s value lies precisely in knowing at which stage it stopped.
The most common confusion starts here: Meta’s immediate response to the send request is not a delivery status. It only means the request was accepted and queued. Treating this response as "message sent successfully" is the error that produces blast reports with 100% success and no sales.
The four statuses and what each means
- Sent. The message left Meta’s server heading to the WhatsApp network. It means the request was valid: the number exists in the correct format, the template was approved, the account had permission and quota. It says nothing about the recipient’s device.
- Delivered. The message reached the device. This is the first status that proves actual reach. It should also be the number at the top of any blast report, instead of "sent."
- Read. The person opened the conversation with the message visible. This depends on the recipient having read receipts enabled.
- Failed. The message did not complete the path. It comes with a code and description, and this is where almost all useful information about a blast resides.
A fifth event appears when the message has a button or list: the recipient’s response arrives as its own event, identifying which option was chosen. It is not a status but follows the same path and is often the most valuable data in the set.
Accepted is not delivered
It’s worth emphasizing this point because it contaminates entire reports. When the system requests sending, Meta immediately responds with a message identifier. This response means: I received the request, it is valid, I will process it.
Between that moment and delivery, there are many reasons the message can fail along the way. The number may not have a WhatsApp account. The device may be off or without network for days. The person may have blocked the company. The template may be paused mid-blast. The number’s quota may be exhausted. None of these situations reverses the response already given.
That’s why an honest blast dashboard separates three columns: requested, delivered and failures — and uses the second as the denominator for any rate. A report showing "3,000 messages sent" without saying how many arrived is measuring nothing.
Continue reading for free
Fill out once and unlock this and all other blog articles. We charge nothing — we just want to know who we’re writing for.
Takes 20 seconds. Prefer to talk directly on WhatsApp?
Why delivery can be delayed
A common question: the blast finished, the dashboard shows everything processed, but the delivered column keeps rising hours later. This is not a system delay — it’s how the network works.
The message is held waiting for the recipient’s device to appear. Phone off, no signal, airplane mode, or app without connection makes the message wait. When the device returns, delivery happens and the event arrives. In a large base, it’s normal for some deliveries to occur hours later, and a smaller fraction the next day.
Two practical consequences. First: don’t evaluate a blast by the delivery rate of the first hour. The correct reading is done after an accommodation period, and comparing blasts requires comparing the same window. Second: messages not delivered within the network’s validity period are discarded, and the system receives a failure due to expiration — which does not mean invalid number, but device absent too long.
There is also a case that misleads: those with WhatsApp open on the computer may receive the message in the browser before the phone syncs. Delivery is real, but read receipts may take longer to appear.
What the absence of read does not prove
The read status is the most requested by sales teams and the least reliable for decision-making. Read receipts are a recipient setting, and those who disable it never generate the event — even if they read the entire message.
In other words: "not read" is not synonymous with "not seen". In large bases, there is always a relevant portion of contacts with read receipts disabled, and treating all as uninterested leads to two wrong decisions: resending to those who already read, which irritates and causes blocking, and discarding contacts who were responding by other means.
The useful reading of the read status is aggregated and comparative, never individual. If a template usually has 60% read over delivered and drops to 30% from one day to the next, something changed — time, subject, image, audience. The absolute number of a specific person supports no conclusion.
There is a side effect worth knowing: when the company marks received messages as read via the API, the client sees blue check marks next to it. This changes response expectations — signaling read and delaying reply is worse than not signaling.
Failure: the important patterns
Every failure comes with a code and description, and grouping them is what turns a blast into a diagnosis. The most common patterns:
- Number without WhatsApp account. The base has phone numbers not using the app, or the number is wrong. It’s a registration problem, not a sending one.
- Expiration. The device did not appear in time. Resending after an interval usually solves it, immediate resending usually fails the same way.
- Invalid, paused, or nonexistent template for that number. The failure is a configuration issue affecting the entire blast, not isolated contacts. It’s the easiest to identify because the failure rate hits near 100%.
- Outside template window. Attempt to send free message to someone who hasn’t written in the last hours. Flow error, not base error.
- Limit reached. The account hit the ceiling of conversations started in the period. The queue needs to slow down or distribute among numbers.
- Blocked by recipient. The person blocked the company. It’s definitive for that contact and should mark the record.
- Platform restriction. Rejections unrelated to the base — including numbers Meta itself sets aside for internal tests. Resending does not change the result.
The rule that applies to all: Meta failures are not resent in a loop. Persisting with a rejected message is one of the fastest ways to ruin a number’s quality. Our own failures — configuration, network, timeout — can and should be resent after correction.
How to read the delivery curve of a blast
A healthy blast has a recognizable signature: deliveries concentrated in the first minutes, a tail continuing for hours, and a low failure rate distributed among various reasons.
Three patterns indicate problems, each with a different cause:
- High failure from the first message. Configuration. Template, number, permission, or window. Stop the blast, fix it, and restart — persisting only burns the number.
- Starts well and degrades midway. Limit or quality. The account hit the period ceiling, or a template was paused during the blast.
- High delivery and very low read. The message arrived but didn’t interest. Here the problem is content or timing, not infrastructure — and it’s the only one of the three solved by rewriting.
What decision to make based on each pattern
The report only matters if it produces action. A short guide:
- Many "no WhatsApp account". Clean the base and review how phone numbers are collected in registration. No blast change fixes this.
- Many expirations. Reschedule resending for another time, with hours interval, and don’t resend in sequence.
- Template failure. Check if the model exists and is active for that number. It’s the classic cause when the operation uses number rotation.
- Limit reached. Slow the pace, distribute among numbers, and plan tier upgrades instead of forcing volume.
- Rising blocks. Stop and rewrite. Blocking is the platform’s most serious signal and precedes number quality decline.
Where the status arrives and why it disappears
Status events are not polled: they are delivered. Meta sends each change to a company address configured in the account. This has two implications that can bring down entire operations and rarely appear as visible errors.
First: if the address stops responding — server down, expired certificate, machine change, address change without updating configuration — events stop arriving. The blast keeps working, messages keep delivering, and the dashboard simply stops updating. The symptom is a frozen report, not an error message.
Second: events can arrive out of order or repeated. A system assuming chronological order ends up recording "delivered" after "read" and overwriting the more advanced state with the older one. The correct rule is only advance: a message marked as read does not revert to delivered.
It’s also important to know that the status history is not stored indefinitely on the platform side. Those wanting historical reports must record events as they arrive — there is no way to request them later.
A numerical reading
An example blast with 10,000 contacts illustrates the difference between reading and not reading the report.
The naive dashboard says: 10,000 sent, blast completed. The correct dashboard, measured six hours later, says:
- 9,980 accepted by Meta; 20 rejected due to invalid number format
- 8,900 delivered — 89.2% of accepted
- 640 failures due to number without WhatsApp account — 6.4%
- 390 expired due to absent device — 3.9%
- 50 blocks — 0.5%
- 4,700 reads — 52.8% of delivered
- 760 button responses — 8.5% of delivered
Three decisions come from this, none of which would appear on the naive dashboard. The 640 numbers without accounts are a registration problem costing money on every blast and solved once. The 390 expirations become a rescheduled resend for another time, with realistic expectations of recovering much. And the 50 blocks, at 0.5%, are at an acceptable level — but if the next blast takes that number to 2%, the right reaction is to stop and rewrite the message, not change the number.
Five reading mistakes
- Calling "delivered" what Meta only accepted. Produces reports with 100% success and no results.
- Evaluating the blast in the first hour. The delivery tail lasts hours; comparing blasts requires comparing the same window.
- Treating "not read" as "not seen". Read receipts are optional for the recipient, and a relevant portion of the base keeps them off.
- Resending what Meta rejected. It’s the fastest way to ruin a number’s quality, and the resend result is the same.
- Trusting a report without checking if events are still arriving. A frozen dashboard due to an unreachable address looks like a perfect blast.
The numbers to track
Five indicators summarize the delivery health of an operation. The delivery rate over accepted, always measured in the same time window, is the master indicator. The failure composition by reason, which separates base, configuration, and content problems — without it, every failure becomes "WhatsApp error." The read rate over delivered by template, read comparatively, shows message wear before blocking appears. The block rate, the most sensitive signal and the one preceding number quality decline. And the time to first human response among responders, because the entire delivery operation exists to produce conversation, and waiting conversation cools off.
Frequently Asked Questions
Is "sent" message the same as delivered on WhatsApp?
No, and this confusion contaminates entire reports. When the system requests sending, Meta immediately responds with an identifier — and this response only means the request is valid and queued. Between that moment and delivery, there are many reasons the message can fail along the way: the number may not have a WhatsApp account, the device may be off for days, the person may have blocked the company, the template may be paused mid-blast, the number’s quota may be exhausted. None of these situations reverses the response already given. That’s why an honest dashboard separates three columns — requested, delivered, and failures — and uses delivered as the denominator for any rate. A report showing "3,000 sent" without saying how many arrived is measuring nothing.
Why does the message take hours to appear as delivered?
Because the message is held waiting for the recipient’s device to appear. Phone off, no signal, airplane mode, or app without connection makes delivery wait; when the device returns, delivery happens and the event arrives. In a large base, it’s normal for some deliveries to occur hours after the blast, and a smaller fraction the next day. Two practical consequences: don’t evaluate a blast by the delivery rate of the first hour, and comparing blasts requires comparing the same time window. Also, messages not delivered within the network’s validity period are discarded and generate an expiration failure — which does not mean invalid number, but device absent too long. In this case, resending at another time usually recovers much.
If the status does not show "read," did the client not see the message?
You can’t conclude that. Read receipts are a recipient setting, and those who disable it never generate the event, even if they read the entire message. In large bases, there is always a relevant portion of contacts in this situation, and treating them as uninterested leads to two errors: resending to those who already read, which irritates and causes blocking, and discarding contacts who were responding by other means. The useful reading of the read status is aggregated and comparative, never individual: if a template usually has 60% read over delivered and drops to 30% from one day to the next, something changed — time, subject, image, or audience. The number of a specific person supports no conclusion.
My blast is failing almost entirely. What does this indicate?
High failure from the first message is almost never a base problem: it’s configuration. The most common causes are invalid, paused, or nonexistent template for that specific number — classic in operations with number rotation — attempt to send free message to someone who hasn’t written in the last hours, missing permission, or exhausted quota. The right reaction is to stop the blast, identify the reason by grouping failures by code, and fix before restarting. Persisting is the worst path: resending a message Meta rejected is one of the fastest ways to ruin a number’s quality, and the resend result is the same. When the blast starts well and degrades midway, the cause is usually different: period limit reached or template paused during sending.
Why did my dashboard stop updating statuses?
Because status events are not polled but delivered: Meta sends each change to an address configured in the company’s account. If that address stops responding — server down, expired certificate, machine change, address change without updating configuration — events stop arriving. The blast keeps working and messages keep delivering; only the dashboard freezes. The symptom is a stalled report, never an error message, which is why this failure often goes unnoticed for days. There are also two implementation precautions: events can arrive out of order or repeated, so the state should only advance — a message marked as read does not revert to delivered — and the history is not stored on the platform side, meaning those wanting historical reports must record each event as it arrives.
Blast report only matters when it separates accepted, delivered, and failed
VeyloCRM records every status event Meta returns, groups failures by reason in Portuguese, shows the blast delivery curve instead of an inflated total, alerts when events stop arriving, and transfers to a person the instant the client responds — on WhatsApp, Instagram Direct, and Messenger, all in the same dashboard.