You process a refund in your system but GA4 doesn’t update the revenue figures. Your GA4 reports still show the original purchase revenue even after the refund. This is a known limitation of GA4’s eCommerce tracking that affects revenue accuracy and requires explicit implementation. Learn more in our guide on Cross-Domain Tracking GA4.

Why GA4 Doesn’t Auto-Track Refunds
GA4 records revenue when your purchase event fires. Refunds happen later, often days or weeks afterward. GA4 has no automatic mechanism to link a refund back to the original transaction — you must explicitly send a refund event. Learn more in our guide on GA4 Event Count Discrepancy.
The refund Event: GA4’s Native Approach
GA4 supports a native refund event. Send it when a refund is processed in your backend. The event reduces revenue in GA4 reports when implemented correctly. Key fields: transaction_id (matches original purchase), value (refund amount, positive number), currency, and optionally items array for partial refunds.
Full vs Partial Refunds
For a full refund, send the refund event with the same transaction_id and the full original value. For partial refunds, include the items array with only the refunded items and quantities. GA4 will subtract only those item values from revenue.

Sending Refunds via Measurement Protocol
Refunds typically happen server-side (your backend receives the refund trigger). Use the GA4 Measurement Protocol to send refund events from your server. This requires your GA4 Measurement ID and API secret from Admin → Data Streams → Measurement Protocol API secrets.
GA4 Refund Limitations
- No automatic reconciliation: GA4 doesn’t connect refunds to the original session or attribution. Revenue deduction happens but attribution credit doesn’t reverse.
- Historical data: Refunds sent today reduce today’s revenue, not the original purchase date’s revenue. This distorts daily revenue charts.
- BigQuery discrepancies: GA4’s BigQuery export may show revenue differently from the GA4 interface when refunds are involved.
- Refund window: GA4 processes refunds for transactions up to 60 days old. Older refunds can’t be applied.
Workarounds for Accurate Revenue Tracking
For businesses with significant refund rates, use BigQuery to calculate net revenue. Join your refunds table with GA4’s events table on transaction_id. This gives you accurate net revenue without relying on GA4’s native refund event limitations. Build a Looker Studio report from this BigQuery query instead of GA4’s native revenue metric.
Alternatively, integrate your refund data directly into GA4 using the Measurement Protocol immediately when refunds are processed, and accept that the revenue appears deducted on the refund date rather than the purchase date.