How to Use GA4 for Marketing in 2026: The Complete Guide
Ishant
Published : January 28, 2023 at 5:03 pm
Updated : June 23, 2026 at 4:37 pm
Ishant
Ishant Sharma is the Founder and CEO of Hustle Marketers, a Google Partner digital marketing agency. With 12+ years of experience in Google Ads, Meta Ads, SEO, and e-commerce PPC, he has helped 2500+ brands generate $780M+ in trackable revenue. Upwork Top Rated Plus with 99% Job Success Score. Ishant Sharma is the digital marketing specialist, not the Indian cricketer of the same name.

Most marketers install GA4, check the dashboard once, and assume it’s working. It isn’t. GA4 installed is not GA4 configured, and the gap between the two is where real measurement gets destroyed. Wrong Reporting Identity understates your user base by 30%. Personalized Advertising toggled off means your remarketing audiences never reach Google Ads. No cross-domain tracking means a payment gateway kills attribution on every order. This guide covers how to actually use GA4 for marketing in 2026: setup, attribution, cross-channel reporting, audience building, exploration reports, Meta and Bing discrepancies, and the newest features that changed how everything works.
What Is GA4 and How Is It Different from Universal Analytics?
GA4 is Google’s current analytics platform. Universal Analytics stopped processing data in July 2023, so if you’re still referencing UA reports, you’re working from dead data. GA4 isn’t a visual upgrade of UA. It’s a completely different measurement system built around events instead of sessions.
In UA, every visit created a session, and hits happened inside that session. In GA4, every interaction is a discrete event: a page view is an event, a scroll is an event, a purchase is an event. There are no “goals” anymore. The equivalent is called a key event, which is any event you’ve marked as important to your business.
The engagement metric changed too. UA counted bounce rate, which measured sessions where someone left without taking action. GA4 replaced it with engagement rate, which counts sessions lasting at least 10 seconds, sessions with a second page view, or sessions containing a key event. Engaged session rate is a far more useful signal than bounce rate ever was.
| Feature | Universal Analytics | GA4 |
|---|---|---|
| Measurement model | Session-based | Event-based |
| Key engagement metric | Bounce rate | Engagement rate |
| Conversion terminology | Goals | Key Events (GA4) and Conversions (Google Ads) |
| Attribution default | Last non-direct click | Data-driven cross-channel |
| Cross-device tracking | Limited, cookie-based | Google Signals and User ID |
| Funnel reports | Rigid, preset | Flexible funnel exploration |
| Predictive audiences | No | Yes, purchase probability and churn probability |
| Data retention default | 26 months | 2 months, must be extended to 14 manually |
| AI Assistant channel | No | Yes, native channel since May 2026 |
The GA4 Setup Checklist Most Marketers Never Complete
Installing the GA4 tag is step one. It’s not the finish line. These are the settings that actually determine whether your data is usable.
Step 1
Set data retention to 14 months
Admin > Data Settings > Data Retention. The default is 2 months. Change it immediately. You can’t recover data you didn’t retain. Explorations are capped to whatever window you’ve set, so a 2-month window destroys your ability to run cohort analysis or compare year-on-year.
Step 2
Enable Google Signals for all regions
Admin > Data Collection > Google Signals. This allows cross-device tracking by matching signed-in Google users across sessions. Without it, the same person visiting on mobile then desktop counts as two users. Your conversion rates look artificially low and your cohort data is unreliable.
Step 3
Check Reporting Identity
Admin > Property Settings > Reporting Identity. Set it to Blended. This mode uses User ID, device ID, Google Signals, and behavioral modeling to fill gaps from users who declined consent. Observed mode skips modeling. Device-based mode counts every device as a separate user, which inflates your user count and understates returning visitor rates.
Step 4
Set attribution model to Data-Driven
Admin > Attribution Settings. Data-driven is the default for new properties and it’s the right one. It uses machine learning to distribute conversion credit across touchpoints based on actual paths in your account. Extend the lookback windows to 90 days for both key events and purchases, especially if your sales cycle is longer than a week.
Step 5
Acknowledge data collection and enable personalized advertising
Admin > Data Collection: check the acknowledgment toggle. Then go to Admin > Product Links > Google Ads Links > select your linked account > turn on Enable Personalized Advertising. That second step is the one almost every account misses. Without it, your GA4 audiences exist in GA4 but show zero users in Google Ads.
Step 6
Implement Consent Mode v2
Required for any EEA traffic. The four parameters you need sending correctly are ad_storage, analytics_storage, ad_user_data, and ad_personalization. Verify them in GTM Preview mode under the Consent tab. Accept your own cookie banner and confirm all four flip to granted. If they don’t, your audiences won’t populate and your attribution data has gaps.
Key Events vs Conversions: What Changed in 2024 and Why It Matters
In March 2024, Google renamed what GA4 called “conversions” to “key events.” This wasn’t cosmetic. It created a two-layer system that still confuses a lot of marketers.
Here’s how it works now. Any event in GA4 can be marked as a key event by toggling the star icon in Admin > Events. Key events appear in GA4’s Engagement reports and give you a count across all traffic sources, organic, direct, paid, everything. They’re the measure of important user actions across your whole marketing mix.
A conversion is what happens when you import a key event into Google Ads. It keeps the label “conversion” in Google Ads and is what the bidding algorithm uses to optimize campaigns. The same purchase event can be both a key event in GA4 and a conversion in Google Ads at the same time.
The practical workflow
Track the event in GA4 > Mark it as a key event in Admin > Import it into Google Ads as a conversion if you want Smart Bidding to optimize against it. Only the key events that represent genuine business value should become Google Ads conversions. Micro-events like scroll depth or outbound clicks should stay as key events only, not conversions.
One more thing: don’t use GA4 key event imports as your primary Google Ads bidding signal. There’s up to a 3-day data delay when importing from GA4, which slows Smart Bidding learning. Use native Google Ads conversion tags as your primary signal. GA4 imports work well as secondary signals or for micro-conversions you want to observe.
How GA4 Attribution Works Across Every Channel
GA4’s attribution is cross-channel, meaning it looks at every touchpoint in the user journey, not just the last click and not just your Google Ads clicks. This is different from Google Ads attribution, which only considers touchpoints within Google Ads. They’re not the same report and shouldn’t be compared directly.
The default model in GA4 is Data-Driven Attribution. It uses machine learning and actual conversion path data from your property to assign fractional credit to each touchpoint. It factors in device type, number of ad interactions, the order of those interactions, creative types, and time from conversion.
| Attribution Model | How Credit Is Assigned | Best For |
|---|---|---|
| Data-Driven (default) | ML-based fractional credit across all touchpoints | Most accounts. Requires sufficient conversion volume. |
| Last click | 100% credit to the last touchpoint | Simple attribution, short sales cycles |
| First click | 100% credit to the first touchpoint | Understanding which channels create awareness |
| Linear | Equal credit across every touchpoint | Balanced view of all channels |
| Time decay | More credit to touchpoints closer to conversion | Longer consideration cycles |
| Position-based | 40% first, 40% last, 20% middle | When acquisition and close both matter equally |
The Advertising section in GA4 is where attribution data lives. Go to Advertising > Attribution > Conversion Paths to see the actual sequence of touchpoints users take before converting. This is the report that shows you if your Meta ads are assisting Google Search conversions, or if Paid Social sits at the top of almost every path even when it doesn’t close the sale. That information is worth more than any single-platform report.
How to Build GA4 Audiences From Specific Traffic Sources
GA4’s audience builder lets you segment users by the exact channel they came from and export those segments to Google Ads as remarketing lists. This is where GA4 stops being a reporting tool and starts being a targeting tool.
Users from Meta Ads who didn’t convert: In Admin > Audiences, create a custom audience where session source/medium contains “facebook / cpc” OR “instagram / cpc” AND key event count for purchase equals 0 in the last 30 days. These users clicked your Meta ad, visited, and left. Remarketing to them on Google Search with a direct-response message often converts at a fraction of cold traffic cost.
Organic search visitors who hit high-intent pages: Session default channel group equals Organic Search AND page_view event where page_location contains “/pricing” or “/buy” in the last 14 days. This is your near-purchase organic audience. Your SEO already paid for the acquisition. A well-placed remarketing ad closes the gap.
Predictive audiences: If your property has at least 1,000 returning users and 1,000 churned users in the past 28 days, GA4 unlocks purchase probability and churn probability predictions. The “likely 7-day purchasers” list is particularly powerful as an audience signal for Performance Max campaigns.
Important: GA4 audiences only push natively to Google Ads.
Meta, TikTok, and LinkedIn don’t receive GA4 audiences directly. To get GA4 behavioral segments into Meta, you need to export via BigQuery and upload as a custom audience or use a CDP. The minimum audience size to serve in most Google campaign types is 1,000 users.
GA4 Exploration Reports: What Each Type Is For
Explorations are GA4’s advanced analysis section and they were previously only available in the paid GA360 tier. They’re free in standard GA4 now. Most marketers open them once, feel lost, and go back to standard reports. That’s a mistake because standard reports show you averages. Explorations show you what’s actually happening.
Funnel Exploration shows you where users drop off in a defined conversion flow. For e-commerce, set it up as view_item > add_to_cart > begin_checkout > purchase. Apply a segment breakdown comparing mobile vs desktop users. If mobile drops 35% more at the checkout step, that’s a mobile UX problem, not a campaign problem. Those require different fixes.
Path Exploration answers the question of what users actually do before or after a key page. Set the end point to your purchase key event and look at the pages converters visited before buying. You’ll often find a comparison page, a shipping policy, or a specific blog post appearing consistently. Internal link those pages to the product and watch conversion rates move.
Cohort Exploration groups users by their acquisition week and shows how many return over subsequent weeks. Break it down by First user default channel group. If Organic Search users show 14% week-4 retention and Paid Social users show 4%, that’s a targeting quality signal worth acting on when you’re deciding where to put next month’s budget.
Segment Overlap shows how much two or three audiences share. Useful for finding users who both engaged with your content and added to cart but never purchased. That overlap is a high-value remarketing segment that standard reports won’t surface.
Meta Attribution Model Explained: Why Meta Always Shows More Conversions Than GA4
Meta’s attribution is fundamentally different from GA4’s, and understanding why is the only way to have a productive conversation with clients about platform data discrepancies.
Meta’s default attribution is 7-day click and 1-day view. That second part is what inflates the numbers. View-through attribution means: if someone sees your Meta ad without clicking it, and then converts within 24 hours, Meta counts that as its conversion. GA4 doesn’t track view-through at all. So when a user sees a Meta ad on Monday, googles your brand on Tuesday, and buys through organic search, Meta counts the conversion and GA4 attributes it to Organic Search. Both are technically correct under their own rules.
Meta’s attribution settings live at the ad set level. To find them: Ad Sets > Edit > Cost per Result Goal > Show More Options > Attribution Settings. The options available in 2026 are:
- 1-day click: Only counts conversions within 24 hours of a link click. Lowest inflation, good for flash sales and lead magnets.
- 7-day click: Counts conversions up to 7 days after a click. The right window for most e-commerce products that need a few days consideration.
- 1-day view: Counts conversions within 24 hours of seeing an ad without clicking. Almost always inflates results.
- 7-day click and 1-day view (default): Meta’s standard setting. Captures both click-driven and impression-influenced conversions.
- Incremental attribution (2025): Uses holdout testing to measure only conversions that wouldn’t have happened without the ad. More honest, but requires 50+ weekly conversions to work reliably.
For remarketing campaigns specifically: remove the 1-day view component entirely. Users who already know your brand are going to convert regardless. Crediting a view impression from a retargeting ad inflates ROAS substantially and gives you a misleading picture of what’s working.
The attribution setting also affects how Meta’s algorithm delivers your ads, not just how it reports. Switch from 7-day to 1-day click and the algorithm shifts to target users who convert immediately. For high-consideration products, that narrows your audience too aggressively and hurts scaling.
Why Your Google Ads, Meta, Bing, and GA4 Conversion Numbers Will Never Match
Every performance marketer has had this conversation. Google Ads says 120 conversions. Meta says 95. Bing says 40. GA4 says 60. The client asks which one is right. The answer: none of them is ground truth, and all of them are technically correct under their own measurement rules.
| Platform | Default Attribution | Click Window | View-Through | Typical Variance vs Actual |
|---|---|---|---|---|
| Google Ads | Data-Driven (within Google Ads only) | 30 days | 1 day Display, 3 days Video | +15 to 20% when modeled conversions active |
| Meta Ads | Last event within window | 7 days | 1 day (default on) | +26% vs analytics tools on average |
| Microsoft / Bing Ads | Last click (default) | 30 days | Configurable, off by default | +10 to 15% vs GA4 |
| GA4 | Data-Driven cross-channel | 90 days | Not tracked | 18 to 35% below actual for paid when cookies blocked |
| CRM / backend | None, records actual orders | N/A | N/A | Ground truth |
The gap has two parts. About a third of it is structural: each platform uses a different attribution philosophy and there’s no configuration that makes them agree. The other two thirds is a data collection gap. Around 31.5% of global users run ad blockers. Safari limits third-party cookies to 7 days. iOS ATT has reduced Meta’s ability to track Apple device conversions by 40 to 60%. These are real signal losses that server-side tracking and the Meta Conversions API (CAPI) can partially recover.
The framework that actually works for client reporting: use each platform’s native numbers to optimize that platform’s campaigns, use GA4 for cross-channel strategy, and use your CRM for business-level revenue truth. Document the ratio between platform-reported and CRM-reported conversions in month one. When that ratio suddenly changes, something broke. That’s far more useful than trying to reconcile absolute numbers every month.
Cross-Domain Tracking and Referral Exclusions: Two Different Problems
These get mixed up constantly. The choice depends on one question: do you own the other domain and does it have GA4 installed?
If you own the domain and GA4 is on it, you need cross-domain tracking. Set it up in Admin > Data Streams > Web Stream > Configure Tag Settings > Configure Your Domains. Add every domain that’s part of the same user journey. GA4 appends a _gl parameter to links between those domains, passing the user’s session and client ID across the hop. One measurement ID must be on all configured domains.
If you don’t own the domain (payment gateway like Stripe or PayPal, booking system, external form), you need a referral exclusion. Admin > Data Streams > Web Stream > Configure Tag Settings > List Unwanted Referrals. Add the gateway domain. GA4 will no longer count a return from that domain as a new referral session, preserving your original campaign attribution.
Common mistake that destroys attribution:
Adding your own domain to the referral exclusion list instead of configuring cross-domain tracking. It hides the self-referral symptom but doesn’t fix the underlying session break. GA4 still starts a new session when the user crosses domains, and your original traffic source gets replaced.
The New AI Assistant Channel in GA4: What It Tracks and What It Misses
On May 13, 2026, Google added “AI Assistant” to GA4’s Default Channel Group. No configuration needed. Sessions from recognized AI chatbots now get their own row in Acquisition reports, sitting alongside Organic Search, Direct, Paid Search, and Referral.
When GA4 detects a referrer matching a recognized AI source, it assigns the medium value “ai-assistant,” groups the session under the AI Assistant channel, and labels the campaign “(ai-assistant).” As of June 2026, the officially recognized sources are ChatGPT, Gemini, Deepseek, Copilot, and Grok.
What it misses: Perplexity is not on the official recognized list and still lands in Referral. AI traffic that arrives without a referrer header (copy-paste links, mobile apps, in-app browsers) goes to Direct. Google’s own AI Overviews click traffic is classified as Organic Search, not AI Assistant. And the channel isn’t retroactive: sessions before May 13, 2026 stay in whichever channel they originally landed in.
The fix for incomplete coverage: add a custom channel group in Admin > Data Settings > Channel Groups. Create a channel called “AI Assistants (custom)” with a session source regex rule that catches Perplexity, Mistral, Meta AI, and others. Place it above the Referral rule so it fires first. Run both the native channel and the custom group simultaneously.
GA4 Data Quality Settings You Probably Haven’t Touched
Internal traffic filter: Go to Admin > Data Collection > Define Internal Traffic. Add your office and agency IP addresses. Then Admin > Data Filters, create a filter to exclude traffic_type = internal. Critical note: leave it in Testing mode for 48 hours and verify it’s catching the right traffic in a free-form exploration before switching to Active. Data filters are permanent. Excluded data is gone from BigQuery too.
Content groups: If your reporting needs page category breakdowns (blog vs product vs category page), implement content groups via the content_group event parameter in GTM. UA had a built-in grouping system. GA4 doesn’t. Accounts that migrated from UA without recreating content groups are missing their entire content category reporting.
Enhanced Measurement review: Admin > Data Streams > Web Stream > Enhanced Measurement. The form_start and form_submit toggles have a high false-positive rate, firing on search bars and newsletter fields. If you have custom form tracking set up in GTM, turn these off. Duplicate or inflated form events will distort your key event counts and mess with any audience built around form interactions.
Annotations: GA4 brought annotations back in 2025. They appear as icons on time-series charts in the Reports section. Use them every time you publish a GTM container, change a consent banner, run a core algorithm update, or change your attribution settings. Anyone who doesn’t annotate these events spends hours every quarter trying to explain traffic changes they can’t tie to any known cause.
BigQuery Export: What You’re Missing Without It
GA4’s standard reports cap Explorations at 14 months of data and apply sampling on high-traffic properties. Standard reports hit a 50,000-row-per-day ceiling, causing low-frequency values to collapse into an “(other)” row. GA4’s BigQuery export has none of these limitations.
The export is free to enable. You pay Google Cloud’s standard BigQuery storage and compute costs, which typically run under $20 per month for mid-market traffic volumes. Enable it in Admin > Product Links > BigQuery Links. Choose Daily export. Data arrives the next day as events_YYYYMMDD tables.
What BigQuery unlocks that the GA4 UI never will: full unsampled data with no 14-month ceiling, SQL-based custom attribution models, joins with your CRM or order database by user ID or email, item-level e-commerce analysis across every order without hitting the (other) row, and cohort retention analysis beyond GA4’s 60-cohort cap.
For marketers, the most immediately valuable query is attribution analysis: create a CTE of session_start events with their source and medium, join it to conversion events by session ID, and you get raw conversion counts by traffic source without any of GA4’s pre-applied attribution model logic. That’s the unbiased baseline every cross-channel budget conversation should start from.
How to Install GA4 with Google Tag Manager: Step by Step
Google Tag Manager is the right way to deploy GA4 in almost every situation. Direct gtag.js installs work but they make future configuration changes harder, require developer access for every update, and have no built-in preview or testing layer. GTM gives you all of that. Here’s the exact setup.
Step 7
Create a GTM account and container
Go to tagmanager.google.com. Create an account with your business name and a container with your domain. Choose “Web” as the platform. GTM gives you two code snippets: a script tag for the <head> and a noscript iframe for right after <body>. Both need to go on every page of your site.
Step 8
Create the Google Tag (GA4 configuration tag)
In GTM, go to Tags > New. Choose Google Tag as the tag type. Enter your GA4 Measurement ID (format: G-XXXXXXXXXX, found in GA4 Admin > Data Streams > your web stream). Under Configuration Parameters, do not add anything yet. Set the trigger to Initialization – All Pages. Name it “Google Tag – GA4.” Under advanced settings, set the tag firing priority to 100. This ensures GA4 loads before any event tags fire.
Tag Type: Google Tag Measurement ID: G-XXXXXXXXXX Trigger: Initialization - All Pages Tag Firing Priority: 100
Priority 100 is critical. Without it, event tags may fire before the config tag, causing some events to not have session data or source/medium attribution.
Step 9
Create a GA4 Event tag template for all events
Go to Tags > New. Choose Google Analytics: GA4 Event. Select your Google Tag as the configuration tag. Leave the Event Name field as a variable that you’ll populate per event. Create an Event Settings Variable (Variables > New > Event Settings Variable) , this is where you’ll store parameters that should go on every event (like user_id if you’re implementing it, or custom dimensions). Set the trigger to All Pages for testing, then switch to specific triggers per event.
Step 10
Enable enhanced measurement in GA4
In GA4: Admin > Data Streams > your web stream > Enhanced Measurement toggle. Review what’s enabled. If you have custom form tracking set up in GTM, turn off Form Interactions. If you’re on a site with iframes or non-YouTube video players, turn off Video Engagement unless you’ve confirmed it works correctly on your setup.
Step 11
Test with GTM Preview before publishing
Click Preview in GTM. Open your site in the preview session. In the GTM preview panel, confirm your Google Tag fires on initialization. Check that page_view fires on every page. Go to GA4 Admin > DebugView and confirm events appear. Only publish the container once DebugView shows clean data with the correct source/medium attribution.
The Conversion Linker tag is required even if you’re only running GA4.
Add a Conversion Linker tag in GTM (Tag Type: Conversion Linker) triggered on All Pages. Without it, cross-domain attribution breaks and iOS 14.5+ users lose attribution. Set its firing priority to 99, just below your Google Tag at 100.
GA4 Event Types: Which Ones Fire Automatically and Which Ones You Have to Build
GA4 has four categories of events. Most implementations rely entirely on the first two and never build the third and fourth. That’s why most GA4 setups look functional but miss the data that actually matters for decisions.
| Event Type | Setup Required? | Examples | When to Use |
|---|---|---|---|
| Automatically collected | None | first_visit, session_start, user_engagement, page_view (basic) | These fire by default with any GA4 tag. Don’t modify or duplicate them. |
| Enhanced Measurement | Toggle in Admin (no code) | scroll, click (outbound), view_search_results, video_start, file_download, form_start, form_submit | Enable selectively. Disable form events if you have custom form tracking. |
| Recommended events | GTM tags or dataLayer push by developer | purchase, add_to_cart, begin_checkout, generate_lead, login, sign_up, view_item | Always use these for e-commerce and lead gen. Using Google’s naming unlocks pre-built reports. |
| Custom events | GTM tags or gtag.js code | video_quiz_complete, chatbot_opened, pricing_calculator_used, document_shared | Use when no recommended event name fits the action. These only appear in custom reports, not pre-built ones. |
The recommended events list matters more than most people realize. If you name your cart event “cart_add” instead of “add_to_cart,” GA4 won’t populate the Shopping Behavior or Purchase Journey reports with your data. You’ll have the event but no visual funnel. Always check Google’s recommended event names before creating a custom event name for a common action.
Custom event parameter limit: 25 for standard reports, unlimited for BigQuery.
GA4 supports up to 25 custom event parameters registered as custom dimensions (visible in standard reports). BigQuery export captures all parameters regardless of that limit. If you have more than 25 parameters, register the 25 most analytically important ones in Admin and track the rest exclusively through BigQuery.
How to Set Up GA4 E-commerce Tracking in GTM (With Full Data Layer Code)
GA4 e-commerce tracking requires a correctly structured dataLayer on your site. This is a developer task, not a GTM task. GTM reads the dataLayer and forwards the data to GA4. If the dataLayer is wrong, GTM can’t fix it. Get the developer to implement the dataLayer first, then configure GTM to read it.
The Critical Rule: Always Clear the ecommerce Object Before Every Push
Every dataLayer push for an e-commerce event must be preceded by a null push. Without it, GTM may read a stale ecommerce object from a previous event and send wrong product data.
// Always do this first
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null }); // clear previous ecommerce data
// Then push your event
window.dataLayer.push({
event: "add_to_cart",
ecommerce: {
currency: "USD",
value: 59.99,
items: [{
item_id: "SKU-123",
item_name: "Blue Running Shoe",
item_brand: "Nike",
item_category: "Footwear",
item_variant: "Size 10",
price: 59.99,
quantity: 1
}]
}
});The Complete E-commerce Event Sequence
| Event Name | When to Fire | Required Parameters | Common Mistake |
|---|---|---|---|
| view_item_list | Category page or search results loads | items (item_id, item_name, price, index) | Sending too many items (cap at visible items, not full catalog) |
| select_item | User clicks a product from a list | items (item_id, item_name), item_list_name | Not passing item_list_name, breaking list attribution |
| view_item | Product detail page loads | currency, value, items (item_id, item_name, price) | Missing currency parameter , revenue reports break |
| add_to_cart | User clicks Add to Cart | currency, value, items (with quantity) | Not clearing ecommerce: null first, stale product data sent |
| view_cart | User opens cart page | currency, value, items (all items in cart) | Skipping this event , breaks cart abandonment analysis |
| begin_checkout | User clicks Proceed to Checkout | currency, value, items, coupon (if applied) | Firing on cart page instead of actual checkout initiation |
| add_shipping_info | User completes shipping step | currency, value, items, shipping_tier | Often skipped , missing it means no shipping abandonment analysis |
| add_payment_info | User submits payment details | currency, value, items, payment_type | Often skipped , missing it hides payment method abandonment |
| purchase | Order confirmation page loads | transaction_id, value, currency, items, tax, shipping | Firing on page reload = duplicate transactions; no deduplication on transaction_id |
| refund | Refund processed (server-side via Measurement Protocol) | transaction_id, value, items (refunded items only) | Sending via browser instead of server , unreliable for backend-triggered refunds |
The Purchase Event DataLayer (The One That Breaks Everything When Wrong)
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "ORD-20260623-8841", // MUST be unique per order
value: 161.98, // revenue AFTER discounts, BEFORE tax/shipping
tax: 14.40,
shipping: 9.99,
currency: "USD",
coupon: "SAVE10", // order-level coupon if applied
items: [
{
item_id: "SKU-001",
item_name: "Blue Running Shoe",
item_brand: "Nike",
item_category: "Footwear",
item_category2: "Running", // up to item_category5 for hierarchy
item_variant: "Size 10",
price: 80.99, // price PER UNIT after item-level discount
quantity: 2,
coupon: "" // item-level coupon if different from order coupon
},
{
item_id: "SKU-002",
item_name: "Running Socks",
item_brand: "Nike",
item_category: "Accessories",
price: 9.99,
quantity: 2
}
]
}
});Duplicate purchase events kill your revenue data.
If your thank-you page can be refreshed or revisited, the purchase event will fire multiple times. Server-side deduplication via the transaction_id is recommended: before firing the event on the client, check a first-party cookie or sessionStorage flag. If the transaction_id has already fired in this session, don’t push it again. GA4 does not deduplicate on transaction_id automatically.
How to Set Up GA4 for Lead Generation: Custom Events That Actually Matter
Lead gen sites don’t have a purchase event. But they need the same level of conversion tracking depth. Here’s the event structure that gives you funnel visibility without an e-commerce implementation.
The Core Lead Gen Event Sequence
// 1. User lands on a key service page (track engagement, not just pageview)
window.dataLayer.push({
event: "page_engagement",
page_type: "service",
service_name: "google-ads-management"
});
// 2. User starts filling out a form (generate_lead is Google's recommended name)
window.dataLayer.push({
event: "form_start",
form_name: "contact-form",
form_location: "hero-section"
});
// 3. User submits the form , this is your key event
window.dataLayer.push({
event: "generate_lead",
form_name: "contact-form",
lead_type: "contact",
value: 50, // assign a monetary value to leads for ROAS calculation
currency: "USD"
});
// 4. User books a call (higher-intent action)
window.dataLayer.push({
event: "generate_lead",
form_name: "discovery-call-booking",
lead_type: "qualified_lead",
value: 150,
currency: "USD"
});Assigning a value to every lead type is non-negotiable if you’re using Smart Bidding. Google Ads Target ROAS bidding requires revenue data. Without a value parameter, the algorithm is optimizing for lead count, not lead quality. Set values based on your average lead-to-close rate and deal value. A contact form submit worth $50 and a booked call worth $150 will teach the algorithm to prefer higher-intent actions.
In GA4, mark generate_lead as a key event in Admin > Events. Import it into Google Ads as a conversion. Set the counting method to “Once per session” for form submits , a user who submits the same form twice in a session should count as one lead, not two.
How to Use GA4 DebugView to Verify Every Event Before It Goes Live
DebugView is the closest thing GA4 has to a real-time event inspector. Every event fires instantly and you can see every parameter, every value. It’s the tool you use after GTM Preview to confirm data is arriving in GA4 the way you expect.
To activate DebugView: in GTM Preview mode, it activates automatically. Outside of GTM Preview, add the Chrome extension “GA Debugger” or append ?_ga4_debug=1 to your URL. Then go to GA4 Admin > DebugView.
What to check for every event:
- The event name appears correctly (check for typos: “purchace” instead of “purchase” happens more than you’d think)
- The items array is populated for e-commerce events (click the event, look for the Items tab)
- source and medium are correct (if you see “direct” when you expected “google/cpc”, auto-tagging or UTMs are broken)
- user_id appears if you’ve implemented it (shows as a parameter on events for authenticated users)
- currency is present on all purchase and generate_lead events with value
- transaction_id is unique (refresh the purchase page and confirm the event doesn’t fire again)
DebugView only shows data from the device currently in debug mode.
It’s not a real-time view of all traffic. If you open a second browser tab in non-debug mode, those events won’t appear in DebugView. This is intentional. Always test in the same session you enabled debug mode.
Common DebugView Red Flags and Their Fixes
| What You See in DebugView | What It Means | How to Fix It |
|---|---|---|
| event fires but items array is empty | dataLayer ecommerce object not cleared before push, or items array built incorrectly | Add dataLayer.push({ecommerce: null}) before every ecommerce push; inspect window.dataLayer in browser console |
| source = “(direct)” on a paid click | Auto-tagging disabled, or gclid stripped by the landing page | Verify auto-tagging in Google Ads; check if CMS is stripping URL parameters; verify UTMs as fallback |
| purchase event fires twice on page load | GTM trigger firing on All Pages or tag not limited to thank-you page correctly | Add sessionStorage flag check before firing; tighten GTM trigger to URL path match |
| user_id shows as “undefined” | dataLayer push for user_id is firing after the Google Tag config tag | Move user_id push to server-rendered HTML before GTM snippet; or use gtag(‘set’, ‘user_id’, value) after login event |
| currency missing on purchase event | currency parameter not included in dataLayer push | Add currency to every event where value is sent; required for monetization reports to populate |
| No events appearing at all | GTM container not published, or wrong Measurement ID in Google Tag | Confirm GTM container is published; verify Measurement ID matches your GA4 property data stream |
GA4 Setup for E-commerce vs Lead Gen vs SaaS: What Changes
The core GA4 setup is the same across business types. What changes is which events you implement, what you mark as key events, and what you optimize Google Ads bidding against.
| Element | E-commerce | Lead Generation | SaaS / App |
|---|---|---|---|
| Primary key event | purchase | generate_lead | sign_up or trial_started |
| Revenue tracking | Automatic via ecommerce.value on purchase | Manual value assignment per lead type | Revenue via Measurement Protocol from backend on subscription activation |
| Funnel exploration | view_item > add_to_cart > begin_checkout > purchase | Landing page > form_start > generate_lead > qualified_lead | sign_up > onboarding_complete > feature_used > subscription_started |
| Most valuable audience for Google Ads | Past purchasers (lookalike) and cart abandoners (RLSA) | High-intent page visitors (pricing, services) who didn’t submit | Trial users who completed onboarding but haven’t upgraded |
| Cohort analysis focus | Repeat purchase rate and LTV by acquisition channel | Lead-to-contact rate; revisit rate from organic | Feature adoption rate; churn week by onboarding behavior |
| BigQuery join priority | CRM order data by transaction_id for returns/refunds | CRM lead data by form submission ID for close rate | Product DB by user_id for feature usage and MRR |
How to Create a GA4 Property From Scratch
Before any tracking setup, you need a GA4 property. If you’re migrating from UA it was created for you. If you’re starting fresh, here’s the exact path.
Step 12
Go to analytics.google.com and sign in
Click the admin gear icon at the bottom left. Under the Account column, confirm you’re in the right Google account. Under the Property column, click “Create Property.”
Step 13
Fill in the property details
Property name: use the client or site name, not “GA4.” Reporting time zone: set this to your business timezone. Get it wrong and your day-boundaries in reports will be off. Currency: set to your trading currency. Click Next.
Step 14
Choose your business details
Select the industry category that matches your client’s business , this affects which pre-built reports GA4 shows you by default. If you’re an agency, set the client’s industry here, not “advertising.” Business size and objectives can be set to whatever applies. Click Create.
Step 15
Set up a Web data stream
Choose Web. Enter the website URL (without https://). Name it clearly. Enable Enhanced Measurement toggle. Copy your Measurement ID (format: G-XXXXXXXXXX). This is what you’ll need for GTM or gtag installation.
Important: Set data retention to 14 months immediately after property creation.
The default is 2 months. Admin > Data Settings > Data Retention. You cannot recover data you didn’t retain. Do this before any traffic hits the property.
How to Install GA4 Without Google Tag Manager (gtag.js Direct)
GTM is recommended for most sites, but some setups don’t support it: strict content security policies, headless CMS platforms, or situations where a developer prefers to own the tracking layer directly. gtag.js works perfectly for those cases.
Add this code to the <head> section of every page, replacing G-XXXXXXXXXX with your actual Measurement ID:
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX');
</script>For authenticated users, add user_id to the config call:
gtag('config', 'G-XXXXXXXXXX', {
user_id: '{{YOUR_USER_ID_VARIABLE}}' // only when user is logged in
});For custom events, use gtag() directly after the snippet loads. Don’t place event calls above the config snippet , GA4 won’t process data from events that fire before configuration.
// Track a lead form submission
gtag('event', 'generate_lead', {
value: 50,
currency: 'USD',
form_name: 'contact-form'
});The main downside of gtag.js over GTM: every change requires a developer deploy. There’s no preview or testing layer. Changing a Measurement ID or adding a parameter means a code push. For most client work, GTM is worth the setup overhead.
How to Set Up GA4 on Shopify, WordPress, and WooCommerce
Each platform has its own GA4 implementation path. The right one depends on whether you need basic tracking or full e-commerce event data.
GA4 on Shopify
Shopify has a native Google and YouTube app that installs GA4 automatically. Go to Shopify Admin > Apps > Google and YouTube. Connect your Google account, link your GA4 property. This handles page views, sessions, and basic purchase tracking with no GTM required.
What Shopify’s native integration misses: it doesn’t track view_item, add_to_cart, begin_checkout, or add_to_wishlist. You only get the purchase event. For full funnel analysis, you need GTM on Shopify. Add GTM via your theme.liquid file (paste the GTM container code in <head> and after <body>), then build your e-commerce dataLayer in a custom theme snippet.
Shopify checkout is a separate domain (.myshopify.com) that you don’t fully control.
This breaks cross-domain tracking for standard Shopify plans. The purchase event fired in Shopify’s checkout may show as a new session in GA4 with source “direct.” The fix: add your primary domain and myshopify.com to GA4’s cross-domain tracking list (Admin > Data Streams > Configure Tag Settings > Configure your domains). Shopify Plus allows full GTM in checkout.
GA4 on WordPress (Without WooCommerce)
Two options: Site Kit by Google (Google’s official WordPress plugin) and manual GTM installation. Site Kit installs GA4 with a few clicks and shows basic GA4 data inside your WordPress dashboard. It works but doesn’t support custom event tracking or e-commerce.
For agencies managing WordPress clients, GTM is the right approach. Install GTM via the Insert Headers and Footers plugin or by editing the theme’s header.php directly. Paste both GTM code snippets. Then configure GA4 event tags in GTM the same way you would on any other site.
GA4 on WooCommerce
WooCommerce requires a dataLayer plugin to push e-commerce events. The recommended option is the free GTM4WP plugin (duracell.toth.hu). Install it, configure it in WordPress Admin > Settings > Google Tag Manager. Under Integrations, enable WooCommerce support. This automatically pushes view_item, add_to_cart, begin_checkout, and purchase events in GA4’s recommended schema.
Once the dataLayer is in place, you don’t need custom event tags in GTM. Create a single GA4 Event tag that uses “Send Ecommerce data” set to “Data Layer” , it reads the entire WooCommerce ecommerce object and forwards it to GA4 in one tag. Verify in GTM Preview that the items array contains item_id, item_name, and price before publishing.
How to Implement Consent Mode v2 in GTM (Full Code)
Consent Mode v2 isn’t just a setting to enable , it requires specific GTM configuration and a Consent Management Platform (CMP) integration. Here’s the exact setup.
The Four Parameters You Must Handle
| Parameter | What It Controls | If Denied |
|---|---|---|
| ad_storage | Advertising cookies (gclid, conversion tracking) | Google Ads conversion tracking disabled |
| analytics_storage | GA4 analytics cookies (client ID, session data) | GA4 tracks in limited mode, no session continuity |
| ad_user_data | Sending user data to Google for ad personalization | User excluded from GA4 remarketing audiences in Google Ads |
| ad_personalization | Personalized ads based on user behavior | Non-personalized ads only, no RLSA |
Step 1: Add Default Consent State in GTM
In GTM, go to Tags > New. Type: Custom HTML. Name it “Consent Initialization – Default.” Paste this code:
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
// Set default state to denied for EEA users (before consent banner fires)
gtag('consent', 'default', {
'ad_storage': 'denied',
'analytics_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'wait_for_update': 500 // wait 500ms for CMP to update before firing tags
});
// For non-EEA regions where consent is not legally required:
// gtag('consent', 'default', {
// 'ad_storage': 'granted',
// 'analytics_storage': 'granted',
// 'ad_user_data': 'granted',
// 'ad_personalization': 'granted',
// 'region': ['US', 'CA'] // US and Canada: granted by default
// });
</script>Set this tag’s trigger to: Consent Initialization – All Pages. Set firing priority to 999 (highest). It must fire before every other tag.
Step 2: Update Consent When User Accepts
Your CMP (OneTrust, Cookiebot, Usercentrics, etc.) fires a dataLayer event when the user grants consent. Listen for that event and update the consent state:
<script>
// This fires when user accepts marketing/analytics cookies
// The event name varies by CMP -- check your CMP documentation
// Common event names: OneTrustGroupsUpdated, cookie_consent_update, CookiebotOnAccept
gtag('consent', 'update', {
'ad_storage': 'granted',
'analytics_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted'
});
</script>Create this as a Custom HTML tag in GTM triggered by your CMP’s consent event.
Step 3: Verify in GTM Preview
Open GTM Preview. Go to your site. In the preview panel, click on any event tag and look for the “Consent” tab. You should see all four parameters in “Denied” state initially. Accept the cookie banner and check the same tab. All four should switch to “Granted.” If any stay denied after accepting, your CMP is not firing the update correctly , check the CMP’s GTM integration settings.
What happens with behavioral modeling when consent is denied.
With Consent Mode v2 active and analytics_storage denied, GA4 doesn’t track that user normally. Instead, GA4 models their behavior using similar consented users. For this modeling to activate, your property needs at least 1,000 daily events with analytics_storage denied for 7 consecutive days. Below that threshold, denied traffic is simply not counted. This is why EU-heavy properties can show 30-40% lower user counts than actual traffic.
How to Rename GA4 Events Without Code or GTM
GA4 lets you rename events, add parameters, or create entirely new events from existing ones directly in the Admin panel. No developer access, no GTM publish. This is one of the most underused features in GA4 and it solves a real agency problem: fixing a client’s wrong event naming after the fact.
Go to Admin > Data Display > Events > Create Event (to build a new event from an existing one) or Modify Event (to rename a parameter value or the event name itself).
Common Agency Use Cases
| Problem | Solution via Event Modification |
|---|---|
| Client’s developer named form submit “form_submitted” instead of “generate_lead” | Modify Event: rename form_submitted to generate_lead when condition matches. GA4 then treats it as the recommended event and populates lead reports correctly. |
| Purchase event fires but has wrong currency parameter (“GBP” instead of “USD”) | Modify Event on purchase: change currency parameter value from “GBP” to “USD.” Revenue reports correct from that point forward. |
| Need a new “high_value_page_view” event only when page contains “/pricing” | Create Event based on page_view with condition: page_location contains /pricing. No code needed. |
| Scroll event fires but need it only on blog pages, not all pages | Modify Event on scroll: add condition page_location contains /blog/. Scroll events from other pages won’t match and won’t count. |
Event modification applies going forward only , it’s not retroactive.
If you rename “form_submitted” to “generate_lead” today, historical data still shows form_submitted. The change takes effect on events received after you save it. For retroactive fixes, you need BigQuery and a data transformation layer.
GA4 Monetization Reports: Purchase Journey and Checkout Journey
Most guides send e-commerce clients straight to Explorations for funnel analysis. The Monetization section in standard reports has pre-built funnel visualizations that are faster to access and easier to share with clients.
In GA4’s left navigation: Reports > Monetization. You’ll see three key reports:
Overview: Revenue trend, top items by revenue, average purchase revenue. Quick health check for e-commerce accounts.
Purchase Journey: A visual funnel showing the drop-off from Session Start to View Product > Add to Cart > Begin Checkout > Purchase. This uses your actual e-commerce event data automatically , no configuration needed beyond having the events implemented correctly. The percentages shown are user-level (what percentage of sessions that started reached each step), not event-level.
Checkout Journey: Zooms into the final steps: Begin Checkout > Add Shipping Info > Add Payment Info > Purchase. If you’ve implemented add_shipping_info and add_payment_info, this report shows exactly where payment friction is occurring. Most implementations skip these two events. Without them, this report only shows Begin Checkout and Purchase with a 100% gap between.
These reports differ from Funnel Explorations in one important way: they can’t be segmented or customized. You can’t add a “Mobile only” comparison or filter by traffic source. For that depth, use Funnel Exploration. Use Monetization reports for fast client reporting and Explorations for diagnostic work.
How to Track TikTok and LinkedIn Ads in GA4
TikTok Ads in GA4
TikTok doesn’t have a native GA4 integration. All attribution depends on UTM parameters on your ad URLs. Use this UTM structure for every TikTok ad:
utm_source=tiktok
utm_medium=paid-social
utm_campaign={{campaign_name}}
utm_content={{ad_group_name}}
utm_term={{creative_name}}In GA4, TikTok traffic with these UTMs lands in the Paid Social channel group. To separate it from Meta, create a custom channel group (Admin > Data Settings > Channel Groups) with a rule that sets TikTok as its own channel when utm_source exactly matches “tiktok.”
TikTok’s own attribution uses a 7-day click and 1-day view window by default , the same structure as Meta. The same over-reporting logic applies: view-through conversions in TikTok Ads Manager won’t appear in GA4 at all. TikTok also uses its own click ID (ttclid) which GA4 doesn’t read natively, so cross-device attribution between TikTok clicks and conversions is weaker than Google Ads.
For improved TikTok conversion tracking, implement TikTok’s Events API (server-side equivalent of Meta’s CAPI). Send your GA4 purchase events to TikTok server-side so TikTok’s algorithm gets better optimization signal, even when the pixel fails on iOS.
LinkedIn Ads in GA4
LinkedIn has no native GA4 integration. UTM parameters are the only mechanism. LinkedIn auto-tags ads with its own click ID (li_fat_id) but GA4 doesn’t read it. Use manual UTMs:
utm_source=linkedin
utm_medium=paid-social
utm_campaign={{Campaign Name}}
utm_content={{Ad Name}}LinkedIn’s attribution default is a 30-day click window with a 7-day view window. The view-through window means LinkedIn Ads Manager will claim conversions from users who saw a LinkedIn ad in the past 7 days but clicked through any other channel. This is the same structural over-reporting problem as Meta, just with different window lengths.
For B2B clients running LinkedIn campaigns, the most honest cross-platform view comes from comparing LinkedIn’s last-click data, GA4’s Conversion Paths (which will show LinkedIn in assist positions), and your CRM’s actual lead source. LinkedIn typically shows 2-4x more conversions than GA4 attributes to it because of the 7-day view window on B2B decision cycles that often span multiple channels.
GA4 Standard vs GA4 360: The Limits That Actually Matter
Most agencies never need GA4 360. But when a client is large enough that standard limits start breaking their reporting, knowing the exact thresholds matters for setting expectations and making the upgrade case.
| Feature | GA4 Standard (Free) | GA4 360 |
|---|---|---|
| Event parameters per event | 25 | 100 |
| User properties | 25 per property | 100 per property |
| Key events | 30 | 50 |
| Audiences | 100 | 400 |
| Exploration query limit | 10M events per query | 1B events per query |
| Unsampled explorations | Not available | 20K tokens/day, 200K tokens/month |
| Data retention | Up to 14 months (select 38 months if available) | Up to 50 months |
| BigQuery export daily limit | 1M events/day | 20B events/day |
| Subproperties | Not available | Available (filter a parent property into sub-views) |
| Rollup properties | Not available | Combine multiple properties into one unified view |
| BigQuery Fresh Daily export | Not available | Available with completeness signal |
| SLA guarantee | No | Yes |
The practical trigger for 360 upgrade: when Exploration reports are consistently sampled, when you have more than 30 events you want to mark as key events, or when subproperties are needed to give separate teams their own filtered view of the main property. For most mid-market clients, standard GA4 with BigQuery export handles everything without 360.
GA4 Session Timeout: Why the Default Setting Affects Your Data
GA4 defines a session as a period of activity with no more than 30 minutes of inactivity. After 30 minutes without an event, the session ends. The next event starts a new session. This is the default and most sites never change it.
When to change it: content-heavy sites (news, documentation, long-form articles) where users read without clicking for extended periods. A reader spending 45 minutes on a guide gets counted as two sessions. Their engagement time is double-counted across two session_start events. This inflates your session count and makes session-level metrics (revenue per session, conversion rate) look artificially low.
Where to change it: Admin > Data Streams > your web stream > Configure Tag Settings > Adjust session timeout. You can increase the timeout up to 7 hours and 55 minutes. For most sites, 60 minutes is a reasonable adjustment if you’re seeing evidence of the split-session problem.
Where this causes the (not set) landing page problem: if a user leaves your site open in a browser tab for over 30 minutes and then scrolls (triggering a user_engagement event), a new session starts without a page_view event. GA4 then can’t determine a landing page for that session. The result is (not set) in your Landing Page dimension. You can’t eliminate this entirely, but increasing session timeout reduces how often it happens.
Want GA4 Set Up Correctly Across Every Client Account?
Most GA4 properties we audit have at least five of the issues in this post. Wrong Reporting Identity. Personalized Advertising off. Data retention at 2 months. No cross-domain tracking. No audiences built. We fix all of it as part of every account we onboard, and we run the 40-point audit every quarter to keep it clean.
Hustle Marketers is a Google Partner and Meta Business Partner agency. We’ve helped 2,500+ brands generate $780M+ in trackable revenue across Google Ads, Meta Ads, SEO, and white-label PPC. Our audits are free and worth $500.
GA4 and Looker Studio: Three Reports Every Client Account Needs
Looker Studio is GA4’s native visualization layer and it’s free. The GA4 connector exposes nearly every dimension and metric in the GA4 interface, plus the predictive metrics. You can blend GA4 data with Google Ads, Search Console, and YouTube Analytics in a single Looker Studio report without needing a third-party tool.
Executive dashboard: GA4 and Google Ads blended on Campaign Name. Sessions, engaged sessions, key event rate, conversions, cost, and ROAS in one view. Daily refresh. Client-facing with a read-only link so they stop emailing for weekly screenshots.
SEO report: GA4 and Search Console blended on Landing Page. Organic sessions, GSC impressions, clicks, CTR, average position, and key event conversions from organic. This is the report that shows which organic pages actually drive business, not just traffic. It replaces toggling between GSC and GA4 every time someone asks about SEO performance.
Cross-channel ROAS: GA4 with cost data import configured. Shows all channels, non-Google spend, revenue, and blended ROAS. Google expanded cost data import in June 2025 to support Google Sheets, BigQuery, Redshift, S3, Snowflake, and more. Set up a Google Sheet that auto-pulls Meta and Bing spend daily and connect it to GA4’s cost import. You get a live cross-channel ROAS view inside GA4 without a separate attribution platform.
The Complete GA4 Property Audit Checklist (Run This Every Quarter)
This checklist covers every setting, link, and report that separates a correctly configured GA4 property from one generating misleading data. Run it on every new account in the first week and on every existing account every quarter. Five failures here means your attribution, your audiences, and your bidding signals are all compromised.
Admin Settings
- Reporting Identity set to Blended (Admin > Property Settings > Reporting Identity)
- Data retention set to 14 months minimum (Admin > Data Settings > Data Retention)
- Google Signals enabled for all regions where paid campaigns are running
- Data Collection acknowledgment toggle checked (Admin > Data Collection)
- Attribution model set to Data-Driven cross-channel (Admin > Attribution Settings)
- Lookback window at 90 days for key events and purchases
- Internal traffic IP addresses defined with traffic_type parameter set
- Internal traffic data filter in Testing state, verified in DebugView before going Active
- Referral exclusions added for every payment gateway and pass-through domain
- Cross-domain tracking configured for all owned domains in the same user journey
- Enhanced Measurement reviewed: form_start and form_submit disabled if custom form tracking exists in GTM
Linking and Integrations
- Google Ads linked with Personalized Advertising toggle ON (this alone fixes most zero-audience problems)
- Auto-tagging verified active in the linked Google Ads account settings
- Search Console linked to the correct web data stream
- BigQuery linked with Daily export enabled
- Consent Mode v2 implemented and verified in GTM Preview mode under the Consent tab
Data Quality
- Consent Settings report reviewed in Admin: EEA signals for ad_user_data and ad_personalization both coming through correctly
- No unexpected (not set) values in source/medium beyond normal volume
- User ID not registered as a custom dimension (send at config level only, never as an event parameter)
- No payment gateway appearing as top referral source for key event conversions
- UTM parameters enforced on every non-Google paid URL: Meta, LinkedIn, TikTok, Bing
- No self-referrals from your own domain appearing in the Traffic Acquisition report
Key Events and Conversions
- Key event list audited: no micro-events (scroll, outbound click, file download) marked as key events
- Counting method correct: once per session for lead forms, once per event for purchases
- GA4 key events imported into Google Ads as secondary signals only (native Google Ads tag is still the primary signal for bidding)
- No duplicate events from Enhanced Measurement and custom GTM tracking firing on the same action simultaneously
Audiences
- At minimum three audiences built: all visitors (30-day window), high-intent page visitors, past converters
- Audience sizes verified in Google Ads Audience Manager, not just in GA4 (check for zeros)
- Source-specific audiences built: Paid Social non-converters, Organic high-intent visitors
- Predictive audiences enabled if eligible (needs 1,000+ return users and 1,000+ churned users in the past 28 days)
Reporting and Analysis
- Annotations added for all GTM publishes, consent banner changes, algorithm updates, and attribution setting changes
- Custom channel group created for AI assistant traffic: includes Perplexity and other sources not in GA4’s native list
- Content groups implemented via content_group event parameter if category-level page reporting is needed
- Funnel exploration built for your primary conversion flow and compared across mobile vs desktop segments
- Cohort exploration run monthly with week-4 retention broken down by First user default channel group
- Advertising > Conversion Paths reviewed quarterly to quantify Meta and Bing assist roles
- Cost data import configured for non-Google paid channels (Google Sheets connector for Meta and Bing at minimum)
- Looker Studio reports built: executive dashboard (GA4 and Google Ads blend), SEO report (GA4 and Search Console blend), cross-channel ROAS view
- Cross-platform attribution baseline delta documented: ratio of platform-reported to CRM-reported conversions per channel, set in month one
How to use this checklist
Any item that fails is a data quality issue affecting your campaigns right now. Reporting Identity wrong and data retention at 2 months are the two most common failures across accounts we audit. Fix Admin settings first, then linking, then data quality, then events, then audiences, then reporting. In that order.
Start Using GA4 Properly in 2026
GA4 installed without configuration isn’t analytics. It’s an expensive-looking gap in your data. Reporting Identity understating users, Personalized Advertising killing your audience exports, data retention at 2 months, no internal traffic filter, Meta view-through inflating ROAS, Bing disappearing into Direct traffic because UTMs aren’t enforced: any one of these quietly corrupts every decision you make with the data.
The good news is none of these fixes are technically complex. They’re mostly Admin settings and a few GTM configurations. The 40-point checklist in this guide covers everything. Run it on every new client account in the first week and on every existing account every quarter. The improvement in data quality shows up in campaign performance within 90 days because your bidding algorithms, your audiences, and your budget decisions are finally working from accurate signals.
Frequently Asked Questions About Using GA4 for Marketing
What is the difference between GA4 key events and conversions?
Key events are important actions tracked in GA4 across all channels. Conversions are key events imported into Google Ads for bidding. The same event can be both.
Why are my GA4 audiences showing zero users in Google Ads?
The most common cause is Personalized Advertising being toggled off in the Google Ads link settings. Enable it in Admin > Product Links > Google Ads Links.
Why does Meta show more conversions than GA4?
Meta includes view-through conversions by default. GA4 doesn’t track view-through at all. The same sale gets credited differently under each platform’s rules.
What is Reporting Identity in GA4 and which one should I use?
Reporting Identity controls how GA4 identifies users. Use Blended. It uses User ID, Google Signals, device ID, and behavioral modeling for the most complete user count.
Do I need to configure cross-domain tracking and referral exclusions?
Not both for the same domain. Use cross-domain tracking for domains you own with GA4 installed. Use referral exclusions for payment gateways and external tools you don’t control.
What is the new AI Assistant channel in GA4?
GA4 added a native AI Assistant channel in May 2026 that automatically classifies traffic from ChatGPT, Gemini, Deepseek, Copilot, and Grok into its own channel.
Should I use GA4 BigQuery export?
Yes if you need unsampled data, custom attribution analysis, or joins with CRM data. Setup is free. Storage costs typically run under $20 a month for mid-market traffic.
How do I track Meta and Bing traffic in GA4?
Add UTM parameters to every Meta and Bing ad URL. GA4 reads them and attributes sessions correctly. Without UTMs, Bing and Meta traffic lands in Direct or Referral.
I hope you enjoy reading this blog post. If you want my team to just do your marketing for you, click here.











