A WhatsApp message can be accepted by Gleap and still rejected by Meta. When that happens the message carries its delivery status in the conversation, along with the reason Meta gave.
Open the conversation and look at the message itself. Delivery updates arrive from Meta after the send — accepted, delivered, read, or failed — and each message keeps the history of what it was told, so you can see whether it ever left and where it stopped.
A failure carries Meta's own error with it. Read that before changing anything; the causes below look identical from the outside but need different fixes.
The most common cause. Too much time has passed since the customer's last message, so a free-form reply is no longer allowed and Meta refuses it.
The fix is to send an approved template instead. There's no way around it by rewording the message — the restriction is about timing, not content.
The number stored on the contact is what's used to send. A number written the way people write it locally — without the country code, or with a leading zero that belongs to the domestic format — isn't a number Meta can deliver to, and the send fails.
Store numbers with the country code, and check what your own signup form or import produced.
Meta also refuses messages when the business account is in a bad state — an unpaid balance, a policy issue, a verification that lapsed — or when a template was changed and is awaiting approval again. Both show up as failures on individual messages rather than as an obvious account-level warning, so check the channel status when several messages fail at once.
There's no automatic retry, including for errors that look temporary. Once Meta rejects a message it isn't sent again, and nothing notifies your team that it didn't arrive.
In practice that means someone has to look. After fixing the cause, send the message again from the conversation — and if a customer says they never heard back, check the message status before concluding it was sent.