GA4, GTM, and sGTM Naming Conventions Checklist
Naming conventions are not style preferences—they are infrastructure. When your team is coordinating across GTM, GA4, and server-side systems, ambiguous names create misunderstandings, breaks tracking, and slow down audits.
This is a working checklist you can adopt directly. Copy it, fill in your org-specific values, and link it in your GTM container documentation.
GA4 Event Naming
Section titled “GA4 Event Naming”Core Rules
Section titled “Core Rules”- Use snake_case exclusively:
purchase_complete,form_submit, notpurchaseCompleteorPurchase Complete - Be descriptive but concise:
form_submitgood,user_submitted_contact_form_on_websitebad - No PII or sensitive data: Event name should never contain email, phone, or account number
- Maximum 40 characters: GA4 has a 40-char limit; stay under 35 to leave room for platform prefixes
- Use verbs for actions:
purchase_complete,cart_abandon,video_play - Use nouns for states:
page_view,session_start(avoidpage_viewed,session_started)
Custom Event Naming Pattern
Section titled “Custom Event Naming Pattern”[action]_[object]_[context]
action: purchase, add, remove, submit, start, complete, abandon, view, clickobject: product, cart, form, video, page, listcontext: (optional, clarifies business meaning) checkout, wishlist, newsletter
Examples:- purchase_complete (not: transaction_completed, checkout_success)- cart_abandon (not: abandoned_cart_event)- form_submit_newsletter (not: newsletter_signup_form_submit)- video_start_homepage (not: homepage_video_play)Reserved Event Names (Google-defined)
Section titled “Reserved Event Names (Google-defined)”GA4 automatically captures these. Do not override them:
page_view # Automaticclick # Automatic when element tracking enabledscroll # Automatic when scroll tracking enabledview_search_resultspurchaserefundadd_to_cartremove_from_cartadd_to_wishlistview_itemview_item_listview_promotionselect_promotionbegin_checkoutadd_shipping_infoadd_payment_infoIf you need custom logic around these events (e.g., “purchase with a discount”), use parameters, not a new event name.
GA4 Event Parameters
Section titled “GA4 Event Parameters”Core Rules
Section titled “Core Rules”- Use snake_case:
transaction_id,product_category, nottransactionIDorProductCategory - Limit to 100 parameters per event: GA4 truncates beyond this; be selective
- No PII: Do not send email, phone, full address, SSN, or account passwords as parameters
- Use standard ecommerce parameters: GA4 has predefined ecommerce fields; use them
- Consistent types: If
valueis a number in one event, it must be a number in all events (not sometimes a string)
Standard Ecommerce Parameters
Section titled “Standard Ecommerce Parameters”Use these exact names for ecommerce events—GA4 recognizes them:
# Product-levelproduct_id (string)product_name (string)product_category (string)product_brand (string)product_variant (string)quantity (number)price (number, without currency symbol)
# Transaction-leveltransaction_id (string, unique per purchase)value (number, total transaction value)currency (string, ISO 4217: USD, EUR, GBP)tax (number)shipping (number)coupon (string, promotion code)
# List-levelitem_list_name (string: "Homepage Featured", "Search Results")item_list_id (string)item_list_index (number: position in list)
# Engagementengagement_time_msec (number, for non-standard interactions)Custom Parameter Naming Pattern
Section titled “Custom Parameter Naming Pattern”For parameters outside standard ecommerce:
[context]_[attribute]
context: user, session, page, form, experiment, offerattribute: (descriptive noun) id, name, status, value, count
Examples:- user_type (free, premium, enterprise)- experiment_variant (control, variant_a, variant_b)- form_error_message (required_field_missing, invalid_email)- offer_discount_percent (number)- page_section (header, footer, sidebar, main_content)Parameter Type Consistency Checklist
Section titled “Parameter Type Consistency Checklist”For each custom parameter, define its type once and enforce it:
Parameter: user_engagement_scoreType: Number (0–100)Source: server-side GTM calculationUsed in events: page_view, purchase, form_submitNever send as: String ("45"), Boolean
Parameter: ab_test_variantType: String (exactly: "control", "variant_a", "variant_b")Source: Optimizely APINever send as: Number, BooleanGA4 Custom Dimensions
Section titled “GA4 Custom Dimensions”Core Rules
Section titled “Core Rules”- Use the same name as the GA4 event parameter: If your parameter is
user_type, the dimension should beuser_type, notUser Type - Scope correctly: User-scoped dimensions (like
subscription_status) vs event-scoped (likeproduct_color) - Use snake_case:
subscription_status, notSubscriptionStatus - Avoid conflict with default dimensions: GA4 reserves names like
page_title,page_location,source,medium - Maximum 500 dimensions: Start with 20–30 core dimensions; add more only if you have a measurement reason
Dimension Naming by Scope
Section titled “Dimension Naming by Scope”User-scoped (describes the person across all sessions):
user_type # free, premium, enterprisesubscription_status # active, expired, cancelleduser_age_range # 18-24, 25-34, etc.user_location_region # US, EU, APACcustomer_lifetime_value # monetary tieruser_cohort_date # YYYY-MM date first seenEvent-scoped (describes this specific event):
product_color # red, blue, greenproduct_availability # in_stock, backorder, discontinuedform_field_error # email_invalid, required_field_missingexperiment_variant # control, variant_a, variant_bGTM Tag Naming
Section titled “GTM Tag Naming”Core Pattern
Section titled “Core Pattern”[Type] - [Brand/Context] - [Action] - [Platform]
Type: GA4, Meta, LinkedIn, Hotjar, Klaviyo, etc.Brand: Which brand owns this (or "Global" if shared)Action: What does the tag do? (Pageview, Purchase, FormSubmit, etc.)Platform: Web, Mobile, Both (or omit if Web is default)
Examples:- GA4 - Acme - Pageview- GA4 - Acme - Purchase - Mobile- Meta Pixel - Acme - AddToCart- Hotjar - Global - Scroll Depth- Klaviyo - SamsungUS - EmailCapture- LinkedIn Insight - Global - PageviewAnti-Patterns
Section titled “Anti-Patterns”❌ Track Purchase (too vague, no vendor)❌ ga4-purchase (inconsistent case, missing context)❌ Google Analytics Tag 1 (uninformative numbering)❌ PurchaseEventTracking (camelCase instead of pattern)✅ GA4 - Acme - Purchase (clear, scannable, consistent)Naming by Tag Type
Section titled “Naming by Tag Type”Analytics vendors (GA4, Adobe, Mixpanel):
GA4 - [Brand] - PageviewGA4 - [Brand] - PurchaseGA4 - [Brand] - FormSubmitAd platforms (Meta, LinkedIn, Google Ads):
Meta Pixel - [Brand] - PurchaseLinkedIn - [Brand] - LeadFormGoogle Ads - [Brand] - ConversionBehavioral analytics (Hotjar, Crazy Egg, SessionCam):
Hotjar - [Brand] - Heatmap SetupCrazy Egg - [Brand] - Session RecordingEmail/CRM (Klaviyo, HubSpot, Iterable):
Klaviyo - [Brand] - EmailCaptureHubSpot - [Brand] - LeadSubmitGTM Trigger Naming
Section titled “GTM Trigger Naming”Core Pattern
Section titled “Core Pattern”[Event Type] - [Condition] - [Details]
Event Type: Pageview, Click, Scroll, Form, Timer, Element Visibility, History ChangeCondition: What makes this trigger fire?Details: (optional) further specificity
Examples:- Pageview - Checkout Success- Click - AddToCart Button- Scroll - 50% Depth- Form - Newsletter Signup Submit- Visibility - Video Player AppearsStandard Trigger Naming Reference
Section titled “Standard Trigger Naming Reference”Pageview triggers:
Pageview - AllPageview - HomepagePageview - Checkout PagePageview - Thank You PageClick triggers:
Click - AddToCart ButtonClick - ExternalLinkClick - Download ButtonClick - Video Play ButtonForm triggers:
Form - Submit - Contact FormForm - Submit - Newsletter SignupForm - Field Blur - Email ValidationVisibility triggers:
Visibility - Hero Image (appears for 3 sec)Visibility - Video PlayerVisibility - Bottom Section (scroll-triggered)Custom event triggers:
Custom Event - purchase_completeCustom Event - form_errorCustom Event - video_completeGTM Variable Naming
Section titled “GTM Variable Naming”Core Pattern
Section titled “Core Pattern”[Source] - [Purpose] - [Scope]
Source: DL (dataLayer), Cookie, FirstParty (server-side), Analytics, Query, ConstPurpose: What info does this hold?Scope: (optional) Global or platform-specific
Examples:- DL - EventName- Cookie - UserID- DL - ProductID - Ecommerce- Const - GA4MeasurementID- Query - UTMSource- FirstParty - SessionID - ServerSideBy Variable Type
Section titled “By Variable Type”Data Layer variables:
DL - EventNameDL - EventValueDL - ProductIDDL - ProductCategoryDL - CartTotalDL - UserTypeCookie variables:
Cookie - UserIDCookie - SessionIDCookie - ConsentStateCookie - ABTestVariantBuilt-in variables:
{{Hostname}}{{Page URL}}{{Page Path}}{{Referrer}}{{Click URL}}{{Event}} (for gtag-based events)Custom variables to create:
# Use "Const" for static valuesConst - GoogleTagID (value: G-XXXXX)Const - GA4EventPrefix (value: "acme_" for namespacing)
# Use "JS Variable" for computed valuesJS - ProductTierFromPrice (calculate tier based on {{DL - ProductID}})JS - ConsentCheckPassed (true/false logic)Variable Lookup Table
Section titled “Variable Lookup Table”If you use lookup tables to map values (e.g., mapping product IDs to categories):
Lookup - ProductIDtoCategoryLookup - EventNameAliasingLookup - CountryToRegionServer-Side GTM Naming
Section titled “Server-Side GTM Naming”Client (Source) Naming
Section titled “Client (Source) Naming”[Platform] - [Purpose] - [Brand]
Platform: Web, Mobile, iOS, Android, Backend, CMSPurpose: Data Collection, Event Processing, Conversion TrackingBrand: (if applicable)
Examples:- Web - Data Collection - Global- Mobile - Event Processing - Acme- Backend - Conversion Tracking - AcmeServer-Side Tag Naming
Section titled “Server-Side Tag Naming”[Platform] - [Vendor] - [Action]
Examples:- Web - GA4 - Event Send- Web - Meta - ConversionAPI- Web - CustomAPI - WebhookServer-Side Variable Naming
Section titled “Server-Side Variable Naming”sGTM - [Purpose]
Examples:- sGTM - ClientID- sGTM - ConversionValue- sGTM - EnrichedEventDataGTM Folder Organization
Section titled “GTM Folder Organization”Folder Structure
Section titled “Folder Structure”Organize your GTM container into logical folders to reduce cognitive load:
GTM Container Structure:├── Core Setup│ ├── Built-in Variables│ ├── Custom Variables│ ├── Data Layer Debugging│├── GA4 - Pageview & Events│ ├── GA4 Configuration│ ├── GA4 - Pageview│ ├── GA4 - Event: Purchase│ ├── GA4 - Event: FormSubmit│ ├── GA4 - Event: VideoPlay│├── Ad Platforms│ ├── Meta Pixel - Global│ ├── Google Ads - Conversion│ ├── LinkedIn - Pageview│├── Behavioral Analytics│ ├── Hotjar - Setup│ ├── Crazy Egg - Sessions│├── Email & CRM│ ├── Klaviyo - Newsletter│ └── HubSpot - Lead Tracking│├── Error Handling & QA│ ├── GTM Error Handler│ ├── Data Validation│ └── Consent Checks│└── Archive (deprecated items)Folder Naming Rules
Section titled “Folder Naming Rules”- Use CapitalizedCase for folder names (but tags inside remain
Type - Actionpattern) - Start with vendor/platform name for vendor-specific folders
- Group by purpose (not by implementer)
- Mark deprecated with [Archive] prefix if not deleting immediately
Multi-Brand Considerations
Section titled “Multi-Brand Considerations”Brand Prefix in Event Names
Section titled “Brand Prefix in Event Names”If you have multiple brands, add a brand-scoped prefix:
Brand A: acme_purchase_complete (or acme.purchase_complete)Brand B: samsung_purchase_complete
Or use a parameter:brand: "acme" (sent in all events)This lets you easily filter reporting by brand in GA4 and BigQuery.
Brand-Scoped Dimensions
Section titled “Brand-Scoped Dimensions”User-scoped:- brand_name (which brand is this user associated with)- brand_subscription_status (varies by brand)
Event-scoped:- brand_product_line (which product line, if multi-brand)Implementation Checklist
Section titled “Implementation Checklist”- Event naming: All custom events use
snake_case, no PII, under 40 chars - Parameters: All parameters use
snake_case, consistent types across events - Custom dimensions: Match parameter names, no conflicts with GA4 defaults
- GTM tags: Follow
[Type] - [Brand] - [Action]pattern - GTM triggers: Follow
[EventType] - [Condition]pattern - GTM variables: Follow
[Source] - [Purpose]pattern - sGTM: All clients and tags named consistently
- Folders: Organized by purpose, not by person
- Documentation: Naming standard linked in GTM container notes
- Enforcement: New contributors copy naming patterns, not create their own
Reference: Optimize Smart Patterns
Section titled “Reference: Optimize Smart Patterns”This guide is inspired by conventions developed by the Optimize Smart team, who advocate for:
- Consistency > cleverness — Choose boring, predictable names
- Scannability — A developer should understand a tag’s purpose from its name alone
- Enforcement — Once you define a pattern, enforce it with code review or tooling
- Documentation — Link this checklist in your GTM, not buried in Confluence
Related Resources
Section titled “Related Resources”- Enterprise GTM Governance — Enforcing standards at scale
- Community Tools & Extensions — Tools to audit naming compliance
- GTM Best Practices — Broader implementation patterns