Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 18:32:40 +08:00
commit 0ea8352871
72 changed files with 30043 additions and 0 deletions

View File

@@ -0,0 +1,734 @@
# Event Naming Conventions Best Practices
## Overview
Consistent, descriptive event naming is essential for maintainable GA4 implementations. This guide provides comprehensive best practices, patterns, and examples for naming events and parameters.
## Core Naming Principles
### 1. Use snake_case
**Format:** lowercase_with_underscores
```javascript
// ✅ CORRECT
'button_click'
'form_submit'
'video_tutorial_watched'
'pricing_calculator_used'
// ❌ WRONG
'buttonClick' // camelCase
'ButtonClick' // PascalCase
'button-click' // kebab-case
'BUTTON_CLICK' // UPPERCASE
'button click' // spaces
```
**Why snake_case:**
- GA4 standard convention
- Consistent with Google-recommended events
- Readable and parseable
- Works across all platforms
---
### 2. Be Descriptive and Action-Oriented
**Pattern:** Start with verb (action) when possible
```javascript
// ✅ CORRECT - Descriptive, action-oriented
'video_tutorial_started'
'whitepaper_downloaded'
'demo_request_submitted'
'pricing_tier_selected'
'account_upgrade_completed'
// ❌ WRONG - Too generic or vague
'video'
'download'
'form'
'click'
'event'
```
---
### 3. Keep Under 40 Characters
**Limit:** Maximum 40 characters for event names
```javascript
// ✅ CORRECT - 38 characters
'enterprise_demo_scheduling_completed'
// ⚠️ WARNING - 48 characters (too long)
'enterprise_customer_onboarding_demo_scheduling_completed'
// ✅ BETTER - Abbreviated to 35 characters
'enterprise_demo_onboarding_complete'
```
**Character Count Check:**
```javascript
'video_tutorial_watched'.length // 22 characters ✅
'very_long_descriptive_event_name_exceeding_limits'.length // 50 characters ❌
```
---
### 4. Avoid Reserved Names
**Don't Use:** Google-reserved automatic and recommended event names for custom events
```javascript
// ❌ WRONG - Using reserved recommended event names
'login' // Reserved
'sign_up' // Reserved
'purchase' // Reserved
'page_view' // Reserved
// ✅ CORRECT - Custom variations when needed
'custom_login_attempt'
'trial_signup_completed'
'demo_purchase_simulation'
'virtual_page_view'
```
**Reserved Event Names to Avoid:**
- All automatically collected events (session_start, first_visit, user_engagement)
- All enhanced measurement events (scroll, click, file_download, video_start, etc.)
- All recommended events (login, sign_up, purchase, add_to_cart, etc.)
---
### 5. Be Consistent Across Implementation
**Maintain Consistency:**
- Use same naming pattern throughout site/app
- Document naming conventions
- Share with team
- Create naming reference guide
```javascript
// ✅ CORRECT - Consistent pattern
'video_tutorial_started'
'video_tutorial_paused'
'video_tutorial_completed'
// ❌ WRONG - Inconsistent pattern
'videoTutorialStarted' // Different case
'video_tutorial_paused' // Consistent
'VideoTutorialComplete' // Different case, missing 'd'
```
---
## Event Naming Patterns
### Pattern 1: [action]_[object]
**Structure:** verb_noun
**Examples:**
```javascript
'button_clicked'
'form_submitted'
'video_started'
'file_downloaded'
'account_created'
'payment_completed'
'newsletter_subscribed'
```
**Use When:** Simple, single-action events
---
### Pattern 2: [object]_[action]
**Structure:** noun_verb
**Examples:**
```javascript
'cart_abandoned'
'product_viewed'
'coupon_applied'
'search_performed'
'filter_applied'
'wishlist_added'
```
**Use When:** Object-focused tracking
---
### Pattern 3: [action]_[object]_[context]
**Structure:** verb_noun_descriptor
**Examples:**
```javascript
'video_tutorial_started'
'demo_request_submitted'
'pricing_calculator_opened'
'trial_signup_completed'
'whitepaper_pdf_downloaded'
'enterprise_demo_scheduled'
```
**Use When:** Need additional context for clarity
---
### Pattern 4: [object]_[attribute]_[action]
**Structure:** noun_descriptor_verb
**Examples:**
```javascript
'free_trial_started'
'premium_tier_selected'
'annual_plan_purchased'
'mobile_app_downloaded'
'beta_feature_activated'
```
**Use When:** Attribute is critical to event meaning
---
### Pattern 5: [category]_[object]_[action]
**Structure:** category_noun_verb
**Examples:**
```javascript
'ecommerce_checkout_started'
'ecommerce_payment_failed'
'content_article_shared'
'content_video_completed'
'account_password_reset'
'account_email_verified'
```
**Use When:** Organizing events by category
---
## Industry-Specific Naming Examples
### SaaS / Software
```javascript
// Feature Usage
'feature_activated'
'feature_trial_started'
'feature_upgrade_clicked'
'feature_limit_reached'
// Onboarding
'onboarding_started'
'onboarding_step_completed'
'onboarding_skipped'
'onboarding_completed'
// Account Management
'account_upgraded'
'account_downgraded'
'account_cancelled'
'account_reactivated'
// Product Tours
'product_tour_started'
'product_tour_step_viewed'
'product_tour_completed'
'product_tour_dismissed'
// Collaboration
'team_member_invited'
'workspace_created'
'document_shared'
'comment_posted'
```
---
### E-Commerce
```javascript
// Product Discovery
'product_search_performed'
'product_filter_applied'
'product_sort_changed'
'category_browsed'
// Product Interaction
'product_image_zoomed'
'product_variant_selected'
'product_size_chart_viewed'
'product_review_read'
// Cart & Checkout
'cart_item_added'
'cart_item_removed'
'cart_viewed'
'checkout_started'
'checkout_step_completed'
'promo_code_applied'
// Post-Purchase
'order_confirmed'
'review_submitted'
'product_returned'
'subscription_renewed'
```
---
### Education / E-Learning
```javascript
// Course Discovery
'course_search_performed'
'course_preview_watched'
'course_syllabus_viewed'
'instructor_profile_viewed'
// Enrollment
'course_enrolled'
'course_trial_started'
'course_purchased'
'bundle_selected'
// Learning Progress
'lesson_started'
'lesson_completed'
'quiz_attempted'
'quiz_passed'
'certificate_earned'
// Engagement
'discussion_post_created'
'question_asked'
'resource_downloaded'
'video_lecture_watched'
```
---
### Media / Publishing
```javascript
// Content Consumption
'article_opened'
'article_read_complete'
'gallery_image_viewed'
'video_started'
'podcast_played'
// Engagement
'article_shared'
'article_bookmarked'
'comment_posted'
'author_followed'
// Subscription
'paywall_encountered'
'subscription_modal_viewed'
'free_trial_started'
'subscription_purchased'
// Navigation
'category_selected'
'related_article_clicked'
'search_performed'
'navigation_used'
```
---
### Financial Services
```javascript
// Account Actions
'account_application_started'
'account_opened'
'account_verified'
'account_linked'
// Transactions
'transfer_initiated'
'payment_scheduled'
'bill_paid'
'investment_made'
// Tools & Calculators
'loan_calculator_used'
'retirement_planner_opened'
'budget_tool_accessed'
'rate_comparison_viewed'
// Security
'two_factor_enabled'
'security_question_set'
'password_changed'
'device_authorized'
```
---
### Healthcare
```javascript
// Appointments
'appointment_scheduled'
'appointment_rescheduled'
'appointment_cancelled'
'telehealth_started'
// Patient Portal
'test_results_viewed'
'prescription_refill_requested'
'medical_record_downloaded'
'message_sent_to_provider'
// Information
'symptom_checker_used'
'provider_search_performed'
'insurance_verified'
'health_article_read'
```
---
## Parameter Naming Conventions
### General Rules
**Same Conventions as Events:**
- Use snake_case
- Keep under 40 characters
- Be descriptive
- Avoid reserved names
- Be consistent
### Parameter Naming Patterns
#### Pattern 1: [object]_[attribute]
```javascript
'video_duration'
'video_title'
'video_quality'
'button_name'
'button_location'
'button_id'
'form_name'
'form_type'
'form_destination'
'product_id'
'product_name'
'product_category'
```
#### Pattern 2: [context]_[measurement]
```javascript
'completion_percent'
'scroll_depth'
'engagement_time'
'page_views'
'time_spent_seconds'
```
#### Pattern 3: [category]_[object]_[attribute]
```javascript
'ecommerce_item_price'
'ecommerce_item_quantity'
'user_subscription_tier'
'user_account_age'
'content_article_word_count'
```
---
## Common Naming Mistakes
### Mistake 1: Too Generic
```javascript
// ❌ WRONG - Too generic
'click'
'event'
'action'
'data'
'custom_event'
// ✅ CORRECT - Specific and descriptive
'cta_button_clicked'
'form_submit_completed'
'video_play_started'
'filter_applied'
'search_performed'
```
---
### Mistake 2: Inconsistent Naming
```javascript
// ❌ WRONG - Inconsistent pattern
'videoStarted' // camelCase
'video_paused' // snake_case
'VideoPaused' // PascalCase
'video-completed' // kebab-case
// ✅ CORRECT - Consistent snake_case
'video_started'
'video_paused'
'video_resumed'
'video_completed'
```
---
### Mistake 3: Using Abbreviations
```javascript
// ❌ WRONG - Unclear abbreviations
'btn_clk'
'frm_sub'
'vid_cmpltd'
'usr_rgstr'
// ✅ CORRECT - Full words
'button_clicked'
'form_submitted'
'video_completed'
'user_registered'
```
**Exception:** Well-known abbreviations are acceptable
```javascript
// ✅ ACCEPTABLE - Common abbreviations
'pdf_downloaded' // PDF is standard
'cta_clicked' // CTA = Call To Action
'url_shared' // URL is standard
'id_verified' // ID is standard
```
---
### Mistake 4: Including Dynamic Data
```javascript
// ❌ WRONG - Dynamic data in event name
'product_SKU123_viewed'
'user_john_logged_in'
'page_pricing_viewed'
// ✅ CORRECT - Dynamic data in parameters
gtag('event', 'product_viewed', {
'product_id': 'SKU123'
});
gtag('event', 'user_logged_in', {
'user_name': 'john'
});
gtag('event', 'page_viewed', {
'page_type': 'pricing'
});
```
---
### Mistake 5: Too Long
```javascript
// ❌ WRONG - 64 characters (exceeds 40 limit)
'enterprise_customer_onboarding_demo_scheduling_request_completed'
// ✅ CORRECT - 35 characters
'enterprise_demo_scheduled'
// Alternative approach - use parameters for detail
gtag('event', 'demo_scheduled', {
'customer_tier': 'enterprise',
'demo_type': 'onboarding',
'request_status': 'completed'
});
```
---
## Event Naming Checklist
Before finalizing event names:
- [ ] Uses snake_case (lowercase with underscores)
- [ ] Under 40 characters
- [ ] Descriptive and action-oriented
- [ ] Doesn't conflict with reserved Google event names
- [ ] Consistent with other event names in implementation
- [ ] No abbreviations (unless standard like PDF, URL)
- [ ] No dynamic data in name (use parameters instead)
- [ ] No spaces or special characters
- [ ] Documented in event tracking plan
- [ ] Reviewed by team for clarity
---
## Documentation Template
### Event Documentation Format
```
Event Name: [event_name]
Description: [What this event tracks]
When to Fire: [User action or trigger]
Pattern Used: [action_object, object_action, etc.]
Category: [engagement, conversion, navigation, etc.]
Parameters:
- parameter_1: [description] (type: string/number/boolean)
- parameter_2: [description] (type: string/number/boolean)
Example Implementation:
gtag('event', 'event_name', {
'parameter_1': 'value',
'parameter_2': 123
});
Expected Volume: [events per day/week/month]
Key Event: [Yes/No]
Custom Dimensions Needed: [Yes/No - list if yes]
```
### Example Documentation
```
Event Name: video_tutorial_completed
Description: User completes watching a video tutorial
When to Fire: Video reaches 100% completion
Pattern Used: object_action_completed
Category: engagement
Parameters:
- video_id: Unique video identifier (type: string)
- video_title: Title of video (type: string)
- video_duration: Length in seconds (type: number)
- completion_time: Seconds to complete (type: number)
- video_category: Tutorial category (type: string)
Example Implementation:
gtag('event', 'video_tutorial_completed', {
'video_id': 'VID_123',
'video_title': 'GA4 Fundamentals',
'video_duration': 1200,
'completion_time': 1180,
'video_category': 'analytics'
});
Expected Volume: 500 events/week
Key Event: Yes
Custom Dimensions Needed:
- video_category (event-scoped)
- video_duration (metric)
```
---
## Event Taxonomy Example
### Organizing Events by Category
```
Engagement Events:
├── video_started
├── video_paused
├── video_completed
├── article_read
├── article_shared
└── comment_posted
Conversion Events:
├── lead_generated
├── trial_started
├── subscription_purchased
├── account_upgraded
└── demo_requested
Navigation Events:
├── menu_opened
├── search_performed
├── filter_applied
├── category_selected
└── page_scrolled
Feature Usage Events:
├── feature_activated
├── tool_opened
├── calculator_used
├── export_generated
└── settings_changed
Error Events:
├── form_validation_failed
├── payment_declined
├── upload_failed
├── session_timeout
└── error_encountered
```
---
## Naming Convention Quick Reference
| Element | Format | Example | Max Length |
|---------|--------|---------|------------|
| **Event Name** | snake_case | `video_tutorial_watched` | 40 chars |
| **Parameter Name** | snake_case | `video_duration` | 40 chars |
| **Parameter Value (string)** | Any | `HD Quality` | 100 chars* |
| **Currency Code** | ISO 4217 | `USD` | 3 chars |
| **Boolean Value** | true/false | `true` | N/A |
*Exceptions: page_title (300), page_referrer (420), page_location (1000)
---
## Testing Event Names
### DebugView Validation
1. Enable Google Analytics Debugger extension
2. Navigate to Admin → DebugView
3. Trigger event
4. Verify:
- Event name appears correctly
- Event name is not truncated
- Event name follows convention
- Parameters are attached
### Common DebugView Issues
| What You See | Problem | Solution |
|-------------|---------|----------|
| Event name truncated | >40 characters | Shorten name |
| Event name capitalized wrong | Wrong case used | Use snake_case |
| Event not firing | Name typo | Check implementation |
| Multiple similar events | Inconsistent naming | Standardize |
---
## Additional Resources
- Google Analytics Event Naming: https://support.google.com/analytics/answer/9322688
- Recommended Events: https://support.google.com/analytics/answer/9267735
- Event Limits: https://support.google.com/analytics/answer/9267744

