How to handle refund requests in Zendesk before they become chargebacks
How to triage refund requests in Zendesk so they don't become chargebacks: routing, response times, when to refund, what to write, what to keep.
A chargeback is often a refund request that nobody answered in time. The customer writes to support, waits, gets a vague reply or none, then calls their bank. From that moment, a simple refund turns into a dispute with a fee, a deadline, a mark on your dispute rate and an outcome you no longer control.
This guide shows how to set up Zendesk so refund requests are spotted, answered fast and decided consistently, and how to keep the record you will need if a dispute happens anyway. It relies on Zendesk’s documentation for the Comment text condition, macros, intelligent triage and printing tickets, and on Stripe’s How disputes work, fraud prevention best practices and dispute evidence best practices (all accessed November 2026). The payment side uses Stripe as the example; check your own processor’s rules if you use another.
Why speed matters more than the decision
Two facts from Stripe’s documentation explain why refund requests deserve priority:
- Once a dispute is open, the refund door closes. Stripe’s How disputes work page says you cannot issue a refund outside the dispute process while a dispute is open. The only way to overturn it is to submit evidence.
- A full refund prevents a dispute; a partial one does not. According to the same page, customers cannot dispute fully refunded payments, but they can dispute partially refunded ones.
So the question is not only “should we refund?” but “can we decide before the customer goes to their bank?”
Spotting refund requests in Zendesk
Keyword trigger
A ticket trigger using the Comment text condition catches most requests. The condition looks at the subject on creation and the latest comment on updates. Under “Meet ANY of the following conditions”, add one condition per phrase:
- “refund”, “money back”, “charged twice”, “double charged”
- “didn’t authorize”, “did not authorize”, “unauthorized”, “don’t recognize this charge”
- “dispute”, “chargeback”, “my bank”
Actions: add the tag refund-request, set priority to High, assign to the billing group.
Give the second group of phrases its own tag (charge-not-recognized). A customer who does not recognize a charge is the one most likely to go straight to their bank, and the one most likely to be a fraud case rather than a refund case.
Intelligent triage
If you have intelligent triage, the predicted intent and sentiment can route refund tickets without keyword lists. Zendesk’s use case guide suggests, for example, raising the priority of very negative tickets or sending them to a senior group. Using these predictions in triggers requires the Copilot add-on; the classifications themselves are available on Suite and Support Professional plans and above.
A billing form or field
A “Billing” ticket form with a “Request type” field (Refund, Charge not recognized, Invoice question, Cancel) gives cleaner data than any keyword. It only works for tickets created through your help center or widget, so keep the trigger for email.
Answering fast
Set a target first reply time for refund-request and charge-not-recognized tickets that is shorter than your normal one, and keep a view of those tickets sorted by age so nothing waits unseen. The reply does not need to contain the decision. It needs to tell the customer that a person is on it and when they will hear back.
A first-reply macro:
Hi
{{ticket.requester.first_name}}, thanks for reaching out about this charge. I’m looking into it now and will get back to you by [time] with an answer. You don’t need to contact your bank; we’ll sort this out directly.
Only say the last sentence if you mean it and will follow through.
Deciding consistently
Write down a refund policy your agents can apply without escalating every ticket. A simple decision table:
| Situation | Typical decision |
|---|---|
| Charged after a cancellation the customer did request | Full refund, confirm cancellation |
| Annual renewal charged, customer did not use it after renewal | Full or prorated refund, per your published policy |
| Duplicate charge | Refund the duplicate |
| Customer does not recognize the charge, no account match | Escalate as possible fraud |
| Customer used the service and wants money back | Per your policy; explain it clearly if you decline |
Two Stripe points to keep in mind:
- Partial refunds can still be disputed. If you offer a partial refund, explain it, and know that the customer can still dispute the rest.
- Early fraud warnings. If Stripe flags a payment with an early fraud warning, its fraud prevention guidance says you can refund proactively to prevent the cardholder from disputing, but that refunding every warning automatically is not a good strategy. A refund also does not remove a fraud report from card network counts.
Writing the decision
When you refund:
I’ve refunded [amount] to your card ending in [last4]. It can take a few business days to appear, depending on your bank. Your subscription is [cancelled / still active until date]. Let me know if anything else looks wrong.
When you decline:
I’ve looked at your account. Your subscription renewed on [date] under the terms you accepted at signup, which you can read here: [policy]. Since then, the account has been used on [dates]. I’m not able to refund this charge, but I’ve cancelled the renewal so you won’t be charged again. If you have questions, reply here and I’ll help.
A decline written like this is also good evidence: it is factual, dated and polite, and it shows the customer was offered a resolution.
Keeping the record
If a dispute arrives anyway, the ticket is part of your answer. Stripe’s evidence best practices ask you to state whether the customer tried to resolve the issue with you before disputing, and to include relevant communication as excerpts in a single file.
From Zendesk:
- One ticket: use Print ticket from the ticket options menu and save as PDF from the browser. You can choose whether to include internal notes; for evidence, leave them out. There is no bulk print.
- Many tickets or automation: Zendesk points to the Ticket Comments and Ticket Audits APIs, which return each comment with its author and timestamp.
Keep the customer’s own words verbatim, with dates. Do not edit them.
Measuring
Track three numbers each month: refund requests received, median time to first reply on them, and disputes from customers who had an open or recent refund ticket. If that last number is not zero, look at those tickets one by one. They usually show a reply that came too late or a decision that was never explained.
Doing this with NoChurn
NoChurn’s Zendesk connector is read-only, so refunds, replies and triggers stay with your team in Zendesk and Stripe. NoChurn reads tickets and matches them to customers by email (doubtful matches are suggested, never merged automatically), and uses them in the churn score. When a dispute opens on Stripe or Braintree, it gathers the evidence automatically, including dated verbatim excerpts from Zendesk tickets, cancel flow answers, emails sent and usage, and drafts a reply with AI that is only sent after someone on your team reviews it. See NoChurn + Zendesk.