GA4 Tracking Spec

Analytics lab Web · App · TV / OTT37 components · 76 eventsFollows GA4 event model

What to send to Google Analytics 4 for every common interface component, on websites, native apps, and TV apps. Each component lists the event, its parameters, and when to fire it, with a working example. Every event you trigger appears in the log with the code for gtag.js, Firebase on Android and iOS, and the Measurement Protocol, and is checked against GA4's rules. Nothing is sent to Google.

How GA4 data travels day 1 · 00:00
GA4 data flow Three kinds of sources send events to Google Analytics 4: websites through the dataLayer and gtag.js or Google Tag Manager, mobile apps through the Firebase SDK, and TVs, OTT devices, and servers through the Measurement Protocol. Web hits can pass through an optional server-side GTM container. All arrive at collection endpoints, then the GA4 property processes them: identity, sessions, attribution, key events, audiences, geo and device, filters, consent modeling, and custom definitions. Processed data feeds reporting, ad platforms, and the BigQuery export, which loads onward to warehouses and BI tools. A realtime path goes from collection straight to reporting, and data import flows into processing. 1 · SOURCES 2 · COLLECTION 3 · GA4 PROPERTY 4 · DESTINATIONS WEB · BROWSER cookies: _ga (client id) · _ga_<ID> (session) APP · iOS / ANDROID TV · OTT · SERVER realtime · DebugView · seconds HTTPS Page / UI click, view, scroll, submit 0 dataLayer gtag() / GTM queue 0 gtag.js · GTM ids, session, consent batch · sendBeacon / fetch 0 Firebase SDK app_instance_id · auto events stores events on device uploads ~hourly or on background stored 0 0 Measurement Protocol Roku, smart TV, console, kiosk backend: refunds, renewals JSON POST + api_secret you supply client_id / user_id 0 Server-side GTM optional · own domain edit + forward hits 0 Collection 0 web /g/collect app app-measurement.com/a mp /mp/collect nearest Google edge 204, no validation debug: /debug/mp/collect Processing 1 property · web + app streams queued 0 standard reports: within 24–48 h click a step for detail identity: user_id › device sessions (30 min timeout) attribution + channels key events audiences geo + device filters: bots, internal, dev consent modeling custom definitions, thresholds Data import · links cost, CRM, offline events Google Ads, Search Console 0 Reporting standard reports · Explorations Data API · Looker Studio Realtime (30 min) · DebugView events reported 0 · realtime 0 Ad platforms Google Ads · DV360 · SA360 audiences + key events as conversions 0 BigQuery export events_intraday_ · streaming events_YYYYMMDD · daily pseudonymous_users_ · users_ 0 Warehouses · BI Snowflake · Databricks · Redshift reverse ETL → CRM, ads 0
Click any box or processing step

Round dots are real gtag() calls from this page; squares are app batches and diamonds are TV or server hits (simulated). Follow one from its source to the warehouse. On a narrow screen, swipe the diagram sideways.

web hit app batch TV / server hit processed batch / export realtime or optional path clock compressed: 1 s ≈ 1 h; a day closes every 24 s

Basics

GA4 records everything as an event with up to 25 parameters. Sessions, users, and conversions are built from events during processing. Choose events in this order:

  1. Automatic Collected by gtag.js or the Firebase SDK with no code.
  2. Enhanced measurement Web only. Collected automatically when the enhanced measurement toggle is on in the data stream.
  3. Recommended Defined by Google with fixed names and parameters. Use the exact names so reports and integrations work.
  4. Custom Named by you. Follows GA4 naming rules; parameters must be registered as custom dimensions to appear in reports.

A Key event marker means the event is a business outcome you should mark as a key event (formerly "conversion") in Admin. Use the same event names and parameters on web, app, and TV, so one report covers every platform.

Rules

