Meta reports message lifecycle events to Kylo’s webhook: sent, delivered, read, and failed. This page covers the three delivery problems operators actually hit.

”Sent” but never shows delivered

Meta does not guarantee a delivered event for every send. A delivered tick is implied when a read arrives, and a send whose recipient never receives it can sit at sent with no failed event at all: Meta retries delivery inside a TTL and drops the message when it expires, without promising a failed webhook. What you should do: a send that stays at one tick never reached the phone. Check the number, the recipient’s WhatsApp registration, and whether the 24 hour window or a template was required. The ops inbox keeps showing the true state rather than guessing.

Status webhook never arrives

Meta retries webhook deliveries to endpoints that answer non-200, backing off with decreasing frequency for up to 7 days. Kylo’s webhook route answers 200 fast and persists the event afterward, so redeliveries on our side are rare. If statuses are missing across every message, the subscription itself is wrong: check the WABA’s webhook subscription in Meta’s app dashboard, not Kylo.

Duplicate deliveries

Meta retries and fans out to all subscribed apps, so duplicate webhook posts are expected behavior, not a fault. Kylo dedupes inbound messages on Meta’s message id (wamid) and makes receipts idempotent, so a redelivery can never double-answer a contact or double-charge a send.

Sources