How to verify Shopify WhatsApp notifications were delivered

WhatsApp notifications not delivered from Shopify? What Meta's sent, delivered, read and failed statuses mean, the usual causes, and how a log helps.

WhatsApp notifications not delivered is a problem that hides well. Your Shopify order is paid, your app's dashboard says the confirmation went out, and the customer never sees it. Nobody complains, because nobody knows. The first sign is usually a number: cash-on-delivery refusals creep up, or abandoned-checkout recovery falls off a cliff. This guide explains what "delivered" actually means on WhatsApp, which status your app should be able to show you for every single message, the causes behind each failure, and how the delivery log in Beacon Messenger is built so a silent failure is never silent.

Why silent failures are common

One reviewer of SuperLemon described the situation exactly in the app's 1- and 2-star reviews: a "Massive drop in abandoned cart recovery from 15% to 3 & 5%" that they attributed to messages not being sent while still being "charged per message as per their fees". Another, on 21 December 2024, reported that the "tracking link and order detail link is not working at all", which is the same failure one layer down: the message arrives, but the thing it points to does not. These are merchant reports rather than audits, but they illustrate the two questions any WhatsApp app must be able to answer for you: did this message reach this phone, and if not, why not?

What Meta actually tells the app

Every message sent through the official WhatsApp Cloud API gets an ID, and Meta then posts status updates for it to the app's webhook. Meta's webhook reference explains that each outgoing message "can have up to three separate webhooks (one for a status of sent, one for delivered, and one for read)", and that outgoing message errors arrive in the same statuses array with an error code. In plain terms:

  • Sent: WhatsApp accepted the message from the API. It says nothing about the customer's phone.
  • Delivered: the message reached the customer's device. This is the status that matters for an order confirmation.
  • Read: the customer opened the conversation with read receipts enabled. Absence of read does not mean absence of delivery.
  • Failed: WhatsApp rejected the message, and the error explains why: an invalid recipient, a template that is paused or was rejected, an expired token, a messaging limit, or a recipient who has not accepted WhatsApp's terms.

An app that pairs a phone instead of using the API does not receive these webhooks, which is why such tools can only show you that they attempted to send. An app that uses the API but does not store the statuses is throwing the information away. Either way, if your app cannot show delivered and read per message, you cannot verify delivery, and you should treat any conversion number it reports with suspicion.

The usual causes, in the order to check them

  1. Phone number format. WhatsApp needs the full international number without spaces, plus signs or leading zeros. Numbers entered by customers at checkout often have a local format or a missing country code, and Shopify passes them through as typed. Failed entries with an invalid-recipient error almost always trace back to this.
  2. Consent and phone presence. If the checkout did not collect a phone number, or the customer did not consent to marketing and the message is a marketing template, a well-built app should skip the message rather than send it. A skip is not a failure, but it looks like one from the outside.
  3. Template status. Meta can pause a template whose quality rating drops or reject an edit. Sends using that template fail until it is fixed in WhatsApp Manager.
  4. Token or connection. A permanent system-user token can be revoked when someone changes a Meta Business Manager permission. Every send then fails with an authentication error until the token is replaced.
  5. Messaging limits and quality. Meta caps how many unique customers a new business can message in a rolling 24 hours, starting at 250 and rising with quality and volume (Messaging Limits). A store that suddenly grows can hit the tier before it is raised.
  6. The app's own cap. If the app has a monthly message limit, it may stop sending once you reach it. That should be visible as a distinct status, not merged into failures.
  7. The link inside the message. A message can be delivered and read and still fail the customer if the tracking or order-status URL is broken. Open the link from a delivered test message on a phone that is not logged into your store.

Checking without an app log

If your current app cannot show per-message statuses, you still have Meta. In WhatsApp Manager, the Insights section reports sent, delivered and read counts per template, and the phone number page shows the quality rating and current messaging limit. It will not tell you which order a failure belonged to, but a delivered count well below the sent count for a template tells you that a problem exists. The other reliable test is the oldest one: place an order from a phone you control, using the exact checkout your customers use, and watch what arrives.

How the delivery log works in Beacon Messenger

Beacon Messenger writes one row to its delivery log for every automated message it handles, whether or not it was sent. When the queue processes an order confirmation, shipping update, cash-on-delivery confirmation or abandoned-checkout reminder, the row starts as queued. If the message cannot be sent on purpose, the row is marked skipped with the reason, for example no phone number, no marketing consent, WhatsApp not connected, or monthly limit reached. If Meta accepts it, the row records Meta's message ID and moves to sent, then to delivered and read as Meta's status webhooks arrive. If Meta rejects it, the row is marked failed and stores Meta's error code and error text; transient errors are retried automatically before the entry becomes failed.

In the app's Messages page you can search by order number or phone number, and filter by status and by automation. Each entry shows the recipient, the template used, the WhatsApp message ID, and any error or skip reason. For a message that failed or was skipped, a Retry action re-queues it once you have fixed the cause, so a corrected phone number or a renewed token does not require a new order. For cash-on-delivery messages the row also stores the customer's reply. The same statuses feed the plan page, which shows how many messages were sent and skipped this month against your cap. If you have not set up notifications yet, the Cloud API notifications guide covers templates and the webhook, and the landing page lists which automations each plan includes.

Frequently asked questions

My app says the message was sent. Is that the same as delivered?

No. Sent means WhatsApp accepted the message from the API. Delivered is a separate status Meta sends when the message reaches the customer's device, and read when they open it. Only delivered confirms arrival.

Why do some messages show read and others only delivered?

Customers can turn off read receipts in WhatsApp, in which case Meta never sends the read status. A message stuck at delivered was still received.

What does a failed status with an invalid recipient mean?

WhatsApp could not match the number to an account. Check that the customer's phone was saved with a country code and no leading zero, and that the number is actually on WhatsApp. Fix the number on the order and retry.

Am I charged by Meta for failed messages?

Meta bills delivered template messages according to its published pricing; a message that WhatsApp rejects is not delivered. Beacon Messenger counts only sent messages toward the plan cap and never adds its own per-message charge.

Can I see which messages were skipped because of my plan limit?

Yes. In Beacon Messenger, filter the Messages page by the skipped status; each entry shows the reason, and the plan page shows the month's skipped total.

More guides