🛍️ Shopify on WhatsApp

Shipping and tracking updates that actually get read

The most welcome message a store sends — and the one most likely to fail silently on a manual fulfilment.

A shipping notification tells the customer their order has left, who is carrying it and how to follow it. It is the message customers most want from a store, it is pure utility, and it removes more support volume than anything else you can automate.

It is also the flow most likely to fail silently, for a reason nobody warns you about.

The failure nobody expects

Shopify's order-shipped event carries tracking details only if the fulfilment had them. A manual fulfilment — someone marking an order shipped without entering a tracking number — sends an empty value where your template expects one.

Meta rejects a template whose variable count does not match, with error 132000. The customer receives nothing. Your dashboard shows a send attempt. Nobody notices until a customer asks where their order is.

If you ever fulfil by hand, design for it. Either make tracking a required step in your process, or write the template so it reads correctly with no tracking number — "your order is on its way, we'll follow up with tracking" is a perfectly good message and it always sends.

What the event gives you

ValueReliable?
Customer nameYes
Order numberYes
Carrier nameOnly if entered at fulfilment
Tracking numberOnly if entered at fulfilment
Tracking linkOnly if the carrier provides one
Order status URLYes — a useful fallback

The order status URL is underused. It always exists, it shows the customer their order, and it works as a substitute when carrier tracking does not.

Write it in three lines

  1. That it has shipped, with the order number.
  2. Who has it and how to follow it — carrier plus link.
  3. When to expect it, even approximately.

The third line is the one most stores omit and the one that prevents the most follow-up messages. A tracking link that says "in transit" answers "where is it?" but not "when will it arrive?", which is the question the customer actually has.

Keep it utility

This is a message about an order that exists, so it qualifies as utility — free inside an open conversation window under Meta's pricing documentation, deliverable everywhere including the United States, and not subject to per-user marketing limits.

Adding "while you wait, check out our new arrivals" costs you all three. It is the second most common way stores accidentally convert a free message into a charged one, after the discount code in an order confirmation.

Should it ask a question?

Optional here, unlike the confirmation. A shipping notice is genuinely useful as a statement, and the customer has already had one chance to engage.

If you do add one, make it serve them rather than you: "let us know if you need it by a particular day" is useful. "Rate our packaging" is not, at a moment when they have not received anything yet.

Out for delivery, and the cash question

A second message on the delivery day is worth it for cash-on-delivery orders specifically, because it removes the two commonest reasons a delivery fails: not knowing it was coming, and not having the cash ready.

State the amount due. That single detail converts a message from informational to actionable, and it is why this notice belongs in any RTO reduction programme.

For prepaid orders it is usually unnecessary — you are adding a message to solve a problem that does not exist.

How many shipping messages is too many

MessagePrepaidCash on delivery
Shipped, with trackingYesYes
Out for delivery, with amount dueUsually noYes
Delivered confirmationOptionalOptional
Every carrier scanNoNo

The last row is a real temptation once you have courier data. Do not — a customer does not need to know a parcel reached a sorting hub, and a store that narrates logistics gets muted.

When tracking is not available at all

Plenty of stores ship by methods with no tracking: local riders, own delivery, courier services that provide nothing scannable. The notification is still worth sending, and the honest version is better than a fake tracking link.

"Your order goes out today and should reach you by Thursday — reply here if you need to change anything" does the job. It sets an expectation, and the invitation to reply opens a free window if they take it.

Reducing the questions that still arrive

Even with a good notification, some customers ask. The reactive half — catching order-status questions and answering them from a lookup — is covered in answering "where is my order?" automatically.

Build the proactive notification first, though. It removes more volume than the lookup does, which is the opposite of most people's intuition and the reason stores that build only the lookup are disappointed by it.

A template that always sends

The safest structure puts every optional value behind fixed text, so a missing one degrades rather than fails:

