AI for shipping delay notifications: what to send, when, and what the law asks for

Rama Adi
Written by

Rama Adi

Katelin Teen
Reviewed by

Katelin Teen

Last edited October 30, 2026

Expert Verified
Hand-drawn customer reading a phone message about a late parcel, with a friendly AI helper waving and a box travelling along a dotted route to a map pin
TL;DR

AI for shipping delay notifications works when it treats "delayed" as two different problems. An order that hasn't left your warehouse (including one stuck on "label created") needs a message with a new date and a free way to cancel, and in the US the FTC's Mail Order Rule requires exactly that, with penalties up to $53,088 per violation. An order that has shipped and is running late needs the last real carrier scan and the carrier's own new date, never a date the AI made up.

The trigger is not "the carrier posted an exception." It is "the new date is later than what we promised." Send one message when that flips, stay quiet when it doesn't, and hand anything with no scan for days, no date, or a lost or damaged parcel to a person.

eesel does this as an AI teammate in your helpdesk: it reads the Shopify order and the AfterShip scan, can be woken by a delay webhook, and holds cancels and refunds for approval. Question Beauty runs it on Gorgias, where it looked up 290 Shopify orders in a month before answering delivery questions and closed 280 tickets without a person.

Why do shipping delays flood the support inbox?

Because the customer learns about it from silence. They check the tracking link, it says the same thing as yesterday, and they write in, then they write in again.

Reddit

"where is my order" emails, easily. a package sits on "label created" for 3 days and i've got the same customer in my inbox twice asking if we scammed them, and nothing i've tried has really fixed it

I build integrations at eesel, which means I spend a lot of time in the plumbing between a store, a carrier feed and a helpdesk. The pattern I see over and over is that teams automate the answer to "where is my order" (WISMO) and leave the delay itself unannounced. The reply bot gets faster, but the inbox stays full, because every late parcel still produce at least one ticket.

A merchant who switched to proactive messages put it well:

Reddit

"The other thing that helped was sending a proactive "your order is running late" email when tracking shows a delay. Customers don't get mad about delays as much as they get mad about not knowing."

So the job for AI here is two-sided. Send the delay message before the customer has to ask, and answer the tickets that come in anyway with the same facts. The rest of this post is about getting the first half right, since that is where most setups go wrong. For the reply side on its own, my posts on AI for order tracking support and automating order tracking go deeper.

What are the two kinds of shipping delay?

There are two, and they each need a different message. "Delayed" covers both an order that has not shipped yet and a parcel that shipped and is now late in the carrier network. Most delay automations treat them as one, which is how you end up telling a customer "your package is on its way!" about a box that is still on your shelf.

Hand-drawn split: on the left a box on a warehouse shelf titled not shipped yet, with label created, backorder and stuck in the warehouse, and a note saying offer a new date plus free cancel; on the right a delivery truck under a storm cloud titled shipped, running late, with weather, customs hold and carrier backlog, and a note saying share the scan, never guess a date
Hand-drawn split: on the left a box on a warehouse shelf titled not shipped yet, with label created, backorder and stuck in the warehouse, and a note saying offer a new date plus free cancel; on the right a delivery truck under a storm cloud titled shipped, running late, with weather, customs hold and carrier backlog, and a note saying share the scan, never guess a date
Not shipped yetShipped, running late
What it looks likeBackorder, warehouse backlog, "label created" with no carrier scanCarrier exception, missed delivery date, no new scans
Whose problem it isYoursThe carrier's, but the customer still blames you
Rules that apply (US)FTC Mail Order Rule: delay notice with a cancel optionNone on the shipping side; your own promise and policies
What the message must containNew ship date or "we don't know yet", a full-refund cancel option, a free way to cancelLast real scan, the carrier's new estimate if any, what happens next
Actions the AI may needCancel order, refund (with approval)Look up tracking, open a carrier claim ticket, tag for a person

The line between the two is sharper than it looks. The FTC's rule text defines shipment as "the act by which the merchandise is physically placed in the possession of the carrier." A printed label is not that. AfterShip even gives it its own status, Pending_003, described as processed and packaged "but not scanned at a shipping location yet." "Label created" is an unshipped order, and your AI should treat it as one.

