Build1 distinct publisher2 min readPublished
The Cloud API tracks four states for a single message and the HTTP response carries only the first one, which means delivery lives in a status webhook keyed to the message ID your code was supposed to persist.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The reason the response cannot promise more is structural. The send endpoint hands your message to a separate delivery pipeline that WhatsApp does not fully control: the recipient's device has to be reachable, it has to accept the message, and the path runs over infrastructure outside WhatsApp's servers, according to the dev.to write-up [16]. A queue in front of that can only tell you it took the job.
Count the states and the gap has a size. The sequence names four [1][2][4][5][6]. The HTTP response reports the first [8]. That leaves three that exist only as asynchronous events fired after the call has already returned [1][7]. The ordering matters as much as the count: accepted sits before sent, so a 200 does not establish that the message left Meta's infrastructure at all [3][4]. The one status you get synchronously is the one that promises the least.
Wiring up the webhook endpoint is the easy half. The status events are keyed to the message ID returned by the send call [10], which makes that ID schema rather than a log line. If the outbound row does not store it, or the handler cannot match an incoming status back to a row, you have no delivery visibility regardless of what the send responses said [11][15]. Persisting a message ID in a log file you grep is not reconciliation.
Two states I would not build an alert on as-is. Read is gated on the recipient's read receipts, which the post notes are commonly disabled and outside your control [6], so a missing-read alarm measures privacy settings alongside reachability. And a free-form send after the 24-hour customer service window closes is not a transport failure [13]. The post's argument is that a closed window looks a lot like a generic delivery failure, and the actual cause is easy to lose in the noise [17]. That pushes window state into your own store: last inbound timestamp per contact, checked before the send, template path otherwise [13].
For any of this to hurt, only one condition has to hold, and it usually does: some downstream step, or a human reading a dashboard, treats your "sent" flag as arrival. The write-up calls that the single most common mistake in WhatsApp automation code, and the reason it is easy to make is that the request looks successful in every way the code checks [9]. Nothing throws.
The fix is that the outbound record stays pending until a webhook resolves it [11]. That is a migration and a new endpoint, not a monitoring tweak, which is why it tends to get deferred until a customer reports the silence.
Ranked by verification strength, evidence, and original report placement.
The WhatsApp Business API (Cloud API or on-prem) does not have a single message status; it has a sequence of statuses, each narrower than people assume.
Accepted means the API validated the request and queued the message; this is what the HTTP 200 response actually confirms, i.e. "I understood you and I'm going to try."
The accepted state does not say the message reached WhatsApp's servers for onward delivery, and does not say it reached the customer's phone.
Sent means the message left WhatsApp's infrastructure toward the recipient's device.
Read means the recipient opened the conversation, assuming read receipts are not disabled on their end, which is common and outside the sender's control.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Giving one deterministic layer the only write privilege demotes the model to a proposer1 distinct publisher
invest
Meta's Hatch agent tops out at $199.99 a month, with DoorDash and Etsy behind the meter2 distinct publishers
build
A renderer that terminates itself is how an unwatched stream reports failure1 distinct publisher
build
The click succeeded and nothing happened: your agent harness needs an injected canary1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One developer's account, thin but testable
Everything in this story traces to a single dev.to post: no Meta documentation, no error-code reference, no second engineer describing the same 200-then-silence. What keeps the score off the floor is falsifiability — a reader with a Cloud API number can send one message, read the response, and watch for the later sent and delivered events, and the description either holds or collapses within minutes. Thin sourcing, unusually cheap verification.
Nothing deployed, nothing counted
Not one deployment, outage, ticket volume or usage figure appears anywhere in this reporting. The author says the pattern recurs and opens with a scene most integrators will recognise, but names no company, no date and no scale, and nothing in the piece marks a release or an incident. There is nothing to measure here, so we are not going to score it.
Modest claims, one unearned superlative
The framing is close to honest: the post promises less than most platform explainers, describes behaviour instead of trumpeting a discovery, and even explains why WhatsApp cannot promise more at send time. The one stretch is the ranking — calling accepted-as-delivered the single most common mistake in WhatsApp automation code is a frequency claim with no data behind it, and the headline generalises the whole pattern from that. Barely above aligned.
Motive we cannot read
Nothing in what we can see is being sold — no product, no provider, no affiliate framing, just an individual writing on a developer platform. But our copy of the post stops mid-sentence in its list of production recommendations, which is precisely where a tooling pitch would live, and no disclosure of the author's commercial relationship to WhatsApp integration work appears. We will not score motive on a page we cannot read to the end.
Internally coherent, externally unchecked
We hold this loosely. The reasoning is consistent end to end — the state list, the asynchronous consequence and the pending-record advice all follow from one another — and the specific mechanics look like the product of experience rather than reading. Against that: a single publisher, a single author, no issuer confirmation, and hedged language exactly where the failure modes get interesting.