WooCommerce Refund Tracking featured image

WooCommerce Refund Tracking: The Metrics Most Stores Miss

If you pull up your WooCommerce sales for last month and GA4’s revenue for the same month, the two numbers almost never match, and Google Analytics is usually the bigger one.

That gap isn’t a rounding error or a tag that fired twice. A large part of it is the refunds you issued that month, still sitting in GA4 as sales.

Google Analytics never finds out the money went back, because nothing tells it. So the gap grows with every refund you approve.

Refunds are a normal part of retail, and none of this means yours are too high — the gap just means the number you’re making decisions from is bigger than the money you kept. Closing it is a one-time job for most WooCommerce stores, and this guide covers both ways.

MonsterInsights is the best WordPress Analytics plugin. Get it for free!

In This Article:

Why Google Analytics Doesn’t Know About Your Refunds

The revenue number you see in Google Analytics is only as honest as the events it receives. When a customer buys, something fires; when you hand their money back, nothing does. That mismatch is the whole problem.

A purchase gets tracked because a browser is involved. The shopper lands on your order-confirmation page, a tag runs, and a purchase event heads to Google Analytics with the order total and items.

A refund has none of that. Days or weeks later, you open the order in your WordPress admin and click through the refund yourself, so there’s no page for a tag to fire on and no shopper’s browser to fire it.

WooCommerce handles its own side of this fine. A refunded order shows the returned line items, the refunded total, and a net payment of zero.

A refunded WooCommerce order with a red refunded quantity of minus one against each line item, a Refunded total of minus .00, and a Net Payment of  alt=

Google Analytics’ records don’t. Reversing a purchase there means sending a second event — a refund event carrying the same order ID — because the sale it already recorded can’t be edited.

And that only happens if something sends it. Nothing in WooCommerce or Google Analytics does.

When it comes to exact wording, Google Analytics has no concept of a return, only the refund that follows one, so “refund” is what you’ll see in every report.

If purchase tracking isn’t live yet, start with our guide to tracking eCommerce sales in Google Analytics.

What an Inflated Revenue Number Actually Costs You

Google Analytics revenue isn’t a vanity figure. It feeds most of the metrics you use to decide where your money goes.

For example, let’s start with return on ad spend (ROAS): revenue divided by what you paid for it. If revenue never comes down, ROAS is overstated by the size of your refunds, and your best-looking campaign may just be selling the thing people send back.

That gets expensive if you import Google Analytics key events into an ad platform: you’re teaching the algorithm to find more customers whose orders won’t stick.

Average order value (AOV) takes the same hit. AOV is revenue divided by orders, so revenue that never dropped makes every customer look more valuable than they were. Our guide to average order value in Google Analytics shows how that figure is built.

Product decisions are the quietest ones to get wrong. Restocking follows the top-products list, and that list ranks by gross sales — so the item with the heaviest returns can sit at the top.

No need to guess at your own gap — you already have the figure. Total your refunds for last quarter, and that’s how much of Google Analytics revenue for those months is money you no longer have.

The Bottom Line

Tracking refunds isn’t about lowering your refund rate. It’s about making sure every number built on revenue — ROAS, AOV, your top-products list — is built on money you actually kept.

See how WooCommerce conversion tracking fits together →

How to Check Whether Your Store Is Affected

Not knowing how far off your numbers are is the uncomfortable part, and you can settle it in five minutes. Nothing here changes a setting; you’re only reading reports.

Start in Google Analytics and open Reports, then Engagement, then Events. Widen the date range to 90 days or more and look for a row called refund. On a busy store, a few refunds a month can sit well below the fold.

If you can’t find it, build a quick blank exploration with Event name as the dimension and Event count as the metric. Set the filter to Event name exactly matches refund. You get one row or none, with nowhere for a low count to hide.

A GA4 free form exploration filtered to Event name exactly matches refund, returning a single refund row

No refund row means nothing has ever sent one. Check a full year before you conclude that, though, since a store with few refunds could simply have had a quiet quarter.

Next, add Refund amount and Refunds as metrics in a custom report or exploration. They appear in the picker either way, so what matters is whether they return anything but zero.

Then make it concrete: take a closed month, note your gross sales and total refunds from your WooCommerce reports, and compare GA4’s revenue for the same dates.

If GA4 is higher by roughly your refund total, you’ve confirmed it. The two rarely agree to the cent even in a well-tracked store, so you’re looking for a gap about the size of your refunds.

How to Send Refund Data to Google Analytics

Both routes below end in the same place: a refund event arriving in GA4 with the transaction ID of the original order. What separates them is how much of your week it costs, and who maintains it afterward.

Method 1: Automatically, with the MonsterInsights eCommerce Addon

Since WooCommerce refunds happen inside your WordPress admin, the most practical fix runs from there too.

MonsterInsights, the WordPress analytics plugin, has an eCommerce Addon that watches WooCommerce for refunds and sends the refund event to GA4 from your server, with no code to write.

