automations.help

Order & fulfillment ops

Notify customers automatically about fulfillment delays

An order that's paid but hasn't shipped past your promised window is a complaint waiting to happen. Here's how to catch those orders on a schedule, confirm they really are stuck, and fire a proactive Klaviyo heads-up with a real new ETA — before the customer has to ask.

Difficulty
Intermediate
Time to build
3-5 hrs
Updated
  • Shopify
  • Klaviyo
  • ShipBob

The manual way today

Someone scans the open orders every couple of days, eyeballs which ones are still unfulfilled past when they should've shipped, cross-checks the 3PL to see if a label exists yet, and then — maybe — emails each customer by hand to apologize and give a new estimate. In practice that last step gets skipped when it's busy, which is exactly when orders run late.

The customer finds out the order is late before you tell them, so the first you hear of it is a 'where's my order?' ticket — often an annoyed one, sometimes a chargeback threat. A delay you got ahead of is a forgivable apology; a delay the customer discovers on their own reads as silence. The reactive tickets, the refunds you give to calm people down, and the reviews mentioning slow shipping all trace back to nobody watching the ship window.

What running looks like

A scheduled sweep finds orders that are paid, still unfulfilled, and past your ship window, confirms with the 3PL that no label exists yet, and fires a Klaviyo event that sends the customer an honest 'your order is running late, here's the new estimate' message — once per order, before they open a ticket. Orders that are stuck well beyond the threshold get escalated to a human in Slack instead of just another email.

01The build

How to build it

  1. Define what 'late' actually means for your store

    Needs a human

    Pin down the ship window before you automate anything: how many business days a paid order has to ship before it counts as late (say 2), and a second, harder threshold (say 5) that means something's genuinely wrong. Write down what's excluded — preorders, backorders, made-to-order items, wholesale. This is the one judgment call a person makes up front; everything after it runs on its own.

  2. Run a scheduled sweep for paid-but-unshipped orders

    Runs itself

    Point an n8n schedule node at a daily (or twice-daily) run. Query the Shopify Admin API for orders where financial_status is paid, fulfillment_status is unfulfilled or partial, and created_at is older than your ship-window cutoff. Skip cancelled orders. Use business days, not calendar days, so a Saturday order placed Friday night isn't flagged Monday morning as two days late.

  3. Confirm it really hasn't shipped (cross-check ShipBob)

    Runs itself

    Before you tell anyone their order is late, ask the 3PL. Look the order up in ShipBob by the reference ID you set at order creation and check whether a label already exists. Shopify can lag a shipment by a few minutes; ShipBob knows the truth. If a label's there, the order isn't late — it's a sync gap, so skip it and let your tracking-sync flow catch up.

  4. Filter out the orders that shouldn't get a delay email

    Runs itself

    Drop anything that's late on purpose or already handled: orders tagged preorder or backorder, made-to-order SKUs, wholesale orders on a separate queue, and any order you've already notified. Honoring the exclusions from step one here is what keeps a preorder customer who was told 'ships in 6 weeks' from getting an apology for working exactly as promised.

  5. Tag the order so it's only notified once

    Runs itself

    Write a tag like delay-notified plus the date onto the Shopify order the moment you decide to message about it. That tag is your idempotency key: the next sweep sees it and skips the order, so a customer never gets the same delay apology twice. Dedupe on the tag, not on the email send, so a re-run of the flow can't double-fire.

  6. Fire a Klaviyo delay event with a real new ETA

    Runs itself

    Send a 'Fulfillment Delayed' event to Klaviyo with the customer's profile and the order's properties — order number, items, the original estimate, and a realistic revised ship date pulled from your current 3PL lead time (not a vague 'soon'). A Klaviyo flow triggered on that event sends the email or SMS. Let Klaviyo own the message so it respects consent, quiet hours, and unsubscribes instead of you blasting a raw API send.

  7. Escalate the genuinely stuck orders to a human

    Needs a human

    An order past the second threshold from step one isn't an apology email problem — it's an operations problem. Post those to a Slack channel with the order, how many days late it is, and the 3PL status, so a person can decide whether to expedite, offer a discount, or refund. Don't let an automation keep emailing 'sorry, still working on it' to someone whose order has been stuck for a week.

  8. Clear the flag when the order finally ships

    Runs itself

    When the order does ship, remove the delay-notified tag (your tracking-sync flow or the ShipBob shipment event is the natural trigger). That keeps your 'late orders' reporting honest, stops a returning customer's old tag from confusing a future sweep, and means the tag genuinely reflects orders that are late right now.

02The stack

What it’s built on