View File

@@ -0,0 +1,660 @@
# Event Parameters Complete Guide
## Overview
Event parameters provide context and detail about user interactions in GA4. Understanding parameter structure, limits, and best practices is essential for effective event tracking.
## What Are Event Parameters?
**Definition:** Additional data points attached to events that provide context about user actions.
**Structure:**
```javascript
gtag('event', 'event_name', {
'parameter_name_1': 'value',
'parameter_name_2': 123,
'parameter_name_3': true
});
```
## Parameter Types
### 1. Automatically Collected Parameters
Parameters GA4 collects without additional configuration.
#### Web Stream Standard Parameters
**Page Parameters:**
- `page_location` - Full page URL (max 1000 chars)
- `page_referrer` - Previous page URL (max 420 chars)
- `page_title` - Page title from `<title>` tag (max 300 chars)
**User/Device Parameters:**
- `language` - Browser language (e.g., en-us)
- `screen_resolution` - Device screen size (e.g., 1920x1080)
- `client_id` - Anonymous user identifier
**Engagement Parameters:**
- `engagement_time_msec` - Time engaged in milliseconds
- `session_id` - Current session identifier
- `session_number` - Count of sessions for user
#### App Stream Standard Parameters
- `app_version` - Current application version
- `firebase_screen_id` - Unique screen identifier
- `firebase_screen_class` - Screen class name
- `platform` - iOS or Android
### 2. Enhanced Measurement Parameters
Parameters automatically collected with enhanced measurement events.
#### Scroll Event Parameters
- `engagement_time_msec` - Time engaged before scroll
#### Click Event Parameters
- `link_classes` - CSS classes on link
- `link_domain` - Destination domain
- `link_id` - Element ID
- `link_url` - Full destination URL
- `outbound` - true (for outbound links)
#### File Download Parameters
- `file_extension` - File type (.pdf, .xlsx)
- `file_name` - Name of file
- `link_classes` - CSS classes
- `link_id` - Element ID
- `link_text` - Link text
- `link_url` - Download URL
#### Video Engagement Parameters
- `video_title` - YouTube video title
- `video_url` - YouTube video URL
- `video_duration` - Total length (seconds)
- `video_current_time` - Playback position
- `video_percent` - Milestone reached (10, 25, 50, 75)
- `video_provider` - youtube.com
- `visible` - Viewport visibility (true/false)
#### Form Interaction Parameters
- `form_id` - HTML form ID
- `form_name` - HTML form name
- `form_destination` - Form action URL
- `form_submit_text` - Submit button text
#### Search Parameters
- `search_term` - User's search query
- `unique_search_term` - First occurrence flag
### 3. Recommended Event Parameters
Standardized parameters for Google-defined recommended events.
#### Authentication Parameters
**login event:**
- `method` - Authentication method (email, google, facebook, phone)
**sign_up event:**
- `method` - Registration method (email, google, facebook)
#### Ecommerce Parameters
**Required for purchase event:**
- `transaction_id` - Unique transaction identifier (CRITICAL - must be unique)
- `value` - Total transaction value (numeric)
- `currency` - ISO 4217 currency code (USD, EUR, GBP)
**Recommended for purchase:**
- `tax` - Tax amount (numeric)
- `shipping` - Shipping cost (numeric)
- `items` - Array of product objects (see Items Array section)
- `coupon` - Coupon code applied (string)
- `affiliation` - Store/affiliate name (string)
**Item-level parameters (in items array):**
- `item_id` - Product SKU/ID
- `item_name` - Product name
- `price` - Unit price
- `quantity` - Number of units
- `item_category` - Primary category
- `item_category2` through `item_category5` - Hierarchical categories
- `item_brand` - Brand name
- `item_variant` - Size, color, variant
- `coupon` - Item-level coupon
- `discount` - Discount amount
- `affiliation` - Store name
- `index` - Position in list (0-based)
- `item_list_id` - List identifier
- `item_list_name` - List name
- `location_id` - Physical location ID
#### Search Parameters
- `search_term` - User's search query
#### Content Selection Parameters
- `content_type` - Type of content (article, video, product)
- `item_id` - Content identifier
#### Promotion Parameters
- `promotion_id` - Promotion identifier
- `promotion_name` - Promotion name
- `creative_name` - Creative asset name
- `creative_slot` - Position (banner_slot_1)
### 4. Custom Parameters
Business-specific parameters created for custom events.
**Examples:**
```javascript
// Video tutorial tracking
gtag('event', 'video_tutorial_watched', {
'tutorial_id': 'VID_123',
'tutorial_name': 'GA4 Basics',
'tutorial_duration': 1200, // seconds
'completion_percent': 100,
'difficulty_level': 'beginner',
'language': 'en'
});
// SaaS feature usage
gtag('event', 'feature_activated', {
'feature_name': 'advanced_reporting',
'feature_tier': 'enterprise',
'activation_source': 'settings_page',
'first_time_use': true
});
// E-learning course
gtag('event', 'course_enrollment', {
'course_id': 'COURSE_101',
'course_name': 'Advanced Analytics',
'instructor': 'John Doe',
'price': 99.99,
'currency': 'USD',
'level': 'advanced',
'enrollment_method': 'direct'
});
```
## Parameter Limits and Constraints
### Critical Limits
| Limit Type | Standard GA4 | GA4 360 |
|------------|-------------|---------|
| Parameters per event | 25 | 25 |
| Event-scoped custom dimensions | 50 | 125 |
| User-scoped custom dimensions | 25 | 100 |
| Item-scoped custom dimensions | 10 | 25 |
### Character Limits
| Element | Maximum Characters |
|---------|-------------------|
| Parameter name | 40 |
| Parameter value (standard) | 100 |
| `page_title` parameter | 300 |
| `page_referrer` parameter | 420 |
| `page_location` parameter | 1000 |
### Data Type Constraints
**Supported Types:**
- String (text)
- Number (integer or float)
- Boolean (true/false)
- Array (for items parameter)
**Not Supported:**
- Objects (except items array)
- Nested objects
- Functions
- Null values (use for clearing only)
## Parameter Naming Conventions
### Best Practices
**DO:**
- Use snake_case (lowercase with underscores)
- Be descriptive but concise
- Use consistent naming across events
- Keep under 40 characters
**DON'T:**
- Use spaces or special characters
- Use camelCase or PascalCase
- Use generic names (param1, value, data)
- Include personally identifiable information (PII)
### Naming Patterns
**Recommended Patterns:**
```
[object]_[attribute]
Examples: product_id, user_tier, video_duration
[action]_[attribute]
Examples: purchase_value, scroll_depth, form_name
[category]_[subcategory]_[attribute]
Examples: ecommerce_item_price, video_completion_percent
```
### Reserved Parameter Names
GA4 reserves certain parameter names. Avoid using these for custom parameters:
- `client_id`
- `session_id`
- `session_number`
- `page_location`
- `page_referrer`
- `page_title`
- `language`
- `screen_resolution`
- All recommended event parameter names (transaction_id, value, currency, etc.)
## Items Array Structure
### Overview
The `items` parameter is a special array structure for ecommerce events containing product information.
### Required Fields
At minimum, each item must have:
- `item_id` OR `item_name` (at least one required)
### Complete Item Object
```javascript
{
// Required (at least one)
'item_id': 'SKU_12345',
'item_name': 'Stan and Friends Tee',
// Highly Recommended
'price': 10.01,
'quantity': 3,
'item_category': 'Apparel',
// Optional but Useful
'item_brand': 'Google',
'item_variant': 'green',
'item_category2': 'Adult',
'item_category3': 'Shirts',
'item_category4': 'Crew',
'item_category5': 'Short sleeve',
// Ecommerce Context
'affiliation': 'Google Merchandise Store',
'coupon': 'SUMMER_FUN',
'discount': 2.22,
'index': 0,
'item_list_id': 'related_products',
'item_list_name': 'Related Products',
'location_id': 'L_12345',
// Custom Item Parameters
'item_color': 'green',
'item_size': 'large',
'supplier': 'Vendor_A'
}
```
### Items Array Limits
- Maximum 27 items per event
- Maximum 10 item-scoped custom dimensions per property (standard GA4)
- Maximum 25 item-scoped custom dimensions per property (GA4 360)
### Items Array Example
```javascript
gtag('event', 'purchase', {
'transaction_id': 'TXN_12345',
'value': 142.52,
'currency': 'USD',
'items': [
{
'item_id': 'SKU_001',
'item_name': 'Product A',
'price': 49.99,
'quantity': 2,
'item_category': 'Electronics'
},
{
'item_id': 'SKU_002',
'item_name': 'Product B',
'price': 29.99,
'quantity': 1,
'item_category': 'Accessories'
}
]
});
```
## Parameter Value Formatting
### Currency Values
**Format:** Numeric (not string)
```javascript
// ✅ CORRECT
'value': 99.99,
'currency': 'USD'
// ❌ WRONG
'value': '$99.99',
'currency': '$'
```
**ISO 4217 Currency Codes:**
- USD - US Dollar
- EUR - Euro
- GBP - British Pound
- JPY - Japanese Yen
- CAD - Canadian Dollar
- AUD - Australian Dollar
- CHF - Swiss Franc
### Boolean Values
**Format:** true/false (not string)
```javascript
// ✅ CORRECT
'first_time_user': true,
'promotional_email_opt_in': false
// ❌ WRONG
'first_time_user': 'true',
'promotional_email_opt_in': 'false'
```
### Numeric Values
**Format:** Number (integer or float)
```javascript
// ✅ CORRECT
'quantity': 5,
'duration_seconds': 120,
'rating': 4.5
// ❌ WRONG
'quantity': '5',
'duration_seconds': '120',
'rating': '4.5'
```
### String Values
**Format:** Text within character limits
```javascript
// ✅ CORRECT
'product_name': 'Blue Widget',
'category': 'Widgets',
'description': 'High-quality blue widget'
// ⚠️ WARNING - Will be truncated
'very_long_description': 'This is an extremely long description that exceeds the 100 character limit and will be truncated in GA4 reports which may cause data loss'
```
## Parameter Scopes
Parameters have different scopes determining their application. See **references/parameter-scopes.md** for complete details.
### Quick Reference
**Event Scope:**
Applies to single event occurrence.
Example: `button_name`, `form_id`, `video_title`
**User Scope:**
Applies to all events from user across sessions.
Example: `subscription_tier`, `customer_segment`, `account_type`
**Item Scope:**
Applies to products in ecommerce items array.
Example: `item_color`, `item_size`, `supplier_name`
## Registering Parameters as Custom Dimensions
### Why Register
Custom parameters won't appear in GA4 reports until registered as custom dimensions.
### Registration Process
1. **Send Parameter in Event:**
```javascript
gtag('event', 'video_watched', {
'video_quality': 'hd', // Custom parameter
'video_duration': 300
});
```
2. **Navigate to GA4 Admin:**
Admin → Data Display → Custom Definitions
3. **Create Custom Dimension:**
- Dimension Name: "Video Quality"
- Scope: Event
- Event Parameter: "video_quality"
- Description: "Quality setting of watched videos"
- Click Save
4. **Wait 24-48 Hours:**
Data will populate in reports after processing delay
### Registration Best Practices
**DO:**
- Use descriptive dimension names (appear in reports)
- Match parameter name exactly (case-sensitive)
- Choose correct scope
- Plan dimensions before hitting quota limits
- Document all custom dimensions
**DON'T:**
- Register high-cardinality parameters (unique IDs, timestamps)
- Use dimension names with special characters
- Change scope after creation (not possible)
- Expect immediate data (24-48hr delay)
- Register parameters you won't analyze
## Common Parameter Mistakes
### 1. Missing Currency Parameter
```javascript
// ❌ WRONG - Missing currency
gtag('event', 'purchase', {
'transaction_id': 'TXN_123',
'value': 99.99
});
// ✅ CORRECT
gtag('event', 'purchase', {
'transaction_id': 'TXN_123',
'value': 99.99,
'currency': 'USD'
});
```
### 2. Using Currency Symbols
```javascript
// ❌ WRONG - Currency symbol
'currency': '$'
// ✅ CORRECT - ISO code
'currency': 'USD'
```
### 3. Exceeding Parameter Limit
```javascript
// ❌ WRONG - 30 parameters (exceeds 25 limit)
gtag('event', 'custom_event', {
'param_1': 'value1',
'param_2': 'value2',
// ... 28 more parameters
'param_30': 'value30' // This won't be collected
});
```
### 4. Parameter Name Too Long
```javascript
// ❌ WRONG - 52 characters
'this_is_a_very_long_parameter_name_that_exceeds_limit': 'value'
// ✅ CORRECT - 28 characters
'descriptive_param_name': 'value'
```
### 5. Sending PII
```javascript
// ❌ WRONG - Contains PII
gtag('event', 'form_submit', {
'user_email': 'john@example.com',
'user_phone': '555-1234',
'user_name': 'John Doe'
});
// ✅ CORRECT - No PII
gtag('event', 'form_submit', {
'email_domain': 'example.com',
'form_type': 'contact',
'form_location': 'footer'
});
```
### 6. Wrong Data Types
```javascript
// ❌ WRONG - Numeric values as strings
'quantity': '5',
'price': '99.99',
'in_stock': 'true'
// ✅ CORRECT - Proper types
'quantity': 5,
'price': 99.99,
'in_stock': true
```
## Parameter Testing Checklist
Before deploying event parameters:
- [ ] Parameter names follow snake_case convention
- [ ] Parameter names are under 40 characters
- [ ] Parameter values are under 100 characters (or applicable limit)
- [ ] Total parameters per event ≤ 25
- [ ] Correct data types used (number, string, boolean)
- [ ] Currency uses ISO codes (not symbols)
- [ ] No PII included in parameters
- [ ] Parameters visible in DebugView
- [ ] Custom parameters registered as custom dimensions (if needed)
- [ ] Scope correctly assigned (event/user/item)
- [ ] Documentation created for custom parameters
## Advanced Parameter Patterns
### Conditional Parameters
```javascript
// Only include parameter if value exists
const eventParams = {
'event_category': 'engagement'
};
if (couponCode) {
eventParams.coupon = couponCode;
}
if (userTier) {
eventParams.user_tier = userTier;
}
gtag('event', 'purchase', eventParams);
```
### Dynamic Parameter Values
```javascript
// Calculate parameter values dynamically
gtag('event', 'video_complete', {
'video_id': videoId,
'video_duration': Math.round(duration),
'completion_time': Date.now(),
'engagement_rate': Math.round((watchedTime / totalTime) * 100)
});
```
### Merging Parameter Objects
```javascript
// Combine multiple parameter sources
const baseParams = {
'event_category': 'ecommerce',
'currency': 'USD'
};
const productParams = {
'product_id': 'SKU_123',
'product_name': 'Widget',
'price': 29.99
};
gtag('event', 'view_item', {
...baseParams,
...productParams
});
```
## Parameter Debugging
### Using DebugView
1. Enable debug mode (Google Analytics Debugger extension)
2. Navigate to Admin → DebugView
3. Trigger event
4. Click event in left panel
5. Inspect parameters in right panel
**What to Check:**
- All expected parameters present
- Parameter names correct (case-sensitive)
- Parameter values correct type and format
- No truncation of values
- Parameters within limits (≤25)
### Common DebugView Issues
| What You See | Problem | Solution |
|-------------|---------|----------|
| Parameter missing | Not sent in event | Check event code |
| Parameter value wrong | Incorrect data source | Verify variable/value |
| Parameter truncated | Exceeds character limit | Shorten value |
| Too many parameters | >25 sent | Reduce parameter count |
| Parameter not in reports | Not registered as dimension | Register in Admin |
## Additional Resources
- Official GA4 Event Parameters: https://support.google.com/analytics/answer/9267735
- Custom Dimensions Guide: https://support.google.com/analytics/answer/10075209
- Items Array Reference: https://developers.google.com/analytics/devguides/collection/ga4/ecommerce

