GA4 Parameter Detection
This feature is exclusive for Premium users!
The GA4 Parameter Detection module automatically discovers and tracks user properties, custom event parameters, and item parameters in your GA4 raw export. This powerful auditing tool helps you identify configuration gaps, data quality issues, and optimization opportunities in your GA4 implementation.
Key Features​
- Automatic Discovery: Identifies parameters in your data that aren't configured
- Configuration Validation: Flags mismatches between expected and actual data types
- Sample Value Analysis: Shows actual values being collected for each parameter
- Trend Monitoring: Tracks parameter usage over time with daily granularity
- Config Generation: Automatically suggests configuration code for discovered parameters
- PII Detection: Scans parameter names and values for personally identifiable information
- Multi-Property Support: Tracks parameters per GA4 property with
property_idandproperty_namecolumns
Configuration​
The module uses a YAML configuration file: includes/custom/modules/ga4_parameter_detection/config.yaml
config.yaml
# GA4 Parameter Detection Configuration
version: 2
enabled: false
dependencies: []
# Parameter filtering
exclude_params: []
exclude_category: [] # standard, custom, discovered
exclude_events: []
include_events: []
# Date range control
# When you run a full refresh, whichever date is closer to current_date() (in the past) will be chosen
max_lookback_days: 7
start_date: '9999-01-01'
# Sample value configuration
sample_value_count_daily: 5
sample_value_count_agg: 50
# =============================================================================
# PII DETECTION CONFIGURATION
# =============================================================================
pii_detection:
enabled: false
# Mask PII values in sample_values output (recommended for privacy)
mask_pii_in_samples: false
# ---------------------------------------------------------------------------
# PARAMETER NAME DETECTION
# ---------------------------------------------------------------------------
# Known PII parameter names (exact match, case-insensitive)
# These are parameter names that almost always contain PII
known_pii_param_names:
# Email
- email
- user_email
- customer_email
- contact_email
- email_address
# Phone
- phone
- phone_number
- telephone
- mobile
- mobile_number
- cell_phone
# Names
- full_name
- first_name
- last_name
- surname
- given_name
- family_name
# Address
- address
- street_address
- billing_address
- shipping_address
- home_address
- postal_code
- zip_code
- zipcode
# Government IDs
- ssn
- social_security
- social_security_number
- tax_id
- national_id
- passport_number
- drivers_license
# Financial
- credit_card
- card_number
- account_number
- iban
- bank_account
# Dates
- date_of_birth
- dob
- birthday
- birth_date
# Network
- ip_address
- client_ip
- user_ip
# Sensitive
- password
- secret
# Suspected PII parameter name patterns (regex, case-insensitive)
# These patterns catch variations of PII-related parameter names
suspected_pii_param_patterns:
- '.*email.*'
- '.*phone.*'
- '.*mobile.*'
- '.*(first|last|full|sur|given|family)[_-]?name.*'
- '.*address.*'
- '.*birth.*'
- '.*(credit|debit)[_-]?card.*'
- '.*ssn.*'
- '.*passport.*'
- '.*license.*'
- '.*national[_-]?id.*'
- '.*tax[_-]?id.*'
# ---------------------------------------------------------------------------
# VALUE PATTERN DETECTION
# ---------------------------------------------------------------------------
# All patterns for detecting PII based on actual value content.
# Each pattern can have:
# - name: Unique identifier for the pattern
# - enabled: true/false to toggle the pattern
# - regex: Regular expression to match against values
# - description: Human-readable description shown in reports
# - additional_sql: (optional) Extra SQL condition using {value} placeholder
# for complex validations that can't be expressed in regex
# - exclude_params: (optional) List of parameter names to skip for this pattern
# e.g. ['ic_name', 'feed_name'] to avoid false positives
# - luhn_check: (optional) true to validate credit card numbers with Luhn algorithm
# ---------------------------------------------------------------------------
pii_value_patterns:
# -------------------------------------------------------------------------
# CONTACT INFORMATION
# -------------------------------------------------------------------------
# Standard email format
- name: email
enabled: true
regex: '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
description: 'Email address format detected'
exclude_params: []
# Phone numbers with separators (US/international format)
# Additional SQL ensures separators exist and digit count is valid
- name: phone
enabled: false
regex: '[\+]?[(]?[0-9]{1,4}[)]?[-\s\.(][0-9]{1,4}[-\s\.)]?[0-9]{1,9}'
description: 'Phone number format detected'
additional_sql: "regexp_contains({value}, r'[\\(\\)\\-\\s\\.]') and length(regexp_replace({value}, r'[^0-9]', '')) between 10 and 15 and not regexp_contains({value}, r'\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b') and not regexp_contains({value}, r'\\d{4}[-/]\\d{2}[-/]\\d{2}')"
exclude_params: []
# International phone with country code: +1, +49, +33, etc.
- name: phone_intl
enabled: false
regex: '\+[1-9]\d{0,2}[\s.-]?\(?\d{1,4}\)?[\s.-]?\d{1,4}[\s.-]?\d{1,9}'
description: 'International phone number with country code detected'
additional_sql: "length(regexp_replace({value}, r'[^0-9]', '')) between 10 and 15"
exclude_params: []
# -------------------------------------------------------------------------
# FINANCIAL
# -------------------------------------------------------------------------
# Credit card with spaces or dashes (16 digits in groups of 4)
- name: credit_card
enabled: false
regex: '\b\d{4}[\s-]\d{4}[\s-]\d{4}[\s-]\d{4}\b'
description: 'Credit card number format detected'
exclude_params: []
# Credit card without separators (valid prefixes: Visa, MC, Amex, Discover)
- name: credit_card_no_sep
enabled: false
regex: '\b(?:4\d{12}(?:\d{3})?|5[1-5]\d{14}|2[2-7]\d{14}|3[47]\d{13}|6(?:011|5\d{2})\d{12})\b'
description: 'Credit card number (no separators) detected'
luhn_check: true
exclude_params: []
# IBAN (International Bank Account Number)
- name: iban
enabled: false
regex: '\b[A-Z]{2}\d{2}[A-Z0-9]{4}\d{7}([A-Z0-9]?){0,16}\b'
description: 'IBAN bank account number detected'
exclude_params: []
# -------------------------------------------------------------------------
# GOVERNMENT IDENTIFIERS
# -------------------------------------------------------------------------
# US Social Security Number: XXX-XX-XXXX
- name: ssn
enabled: false
regex: '\b\d{3}-\d{2}-\d{4}\b'
description: 'US Social Security Number format detected'
exclude_params: []
# Canadian Social Insurance Number: XXX-XXX-XXX
- name: sin_canada
enabled: false
regex: '\b\d{3}-\d{3}-\d{3}\b'
description: 'Canadian Social Insurance Number format detected'
exclude_params: []
# UK National Insurance Number: AB 12 34 56 C
- name: nino_uk
enabled: false
regex: '\b[A-Z]{2}\s?\d{2}\s?\d{2}\s?\d{2}\s?[A-Z]\b'
description: 'UK National Insurance Number format detected'
exclude_params: []
# -------------------------------------------------------------------------
# NETWORK IDENTIFIERS
# -------------------------------------------------------------------------
# IPv4 addresses (validates octet ranges 0-255)
- name: ip_address
enabled: false
regex: '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b'
description: 'IPv4 address detected'
additional_sql: "NOT REGEXP_CONTAINS({value}, r'^\\d\\.\\d+\\.\\d+\\.\\d+$')"
exclude_params: []
# IPv6 addresses
- name: ip_address_v6
enabled: false
regex: '(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}'
description: 'IPv6 address detected'
exclude_params: []
# MAC addresses
- name: mac_address
enabled: false
regex: '(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}'
description: 'MAC address detected'
exclude_params: []
# -------------------------------------------------------------------------
# LOCATION
# -------------------------------------------------------------------------
# US ZIP+4 and Canadian postal codes (disabled - high false positive rate)
- name: postal_code
enabled: false
regex: '\b[0-9]{5}-[0-9]{4}\b|\b[A-Z][0-9][A-Z]\s?[0-9][A-Z][0-9]\b'
description: 'US ZIP+4 or Canadian postal code detected'
exclude_params: []
# UK postcodes: SW1A 1AA format
- name: postal_code_uk
enabled: false
regex: '\b[A-Z]{1,2}\d[A-Z\d]?\s?\d[A-Z]{2}\b'
description: 'UK postcode detected'
exclude_params: []
# German postcodes: 5 digits (disabled - high false positive rate)
- name: postal_code_germany
enabled: false
regex: '\b\d{5}\b'
description: 'German postal code detected'
exclude_params: []
# -------------------------------------------------------------------------
# AUTHENTICATION & TOKENS
# -------------------------------------------------------------------------
# JWT tokens (commonly contain user data in payload)
- name: jwt_token
enabled: false
regex: 'eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*'
description: 'JWT token detected (may contain PII in payload)'
exclude_params: []
# API keys (disabled - context-dependent, needs tuning)
- name: api_key
enabled: false
regex: '(?:api[_-]?key|apikey|access[_-]?token)["\s:=]+[A-Za-z0-9_-]{20,}'
description: 'API key or access token detected'
exclude_params: []
# ---------------------------------------------------------------------------
# PII PATTERN TESTER
# ---------------------------------------------------------------------------
# Test values for the pii_pattern_tester view. Deploy and query the view to
# verify which patterns match. Remove all values to disable the tester view.
test_values:
# --- TRUE POSITIVES: should be detected ---
# Email
- 'test@example.com'
- 'John.Doe+tag@company.co.uk'
- '?email=user@test.com'
# Phone (with separators)
- '555-123-4567'
- '(555) 123-4567'
- '+1 (555) 123-4567'
- '07911 123 456'
- '555.123.4567'
# Phone international
- '+44 7911 123456'
- '+49 30 12345678'
- '+1-555-123-4567'
- '+33.1.23.45.67.89'
# Credit card (with separators)
- '4532 1234 5678 9010'
- '4532-1234-5678-9010'
# Credit card (no separators) — Visa, MC legacy, MC 2-series, Amex, Discover
- '4532015112830366'
- '5425233430109903'
- '2221000000000009'
- '370000000000002'
- '6011000000000004'
# CC-like but fails Luhn (utm_term-style random digits)
- '4575480219497552'
# IBAN
- 'DE89370400440532013000'
- 'GB29NWBK60161331926819'
- 'NL91ABNA0417164300'
# SSN
- '123-45-6789'
- 'SSN: 123-45-6789 end'
# IPv4
- '192.168.1.100'
- '10.0.0.1'
- '255.255.255.255'
# IPv6
- '2001:0db8:85a3:0000:0000:8a2e:0370:7334'
- 'fe80::'
# --- FALSE POSITIVES: should NOT be detected ---
# Version numbers (not IPs)
- '2.1.0.45'
- '1.2.3.4'
- '3.14.1.59'
# Short numbers (not phones)
- '100 x 200 x 300'
- '1.2.3'
# Random digits (not credit cards)
- '1234567890123456'
- '0000000000000000'
# Plain text
- 'hello world'
- 'not_pii_value'
- 'purchase_complete'
- '12345'
- 'USD'
# GA4-like values
- 'page_view'
- '/products/shoes?size=42'
- 'https://example.com/page?utm_source=google'
# Extracted query values (what production pipeline sees after URL preprocessing)
- '1|17479506634'
- '2+%28double%29|4575480219497552'
# Timestamps/dates (not phones)
- '2024-01-15'
- '2022-07-30 14:19:08'
# Short intl format (not a real phone)
- '+1 23 4'
Configuration Options​
Essential Settings​
| Setting | Description | Example |
|---|---|---|
enabled | Enable/disable the module | true or false |
version | Configuration version for tracking changes (set by Superform Labs team) | 1 |
dependencies | List other modules that the current module depends on (set by Superform Labs team) | ["ga4"] |
Date Range Control​
max_lookback_days: 7
start_date: '9999-01-01'
When running a full refresh, the module automatically selects the more recent of two possible start dates to prevent accidentally processing excessive historical data:
max_lookback_days: Maximum days to look back from todaystart_date: Earliest absolute date to process (set to9999-01-01by default so that any "real" date is intentionally set by the user)
This design allows you to set a distant start_date for comprehensive historical analysis when needed, while protecting against unintentionally querying years of data during rebuilds. The module will automatically limit processing to recent data based on the max_lookback_days setting, ensuring efficient rebuilds even after extended periods without updates.
These date settings determine how much raw GA4 data gets scanned - use shorter ranges to reduce processing costs. Querying the output parameter detection tables will be rather low cost as they are already aggregated.
Filtering​
Exclude Specific Parameters​
Skip tracking for known parameters you don't want to monitor.
Parameter filtering only affects what appears in the output tables - it doesn't reduce BigQuery processing costs since the module still scans all raw GA4 data within the configured date range.
exclude_params: ["debug_mode", "test_parameter"]
Exclude Parameter Categories​
Skip tracking for known categories you don't want to monitor. Useful if you are not interested in 'standard' parameters for example.
Parameter category filtering only affects what appears in the output tables - it doesn't reduce BigQuery processing costs since the module still scans all raw GA4 data within the configured date range.
exclude_category: ["standard"]
Filter by parameter type:
standard: Built-in GA4 parameterscustom: Parameters you've configured inincludes/custom/modules/ga4/config.jsdiscovered: Parameters found in data but not configured
Event-Based Filtering​
Skip tracking for events you don't want to monitor.
Event filtering only affects what appears in the output tables - it doesn't reduce BigQuery processing costs (unless your raw GA4 tables are clustered by event_name!) since the module still scans all raw GA4 data within the configured date range.
# Skip parameters from certain events
exclude_events: ["session_start", "first_visit", "user_engagement"]
# OR focus on specific events only
include_events: ["purchase", "add_to_cart"]
Use either exclude_events OR include_events, not both simultaneously.
Sample Value Configuration​
These settings control how many example values to collect for each parameter. Samples are ranked by frequency, so you'll see the most commonly occurring values first.
sample_value_count_daily: 5
sample_value_count_agg: 50
Control how many sample values to collect:
sample_value_count_daily: Samples per parameter per daysample_value_count_agg: Total samples across all dates
Multi-Property Support​
When you have multiple GA4 properties configured via EXTRA_GA4_DATASETS_ARRAY in the GA4 module, the Parameter Detection module automatically tracks parameters per property. All output tables include property_id and property_name columns, enabling per-property parameter auditing.
No additional configuration is needed - multi-property detection activates automatically when the GA4 module is set up with multiple properties.
PII Detection​
The PII detection feature scans your GA4 parameters for personally identifiable information - both in parameter names and in actual collected values. This helps you identify privacy risks before they become compliance issues.
pii_detection:
enabled: true
mask_pii_in_samples: true
How it works​
PII detection operates on two levels:
-
Parameter name detection: Checks parameter names against a list of known PII names (e.g.,
email,phone_number,ssn,credit_card) and suspected patterns (e.g., anything matching.*email.*,.*phone.*,.*password.*). Over 40 known names and 12 regex patterns are included by default. -
Value pattern detection: Scans sample values using 19 configurable regex patterns with optional SQL validation. For example, credit card detection uses both a regex pattern and a Luhn checksum validation to reduce false positives.
Detection categories​
| Category | Patterns | Examples |
|---|---|---|
| Contact | email, phone_us, phone_international | user@example.com, +1-555-0123 |
| Financial | credit_card, credit_card_no_separator, iban | Card numbers with Luhn validation, IBANs |
| Government ID | ssn, canadian_sin, uk_nino | 123-45-6789, AB 12 34 56 C |
| Network | ipv4, ipv6, mac_address | 192.168.1.1, 00:1A:2B:3C:4D:5E |
| Location | us_zip_plus4, uk_postcode, german_postcode | 90210-1234, SW1A 1AA |
| Authentication | jwt, api_key | JWT tokens, API key patterns |
Configuration options​
| Setting | Description | Default |
|---|---|---|
pii_detection.enabled | Enable PII scanning | false |
mask_pii_in_samples | Replace detected PII in sample_values with masked versions | true |
known_pii_param_names | Exact-match parameter names flagged as PII | 40+ built-in names |
suspected_pii_param_patterns | Regex patterns for parameter name variations | 12 built-in patterns |
pii_value_patterns | Value-level detection patterns with per-pattern toggle | 19 built-in patterns |
Each value pattern can be individually enabled/disabled and supports:
regex- the detection patternadditional_sql- extra SQL validation (e.g., digit count checks for phone numbers)luhn_check- Luhn algorithm validation for credit card numbersexclude_params- skip this pattern for specific parameters
Output​
PII detection adds three columns to ga4_parameter_detection_report_daily:
| Column | Type | Description |
|---|---|---|
has_pii_detected | BOOL | Whether PII was detected in this parameter's name or values |
pii_types_detected | STRING | Comma-separated list of detected PII types (e.g., email, phone) |
pii_detection_reason | STRING | Human-readable explanation of why PII was flagged |
Pattern Tester​
The ga4_parameter_detection_pii_pattern_tester view lets you validate detection patterns against test values before deploying. It shows whether each test value triggers each pattern, including regex matches and additional SQL validation results. The default config includes 60+ test values covering all pattern categories.
Table Structures​
ga4_parameter_detection_report_daily​
Granularity: Daily parameter tracking with event-level details
Incremental table that maintains a daily record of all identified parameters, including sample values and usage statistics.
| Column | Description |
|---|---|
property_id | Identifier of the GA4 property this parameter belongs to |
property_name | Display name of the GA4 property |
event_date | The date when the event was logged (YYYY-MM-DD format) |
param_name | Name of the parameter being tracked |
param_source | Source array of the parameter (e.g., event, item, user property) |
event_name | Name of the event this parameter belongs to |
param_category | Category classification of the parameter (e.g., custom, standard, discovered) |
param_data_type_configured_as | The data type this parameter was configured as in config.js |
param_data_type_found_in_data_as | The actual data type found for this parameter in the collected data |
distinct_data_type_count | Number of distinct data types observed for this parameter |
found_in_data | Whether this parameter was actually found in the collected event data on this date |
has_potential_issue | Whether this parameter has potential data quality issues on this date |
issue_description | Description of the potential data quality issues identified for this parameter |
event_count | Total number of times this event occurred with this parameter on this date |
last_received_timestamp | Timestamp of when this event-parameter combination was last received on this date |
sample_values | Array of sample values (ordered by descending occurrence count) with value and occurrence_count fields |
has_pii_detected | Whether PII was detected in this parameter's name or values |
pii_types_detected | Comma-separated list of detected PII types |
pii_detection_reason | Human-readable explanation of why PII was flagged |
is_final | Indicates if the data is final or subject to change (based on 72h window) |
ga4_parameter_detection_aggregated​
Granularity: Aggregated parameter summary across all dates
Aggregated table showing parameter status, data types, issue flags, and comprehensive sample values across the entire observation period.
| Column | Description |
|---|---|
property_id | Identifier of the GA4 property this parameter belongs to |
property_name | Display name of the GA4 property |
event_name | Name of the event this parameter belongs to |
param_name | Name of the parameter |
param_data_type_configured_as | The data type this parameter was configured as in config.js |
param_data_type_found_in_data_as | The actual data type found for this parameter in the collected data |
param_category | Category classification of the parameter (e.g., custom, standard, discovered) |
param_source | Source array of the parameter (e.g., event_params_array, item_params_array, user_property_array) |
found_in_data | Whether this parameter was actually found in the collected event data |
has_potential_issue | Whether this parameter has potential data quality issues based on the most recent data |
issue_description | Description of the potential data quality issues identified for this parameter |
first_seen_date | First date (YYYY-MM-DD) when this event-parameter combination was observed |
last_seen_date | Last date (YYYY-MM-DD) when this event-parameter combination was observed |
days_observed | Total number of distinct dates this event-parameter combination was observed |
days_with_events | Number of days this event-parameter combination appeared in the data |
missing_dates | Number of days between first_seen_date and last_seen_date where this event-parameter combination was not observed |
events_with_param_count | Count of unique event names where this parameter appears |
event_count | Total number of times this event occurred with this parameter |
last_received_timestamp | Timestamp of when this event-parameter combination was last received |
sample_values | Sample values for this parameter formatted as a concatenated string |
sample_values_array | Array of sample values for this parameter |
unique_values_count | Number of distinct values observed for this parameter |
total_actual_days | Total number of days that are set for detection. Controlled by start_date and max_lookback_days config variables |
ga4_parameter_detection_pii_pattern_tester​
Granularity: One row per test value per pattern
A diagnostic view that validates all configured PII detection patterns against a set of test values. Use this to verify that patterns work correctly before enabling PII detection in production.
| Column | Description |
|---|---|
test_value | The sample value being tested |
pattern_name | Name of the PII pattern (e.g., email, credit_card) |
pattern_enabled | Whether this pattern is currently enabled in config |
regex_matches | Whether the regex pattern matched the test value |
additional_sql_passes | Whether the additional SQL validation passed (if configured) |
is_detected | Final detection result (true only if all checks pass) |
ga4_parameter_detection_config_suggestions​
Granularity: Configuration recommendations for discovered parameters
This view generates ready-to-use configuration code for parameters found in your data but not yet configured. It produces formatted JavaScript configuration blocks that can be copied directly into your config.js file.
Example output:
CUSTOM_USER_PROPERTIES_ARRAY: [
{ name: "wordpress_role", type: "string", description: "found in: click_to_store, expand_section, page_view" }
],
CUSTOM_ITEM_PARAMS_ARRAY: [
{ name: "variant_id", type: "int", description: "found in: purchase, add_payment_info, view_item, view_cart" }
],
CUSTOM_EVENT_PARAMS_ARRAY: [
{ name: "gtm_version", type: "string", description: "found in: video_start, form_start, form_submit, click, click_to_store" },
{ name: "login_state", type: "string", description: "found in: video_start, form_start, form_submit, click, click_to_store" },
{ name: "page_author", type: "string", description: "found in: video_start, form_start, form_submit, click, click_to_store" },
{ name: "page_id", type: "int", description: "found in: video_start, form_start, form_submit, click, click_to_store" }
],
Potential Issue Types and Resolutions​
We call them "potential" issues because they may be intentional configurations or minor inconsistencies that don't require fixes. Comprehensive detection ensures you can identify and evaluate each case to determine if action is indeed needed.
Common Issue Categories​
1. Discovered Parameters​
Detection: param_category = 'discovered'
Description: "Parameter not defined in config but found in data"
Parameters exist in your GA4 data but aren't configured in your config.js file. Assess their analytical value and decide whether to add them to your configuration, exclude them via the exclude_params setting, or possibly even modify your GA4 tracking to stop collecting them.
Resolution Options:
- Add to
CUSTOM_EVENT_PARAMS_ARRAY,CUSTOM_USER_PROPERTIES_ARRAY, orCUSTOM_ITEM_PARAMS_ARRAY - Add to
exclude_paramslist if uninteresting - Use
ga4_parameter_detection_config_suggestionsview for ready-to-copy configuration code - Stop collecting them if they are not needed
- Ignore if issue is expected or resolved downstream
2. Missing Parameters​
Detection: param_category = 'custom' and found_in_data is false
Description: "Parameter defined in config but not found in data"
Parameters are configured but don't appear in your actual GA4 data. The configured date range will greatly affect this flag since some parameters might not be recently collected, but could be relevant historically.
Resolution Options:
- Verify GA4 implementation is sending the parameter
- Remove unused parameter from configuration
- Check if parameter was recently added and hasn't appeared yet
- Ignore if issue is expected or resolved downstream
3. Data Type Mismatches​
Detection: Various data type validation rules
Descriptions:
- "Parameter data type mismatch: configured as string, found as int,float"
- "Parameter data type mismatch: configured as decimal, found as string,int"
- "Parameter data type mismatch: configured as int, found as float,string"
The configured data type doesn't match what's actually being collected. GA4's processing has a tendency to parse numbers 3 different (int, float, double) ways - feel free to ignore in such cases, but don't forget to account for them downstream.
If unsure, use decimal in config.js to capture all 3 numerical types, but investigate cases where a numerical value is parsed as a string.
Resolution Options:
- Update configuration to match actual data type
- Fix GA4 implementation to send correct data
- Use
decimaltype for mixed numerical data scenarios - Use
stringtype for mixed data scenarios - Ignore if issue is expected or resolved downstream
4. Multiple Data Types​
Detection: distinct_data_type_count > 1
Description: "Parameter has multiple data types: int,string,float"
The same parameter contains different data types across events.
Resolution Options:
- Standardize data collection to use consistent data type
- Configure as
stringtype to accommodate all variations - Investigate why different events send different data
- Ignore if issue is expected or resolved downstream
5. Missing Dates​
Detection: (total_actual_days - days_observed) > 0 in aggregated table
Description: "Parameter missing on X days"
Parameters are not collected for certain dates. Its severity is highly context-dependent.
Resolution Options:
- Investigate implementation gaps or deployment issues
- Check for seasonal patterns or campaign-specific parameters
- Verify parameter is being sent from all relevant pages/events
- Ignore if issue is expected or resolved downstream
6. PII Detected​
Detection: has_pii_detected = true in daily table
Description: "PII detected: email, phone" (varies by detection)
A parameter's name matches a known PII identifier, or its collected values match a PII pattern (email addresses, phone numbers, credit card numbers, etc.). This indicates a potential privacy risk - sensitive data may be flowing into your analytics pipeline.
Resolution Options:
- Remove PII collection at the source (GTM/tracking code)
- If the detection is a false positive, disable the specific pattern in
pii_value_patternsor add the parameter to the pattern'sexclude_params
Looker Studio Template​
We created a free-to-use Looker Studio template that was specifically designed to work with the GA4Dataform modules. Feel free to copy it and adapt it to your needs! You can find it here.
Template Features​
- Parameter discovery dashboard
- Potential issue flagging
- Sample value analysis
- Configuration suggestions
- Trend analysis
Common Use Cases​
- Implementation Audits: Verify GA4 setup completeness and accuracy
- Data Quality Monitoring: Identify and resolve configuration issues
- Discovery Analysis: Find valuable parameters not yet configured
- Migration Validation: Ensure parameter parity when migrating setups
- Compliance Tracking: Monitor parameter usage for privacy compliance
- Performance Optimization: Identify unused parameters for cleanup