WapifyDocs

COD Confirmation

Confirm cash-on-delivery orders on WhatsApp before you ship — with reminders, order tags, risk levels and a support button.

Event → order tag → risk
🛒 New COD order⚠️ COD UnconfirmedHigh
✅ Confirms✅ COD ConfirmedLow
❌ Cancels❌ COD Cancelled—

One message, two buttons — and the Shopify order updates itself from whatever the customer taps. No setup needed for the tagging.

FreeBasicGrowthProIncluded on every plan. Follow-up reminders need Growth or above.

This is the automation most stores install Wapify for. Cash-on-delivery orders are placed with nothing at stake, so a meaningful share of them are never going to be accepted at the door — and every one you ship blind costs you the courier fee both ways. Asking the customer to confirm on WhatsApp before you ship turns that guesswork into a yes or a no.

What fires it

A new order whose payment method is cash on delivery. Wapify matches the order's payment gateway against the usual COD names — cash_on_delivery, cod, cash, pay_on_delivery, cash-on-delivery, الدفع_عند_الاستلام — case-insensitively. If your store uses a custom gateway name, set the COD gateway override so it's recognised.

Each order gets exactly one confirmation, and it's sent once — reopening or editing the order doesn't re-send it.

Orders it never sends for

Two kinds of order are always skipped, and there's no setting for either. Draft orders are built by hand in Shopify admin, which means you've already spoken to the customer — that conversation is the confirmation, and asking again by message reads as though you weren't listening. Point-of-sale orders were sold face to face.

Want a message for those anyway? Thank You covers draft and point-of-sale orders with a thank-you rather than a confirmation request. And you can always send a confirmation by hand from the Orders page or your Inbox — skipping only applies to the automation firing on its own.

When to send

By default the message goes out immediately. You can hold it for up to 12 hours, in one-hour steps.

When to send
How long to wait after the order is placed before the confirmation goes out.
Immediately1h2h3h6h12h

Immediately is right for most stores — the customer just checked out, so the message arrives while the order is still on their mind. A delay is useful if you batch-process orders, or if you want a chance to catch obvious mistakes before the customer is asked to commit.

COD Confirmation is deliberately exempt from quiet hours. It's the one message that directly answers something the customer just did, and holding a 3am order until 11am leaves it unshipped for hours. Its reminder, on the other hand, does observe quiet hours — nobody needs chasing at 5am.

What the message says

The confirmation lists what the customer needs to check before the courier arrives: the delivery address, the number of items, and the total to have ready. Three things are bolded and no more — the address, the amount, and the inspection policy — because those are the three that cause a delivery to be refused at the door.

Product inspection on delivery

A checkbox that swaps one bolded sentence. The help text under it quotes the exact wording that will be sent, in the language it will be sent in, so you're never guessing.

Checked (default)✅ You can inspect the product upon delivery.
✅ تقدر تعاين المنتج عند الاستلام.
Unchecked🚫 To protect the product, the parcel can't be opened at delivery.
🚫 حفاظًا على المنتج، غير مسموح بفتح الشحنة أثناء الاستلام.

Set it to whatever your couriers actually do. This is the sentence the customer will quote back at the door, and a mismatch between it and reality is how a delivery turns into an argument. The unchecked wording gives the reason before the rule on purpose — "not available" is a refusal with nothing behind it, and the customer is being asked to accept it while holding their own parcel.

Mention your return policy

Off by default, because it's a promise to the customer and shouldn't be something you make by not looking. Switch it on and the message carries one extra line:

The line adapts to what you allow and for how long — in both languages, with correct Arabic number agreement.

Switch it on and pick which promise the line makes:

Customers can return or exchangeThen Customers can — return, exchange, or both — and Within: 1, 2, 7, 14 or 30 days (14 by default).
No returns or exchanges🔄 This order can't be returned or exchanged after delivery.
🔄 لا يوجد استرجاع أو استبدال بعد الاستلام.

If you take no returns, saying so here is worth more than saying it at the door. On cash on delivery, a customer who discovers it after paying refuses the parcel — and you pay for the round trip. In the confirmation, it's a term they agreed to before the courier moved.

Picking neither action under "Customers can" is the same as switching the whole thing off — it is not read as refusing returns, which is the separate choice above. Wapify says so rather than letting you think a line is going out that isn't.

