WooCommerce auto-cancel: turn that "reply YES within 12 hours" promise into a real flow

For two years your default WC email said "reply YES within 12 hours, unconfirmed orders cancelled automatically." There was no flow behind it. Now there is. Off by default — opt in once you're sure.

·5 min read

The promise that was never real

Every WooCommerce store using the default email templates — or a Fone Pro Pro flow, or any of the half-dozen popular WC notification plugins — has been sending some variant of this sentence for years:

“Please confirm your order by replying YES within 12 hours. Unconfirmed orders will be cancelled automatically.”

The problem: nothing was actually listening for that YES. The promise was a copy-paste relic from a real-world workflow that ran in someone's WhatsApp inbox manually, then got templated into the store, then got forgotten. The cancellation didn't happen automatically — or it happened on a different timer, or by hand — and customers who replied YES got crickets.

If your store is COD-heavy, drop-shipping, or sells anything that ships before payment lands, you already know the cost of orders that sit in pending for days while you chase the customer or eat the inventory. We just turned the broken promise into a real flow.

How the YES / NO / silence flow works

A customer places an order on your WC store. Within seconds Botline sends a WhatsApp message to the phone on the order:

“Hi Sarah — we just received order #1247 (Rs. 8,400). Please reply YES to confirm or NO to cancel. Unconfirmed orders are cancelled automatically after 12 hours.”

Three branches:

  • Customer replies YES (or Y, CONFIRM, 👍, haan) — the WC order flips from pending to processing, the AI sends a thank-you, and your fulfilment / accounting / inventory plugins all see a normal order moving through the pipeline.
  • Customer replies NO (or N, CANCEL, 👎, nahi) — the WC order is cancelled with reason “Customer declined via WhatsApp”, the AI acknowledges, and the customer is offered to start a new order if they change their mind.
  • Customer ignores it — at the cutoff (12h / 24h / 48h depending on your setting), a 5-minute cron sweep cancels the WC order with reason “Auto-cancelled — no customer confirmation.” and sends a final apology on WhatsApp: “your order was cancelled because we didn't hear from you — reply here anytime to start over.”

The matcher recognises YES / NO / Y / N / CONFIRM / CANCEL, the thumbs emojis, and Roman Urdu (haan / nahi) on the same shape we built for booking confirmations earlier this year. Idempotent — double-tapping YES doesn't double-flip the order — and race-aware: if the cron and a late YES land in the same five-second window, the YES wins.

How to enable it

Open Dashboard → Integrations and find the WooCommerce card. Below the Connection / Catalog / Webhooks rows you'll see a new Auto-cancel unconfirmed orders section. Pick one of:

  • Off — the default. Botline sends the YES/NO confirmation but never auto-cancels. Useful if you want the conversational confirmation but plan to chase pending orders manually.
  • 12 hours — matches the default WC email copy. Aggressive; good for COD with same-day dispatch.
  • 24 hours — the safe middle. Most stores land here.
  • 48 hours — gentle. Good for international customers across timezones.
  • Custom — any value 1-168 hours (one week max). Pick whatever matches your real fulfilment SLA.

The dropdown stores as tenants.wc_auto_cancel_unconfirmed_hours in our DB — NULL by default for every tenant, new and existing. There is no silent migration that turns this on; you have to opt in explicitly.

Why default OFF, and read this paragraph

This feature is OFF by default and we want it to stay OFF until you have read this paragraph and made an informed call. Reason: an automatic WC order cancellation is visible to every other plugin in your stack. That includes:

  • Inventory plugins that decrement stock on order-placed and re-credit on order-cancelled. Most handle this correctly. A handful do not (they re-credit twice, or not at all, depending on whether the cancellation came from the admin UI vs the REST API). Test once.
  • Fulfilment / shipping plugins (Shipway, ShipRocket, Easyship, Aftership) that may have already created a shipment label for a pending order. Auto-cancellation on the WC side does not auto-cancel the shipping label.
  • Accounting plugins (Zoho, QuickBooks, Xero connectors) that fire an invoice on order-cancelled. If your accounting workflow assumes humans cancel orders, you may end up with a flurry of negative invoices.
  • Refund automation plugins — if Stripe / Razorpay captured payment on a pending order (rare but possible with certain payment gateways), an auto-cancel may trigger an automatic refund. Probably what you want, but check.

