Full Answer
A mismatch between GA4 and your backend is normal, not a bug, because the two count different things. Your store records every completed order. GA4 records only the orders whose tracking event survived the trip from the browser to Google, and a lot does not survive. Ad blockers remove the GA4 script for a sizeable share of visitors, Safari's Intelligent Tracking Prevention truncates measurement, consent rejections in privacy regions suppress events, and routine script or network failures lose more. Stacked together, these explain why client-side capture commonly lands around 70 to 85% of true sales.
The right first move is measurement, not panic. Pull total orders from WooCommerce or Shopify for a period and divide GA4's recorded purchases by that number to get your capture rate. Around 70 to 85% is normal for client-side; below 70% signals a real problem worth investigating, such as a missing transaction_id or events not firing on the confirmation page.
To close the gap rather than just measure it, send purchases server-side through the Measurement Protocol. Because the event originates on your server, it bypasses browser blocking entirely and typically pushes capture into the 85 to 95% range. Perfect parity is impossible, but a measured, server-supported setup turns an alarming discrepancy into a known, stable number you can plan around.