Names
snake_case, start with a letter, letters, numbers, and underscores only, 40 characters or fewer. Names are case-sensitive: Sign_Up and sign_up are two events.
Reserved
Do not start event or parameter names with _, firebase_, ga_, google_, or gtag., and do not send automatically collected names such as first_open or session_start.
Parameters
25 per event. Names up to 40 characters; values up to 100 characters (page_title 300, page_referrer 420, page_location 1,000).
Custom definitions
Parameters only appear in reports after you register them as custom dimensions or metrics, and only from that day forward. Standard properties allow 50 event-scoped dimensions, 25 user-scoped dimensions, and 50 metrics. BigQuery export receives every parameter regardless.
User properties
25 per property; names up to 24 characters, values up to 36. Use them for stable traits (plan, language), not for events.
Apps
500 distinct event names per app. Plan names up front; dynamic names such as click_button_37 exhaust the limit.
Ecommerce
Send currency with every value, an items array on product events (each item with item_id or item_name, up to 200), and a unique transaction_id on purchase.
Personal data
Never send names, emails, phone numbers, or addresses, including inside URLs. user_id must be an internal ID.
Consent
Set Consent Mode defaults before any tag runs and update them when the user chooses. With analytics_storage denied, gtag.js sends cookieless pings.

Setup

Install once per platform. Everything else in this spec builds on these calls.

Web: consent defaults, tag, and identity
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('consent', 'default', {
    ad_storage: 'denied', ad_user_data: 'denied',
    ad_personalization: 'denied', analytics_storage: 'denied',
    wait_for_update: 500
  });
  gtag('js', new Date());
  gtag('config', 'G-DEMO12345', {
    user_id: 'u_48213'   // only when signed in
  });
  gtag('set', 'user_properties', { plan: 'plus' });
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DEMO12345"></script>
Android (Kotlin, Firebase)
private lateinit var firebaseAnalytics: FirebaseAnalytics
firebaseAnalytics = Firebase.analytics

// After sign-in
firebaseAnalytics.setUserId("u_48213")
firebaseAnalytics.setUserProperty("plan", "plus")

// Consent Mode
firebaseAnalytics.setConsent(mapOf(
  ConsentType.ANALYTICS_STORAGE to ConsentStatus.GRANTED,
  ConsentType.AD_STORAGE to ConsentStatus.DENIED,
  ConsentType.AD_USER_DATA to ConsentStatus.DENIED,
  ConsentType.AD_PERSONALIZATION to ConsentStatus.DENIED
))
iOS (Swift, Firebase)
import FirebaseAnalytics

// After sign-in
Analytics.setUserID("u_48213")
Analytics.setUserProperty("plus", forName: "plan")

// Consent Mode
Analytics.setConsent([
  .analyticsStorage: .granted,
  .adStorage: .denied,
  .adUserData: .denied,
  .adPersonalization: .denied
])
TV apps and servers (Measurement Protocol)
POST https://www.google-analytics.com/mp/collect
     ?measurement_id=G-DEMO12345&api_secret=<API_SECRET>

{
  "client_id": "1873301823.1728201600",  // generate once, store on device
  "user_id": "u_48213",
  "user_properties": { "plan": { "value": "plus" } },
  "events": [{
    "name": "screen_view",
    "params": {
      "screen_name": "Home",
      "session_id": "1728201600",       // needed for sessions
      "engagement_time_msec": 100       // needed for active users
    }
  }]
}

The api_secret is created under Admin → Data streams → Measurement Protocol API secrets. Keep it on servers where you can; a secret shipped inside a TV app can be extracted. Validate payloads against /debug/mp/collect, which returns errors instead of the silent 204 of the real endpoint.

Pages and screens

Page load

  • Web
  • App
  • TV / OTT

Every web page load. Sent by the config command, so most sites need no extra code.

Try it
  • page_location carries utm_* and gclid parameters. GA4 reads traffic source from it, so do not strip them before the hit is sent.
  • Do not also send page_view from a GTM tag. Two systems sending the same event doubles the count.

Single-page app route change

  • Web
  • App
  • TV / OTT

The URL changes without a full page load (React, Vue, Angular, Next.js client navigation).

Try it
  • Send page_view after the new title and URL are set; otherwise the event reports the previous page.
  • If the router changes the URL more than once per navigation, turn off "page changes based on browser history events" and send page_view yourself.

App or TV screen

  • Web
  • App
  • TV / OTT

A screen becomes visible in a native app or TV app. The equivalent of page_view.

