DEV Community

Posting Dude
Posting Dude

Posted on

When Someone Asks for a Refund and You Have Under 30 Paying Customers

When you have under 30 paying customers, refund requests are rare. Maybe one every month or two. But each one is loud. It's one person out of a small group telling you something didn't work, it's real money leaving a pretty small balance, and it's a question about access you probably never answered on purpose.

Most founders treat it as a Dashboard click. The click is the easy part. The decisions around it are where small SaaS gets messy, and they're much easier to make before the first email shows up than while you're reading it.

This is the order I'd go in. Not legal advice, just the operational side.

1. Decide what happens to access before anyone asks

When a refund email comes in, the first question isn't "how much". It's "do they keep using the product after this?"

There's basically three options for a small subscription product:

  • Refund + cancel now. Money back, access ends today. Cleanest. Good for "I signed up by mistake" or "this isn't what I thought it was".
  • Refund + keep access until period end. Money back, but they can still log in until the date they already paid for. Feels generous, costs you nothing extra, but you're giving away a month of usage.
  • Partial refund + keep the plan. For "the feature I needed was broken for a week" type cases. You refund part of the charge and they stay a customer.

None of these is the right one. The mistake is picking a different one every time depending on your mood or how nice the email was. Two customers who asked for the same thing should get the same answer.

So write it down. Literally three or four lines in a doc only you read:

Refund policy (internal)
- First charge, asked within 14 days: full refund, cancel now
- Renewal they forgot about, no usage since renewal: full refund, cancel now
- Product broken for them for a real stretch: partial refund, keep plan
- Anything else: reply first, decide after
Enter fullscreen mode Exit fullscreen mode

The 14 days is just an example, use your own number. The point is you're not inventing policy at 11pm with an annoyed customer waiting.

2. Reply once before you refund (unless it's obvious)

If the reason is obvious, like a duplicate charge or they forgot to cancel and haven't logged in since, just refund it. Don't make people explain themselves for that.

If it's not obvious, send one short reply first. Not to argue or talk them out of it. Under 30 customers, the reason they want out is worth more to you than the money in most cases, and it's the only time they'll tell you.

Something like:

Hey [name],

Sure, I can sort that out. Before I do, can I ask what
didn't work for you? Even one line helps, I'm a small team
and I read every one of these.

If it was something broken, tell me and I'll check
whether it's still happening.

[your name]
Enter fullscreen mode Exit fullscreen mode

Rules for this email: no discount offer in the first reply, no "are you sure", no list of features they "might have missed". Just a question. If they don't answer in a couple of days, refund anyway and move on. Holding the refund hostage for feedback is how a refund request turns into something worse.

And that's actually the other reason to be quick and polite here. A customer who feels ignored can go to their bank instead of you. If you've read why one dispute already looks like a 1% rate when you're small, you know a refund is almost always the cheaper outcome.

3. The Stripe mechanics, as a checklist

Here's what's worth knowing before you click, mostly from Stripe's refund docs:

  • Full or partial. The Dashboard defaults to a full refund, you can type a smaller amount for partial. You can do more than one partial refund on the same charge, but the total can't go over the original amount. The API takes an amount in the smallest currency unit (cents for USD).
  • Pick a reason. The Dashboard asks for one. If you choose "Other" you have to write a note, which is honestly useful later.
  • Fees don't come back. Stripe's processing fees from the original charge aren't returned when you refund. So a refund costs you a little more than the refund amount. Not a reason to refuse, just know it.
  • Refunds come out of your available balance. Not pending money. If you just got paid out and your available balance is low, Stripe holds card refunds as pending until there's enough. With a tiny customer base that can actually happen.
  • Original payment method only. You can't send it to a different card or bank account. If their card expired, the issuer usually routes it to the replacement card.
  • Timing. Stripe says the customer sees the credit roughly 5–10 business days later depending on their bank. If you refund very soon after the charge, it can show as a reversal instead: the original charge just disappears from their statement and no separate credit shows up. Worth telling the customer, because "I don't see a refund" is the most common follow-up.
  • Email to the customer. There's a Dashboard setting to email customers about refunds. It only sends if the charge was on a Customer in your account and that Customer has an email. Turn it on or send your own, but don't send nothing.
  • Don't refund into an open dispute. If they already disputed the charge with their bank, go through the dispute instead. Stripe's docs say if a customer disputes while a refund is pending, the refund can fail with charge_for_pending_refund_disputed, and they recommend accepting or challenging the dispute rather than refunding, so you don't pay them back twice. For bank debit methods (SEPA, ACH, Bacs etc.) they flag the double refund risk directly.
  • Refunds can fail. Closed account, card problem, lost or stolen card. Stripe sends refund.failed, and the money comes back to your balance (can take up to 30 days). Then you need some other way to pay them back. If you already have webhooks, add a listener for it.
  • The reference number. If someone says the money never arrived, open the payment, go to the Timeline, View Details on the refund. Where available Stripe shows an ARN (or STAN/RRN). Give that to the customer, their bank can trace it. It can take up to 7 business days to show up, and there isn't one for reversals.

4. After the refund, close the loop

The refund going through isn't the end. Three small things:

Do the access change you decided in step 1. If it's "cancel now", cancel the subscription now so there's no renewal next month. A refund on a charge doesn't cancel the subscription by itself. If it's "keep until period end", set it to cancel at period end and check your app actually respects that date. Refunding someone and then charging them again 30 days later is the fastest way to get a dispute.

Send a short confirmation. Amount, that it goes back to the card they paid with, the 5–10 business day window, and that a quick refund might show as the charge just disappearing. One paragraph.

Log it. One row in a sheet. Stripe has the payment data, but it doesn't know your access decision or what the customer actually said.

date       | customer        | amount | full/partial | reason (their words)          | access        | notes
2026-10-14 | jane@acme.test  | $29    | full         | "needed CSV export, no CSV"   | cancel now    | 2nd ask for CSV
Enter fullscreen mode Exit fullscreen mode

That "reason in their words" column is the one that matters. At 30 customers you won't see patterns in Stripe charts, but you'll see them in eight rows of a sheet. If three of those rows say some version of the same missing thing, that's your roadmap telling you something.

Also worth separating these from failed payments. A refund is a customer choosing to leave and telling you. A failed card is someone leaving without choosing to, and that needs a different setup, like failed payment emails for involuntary churn. Don't mix both into one "churn" number or you won't know which problem you have.

5. Make the exit not hurt

A lot of refund emails happen because cancelling was confusing or someone didn't realise they'd renew. Hide the cancel button and people email you for a refund instead, or go to their bank. If you want to fix the part before the refund request, this guide on designing a SaaS cancel flow without dark patterns covers how to make leaving easy while still asking the one question you'd want answered.

For people who've already issued a few refunds on a small product: did you keep access until period end, or cut it off the same day? And did either choice ever come back to bite you?

Top comments (0)