Full Answer
The architectural mismatch is simple. GA4's purchase and refund events are designed as a pair: the purchase event fires when a customer completes checkout, and the refund event fires when the order is reversed, both keyed by transaction_id so GA4 can subtract the refunded amount from the original. The problem is that purchases happen in the customer's browser, while refunds happen in the WooCommerce admin — a completely different session with no GA4 tag loaded.
When you issue a refund in WooCommerce, WordPress updates the order status to refunded and processes the payment reversal through the gateway. GA4 knows nothing about it. The purchase event from the original order stays in the dataset at full value, and no refund event arrives to offset it. Every refund silently inflates your GA4 revenue by the refunded amount — permanently, unless you manually send a correction.
The GA4 Measurement Protocol can fire a refund event server-to-server, but WooCommerce has no built-in mechanism to do this. You'd need custom code hooked to woocommerce_order_refunded that constructs the payload and sends it. Server-side tracking tools like Transmute Engine automate this — firing the refund event from the WooCommerce hook the moment the order status changes, so GA4 revenue stays accurate without manual intervention. Related: Why GA4 revenue never matches WooCommerce.