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
The manual way today
A ticket comes in: 'hey, where's my order?' An agent reads it, finds the customer's email or order number, opens the Shopify sidebar, checks whether it's shipped, copies the tracking number and carrier link, glances at whether it's actually moving, then writes back some version of 'it shipped on the 3rd, here's your tracking, it should land Thursday.' The same five clicks and the same paragraph, over and over, all day.
This is the single biggest slice of most DTC inboxes — routinely a third to half of all tickets — and it's pure repetition that buries the tickets that actually need a human. Every minute spent restating a tracking number is a minute the genuinely angry or genuinely stuck customer waits longer. The work isn't hard; it's just a tax on your fastest agents that scales linearly with order volume.
What running looks like
A new WISMO ticket lands in Gorgias and, within seconds, the order's real status is sitting in the ticket as a drafted reply: order number, carrier, a clickable tracking link, the last scan, and an honest ETA — written in your voice. The agent reads it, edits the rare sentence that needs it, and sends. Tickets where the order can't be found, shipped long ago with no delivery, or shows delivered while the customer says it's missing are tagged and routed to a person instead of getting a draft.
01The build
How to build it
Decide what counts as WISMO — and that it never auto-sends
Needs a humanWrite the policy first. Which phrases mean 'where is my order' for your store ('where', 'tracking', 'hasn't arrived', 'shipped yet', 'order #1234')? And set the hard rule for this build: the automation drafts, a human sends. Auto-sending a tracking link to someone whose package was marked delivered but never showed up is how you turn a calm ticket into a furious one. This is a human decision the automation just enforces.
Fire on every new ticket from Gorgias
Runs itselfIn Gorgias, create a Rule (or an HTTP Integration) with the trigger 'Ticket created' that POSTs the ticket payload — ticket ID, requester email, subject, and first message body — to a webhook in n8n or Zapier. This is the entry point; the filtering happens in the next step so non-WISMO tickets pass straight through untouched.
Classify the ticket as WISMO (or let it pass)
Runs itselfIn your flow, score the message against the WISMO phrases from step 1. Keyword matching catches most of it; for the fuzzy ones ('it's been forever', 'did this even ship?') add a small LLM classification node that returns wismo: true/false. Anything that isn't WISMO ends here and stays in your normal queue — the automation only acts on the tickets it's confident about.
Match the ticket to a Shopify order
Runs itselfLook the customer up in Shopify by the requester's email via the Admin API. If the message contains an order number, prefer that exact match. Handle the obvious traps: guest checkouts under a different email, and customers with several orders — default to the most recent open or unfulfilled one, and if it's genuinely ambiguous, skip the draft and flag for a human rather than guessing the wrong order.
Read fulfillment and tracking from Shopify
Runs itselfPull the order's fulfillments: fulfillment status, tracking_company, tracking_number, tracking_url, and the shipped date. For most stores this is the source of truth — assuming your 3PL's tracking already syncs back to Shopify (if it doesn't, that's a separate build worth doing first). This tells you whether the order is unfulfilled, shipped, or partially shipped.
Enrich with the live ShipBob status when Shopify is stale
Runs itselfShopify holds the tracking number but not the live carrier status. When the order shows shipped but you want the real transit state — in transit, out for delivery, delivered, exception — call ShipBob's shipments endpoint (by order reference or shipment ID) for the latest status and last scan. If the order is paid but Shopify shows no tracking yet, ShipBob is also where you confirm whether a label even exists. No ShipBob hit needed for unshipped orders.
Branch on the order's real state — the guardrails
Runs itselfThis branch is what keeps the replies honest. Unfulfilled and within your ship window → draft sets expectations; past your window → draft plus a flag so a person knows it's late. In transit → draft with tracking link and ETA. Delivered but the customer says it's missing → no canned draft; tag it 'wismo-delivered-dispute' and route to a human. No order found or ambiguous → flag, don't draft. Each path produces a different draft, or no draft at all.
Compose the draft and drop it into the ticket for review
Needs a humanFill an on-brand template with the real values — order number, carrier, the clickable tracking URL, last scan, and a realistic delivery window — and write it back to Gorgias as an internal note or unsent draft on the ticket (POST to the messages API; never the send path). Tag the ticket 'wismo-autodraft' and log it to a sheet so you can see what share of drafts get sent one-click versus edited. The agent opens the ticket, the answer's already there, they review and send.
02The stack
What it’s built on
- Gorgias
- Where the ticket lives and where the drafted reply lands. A 'Ticket created' Rule or HTTP Integration fires the webhook, and its messages API writes the draft back as an internal note for the agent to review and send.Gorgias already shows Shopify order data in its sidebar via the native integration — this recipe goes a step further and writes the actual reply text, not just the data, so the agent isn't retyping it.
- Shopify
- The system of record for the order and the primary source for fulfillment status and tracking numbers, looked up by customer email or order number.
- ShipBob
- The 3PL that knows the live shipment status — in transit, delivered, exception — when Shopify only has the tracking number. Used to enrich shipped orders and confirm whether a label exists yet.Any 3PL with a shipments API (or a carrier/tracking service like AfterShip or EasyPost) slots in here the same way. ShipBob is just the example — the pattern is 'get live transit status from wherever it actually lives.'
03Questions
Before you build
Why draft instead of just auto-replying?
Because the cost of a wrong WISMO answer is high and the time saved by skipping review is low. Most of the work is the lookup, not the typing — and a human glance catches the cases that would blow up if auto-sent, like a 'delivered' package the customer never received. You keep ~90% of the speed and none of the risk. If you later want true auto-send on the cleanest in-transit cases, that's an opt-in you add once you trust the drafts.
What if the customer has more than one open order?
The flow prefers an order number if the message contains one. Without one, it defaults to the most recent open or unfulfilled order, but if there are several plausible matches it skips the draft and flags the ticket so an agent picks the right one. Guessing the wrong order is worse than no draft at all.
Do I need ShipBob specifically for this?
No. If your tracking already syncs into Shopify and you're fine quoting the tracking link plus the last-known status, Shopify alone covers most tickets. ShipBob (or AfterShip, EasyPost, or another 3PL's API) only comes in when you want the live in-transit/delivered status that Shopify doesn't store. Build it Shopify-only first, add the live status later.
Won't this draft a reply to tickets that aren't really about orders?
That's what the classification step is for. Keyword matching handles the obvious WISMO language, and an optional LLM check handles the fuzzy phrasing. Anything it isn't confident about gets no draft and stays in your normal queue — the automation is deliberately quiet rather than wrong.
Can this also cut down how many WISMO tickets we get in the first place?
Yes, and it's worth pairing. The best WISMO ticket is the one that never opens — a proactive shipping-delay notification and reliable tracking sync prevent a chunk of these. This recipe handles the ones that still come in; a fulfillment-delay flow reduces the volume upstream.
Related recipes
Order & fulfillment ops
Sync 3PL tracking numbers back to Shopify
When your 3PL ships an order, the carrier and tracking number should land on the Shopify order on their own — and trigger Shopify's shipping-confirmation email. Here's how to wire ShipBob's shipment event back to the order, split shipments and all.
- ShipBob
- Shopify
- n8n
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.
- Shopify
- Klaviyo
- ShipBob
Support & returns
Auto-tag and route support tickets by topic
Most DTC inboxes are one big undifferentiated queue: a wholesale inquiry, a damaged-item photo, and a 'where's my order?' all sit in the same line, and whoever's free grabs the top one regardless of whether it's theirs to answer. This reads every inbound Gorgias ticket, decides what it's actually about from a taxonomy you define, tags it, and routes it to the right team or view — keyword rules for the obvious cases, an LLM fallback for the fuzzy ones, and a 'needs-triage' safety net for anything it isn't sure about. Build it yourself with the steps below — or we build it, tune the taxonomy against your real inbox, and hand it over so you own it outright with no monthly fee. Free teardown of your current setup first.
- Gorgias
- n8n
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