Order tags and risk levels

Every customer response writes back to the Shopify order automatically. There is nothing to set up for this part.

EventOrder tagRisk level
🛒 New COD order placed⚠️ COD UnconfirmedHigh Risk, after your chosen window
✅ Customer confirms✅ COD ConfirmedLow Risk
❌ Customer cancels❌ COD Cancelled—

Tags are swapped, not stacked. When a customer confirms, the ⚠️ COD Unconfirmed tag is removed and ✅ COD Confirmed takes its place — an order never carries two contradictory tags, and a customer who changes their mind updates the order correctly. That makes the tags reliable enough to filter and to build Shopify automations on.

Cancelling in WhatsApp tags the order. It never cancels it in Shopify. Cancelling an order is irreversible and touches inventory and payments, so it stays a human decision. Filter your orders by ❌ COD Cancelled and cancel them yourself when you're ready.

Update order risk levels

A switch inside the same card, on by default. With it on, Wapify also writes Shopify's own risk assessment: confirmed orders become Low Risk, and orders still unanswered after your chosen Timeframe become High Risk. The window runs from 1 to 72 hours, 24 by default.

An unanswered order keeps its ⚠️ COD Unconfirmed tag the whole time — only the risk level changes, and only once the window has actually passed.

What a Confirm tap can chain into

The customer's Confirm tap isn't only a tag. Two other things can hang off it:

  • InstaPay deposit — Egyptian stores can ask the customer to transfer part of the order the moment they confirm. It fires on the tap rather than on the order, so with this automation off it never fires on its own.
  • Upsell — COD order confirmed is one of its send triggers.

Follow-up reminder

GrowthProOn lower plans the card is locked and reads as off, and the preview drops the second bubble.

Most people who don't answer aren't refusing — they missed the message. The reminder sends a second, shorter message to anyone who hasn't tapped a button, between 1 and 48 hours after the first (4 hours by default).

The reminder spells out the consequence — the order stays unshipped — because that's what makes tapping a button feel necessary.

It's sent once. A customer who ignores both is left alone.

Ask for a detailed address

COD orders arrive with the address the customer typed in a hurry, and a courier can't deliver to “Maadi”. Switch this on and Wapify checks the street address on every COD order. When it's shorter than the number of characters you set, a second message goes out right behind the confirmation asking for the full one.

The address you already have is quoted back. A customer who reads their own half-written address understands in one glance why they're being asked again.

The button opens a short form inside WhatsApp. When they send it, the new address replaces the street address on the Shopify order, the order is tagged 📍 Address Updated, and a note records what it said before — so an order you've already looked at tells you that it moved.

What gets measured

Only the street address — the first address line. Not the apartment or floor line, not the city, the governorate or the country, and the reply replaces only that same line. Everything else the customer entered at checkout, including their phone number, is left exactly as it was.

That matters when you pick your threshold: you'll be looking at a full address in Shopify, but the count only covers the street. Twenty characters is the default and is roughly “15 Road 9, Maadi”. An order with no street address at all is always asked.

It's asked once per order, and it counts as one message from your plan's allowance. An order you've already shipped or cancelled is never asked.

Additional Information

Add your own paragraph to the end of the confirmation, a support button, or both. Because this changes the message body, it creates a custom template that belongs to your store and goes to Meta for review.

  • Additional message — separate English and Arabic boxes, so each customer reads it in their own language. Appended to the end of the confirmation. Leave one blank to skip it for that language.
  • Support phone number — include the country code. Leave blank to skip the button.
  • Button type — Phone Call opens the dialpad, WhatsApp opens a WhatsApp conversation with that number.

Press Submit for Review and Meta reviews it like any other template. Statuses shown on the card:

Under Meta reviewAwaiting approval. COD messages keep going out on the standard template in the meantime — nothing pauses.
ActiveApproved and live. The preview is marked Custom · Active. Edit and resubmit to change it.
Rejected by MetaUpdate the wording and resubmit. See why Meta rejects templates.

The custom template bakes in your package-inspection and return-policy choices as fixed text. If you change either setting afterwards, resubmit the template so the new wording reaches Meta — a banner on the card reminds you.

While a custom template is awaiting approval, the COD automation can't be switched off and on again — the toggle is held until Meta responds.