To get the addon, you need a MonsterInsights Pro license or above, with MonsterInsights already authenticated with Google Analytics.

If WooCommerce tracking isn’t set up yet, our guide to setting up WooCommerce tracking in Google Analytics covers that groundwork.

With that in place, setup is one toggle. In your WordPress dashboard, go to Insights » Addons, find the eCommerce addon card, and switch it on.

The eCommerce addon card on the MonsterInsights Addons screen with its toggle switched on and a Pro badge

That’s the whole configuration. Nothing further to set in MonsterInsights, and nothing to change in Google Analytics.

From there it catches every refund you process. Refund one item and that item is what gets reported; refund the whole order and all of it does, along with the amount and the order it came from.

Before the addon is switched on, Google Analytics has no refund data at all. What it does is send the refund event that nothing else on your site sends — from your server, since a refund never touches a browser.

Each one carries the ID of the original order, so Google Analytics subtracts that amount from your revenue. Your totals come down by what you handed back, and the refund metrics in the next section stop returning zero — in Google Analytics, and in the MonsterInsights reports that read from it.

One expectation to set: this works from the day you switch it on. Refunds you processed last quarter aren’t sent retroactively, so the gap already sitting in your historical reports stays there. It just stops growing.

One thing to confirm first: this depends on MonsterInsights having a Google Analytics measurement ID, so if your Google Analytics connection isn’t live, nothing goes out. Once refunds are flowing, you can read them in Google Analytics, or on Pro in your WordPress dashboard.

Method 2: Manually, with the Measurement Protocol

The same refund event can be sent by hand, without a plugin — but this is the developer route, and it’s worth being blunt about that.

It means writing PHP that runs on your server, and maintaining it as your store and Google’s requirements change. It only makes sense if you or someone on your team already works in your site’s code.

If that’s not you, Method 1 does the same job. The rest of this section is still worth a skim, if only to see what that toggle is handling for you.

Google Analytics’ Measurement Protocol is an API that accepts Google Analytics events directly from your server, with no browser involved. That’s exactly what a refund needs, since the refund you issue in wp-admin never loads a page.

Start by creating an API secret. In Google Analytics, open Admin, then Data streams, then your web stream, then Measurement Protocol API secrets, and create one. Keep it alongside your measurement ID — both go in the request URL rather than the payload.

Next, hook the two WooCommerce actions that fire when a refund is processed: woocommerce_order_partially_refunded and woocommerce_order_fully_refunded. Your handler reads the refund, builds the event, and sends it.

The request itself is a single POST, sent to the same Google Analytics endpoint Method 1 posts to behind the scenes. Stripped to essentials, it looks like this:

POST https://www.google-analytics.com/mp/collect
     ?measurement_id=G-XXXXXXXXXX&api_secret=YOUR_SECRET

{
  "client_id": "1234567.7654321",
  "events": [{
    "name": "refund",
    "params": {
      "transaction_id": "3021",
      "value": 43.00,
      "currency": "USD",
      "items": [
        { "item_id": "woo-beanie", "quantity": 1 }
      ]
    }
  }]
}

The transaction_id has to match the ID sent with the original purchase, or Google Analytics has nothing to reverse. The items array is what came back — every refunded item for a full refund, only the returned ones for a partial.

Two things make this harder than it looks. The first is client_id. A refund has no browser attached, so your code needs the buyer’s client ID stored back at purchase time. Invent one and you break the link to their original session.

The second is timing. Google says events should arrive within 48 hours of the original client-side event to be joined with browser-collected data — and refunds routinely land weeks after the sale.

None of that makes the manual route wrong; plenty of stores run it happily. It does make it a build-and-maintain project rather than a setting you switch on.

The Refund Metrics Most Stores Never Look At

Once refund events are arriving, GA4 opens up metrics you’ve never had a reason to touch. They move you from “my revenue is lower than I thought” to “this product is the reason.”

There are exactly three, and knowing their names saves a lot of hunting through the metric picker:

  • Refund amount — the total amount from refunds given on your site or app. It’s event-scoped, and GA4 fills it from both the refund and app_store_refund events, so on a web-only store it’s your refund events alone.
  • Refunds — the count of refund events your store has sent. A count, not a money figure, so it reads best as a trend line.
  • Item refund amount — the item-scoped one, and the only place in GA4 where refunds break out by product. It’s a money amount, not a count of items. Test it against a refund you already know about: it only fills in when your refund events carry item detail, and an empty column doesn’t mean you had no refunds.
GA4's Select metrics panel searched for refund, listing three Ecommerce metrics: Item refund amount, Refund amount, and Refunds

The two things store owners want next — refund rate and refunds by product — aren’t metrics at all. They’re views you assemble from the three above.

Refund rate comes with a trap. GA4’s Transactions metric counts refunds alongside purchases and subscription renewals, so a single refunded order registers as two. Your WooCommerce order count is the cleaner denominator.

One thing worth knowing: GA4’s Item revenue, Total revenue and Purchase revenue all deduct refunds. What none of them can deduct is a refund you never sent.