View File

@@ -0,0 +1,781 @@
# Event Types Complete Reference
## Overview
GA4 uses four distinct event categories, each serving a specific purpose in the measurement architecture. Understanding these categories is essential for implementing comprehensive tracking.
## Event Category 1: Automatically Collected Events
### Definition
Events that fire automatically when GA4 tracking code is installed, requiring no additional configuration.
### Core Automatic Events
#### session_start
**Trigger:** User session begins
**Platform:** Web and App
**Parameters (automatic):**
- `page_location` - Current page URL
- `page_referrer` - Previous page URL
- `ga_session_id` - Session identifier
- `ga_session_number` - Session count for user
**Use Case:** Session tracking, session-based metrics
---
#### first_visit
**Trigger:** User's first visit to website or app
**Platform:** Web and App
**Parameters (automatic):**
- All standard page parameters
- `first_visit_time` - Timestamp of first visit
**Use Case:** New user acquisition tracking, user lifecycle analysis
---
#### user_engagement
**Trigger:** App in foreground OR webpage in focus for 1+ second
**Platform:** Web and App
**Parameters (automatic):**
- `engagement_time_msec` - Time engaged in milliseconds
**Use Case:** Engagement metrics, active time tracking
**Important:** This is how GA4 measures "engaged sessions"
---
#### page_view (when enhanced measurement enabled)
**Trigger:** Page loads
**Platform:** Web only
**Parameters (automatic):**
- `page_location` - Full page URL
- `page_referrer` - Previous page URL
- `page_title` - Page title from `<title>` tag
- `engagement_time_msec` - Time on page
**Use Case:** Page tracking, content analysis
**Note:** Also part of Enhanced Measurement but listed here for completeness
---
### App-Only Automatic Events
#### first_open
**Trigger:** App launched after installation
**Platform:** App only
**Parameters (automatic):**
- `previous_app_version` - Version before update (if applicable)
**Use Case:** App install tracking, version migration analysis
---
## Event Category 2: Enhanced Measurement Events
### Definition
Automatically tracked interactions that can be toggled on/off in GA4 Admin settings (Data Streams → Web Stream → Enhanced measurement).
### Configuration Location
Admin → Data Collection and Modification → Data Streams → [Select Web Stream] → Enhanced measurement (gear icon)
### Enhanced Measurement Events
#### page_view
**Trigger:** Page loads OR history state changes (SPA navigation)
**Toggle:** On/Off
**Parameters:**
- `page_location` - Current URL
- `page_referrer` - Previous URL
- `page_title` - Page title
- `engagement_time_msec` - Time engaged
**Use Case:** Page tracking for both traditional and single-page applications
---
#### scroll
**Trigger:** User scrolls to 90% of page vertical depth
**Toggle:** On/Off
**Parameters:**
- `engagement_time_msec` - Time engaged before scroll
**Limitation:** Only 90% depth tracked (not customizable in enhanced measurement)
**Custom Implementation:** For multiple thresholds (25%, 50%, 75%, 90%), implement custom scroll tracking via GTM
---
#### click (Outbound Links)
**Trigger:** Click on link leading to different domain
**Toggle:** On/Off
**Parameters:**
- `link_classes` - CSS classes on link element
- `link_domain` - Destination domain
- `link_id` - Element ID
- `link_url` - Full destination URL
- `outbound` - true (identifies as outbound click)
**Use Case:** External link tracking, content engagement analysis
---
#### file_download
**Trigger:** Click on link to common file extensions
**Toggle:** On/Off
**Tracked Extensions:**
- pdf, xlsx, docx, txt, rtf, csv, xls, ppt, pptx
- 7z, pkg, rar, gz, zip, avi, mov, mp4, mpeg, wmv, midi, mp3, wav, wma
**Parameters:**
- `file_extension` - File type (.pdf, .xlsx, etc.)
- `file_name` - Name of downloaded file
- `link_classes` - CSS classes
- `link_id` - Element ID
- `link_text` - Link text
- `link_url` - Download URL
**Use Case:** Content download tracking, resource engagement
---
#### view_search_results
**Trigger:** URL query parameter detected indicating site search
**Toggle:** On/Off (with configuration)
**Configuration:** Specify search query parameter name (default: q, s, search, query)
**Parameters:**
- `search_term` - User's search query
- `unique_search_term` - First occurrence flag
**Use Case:** Site search analysis, content discoverability
---
#### video_start
**Trigger:** YouTube embedded video starts playing
**Toggle:** On/Off (Video engagement setting)
**Requirements:** YouTube video with JS API enabled
**Parameters:**
- `video_title` - YouTube video title
- `video_url` - YouTube video URL
- `video_duration` - Total video length (seconds)
- `video_current_time` - Playback position
- `video_provider` - youtube.com
- `visible` - true/false (viewport visibility)
**Use Case:** Video engagement tracking
---
#### video_progress
**Trigger:** Video reaches 10%, 25%, 50%, 75% completion
**Toggle:** On/Off (Video engagement setting)
**Parameters:**
- `video_title`
- `video_url`
- `video_duration`
- `video_current_time`
- `video_percent` - Milestone reached (10, 25, 50, 75)
- `video_provider` - youtube.com
- `visible` - Viewport visibility
**Use Case:** Video completion funnel analysis
---
#### video_complete
**Trigger:** Video playback reaches 100%
**Toggle:** On/Off (Video engagement setting)
**Parameters:**
- `video_title`
- `video_url`
- `video_duration`
- `video_current_time`
- `video_provider`
- `visible`
**Use Case:** Video completion tracking
---
#### form_start
**Trigger:** User first interacts with form in session
**Toggle:** On/Off (Form interactions setting)
**Parameters:**
- `form_id` - HTML form ID attribute
- `form_name` - HTML form name attribute
- `form_destination` - Form action URL
**Use Case:** Form engagement tracking, conversion funnel
**Limitation:** Fires once per session (not per form submission)
---
#### form_submit
**Trigger:** Form submitted
**Toggle:** On/Off (Form interactions setting)
**Parameters:**
- `form_id`
- `form_name`
- `form_destination`
- `form_submit_text` - Submit button text
**Use Case:** Form conversion tracking, lead generation
---
## Event Category 3: Recommended Events
### Definition
Google-defined event names with standardized parameter structures. Using these ensures compatibility with GA4 features, Google Ads integration, and industry benchmarking.
### Why Use Recommended Events
**Benefits:**
- Enable standard reports (Ecommerce reports, Purchase funnel)
- Required for conversion modeling
- Compatible with Google Ads
- Audience building support
- Industry benchmarking
### Engagement Recommended Events
#### login
**When to Fire:** User successfully authenticates
**Required Parameters:** None
**Recommended Parameters:**
- `method` - Authentication method (email, google, facebook, phone)
**Implementation Example:**
```javascript
gtag('event', 'login', {
'method': 'email'
});
```
---
#### sign_up
**When to Fire:** New user account created
**Required Parameters:** None
**Recommended Parameters:**
- `method` - Registration method (email, google, facebook)
**Implementation Example:**
```javascript
gtag('event', 'sign_up', {
'method': 'google'
});
```
---
#### search
**When to Fire:** User performs site search
**Required Parameters:** None
**Recommended Parameters:**
- `search_term` - User's search query
**Implementation Example:**
```javascript
gtag('event', 'search', {
'search_term': 'blue widgets'
});
```
---
#### select_content
**When to Fire:** User selects content item
**Required Parameters:** None
**Recommended Parameters:**
- `content_type` - Type of content (article, video, product)
- `item_id` - Content identifier
**Implementation Example:**
```javascript
gtag('event', 'select_content', {
'content_type': 'article',
'item_id': 'A123'
});
```
---
### Monetization Recommended Events
#### view_item
**When to Fire:** Product page viewed
**Required Parameters:**
- `items` - Array with at least `item_id` OR `item_name`
**Recommended Parameters:**
- `value` - Item value
- `currency` - ISO currency code (USD, EUR, GBP)
**Implementation Example:**
```javascript
gtag('event', 'view_item', {
'items': [
{
'item_id': 'SKU_123',
'item_name': 'Blue T-Shirt',
'item_category': 'Apparel',
'price': 29.99,
'quantity': 1
}
],
'value': 29.99,
'currency': 'USD'
});
```
---
#### add_to_cart
**When to Fire:** Item added to shopping cart
**Required Parameters:**
- `items` - Array of product objects
**Recommended Parameters:**
- `value` - Cart value
- `currency` - ISO currency code
**Implementation Example:**
```javascript
gtag('event', 'add_to_cart', {
'items': [
{
'item_id': 'SKU_123',
'item_name': 'Blue T-Shirt',
'price': 29.99,
'quantity': 1
}
],
'value': 29.99,
'currency': 'USD'
});
```
---
#### remove_from_cart
**When to Fire:** Item removed from cart
**Required Parameters:**
- `items` - Array with removed product
**Recommended Parameters:**
- `value` - Value of removed items
- `currency` - ISO currency code
---
#### view_cart
**When to Fire:** Shopping cart viewed
**Required Parameters:**
- `items` - Array of cart contents
**Recommended Parameters:**
- `value` - Total cart value
- `currency` - ISO currency code
---
#### begin_checkout
**When to Fire:** Checkout process initiated
**Required Parameters:**
- `items` - Array of products in cart
- `value` - Total transaction value
- `currency` - ISO currency code
**Recommended Parameters:**
- `coupon` - Coupon code applied
**Implementation Example:**
```javascript
gtag('event', 'begin_checkout', {
'items': [
{
'item_id': 'SKU_123',
'item_name': 'Blue T-Shirt',
'price': 29.99,
'quantity': 2
}
],
'value': 59.98,
'currency': 'USD',
'coupon': 'SUMMER10'
});
```
---
#### add_payment_info
**When to Fire:** Payment information entered
**Required Parameters:** None
**Recommended Parameters:**
- `payment_type` - Payment method (credit_card, paypal, gift_card)
- `items` - Array of products
- `value` - Transaction value
- `currency` - ISO currency code
---
#### add_shipping_info
**When to Fire:** Shipping method selected
**Required Parameters:** None
**Recommended Parameters:**
- `shipping_tier` - Shipping option (ground, overnight, express)
- `value` - Transaction value
- `currency` - ISO currency code
- `items` - Array of products
---
#### purchase
**When to Fire:** Purchase completed (transaction finalized)
**Required Parameters:**
- `transaction_id` - Unique transaction identifier
- `value` - Total revenue
- `currency` - ISO currency code
**Recommended Parameters:**
- `tax` - Tax amount
- `shipping` - Shipping cost
- `items` - Array of purchased products
- `coupon` - Coupon code
- `affiliation` - Store/affiliate name
**Implementation Example:**
```javascript
gtag('event', 'purchase', {
'transaction_id': 'TXN_12345',
'affiliation': 'Google Merchandise Store',
'value': 142.52,
'currency': 'USD',
'tax': 10.00,
'shipping': 5.00,
'coupon': 'SUMMER_FUN',
'items': [
{
'item_id': 'SKU_12345',
'item_name': 'Stan and Friends Tee',
'affiliation': 'Google Merchandise Store',
'coupon': 'SUMMER_FUN',
'discount': 2.22,
'index': 0,
'item_brand': 'Google',
'item_category': 'Apparel',
'item_category2': 'Adult',
'item_category3': 'Shirts',
'item_variant': 'green',
'price': 10.01,
'quantity': 3
}
]
});
```
**CRITICAL:** Mark as Key Event in GA4 Admin for conversion tracking
---
#### refund
**When to Fire:** Purchase refunded
**Required Parameters:**
- `transaction_id` - Original transaction ID
**Recommended Parameters:**
- `value` - Refund amount
- `currency` - ISO currency code
- `items` - Array of refunded items
---
### Other Recommended Events
#### generate_lead
**When to Fire:** Lead generated (form submission, contact request)
**Parameters:**
- `value` - Estimated lead value
- `currency` - ISO currency code
---
#### view_promotion
**When to Fire:** Promotion/banner displayed
**Parameters:**
- `promotion_id` - Promotion identifier
- `promotion_name` - Promotion name
- `items` - Featured products (optional)
---
#### select_promotion
**When to Fire:** User clicks promotion
**Parameters:**
- `promotion_id`
- `promotion_name`
- `items` - Featured products
---
## Event Category 4: Custom Events
### Definition
Business-specific events created for unique tracking requirements not covered by recommended events.
### When to Create Custom Events
Create custom events when:
- No recommended event fits your use case
- Tracking unique business processes
- Measuring proprietary features
- Tracking non-standard user interactions
### Custom Event Examples by Industry
#### SaaS / Software
```javascript
// Feature usage
gtag('event', 'feature_activated', {
'feature_name': 'advanced_analytics',
'user_tier': 'enterprise',
'trial_status': 'active'
});
// Product tour
gtag('event', 'product_tour_completed', {
'tour_name': 'onboarding_v2',
'completion_time_seconds': 180,
'steps_completed': 7
});
```
#### Education / E-Learning
```javascript
// Course enrollment
gtag('event', 'course_enrollment', {
'course_id': 'GA4_101',
'course_name': 'GA4 Fundamentals',
'instructor': 'John Doe',
'price': 99.99,
'currency': 'USD',
'level': 'beginner'
});
// Lesson completion
gtag('event', 'lesson_completed', {
'course_id': 'GA4_101',
'lesson_id': 'lesson_3',
'lesson_title': 'Event Tracking',
'time_spent_minutes': 15
});
```
#### Media / Content
```javascript
// Article engagement
gtag('event', 'article_read_complete', {
'article_id': 'A123',
'article_title': 'GA4 Guide',
'category': 'analytics',
'author': 'Jane Smith',
'word_count': 2500,
'time_to_read_minutes': 10
});
// Content sharing
gtag('event', 'content_shared', {
'content_type': 'article',
'content_id': 'A123',
'share_method': 'twitter',
'share_location': 'article_footer'
});
```
#### Finance / Banking
```javascript
// Account actions
gtag('event', 'account_created', {
'account_type': 'checking',
'method': 'online',
'branch_location': 'none'
});
// Calculator usage
gtag('event', 'loan_calculator_used', {
'calculator_type': 'mortgage',
'loan_amount': 250000,
'loan_term_years': 30,
'interest_rate': 3.5
});
```
### Custom Event Best Practices
**DO:**
- Use descriptive, action-oriented names
- Follow snake_case naming convention
- Keep names under 40 characters
- Include relevant context in parameters
- Document all custom events
- Test in DebugView before production
**DON'T:**
- Use generic names (event1, custom_event, data)
- Exceed 500 unique event names per property
- Send PII (personally identifiable information)
- Create custom events when recommended events exist
- Use spaces or special characters in names
- Forget to register parameters as custom dimensions
### Custom Event Planning Template
```
Event Name: [action]_[object]_[context]
Purpose: [Business goal]
When to Fire: [User action trigger]
Parameters:
- parameter_1: [description] (scope: event/user/item)
- parameter_2: [description] (scope: event/user/item)
Expected Volume: [events per day/week]
Custom Dimensions Needed: [Yes/No]
Key Event: [Yes/No]
```
---
## Event Category Comparison
| Category | Configuration Required | Code Required | Customizable | Use Case |
|----------|----------------------|---------------|--------------|----------|
| **Automatic** | No | No | No | Core session tracking |
| **Enhanced Measurement** | Toggle on/off | No | Limited | Common web interactions |
| **Recommended** | No | Yes | Parameters only | Standard business events |
| **Custom** | No | Yes | Fully | Unique business needs |
---
## Event Implementation Checklist
For each event implementation:
- [ ] Event name follows snake_case convention
- [ ] Event name is under 40 characters
- [ ] Using recommended event if available
- [ ] All required parameters included
- [ ] Parameter names are under 40 characters
- [ ] Parameter values under 100 characters (or applicable limit)
- [ ] Maximum 25 parameters per event
- [ ] Parameters have correct scope (event/user/item)
- [ ] Tested in DebugView
- [ ] Custom parameters registered as custom dimensions (if needed)
- [ ] Event marked as Key Event if conversion (if applicable)
- [ ] Documentation created for custom events
---
## Additional Resources
- Official GA4 Events Documentation: https://support.google.com/analytics/answer/9322688
- Recommended Events Reference: https://support.google.com/analytics/answer/9267735
- Enhanced Measurement: https://support.google.com/analytics/answer/9216061

