8
2 Comments

How to automate refund reviews without giving AI the final say

A refund is about more than returning money. It’s about understanding what went wrong.

Here's a workflow to help you review each case, prepare a clear response, and identify patterns to improve your product.

Tools

  • Jotform: Customers submit refund requests here.
  • Zapier: Passes information between your apps and runs the workflow.
  • ChatGPT (OpenAI): Summarizes the request and writes a draft reply.
  • Google Sheets: Keeps all requests in one place.
  • Gmail: Creates reply drafts.
  • Stripe: Processes approved Stripe refunds.

Step 1 — Write the decision rules

Create a document titled "Refund Rules."

Add four possible decisions:

  • Approve: The order is valid, the customer qualifies for a refund, and there are no problems.
  • Support_first: The issue can probably be fixed without a refund.
  • Deny: The request clearly falls outside the published policy.
  • Escalate: You cannot verify the order, something looks unusual, the policy is not clear, or you need more info.

Before making a decision, compare the purchase date submitted through the refund request form with the transaction date in Stripe or your payment system. You should also check the customer’s product usage in your course platform, SaaS database, or store.

Every refund request should have one final decision.

Step 2 — Build the Jotform form

Open Jotform: Click Create Form → Start From Scratch → Classic Form.

Add these fields:

  1. Full Name
  2. Email
  3. Order or Invoice ID
  4. Product Purchased
  5. Purchase Date
  6. Refund Reason
  7. What Happened?
  8. What Have You Tried?
  9. Preferred Resolution
  10. Screenshot or File Upload

Add these options under Refund Reason:

  • Duplicate purchase
  • Cannot access product
  • Technical problem
  • Not as expected
  • Accidental purchase
  • Billing problem
  • Other

Add these options under Preferred Resolution:

  • Refund
  • Help fixing the issue
  • Replacement
  • Store credit
  • Not sure

Open Settings → Conditions → Show/Hide Field.

Create these rules:

  • Show What Have You Tried? if the Refund Reason is Cannot access product or Technical problem.
  • Show Describe the reason if the Refund Reason is Other.

Preview the form and test every option.

Add this notice (or something similar) above the Submit button: "Submitting this form does not guarantee a refund. We will review your order, product usage, and our refund policy: [POLICY LINK]."

Customers can now explain the problem and tell you what they want in one form.

Step 3 — Create the operations sheet

Create a Google Sheet called Refund Operations.

Add these column headers to row 1: Request ID, Submitted At, Month Key, Name, Email, Order ID, Product, Customer Reason, Customer Details, Preferred Resolution, AI Review, Issue Class, Order Verified, Policy Eligible, Usage Checked, Risk Flag, Decision, Workflow Status, Refund Amount, Refund Reference, Final Outcome, Product Fix.

Each row will represent one refund request.

Step 4 — Build the intake Zap

In Zapier, create a new Zap.

Set up the trigger:

  1. Click CreateZap.
  2. Choose Jotform → New Submission.
  3. Connect your Jotform account.
  4. Select the refund form.
  5. Click Test trigger.

Next, create the Month Key:

  1. Add Formatter by Zapier → Date/TimeFormat.
  2. Map the Jotform submission date into Input.
  3. Set the output format to YYYY-MM.
  4. Use the result as the Month Key.

Next, add ChatGPT (OpenAI) → Send Prompt.

Paste this prompt (or something similar):

"You assist a human refund reviewer. Use only the facts below.

Return exactly:
SUMMARY:
Likely_issue_class:
Missing_facts:
Risk_flags:
Support_option:

Allowed classes: ACCESS, TECHNICAL, EXPECTATION, BILLING, ACCIDENTAL, OTHER.

Do not approve or deny. Do not invent policy terms, usage, payment status, or customer history.

Order ID: [map Order ID]
Product: [map Product]
Purchase date claimed: [map Purchase Date]
Reason: [map Refund Reason]
Details: [map What Happened]
Tried: [map What Have You Tried]
Preferred resolution: [map Preferred Resolution]"

Finish the Zap with these steps:

  1. Open the advanced fields and set Temperature to 0.2. This makes the results more consistent.
  2. Add Google Sheets → Create Spreadsheet Row.
  3. Select the Refund Operations sheet.
  4. Map the form answers and Month Key to the correct columns.
  5. Map the full ChatGPT response to AI Review.
  6. Enter NEW in Workflow Status.

Each new form submission will now create a row in the sheet with the customer’s answers and an AI summary.

Step 5 — Review the facts

Open the matching order in your payment and product systems.

Set these values in the sheet:

  • Issue Class: Use a category that best fits the request. Here are some examples: Access, Technical, Expectation, Billing, Accidental, or Other.
  • Order Verified: Yes or No
  • Policy Eligible: Yes, No, or Exception
  • Usage Checked: Yes or No
  • Risk Flag: Choose the most appropriate flag. Here are some examples: None, Duplicate_refund, Chargeback, ID_mismatch, or Other
  • Decision: Approve, Support_first, Deny, or Escalate

