How to calculate refund rate from a Shopify orders export (and by sales channel)

Section
Resources, Guides
Sources
13 linked below
Words
1,956
Checked
Nov 5, 2026

Short answer

Refund rate from a Shopify orders export can mean paid orders with any refund divided by paid orders, or refunded money divided by sales. Count each order once, since extra items get their own rows. Leave out test and canceled orders, and say which date you used. Shopify's sales reports record returns on the day they were processed.

You exported your orders from Shopify, opened the CSV in Excel or Google Sheets, and want one number: how often orders get refunded. With a Financial Status column and a Refunded Amount column, it looks like a 2-minute job. Then the count doesn't match Shopify's analytics, and nobody agrees on whether a partial refund counts.

This guide covers 2 definitions, the rows to leave out, which date to count on, and formulas overall and by sales channel. Facts about the export come from Shopify's help pages. Where they're silent, you'll see what to check in your own file.

What is refund rate, and which version do you need?

Refund rate means 2 different things:

  • By orders. Paid orders with any refund ÷ paid orders. It shows how often something goes wrong.
  • By money. Refunded amount ÷ sales (the Total of paid orders). It shows how much revenue goes back.

Say your October export has 1,846 rows for 1,212 orders. After you leave out test, canceled, and unpaid orders, 1,182 paid orders remain. 41 of them have a refund, 22 full and 19 partial, and together they returned $1,486 of $58,960 in sales.

VersionCountedDivided byRate
Orders with any refund41 orders1,182 paid orders3.5%
Fully refunded orders22 orders1,182 paid orders1.9%
Refunded money$1,486$58,960 in sales2.5%
Mistake: refunds ÷ rows41 orders1,846 rows2.2%

The last row is a common mistake: each extra item of an order gets its own row, so dividing by rows makes the rate look better than it is. Pick a version, put it in the metric's name ("Refund rate, orders"), and write it in your metrics dictionary.

Which Shopify export columns do you need for reporting?

Of the export's many columns, you need these. Shopify's help page describes each one:

ColumnWhat Shopify says it holdsUse it for
NameThe order number in your adminCounting each order once
Created atWhen the customer completed the orderThe order date
Financial StatusPaid, authorized, refunded, and so onWhich orders had a refund
TotalThe total cost of the orderThe money base
Refunded AmountAny refund applied to the orderRefunded money
Canceled atWhen the order was canceledLeaving out cancellations
SourceFor example web, draft order, POSSales channel
Email, TagsThe customer's email; the order's tagsFinding test orders

Shopify defines the Refunded payment status as the full amount the customer paid going back to them, and Partially refunded as less than that. Check how Financial Status spells both in your file before you copy the formulas below.

Shopify puts each additional line item of an order on its own row and leaves many of the fields blank there. Check which ones in your file, and check that Name is on every row, since it ties an order's rows together. The column list also has no refund date and no per-item refund column.

Which orders should you leave out?

Each of these skews the rate. When you take an order out, move every row with its Name to a tab called Left out, with the reason, so you can show what you left out and why.

WhatWhy it skews the rateWhat to do
Extra item rowsAn order with 3 items is 3 rowsCount first rows only
Test ordersIn the export, not in Shopify's sales reportsDelete or tag, then leave out
Canceled ordersA refund at cancellation reads as RefundedLeave out, count separately
Unpaid or voided ordersPayment wasn't captured in fullThe formulas below skip them
A totals row someone addedReads as one huge orderDelete it
Blank amounts on item rowsFilling them repeats an order's TotalLeave blank, sum first rows

Test orders need the most care. Shopify says they're left out of its sales reports but included in your orders export, and the export has no test column. Shopify suggests placing test orders with an email address ending in @example.com, so search Email for it. Test orders paid with the Test payment gateway or Shopify Payments in test mode can be deleted. Orders through third-party providers in test mode aren't treated as test orders, and a test with a real payment provider is a real order you cancel and refund. Tag both as test in Shopify.

When you cancel an order and refund it in full, Shopify changes the payment status to Refunded, so cancellations would count as refunds. Keep them out of both sides and report them as their own number. To find them, filter Canceled at for cells with a date.

Which date should a refund count on?

A refund has 2 dates: when the order was placed and when the money went back. The orders export only has the first. For the second, choose Export transaction histories instead of Export orders. In that file, Kind says whether each transaction was a sale, refund, or authorization, and Created At holds its date, time, and offset from UTC.

Count byIt answersDate columnBest for
Order dateHow many October orders were refunded?Created at, orders exportProducts, channels, campaigns
Refund dateHow much did we refund in October?Created At, transaction historySame dates as Shopify's reports

Shopify's sales reports date things the same way: a sales reversal (the newer name for returns, which also covers full refunds without a return) shows as a negative value on the day it was processed.

With Kind in column C, Status in D, Amount in E, and Created At in F, October's refunds by refund date are =SUMIFS(E:E, C:C, "refund", D:D, "success", F:F, "2026-10*"). Check the words your file uses in Kind and Status first. Shopify says this file holds captured payments only.

The order-date version keeps moving, since an order placed on October 30 can be refunded in November. Say October reads 3.5% on November 2 and 4.1% on December 1. Recalculate each month once, after a fixed wait such as 30 days, and note the export date.

How do you calculate it in Excel or Google Sheets?

