HomeShopify & E-commerceHow to Automate Shopify Order Status…

How to Automate Shopify Order Status Lookups With n8n

How to Automate Shopify Order Status Lookups With n8n









A Shopify order status lookup automation in n8n turns the endless stream of where-is-my-order emails into instant, hands-off replies. A customer submits their order number and email on a simple form, n8n queries the Shopify Admin API, and within seconds they receive a message with the exact fulfillment status and live tracking link. No support agent, no copy-pasting tracking numbers, and your inbox is freed for real problems.

Prefer to skip the setup? Grab the ready-made template → and be answering order status requests automatically in under 10 minutes.

What it does

Where-is-my-order requests, often shortened to WISMO, are the single most common message a Shopify store receives. Industry surveys put them at 40 to 60 percent of all support tickets, and every one of them has the same answer already sitting in your Shopify admin. Answering them by hand is pure repetition: open the order, read the fulfillment status, copy the tracking link, paste it into a reply.

This workflow removes that loop entirely. It is a reactive lookup, which makes it different from a shipping confirmation email that fires once when an order ships. Here the customer asks at any moment, and the automation answers on demand with whatever the current status is. It sits neatly alongside your other Shopify n8n automations as the front line of self-service support.

┌──────────────────────────────────────────────────────────────┐
│  SHOPIFY ORDER STATUS LOOKUP (WISMO AUTO-REPLY)               │
│                                                              │
│  [Lookup Form]                                               │
│       │  order # + email                                     │
│       ▼                                                      │
│  [Webhook] → [Shopify Admin API lookup] → [Order found?]     │
│                                              │        │       │
│                                     yes ◄────┘        └──► no │
│                                      ▼                    ▼   │
│                          [Build status reply]     [Email:    │
│                                      ▼             not found] │
│                          [Email customer status]             │
│                                      ▼                        │
│                          [Telegram ping to merchant]         │
└──────────────────────────────────────────────────────────────┘
  

Why it beats the default

The default Shopify experience does give buyers an order status page and shipping emails. So why do they still email you? Because they lost the email, the link expired from their point of view, or they simply want a human to confirm. The out-of-the-box tools are passive; they wait to be found. This workflow is active: the moment a customer reaches out, they get a personal reply with the live answer.

Compared to a paid help-desk app with a WISMO add-on, the n8n version costs nothing per ticket and stays entirely under your control. You decide the wording, the branding, and which channel the reply goes out on. And because it reads directly from the Shopify Admin API at request time, the status is never stale, unlike a cached export or a nightly sync.

What you need

  • A Shopify store with Admin API access. If you have not connected Shopify to n8n yet, follow the 2026 Shopify to n8n connection guide first, it uses the current Dev Dashboard method to create your access token.
  • An n8n instance (cloud or self-hosted), version 1.0 or later.
  • A Gmail account (or Outlook / SMTP) to send the reply from.
  • A Telegram bot and chat ID for the optional merchant ping. This is a nice-to-have, not required.
  • A simple lookup form on your store that POSTs the order number and email to the n8n webhook. A plain HTML form or any form app that can send a webhook works.

Estimated build time: 30 to 45 minutes from scratch, or under 10 minutes with the template.

Node-by-node list

Seven nodes, one clean branch. Here is the full map before we build it:

# Node Type Job
1 Where Is My Order? Webhook Receives the order number and email from the lookup form
2 Look Up Order HTTP Request Queries the Shopify Admin API for the order by name
3 Order Found? IF Branches on whether a matching order came back
4 Build Status Reply Edit Fields Extracts status and tracking into clean fields
5 Email Order Status Gmail Sends the customer their live status and tracking link
6 Ping Merchant Telegram Optional heads-up to you that a lookup was answered
7 Email Not Found Gmail Politely tells the customer the order was not matched

Step-by-step build

1 Where Is My Order? (Webhook)

This node is the entry point. It gives you a URL that your lookup form posts to.

  1. Add a Webhook node and set the HTTP Method to POST.
  2. Set a path such as order-status.
  3. Set Respond to Immediately so the form gets a fast acknowledgement while the rest of the flow runs.
  4. Point your store form at the production webhook URL, sending two fields: order_number and email.

After a submission, the data arriving looks like this:

{
  "order_number": "1042",
  "email": "james.carter@gmail.com"
}
💡

Tip: Ask for the email as well as the order number. Matching on both is what stops the workflow from ever sending one customer another customer’s details.

2 Look Up Order (HTTP Request)

This node calls the Shopify Admin API and asks for the order by its name.

  1. Add an HTTP Request node, Method GET.
  2. Set the URL to your store’s orders endpoint on API version 2026-04:

    https://YOUR_STORE.myshopify.com/admin/api/2026-04/orders.json
  3. Turn on Send Query Parameters and add:
    • name = ={{ $json.order_number }}
    • status = any
    • fields = name,email,financial_status,fulfillment_status,fulfillments,customer
  4. Under Authentication, choose Generic Credential Type → Header Auth and set the header name to X-Shopify-Access-Token with your Admin API token as the value.

Shopify returns an orders array. A matched order carries everything you need:

{
  "orders": [
    {
      "name": "#1042",
      "email": "james.carter@gmail.com",
      "financial_status": "paid",
      "fulfillment_status": "fulfilled",
      "fulfillments": [
        { "tracking_number": "9400111899223197428490",
          "tracking_url": "https://tools.usps.com/go/TrackConfirmAction?tLabels=9400111899223197428490" }
      ],
      "customer": { "first_name": "James" }
    }
  ]
}
📌

