Skip to main content

GA4 Parameter Detection

💎Premium Feature

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_id and property_name columns

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​

SettingDescriptionExample
enabledEnable/disable the moduletrue or false
versionConfiguration version for tracking changes (set by Superform Labs team)1
dependenciesList 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 today
  • start_date: Earliest absolute date to process (set to 9999-01-01 by 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.

BigQuery Cost Impact

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.

BigQuery Cost Impact

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.

BigQuery Cost Impact

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 parameters
  • custom: Parameters you've configured in includes/custom/modules/ga4/config.js
  • discovered: Parameters found in data but not configured

Event-Based Filtering​

Skip tracking for events you don't want to monitor.

BigQuery Cost Impact

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"]
Mutually Exclusive

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 day
  • sample_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:

  1. 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.

  2. 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​

CategoryPatternsExamples
Contactemail, phone_us, phone_internationaluser@example.com, +1-555-0123
Financialcredit_card, credit_card_no_separator, ibanCard numbers with Luhn validation, IBANs
Government IDssn, canadian_sin, uk_nino123-45-6789, AB 12 34 56 C
Networkipv4, ipv6, mac_address192.168.1.1, 00:1A:2B:3C:4D:5E
Locationus_zip_plus4, uk_postcode, german_postcode90210-1234, SW1A 1AA
Authenticationjwt, api_keyJWT tokens, API key patterns

Configuration options​

SettingDescriptionDefault
pii_detection.enabledEnable PII scanningfalse
mask_pii_in_samplesReplace detected PII in sample_values with masked versionstrue
known_pii_param_namesExact-match parameter names flagged as PII40+ built-in names
suspected_pii_param_patternsRegex patterns for parameter name variations12 built-in patterns
pii_value_patternsValue-level detection patterns with per-pattern toggle19 built-in patterns

Each value pattern can be individually enabled/disabled and supports:

  • regex - the detection pattern
  • additional_sql - extra SQL validation (e.g., digit count checks for phone numbers)
  • luhn_check - Luhn algorithm validation for credit card numbers
  • exclude_params - skip this pattern for specific parameters

Output​

PII detection adds three columns to ga4_parameter_detection_report_daily:

ColumnTypeDescription
has_pii_detectedBOOLWhether PII was detected in this parameter's name or values
pii_types_detectedSTRINGComma-separated list of detected PII types (e.g., email, phone)
pii_detection_reasonSTRINGHuman-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.

ColumnDescription
property_idIdentifier of the GA4 property this parameter belongs to
property_nameDisplay name of the GA4 property
event_dateThe date when the event was logged (YYYY-MM-DD format)
param_nameName of the parameter being tracked
param_sourceSource array of the parameter (e.g., event, item, user property)
event_nameName of the event this parameter belongs to
param_categoryCategory classification of the parameter (e.g., custom, standard, discovered)
param_data_type_configured_asThe data type this parameter was configured as in config.js
param_data_type_found_in_data_asThe actual data type found for this parameter in the collected data
distinct_data_type_countNumber of distinct data types observed for this parameter
found_in_dataWhether this parameter was actually found in the collected event data on this date
has_potential_issueWhether this parameter has potential data quality issues on this date
issue_descriptionDescription of the potential data quality issues identified for this parameter
event_countTotal number of times this event occurred with this parameter on this date
last_received_timestampTimestamp of when this event-parameter combination was last received on this date
sample_valuesArray of sample values (ordered by descending occurrence count) with value and occurrence_count fields
has_pii_detectedWhether PII was detected in this parameter's name or values
pii_types_detectedComma-separated list of detected PII types
pii_detection_reasonHuman-readable explanation of why PII was flagged
is_finalIndicates 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.

ColumnDescription
property_idIdentifier of the GA4 property this parameter belongs to
property_nameDisplay name of the GA4 property
event_nameName of the event this parameter belongs to
param_nameName of the parameter
param_data_type_configured_asThe data type this parameter was configured as in config.js
param_data_type_found_in_data_asThe actual data type found for this parameter in the collected data
param_categoryCategory classification of the parameter (e.g., custom, standard, discovered)
param_sourceSource array of the parameter (e.g., event_params_array, item_params_array, user_property_array)
found_in_dataWhether this parameter was actually found in the collected event data
has_potential_issueWhether this parameter has potential data quality issues based on the most recent data
issue_descriptionDescription of the potential data quality issues identified for this parameter
first_seen_dateFirst date (YYYY-MM-DD) when this event-parameter combination was observed
last_seen_dateLast date (YYYY-MM-DD) when this event-parameter combination was observed
days_observedTotal number of distinct dates this event-parameter combination was observed
days_with_eventsNumber of days this event-parameter combination appeared in the data
missing_datesNumber of days between first_seen_date and last_seen_date where this event-parameter combination was not observed
events_with_param_countCount of unique event names where this parameter appears
event_countTotal number of times this event occurred with this parameter
last_received_timestampTimestamp of when this event-parameter combination was last received
sample_valuesSample values for this parameter formatted as a concatenated string
sample_values_arrayArray of sample values for this parameter
unique_values_countNumber of distinct values observed for this parameter
total_actual_daysTotal 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.

ColumnDescription
test_valueThe sample value being tested
pattern_nameName of the PII pattern (e.g., email, credit_card)
pattern_enabledWhether this pattern is currently enabled in config
regex_matchesWhether the regex pattern matched the test value
additional_sql_passesWhether the additional SQL validation passed (if configured)
is_detectedFinal 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, or CUSTOM_ITEM_PARAMS_ARRAY
  • Add to exclude_params list if uninteresting
  • Use ga4_parameter_detection_config_suggestions view 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.

tip

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 decimal type for mixed numerical data scenarios
  • Use string type 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 string type 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_patterns or add the parameter to the pattern's exclude_params

Looker Studio Template​

tip

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​

  1. Implementation Audits: Verify GA4 setup completeness and accuracy
  2. Data Quality Monitoring: Identify and resolve configuration issues
  3. Discovery Analysis: Find valuable parameters not yet configured
  4. Migration Validation: Ensure parameter parity when migrating setups
  5. Compliance Tracking: Monitor parameter usage for privacy compliance
  6. Performance Optimization: Identify unused parameters for cleanup