Try it
  • Log it manually for Jetpack Compose, SwiftUI, React Native, and Flutter, which the SDK cannot see.
  • TV apps without a Firebase SDK (Roku, Tizen, webOS) send screen_view over the Measurement Protocol.

Scroll depth

  • Web
  • App
  • TV / OTT

How far down the page people read.

Try it
25%50%75%90%

Scroll this box. Thresholds fire once each as they pass the bottom of the box.

  • If you add thresholds, turn enhanced scroll off and send all of them (including 90) from one place, so 90% is not counted twice.
  • Apps and TV apps have no page scroll; track meaningful list positions with view_item_list or custom events instead.

Navigation and discovery

Outbound link

  • Web
  • App
  • TV / OTT

A link to another domain.

  • Add your other domains under "Configure your domains" so links between them count as internal, not outbound.

Tabs

  • Web
  • App
  • TV / OTT

Switching between panels of content on the same page or screen.

Try it

Overview panel (shown by default, not tracked).

Accordion and FAQ

  • Web
  • App
  • TV / OTT

Expandable sections.

Try it
What is the return policy?

Returns are accepted within 30 days.

How long does shipping take?

Two to five business days.

Is there a warranty?

One year on all footwear.

Filters and sorting

  • Web
  • App
  • TV / OTT

Refining a list of products, articles, or titles.

Try it

Pagination and "load more"

  • Web
  • App
  • TV / OTT

Requesting the next set of results.

Try it

Forms, accounts, and onboarding

Form

  • Web
  • App
  • TV / OTT

A contact, quote, or application form, from first interaction to confirmed submission.

Try it

Leave the email empty or invalid to see form_error. The address is never sent.

  • Enhanced form events fire on the browser submit, including submissions that later fail. Use generate_lead (or sign_up) on confirmed success as the key event.
  • Never send field values. Names, emails, and phone numbers in GA4 break Google's terms.

Account creation

  • Web
  • App
  • TV / OTT

A new account is created.

Try it

Sign in and sign out

  • Web
  • App
  • TV / OTT

Authentication, and attaching the account ID to later events.

Try it

Signed out. user_id is not set.

  • user_id must be your own internal account ID. Never an email address or anything a person could be identified by.
  • Set user_id before sending login so the login event itself carries it.

Onboarding and tutorials

  • Web
  • App
  • TV / OTT

A guided first-run flow or product tour.

Try it
  • For step-level analysis, add a custom tutorial_step event with step_number and step_name.

File upload

  • Web
  • App
  • TV / OTT

Attaching a file to a form or profile.

Try it

Banners, dialogs, and consent

Promotion banner

  • Web
  • App
  • TV / OTT

An internal promotion: hero banner, sale strip, or featured tile.

Try it
Spring sale: 25% off running gear Use code SPRING25 · Shop now →
  • Promotion parameters can also be set per item inside items, when one banner features specific products.

Call-to-action button

  • Web
  • App
  • TV / OTT

A prominent button such as "Start free trial" or "Book a demo".

Try it
  • cta_click measures the button. The outcome (sign_up, begin_checkout, generate_lead) is a separate event, and the outcome is the key event.
  • Keep cta_text in one language. Translated labels split one button into several rows.

Modal dialog

  • Web
  • App
  • TV / OTT

An overlay that asks for attention: an offer, a survey, a confirmation.

Try it

Before you go

Get 10% off your first order.

Esc and clicking outside also close it.

Content engagement

Content card

  • Web
  • App
  • TV / OTT

Selecting an article, video, or document from a list.

Try it
  • For products, use select_item with items instead.

Share

  • Web
  • App
  • TV / OTT

Copying a link or sharing to another app.

Try it

File download

  • Web
  • App
  • TV / OTT

A link to a PDF, spreadsheet, archive, or installer.

Rate, like, save, and follow

  • Web
  • App
  • TV / OTT

Lightweight reactions to content.

Try it

Video and audio

Video player

  • Web
  • App
  • TV / OTT

Playback on any player: HTML5, YouTube, app, or TV. Same names everywhere so one report covers all.

Try it
Product tour · 2:00
0:00