Set up the sheet once:

  1. On a copy of the export, move test and canceled orders to the Left out tab.
  2. On a new tab called Work, paste 6 columns in this order: A Name, B Created at, C Financial Status, D Total, E Refunded Amount, F Source.
  3. Type First in G1, enter =COUNTIFS($A$2:A2, A2) in G2, and fill it down. It shows 1 on each order's first row, 2 on its second, and so on.
  4. Compare one fully refunded order in Shopify admin with its first row, and confirm what Total and Refunded Amount show before you trust the money version.

Then, for orders placed in October 2026:

  • Paid orders. =COUNTIFS(G:G, 1, B:B, "2026-10*", C:C, "paid") + COUNTIFS(G:G, 1, B:B, "2026-10*", C:C, "*refunded")
  • Orders with any refund. =COUNTIFS(G:G, 1, B:B, "2026-10*", C:C, "*refunded")
  • Refunded money. =SUMIFS(E:E, G:G, 1, B:B, "2026-10*")
  • Sales. =SUMIFS(D:D, G:G, 1, B:B, "2026-10*", C:C, "paid") + SUMIFS(D:D, G:G, 1, B:B, "2026-10*", C:C, "*refunded")

Divide refunded orders by paid orders, and refunded money by sales. For full refunds only, use "refunded" without the asterisk.

COUNTIFS and SUMIFS use only the rows that meet every condition, and their ranges must be the same size, so whole columns are simplest. In both Excel and Google Sheets, the asterisk is a wildcard for any characters: "*refunded" catches refunded and partially refunded, and "2026-10*" catches every Created at that starts with 2026-10. That works when Created at is text starting with the date. If your spreadsheet turned it into real dates, export one month at a time with Orders by date and drop the date condition.

How do you compare this month with last month?

Copy the formulas and change 2026-10 to 2026-09. Compare complete months, or export the same days of each month with Orders by date. On the order-date version, September has had an extra month to collect refunds, so October looks better until it catches up.

How do you find refund rate by sales channel?

Source is the export's closest thing to a sales channel: Shopify describes it as the order's source, for example web, draft order, or POS. Its sales reports name the channel or app the customer used instead (Draft Orders for sales that began as draft orders), so the words may differ. List the values in Source once and write down what each means for your store.

Then add the channel as one more condition. For web, refunded orders are =COUNTIFS(G:G, 1, B:B, "2026-10*", C:C, "*refunded", F:F, "web"), divided by the paid-orders formula with F:F, "web" added to both parts. SUMIFS works the same way.

With the same hypothetical October (your Source values may be spelled differently):

SourcePaid ordersWith a refundRefund rate
web1,004333.3%
pos14221.4%
draft order36616.7%
All channels1,182413.5%

Draft orders look alarming at 16.7%, but that's 6 orders. Show the count next to each channel's rate ("6 of 36") and watch 2 or 3 months before you act on a small channel.

Where Every Number fits

If you'd rather not rebuild this every month, upload the same CSV at everynumber.app/try. No account is needed: a file up to 10 MB becomes a dashboard in seconds and is deleted after 24 hours unless you save it. When one order spans several rows, as in this export, Every Number counts orders and rates by order number, once each. Every number has a receipt: its definition, the rows it used, and the rows it left out with the reason. See the Shopify orders export page and the orders and refunds example.

It isn't a live connection to Shopify. You upload an export, so the numbers are as fresh as your last one. If Shopify's own reports already answer your question, you don't need another tool.

Frequently asked questions

Does a partial refund count as a refunded order?

In the order version, yes. After a partial refund, Shopify changes the order's status to Partially refunded, and "*refunded" counts it. Show full refunds as a second number if your team cares about them. The money version counts each partial refund at its actual size.

Why doesn't my refund rate match Shopify's reports?

Shopify's help names several reasons. Test orders are in your export but not in its sales reports. Sales reports include returns, refunds appear in the Payments finance report, and reversals land on the day they were processed. A custom refund with no products refunded or restocked shows in the export but not in the Sales report. More causes are in why dashboard numbers don't match.

Should I divide by Total or Subtotal?

Total, in most cases. Shopify's Subtotal is before shipping and taxes, and a refund can include shipping fees, so dividing Refunded Amount by Subtotal can overstate the rate. Whichever you pick, write it into the definition.

What is a good refund rate for a Shopify store?

It depends on what you sell, your prices, and your channels, and none of the Shopify pages cited here publish a benchmark. Compare against your own last 3 to 6 months, by channel, with the same definition and waiting period. To track it weekly, see how to build a weekly KPI dashboard.

Sources

  1. Exporting orders — Shopify Help Center. Checked November 4, 2026.
  2. Understanding your order statuses — Shopify Help Center. Checked November 4, 2026.
  3. Refunding orders — Shopify Help Center. Checked November 4, 2026.
  4. Canceling orders — Shopify Help Center. Checked November 4, 2026.
  5. Placing a test order — Shopify Help Center. Checked November 4, 2026.
  6. Processing a test order — Shopify Help Center. Checked November 4, 2026.
  7. Sales reports — Shopify Help Center. Checked November 4, 2026.
  8. Sales discrepancies in Shopify Analytics — Shopify Help Center. Checked November 4, 2026.
  9. COUNTIFS function — Microsoft Support. Checked November 4, 2026.
  10. SUMIFS function — Microsoft Support. Checked November 4, 2026.
  11. COUNTIFS — Google Docs Editors Help. Checked November 4, 2026.
  12. SUMIFS function — Google Docs Editors Help. Checked November 4, 2026.
  13. COUNTIF — Google Docs Editors Help. Checked November 4, 2026.