None of this is exotic; most stores will be fine with all of it on the first try. But the cost of a wrong assumption is your inventory or your finance ledger getting confused, so we ship it OFF and we ask you to opt in once you've flipped it on a test order on a Monday morning and watched the rest of the stack behave.

If you do see a plugin misbehave, switch back to Off and the YES/NO confirmation still runs — you just lose the auto-cancel timer. The conversational layer is independent.

What the AI does while the order is pending

While a WC order is in pending_confirmation, the AI's system prompt gets a soft scope-fence overlay that nudges every reply back toward resolving the YES/NO. If the customer asks an off-topic question (“hey, do you also sell X?”) the AI answers briefly and then circles back: “...by the way, your order #1247 still needs a YES to confirm or NO to cancel.” If the customer asks a direct question about the pending order (price, items, address), the AI answers from the WC order data and re-prompts.

It's a soft fence, not a hard block. The AI will not refuse off-topic conversation, and a customer who wants to chat about a different product can. But the gentle nudge meaningfully lifts confirmation rates — in our internal testing roughly 12-18% of orders that would have aged out to silence get a YES once the AI follows up two messages later.

The fence is automatic. There's no toggle, no setting; if a customer has a pending WC order, the overlay is in their AI prompt. As soon as the order resolves (YES, NO, or auto-cancel), the overlay drops and the AI is back to its normal scope.

What it costs

Auto-cancel + YES/NO confirmation is included in every paid plan at no upcharge from Botline. The Free tier doesn't have WooCommerce integration, so this only matters on Starter, Pro, and Enterprise.

The WhatsApp messages the flow sends — the initial YES/NO prompt and the apology-after-cancel — count against your tenant's normal WhatsApp Cloud-API conversation costs (paid directly to Meta, not to Botline). For a typical 100-orders-per-day store this is negligible: roughly $1-2/day extra in conversation fees, which the typical store earns back in the first two cancelled-but-now-recovered orders per week.

Per-corridor pricing varies; the live Meta pricing schedule has the current rates.

Operational details

  • Cron cadence: the auto-cancel sweep runs every 5 minutes, so the actual cancellation lands within 5 minutes of your configured cutoff (e.g. set to 12h, expect cancellation between 12h00 and 12h05 from order time).
  • Cancellation reason: locked at “Auto-cancelled — no customer confirmation.” — visible in the WC admin order notes and on the cancelled-orders email any of your other plugins might fire.
  • Race-safety: the cron and the YES/NO handler share a row-level lock on the woocommerce_orders.pending_confirmation_expires_at column. A late YES that lands during the cron's 5-second window wins; the cron sees the order has already moved out of pending and skips.
  • If the customer's phone has no WhatsApp: the initial confirmation message fails delivery (Botline logs it), the auto-cancel timer still runs, and the apology message also fails silently. You won't spam non-WhatsApp customers with retries.
  • Manual override: if you confirm an order in the WC admin while it's still in pending_confirmation, the next webhook tick clears the pending flag and the cron stops watching. The customer's subsequent YES still gets a thank-you reply — we don't want to make the customer feel ignored.

When to leave it Off

Three honest cases where Off is the right answer:

  1. You sell digital goods that fulfil instantly on payment. Auto-cancel doesn't apply to processing orders, but if your gateway flips orders straight from pending to processing on capture, you'll never see the pending window anyway.
  2. You have a high-touch sales process where a human on your team always calls / WhatsApps the customer to confirm. The YES/NO automation steps on your humans' toes.
  3. Your WC stack has a plugin you don't fully trust on order-cancelled. Until you've audited that plugin's cancellation behaviour, leave the timer off. Use the YES/NO conversational layer for visibility and chase manually.

For everyone else — especially COD, drop-shipping, and warehouse-fulfilment stores — flip it to 24h, watch one week of orders, and adjust from there.

Questions or weird behaviour

Email support@botline.cc or WhatsApp +92 322 4031899 — we read every message. The order-confirmation flow has been live in our own WC test stores for three weeks before this launch; we've seen most of the edge cases, but if you've got a plugin combination we haven't, we want to know.

Open Integrations → WooCommerce and pick a window. Two minutes of setup, recovers the broken promise that was sitting in your customer emails the whole time.

Ready to automate your WhatsApp?