What does the law say about shipping delay notifications?

In the US, a delay notice is not a courtesy for unshipped orders. It is required. The FTC's Mail, Internet, or Telephone Order Merchandise Rule (business guide) applies to most goods ordered online, and it says you must have a reasonable basis for any shipping time you state, or for shipping within 30 days if you state none. When you learn you can't make it, you have to ask the customer to consent to the delay or refund them.

The parts that matter for an AI writing the message:

What the rule saysWhat it means for your delay message
Notify "reasonably quickly," and never later than the promised ship time or day 30The trigger is the moment you know, not the moment the customer complains
The first notice must give a definite revised ship date, or say you can't give oneThe AI can't write "soon." It quotes a date from your system or says it doesn't know
It must say the customer can cancel for a full and prompt refundEvery unshipped-delay message carries a cancel offer
It must give a way to cancel at your expense (toll-free number, website)A link or reply-to-cancel that costs the customer nothing
If the new date is 30 days or less past the original, say that no reply counts as agreeingOne extra sentence, only in this case
If it is more than 30 days, or unknown, explain the reason and say the order cancels automatically if they don't replyThe AI needs the reason, so this case needs a person's input
A second notice can't treat silence as agreementIf you slip again, the order cancels unless the customer says "keep it"
Refunds go out within 7 working days for most payment methods, and can't be swapped for store creditA cancel request is a refund action, not a coupon
Hand-drawn email card titled delay notice with four numbered lines: new ship date or we don't know yet, you can cancel for a full refund, a free way to cancel, and no reply means you'll wait, with an arrow on the last line saying only if the new date is 30 days or less
Hand-drawn email card titled delay notice with four numbered lines: new ship date or we don't know yet, you can cancel for a full refund, a free way to cancel, and no reply means you'll wait, with an arrow on the last line saying only if the new date is 30 days or less

The rule has a few listed exemptions (seeds and plants, subscriptions after the first shipment, and cash-on-delivery orders among them), and it doesn't cover services. Penalties run up to $53,088 per violation.

The UK draws the line in a different place. Section 28 of the Consumer Rights Act 2015 is about delivery, not shipping: unless you agreed a time, goods have to arrive within 30 days. If they don't, and the date was essential, the customer can end the contract; otherwise they can set a new deadline. So for UK customers, the carrier-side delay counts too.

I'm an engineer and not a lawyer, so please treat this as a map, not as legal advice. The practical point still stands: an AI that writes cheerful "slight delay, thanks for your patience!" emails about unshipped orders is missing the two sentences the rule cares about most.

When should AI send a delay notification?

When the new date is later than the date you promised, once. That one sentence replaces most of the threshold tables you'll find in delay guides.

Hand-drawn decision flow: a carrier update arrives and reaches a diamond asking if the new date is later than promised; yes leads to send one delay message, no leads to stay quiet, and no date with no scan for 3 days leads to hand to a person
Hand-drawn decision flow: a carrier update arrives and reaches a diamond asking if the new date is later than promised; yes leads to send one delay message, no leads to stay quiet, and no date with no scan for 3 days leads to hand to a person

Here's why I'd anchor on the promise rather than on the carrier event, because carrier exceptions are noisy. AfterShip's delivery sub-statuses list about 20 kinds of exception, from Exception_017 (extreme weather) and Exception_004 (customs clearance) to Exception_019 (late flight). Plenty of them resolve the same day. A parcel delayed by weather that still arrives inside your promised window doesn't need a message; telling the customer about it just creates a worry and then a ticket.

The reverse also happens: a parcel with no exception at all, just no new scans, can quietly drift past your promised date. So the AI should compare two dates, instead of watching one feed:

  • The promise. The delivery estimate shown at checkout or in the shipping confirmation. It lives in your store or your shipping policy, which is why the AI needs to read your Shopify order, not just the tracking number.
  • The current estimate. The carrier's or tracking platform's revised date. AfterShip fires an "estimated delivery date revised" event and attaches a reason code such as extreme_weather, carrier_processing or customs_clearance.