Plays at 10× speed for the demo.

  • Enhanced measurement only covers embedded YouTube players with the JS API enabled. For every other player, send these events yourself with the same names and parameters.
  • Do not send a heartbeat every few seconds. Percent milestones answer "how much was watched" at a fraction of the volume.
  • The Mock Player in Analytics > Tools covers the full media spec: ads, quality, buffering, live streams, and six vendors.

Audio and podcasts

  • Web
  • App
  • TV / OTT

Audio playback. Mirrors the video events with an audio_ prefix.

Try it

Ecommerce

Product list to purchase

  • Web
  • App
  • TV / OTT

The full ecommerce funnel. Every event carries an items array with the same item fields.

Try it

The list sends view_item_list when it scrolls into view.

Cart $0

    Select a product to begin.

    • value is revenue excluding tax and shipping, and it needs currency. Without currency, GA4 drops the revenue.
    • transaction_id deduplicates purchases. Reloading the confirmation page must not send a second purchase.
    • Each item needs item_id or item_name. Keep item fields identical across all events so funnels join.
    • Clear the previous ecommerce object in the dataLayer ({ ecommerce: null }) before each GTM ecommerce push.

    TV, subscriptions, and casting

    TV home rows and remote control

    • Web
    • App
    • TV / OTT

    Browsing rows of titles with a D-pad. Focus moves on every key press; only selections are tracked.

    Try it
    Continue watching
    Trending

    Click here, then use arrow keys and Enter. Focus moves not sent: 0

    • Never send focus changes. A ten-minute browse can produce hundreds, and they say nothing about intent.
    • Most TV platforms have no GA4 SDK. Send these events from the app over the Measurement Protocol with a client_id you generate once and store on the device.

    Paywall, trial, and subscription

    • Web
    • App
    • TV / OTT

    Gated content and the subscription lifecycle.

    Try it
    • Renewals happen with nobody on the page. Send them from your billing system over the Measurement Protocol with the subscriber's client_id and user_id.
    • App store purchases are logged automatically as in_app_purchase once the store account is linked.

    Casting and AirPlay

    • Web
    • App
    • TV / OTT

    Sending playback from a phone or browser to a TV.

    Try it
    • While casting, playback events still come from the sender (phone or browser); add a casting: true parameter to them.

    App lifecycle

    Automatically collected app events

    • Web
    • App
    • TV / OTT

    Logged by the Firebase SDK with no code. Shown here so you know not to send them yourself.

    Try it
    • These names are reserved. Sending them manually is either rejected or double-counted.

    Push notification permission

    • Web
    • App
    • TV / OTT

    The operating system permission prompt.

    Try it
    • Also store the answer as a user property (push_enabled) so audiences can use it.

    Errors, performance, and experiments

    Errors

    • Web
    • App
    • TV / OTT

    Handled errors and failed requests that the user notices.

    Try it
    • Keep description under 100 characters and free of user data; error messages often contain emails or IDs.
    • Apps report crashes through Crashlytics (app_exception); do not send them again.

    Core Web Vitals

    • Web
    • App
    • TV / OTT

    Real-user loading, responsiveness, and layout stability.

    Try it

    Uses the browser's own Largest Contentful Paint measurement.

    • Google's web-vitals example names the event after the metric (LCP, INP, CLS). A single web_vitals event with metric_name keeps them in one report; either works if you are consistent.
    • Report metric_value as a number (milliseconds; CLS is unitless) and register it as a custom metric.

    A/B test exposure

    • Web
    • App
    • TV / OTT

    Which variant of an experiment a user saw.

    Try it
    • Firebase A/B Testing and most testing tools can send this for you; check before adding your own.

    Games

    Game progress and currency

    • Web
    • App
    • TV / OTT

    Google's recommended events for games, used as-is.

    Try it

    Do not track

    Personal data
    Emails, names, phone numbers, street addresses, and free-text field values. Sending them breaks Google's terms and can force deletion of the property's data. This includes URLs that contain them.
    Hover and pointer movement
    Mouse moves, hovers, and tooltips showing. High volume, no intent.
    Focus and keystrokes
    Every key press, and every D-pad focus change on TV. Track the selection instead.
    Automatic motion
    Carousel autoplay, autoplaying previews, and timed rotations. Only user actions.
    Heartbeats
    An event every few seconds of playback. Use percent milestones.
    The same event twice
    An action already covered by enhanced measurement, sent again from GTM or code.
    Unique values as dimensions
    Timestamps, session IDs, or order IDs in parameters you report on. They create millions of rows that GA4 collapses into "(other)". BigQuery is the place for row-level IDs.

    Event builder

    Write an event for something this spec does not cover. It is checked against the same rules and converted for every platform.

      Event reference

      EventTypeParametersUsed for
      add_payment_info Recommended currency, value, payment_type, items Product list to purchase
      add_shipping_info Recommended currency, value, shipping_tier, items Product list to purchase
      add_to_cart Recommended currency, value, items Product list to purchase
      add_to_wishlist Recommended currency, value, items Product list to purchase
      app_update Automatic previous_app_version Automatically collected app events
      audio_complete Custom audio_title, audio_duration, audio_percent Audio and podcasts
      audio_progress Custom audio_title, audio_duration, audio_percent Audio and podcasts
      audio_start Custom audio_title, audio_duration, audio_percent Audio and podcasts
      begin_checkout Recommended currency, value, coupon, items Product list to purchase
      carousel_slide Custom carousel_name, slide_index, slide_name, method Carousel
      cast_end Custom cast_protocol, content_id Casting and AirPlay
      cast_start Custom cast_protocol, content_id Casting and AirPlay
      click Enhanced measurement link_url, link_domain, link_classes, link_id, outbound Outbound link
      content_like Custom content_type, content_id Rate, like, save, and follow
      content_rate Custom content_type, content_id, rating Rate, like, save, and follow
      content_save Custom content_type, content_id Rate, like, save, and follow
      cta_click Custom cta_text, cta_location, link_url Call-to-action button
      earn_virtual_currency Recommended virtual_currency_name, value Game progress and currency
      exception Recommended description, fatal Errors
      experiment_view Custom experiment_id, variant_id A/B test exposure
      file_download Enhanced measurement file_extension, file_name, link_text, link_url File download
      file_upload Custom upload_context, file_extension, file_size_kb File upload
      filter_apply Custom list_name, filter_name, filter_value Filters and sorting
      first_open Automatic — Automatically collected app events
      form_error Custom form_id, field_name, error_type Form
      form_start Enhanced measurement form_id, form_name, form_destination Form
      form_submit Enhanced measurement form_id, form_name, form_destination, form_submit_text Form
      generate_leadKey Recommended currency, value, lead_source Form
      in_app_purchase Automatic product_id, price, currency, quantity Automatically collected app events
      join_group Recommended group_id Rate, like, save, and follow
      level_end Recommended level_name, success Game progress and currency
      level_start Recommended level_name Game progress and currency
      level_up Recommended level, character Game progress and currency
      load_more Custom list_name, page_number Pagination and "load more"
      login Recommended method Sign in and sign out
      logout Custom — Sign in and sign out
      modal_close Custom modal_name, close_method Modal dialog
      modal_view Custom modal_name Modal dialog
      nav_click Custom link_text, link_url, nav_location Menu, footer, and breadcrumb links
      notification_open Automatic message_name Automatically collected app events
      notification_permission Custom permission_status, prompt_type Push notification permission
      page_view Automatic page_location, page_title, page_referrer Page load; Single-page app route change
      paywall_view Custom paywall_type, content_id Paywall, trial, and subscription
      post_score Recommended score, level, character Game progress and currency
      purchaseKey Recommended transaction_id, currency, value, tax, shipping, coupon, items Product list to purchase; Paywall, trial, and subscription
      refund Recommended transaction_id, currency, value Product list to purchase
      remove_from_cart Recommended currency, value, items Product list to purchase
      screen_view Automatic screen_name, screen_class App or TV screen; TV home rows and remote control
      scroll Enhanced measurement percent_scrolled Scroll depth
      search Recommended search_term Site and in-app search
      select_content Recommended content_type, content_id, item_list_name, index Tabs; Accordion and FAQ; Content card; TV home rows and remote control
      select_item Recommended item_list_id, item_list_name, items Product list to purchase
      select_promotion Recommended promotion_id, promotion_name, creative_name, creative_slot Promotion banner
      session_start Automatic — Automatically collected app events
      share Recommended method, content_type, item_id Share
      sign_upKey Recommended method Account creation
      sort_apply Custom list_name, sort_by Filters and sorting
      spend_virtual_currency Recommended virtual_currency_name, value, item_name Game progress and currency
      subscription_cancel Custom plan_id, cancel_reason Paywall, trial, and subscription
      trial_startKey Custom plan_id, trial_days Paywall, trial, and subscription
      tutorial_begin Recommended — Onboarding and tutorials
      tutorial_complete Recommended — Onboarding and tutorials
      unlock_achievement Recommended achievement_id Game progress and currency
      user_engagement Automatic — Automatically collected app events
      video_complete Enhanced measurement video_provider, video_title, video_url, video_duration, video_current_time, video_percent, visible Video player
      video_error Custom video_provider, video_title, video_url, video_duration, error_code, video_current_time Video player
      video_pause Custom video_provider, video_title, video_url, video_duration, video_current_time, video_percent Video player
      video_progress Enhanced measurement video_provider, video_title, video_url, video_duration, video_current_time, video_percent, visible Video player
      video_seek Custom video_provider, video_title, video_url, video_duration, video_seek_from, video_seek_to Video player
      video_start Enhanced measurement video_provider, video_title, video_url, video_duration, video_current_time, video_percent, visible Video player
      view_cart Recommended currency, value, items Product list to purchase
      view_item Recommended currency, value, items Product list to purchase
      view_item_list Recommended item_list_id, item_list_name, items Product list to purchase
      view_promotion Recommended promotion_id, promotion_name, creative_name, creative_slot Promotion banner
      view_search_results Enhanced measurement search_term Site and in-app search
      web_vitals Custom metric_name, metric_value, metric_rating, metric_id Core Web Vitals

      Parameters

      ParameterMeaningEvents
      achievement_id Achievement ID. unlock_achievement
      audio_duration Length in seconds. audio_start, audio_progress, audio_complete
      audio_percent Percent listened milestone. audio_start, audio_progress, audio_complete
      audio_title Episode or track title. audio_start, audio_progress, audio_complete
      cancel_reason Reason chosen from a fixed list. subscription_cancel
      carousel_name Which carousel. carousel_slide
      cast_protocol chromecast or airplay. cast_start, cast_end
      character Character used. level_up, post_score
      close_method button, escape, backdrop, or action. modal_close
      content_id Stable ID of the content. Not the title, which can change. select_content, content_rate, content_like, content_save, paywall_view, cast_start, cast_end
      content_type Kind of thing selected: article, video, episode, tab, faq. select_content, share, content_rate, content_like, content_save
      coupon Coupon code applied to the order. begin_checkout, purchase
      creative_name Which creative version. view_promotion, select_promotion
      creative_slot Where it was placed. view_promotion, select_promotion
      cta_location Where on the page or screen. cta_click
      cta_text Button label, in one language. cta_click
      currency ISO 4217 code (USD, EUR). Required whenever value is sent. generate_lead, view_item, add_to_wishlist, add_to_cart, remove_from_cart, view_cart, begin_checkout, add_shipping_info, add_payment_info, purchase, refund, in_app_purchase
      description Short error description, no user data. exception
      error_code Player or platform error code. video_error
      error_type Validation rule that failed (required, invalid_format). form_error
      experiment_id Experiment key. experiment_view
      fatal true if the app or page could not continue. exception
      field_name Field that failed validation. form_error
      file_extension Extension without the dot. file_upload, file_download
      file_name Path of the downloaded file. file_download
      file_size_kb Size in kilobytes. file_upload
      filter_name Filter dimension (size, color, genre). filter_apply
      filter_value Value chosen. filter_apply
      form_destination Where the form posts. form_start, form_submit
      form_id id attribute of the form. form_start, form_error, form_submit
      form_name name attribute or a readable label. form_start, form_submit
      form_submit_text Text of the submit button. form_submit
      group_id ID of the group or topic. join_group
      index Position in the list or row, zero-based. select_content
      item_id ID of the shared item. share
      item_list_id ID of the product list. view_item_list, select_item
      item_list_name Readable name of the list or row. view_item_list, select_item, select_content
      item_name Name of the item. spend_virtual_currency
      items Array of products. Each needs item_id or item_name; up to 200 per event. view_item_list, select_item, view_item, add_to_wishlist, add_to_cart, remove_from_cart, view_cart, begin_checkout, add_shipping_info, add_payment_info, purchase
      lead_source Where the lead came from. generate_lead
      level Level number. level_up, post_score
      level_name Level name. level_start, level_end
      link_classes CSS classes on the link element. click
      link_domain Destination domain (outbound links). click
      link_id id attribute of the link element. click
      link_text Visible text of the link or menu item. nav_click, file_download
      link_url Destination URL or path. nav_click, click, cta_click, file_download
      list_name Which list was refined. filter_apply, sort_apply, load_more
      message_name Campaign name of the notification. notification_open
      method How it happened: email, google, copy_link, arrow, swipe. carousel_slide, sign_up, login, share
      metric_id Unique ID per page load, from web-vitals. web_vitals
      metric_name LCP, INP, CLS, FCP, or TTFB. web_vitals
      metric_rating good, needs-improvement, or poor. web_vitals
      metric_value Metric value (ms, or unitless for CLS). web_vitals
      modal_name Which dialog. modal_view, modal_close
      nav_location Which menu: header, footer, breadcrumb, sidebar, tab_bar, side_menu. nav_click
      outbound true when the link leaves your configured domains. click
      page_location Full URL including query string. Max 1,000 characters. page_view
      page_number Page of results now loaded. load_more
      page_referrer Previous URL. Max 420 characters. page_view
      page_title Document title. Max 300 characters. page_view
      payment_type Payment method chosen. add_payment_info
      paywall_type metered, hard, or registration. paywall_view
      percent_scrolled Scroll depth threshold reached, as a number. scroll
      permission_status granted or denied. notification_permission
      plan_id Subscription plan. trial_start, subscription_cancel
      previous_app_version Version before the update. app_update
      price Unit price. in_app_purchase
      product_id Store product ID. in_app_purchase
      promotion_id Internal promotion ID. view_promotion, select_promotion
      promotion_name Readable promotion name. view_promotion, select_promotion
      prompt_type pre_permission or system. notification_permission
      quantity Number of units. in_app_purchase
      rating Number given (1 to 5). content_rate
      score Score value. post_score
      screen_class Class or component that rendered the screen. screen_view
      screen_name Readable screen name you choose (Settings, Player). screen_view
      search_term What was searched, lowercased and trimmed. search, view_search_results
      shipping Shipping cost. purchase
      shipping_tier Shipping option chosen. add_shipping_info
      slide_index Zero-based slide position. carousel_slide
      slide_name Slide label. carousel_slide
      sort_by Sort order chosen. sort_apply
      success Whether the level was completed. level_end
      tax Tax amount. purchase
      transaction_id Unique order ID. Deduplicates purchases. purchase, refund
      trial_days Length of the trial. trial_start
      upload_context What the file was for. file_upload
      value Monetary value of the event, excluding tax and shipping. generate_lead, view_item, add_to_wishlist, add_to_cart, remove_from_cart, view_cart, begin_checkout, add_shipping_info, add_payment_info, purchase, refund, earn_virtual_currency, spend_virtual_currency
      variant_id Variant shown. experiment_view
      video_current_time Playhead position in seconds. video_start, video_progress, video_complete, video_pause, video_error
      video_duration Length in seconds. video_start, video_progress, video_complete, video_pause, video_seek, video_error
      video_percent Percent watched milestone. video_start, video_progress, video_complete, video_pause
      video_provider Player or platform (youtube, html5, roku). video_start, video_progress, video_complete, video_pause, video_seek, video_error
      video_seek_from Position before the seek, in seconds. video_seek
      video_seek_to Position after the seek, in seconds. video_seek
      video_title Title of the video. video_start, video_progress, video_complete, video_pause, video_seek, video_error
      video_url Source or page URL. video_start, video_progress, video_complete, video_pause, video_seek, video_error
      virtual_currency_name Currency name. earn_virtual_currency, spend_virtual_currency
      visible Whether the player was on screen. video_start, video_progress, video_complete