Shopify
System of record for the order: where you read paid-but-unfulfilled orders and their ages, and where you write the delay-notified tag that keeps the notification to exactly one per order.
Klaviyo
Owns the customer message. The delay event triggers a flow that sends the email or SMS while respecting consent, quiet hours, and unsubscribes — so you're not sending raw, unmanaged blasts.Klaviyo's free tier covers a small list and is plenty to build and test this on. You likely already run it for email — if not, any ESP that accepts a custom event and triggers a flow works the same way; only the API shape changes.
ShipBob
The 3PL truth check. Before flagging an order as late, you confirm against ShipBob that no label exists yet, so a Shopify sync lag doesn't make you apologize for an order that already shipped.Any 3PL with a shipments or orders API does this job — the cross-check is the point, not the brand. If you fulfill in-house, swap this step for a look at whether a Shopify fulfillment or label has been created.
n8n
The glue: runs the schedule, queries Shopify, cross-checks ShipBob, applies the filters, tags the order, fires the Klaviyo event, and posts escalations to Slack.n8n is open-source and self-hostable for free; their cloud tier just saves you running it yourself.
Slack
Where orders past the hard threshold get escalated for a human to expedite, discount, or refund.

03Questions

Before you build

Won't this email a customer whose order actually just shipped?

That's exactly what the ShipBob cross-check prevents. Before any message goes out, the flow confirms with the 3PL that no label exists yet. If a shipment is already there, the order isn't late — it's a sync gap — so it's skipped. You only apologize for orders that are genuinely stuck.

How do I avoid notifying the same customer twice?

The flow writes a delay-notified tag onto the Shopify order the moment it decides to message, and every later sweep skips tagged orders. Dedupe is on the tag, not the email send, so even a re-run of the whole flow can't fire a second apology.

What do I put as the new ETA — won't a wrong date make it worse?

Pull the revised ship date from your current 3PL lead time rather than guessing, and give yourself buffer. A specific, slightly conservative estimate you then beat reads far better than a vague 'soon' or an optimistic date you miss again. If you genuinely don't know, that's the case worth escalating to a human instead of auto-sending.

Will this catch preorders and backorders that are late on purpose?

No — as long as you tag them. The filter step drops preorder, backorder, made-to-order, and wholesale orders so a customer who was told 'ships in six weeks' never gets an apology for the order working exactly as promised. The exclusions you set up front are what keep it honest.

Email or SMS for the delay heads-up?

Whichever the customer consented to. Because the message runs through a Klaviyo flow, it respects each profile's consent and channel preferences automatically. Many stores lead with email and add SMS only for orders past the harder threshold, where a faster nudge is worth it.

Can I build this myself, or should you build it?

Every trigger, field, and threshold is spelled out above, so if you've got API comfort and a few spare hours, wire it up yourself. If you'd rather not own the edge cases and the debugging, we'll build it on the Shopify, Klaviyo, and ShipBob accounts you already pay for, document it, and hand you the keys — you own the workflow outright, with no monthly retainer. It starts with a free 20-minute teardown, not a contract.

Support & returns

Auto-draft Gorgias replies to 'where is my order' tickets

'Where is my order?' is the most common ticket in DTC support, and almost every answer is the same lookup: find the order, find the tracking, paste it back. This watches Gorgias for WISMO tickets, pulls the live fulfillment status from Shopify (and ShipBob when Shopify's tracking is stale), and writes a ready-to-send draft into the ticket — your agent reviews, tweaks if needed, and hits send. It never auto-sends, and the messy cases (no order, delivered-but-missing) get flagged to a human instead of a canned reply. Build it yourself with the steps below — or we build it, wire in the guardrails, and hand it over so you own it outright with no monthly fee. Free teardown of your current setup first.

  • Gorgias
  • Shopify
  • ShipBob

Intermediate4-7 hrs

Support & returns

Auto-escalate angry support tickets to Slack

A customer threatening a chargeback at 9am shouldn't be discovered at 2pm. This watches every inbound Gorgias ticket, decides which ones are actually angry — not just mildly annoyed — and drops a Slack alert with the message, the customer's history, and a one-click link into the ticket, so the right person sees it in seconds instead of when the queue gets around to it. Build it yourself with the steps below — or we build it, tune the noise out, and hand it over so you own it outright with no monthly fee. Free teardown of your current setup first.

  • Gorgias
  • Slack

Intermediate2-4 hrs

Order & fulfillment ops

Auto-cancel and refund orders unfulfilled after 14 days

Some orders are never going to ship — the item's gone, the supplier fell through, the address was bad. They sit open, tying up cash and phantom inventory while the customer waits. This finds them past your cutoff, refunds the Stripe charge, restocks the units, and emails a clear explanation — with guardrails so it never touches an order that's mid-fulfillment. Build it yourself with the steps below — or we build it, wire in the safeguards, and hand it over so you own it outright with no monthly fee. Free teardown of your current setup first.

  • Shopify
  • Stripe

Intermediate3-6 hrs