If the current estimate is later than the promise, send. If there is no current estimate and no scan for three days, don't send a guess; send it to a person. Three days is my rule of thumb, not any standard, so tune it to your carriers.

Two more rules keep it from getting spammy. AfterShip's flow docs say notifications fire "only once as the status of the shipment changes," and your AI should hold the same line: one message per new date, not one per scan. And if the customer already wrote in about this order, reply on that same ticket instead of to start a second thread. My post on AI for ticket deduplication covers the merge side.

Which delay message do I send?

Pick the situation the order is in. The card shows what the message must say and who should send it.

Delay message picker

Where is the order right now?

First delay notice (US: FTC Mail Order Rule)
  • The new ship date from your order system
  • "You can cancel for a full refund"
  • A free way to cancel: a link or a reply
  • "If we don't hear from you, we'll assume you're happy to wait"
If they reply "cancel," the AI cancels the unfulfilled order and refunds it, both held for approval at first.
AI sends, cancel and refund need approval
Delay notice with a reason and an auto-cancel date
  • The new date, or "we can't give a date yet"
  • Why it's delayed (stock, supplier, warehouse)
  • The order cancels and refunds on a set date unless they say "keep it"
  • A free way to cancel now
The reason and the cancel date need a person's input, so the AI drafts and a person approves.
AI drafts, a person approves
Running-late update
  • The last carrier scan, with its time and place
  • The carrier's new estimated date, quoted as theirs
  • What you'll do if it stalls again
  • Any compensation only if your written policy covers it
One message per new date, not one per scan.
AI sends on its own
A person takes it
  • No scan for 3+ days with no new estimate
  • Lost (Exception_013), damaged (Exception_012), returning to sender
  • "Delivered" but the customer says it isn't there
The AI pulls the order and tracking into a note, tags the ticket and sends a holding reply that promises a human, not a date.
AI prepares, a person decides

US rule summary only, not legal advice. UK orders also count delivery within 30 days.

What should an AI-written delay message never do?

Make up a date. This is the failure that turns a delay into a complaint.

Reddit

"Chat bot promised a guitar delivery by tomorrow, and they have not shipped yet. Phone support says they can't do that despite acknowledging the firm commitment promised by the chat bot."