Customer acceptance rate

Some customers accept nearly everything they order. Others refuse routinely, and they do it at every store, not just yours. Wapify can note which kind you're dealing with directly on the order.

Delivery historyOrder noteOrder tag
80% or more delivered✅ High acceptance✅ High Acceptance
60–80% delivered⚠️ Medium acceptance⚠️ Medium Acceptance
Below 60% delivered🚫 Low acceptance🚫 Low Acceptance
Refused a delivery from your storeThe refused orders are named⛔ Failed Delivery History

The note and the tag are two separate tick-boxes, and you can use either or both. They say different things on purpose. The tag carries the verdict to the Orders list, where you can filter, sort, bulk-select and build Shopify Flow automations on it. The note carries the numbers behind that verdict, in plain sentences, where you'll read them with the order open:

The note as it appears on the order. It follows your admin language, and it never just repeats the tag.

⛔ Failed Delivery History is not a fourth rating — it's added on top of whichever of the three the rate produced, for anyone who has ever refused a delivery from your store. Nine accepted deliveries and one refused is still ✅ High Acceptance, and it's still true that this customer once cost you a round trip. Only your own store's results can raise it; other stores' outcomes stay inside the rate.

The rate is built from what couriers actually report — delivered or failed — over a rolling 12-month window. It counts from the customer's first delivery with your store, or from three deliveries across all stores using the app, and the note names the orders they refused from you. Wapify always uses the less flattering of the two: a customer who refused the one delivery you ever sent them is 100% failed for you, whatever other stores saw.

How to switch it on

Tick Note acceptance rate, Tag the order, or both, in the Customer Acceptance Rate card. Both are off by default — nothing is written to your orders until you ask for it. They stay disabled until Wapify has finished syncing your store's own delivery history, which takes a few minutes after install.

Tag values are always in English, on every store, even when you use Wapify in Arabic: a saved search or a Flow trigger built on 🚫 Low Acceptance has to keep matching when you switch the admin language. The note is the half that follows your language.

It writes a note, never a risk assessment. Shopify's risk assessments accumulate rather than replace, and the COD flow already writes risk on the same order — scoring here too would leave orders carrying two contradictory levels. A note is unambiguous and sits where you'll read it.

Privacy

Delivery outcomes are stored against a one-way cryptographic hash of the phone number — never the number itself, never a name, never an order. Scores can't be reversed into a customer list, and the ledger is disclosed in Wapify's privacy policy. Every store contributes outcomes; what the checkbox controls is only whether the result is written onto your orders.

Duplicate orders

A customer who isn't sure their order went through orders again. Two identical parcels go to the same address, the customer takes one, and you pay for the round trip on the other — the same money a refused delivery costs, for an entirely avoidable reason. Shopify shows the two orders as unrelated rows, minutes or days apart.

With Flag duplicate orders ticked, Wapify checks each new order against that customer's last 30 days and flags it when all three of these hold:

  • Same customer — matched on the phone number the order carries, so guest COD orders count too.
  • Same items — the whole basket, not an overlap. Someone who added a second product is shopping, not double-ordering, and isn't flagged.
  • The earlier order hasn't shipped — checked against Shopify at that moment, not from a cached copy. Once a parcel is with the courier there's nothing left to stop, so the order isn't flagged.
SituationOrder noteOrder tag
Same items as an earlier order that hasn't shipped🔁 Possible duplicate order🔁 Duplicate Order

The note names the earlier order, so you can open it and decide. If the quantities differ between the two, it says so — don't assume the parcels are twins.

Nothing is cancelled, merged or changed. Two identical orders are sometimes genuinely two orders — the same gift for two people. Wapify tells you; you decide.

Where the results show up

  • Shopify orders — tags, risk level, acceptance notes and duplicate flags, filterable in your admin.
  • Logs → COD Confirmation — every message with its status and what the customer answered.
  • Analytics — confirmation rate, COD value confirmed, how fast customers answer, and the order funnel.
  • Feedback Center — the reasons customers gave when they tapped Cancel.
  • Inbox — anyone who replied with words instead of a button.

Sending one by hand

Select orders in Shopify, open the ⋯ menu and choose Send order confirmation. A manual send skips the configured delay and ignores quiet hours, and by default won't message someone who already received one. See Actions on the Orders page.