Full Answer
The technical reason is how GA4 processes UTM parameters. Every time a page loads with utm_ parameters in the URL, GA4 treats it as a new campaign entry point and starts a new session. This behaviour is by design for external traffic: when someone clicks a newsletter link, you want GA4 to credit that session to the newsletter. But when that same logic applies to an internal link — say, a banner on your homepage linking to a product page with utm_source=homepage — it restarts the session mid-visit and overwrites the original traffic source.
The downstream consequences are significant. First, session counts inflate because a single visit generates multiple sessions. Second, attribution fractures because the original source (the Facebook ad, the Google search, the email campaign) is replaced by internal labels that describe navigation, not acquisition. Third, conversion attribution becomes unreliable because the purchase is credited to the last internal UTM the visitor encountered rather than the external campaign that actually brought them to the site.
For WooCommerce stores running paid campaigns, this is particularly damaging. If a visitor arrives via a $3 CPC ad click but their conversion gets attributed to an internal banner, the ad platform never receives a conversion signal for that click. ROAS calculations undercount the campaign's true performance, and optimisation algorithms learn from distorted data.
The correct approach for tracking internal engagement is GA4 events — custom events attached to button clicks, banner impressions, and navigation actions. Events record what the visitor interacted with without overwriting where they came from.