Review the information before choosing a decision.

The AI summarizes the request. You make the final decision.

Step 6 — Build the decision Zap

Create a second Zap.

  • Choose Google Sheets → New or Updated Spreadsheet Row.
  • Connect your Refund Operations sheet and test the trigger.
  • Click the + button to add another step.
  • Search for Filter by Zapier and select it.

Set up the filter so the Zap only continues when both of these are true:

  • Decision exists.
  • Workflow Status exactly matches NEW.

Test the filter. If both conditions are true, the Zap should continue. Otherwise, it should stop.

  • Click the + button again.
  • Search for Paths by Zapier and select it. (Paths require a paid Zapier plan.)

Create four paths, one for each decision state listed in Step 1:

Path 1: Approve

  • Set the path rule: Decision exactly matches Approve
  • Add Gmail → Create Draft.

Address the draft to the customer. Leave placeholders for:

  • Refund amount
  • Processing date
  • Expected arrival time

Do not send the draft.

Path 2: Support_first

  • Set the path rule: Decision exactly matches _Support\first
  • Add ChatGPT (OpenAI) → Send Prompt.

The prompt should ask the AI to write a reply using only the verified information. Include the support action and explain what the customer should do if it doesn't solve the problem.

Add Gmail → Create Draft. Map the text from ChatGPT to the email body.

Path 3: Deny

  • Set the path rule: Decision exactly matches Deny.
  • Add Gmail → Create Draft.

State the policy rule that applies. Include a link to your refund policy.

Party 4: Escalate

  • Set the path rule: Decision exactly matches E_scalate_
  • Add Gmail → Send Email. Send the email to your review team.

Include the following in the email:

  • Order ID
  • Risk Flag
  • AI Review
  • Link to the Google Sheet

Add Google Sheets → Update Spreadsheet Row at the end of every path.

Use the trigger's Row ID. Set Workflow Status to _DRAFT\READY or ESCALATED. This updates the same row.

Step 7 — Process approved refunds

In Stripe:

  1. Open Payments.
  2. Find the payment.
  3. Click the overflow menu.
  4. Click Refund payment.
  5. Confirm the refund amount.
  6. Choose a reason.
  7. Click Refund.

If the refund is successful, add the refund amount and refund reference to your sheet, if available.

  • Set Final Outcome to Refunded.
  • Review and send the Gmail draft.

Do not tell the customer the refund has arrived. It may take several business days for the refund to appear.

Step 8 — Build the monthly learning loop

Create a third Zap.

  • Set: Schedule by Zapier → Every Month → day 1 → 9:00 AM.
  • Add Formatter → Date/Time → Add/Subtract Time.

Use the scheduled time as Input. Subtract one month.

  • Add another Formatter → Date/Time → Format.
  • Format the result as: YYYY-MM
  • Use Google Sheets → Lookup Spreadsheet Rows (Advanced) to find the matching rows.

Send the rows to ChatGPT with a prompt asking the AI to summarize the refund data and suggest improvements based solely on the information it receives.

Send the summary to yourself with Gmail → Send Email

What to avoid

  • Don't let AI approve refunds automatically.
  • Don't make customers who qualify for a refund complete extra support steps first.
  • Don't change your sheet headers after setting up the Zap.

Before you publish, test all four paths:

  • Approved
  • Support First
  • Denied
  • Escalated

Make sure that everything works as expected before using the workflow with real customers.

on July 30, 2026
  1. 1

    Keeping AI out of the final refund decision is the right boundary. Summarization, classification, and drafting are relatively easy to review, but an approval decision depends on policy, customer history, usage data, and exceptions that may not fit clean rules.

    One thing I’d add is an audit trail showing exactly which verified facts were available when the human made the decision. That would make it easier to review inconsistent decisions later and improve the rules without relying only on the AI summary.

    Have you found a good way to handle policy exceptions without gradually turning the spreadsheet into a second, undocumented refund policy?

  2. 1

    totally agree, a refund always holds a teachable moment.

Trending on Indie Hackers
Stop losing deals in the gap between "sounds good" and getting paid User Avatar 68 comments We scanned 50,000 domains. Your cold email list is really four systems. User Avatar 66 comments How to rank #1 on ChatGPT? User Avatar 42 comments I Tested Agenmatic for Finding Customers in Communities — Here’s What I Learned User Avatar 40 comments Building in public: a chat assistant that runs your server so you don't have to live in the terminal User Avatar 31 comments Just got invited to Web Summit Lisbon. Now I need 5 more clients in 13 days. User Avatar 28 comments