14 KiB
Custom Dimension Troubleshooting Guide
Quick Diagnosis Flowchart
Are custom dimensions appearing in reports?
│
├─ YES → Is data accurate?
│ ├─ YES → No action needed
│ └─ NO → Jump to "Inaccurate Data" section
│
└─ NO → Is it after 48 hours?
├─ NO → Wait, normal processing delay (24-48 hours)
└─ YES → Start troubleshooting below
Most Common Issues & Solutions
Issue 1: Dimension Doesn't Appear After 48 Hours
Frequency: 95% of reported problems
Check 1: Verify Code Still Sends Parameter
Go to DebugView to see if current events include the parameter:
- GA4 Admin → DebugView
- Look at events fired in last 5 minutes
- Find the event type (form_submit, page_view, etc.)
- Click to expand event details
- Look for parameter in list
Expected: Parameter appears with correct value
If Parameter Missing:
- Code may not be live (deployment issue)
- Event may not be triggering at expected action
- Parameter may have been removed from code
- Test the action manually to verify event fires
Solution:
// Verify code actively sending parameter
gtag('event', 'test_event', {
'test_param': 'test_value'
});
// Check DebugView for this event
Check 2: Verify Case-Sensitive Parameter Name Match
GA4 is case-sensitive. The parameter name in code must match EXACTLY in registration.
DebugView shows: form_name
Registered as: form_name ✓ CORRECT
Registered as: Form_Name ✗ WRONG
Registered as: formName ✗ WRONG
Solution:
- Go to DebugView
- Find event with parameter
- Look at EXACT parameter name as shown
- Copy that exact name
- Compare to what you registered
If mismatch found:
- Delete incorrect dimension
- Create new dimension with correct parameter name
- Wait 24-48 hours
Check 3: Verify Scope is Correct
Wrong scope will cause dimension to not appear properly.
For event-scoped parameters:
- Parameter appears in gtag('event') call
- Each event can have different value
- Example: button_name varies by event
// If code looks like this → use EVENT scope
gtag('event', 'click', {
'button_name': 'Subscribe' // Different per event
});
For user-scoped parameters:
- Parameter appears in gtag('set') call
- Set once, applies to all events
- Example: subscription_tier remains same
// If code looks like this → use USER scope
gtag('set', {
'subscription_tier': 'premium' // Same for all events
});
For item-scoped parameters:
- Parameter in items array
- Goes inside each product object
- Example: item_color varies per product
// If code looks like this → use ITEM scope
gtag('event', 'purchase', {
'items': [{
'item_color': 'blue' // Different per item
}]
});
Solution:
- If scope wrong: Delete and recreate with correct scope
- Scope cannot be changed on existing dimension
Check 4: Verify Quota Not Exceeded
Standard GA4 property limits:
- Event-scoped dimensions: 50 maximum
- User-scoped dimensions: 25 maximum
- Item-scoped dimensions: 10 maximum
If at or over limit, GA4 silently fails to create dimension.
Solution:
- Admin → Custom Definitions
- Count existing dimensions by scope
- If at limit: Delete unused dimensions
- Then recreate the missing dimension
Example deletion process:
- Find unused dimension in list
- Click to select it
- Click Delete
- Confirm deletion
- Wait 24 hours before creating replacement
Check 5: Verify Minimum Event Volume
Custom dimensions need sufficient event volume to populate in reports.
Minimum for visibility:
- At least 1,000 events with that parameter
- May not show if traffic very low
Solution:
- Check event volume in DebugView
- If traffic low, data will eventually populate
- Large websites: Usually visible within 48 hours
- Small websites: May take longer or be below threshold
For testing with low traffic:
- Use Realtime reports (shows faster)
- Check after several days of data collection
- Consider sampling: Manual filter to subset of users
Check 6: Verify Data Stream is Correct
Custom dimensions apply to their data stream. If created for wrong stream:
Problem: Created dimension for Data Stream A, but code sends to Data Stream B
Solution:
-
Verify Measurement ID in code
gtag('config', 'G-XXXXXXXXXX'); // This is the data stream -
Admin → Data Streams
-
Match Measurement ID to correct stream
-
Verify dimension created in THAT stream (not another)
-
If in wrong stream: Create in correct stream
Issue 2: Parameter in DebugView But Not in Reports
Timeline:
- Hour 0-6: Parameter fires in DebugView
- Hour 6-24: Should start appearing in reports
- Hour 24-48: Definitely should appear in reports
Within First 24 Hours: Normal
GA4 requires time to process events. This is expected behavior.
Solution: Wait until 48-hour mark, then check again.
After 48 Hours: Investigate
Use the diagnostic checklist above (Checks 1-6) to identify issue.
Issue 3: Dimension Values Inconsistent or Wrong
Problem: All Users Show Same Value
For event-scoped dimension:
- ✗ WRONG: All events showing "Button A" when multiple buttons exist
- Cause: Parameter only sent sometimes
- Solution: Verify code sends parameter for ALL instances
For user-scoped dimension:
- ✓ EXPECTED: All events from user showing "Premium" tier
- This is correct behavior for user scope
Problem: Null or Empty Values Appearing
Cause: Parameter sometimes not sent
Example:
gtag('event', 'form_submit', {
'form_name': formElement.getAttribute('name') // Could be null
});
If formElement doesn't exist or attribute missing → null value sent
Solution:
gtag('event', 'form_submit', {
'form_name': formElement.getAttribute('name') || 'unknown_form'
});
Always provide default value.
Problem: Unexpected Values in Reports
Example: Report shows "button name: [object Object]" instead of actual name
Cause: Sending object or array instead of string
// WRONG - sending object
gtag('event', 'click', {
'button_data': {name: 'Subscribe'} // Object, not string!
});
// CORRECT - send string value
gtag('event', 'click', {
'button_name': 'Subscribe' // String value
});
Solution: Ensure values are primitive types (string, number, boolean)
Issue 4: Multiple Dimensions Created by Accident
Problem: Accidentally created "form_name", "form_Name", "formName" (all slightly different)
Solution:
- Delete the incorrect/duplicate versions
- Keep only the correct one
- Wait 24-48 hours between deletions
- Verify code sends correct parameter name
Deletion process:
- Admin → Custom Definitions
- Click each duplicate
- Click Delete
- Confirm
- Wait 24 hours
- Verify deletion complete
Issue 5: Dimension Quota Exceeded
Error: Cannot create new dimension, hitting quota limit
Standard GA4 Quotas:
- Event-scoped: 50 max (currently using X)
- User-scoped: 25 max (currently using X)
- Item-scoped: 10 max (currently using X)
Solution:
- Admin → Custom Definitions
- Identify unused dimensions
- Delete low-priority dimensions
- Now create new dimension
Prioritization for deletion:
- Delete: Dimensions with no data
- Delete: Dimensions not used in reports
- Delete: Experimental/testing dimensions
- Keep: Critical business metrics
- Keep: Frequently used dimensions
Dimension Data Quality Issues
Issue 6: High-Cardinality Dimensions (Too Many Values)
What is cardinality?
- Low: Few unique values (colors: red, blue, green)
- High: Many unique values (email addresses, IDs)
Problem: Creating dimension on high-cardinality parameter
Example:
gtag('event', 'form_submit', {
'user_email': user.email // MILLIONS of unique values
});
Impact:
- Report becomes unwieldy
- Performance impacts
- GA4 may limit display (shows "other" for rare values)
Solution: Use low-cardinality parameters
Good parameters (low cardinality):
- Button names: 5-10 values
- Form names: 3-8 values
- User tiers: 3-5 values
- Colors: 6-10 values
- Locations: 20-100 values
Bad parameters (high cardinality):
- Email addresses: Millions
- User IDs: Millions
- Timestamps: Continuous
- Session IDs: Unique per session
- Product SKUs: Often thousands+
Fix:
- Don't track high-cardinality data as custom dimension
- Use for analysis in DebugView only
- Or aggregate: Convert
product_skutoproduct_category
Issue 7: Sending PII (Personally Identifiable Information)
Prohibited: Email, phone, SSN, credit card, name, IP address
// WRONG - Don't send PII
gtag('event', 'signup', {
'user_email': 'john@example.com', // PII!
'user_name': 'John Doe' // PII!
});
Solution: Use anonymous identifiers
// CORRECT - Use hashed or anonymous IDs
gtag('event', 'signup', {
'user_tier': 'free', // OK - non-PII attribute
'signup_source': 'newsletter' // OK - non-PII context
});
Debugging with DebugView
Enable DebugView (Three Methods)
Method 1: Chrome Extension (Easiest)
- Install "Google Analytics Debugger" from Chrome Web Store
- Click extension icon → Enable
- Refresh website
- Go to GA4 Admin → DebugView
- Data appears immediately
Method 2: GTM Preview Mode
- In GTM container → Click Preview
- All GA4 tags automatically send debug_mode parameter
- Go to GA4 DebugView
- Data visible
Method 3: Manual Debug Code
gtag('config', 'G-XXXXXXXXXX', {
'debug_mode': true
});
// Or per event
gtag('event', 'form_submit', {
'form_name': 'Contact',
'debug_mode': true
});
Using DebugView to Diagnose
Verification Checklist:
- ✓ Event fires? See it in event stream
- ✓ Parameter sends? See in event parameters
- ✓ Parameter name correct? Check exact spelling/case
- ✓ Parameter value correct? See actual value sent
- ✓ Scope correct? User params in "User properties", item params in "Items"
DebugView Navigation:
- Left panel: Event stream (click to select)
- Right panel: Event details (expand sections)
- User properties section: Find user-scoped dimensions
- Items section: Find item-scoped dimensions
Testing Custom Dimensions
Manual Testing Workflow
-
Create test dimension
- Name: "Test Dimension [your name]"
- Register the test parameter
-
Add test code to page
gtag('event', 'test_event', { 'test_parameter': 'test_value_' + new Date().toLocaleTimeString() }); -
Verify in DebugView
- Trigger event manually
- See parameter in DebugView
- Confirm parameter name matches registration
-
Wait 24-48 hours
-
Check test report
- Analytics → Reports
- Add test dimension
- See test values appear
-
Delete test dimension
- Once verified
- Clean up test data
Getting Help & Debugging Checklist
Before Contacting Support
Use this checklist to diagnose issue:
-
Parameter appears in DebugView?
- YES: Parameter is being sent correctly
- NO: Issue is in implementation, not GA4
-
Parameter name matches registration (case-sensitive)?
- YES: Continue
- NO: Fix parameter name
-
Scope selection correct (Event/User/Item)?
- YES: Continue
- NO: Delete and recreate with correct scope
-
Under quota for scope type?
- YES: Continue
- NO: Delete unused dimensions
-
48 hours passed since registration?
- YES: Continue
- NO: Wait longer, processing is normal
-
Sufficient event volume (1000+ events)?
- YES: Continue
- NO: May appear later as traffic increases
Debug Information to Gather
If contacting support, provide:
- GA4 Property ID: properties/XXXXXXXXXX
- Dimension name: Exactly as registered
- Parameter name: Exactly as sent
- Scope: Event/User/Item
- Date created: When dimension registered
- Event type: Which event sends parameter
- DebugView screenshot: Showing parameter
- Expected vs actual: What should appear vs what does
Prevention: Best Practices
Avoid Problems Before They Start
-
Plan before implementation
- List all dimensions needed
- Assign scopes to each
- Check quota (don't exceed limits)
- Get team approval
-
Use consistent naming
- Standardize parameter names
- Use snake_case
- Clear, descriptive names
- Document all parameters
-
Test with small rollout
- Deploy to 1% of traffic first
- Verify in DebugView
- Wait 24-48 hours
- Then full rollout
-
Version control parameters
- If updating parameter name: Create new dimension
- Don't modify existing dimensions
- Keep version history
-
Monitor after creation
- Check data appears after 48 hours
- Verify data accuracy
- Monitor for unexpected values
- Set up alerts for anomalies
Quick Reference: Common Error Messages
| Error | Cause | Solution |
|---|---|---|
| "Dimension not found" | Registered with wrong name | Create with correct name |
| "Parameter mismatch" | Case doesn't match | Verify exact case in DebugView |
| "Cannot create dimension" | Quota exceeded | Delete unused dimensions |
| "Dimension appears empty" | No data sent | Verify code sends parameter |
| "Shows '[object Object]'" | Sending object not string | Send string value only |
| "All values blank/null" | Parameter optional, sometimes missing | Add default value in code |
Advanced: Debugging with GA4 DebugView API
For developers, use the Realtime Report API to programmatically verify:
from google.analytics.data_v1beta import BetaAnalyticsDataClient
client = BetaAnalyticsDataClient()
# Run realtime report to verify custom dimension
response = client.run_realtime_report(
request={
"property": "properties/PROPERTY_ID",
"dimensions": [
{"name": "customEvent:dimension_name"}
],
"metrics": [
{"name": "eventCount"}
]
}
)
# Check if dimension appears with data
for row in response.rows:
print(f"Dimension value: {row.dimension_values}")
print(f"Event count: {row.metric_values}")
This confirms dimension is receiving data in real-time.