
date and sessionCampaignName were never requested from GA4, so both came back empty on every row. A visit from Monday's Instagram campaign and a visit from Tuesday's organic traffic had the same key because both had a blank date and a blank campaign name. They merged into one row. The numbers added up to something, looked plausible, and were wrong. Fixing the dimensions on the GA4 side was straightforward once I identified it. But the campaign fields were still coming back empty more often than they should. That led me to a separate problem entirely: some Meta ad clicks were losing their UTM parameters through a redirect before hitting the landing page, so those sessions were arriving in GA4 with no campaign attribution at all. Fixing the redirect chain on the Meta side meant the campaign name and source fields started populating consistently.URL() constructor, with a ?-split fallback for URLs it won't parse. Dozens of near-duplicate rows collapsed into a clean page table.
Posted Feb 21, 2026
Every morning, a pilates studio's manager opened GA4 across three tabs to check traffic, cart drops, and bookings. One Slack message replaced that.