FragileRobust
"Tracking: {{1}} with {{2}}""Order {{1}} has shipped. We'll send tracking as soon as the courier provides it."
"Follow it here: {{1}}""You can check your order any time here: {{1}}" using the order status URL, which always exists

The right-hand column never produces error 132000, because nothing in it can resolve empty. If your fulfilment is inconsistent, that reliability is worth more than the extra detail.

Two templates, not one

If a meaningful share of your orders ship without tracking, keep two approved templates and let the flow choose: one with carrier and tracking variables, one without. A condition on whether the tracking field is populated routes between them.

That is a small amount of extra setup for the elimination of an entire failure class, and it stays well inside the 250-template ceiling Meta documents for an unverified business portfolio, rising to 6,000 once verified — see its template documentation.

What this message removes

Support volume, mostly. "Where is my order?" is the most repeated question in ecommerce, and a large share of it exists because nobody told the customer their parcel had left.

The other high-volume, highly predictable post-purchase conversation is a return request, and it automates just as well — handling returns and exchanges on WhatsApp.

The economics are unusually good: the notification is a utility template, free when it lands inside an open conversation window under Meta's pricing rules, and service conversations have been free and unlimited since 1 November 2024. So you are removing labour at close to zero marginal cost.

Timing within the day

  1. Send on fulfilment, not on a schedule. The customer wants to know when it happens.
  2. Avoid the middle of the night. If your fulfilment runs overnight, hold the batch until morning — a 3am notification is not more useful than a 9am one, and it is more annoying.
  3. Send the out-for-delivery notice early, so a cash-on-delivery customer has time to get the amount ready.

Measuring it

Method is in measuring whether your automation works.

Delivered confirmations, and whether to bother

Shopify has an order-delivered event, but it only fires if your carrier reports delivery back — and many do not. Before building anything on it, place a real order, fulfil it, and check whether the event ever arrives.

If it does, a short "your order arrived — everything alright?" is a good message: it closes the loop, and a reply opens a free window in which a problem surfaces early rather than as a public review. If it does not fire, trigger on shipped plus a delay matching your usual delivery time and soften the wording to "should have arrived by now".

A build checklist

  1. Trigger on the store's order-shipped event.
  2. An approved utility template — nothing promotional in it.
  3. Every variable either always populated, or written so a blank still reads correctly.
  4. An expected arrival date, not just a tracking link.
  5. A second template, or a fallback, for fulfilments without tracking.
  6. Tested with a real order, including one fulfilled manually with no tracking number.

Point six is the one that catches the failure this whole article is about, and it takes one test order to prove.

Instagram and Messenger

If you also sell through Instagram or Messenger, the same flow works there — the trigger and the logic are identical, and the message renders as an ordinary conversation. What does not carry over are templates, which are WhatsApp-only.

In practice that means a shipping notification reaches an Instagram customer only if the conversation is still active on that channel. For a store whose orders come largely from Instagram, the more reliable pattern is to move the customer to WhatsApp at the point of order — which is what selling on WhatsApp without a website covers.

One final habit worth adopting: check your send failures weekly rather than monthly. A shipping notification that starts failing on manual fulfilments produces no visible symptom until customers begin asking where their orders are, and by then you have a backlog of people who were never told their parcel had left.

Frequently asked questions

Why does my shipping notification fail to send?

Usually an empty variable. A manual fulfilment with no tracking number sends a blank where the template expects a value, so Meta rejects the whole message with error 132000 and the customer receives nothing.

What should a shipping message say?

Three lines: that it shipped with the order number, who has it and how to follow it, and when to expect it. The third is the one most stores omit and the one that prevents the most follow-up questions.

Should I send an out-for-delivery message?

For cash-on-delivery orders yes — state the amount due, since not having cash ready is a leading cause of failed delivery. For prepaid orders it is usually an unnecessary extra message.

What if I have no tracking number to send?

Send the notification anyway with an expected date and an invitation to reply. An honest message without tracking beats a template that fails, and the order status URL always exists as a fallback.

Need help? Message us