Support & returns
Auto-close stale support tickets
Half your open queue isn't open — it's answered, sitting in 'waiting on customer', never closed. Those zombie tickets pad your open count and quietly wreck your resolution-time numbers. This runs a daily sweep over Gorgias, finds tickets that have gone quiet on the customer's side, sends one polite 'reply if you still need us' nudge, then closes the ones that stay silent — tagged so they're auditable, and set to reopen the instant anyone writes back. Build it yourself with the steps below — or we build it, tune the timing 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
The manual way today
An agent answers a question, the customer goes quiet — problem solved, or they just lost interest — and the ticket sits in 'open' or 'waiting on customer' forever because nobody circles back to close it. Once a day someone scrolls the bottom of the queue, eyeballs the old ones, guesses which are actually done, and closes them by hand. The careful ones don't touch a ticket in case the customer still needs something; the impatient ones close things that weren't really resolved. Either way it's a manual janitorial pass over a list that grows every single day.
The dead tickets don't just look untidy — they corrupt the numbers you run support on. Every zombie ticket counts as 'open', so your backlog looks like a fire when most of it is already handled, and your average resolution time balloons because the clock never stopped on tickets that were done days ago. Agents waste attention re-reading the same stale threads to decide if they're safe to close. And the real risk runs the other way: a hand-closing pass that's even slightly careless will close a ticket the customer is actually still waiting on, which reads to that customer as being ignored.
What running looks like
Once a day, a scheduled job reads your Gorgias queue, finds the tickets where your team replied last and the customer has been silent past your window, and skips anything that's genuinely waiting on you, snoozed, or flagged mid-return. The first time a ticket qualifies it gets one short, friendly reply — 'looks sorted, just reply if not' — and a pending tag. If it's still quiet on the next sweep, it closes, tagged 'auto-closed-stale' so it never gets mistaken for an agent resolution. Anyone who replies, even after it's closed, reopens the ticket instantly and drops out of the close pipeline. Your open count finally reflects real, live work.
01The build
How to build it
Define 'stale' precisely — and only ever close tickets waiting on the customer
Needs a humanSettle this on paper before you build anything, because one rule carries the whole automation: you only auto-close tickets where your team sent the last message. A ticket whose last message is from the customer is waiting on YOU — closing that is the one outcome you can't have, because to the customer it looks like you ignored them. So 'stale' means: status open, last message was from an agent, and no customer reply for N days. Pick N in business days (most DTC inboxes land at 5-7), and write your exclusion list now too: VIP tags, anything tagged with an open return / refund / replacement, snoozed tickets, and any view you want left alone.
Run it as a daily scheduled sweep, not a webhook
Runs itselfThere is no 'ticket went stale' event to subscribe to — staleness is the absence of activity, which only a clock can detect. So in n8n use a Schedule (cron) trigger that fires once a day at an off-peak hour. A single daily pass is the right cadence: frequent enough that nothing rots for long, infrequent enough that a customer who replies overnight is never racing your automation. Avoid running it hourly; you gain nothing and multiply your API calls and the chance of a same-day close on a ticket someone's still typing into.
Pull the candidate tickets from Gorgias
Runs itselfCall the Gorgias List Tickets API for status = open, and page through the results — the queue is usually bigger than one page. For each ticket you need enough to judge it: the ticket ID, its tags, whether it's snoozed, the last message's datetime and direction (agent vs. customer), and the customer email. If the list payload doesn't include message direction, fetch the ticket's latest message to get it. Filter the list to tickets whose last activity is older than your window so you're only carrying forward the ones worth evaluating.
Keep only the ones genuinely waiting on the customer
Runs itselfThis is the guardrail that makes the whole thing safe to run unattended. Drop every ticket whose last message came from the customer — those are waiting on your team and must never be auto-closed. Drop snoozed tickets, because a snooze is a human deliberately deferring a ticket to a date; auto-closing it overrides that decision. What survives this filter is the real target: tickets your team has already answered, that the customer simply never came back to.
Apply the exclusion list so in-flight cases survive
Runs itselfRun the survivors against the exclusions you wrote in step 1. Skip anything tagged VIP or otherwise marked hands-off. Critically, skip tickets tied to an open return, refund, exchange, or replacement — a customer who's quiet because they're waiting on a refund to land is not a resolved ticket, and closing it is how a fixable silence turns into a chargeback. If the order or RMA state lives outside Gorgias, this is the one place a quick lookup (Shopify order status, your returns tool) earns its keep before you touch the ticket.
Warn before you close — one short nudge, then a pending tag
Runs itselfDon't close on first contact. The first time a ticket clears every filter, post one brief public reply in the customer's voice-of-brand — something like 'We think this one's sorted! Just reply here if you still need anything and we'll jump right back in. Otherwise we'll close it out in a few days.' — and add a tag like 'auto-close-pending' with the date. This gives a customer who genuinely still needs help an obvious, low-effort way back in, and it's the difference between an automation that feels considerate and one that feels like a door slamming.
Close the ones that stay silent — and tag them for audit
Runs itselfOn a later sweep (give the nudge 2-3 days to breathe), take the tickets still carrying 'auto-close-pending' that have had no new customer reply since the nudge, and set their status to closed via the Gorgias API. Add an internal note and a permanent tag — 'auto-closed-stale' — so anyone reviewing the ticket later knows a customer didn't get hand-waved off by an agent, and so your reporting and any CSAT flow can exclude these from agent-resolution stats. Before closing, re-check the last message direction one final time; if the customer slipped a reply in since the nudge, abort the close.
Reopen on reply — and strip the pending tag
Runs itselfGorgias reopens a closed ticket automatically when a new inbound message arrives, so a customer who resurfaces a week later lands back in the live queue without you doing anything. The piece you do have to build is on the pending side: add a Gorgias Rule that, on any new customer message, removes the 'auto-close-pending' tag. Without it, a customer who replies to your nudge could get swept up and closed on the next pass anyway — exactly the mistake the warning step exists to prevent.
Watch the reopen rate and tune the window
Needs a humanThe honest health check for this automation is how often auto-closed tickets get reopened by a customer reply. A few is normal. A lot means you're closing tickets that weren't actually resolved — your window is too short, or your 'waiting on customer' filter is missing a case — so lengthen N and look at the reopened threads for the pattern. Spend ten minutes a week on it at first. Once the reopen rate settles low, the sweep just runs, and your open count stays honest on its own.
02The stack
What it’s built on
- Gorgias
- The helpdesk the whole sweep reads from and writes to. It's the source of the open-ticket list, the message history that tells you who replied last, and the snooze and tag state the filters depend on. It's also where the nudge reply gets posted, where the close happens, and where a Rule strips the pending tag when a customer writes back — and it reopens closed tickets on a new inbound message for free.Gorgias Rules can auto-close inactive tickets natively, and if a plain time-based close covers you, use it — no need for this build. The recipe is worth it when you want the safety layer Rules alone don't give you cleanly: closing only tickets that are waiting on the customer, a warning nudge before the close, audit tags so these never count as agent resolutions, and untag-on-reply — logic that lives in your own flow rather than locked inside one helpdesk's settings.
- n8n
- The scheduler and the brain. Its cron trigger runs the daily sweep, and it does the work Gorgias Rules can't: paging the ticket list, checking last-message direction, running the exclusion lookups (including any Shopify or returns-tool check), and managing the two-stage warn-then-close over separate runs.n8n is open-source and self-hostable for free, so the schedule and the close logic stay under your control; their cloud tier just saves you running the server. Zapier can fire a simple version, but the paginated list pull plus the two-stage pending-then-close state is awkward to hold together there.
03Questions
Before you build
Won't this close tickets the customer is still waiting on?
No — that's the failure the whole design is built to avoid. The core filter only ever closes tickets where your team sent the last message; any ticket whose last message is from the customer is waiting on you and is excluded outright. On top of that it warns before closing, gives the customer a few days to reply, and re-checks the message direction one last time right before the close. And if someone does resurface after it's closed, Gorgias reopens the ticket on their reply.
Doesn't Gorgias already auto-close inactive tickets on its own?
It can — Gorgias Rules support closing tickets after a stretch of inactivity, and if a straight time-based auto-close is all you need, you should just use it. This recipe exists for the brands that want the guardrails a plain rule doesn't give you cleanly: only closing tickets that are waiting on the customer (not on you), a warning nudge before the close, an 'auto-closed-stale' tag so these never pollute agent-resolution stats, and stripping the pending tag the moment a customer replies. That logic lives in your own n8n flow, so it survives a move to another helpdesk.
What happens if a customer replies after the ticket is closed?
It reopens. Gorgias automatically moves a closed ticket back to open when a new inbound message arrives, so a customer who comes back a week later lands in the live queue and an agent picks it up as normal. The recipe also removes the 'auto-close-pending' tag on any new customer message, so a reply to the warning nudge can't get the ticket swept up and closed on the next pass.
Will auto-closing inflate my CSAT or agent resolution numbers?
Only if you let it — which is exactly why every auto-close is tagged 'auto-closed-stale'. That tag lets your reporting exclude these from agent-resolved counts, and lets any CSAT survey flow skip them so you don't ask someone to rate a conversation that just timed out. A close that an automation made and a close an agent earned should never look the same in your numbers, and the tag is what keeps them separate.
How long should a ticket sit before it's considered stale?
There's no universal number worth quoting — it depends on your products and how your customers behave. A sane starting point is 5-7 business days of silence from the customer after your last reply, then the warning nudge, then 2-3 more days before the close. Treat that as a first draft and tune it from the reopen rate: lots of reopens means you're closing too early and should lengthen the window.
Why a scheduled job instead of a webhook?
Because staleness is the absence of activity, and there's no event that fires when nothing happens. A webhook can tell you a ticket changed; only a clock can tell you a ticket hasn't changed in five days. So the build is a daily scheduled sweep that scans the open queue and evaluates each ticket against the window — one off-peak run a day is the right balance of fresh and unobtrusive.
Related recipes
Support & returns
Send a CSAT survey after a ticket is resolved
Right now you close a ticket and move on, with no idea whether the customer left happy or just gave up. This watches for resolved tickets in Gorgias, waits a beat, and sends one short Klaviyo email with a single-click rating — then records the score against the agent who handled it and pings someone when a customer is unhappy enough to act on. Build it yourself with the steps below — or we build it, wire the score back into your reporting, and hand it over so you own it outright with no monthly fee. Free teardown of your current setup first.
- Gorgias
- Klaviyo
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-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
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