An order status flow is the single highest-volume automation most e-commerce teams will ever build, and an order status flow in WhatsApp is where customers already want to ask. The question behind it is almost always the same three words: where is my order. Support teams have a name for it — WISMO — and on a busy store it can swallow half of every support inbox. A well-built order status flow lets a customer type one message, confirm who they are, and get the exact state of their package back in seconds, without a human touching the conversation.
This is a build tutorial, not a pitch. We will walk through the whole thing step by step: the self-serve lookup that answers where is my order on demand, the proactive shipping update flow that messages people before they have to ask, the exception handling for orders that are stuck or returned, and the escalation path for the cases automation should not try to solve. We will show sample status messages you can adapt, and we will be honest about the parts that are genuinely hard.
The honest part up front: a real order status flow needs your actual order and tracking data. That means an integration with your store platform or a webhook feeding live data into the flow, which on most tools — KlyoChat included — sits on a higher plan. WhatsApp adds its own rules: if you message a customer outside the 24-hour service window, you need an approved template and Meta charges a per-conversation fee. We build KlyoChat, so we will be clear about where it fits and where it does not. None of this is a blocker; it is just the reality of wiring chat to commerce, and it is better to plan for it than to discover it halfway through.
What is an order status flow, and why build it in WhatsApp?
An order status flow is an automated conversation that answers the question where is my order and keeps the customer informed across the life of a shipment. At its simplest it takes an order number, looks up the current state, and replies with a clear status and a tracking link. At its fullest it also reaches out on its own — confirming the order, announcing dispatch, flagging delays, and confirming delivery — so the customer rarely has to ask in the first place.
WhatsApp is the right home for this for a practical reason: it is where the conversation already lives. Email order updates get buried; SMS is one-directional and easy to ignore; an on-site tracking page requires the customer to remember your URL and dig out their order number. WhatsApp threads persist, notifications actually get seen, and the customer can reply in the same place they received the update. That two-way channel is what turns a static notification into a flow — the customer can ask a follow-up and get an answer without leaving the thread.
There are two halves to a complete build, and it helps to name them early because they behave differently. The reactive half is the self-serve lookup: the customer starts the conversation, so you are inside WhatsApp's free 24-hour service window and can reply freely. The proactive half is the outbound update: you start the conversation, often days after the last customer message, so you are outside the window and need an approved template plus a Meta fee. Most teams build the reactive half first because it is cheaper and simpler, then layer the proactive half on once the data plumbing is in place.
It is worth being precise about why WhatsApp beats the alternatives for this specific job, because the reasoning shapes how you design the flow. Email is asynchronous and crowded — an order update competes with newsletters, receipts, and promotions, and many people simply never open transactional email. SMS is delivered reliably but it is a dead end: a customer cannot meaningfully reply to a 160-character notification and get a useful answer back, so it pushes the WISMO question to a different channel rather than resolving it. An on-site tracking widget assumes the customer remembers your store, finds the page, and digs out their order number — three steps that each shed people. WhatsApp collapses all of that into one persistent thread the customer already checks, where the update and the follow-up question and the answer all happen in the same place. That is the whole argument: the channel removes friction at exactly the moment a customer is anxious about a purchase.
WISMO is a volume problem, not a hard problem
Where is my order questions are repetitive and answerable from data you already have. That is exactly the kind of work automation is good at. The goal is not to eliminate your support team — it is to stop them retyping the same tracking lookup forty times a day so they can handle the cases that actually need a person.
What do you need before you start building?
Before you open a flow builder, line up the data and the access. The flow is the easy part; the inputs are what make or break it. An order status flow that cannot see real order data is just a polite way of telling people to check their email — it will frustrate more than it helps.
Here is the checklist of what has to be in place. Treat the data source as the gating item: everything else is configuration, but without live order data there is nothing to automate.
- A live order data source — your store platform (Shopify, WooCommerce) connected directly, or a webhook/API that pushes order and tracking data into the flow.
- A WhatsApp Business account connected to your chat platform, with the number verified and message templates submittable to Meta.
- At least one approved utility template for proactive out-of-window updates (shipping, delivery), since you cannot freely message outside the 24-hour window.
- A mapping of your order states — placed, paid, packed, shipped, out for delivery, delivered, exception, returned — so the flow can translate raw status codes into human language.
- A clear escalation rule and a human inbox or team to receive the conversations the flow hands off.
- Tracking links from your carrier or shipping app, ideally as a field on the order so the flow can drop the right link into the message.
The data source is a real prerequisite, not a nice-to-have
On KlyoChat, direct Shopify and WooCommerce integrations plus API and webhook access live on the Business plan ($129/mo). If your order data lives somewhere a flow cannot reach, the lookup cannot work. Confirm you can get order data into the flow before you invest time designing it — this is the most common reason a WISMO build stalls.
How does the self-serve order lookup work?
The self-serve lookup is the heart of an order status flow and the right place to start. The customer messages you — triggered by a keyword like order, status, or tracking, or by tapping a button — and the flow walks them to an answer. Because the customer initiated the conversation, you are inside WhatsApp's free service window, so there are no template requirements and no per-message Meta surprises on the reply.
The trick to a good lookup is identity. You need to be confident the person asking is the person who placed the order before you reveal anything about it. The lightest version asks for an order number plus a matching email or phone; the order number alone is too guessable to be safe. Match both against your order data, and only then return the status.
There is a design decision hiding inside the lookup that is easy to get wrong: how much you ask the customer to type. Every field you request is friction, and friction is where people drop out. If you already know the customer's WhatsApp number, you may be able to match it directly against the phone on their most recent order and skip the order-number question entirely for the common case of one open order — only falling back to asking when there are several. The more you can infer from what you already have, the fewer questions the customer answers and the more the flow feels like a quick check rather than an interrogation. The balance to strike is convenience against safety: never infer your way past identity verification for the part that reveals personal data, but do use what you know to make the verified path as short as possible.
- Trigger the flowSet keywords (order, status, where is my order, tracking) and a quick-reply button so customers can start the lookup. The trigger fires inside the 24-hour window, so the whole exchange is free to send.
- Capture and verify identityAsk for the order number, then a confirming detail — email or the phone number on the order. Match both against your order data before revealing anything. Never expose order details on order number alone.
- Look up the order via integration or webhookThe flow queries your connected store or hits your webhook/API with the order number, and pulls back the current status, the carrier, and the tracking URL.
- Map the raw status to a human messageTranslate the platform's status code (for example fulfilled or in_transit) into plain language and the matching sample message, with the tracking link attached.
- Offer next actionsEnd with buttons: track package, talk to a human, or ask another question. This keeps the customer inside the flow and gives them a clean exit to a person if they need one.
Self-serve lookup — shipped order
- Customer
- where is my order
- Flow
- Happy to check. What is your order number? (It starts with #)
- Customer
- #10432
- Flow
- Thanks. And the email on the order, to confirm it is you?
- Customer
- sam@example.com
- Flow
- Found it. Order #10432 shipped on March 10 via DHL and is in transit, expected March 14. Track it here: dhl.com/track/XYZ. Anything else?
How do you map order statuses to clear messages?
Raw status codes from a store platform or carrier are not customer language. A field that reads fulfilled, in_transit, or exception means nothing to the person waiting for a parcel, and worse, the same word can mean different things on different platforms. The job of this layer is to translate each underlying state into a short, specific message that tells the customer exactly what is happening and what, if anything, they should do.
Build a status map: one row per state, with the trigger condition, the customer-facing message, and whether it should also fire a proactive update. Keep the messages concrete — a date, a carrier, a link — and avoid vague reassurance. People do not want to be told their order is important to you; they want to know where it is.
| Order state | What it means | Sample customer message |
|---|---|---|
| Placed / paid | Order received, not yet packed | We have got your order #10432 and are getting it ready. We will message you the moment it ships. |
| Packed / fulfilled | Picked and packed, awaiting carrier | Good news — order #10432 is packed and waiting for pickup. A tracking link is on its way shortly. |
| Shipped / in transit | Handed to carrier, moving | Order #10432 is on the move with DHL, expected March 14. Track it here: dhl.com/track/XYZ |
| Out for delivery | On the truck today | Order #10432 is out for delivery today. Keep an eye out — it should arrive by this evening. |
| Delivered | Carrier marked delivered | Order #10432 was delivered on March 14. Hope it is everything you wanted. Reply here if anything is off. |
| Exception / delayed | Stuck, failed delivery, customs | Quick update on #10432 — there is a delay in transit with the carrier. We are watching it and will update you. Want a human to look into it now? |
Write the messages before you build the logic
Draft every status message as plain text first, then wire the flow to deliver them. It is far easier to get the tone and specificity right in a document than buried inside a flow builder, and it forces you to confirm you actually have the data (date, carrier, link) each message promises.
How do proactive shipping updates work?
The self-serve lookup is reactive — it waits for the customer to ask. The proactive shipping update flow flips that: it messages the customer when something changes, so the where is my order question never gets typed because the answer arrived first. This is the half of the build that genuinely reduces support volume, because the best WISMO ticket is the one that never opens.
Proactive updates are triggered by status changes in your order data. When an order moves from packed to shipped, a webhook or integration event fires the flow, which sends the matching update. The catch is timing. By the time an order ships, the customer almost certainly messaged you more than 24 hours ago, so you are outside WhatsApp's service window. That means an approved template and a per-conversation fee from Meta. There is no way around this — it is how WhatsApp works for everyone, on every platform.
- Subscribe to order status changesConnect your store so fulfillment events (shipped, out for delivery, delivered) push into the flow, or configure a webhook from your shipping app to do the same.
- Get utility templates approvedSubmit shipping and delivery templates to Meta as utility messages. Utility templates are cheaper than marketing ones and are the correct category for transactional order updates.
- Trigger the right template on each eventMap each status change to its approved template, fill in the order number, carrier, and tracking link as variables, and send.
- Open the thread for repliesOnce the template lands and the customer replies, you are back inside the 24-hour window — so any follow-up they have routes straight into your self-serve flow or to a human, at no extra template cost.
Out-of-window messages need templates and cost money
Any proactive update sent more than 24 hours after the customer's last message requires an approved WhatsApp template, and Meta bills per conversation on top of your subscription. Budget for this. Utility templates are cheaper than marketing templates, so keep order updates strictly transactional to qualify for the lower rate.
Proactive shipped notification (template)
- Template (utility)
- Hi {{1}}, your order {{2}} just shipped via {{3}}. Estimated delivery {{4}}. Track it any time: {{5}}
- Rendered
- Hi Sam, your order #10432 just shipped via DHL. Estimated delivery March 14. Track it any time: dhl.com/track/XYZ
- Customer reply
- Can it be left with a neighbour?
- Flow
- (now inside the 24h window — routes to delivery-preferences flow or a human, no template needed)
How do you handle exceptions and stuck orders?
Most orders move smoothly from shipped to delivered, and the flow handles those silently. The orders that generate angry messages are the exceptions: the parcel stuck in customs, the failed delivery attempt, the package marked delivered that never arrived, the order that quietly went out of stock after checkout. These are exactly the moments a customer's patience is thinnest, and exactly where a generic automated reply does the most damage.
The principle for exceptions is simple: be honest, be specific, and offer a human fast. An exception status should never pretend everything is fine. Acknowledge the problem in plain words, say what you are doing about it, and put a talk to a human button right there. Do not make a frustrated customer hunt for the escape hatch — that is how a recoverable situation becomes a refund request and a bad review.
- Detect the exception from the carrier or order status (failed delivery, customs hold, returned to sender, delivered-but-disputed) rather than waiting for the customer to report it.
- Acknowledge the specific problem — name it. Do not send a generic on its way message when the order is plainly stuck.
- Always offer immediate escalation on an exception. A talk to a human button should be one tap away on any negative status.
- Flag delivered-but-not-received cases for a person — these often involve carrier disputes or claims that automation should not adjudicate.
- For out-of-stock-after-checkout, be upfront, offer a choice (wait, swap, or refund), and route to a human if the customer is unhappy.
Treat exceptions as escalation triggers by default
When in doubt, route exceptions to a human. The cost of a person handling a stuck-parcel conversation is far lower than the cost of an automated reply that feels dismissive when someone is already annoyed. Reserve full automation for the happy path; let people own the unhappy one.
Exception — failed delivery
- Flow (proactive)
- Hi Sam, the carrier tried to deliver order #10432 today but could not complete it. They will retry tomorrow.
- Flow
- Want to reschedule, change the address, or have someone look into it?
- Customer
- this is the second failed attempt, I am frustrated
- Flow
- Completely understand, that is not good enough. I am connecting you to a teammate now who can sort this out directly.
When and how should the flow escalate to a human?
A good order status flow knows its limits. The point of automation here is to handle the repetitive, answerable cases so your team can focus on the ones that need judgment — not to trap customers in a loop with no way out. Escalation is not a failure of the flow; it is a designed feature of it, and the smoothest flows make handoff feel natural rather than like hitting a wall.
Define your escalation triggers explicitly so the flow knows when to step back. Some are about customer signal (they ask for a person, they sound upset) and some are about state (an exception, a dispute, a question the flow has no data for). When any of them fire, hand the conversation to a human inbox with the full context attached — order number, status, and the conversation so far — so the customer never has to repeat themselves.
| Escalation trigger | Why it should escalate |
|---|---|
| Customer asks for a human | Explicit request — always honour it immediately, no friction. |
| Negative sentiment or repeated frustration | An upset customer needs empathy and authority automation cannot offer. |
| Any exception status | Stuck, failed, returned, or disputed orders need a person to resolve. |
| Identity cannot be verified | If order number and email do not match, do not guess — hand to a human. |
| Question outside order status | Refunds, complaints, or product issues are beyond the flow's scope. |
Pass full context on handoff
When the flow escalates, the human should inherit the order number, current status, and the whole conversation. Making a frustrated customer re-explain their problem to a person is the fastest way to undo the goodwill the flow earned. The handoff should feel like a continuation, not a restart.
How do you connect your order data with an integration or webhook?
Everything above depends on the flow being able to see live order data. There are two common ways to get it there, and which one you use depends on where your orders live and how much custom plumbing you are willing to do. This is the part of the build that is genuinely technical, so it is worth understanding the two paths before you commit.
The first path is a direct platform integration. If you sell on Shopify or WooCommerce and your chat platform connects to them natively, order data and fulfillment events flow in without custom code. This is the simplest route and the one most teams should use if it is available. The second path is a webhook or API integration: your store, shipping app, or order-management system pushes events to your chat platform, or the flow calls out to fetch order data on demand. This is more flexible and works with almost any backend, but it requires someone comfortable wiring up endpoints.
- On KlyoChat, Shopify and WooCommerce integrations plus API and webhook access are on the Business plan ($129/mo) — the lower plans do not include them.
- For proactive updates, you need event push (webhook or integration) so a status change can trigger a message without anyone watching.
- For self-serve lookups, an on-demand API call or a synced integration works, since the customer's message is what kicks off the query.
- Whatever the source, secure it — order data is personal data, and the verification step exists to keep it out of the wrong hands.
| Approach | Best for | Trade-off |
|---|---|---|
| Direct integration (Shopify/Woo) | Stores on supported platforms wanting the fastest setup | Limited to what the native connector exposes; no custom logic |
| Webhook (events pushed in) | Pushing live status changes (shipped, delivered) into proactive flows | Needs someone to configure and maintain the webhook source |
| API call (flow fetches on demand) | Self-serve lookups against a custom or headless backend | Most flexible but the most engineering to build and secure |
Order data is personal data — protect the lookup
An order status flow exposes shipping addresses, names, and purchase history. The identity check (order number plus a matching email or phone) is not optional politeness — it is the control that stops anyone from reading another person's order details by guessing a number. Never weaken it for convenience.
How do you test the order status flow before going live?
An order status flow touches real customer data and real money, so it deserves more testing than a welcome message. The failure modes are specific: a wrong status sent to the wrong person, a template that does not render, a lookup that leaks data, a delay update that fires on a delivered order. Walk every path before you let real customers in, because the first time a flow gets WISMO wrong at scale, it does it to hundreds of people at once.
Test against real order states, not just the happy path. Create test orders in each state — placed, shipped, out for delivery, delivered, and at least one exception — and run the flow against each. Then deliberately try to break the identity check, the escalation, and the template variables.
- Test every status with a real orderMake a test order, move it through each state, and confirm the flow returns the correct message and tracking link at each step.
- Try to break identity verificationEnter a valid order number with the wrong email. The flow must refuse to reveal anything and offer to escalate instead.
- Fire a proactive templateTrigger a shipped event and confirm the approved template renders with the right variables and lands as a real WhatsApp message.
- Walk the exception and escalation pathsForce a failed-delivery state and an explicit talk to a human request. Confirm both reach a real person with full context attached.
- Check the out-of-window behaviourConfirm that a proactive message more than 24 hours after the last customer reply correctly uses a template, and that in-window replies do not.
Soft-launch to a slice of orders first
Before turning the flow on for everyone, route a small percentage of orders through it — or limit it to one product line — for a week. Watch the conversations, fix the rough edges, then scale. A staged rollout catches the edge cases your test orders did not.
What metrics tell you the flow is working?
Once the order status flow is live, measure it so you know whether it is actually reducing load and keeping customers informed. The headline metric is WISMO deflection: how many order status questions the flow resolves without a human. But deflection alone can hide problems — a flow that deflects by frustrating people into giving up is worse than no flow at all — so pair it with satisfaction and escalation signals.
Watch a small, honest set of numbers. You do not need a dashboard with forty metrics; you need the few that tell you whether the flow helps customers and saves your team time.
- Self-serve resolution rate — the share of lookups answered fully by the flow with no human handoff.
- Escalation rate and reasons — rising escalations on a specific status point to a message or data gap to fix.
- Proactive coverage — the share of orders that got a shipped/delivered update before the customer asked.
- Time to answer — how fast a customer gets a status versus the old human-handled baseline.
- Reopen or repeat rate — customers coming back with the same question signal an unclear message.
Deflection without satisfaction is a false win
A high self-serve rate only counts if customers got the right answer and felt helped. Keep an eye on escalations and repeat questions alongside deflection — if they climb together, the flow is shedding load by being unhelpful, not by being good.
How do AI agents and templated flows divide the work?
There are two engines you can use to power an order status flow, and the best builds use both for what each is good at. A templated flow is deterministic: it follows a fixed path, asks set questions, and returns the exact status message you wrote. An AI agent is flexible: it understands free text, handles the messy way people actually phrase things, and can answer a follow-up that the rigid flow never anticipated. Used together, the flow handles the structured backbone — verify identity, look up the order, return the status — while the AI agent catches everything around the edges.
The reason to keep the core lookup as a deterministic flow is trust. When a flow returns a status, you know precisely what it said and that it matched the data, which matters when the message contains a delivery date and a personal shipping link. You do not want an AI improvising the status of a real parcel. But the moment a customer veers off-script — can I change the delivery address, what happens if I am not home, is the package insured — a fixed flow either dead-ends or escalates unnecessarily. That is the AI agent's job: interpret the question, answer it from a knowledge base if it is general, or pull the order context and hand to a human if it is specific. The division is clean once you see it: the flow owns the data-bearing answer, the agent owns the conversation around it.
Let the flow answer with data, let AI answer with language
Keep anything that states a real order status inside a deterministic flow so it is always accurate. Use the AI agent for the open-ended questions a fixed path cannot predict. Mixing them this way gives you reliability on the facts and flexibility on the conversation, without letting AI guess at a parcel's location.
Where each engine takes over
- Identity + lookup + status
- Deterministic flow — fixed, verifiable, returns the exact status message
- Free-text follow-up (when, where, can I change X)
- AI agent — interprets intent, answers from knowledge base or escalates
- Exception + dispute
- Flow detects, AI agent or rule escalates to a human with full context
What are the common mistakes that break an order status flow?
Most order status flows that disappoint do not fail because the technology broke — they fail because of a handful of avoidable design mistakes. Knowing them in advance is the cheapest way to build a good one, because every item below is something you can decide against before you write a single step. These are the patterns we see most often when a WISMO build underperforms.
The throughline is that a status flow is a trust exercise as much as a technical one. Customers are anxious about money they have already spent, and every one of these mistakes erodes the trust that makes them comfortable self-serving instead of demanding a human. Avoid them and the flow earns the right to handle volume; commit them and customers route around it straight to your inbox.
- Revealing order details on order number alone — a security hole that lets anyone read a stranger's shipping address by guessing.
- Sending vague reassurance instead of facts — your order is important to us tells the customer nothing; a date, carrier, and link tells them everything.
- Hiding the escape hatch — if talk to a human is buried, a frustrated customer feels trapped and the flow becomes the problem.
- Treating exceptions like the happy path — an on its way message on a stuck parcel reads as either broken or dishonest.
- Forgetting the 24-hour window — trying to send a proactive update without a template silently fails or gets blocked.
- Letting status messages drift from reality — if the flow says delivered and it was not, the customer trusts nothing it says next.
- No context on handoff — making a customer re-explain their order to a human undoes the goodwill the flow built.
A wrong status is worse than no status
If your data source lags or maps states incorrectly, the flow can confidently tell a customer the wrong thing — that a delayed order is on time, or a lost one was delivered. That single bad answer costs more trust than a dozen WISMO tickets handled by a human. Validate the data mapping before you trust the flow to speak for it.
How does KlyoChat fit an order status flow?
We build KlyoChat, so here is the honest version of where it helps with an order status flow and where it does not. KlyoChat is an AI-native unified inbox that includes WhatsApp alongside Instagram, Facebook, Telegram, TikTok, and X, with a no-code flow builder and AI agents on top. For a WISMO build, the relevant pieces are the no-code flows that handle the lookup and escalation logic, the AI agents that can answer follow-up questions in plain language, and the integrations that bring order data in.
The part that matters most for this build: the order and tracking data has to come from somewhere. KlyoChat connects to Shopify and WooCommerce directly, and offers API and webhook access for everything else — and those capabilities are on the Business plan at $129/month. The lower plans (Basic at $19, Pro at $49, or $39 billed yearly) are excellent for social DM automation and AI replies, but they do not include the store integrations or webhooks an order status flow depends on. If your orders live on Shopify or Woo, or you can push events via webhook, the Business plan gives you what you need; if not, the flow has no data to read.
- Honest limit: order status flows need order data via integration or webhook, which is the Business plan ($129/mo). Plan for that before you start.
- Honest limit: KlyoChat is not a shipping carrier — it reads and relays the status your store or carrier provides; it does not generate tracking itself.
- Honest limit: out-of-window WhatsApp updates need approved templates and Meta's per-conversation fees apply, the same as on any platform.
- Honest limit: KlyoChat has no native SMS or email, so if you want order updates on those channels too, you will need another tool.
- Honest limit: KlyoChat is newer with a smaller community than the largest incumbents, so there are fewer third-party templates to copy from.
- Every plan starts with a 7-day free trial, no credit card — enough to build and test the flow logic before committing to the Business plan for live data.
Try the build, then decide on the data plan
You can design and test the flow logic on the trial. The decision point is the data: once you confirm the lookup and escalation work the way you want, the Business plan is what unlocks the live Shopify/Woo or webhook connection that makes it real. Build first, then commit.
What you would use on KlyoChat
- Unified inbox
- WhatsApp plus other channels in one place, so escalations land where your team already works
- No-code flows
- Build the lookup, status mapping, and escalation logic without writing code
- AI agents
- Answer free-text follow-ups (when, where, can I change the address) inside the thread
- Integrations (Business)
- Shopify/WooCommerce + API/webhooks to feed live order and tracking data
An order status flow in WhatsApp is one of the highest-leverage automations an e-commerce team can build, because it attacks the single most repetitive question in the inbox — where is my order — at the exact place customers want to ask it. Start with the reactive self-serve lookup, since it is cheap and lives inside WhatsApp's free window, then layer on proactive shipping updates once your data plumbing is in place. Map every order state to a clear, specific message, handle exceptions with honesty and a fast route to a human, and verify identity before revealing anything.
The two things to plan for from the start are the data and the templates. The flow is only as good as the order data it can see, which means a store integration or webhook, and proactive out-of-window updates need approved templates with Meta's per-conversation fees on top. Build the logic on a trial, test every status and exception path, then connect live data and soft-launch to a slice of orders before going wide. For the channel itself, our guides on back-in-stock alerts, the post-purchase sequence, and the broader e-commerce support chatbot cover the flows that sit naturally alongside this one.



