HomeShopify & E-commerceHow to Build a Shopify Fulfillment…

How to Build a Shopify Fulfillment Delay Alert with n8n

How to Build a Shopify Fulfillment Delay Alert with n8n









A Shopify fulfillment delay alert in n8n scans your store every morning, finds paid orders that have sat unfulfilled past your shipping window, and sends a single Telegram digest to whoever packs boxes. No paid app, no manual export from the admin. This guide builds the whole thing from scratch with five nodes: a schedule trigger, a Shopify API call, a small filter, a condition, and a Telegram message. You will have it running in about thirty minutes.

Prefer to skip the setup? Grab the ready-made template and be up and running in under ten minutes.

What it does

Every store has a quiet failure mode. An order comes in, the payment clears, and then it slips through the cracks. Maybe the item was on a shelf nobody checked, maybe the packer was out sick, maybe the notification email got buried. The customer paid days ago and is still staring at an “unfulfilled” status. By the time they email to ask, the damage to trust is already done.

This workflow is the safety net. Once a day it asks Shopify a simple question: which paid orders are still unfulfilled and older than my promised window? It collects the answer, formats it into a short list, and posts it to a Telegram chat your team already watches. If nothing is overdue, it stays silent. If three orders are two days late, you see them at 9am with names, ages, and totals, before the customers do.

It sits inside the broader family of n8n Shopify automation flows: small, single-purpose jobs that each remove one recurring manual check from your day.

Why it beats the default

Shopify does show unfulfilled orders in the admin, so why automate it? Because the admin is a place you have to remember to visit. A screen you check “when you get a chance” is a screen you skip on the busy days, which are exactly the days orders pile up. A delay alert flips the model from pull to push. You stop hunting for problems and let the problems find you.

The paid apps that do this are fine, but they charge a monthly fee for a query you can run for free, and they lock the logic inside their dashboard. With n8n you own the threshold, the message wording, the destination, and the schedule. Want the alert only on weekdays? One setting. Want to exclude pre-orders? One line in the filter. Want it in Slack and email? Add two nodes. Nothing about the flow is hidden from you.

There is also the matter of noise. A good alert is quiet until it matters. This one sends nothing when the backlog is clear, so the day it does fire, your team pays attention instead of tuning it out.

What you need

  • A working n8n instance, either self-hosted or on n8n Cloud.
  • A Shopify store where you can create a custom app and read orders.
  • A Shopify Admin API connection in n8n. If you have not set that up yet, follow connect Shopify to n8n, which walks through the 2026 Shopify Dev Dashboard method step by step.
  • A Telegram bot token from @BotFather and the chat ID of the group or channel that should receive alerts.

Build time is around thirty minutes from scratch, or under ten minutes if you import the template and drop in your credentials.

Node-by-node list

The whole flow is five nodes in a straight line. Here is the map before we build it.

┌──────────────────────────────────────────────────────────────┐
│  SHOPIFY FULFILLMENT DELAY ALERT                             │
│                                                              │
│  [Schedule Trigger]  daily at 9:00                          │
│         ↓                                                    │
│  [Get Unfulfilled Orders]  Shopify Admin API                │
│         ↓                                                    │
│  [Flag Delayed Orders]  Code: filter by age                 │
│         ↓                                                    │
│  [Any Delays?]  IF delayed_count > 0                        │
│         ↓ true                                               │
│  [Send Telegram Alert]  digest to your team                 │
└──────────────────────────────────────────────────────────────┘
  
# Node Type Job
1 Schedule Trigger scheduleTrigger Fires the check once a day
2 Get Unfulfilled Orders httpRequest Pulls paid, unfulfilled orders from Shopify
3 Flag Delayed Orders code Keeps orders older than your threshold, builds the message
4 Any Delays? if Continues only when something is overdue
5 Send Telegram Alert telegram Delivers the digest

Step-by-step build

1 Schedule Trigger

Add a Schedule Trigger node. Set the trigger interval to Days, every 1 day, and pick a fire time that lands before your team starts packing, such as 9:00 in your store’s timezone. Confirm the workflow timezone under Settings so the check runs on your clock, not the server’s.

💡

Tip: If you want weekday-only alerts, switch the trigger to a Cron expression like 0 9 * * 1-5. Monday through Friday, 9am, nothing on the weekend.

2 Get Unfulfilled Orders

Add an HTTP Request node named Get Unfulfilled Orders. This asks Shopify for the orders that matter. Configure it like this:

  • Method: GET
  • URL: https://YOUR_STORE.myshopify.com/admin/api/2026-04/orders.json
  • Authentication: Predefined Credential Type, then Shopify Access Token API, and select the credential you created in the connection guide.
  • Send Query Parameters: on. Add these five:
Parameter Value
status open
fulfillment_status unfulfilled
financial_status paid
limit 250
fields id,name,created_at,customer,total_price

Those filters do the heavy lifting server-side. You get back only open orders that are paid and not yet fulfilled, and only the handful of fields you need. Run the node once. The output is a single item whose orders array looks like this:

{
  "orders": [
    {
      "id": 5312002019,
      "name": "#1042",
      "created_at": "2026-07-16T14:22:05-04:00",
      "total_price": "129.00",
      "customer": { "first_name": "Emily", "last_name": "Rodriguez" }
    }
  ]
}
📌

Note: Use a current Admin API version in the URL. This guide uses 2026-04. Do not use the old admin custom-app screens; the 2026 Dev Dashboard method in the connection guide is the supported path.

