Support & returns
Auto-issue store credit for returns
Every approved return that resolves as store credit ends the same way: an agent works out the amount, opens the customer up, and manually issues a gift card or credit — then writes the 'here's your balance' reply. It's small, it's identical every time, and it happens on every single case. This wires the credit to the return itself: when the package is back and the return is closed, Shopify credits the customer's store-credit account for the right amount and emails them — untouched. 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 returns flow first.
- Shopify
- Gorgias
The manual way today
A return gets approved for store credit instead of a card refund. An agent opens the order, adds up the line items that came back, decides whether tax and the restocking fee count, opens the customer record, creates a gift card or a store-credit entry for that amount, copies the code or balance, and writes back to the customer telling them it's there and how to use it. Then they tag the Gorgias ticket and close it. Every approved-as-credit return is that same five-minute sequence, done by hand.
Five minutes a return doesn't read as a problem until you count the returns. It's pure mechanical work an agent is doing instead of the tickets that actually need a person — and because the amount is keyed in by hand, it's where the slips live: a tax line included on one return and dropped on the next, a gift card issued twice when the first reply bounced, a credit that never went out because the agent got pulled away mid-task. Each one becomes its own follow-up ticket later.
What running looks like
When a return is closed and the items are physically back, Shopify credits the customer's store-credit account for the exact amount your policy says — tax and restocking fee handled the same way every time — and sends them a plain email with the new balance. The credit auto-applies at their next checkout. Clean credits never touch an agent. Only the cases worth a human glance — high-value returns, mismatched amounts, a customer who's asking for cash instead — get routed to Gorgias with the context attached.
01The build
How to build it
Write the credit policy as numbers a machine can compute
Needs a humanBefore any wiring, pin down the rules: does the credit equal the returned item total only, or include tax and original shipping? Do you subtract a restocking fee, and is it a flat amount or a percentage? Do you add a bonus for taking credit instead of a card refund (e.g. +10%)? Does the credit expire? And which returns resolve as credit at all versus a refund to the original payment. This is a human decision, and the automation does nothing but enforce it consistently — get it written down and signed off first.
Trigger on the return closing, not the request
Runs itselfSubscribe to Shopify's returns/close webhook (or returns/update and check the status flips to CLOSED). That event fires once the return is resolved and the reverse fulfillment is marked received — which means the package is actually back. Crediting on returns/request or returns/approve instead is how you end up crediting people who never ship the item; tie the money to the goods being in hand.
Confirm this return is flagged for store credit
Runs itselfNot every closed return resolves as credit. Read the return's resolution from the source that decides it: your self-service portal's structured outcome, a Gorgias macro/tag the agent applied (e.g. `return:store-credit`), or an order tag. Only continue for returns marked store-credit; refunds-to-card go down their own path. If no resolution is set, route to a human rather than guessing.
Compute the credit amount from the returned line items
Runs itselfPull the return's line items and quantities from the Admin API and sum their prices for what actually came back — never trust a number typed into a ticket. Then apply the policy from step 1 in order: add tax/shipping if included, subtract the restocking fee, add the take-credit bonus if you offer one. Round to the currency's minor unit and keep the currency code with the figure so a multi-currency store never credits 80 USD as 80 EUR.
Credit the customer's store-credit account (idempotently)
Runs itselfCall the storeCreditAccountCredit GraphQL mutation against the customer's store-credit account with the computed creditAmount (amount + currencyCode) and an optional expiresAt. Before you fire it, dedupe on the return ID — write a `credited:<returnId>` marker to an order metafield or your own store and skip if it's already there — so a retried webhook never double-credits. On a plan or API version without store-credit accounts, issue a single-use gift card with giftCardCreate instead; same dedupe rule.
Email the customer the balance in plain language
Runs itselfSend a specific message: your return's been received, you've been credited [amount], it's on your account now, it applies automatically at checkout (or, for a gift card, here's your code), and here's the expiry if there is one. Customize Shopify's notification or send from your ESP — but make it concrete, not a vague 'your return has been processed.'
Post the result back to Gorgias and close the ticket
Runs itselfIf the return came through Gorgias, add an internal note with the credited amount and a link to the customer's store-credit balance, tag the ticket `store-credit-issued`, and close it. The agent who approved it sees it landed without reopening Shopify, and the next person who touches that customer has the full picture in the ticket history.
Log every credit and route the misfits to a person
Needs a humanAppend each credit — return ID, amount, currency, fee applied, bonus applied — to a sheet, Airtable, or Slack channel for reconciliation against your books. Then send the exceptions to a human instead of auto-crediting: returns over your value threshold, ones where the computed amount disagrees with what the agent expected, returns flagged damaged or possible fraud, and any customer explicitly asking for cash. The automation handles the clean cases; people handle the judgment calls.
02The stack
What it’s built on
- Shopify
- System of record for the order and the return. Its returns webhooks signal when a return closes and the package is back, its Admin API gives you the returned line items to total, the storeCreditAccountCredit mutation puts the balance on the customer's account, and it can send the customer notification.Native store-credit accounts (the balance auto-applies at checkout, no code to lose) are available on current plans and API versions. If yours doesn't have them yet, a single-use gift card via giftCardCreate does the same job on any plan — start with whichever your store already supports rather than upgrading just for this.
- Gorgias
- Where the return decision usually gets made and where the confirmation posts back. Here it's the approval surface and the exception handler: an agent (or your portal) flags the return as store-credit, and only the judgment calls — high-value, mismatched, cash-requested — come back as tickets, with context attached.Gorgias bills by billable ticket, so letting clean credits resolve without opening or reopening a ticket — and only routing the exceptions — keeps your ticket count, and your bill, from climbing with return volume.
03Questions
Before you build
Should I issue store credit or a gift card?
If your store has native store-credit accounts, use those — the balance sits on the customer's account and applies automatically at their next checkout, so there's no code to lose and nothing to copy-paste. Gift cards are the universal fallback that works on any plan, but the customer has to keep and enter a code. The build is nearly identical either way; pick whichever your store already supports rather than upgrading just for this.
Does the customer get credited before they ship the item back?
No — and that's deliberate. The credit fires on the return closing, which means the reverse fulfillment is marked received and the goods are actually in hand. Crediting on the request instead is how you end up giving credit to people who never send the item back. If you want to offer instant credit for trusted or low-value cases, make that an explicit exception in the policy step, not the default.
Won't a webhook retry credit the same customer twice?
Not if you dedupe. Before issuing the credit, the recipe writes a `credited:<returnId>` marker (an order metafield or a record in your own store) and skips if it's already there. Webhooks can and do fire more than once, so this idempotency check is the difference between a reliable automation and one that occasionally double-credits — it's built into the credit step, not bolted on after.
Can I add a bonus for taking credit instead of a refund?
Yes — that lives in the policy step. A common setup credits, say, 110% of the return value as store credit versus a straight cash refund, because keeping the money in-store is worth more to you than the discount costs. The amount-computation step applies whatever bonus you define, consistently, on every credit.
What about a customer who wants a cash refund, not credit?
That's an exception, and the recipe routes it to a person rather than forcing credit on them. The 'is this flagged for store credit?' check only continues for returns marked as credit; anything resolving as a card refund goes down the refund path, and a customer pushing back after the fact lands in Gorgias for an agent to handle by policy.
Related recipes
Support & returns
Build a self-service return portal for Shopify
Right now every return is an email thread: the customer asks, you ask for the order number, you check the policy, you make a label, you wait, you refund. A self-service portal lets the customer do the routine part themselves — enter the order, pick items, get a label — while your policy runs server-side so nobody can return something they shouldn't. Gorgias only hears about the returns that actually need a human. 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 returns flow first.
- Shopify
- Gorgias
Order & fulfillment ops
Auto-cancel and refund orders unfulfilled after 14 days
Some orders are never going to ship — the item's gone, the supplier fell through, the address was bad. They sit open, tying up cash and phantom inventory while the customer waits. This finds them past your cutoff, refunds the Stripe charge, restocks the units, and emails a clear explanation — with guardrails so it never touches an order that's mid-fulfillment. Build it yourself with the steps below — or we build it, wire in the safeguards, and hand it over so you own it outright with no monthly fee. Free teardown of your current setup first.
- Shopify
- Stripe
Reporting & dashboards
Track refund rate and reasons in a dashboard
Your refunds line goes up and all you can see is the dollar total — not what percentage of orders it is, whether it's getting worse, or which products and reasons are driving it. This wires the answer up: a Google Apps Script pulls every refund and its return reason from the Shopify Admin API into a logged-and-normalized refunds tab, alongside an orders tab for the denominator, and a dashboard tab built on QUERY formulas shows refund rate over time, reasons ranked, and the products doing the returning — recalculating on its own as new rows land. Build it yourself with the steps below, or we build it on your own Shopify and Google accounts, reconcile it against your Shopify reports, and hand you the keys so you own it with no monthly fee. Free teardown of your current refund reporting first.
- Shopify
- Google Sheets
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