Refunds by product is the view you’ll likely want most often, and GA4 makes you assemble it yourself each time you need it. If your store runs MonsterInsights Pro, its eCommerce reports build that breakdown for you inside WordPress.

You’ll find it in your WordPress admin under Insights » Reports, in the eCommerce dropdown, on the Refunds report. It opens on two tabs, Total Refunds and Refund Amount, above a trend graph for the dates you’ve selected.

Below that graph is the Products Refunded table. It lists each product alongside its Items Sold, Refunds, % of Total Refunds, Revenue Refunded, and % of Refunded Revenue, and closes with a totals row.

The MonsterInsights Refunds report's Products Refunded table, listing each product with its items sold, refunds, percentage of total refunds, revenue refunded, and percentage of refunded revenue

A companion report, Refunds by Geo, breaks refunds and refund amount out by country if you want to see whether returns cluster in one market.

GA4 is still where you’d cross refunds against channels or campaigns; the dashboard just saves you building the product view by hand.

Worth Knowing

GA4 has three refund metrics: Refund amount, Refunds, and Item refund amount. Refund rate and refunds by product are views you build from those — and all of them stay empty until the refund event starts arriving.

See which eCommerce numbers are worth watching weekly →

What to Do With Refund Data Once You Have It

A refund total on its own just makes your revenue chart shorter, which isn’t much of a payoff. The value is in what it points at: usually a product, a product page, or a traffic source.

The first read is product quality. An item taking an outsized share of refunds relative to what it sells is telling you something your reviews aren’t — readable in Item refund amount where it populates, and in your own refund records where it doesn’t. Our guide to tracking your best-selling products pulls the other half.

The second read is usually the product page rather than the product. An item that comes back for fit, or arrives plainer than its photos suggested, is a description problem — and a size chart costs far less than discontinuing something that sells well.

The third read is where the traffic came from, and it’s the one that changes budgets. Break refunds down by channel and you see which sources send buyers who keep what they bought. Our guide to which sources actually bring revenue pairs well with that view.

The one caution I’d offer is patience. Refund data is thin by nature, and a handful of returns isn’t a pattern, so give it a full quarter before you pull a product or cut a channel.

There’s also a one-time job worth doing now the numbers are right. Anything you decided on the inflated figures — the campaign you scaled, the product you restocked because it topped the sales list — was decided on revenue that included money you’d given back. Those calls are worth a second look with the refunds netted out.

Send WooCommerce Refunds to GA4 Without Writing Code

The eCommerce Addon in MonsterInsights Pro tracks your WooCommerce purchases and your refunds in GA4, sending the refund event from your server for you — so you don’t need Measurement Protocol code or an API secret.

Get MonsterInsights Pro

FAQs About WooCommerce Refund Tracking in GA4

Does GA4 track WooCommerce refunds automatically?

No. GA4 only knows about a refund if something sends it a refund event pointing at the original order. Neither WooCommerce nor GA4 does that on its own, so until you add something that does, every refund you’ve processed still counts as revenue.

Why aren’t my WooCommerce refunds showing in GA4?

Because refunds don’t happen in a browser. You issue them in your WordPress admin, where there’s no page load for a tracking tag to fire on. The refund has to be sent from your server instead — by a plugin, or by custom code using Google’s Measurement Protocol.

Why doesn’t my GA4 revenue match WooCommerce?

Untracked refunds are the most common structural reason, and the one that grows instead of staying flat. Consent choices, blocked scripts, and how your setup treats tax and shipping also move the numbers apart. A useful test: is GA4’s excess for a closed month roughly that month’s refunds?

Does GA4 subtract refunds from revenue?

Only once the refund event is arriving — before that, there’s nothing to subtract. Google documents Item revenue, Total revenue and Purchase revenue as all subtracting refunded transaction revenue. The catch is that they can only subtract a refund GA4 was told about.

Can you track returns in Google Analytics, not just refunds?

Not directly. GA4 has no concept of a return that hasn’t been refunded yet — the refund event is the only part of the process it models. Return requests, approvals and items in transit live in WooCommerce or your returns tool.

Are partial refunds tracked in GA4?

Yes. A partial refund uses the same refund event as a full one; the difference is only which items it lists — all of them for a full refund, just the returned ones for a partial.

Is refund rate a GA4 metric?

No. GA4 gives you Refund amount, Refunds and Item refund amount; refund rate is something you calculate. Watch the denominator: GA4’s Transactions metric counts refund events alongside purchases, so a refunded order registers as two. Use your WooCommerce order count instead.

That’s it! I hope this article helped you get your GA4 revenue number lined up with the money your store kept. If you liked this article, check out the following beginner-friendly guides:

Follow us on Twitter, Facebook, and YouTube for more Google Analytics tips.

How useful was this post?

Click on the stars to rate

Average rating 0.0/5

Want to Try MonsterInsights for Free?

Enter the URL of Your WordPress website to install MonsterInsights Lite.