View File

@@ -0,0 +1,716 @@
# Parameter Scopes Complete Guide
## Overview
GA4 uses three distinct scopes that determine how parameters are applied and analyzed: Event scope, User scope, and Item scope. Understanding scopes is critical for proper data collection and reporting.
## What is Scope?
**Definition:** Scope determines what data the parameter applies to and how long it persists.
**Three Scopes:**
1. **Event Scope** - Applies to single event occurrence
2. **User Scope** - Applies to all events from that user
3. **Item Scope** - Applies to products in ecommerce events
## Event Scope (Event-Scoped Parameters)
### Definition
Event-scoped parameters apply only to the specific event they're sent with. They describe what happened in that particular interaction.
### Characteristics
**Lifespan:** Single event only
**Persistence:** Does not carry over to other events
**Use For:** Event-specific details and context
### Common Use Cases
**User Actions:**
- Button clicks (which button, where)
- Form submissions (which form, form type)
- Video interactions (video title, duration, quality)
- Link clicks (link URL, link text, destination)
**Content:**
- Page information (current page, previous page)
- Search queries (search term)
- Filter selections (category, price range)
**Engagement:**
- Scroll depth (percentage)
- Time spent (duration)
- Completion status (percent complete)
### Event-Scoped Examples
#### Example 1: Button Click
```javascript
gtag('event', 'button_click', {
'button_name': 'Subscribe Now', // Event-scoped
'button_location': 'header', // Event-scoped
'button_id': 'btn_subscribe_01', // Event-scoped
'target_page': '/pricing' // Event-scoped
});
```
**Why Event-Scoped:**
- Only applies to this specific button click
- Different button clicks will have different values
- Describes this particular interaction
#### Example 2: Form Submission
```javascript
gtag('event', 'form_submit', {
'form_id': 'contact-form-v2', // Event-scoped
'form_name': 'Contact Us', // Event-scoped
'form_type': 'lead_generation', // Event-scoped
'form_destination': '/thank-you', // Event-scoped
'fields_completed': 5 // Event-scoped
});
```
**Why Event-Scoped:**
- Specific to this form submission
- Next form submission may have different form_id, form_name
- Describes details of this event only
#### Example 3: Video Engagement
```javascript
gtag('event', 'video_complete', {
'video_id': 'VID_123', // Event-scoped
'video_title': 'GA4 Tutorial', // Event-scoped
'video_duration': 1200, // Event-scoped (seconds)
'video_quality': 'hd', // Event-scoped
'completion_percent': 100, // Event-scoped
'watch_time_seconds': 1150 // Event-scoped
});
```
**Why Event-Scoped:**
- Describes this specific video watch event
- Each video_complete event has different video details
- Time-specific data for this viewing
### Registering Event-Scoped Custom Dimensions
**Process:**
1. **Send Parameter in Event:**
```javascript
gtag('event', 'custom_event', {
'custom_parameter': 'value' // Event-scoped
});
```
2. **Navigate to GA4 Admin:**
Admin → Data Display → Custom Definitions
3. **Create Custom Dimension:**
- **Dimension Name:** "Custom Parameter Name"
- **Scope:** **Event** ← Select Event
- **Event Parameter:** "custom_parameter"
- Description: What this parameter tracks
- Click Save
4. **Wait 24-48 hours for data population**
### Event Scope Limits
**Standard GA4:**
- 50 event-scoped custom dimensions per property
**GA4 360:**
- 125 event-scoped custom dimensions per property
---
## User Scope (User-Scoped Parameters / User Properties)
### Definition
User-scoped parameters (user properties) apply to all events from a specific user. They describe attributes of the user that persist across sessions.
### Characteristics
**Lifespan:** All user events until changed or cleared
**Persistence:** Carries over to all subsequent events from that user
**Use For:** User attributes, demographics, membership status, preferences
### Common Use Cases
**User Attributes:**
- Subscription tier (free, pro, enterprise)
- Customer segment (new, returning, vip)
- Account type (individual, business, enterprise)
- Membership status (trial, active, expired)
**User Behavior:**
- Customer lifetime value
- Years as customer
- Purchase frequency
- Engagement level
**User Preferences:**
- Preferred language
- Communication preferences
- Theme preference (light/dark)
- Notification settings
### User-Scoped Examples
#### Example 1: User Subscription Tier
```javascript
// Set once after login or tier change
gtag('set', {
'subscription_tier': 'premium', // User-scoped
'account_type': 'business', // User-scoped
'years_customer': 3 // User-scoped
});
// Now ALL subsequent events include these properties
gtag('event', 'page_view'); // Includes subscription_tier
gtag('event', 'button_click'); // Includes subscription_tier
gtag('event', 'purchase'); // Includes subscription_tier
```
**Why User-Scoped:**
- Applies to this user across all interactions
- Persists across multiple events and sessions
- Describes who the user is, not what they did
#### Example 2: Customer Segmentation
```javascript
gtag('set', {
'customer_segment': 'high_value', // User-scoped
'customer_lifetime_value': 5000, // User-scoped
'first_purchase_date': '2023-01-15', // User-scoped
'preferred_category': 'electronics' // User-scoped
});
```
**Why User-Scoped:**
- Attributes of the user that don't change per event
- Used for segmentation across all user actions
- Describes user characteristics
#### Example 3: User Preferences
```javascript
gtag('set', {
'preferred_language': 'en', // User-scoped
'theme_preference': 'dark', // User-scoped
'email_opt_in': true, // User-scoped
'notification_enabled': true // User-scoped
});
```
**Why User-Scoped:**
- Settings that apply to all user interactions
- Persist across sessions
- Help understand user behavior patterns
### User ID (Special User Property)
**Implementation:**
```javascript
// After user login
gtag('set', {
'user_id': 'user_12345' // Special user-scoped identifier
});
// On logout - MUST set to null
gtag('set', {
'user_id': null // NOT empty string ""
});
```
**Purpose:**
- Cross-device tracking
- Cross-session tracking
- User journey analysis
**Requirements:**
- Must be unique per user
- Must be persistent (same across devices/sessions)
- Cannot be PII (no email addresses, names)
- Must clear on logout (set to null)
### Registering User-Scoped Custom Dimensions
**Process:**
1. **Send User Property:**
```javascript
gtag('set', {
'custom_user_property': 'value' // User-scoped
});
```
2. **Navigate to GA4 Admin:**
Admin → Data Display → Custom Definitions
3. **Create Custom Dimension:**
- **Dimension Name:** "Custom User Property Name"
- **Scope:** **User** ← Select User
- **User Property:** "custom_user_property"
- Description: What this property represents
- Click Save
4. **Wait 24-48 hours for data population**
### User Scope Limits
**Standard GA4:**
- 25 user-scoped custom dimensions per property
**GA4 360:**
- 100 user-scoped custom dimensions per property
### User Scope Best Practices
**DO:**
- Set user properties after user identification (login, registration)
- Use for attributes that rarely change
- Clear user_id on logout (set to null)
- Use consistent values (always "premium", not "Premium" or "PREMIUM")
**DON'T:**
- Send PII (personally identifiable information)
- Use for event-specific data
- Change user properties frequently (not event-by-event)
- Exceed property limits (plan carefully)
---
## Item Scope (Item-Scoped Parameters)
### Definition
Item-scoped parameters apply to individual products in ecommerce events. They describe product-specific attributes.
### Characteristics
**Lifespan:** That transaction/ecommerce event only
**Persistence:** Applies to items in items array
**Use For:** Product-level details in ecommerce tracking
### Common Use Cases
**Product Attributes:**
- Product color, size, variant
- Product category, subcategory
- Product brand, manufacturer
- Product SKU, UPC
**Product Details:**
- Supplier/vendor information
- Warehouse location
- Stock status
- Product rating/reviews
**Product Pricing:**
- Individual price
- Discount applied
- Coupon used
- Margin/cost
### Item-Scoped Examples
#### Example 1: Product Purchase with Item Details
```javascript
gtag('event', 'purchase', {
'transaction_id': 'TXN_12345',
'value': 142.52,
'currency': 'USD',
'items': [
{
'item_id': 'SKU_123',
'item_name': 'Blue T-Shirt',
// Standard item parameters
'price': 29.99,
'quantity': 2,
'item_category': 'Apparel',
'item_brand': 'Brand A',
// Item-scoped custom parameters
'item_color': 'blue', // Item-scoped
'item_size': 'large', // Item-scoped
'supplier': 'Vendor_XYZ', // Item-scoped
'warehouse_location': 'US-WEST' // Item-scoped
},
{
'item_id': 'SKU_124',
'item_name': 'Red Shoes',
'price': 82.54,
'quantity': 1,
// Different item-scoped values for this product
'item_color': 'red', // Item-scoped
'item_size': '10', // Item-scoped
'supplier': 'Vendor_ABC', // Item-scoped
'warehouse_location': 'US-EAST' // Item-scoped
}
]
});
```
**Why Item-Scoped:**
- Each product has different color, size, supplier
- Attributes specific to individual items in cart
- Enables product-level analysis
#### Example 2: Custom Product Attributes
```javascript
gtag('event', 'add_to_cart', {
'currency': 'USD',
'value': 199.99,
'items': [
{
'item_id': 'LAPTOP_001',
'item_name': 'Gaming Laptop',
'price': 199.99,
'quantity': 1,
// Custom item-scoped parameters
'processor': 'Intel i7', // Item-scoped
'ram_gb': 16, // Item-scoped
'storage_type': 'SSD', // Item-scoped
'screen_size_inches': 15.6, // Item-scoped
'condition': 'new', // Item-scoped
'warranty_years': 2 // Item-scoped
}
]
});
```
**Why Item-Scoped:**
- Product specifications unique to this item
- Enables filtering/analysis by product attributes
- Helps understand what drives purchases
### Registering Item-Scoped Custom Dimensions
**Process:**
1. **Send Item Parameter in Items Array:**
```javascript
gtag('event', 'purchase', {
'items': [
{
'item_id': 'SKU_123',
'item_name': 'Product',
'custom_item_param': 'value' // Item-scoped
}
]
});
```
2. **Navigate to GA4 Admin:**
Admin → Data Display → Custom Definitions
3. **Create Custom Dimension:**
- **Dimension Name:** "Custom Item Attribute"
- **Scope:** **Item** ← Select Item
- **Event Parameter:** "custom_item_param"
- Description: What item attribute this tracks
- Click Save
4. **Wait 24-48 hours for data population**
### Item Scope Limits
**Standard GA4:**
- 10 item-scoped custom dimensions per property
- Maximum 27 items per event
**GA4 360:**
- 25 item-scoped custom dimensions per property
- Maximum 27 items per event
### Item Scope Best Practices
**DO:**
- Use for product-specific attributes
- Include in all ecommerce events (view_item, add_to_cart, purchase)
- Be consistent with parameter names across items
- Use for analysis/filtering products
**DON'T:**
- Exceed 27 items per event
- Use for user-level data (use user scope instead)
- Use for event-level data (use event scope instead)
- Forget to register item parameters as item-scoped dimensions
---
## Scope Comparison Table
| Aspect | Event Scope | User Scope | Item Scope |
|--------|------------|------------|------------|
| **Applies To** | Single event | All user events | Products in items array |
| **Lifespan** | One event | All sessions | One transaction |
| **Persistence** | No | Yes (until changed) | No |
| **Use Case** | Event details | User attributes | Product details |
| **Examples** | button_name, form_id | subscription_tier, user_type | item_color, item_size |
| **Max Dimensions (Standard)** | 50 | 25 | 10 |
| **Max Dimensions (GA4 360)** | 125 | 100 | 25 |
| **Set Method** | gtag('event', ...) | gtag('set', ...) | items array |
---
## Choosing the Right Scope
### Decision Framework
**Ask these questions:**
1. **Does this data describe the USER?**
- Examples: subscription_tier, customer_segment, years_customer
- **Scope:** User
- **Why:** Attribute of who the user is
2. **Does this data describe the EVENT/ACTION?**
- Examples: button_name, form_id, video_title
- **Scope:** Event
- **Why:** Specific to this interaction
3. **Does this data describe a PRODUCT?**
- Examples: item_color, item_size, supplier
- **Scope:** Item
- **Why:** Product-level detail in ecommerce
### Scope Selection Examples
#### Example 1: Form Tracking
```javascript
gtag('event', 'form_submit', {
// Event-scoped (describes THIS form submission)
'form_id': 'contact-form',
'form_type': 'lead_generation',
'form_location': 'footer',
// User-scoped (describes WHO submitted)
'user_tier': 'premium', // Set via gtag('set')
'account_age_days': 365 // Set via gtag('set')
});
```
#### Example 2: Ecommerce Purchase
```javascript
gtag('event', 'purchase', {
// Event-scoped (describes THIS transaction)
'transaction_id': 'TXN_123',
'value': 99.99,
'currency': 'USD',
'payment_method': 'credit_card',
// User-scoped (WHO made purchase) - set separately
// gtag('set', {'customer_lifetime_value': 5000})
// Item-scoped (WHAT was purchased)
'items': [
{
'item_id': 'SKU_123',
'item_color': 'blue', // Item-scoped
'item_size': 'large' // Item-scoped
}
]
});
```
#### Example 3: Video Tracking
```javascript
// User property (set once)
gtag('set', {
'user_subscription': 'premium' // User-scoped
});
// Video event
gtag('event', 'video_complete', {
// Event-scoped (describes THIS video watch)
'video_id': 'VID_123',
'video_title': 'GA4 Tutorial',
'video_duration': 1200,
'completion_percent': 100
});
```
---
## Common Scope Mistakes
### Mistake 1: Using Event Scope for User Attributes
```javascript
// ❌ WRONG - subscription_tier sent as event parameter
gtag('event', 'page_view', {
'subscription_tier': 'premium' // Will only apply to this event
});
// ✅ CORRECT - subscription_tier as user property
gtag('set', {
'subscription_tier': 'premium' // Applies to all events
});
```
### Mistake 2: Using User Scope for Event Details
```javascript
// ❌ WRONG - button_name as user property
gtag('set', {
'button_name': 'Subscribe' // Will apply to ALL events (incorrect)
});
// ✅ CORRECT - button_name as event parameter
gtag('event', 'button_click', {
'button_name': 'Subscribe' // Only applies to this click
});
```
### Mistake 3: Not Using Item Scope for Products
```javascript
// ❌ WRONG - product color as event parameter
gtag('event', 'purchase', {
'product_color': 'blue' // Can't handle multiple products
});
// ✅ CORRECT - product color in items array
gtag('event', 'purchase', {
'items': [
{
'item_id': 'SKU_123',
'item_color': 'blue' // Item-scoped, handles multiple products
}
]
});
```
### Mistake 4: Changing Scope After Registration
**Problem:** Cannot change scope after custom dimension is registered
```
Created dimension with Event scope
Realize it should be User scope
Cannot change scope
Must create NEW dimension
```
**Solution:** Plan scopes carefully before registering dimensions
---
## Scope Planning Checklist
Before implementing parameters:
- [ ] Identify all parameters to collect
- [ ] Determine scope for each parameter (event/user/item)
- [ ] Verify scope choice with decision framework
- [ ] Plan custom dimension registrations
- [ ] Check against scope limits (50 event, 25 user, 10 item)
- [ ] Document parameter scope decisions
- [ ] Test in DebugView before production
- [ ] Register dimensions with correct scope
- [ ] Verify data in reports after 24-48 hours
---
## Advanced Scope Patterns
### Pattern 1: Combining Scopes for Rich Context
```javascript
// 1. Set user properties (User scope)
gtag('set', {
'user_tier': 'enterprise',
'customer_segment': 'high_value'
});
// 2. Fire event with event parameters (Event scope)
gtag('event', 'purchase', {
'payment_method': 'invoice', // Event scope
'purchase_channel': 'phone', // Event scope
'items': [
{
'item_id': 'SKU_123',
'item_color': 'blue', // Item scope
'supplier': 'Vendor_A' // Item scope
}
]
});
// Result: Event has all three scopes of context
```
### Pattern 2: Dynamic User Property Updates
```javascript
// Update user property based on action
function updateUserEngagement(action) {
const engagementLevels = {
'page_view': 'low',
'form_submit': 'medium',
'purchase': 'high'
};
gtag('set', {
'engagement_level': engagementLevels[action]
});
}
// Call when engagement level changes
updateUserEngagement('purchase');
```
### Pattern 3: Item Scope with Custom Calculations
```javascript
gtag('event', 'purchase', {
'items': [
{
'item_id': 'SKU_123',
'price': 100,
'quantity': 2,
// Calculated item-scoped parameters
'profit_margin': calculateMargin(100, 60), // 40%
'stock_status': getStockStatus('SKU_123'), // 'in_stock'
'popularity_rank': getRank('SKU_123') // 5
}
]
});
```
---
## Additional Resources
- Official GA4 Scopes Documentation: https://support.google.com/analytics/answer/11396839
- Custom Dimensions Guide: https://support.google.com/analytics/answer/10075209
- User Properties: https://support.google.com/analytics/answer/9355671