That quote is the whole problem in two sentences, an unshipped order and a confident bot, plus a date nobody gave it. The fix is a rule and not a better model. The AI quotes dates that come from a system (your order record, the carrier's estimate) and says so, and when there is no date it says there is no date.

eesel's own AfterShip integration docs bake this in: the agent treats a scan as "the carrier's version of events, not the parcel's location," reports the latest checkpoint with its time and place, and "never invents a delivery date the carrier did not give." STIL Classics, a planner brand on Gorgias and Shopify, wrote the same thing into its instructions: no invented ship dates, delivery estimates or product specs, and if the order can't be found, flag it for the team instead of telling the customer something.

The other things on my never list:

  • Don't call an unshipped order "on its way." Check fulfillment status first. "Label created" is not on its way.
  • Don't promise compensation the policy doesn't cover. Quote the policy or hand it over. My guide to AI for refund requests covers how to write that policy so an agent can follow it.
  • Don't guess on exceptions. A Shopify merchant's summary of the failure mode is worth pinning above your desk:
Reddit

"Usually the failure mode is not the first reply, it is the edge cases. A bot that answers "where is my order?" fast but confidently guesses on delivery exceptions burns trust."

  • Don't send the same delay twice. One message per new date. Duplicates read like a system that isn't paying attention.
  • Don't treat "delivered" as the end. A "delivered but not here" reply goes to a person, every time. That's a complaint, not a tracking question.

What tools do you need for AI shipping delay notifications?

Three layers, and the AI sits on top of the other two.

LayerWhat it holdsExamplesWhat the AI reads from it
StoreThe order, the promise, fulfillment statusShopify, WooCommerce, BigCommerceWas it fulfilled? What date was promised? Can it still be cancelled?
TrackingCarrier scans, exceptions, revised datesAfterShip, a 3PL or warehouse feedLast scan, exception type, new estimate
Helpdesk + AIThe conversation and the messageGorgias, Zendesk, Freshdesk with an AI agentWrites and sends the message, handles the replies

The store

Your store's own notifications cover events it controls. Shopify's store notifications are triggered by things like order placement, fulfillment and refunds, and they can be customised with Liquid variables. What the store doesn't see is what happens inside the carrier network after fulfillment, which is why the second layer exists. If you're on Shopify, my post on Shopify AI chatbots covers the reply side in the store chat.

The tracking platform

AfterShip is the most common pick for this layer, and its flow builder shows why: there are ready-made triggers for exception, estimated delivery date revised, and estimated delivery date missed.

AfterShip Tracking flow templates page with notification triggers grouped by shipment status, split order summary, estimated delivery date (revised, missed, arriving soon), pre-shipment status and in-store pickup, as taken from AfterShip's help center
AfterShip Tracking flow templates page with notification triggers grouped by shipment status, split order summary, estimated delivery date (revised, missed, arriving soon), pre-shipment status and in-store pickup, as taken from AfterShip's help center

Which triggers you get depends on the plan, per AfterShip's notifications guide and pricing page:

AfterShip Tracking planPriceIncluded shipmentsDelay triggersAPI and webhooks
Free$0See pricing pageNot includedNo
EssentialsFrom $29/month6,000 per year, then $0.08 eachException, info receivedNo
PremiumFrom $59/month6,000 per year, then $0.12 eachAdds estimated delivery date revisedYes, 10 requests per second
EnterpriseContact salesCustomAdds delivery arriving soonYes, custom limit

AfterShip's own flows send templated emails and texts, and they're good at that. Where they stop is the reasoning: comparing the new date with the promise from your store, checking whether the order was ever fulfilled, or reading the customer's last ticket before writing. That's the job for the third layer.

The AI in your helpdesk

This is where the message gets written and the replies get handled. If you're comparing options, my roundups of the best order tracking chatbots and order status chatbots list the field.

Gorgias users can also look at its native setup in my posts on Gorgias AI order tracking and Gorgias delay thresholds.

How do you set up AI shipping delay notifications?

Here's the order I'd do it in. Each step is small, and you can stop after step 4 and already have most of the value.

Step 1: count your delay tickets

Pull last month's WISMO tickets and sort them into the two columns from earlier: not shipped yet, and shipped but late. Most stores I've seen are surprised by how big the first column is. Those are the tickets your warehouse caused, and they're the ones with legal strings attached in the US. If you want a structured way to do this, my post on AI for support reporting has a contact-reason breakdown.

Step 2: write the promise down where the AI can read it

The AI can't compare against a promise it can't see. Put your shipping times in a policy page or a short instructions doc: processing days and carrier windows by region, also what "express" means. Add the compensation policy, if you have one, in the same place, with exact numbers.

Step 3: connect the order and the tracking

Connect the store and the tracking platform to the AI agent so it reads both live. In eesel, the Shopify integration adds actions like Get Order Fulfillment (tracking number, carrier and shipment status), Cancel Order (for orders that haven't been fulfilled) and Refund Order. The AfterShip integration (switched on per workspace on request) adds Get tracking, which reads the carrier, the latest checkpoint, the history and any estimated delivery the carrier gave.

Step 4: wake the agent when a delay happens

Neither Shopify nor AfterShip wakes an AI agent on its own; eesel's docs are upfront that both integrations have no triggers. So you pick one of two patterns:

  • A webhook. Your warehouse system, a Zapier step on an AfterShip event, or your own backend POSTs the delay to an eesel webhook automation. The agent wakes with that data and follows the instructions you wrote for it.
  • A schedule. A morning run that checks open orders against their promised dates and sends what's due. Cape Coffee Beans uses scheduled sweeps for its Zendesk queue: 160 scheduled checks in a month, each ending in a short email to the founder or no email when there's nothing to report.

The webhook route is the one in eesel's own docs, which use a warehouse shipment delay as the worked example. You ask for the webhook in chat and say what to do with each payload:

eesel dashboard chat where the user asks for a webhook URL for warehouse shipment delays, and the agent creates the automation, posts the URL and says it will summarise the delay, cross-reference Shopify orders and flag urgency
eesel dashboard chat where the user asks for a webhook URL for warehouse shipment delays, and the agent creates the automation, posts the URL and says it will summarise the delay, cross-reference Shopify orders and flag urgency

When a delay arrives, the agent checks it against Shopify and acts. In the docs example the order couldn't be matched, so instead of messaging anyone it opened a tagged Gorgias ticket for the team, which is exactly what you want when the data doesn't line up:

Gorgias ticket created by an eesel webhook run titled Shipment Delay Alert, with the shipment ID, carrier, original and new delivery dates, a weather hold reason, a note that the order could not be verified in Shopify, and tags shipment-delay, urgent and warehouse-alert
Gorgias ticket created by an eesel webhook run titled Shipment Delay Alert, with the shipment ID, carrier, original and new delivery dates, a weather hold reason, a note that the order could not be verified in Shopify, and tags shipment-delay, urgent and warehouse-alert

If you'd rather set this up from a terminal or a coding agent, the eesel CLI does the same work: eesel integrations connect aftership prints the connect link, eesel automations lists the webhook automation and whether it's on, and eesel approvals shows anything waiting for a person. Claude Code, Codex or Cursor can drive those commands too, which is handy when the webhook sender is your own backend and the same engineer is wiring both ends.

Step 5: put the risky actions behind approval

Sending a running-late update is low risk. Cancelling and refunding are not. In eesel, every action can run on its own, ask first, or stay off (actions and approvals), and held actions can be approved in the dashboard, in Slack, or with eesel approvals approve <id> in a terminal.

eesel action settings with the Write group set to Custom, showing add tags, assign to team, close ticket and create ticket on Needs approval and leave internal note on Auto
eesel action settings with the Write group set to Custom, showing add tags, assign to team, close ticket and create ticket on Needs approval and leave internal note on Auto

I'd start with cancel and refund on "ask first," then watch a couple of weeks of the decisions, then loosen what's boring. My post on customer support approval workflows goes through how to pick.

Step 6: test it on last month's late orders

Before anything goes to a customer, replay it. Take 20 to 30 late orders from last month, feed each one through, and read every message it would have sent. Check three things: did it pick the right column, did every date come from a system, and did it hold the cases it should have. My guide to AI support simulation testing covers sample sizes for this.

How does this look in a real store?

Three eesel customers handle shipping questions in ways worth borrowing.

Question Beauty sells vegan cosmetics through Shopify and runs support in Gorgias, much of it short messages from social and chat. For a delivery or order question, eesel finds the customer by email, checks the order and its fulfilment status, and answers with the tracking details. If the order is still being processed, or the tracking already answers the question, it says so and closes the ticket. In one month that was 990 Gorgias tickets handled, 290 Shopify orders looked up, and 280 tickets closed without a person.

Rúngne, a Norwegian climbing apparel brand shipping from Norway and a US warehouse, split the work across agents. A draft agent finds the order in Shopify, checks why it hasn't shipped, and leaves a reply for the team as an internal note; a separate helpdesk agent answers "where is my order" and shipping policy questions directly. Across 2,100 Gorgias tickets in a month, that meant 580 drafts for the team and 440 public replies. The "why hasn't it shipped" check is the unshipped column from earlier, done before anyone writes back.

STIL Classics is the one I'd point to for the never-guess rule. Its tickets often involve "a delivery scan that has not moved," and the agent looked up 230 Shopify orders in a month before drafting a single line, with no invented ship dates allowed.

None of these three is a pure "proactive delay email" setup, and I want to be straight about it. They are the reply side done carefully, which is the foundation, and the webhook and schedule patterns above are how you turn the same agent outward.

How do you measure whether it's working?

Watch four numbers, before and after:

MetricWhat it tells youWhere to get it
WISMO tickets per 100 late ordersWhether the proactive message is landingHelpdesk tags + tracking platform
Repeat contacts on the same late orderWhether the message answered the question or just started a threadHelpdesk
Cancels after a delay noticeWhether the new dates are believable (a spike means they aren't)Store
Messages with a date that turned out wrongThe one that hurts trust; aim for zero AI-invented datesSpot-check sample

A quick note on the last one, a carrier's estimate being wrong is normal. The AI quoting the carrier and then the carrier missing is fine, but the AI producing a date that came from nowhere, that is the bug.

Common mistakes with AI shipping delay notifications

The ones I see most, roughly in order of how much trouble they cause:

  1. Treating unshipped orders like carrier delays. No cancel offer, no revised ship date, a cheerful "on its way." In the US that's the part of the message the FTC rule is about.
  2. Triggering on every exception. Weather blips that resolve the same day become worried customers. Trigger on the promise, not the scan.
  3. Letting the AI fill gaps. No date from a system means no date in the message. "We don't have a new date from the carrier yet" is a complete, honest sentence.
  4. Sending from a no-reply address. The customer's reply ("can I cancel?") is the most useful thing that can happen next. Send from the helpdesk so it lands on a ticket.
  5. Forgetting the ticket that already exists. If they wrote in yesterday, the delay message belongs on that thread.
  6. Automating the lost-parcel case. Lost, damaged and "delivered but not here" are claims and judgment calls. Draft and hand over; my guide to AI for warranty claims has the same handover pattern.

If your delays come in waves (holiday peaks, a carrier strike), my post on AI for seasonal support spikes covers how to keep the same rules under load, and AI for weekend support coverage covers the Saturday scan nobody's watching.

Try eesel for shipping delay notifications

If your store runs on Shopify and your tickets land in Gorgias, Zendesk or Freshdesk, eesel works as an AI teammate that already knows how to read the order and the carrier scan. Point a delay webhook at it, and it checks whether the order shipped, compares the new date with your promise, sends one honest update, and holds cancels and refunds for you to approve. Question Beauty closed 280 Gorgias tickets in a month this way without a person touching them.

The eesel webhook automation page for a shipment delay alert, showing the webhook URL with a copy button and the instructions for handling each delay payload
The eesel webhook automation page for a shipment delay alert, showing the webhook URL with a copy button and the instructions for handling each delay payload

You can set it up from the dashboard chat or the CLI, test it on last month's late orders, and see plans on the pricing page. Try eesel free and see what it would have sent.

Frequently Asked Questions

Can AI send shipping delay notifications on its own?
Yes, for the common case: an order that has shipped, where the carrier has posted a new delivery date later than the one you promised. The AI reads the order and the scan and sends one message. Orders that have not shipped yet, lost parcels and "delivered but not here" claims should have a person in the loop, with the AI drafting. My guide to approval workflows covers how to hold those.
When should a shipping delay notification be sent?
When the new date is later than the date the customer was promised, not on every carrier exception scan. For orders that have not left your warehouse, US sellers must send a delay notice before the promised ship date, or before day 30 if no date was given, under the FTC's Mail Order Rule. The proactive vs reactive post explains why the first message matters most.
What should a shipping delay email say?
For a shipped parcel: the last carrier scan with its time and place, the carrier's new estimate if there is one, and what you will do if it stalls. For an unshipped US order, the FTC requires a revised ship date or a statement that you don't know, an offer to cancel for a full refund, and a free way to cancel. My email templates post has more wording to borrow.
Is a shipping delay notification required by law?
In the US, it is required when you cannot ship an order within the time you stated, or within 30 days if you stated nothing. The notice has to offer the customer a full refund instead of waiting. Once the parcel is with the carrier, the rule's shipping clock has stopped, though UK law still counts delivery within 30 days. This is not legal advice; check with your own counsel.
Does "label created" count as shipped?
Not under the FTC's definition, which counts shipment as the moment the goods are physically handed to the carrier. A label with no carrier scan is still sitting with you, so an AI should treat it as an unshipped order. It is also the status behind a lot of repeat WISMO emails.
Which tools do I need for AI shipping delay notifications?
Three layers: your store for the order and the promised date (for example Shopify), a tracking platform for carrier events (AfterShip, or your 3PL's feed), and an AI agent in your helpdesk that reads both and writes the message. eesel connects to all three and can be woken by a webhook when a delay event fires.
Should AI offer compensation for a late delivery?
Only inside a written policy. Let it quote what the policy says (for example free shipping refunded on orders more than five days late) and hold anything outside that for a person. An AI that improvises discounts or delivery promises creates the next ticket. See AI for refund requests for the policy side.

Share this article