# 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