Note: The name query matches the human order number the customer sees, including the #. If your form strips the hash, Shopify still matches on the bare number, so 1042 and #1042 both work.

3 Order Found? (IF)

This node splits the flow depending on whether Shopify returned a match.

  1. Add an IF node.
  2. Create one condition. Left value: ={{ $json.orders.length }}, type Number.
  3. Operation: is greater than. Right value: 0.

The true output goes to Build Status Reply. The false output goes to Email Not Found.

💡

Tip: For stronger safety, add a second condition on the true path that checks orders[0].email equals the submitted email. If it does not match, route it to the not-found reply so details are never emailed to the wrong address.

4 Build Status Reply (Edit Fields)

This node pulls the raw Shopify response into a handful of clean, named fields your email can reference.

  1. Add an Edit Fields (Set) node on the true branch.
  2. Add these string assignments:
    • first_name = ={{ $json.orders[0].customer.first_name }}
    • order_name = ={{ $json.orders[0].name }}
    • status = ={{ $json.orders[0].fulfillment_status || "unfulfilled" }}
    • tracking_url = ={{ $json.orders[0].fulfillments[0]?.tracking_url || "" }}

The result is a tidy object that is easy to drop into an email template:

{
  "first_name": "James",
  "order_name": "#1042",
  "status": "fulfilled",
  "tracking_url": "https://tools.usps.com/go/TrackConfirmAction?tLabels=9400111899223197428490"
}

5 Email Order Status (Gmail)

This node sends the customer their answer.

  1. Add a Gmail node, operation Send.
  2. To: ={{ $('Where Is My Order?').item.json.email }}
  3. Subject: Your order {{ $json.order_name }} status
  4. Message body, for example:
Hi {{ $json.first_name }},

Here is the latest on order {{ $json.order_name }}:

Status: {{ $json.status }}
Tracking: {{ $json.tracking_url }}

Thanks for shopping with us!
💡

Tip: When status is unfulfilled the tracking line will be blank. Reword it with a short expression so the customer reads “Your order is confirmed and being prepared” instead of an empty tracking field.

6 Ping Merchant (Telegram, optional)

A quiet log so you can see the automation working.

  1. Add a Telegram node, operation Send Message.
  2. Chat ID: your YOUR_TELEGRAM_CHAT_ID.
  3. Text: WISMO answered for {{ $json.order_name }} ({{ $json.status }}).

7 Email Not Found (Gmail)

On the false branch, reassure the customer rather than leaving them with silence.

  1. Add a second Gmail node, operation Send.
  2. To: ={{ $('Where Is My Order?').item.json.email }}
  3. Body: tell them you could not match that order number and a team member will follow up, and ask them to double-check the number from their confirmation email.

Common mistakes

Problem Likely cause Fix
Every lookup returns not found The name query is missing or the API version is wrong Confirm the URL uses 2026-04 and the name parameter is wired to the form field
401 Unauthorized from Shopify Access token missing or pasted with a trailing space Recreate the Header Auth credential, header X-Shopify-Access-Token, no spaces
Tracking link is always empty Order has no fulfillment yet, or the wrong array index Read fulfillments[0].tracking_url and handle the unfulfilled case in the email text
Reply goes to the wrong person Matching only on order number Add the email-match condition described in step 3
Form submits but nothing happens Webhook still in Test mode Save and activate the workflow so the production URL is live

Cost at realistic volume

The appeal of this build is that it runs on tools you already pay for, or free tiers. Assume a store fielding 600 WISMO requests a month, a busy small brand.

Component Cost at 600 lookups / month
Shopify Admin API calls Free, well inside rate limits (2 calls per request)
Gmail send Free on a standard account; Workspace has generous daily limits
Telegram ping Free
n8n (self-hosted) Server cost only, effectively 0 marginal per lookup
n8n Cloud Starter 600 executions is a small slice of the monthly quota

Against a help-desk app that charges per resolved ticket, answering 600 requests automatically each month is the difference between a recurring bill and effectively zero. The time saved is the bigger prize: at two minutes of manual handling per ticket, 600 lookups is 20 hours a month you get back.

🚀 Get the Shopify Order Status Lookup Template

The guide above is free to follow. If you would rather skip the build, download the ready-to-import workflow, then just add your credentials. Prefer it installed and tuned for you? See our done-for-you services.

Download the template ($12) →

Instant download · Works on n8n Cloud and self-hosted

FAQ

Does this replace my Shopify support inbox?

No. It handles the single most repetitive question, where is my order, and leaves genuine issues for a human. Customers who submit a lookup get an instant, accurate status email, so your inbox fills up with real problems instead of tracking-number requests you could have answered from data.

What if the order has not shipped yet?

The workflow reads the fulfillment status from Shopify. When there is no fulfillment yet, the email says the order is confirmed and being prepared, with no tracking link. The customer still gets a clear answer, which is usually all they wanted before they emailed you a second time.

Do I need to write code to build this?

No. Every step is a standard n8n node configured through the visual editor. The only expressions you type are short references like the order number and email fields. If you can fill in a form, you can build and run this order status lookup automation.

How does the workflow find the right order?

It queries the Shopify Admin API by order name, the number the customer sees on their confirmation, then confirms the email on the order matches the one submitted. That two-part check stops the workflow from emailing order details to the wrong person.

Can I send the reply from Outlook instead of Gmail?

Yes. Swap the Gmail node for the Microsoft Outlook node or a generic SMTP node and keep the same message body. The rest of the workflow, the webhook intake and the Shopify lookup, does not change at all when you switch the email sender.

Related guides

n8n
Shopify
Gmail
Telegram
WISMO
automation