This guide covers everything you need to do after installing the CiviCRM DataLayer extension to get GA4 funnel tracking working on your CiviCRM contribution pages and event registrations. If you are not familiar with the extension yet, start with our overview blog post first. This guide covers extension configuration, Google Tag Manager setup, Google Analytics 4 custom dimensions, and building the exploration reports that make the data useful.
Before You Start
You will need:
- The CiviCRM DataLayer extension installed and enabled (
com.skvare.datalayer) - Editor or higher access to your GTM container
- Editor or higher access to your GA4 property
- Your GA4 Measurement ID (format: G-XXXXXXXXXX) — find this in GA4 under Admin > Data Streams > your stream
- Your GTM Container ID (format: GTM-XXXXXXX)
Part 1: Extension Configuration
Global Settings
Navigate to Administer > System Settings > DataLayer Settings.
Google Tag Manager
Enter your GTM Container ID in the GTM Container ID field. When set, the extension automatically injects the GTM header and noscript body snippets on all tracked contribution and event pages. Leave this blank if you manage GTM placement yourself through your theme or CMS.
Master Control
Enable DataLayer Extension is the global on/off switch. Disabling it stops all dataLayer pushes on CiviCRM pages regardless of any other settings. Leave this checked.
Entity-Type Controls
These toggles enable or disable tracking for entire entity types. Individual pages and events can still override these via their own DataLayer tab.
| Setting | Description |
| Enable for Contribution Pages | When unchecked, all dataLayer pushes for every contribution page are suppressed |
| Enable for Event Registrations | When unchecked, all dataLayer pushes for every event registration are suppressed |
| Enable for Event Info Pages | Pushes a civicrm_view_item event when a visitor lands on the public Event Info page before clicking Register |
Event Tracking Controls
These are the global defaults for which GA4 event types are pushed. Individual pages and events can override each toggle independently.
| Setting | Description |
| Push civicrm_view_item events | Fires on the first page of a contribution flow or event registration, and on the Event Info page when enabled |
| Push civicrm_begin_checkout events | Fires when the contributor or registrant submits the first step and moves deeper into the funnel |
| Push civicrm_purchase events | Fires on the Thank You page after a successful contribution or event registration, includes ecommerce block with line items |
| Push civicrm_registration_step events | Fires once for each additional participant form step in multi-participant event registrations |
Behavior Settings
| Setting | Description |
| Exclude test transactions from all pushes | When checked, no dataLayer pushes occur for any transaction where is_test = true. Individual entities can override this. |
| JS variable name | The JavaScript variable pushed to. Default is dataLayer. Change only if your GTM container uses a custom variable name. |
| Debug mode | Writes each push to the browser console. Disable on production. |
Click Save Settings.
Per-Page and Per-Event Overrides
Each contribution page and event has a dedicated DataLayer tab in its management screen. This lets you override global settings for that specific page or event without affecting anything else.
For a contribution page: Go to Administer > CiviContribute > Manage Contribution Pages, find your page, click its name, then click the DataLayer tab.
For an event: Go to Administer > CiviEvent > Manage Events, find your event, click its name, then click the DataLayer tab.
The DataLayer tab is hidden when the global master switch is off.
DataLayer Status
Controls whether this page or event is tracked at all.
| Option | Description |
| Inherit global setting | Follows the master control and entity-type toggle from global settings |
| Enabled (override global) | Forces tracking on even if the entity type is globally disabled |
| Disabled (override global) | Suppresses all pushes for this page or event regardless of global settings |
Contribution and Event Tracking Overrides
Each tracking toggle (view_item, begin_checkout, purchase, registration_step) can be set to Inherit, Enabled, or Disabled at the individual contribution page or event registration page. Leave as Inherit unless this page or event needs different behavior from the global defaults.
Test Transaction Behavior
Override whether test-mode transactions generate dataLayer pushes for this specific contribution page or event.
Part 2: GTM Variables
Variables are how GTM reads data from the CiviCRM extension. Think of them as named slots that hold values from the dataLayer like the page title, campaign name, or transaction amount.
Create the GA4 Measurement ID Variable
Create this first so you can reuse it across all four tags.
- In GTM, go to Variables > New
- Choose Constant
- In the Value field, enter your GA4 Measurement ID (format: G-XXXXXXXXXX)
- Name it
const - GA4 Measurement ID - Save
Create the Block Test Traffic Toggle Variable
This variable lets you control whether test transactions reach GA4 without editing every tag.
- In GTM, go to Variables > New
- Choose Constant
- In the Value field, enter
true - Name it
const - Block Test Traffic - Save
When set to true, test transactions are blocked from reaching GA4. When set to false and republished, test transactions flow through. See Part 3 for how this is used in tag exceptions.
Create the DataLayer Variables
Create one variable for each row in the table below. Repeat this process for all 23 variables.
How to create each variable:
- In GTM, go to Variables in the left menu
- Under User-Defined Variables, click New
- Click the pencil icon in the Variable Configuration box
- Choose Data Layer Variable
- Enter the Data Layer Variable Name exactly as shown in the table
- Make sure Data Layer Version is set to Version 2
- Leave Set Default Value unchecked
- Click Save
- Name the variable exactly as shown in the Variable Name column
- Click Save again
| Variable Name | Data Layer Variable Name |
| dlv - civicrm entity_type | civicrm.entity_type |
| dlv - civicrm page_id | civicrm.page_id |
| dlv - civicrm page_title | civicrm.page_title |
| dlv - civicrm event_id | civicrm.event_id |
| dlv - civicrm event_title | civicrm.event_title |
| dlv - civicrm financial_type | civicrm.financial_type |
| dlv - civicrm event_type | civicrm.event_type |
| dlv - civicrm campaign_id | civicrm.campaign_id |
| dlv - civicrm campaign_title | civicrm.campaign_title |
| dlv - civicrm is_test | civicrm.is_test |
| dlv - civicrm entry_point | civicrm.entry_point |
| dlv - civicrm frequency_unit | civicrm.frequency_unit |
| dlv - civicrm frequency_interval | civicrm.frequency_interval |
| dlv - civicrm installments | civicrm.installments |
| dlv - civicrm flow_type | civicrm.funnel.flow_type |
| dlv - civicrm step_name | civicrm.funnel.step_name |
| dlv - civicrm step_number | civicrm.funnel.step_number |
| dlv - civicrm total_steps | civicrm.funnel.total_steps |
| dlv - civicrm has_confirm_page | civicrm.funnel.has_confirm_page |
| dlv - civicrm additional_participant_count | civicrm.funnel.additional_participant_count |
| dlv - civicrm ecommerce value | civicrm.ecommerce.value |
| dlv - civicrm ecommerce currency | civicrm.ecommerce.currency |
| dlv - civicrm ecommerce items | civicrm.ecommerce.items |
Note: The GTM variable name (for example civicrm.funnel.additional_participant_count) is the path GTM uses to read the value out of the dataLayer object. What you register in GA4 is the shorter parameter name you will type in the tag's Event Parameters table (for example additional_participant_count). These are different things used at different stages of the data flow.
Part 3: GTM Triggers
Triggers tell GTM when to fire a tag. Each trigger listens for a specific event name coming from the CiviCRM extension.
How to create each trigger:
- Click Triggers in the left menu
- Click New
- Click the pencil icon in the Trigger Configuration box
- Choose Custom Event
- Enter the Event Name exactly as shown below
- Leave Use Regex Matching unchecked
- Under This trigger fires on, select All Custom Events
- Click Save
- Name the trigger exactly as shown below
- Click Save again
| Trigger Name | Event Name |
| civicrm_view_item | civicrm_view_item |
| civicrm_begin_checkout | civicrm_begin_checkout |
| civicrm_purchase | civicrm_purchase |
| civicrm_registration_step | civicrm_registration_step |
Event names are case-sensitive. Type them exactly as shown.
Part 4: GTM Tags
Tags send data to GA4. Each tag fires when its trigger detects the matching CiviCRM event and passes along the variable values as event parameters.
Tag Exception Setup
If not using the setting on the CiviCRM extension page, every tag needs an exception to block test transactions from reaching GA4 by default. This uses the const - Block Test Traffic variable you created in Part 2.
Adding the exception to each tag:
After selecting the trigger for your tag:
- Click the + icon next to Exceptions
- Click + to create a new trigger
- Choose Custom Event
- Enter the event name for whichever tag you are working on (for example
civicrm_view_item) - Under This trigger fires on, select Some Custom Events
- Set the condition:
dlv - civicrm is_testequals{{const - Block Test Traffic}} - Name the exception trigger
civicrm_[event] - test traffic(for examplecivicrm_view_item - test traffic) - Save and apply as the exception
Turning Test Traffic On and Off
To allow test transactions through to GA4:
- In GTM, go to Variables
- Open
const - Block Test Traffic - Change the Value from
truetofalse - Save
- Click Submit to republish the container
To block test transactions again:
- In GTM, go to Variables
- Open
const - Block Test Traffic - Change the Value from
falsetotrue - Save
- Click Submit to republish the container
When const - Block Test Traffic is set to true, any transaction where is_test is also true matches the exception and gets blocked. When you change the constant to false and republish, no test transaction can match the exception and they flow through to GA4.
How to Create Each Tag
- Click Tags in the left menu
- Click New
- Click the pencil icon in the Tag Configuration box
- Choose Google Analytics: GA4 Event
- In the Measurement ID field, click the puzzle piece icon and select
{{const - GA4 Measurement ID}} - Enter the Event Name as shown below
- Under Event Parameters, click Add Row for each parameter in the table
- Type the parameter name in the left column
- Click the puzzle piece icon in the right column and select the matching variable
- Scroll down to Triggering, click the pencil icon and select the trigger listed below
- Add the tag exception as described above
- Name the tag as shown below
- Click Save
Tag 1: CiviCRM - view_item
Event name: view_item Trigger: civicrm_view_item
| Parameter Name | Variable |
| entity_type | {{dlv - civicrm entity_type}} |
| page_id | {{dlv - civicrm page_id}} |
| page_title | {{dlv - civicrm page_title}} |
| event_id | {{dlv - civicrm event_id}} |
| event_title | {{dlv - civicrm event_title}} |
| financial_type | {{dlv - civicrm financial_type}} |
| event_type | {{dlv - civicrm event_type}} |
| campaign_id | {{dlv - civicrm campaign_id}} |
| campaign_title | {{dlv - civicrm campaign_title}} |
| entry_point | {{dlv - civicrm entry_point}} |
| is_test | {{dlv - civicrm is_test}} |
| flow_type | {{dlv - civicrm flow_type}} |
| step_name | {{dlv - civicrm step_name}} |
| step_number | {{dlv - civicrm step_number}} |
| total_steps | {{dlv - civicrm total_steps}} |
| has_confirm_page | {{dlv - civicrm has_confirm_page}} |
Tag 2: CiviCRM - begin_checkout
Event name: begin_checkout Trigger: civicrm_begin_checkout
| Parameter Name | Variable |
| entity_type | {{dlv - civicrm entity_type}} |
| page_id | {{dlv - civicrm page_id}} |
| page_title | {{dlv - civicrm page_title}} |
| event_id | {{dlv - civicrm event_id}} |
| event_title | {{dlv - civicrm event_title}} |
| financial_type | {{dlv - civicrm financial_type}} |
| event_type | {{dlv - civicrm event_type}} |
| campaign_id | {{dlv - civicrm campaign_id}} |
| campaign_title | {{dlv - civicrm campaign_title}} |
| frequency_unit | {{dlv - civicrm frequency_unit}} |
| frequency_interval | {{dlv - civicrm frequency_interval}} |
| installments | {{dlv - civicrm installments}} |
| is_test | {{dlv - civicrm is_test}} |
| flow_type | {{dlv - civicrm flow_type}} |
| step_name | {{dlv - civicrm step_name}} |
| step_number | {{dlv - civicrm step_number}} |
| total_steps | {{dlv - civicrm total_steps}} |
| has_confirm_page | {{dlv - civicrm has_confirm_page}} |
| additional_participant_count | {{dlv - civicrm additional_participant_count}} |
Tag 3: CiviCRM - purchase
Event name: purchase Trigger: civicrm_purchase
| Parameter Name | Variable |
| entity_type | {{dlv - civicrm entity_type}} |
| page_id | {{dlv - civicrm page_id}} |
| page_title | {{dlv - civicrm page_title}} |
| event_id | {{dlv - civicrm event_id}} |
| event_title | {{dlv - civicrm event_title}} |
| financial_type | {{dlv - civicrm financial_type}} |
| event_type | {{dlv - civicrm event_type}} |
| campaign_id | {{dlv - civicrm campaign_id}} |
| campaign_title | {{dlv - civicrm campaign_title}} |
| frequency_unit | {{dlv - civicrm frequency_unit}} |
| frequency_interval | {{dlv - civicrm frequency_interval}} |
| installments | {{dlv - civicrm installments}} |
| is_test | {{dlv - civicrm is_test}} |
| flow_type | {{dlv - civicrm flow_type}} |
| step_name | {{dlv - civicrm step_name}} |
| step_number | {{dlv - civicrm step_number}} |
| total_steps | {{dlv - civicrm total_steps}} |
| has_confirm_page | {{dlv - civicrm has_confirm_page}} |
| value | {{dlv - civicrm ecommerce value}} |
| currency | {{dlv - civicrm ecommerce currency}} |
| items | {{dlv - civicrm ecommerce items}} |
Tag 4: CiviCRM - registration_step
Event name: civicrm_registration_step Trigger: civicrm_registration_step
| Parameter Name | Variable |
| entity_type | {{dlv - civicrm entity_type}} |
| event_id | {{dlv - civicrm event_id}} |
| event_title | {{dlv - civicrm event_title}} |
| is_test | {{dlv - civicrm is_test}} |
| flow_type | {{dlv - civicrm flow_type}} |
| step_name | {{dlv - civicrm step_name}} |
| step_number | {{dlv - civicrm step_number}} |
| total_steps | {{dlv - civicrm total_steps}} |
| has_confirm_page | {{dlv - civicrm has_confirm_page}} |
| participant_number | {{dlv - civicrm participant_number}} |
| additional_participant_count | {{dlv - civicrm additional_participant_count}} |
Part 5: Publish Your Container
After saving all variables, triggers, and tags:
- Click Submit in the top right corner of GTM
- Add a version name like
CiviCRM dataLayer setup - Add a brief description like
Added CiviCRM GA4 tracking for contributions and event registrations - Click Publish
Nothing goes live until you publish. Always publish after making changes including toggling the Block Test Traffic variable.
Part 6: Verifying with GTM Preview Mode
GTM Preview mode lets you see exactly what is firing on your site without affecting real users.
How to Open Preview Mode
- In GTM, click Preview in the top right corner
- Enter your website URL and click Connect
- A new browser tab opens on your site with a blue GTM debug bar at the bottom
- The Tag Assistant panel opens in a separate window — keep both open
What to Look For
Navigate to a CiviCRM contribution page. In the Tag Assistant panel on the left you will see a list of events. Click on civicrm_view_item and you should see:
- Under Tags Fired: CiviCRM - view_item should appear with a green checkmark
- Under Tags Not Fired: the other three tags should appear here since they fire on different events
Click through the contribution form all the way to the thank you page. Each step should show the corresponding tag firing:
| Page | Event in Tag Assistant | Tag That Should Fire |
| Contribution main page | civicrm_view_item | CiviCRM - view_item |
| Confirm page | civicrm_begin_checkout | CiviCRM - begin_checkout |
| Thank you page | civicrm_purchase | CiviCRM - purchase |
How to Check Parameter Values
- In the Tag Assistant panel, click on the event name on the left (for example
civicrm_view_item) - Click on the tag name that fired (for example
CiviCRM - view_item) - You will see a list of all parameters and the values that were sent
- Verify that fields like
page_title,flow_type,step_number, andtotal_stepshave the correct values
If a parameter shows as undefined, the variable is not reading correctly. Go back and check that the Data Layer Variable Name is spelled exactly right including capitalization and dots.
Part 7: Verifying in GA4 DebugView
DebugView shows events arriving in GA4 in real time. It only works for your own browser session.
How to Enable Debug Mode
- Install the Google Analytics Debugger Chrome extension
- Turn it on by clicking the extension icon — it turns blue when active
- This flags your browser session as a debug session so GA4 separates your traffic
How to Open DebugView
- Go to GA4 at analytics.google.com
- Click Admin in the bottom left
- Under your property, click DebugView
- Navigate to your CiviCRM pages in another tab
What to Look For
Events appear as dots on a timeline at the top of the screen. Click any dot to see the event name and all parameters. You should see:
view_itemfiring when you land on a contribution or event pagebegin_checkoutfiring when you reach the confirm pagepurchasefiring on the thank you page withvalueandcurrencypopulated
Note: the GTM dataLayer event name is civicrm_view_item but GA4 receives it as view_item because that is the event name entered in the GTM tag. This is expected.
If an event appears but parameters are missing, the tag fired but the variable had no value. Go back to GTM and check the variable path.
Part 8: Registering Custom Dimensions in GA4
GA4 does not automatically display custom parameters in reports. You need to register each one so it shows up in your data and becomes available in explorations.
How to Register a Custom Dimension
- In GA4, go to Admin > Custom Definitions
- Click Create Custom Dimensions
- Fill in the fields:
- Dimension name: use the readable label from the table below
- Scope: Event
- Event parameter: enter the exact parameter name from the table below
- Click Save
Repeat for all 21 parameters below.
| Dimension Name | Event Parameter |
| CiviCRM Additional Participant Count | additional_participant_count |
| CiviCRM Campaign ID | campaign_id |
| CiviCRM Campaign Title | campaign_title |
| CiviCRM Entity Type | entity_type |
| CiviCRM Entry Point | entry_point |
| CiviCRM Event ID | event_id |
| CiviCRM Event Title | event_title |
| CiviCRM Event Type | event_type |
| CiviCRM Financial Type | financial_type |
| CiviCRM Flow Type | flow_type |
| CiviCRM Frequency Interval | frequency_interval |
| CiviCRM Frequency Unit | frequency_unit |
| CiviCRM Has Confirm Page | has_confirm_page |
| CiviCRM Installments | installments |
| CiviCRM Is Test | is_test |
| CiviCRM Page ID | page_id |
| CiviCRM Page Title | page_title |
| CiviCRM Participant Number | participant_number |
| CiviCRM Step Name | step_name |
| CiviCRM Step Number | step_number |
| CiviCRM Total Steps | total_steps |
Note: value, currency, and items from the ecommerce block do not need to be registered as custom dimensions. GA4 recognizes these as standard ecommerce parameters automatically when they come through on a purchase event.
Custom dimensions can take 24 to 48 hours to start populating in reports after you register them. If a dimension shows as (not set) in an exploration, check that the Event parameter field exactly matches the parameter name sent by the tag, then allow more time for data to accumulate.
Part 9: GA4 Key Events
Key Events (formerly called Conversions) are milestones GA4 highlights in standard reports and uses for Google Ads optimization.
Recommended Key Events:
purchase— mark this as a Key Event to track completed contributions and registrations as your primary goal metricbegin_checkout— optionally mark this to track checkout initiation as a secondary metric
To add a Key Event:
- In GA4, go to Admin > Key Events
- Click Create Key Event
- Enter the event name (
purchaseorbegin_checkout) - Save
view_item and civicrm_registration_step do not need to be Key Events. For funnel analysis, your Funnel Exploration and Free Form reports work regardless of Key Event status.
Part 10: GA4 Exploration Reports
Explorations are GA4's advanced reporting tool. The following reports give you the most useful views of your CiviCRM data. Access all explorations from the Explore section in the left menu.
Shared Segments
Create these segments first. You will use them across multiple reports.
Live Transactions Only
- Under Variables > Segments, click +
- Choose Create new segment
- Choose Event segment
- Add condition: CiviCRM Is Test exactly matches
false - Name it
Live Transactions Only - Save
CiviCRM Event Traffic
- Under Variables > Segments, click +
- Choose Create new segment
- Choose Event segment
- Add condition: CiviCRM Entity Type contains
event - Name it
CiviCRM Event Traffic - Save
CiviCRM Contribution Traffic
- Under Variables > Segments, click +
- Choose Create new segment
- Choose Contribution segment
- Add condition: CiviCRM Entity Type exactly matches
contribution - Name it
CiviCRM Contribution Traffic - Save
Report 1: CiviCRM Events Free Form
This report shows each CiviCRM event with the GA4 events nested under it and total revenue per event.
- Click Explore > Blank
- Change technique to Free Form
- Name it
CiviCRM - Events
Variables — Dimensions: Add Event name, CiviCRM Event Title
Variables — Metrics: Add Event count, Purchase revenue
Settings:
- Rows: CiviCRM Event Title, Event name
- Nested Rows: Yes
- Values: Event count, Purchase revenue
- Filters: CiviCRM Entity Type contains
eventAND CiviCRM Is Test exactly matchesfalse
Tip: If filter value suggestions do not appear in the dropdown, widen your date range. GA4 only suggests values it has seen within the selected date range.
Report 2: CiviCRM Contributions Free Form
This report shows each contribution page with GA4 events nested under it and total revenue.
- Click Explore > Blank
- Change technique to Free Form
- Name it
CiviCRM - Contributions
Variables — Dimensions: Add Event name, CiviCRM Entity Type, CiviCRM Page Title, CiviCRM Financial Type, CiviCRM Step Name, CiviCRM Campaign Title, CiviCRM Frequency Unit, CiviCRM Has Confirm Page, CiviCRM Is Test
Variables — Metrics: Add Event count, Purchase revenue
Settings:
- Rows: CiviCRM Page Title, Event name
- Nested Rows: Yes
- Values: Event count, Purchase revenue
- Filters: CiviCRM Entity Type exactly matches
contributionAND CiviCRM Is Test exactly matchesfalse
Report 3: CiviCRM Events Funnel Exploration
This funnel shows drop-off across the full event registration flow including the optional info page and additional participant steps.
- From within the CiviCRM Events exploration, click the + tab at the top
- Select Funnel exploration
- Name this tab
Events Funnel
Toggle on Make Open Funnel in the Settings panel — this is a toggle in the Settings column, not at the top of the page.
Steps — click the pencil icon next to Steps and add:
| Step Name | Event Name | Filter |
| Info Page (optional) | view_item | CiviCRM Entity Type exactly matches event_info |
| Registration View | view_item | CiviCRM Entity Type exactly matches event |
| Additional Participant | civicrm_registration_step | none needed |
| Checkout | begin_checkout | none needed |
| Complete | purchase | none needed |
Note: civicrm_registration_step is only ever fired by the additional participant form so no entity type filter is needed on that step. Since the funnel is open, registrations without additional participants will skip Step 3 and still be counted at Checkout and Complete.
Segment Comparisons: Drag Live Transactions Only into the Segment Comparisons drop zone.
Breakdown: Drag CiviCRM Entry Point into the Breakdown section. This splits the funnel by whether visitors came from the Event Info page or navigated directly to the registration form, which lets you compare conversion rates between the two entry paths.
Report 4: CiviCRM Contributions Funnel Exploration
- From within the CiviCRM Contributions exploration, click the + tab at the top
- Select Funnel exploration
- Name this tab
Contributions Funnel
Toggle on Make Open Funnel
Steps:
| Step Name | Event Name | Filter |
| Page View | view_item | CiviCRM Entity Type exactly matches contribution |
| Checkout | begin_checkout | none needed |
| Complete | purchase | none needed |
Segment Comparisons: Drag Live Transactions Only into the Segment Comparisons drop zone.
Breakdown: Drag CiviCRM Step Name into the Breakdown section. This splits the Checkout bar by checkout_attempt vs confirm, showing you whether people are dropping off before or after the confirmation page.
Report 5: CiviCRM Events Path Exploration
This shows the sequence of events users navigate through during an event registration.
- From within the CiviCRM Events exploration, click the + tab at the top
- Select Path exploration
- Name this tab
Events Path
Apply the segment:
- Click All Users at the top of the visualization
- Select CiviCRM Event Traffic
Starting Point: Set to Event name, then select view_item. Click through the nodes to follow the path forward through begin_checkout to purchase.
Report 6: CiviCRM Contributions Path Exploration
- From within the CiviCRM Contributions exploration, click the + tab at the top
- Select Path exploration
- Name this tab
Contributions Path
Apply the segment:
- Click All Users at the top of the visualization
- Select CiviCRM Contribution Traffic
Starting Point: Set to Event name, then select view_item.
Quick Troubleshooting Reference
| Problem | Where to Look |
| Tag not firing in Preview | Check trigger name matches event name exactly — names are case-sensitive |
| Parameter showing as null | Expected behavior. The field does not apply to this transaction type. |
| Parameter showing as undefined | Check the Data Layer Variable Name for typos including capitalization and dots |
| No events in DebugView | Make sure GA Debugger Chrome extension is on and blue |
| Events appear but no parameters in reports | Custom dimensions not registered yet in GA4, or still within the 24 to 48 hour population window |
| Test transactions appearing in reports | Check is_test exception is applied to every tag and const - Block Test Traffic is set to true |
| Funnel shows no data | Widen the date range — GA4 filter suggestions and funnel data depend on events within the selected range |
| Filter value not showing in dropdown | Widen date range to cover when your test data was recorded |
| (not set) in a dimension column | Custom dimension Event parameter may have a typo, or not enough data has accumulated yet |
| Duplicate events in Tag Assistant | Disable any legacy dataLayer scripts that may be pushing the same event names |