3 Flag Delayed Orders

Add a Code node named Flag Delayed Orders. This is where you decide what “late” means and turn the raw list into a readable message. Set it to run once for all items and paste this JavaScript:

// How many days old before an order counts as delayed
const DELAY_DAYS = 2;

const orders = $input.first().json.orders || [];
const now = Date.now();
const delayed = [];

for (const o of orders) {
  const ageDays = Math.floor((now - new Date(o.created_at).getTime()) / 86400000);
  if (ageDays >= DELAY_DAYS) {
    const name = o.customer
      ? `${o.customer.first_name} ${o.customer.last_name}`
      : 'Guest';
    delayed.push({ order: o.name, ageDays, name, total: o.total_price });
  }
}

delayed.sort((a, b) => b.ageDays - a.ageDays);

const lines = delayed.map(
  d => `• ${d.order} — ${d.ageDays}d old — ${d.name} — $${d.total}`
);

const summary = delayed.length
  ? `⚠️ ${delayed.length} paid order(s) unfulfilled ${DELAY_DAYS}+ days:\n\n${lines.join('\n')}`
  : '';

return [{ json: { delayed_count: delayed.length, summary } }];

Change the single DELAY_DAYS value to match your promise. A same-day store might use 1; a made-to-order shop might use 5. The node outputs one clean item: a count and a ready-to-send summary string.

{
  "delayed_count": 2,
  "summary": "⚠️ 2 paid order(s) unfulfilled 2+ days:\n\n• #1042 — 3d old — Emily Rodriguez — $129.00\n• #1039 — 2d old — Michael Chen — $54.00"
}

4 Any Delays?

Add an IF node named Any Delays? so the workflow stays silent on clear days. Create one condition of type Number:

  • Value 1: ={{ $json.delayed_count }}
  • Operator: is greater than
  • Value 2: 0

Wire the true branch onward to Telegram. Leave the false branch empty. When the backlog is clear, delayed_count is zero, the condition fails, and nobody gets pinged.

5 Send Telegram Alert

Add a Telegram node named Send Telegram Alert on the true branch. Choose your Telegram bot credential, set the operation to Send Message, put your group or channel ID in Chat ID, and set the Text field to an expression:

={{ $json.summary }}

Save the workflow and toggle it Active. That is the whole build. Tomorrow at 9am it runs on its own.

💡

Tip: To alert two places at once, connect a second node, say Gmail, to the same true branch. Both read the same summary field, so the message stays identical everywhere.

Common mistakes

A few things trip people up on the first run. None are hard to fix.

Symptom Likely cause Fix
Alert fires for orders that already shipped Missing the fulfillment_status=unfulfilled query param Add all five query parameters exactly as listed
Unpaid or draft orders show up financial_status=paid not set Add the paid filter so only real, paid orders count
401 or 403 from Shopify Credential missing the read_orders scope Re-issue the token with Orders read access in the Dev Dashboard
Alert never sends even with old orders IF comparing text instead of a number Set the condition type to Number, not String
Runs at the wrong hour Workflow timezone left on the server default Set the timezone in workflow Settings to your store’s

Cost at realistic volume

This is about as cheap as automation gets. The Shopify Admin API is free on every plan. A Telegram bot is free. The only variable is where n8n runs.

Setup Runs per month Cost
Self-hosted n8n ~30 (one a day) $0 beyond your server
n8n Cloud Starter ~30 executions Well inside the plan’s monthly quota
Shopify Admin API ~30 calls Free, nowhere near rate limits

Even if you run it hourly instead of daily, you are looking at roughly 720 tiny API calls a month, still free and still far under Shopify’s limits. Compare that to a $15 to $30 monthly app that does the same single query.

🚀 Get the Shopify Fulfillment Delay Alert template

The guide above is free to follow. If you would rather skip the build, download the ready-to-import workflow with all five nodes wired and the filter logic already in place, then just add your Shopify and Telegram credentials. Prefer it installed and tuned to your store’s promise window for you? See our done-for-you services.

Download the template ($14.99) →

Instant download · Works on n8n Cloud and self-hosted

Frequently asked questions

How does the workflow decide an order is delayed?

It compares each paid, unfulfilled order’s created_at timestamp to the current time. If the gap is equal to or greater than your delay threshold, two days by default, the order is flagged. You set the threshold as a single number in the Code node, so a same-day promise and a five-day lead time both work.

Will it alert me about the same order every day until it ships?

Yes, by design. As long as an order stays paid and unfulfilled past the threshold, it appears in the daily digest. That repetition is the point of an escalation alert. If you prefer one ping per order, add a Shopify tag such as delay-alerted and skip orders that already carry it.

Does this cost anything to run?

No. It uses the Shopify Admin API, which is free on every plan, a Telegram bot, which is free, and n8n, which is free when self-hosted. On n8n Cloud the run counts as one execution per day, comfortably inside the Starter plan’s monthly allowance.

Can I send the alert to Slack or email instead of Telegram?

Yes. Replace the Telegram node with a Slack, Gmail, or Send Email node. The Code node already builds a plain-text summary in a field called summary, so the only change is which node reads that field and where it delivers the message.

What if I have more than 250 unfulfilled orders?

The single HTTP Request returns up to 250 orders per page. High-volume stores should enable pagination on the HTTP Request node so it follows the Link header and pulls every page before the Code node filters them. For most stores, 250 unfulfilled orders is far more than a healthy backlog.

Related guides

n8n
Shopify
Telegram
fulfillment
automation