ReferenceAuto-captured Events

Auto-captured Events

Reference for all events automatically captured by the Mythic Analytics SDK including page views, attribution tracking, and auto-included context properties.

Auto-captured events

The SDK automatically captures these events when the corresponding config options are enabled:

EventDescriptionConfig
$pageviewPage load and SPA navigation with URL, title, referrer, and performance metricscapture_pageview
$pageleavePage exit with $time_on_page, $exit_intent, and $triggercapture_pageleave
$engagementFires 10 seconds after page load ($time_to_engage: 10)Always on
$identifyUser identification (via identify())Always on
$create_aliasAlias creation (via alias())Always on
$setPerson-property update (via identify() or setPersonProperties())Always on
$autocaptureClicks, form submissions, and input changes. The $event_type property is click, submit, or changeautocapture
$exceptionUncaught JS errors and unhandled promise rejections, with $exception_type, $exception_message, and $exception_stackerror_tracking

Feature-module events

These fire only when their feature is enabled (most are on by default — see the configuration reference):

EventDescriptionConfig
form_submittedForm submission with extracted, mapped fieldsauto_form_identify
input_capturedEmail detected in an input fieldauto_input_capture
appointment_booked / calendly_booked / acuity_bookedBooking API call detectedauto_booking_listener
survey_completed / typeform_submitted / surveymonkey_completedSurvey submission detectedauto_survey_tracking
Custom event_nameFired per matched endpoint in network_endpointsauto_network_intercept
$web_vital_lcp, $web_vital_cls, $web_vital_inp, …One event per Core Web Vital metricweb_vitals
$cross_domain_linkedSession adopted from a cross-domain linkcross_domain_tracking
$heatmapBatch of click positions and scroll depths. Clicks carry a structural element descriptor (tag, stable id, classes, sibling position, link path; never text)capture_heatmaps
$experiment_viewedA third-party A/B tool (Convert.com, PostHog, Mida) bucketed this visitor — once per session per assignment, with experiment_id, variation_id, variation_name / experiment_name where known, first_exposure, and the tool's own visitor id (convert_visitor_id, posthog_distinct_id or mida_visitor_id)capture_experiments

When remote-config tags or snippets fail, the SDK also reports $tag_error, $snippet_error, and $snippet_compilation_error; a failing event transformer reports $transformer_error.

$tags_fired

When a remote-config tag or snippet fires, the SDK records it on the next event it sends as a $tags_fired array. No separate event is sent, and each firing appears on exactly one event:

"$tags_fired": [
  { "id": "3f1c2a9e-8d4b-4e7a-9c1f-2b6d8e0a5c47", "kind": "tag", "trigger": "page_load", "path": "/checkout" },
  { "id": "9b0d4e7c-1a2b-4c3d-8e9f-0a1b2c3d4e5f", "kind": "snippet", "trigger": "$autocapture", "path": "/checkout" }
]
  • A firing is a tag whose script loaded, an inline tag that was inserted, a managed Meta or Google tag that initialised, or a snippet that ran. A tag skipped by its trigger rules or a script that failed to load is not a firing. A tag or snippet that throws while running still fired; its error is the separate $tag_error or $snippet_error event.
  • trigger is page_load, or the name of the event whose trigger rule matched.
  • path is where it fired, which may differ from the carrying event's page: the first $pageview is sent before tags load, so page-load firings usually ride the next interaction or the $pageleave.
  • Each tag fires at most once per page load, including across SPA navigations.
  • A firing followed by no event at all, such as a bounce under a second, is not reported.

Read the totals with the Client Config firings routes.

$experiment_viewed fires once per session per assignment, so it counts sessions exposed to a variation — not pageviews. To split other events by variation, filter on the $experiments super property that every event carries once the assignment is known: "<experimentId>:<variationId>" for Convert.com, "posthog:<flagKey>:<variant>" for PostHog, "mida:<testId>:<variant name>" for Mida. For PostHog, only experiment-linked and multivariate flags appear — boolean feature flags are rollouts, not tests.

Count exposures with first_exposure: true. A testing tool keeps its assignment for months (Convert: ~6), so a visitor bucketed on a landing page carries that variation into later visits — and $experiment_viewed fires again in each new session, sometimes on pages the test never touched. first_exposure: false marks those: correct for attributing later behaviour to the variation, wrong as an exposure count. A sighting that arrives with a variation name but no id yet (the tool announced itself before writing its cookie) is held briefly and completed from the cookie; detected_via: held_then_enriched marks those, and <source>_unresolved marks one that never completed.

Alongside the event, the SDK stores the A/B assignment on the person profile: $convert_visitor_id + $convert_experiments for Convert.com, $posthog_distinct_id + $posthog_experiments for PostHog, $mida_visitor_id + $mida_experiments for Mida. $experiments is a super property, so it only rides events sent from the browser — a conversion that arrives server-side (a CRM close, a subscription rebill) carries no super properties at all. The person copy is what lets a later off-browser conversion still be credited to the variation, and it is what the convert_experiments and mida_experiments destinations read. Both are erased with the rest of a person's data on a deletion request, and neither is written for HIPAA-enabled locations, where experiment capture is off entirely.

form_submitted never includes password or hidden inputs, and fields whose names look sensitive (SSN, credit card, CVV, API token, etc.) are redacted before the event is sent. A single user submit produces exactly one form_submitted event.

Attribution tracking

When capture_utm is enabled (default), the SDK captures UTM parameters and advertising click IDs from the URL:

  • UTM: $utm_source, $utm_medium, $utm_campaign, $utm_term, $utm_content
  • Google Ads: $gclid, $gbraid, $wbraid
  • Facebook: $fbclid, $fbc, $fbp
  • Twitter/X: $twclid
  • LinkedIn: $li_fat_id
  • OpenAI / ChatGPT Ads: $oppref (the click id), $obref (read from OpenAI's own __obref cookie when their OAIQ pixel is on the page)
  • Mythic Click ID: $iiid (from link redirect tracking)
  • Google Analytics: $ga_client_id (from GA's own _ga cookie, when GA4 is on the page)

$obref is read from OpenAI's cookie the same way $ga_client_id is read from Google's, and for the same reason: it is their browser identifier, not ours. Their __oppref cookie is deliberately not read back — oppref is a click id, and a cookie that outlives the click would mark 30 days of direct traffic as paid ChatGPT traffic. A conversion that happens later gets its oppref from the person's stored attribution server-side instead.

$ga_client_id is read, never written. Google Analytics owns the _ga cookie, and minting our own value would fork the identity and make GA4 count one visitor twice — so if GA is not on the page, the property is simply absent. It is the join key for the google_analytics destination: without it, a server-side GA4 event is attributed to a brand-new user rather than the session that earned it. Not on the HIPAA allowlist, so it is stripped for HIPAA-enabled locations.

$fbc and $fbp follow Meta's Conversions API formats — fb.<subdomainIndex>.<creationTime>.<clickId> and fb.<subdomainIndex>.<creationTime>.<random> — and are persisted for 90 days, with the window rolling forward on each page load. If Meta's pixel already set _fbc/_fbp on the domain, those values are reused rather than regenerated, so the SDK and the pixel report the same browser ID. Once captured, $fbc keeps its original creation time until a different fbclid arrives, which is what lets Meta dedupe browser and server events for the same click. $fbclid itself stays URL-scoped: it is not backfilled from a stored $fbc. Meta treats a click as expired 90 days after the fbc creation time, so a stored $fbc older than that is dropped instead of being carried forward.

Auto-included context

Every event automatically includes:

  • $lib, $lib_version — SDK identifier and version
  • $current_url, $host, $pathname, $page_title — Page context ($referrer/$referring_domain when available)
  • $browser, $browser_version, $os, $device_type, $user_agent — User agent ($device_type is mobile, tablet, or desktop)
  • $screen_width, $screen_height, $viewport_width, $viewport_height, $screen_density
  • $timezone, $timezone_offset, $browser_language
  • $is_bot, $is_identified, $pageview_id
  • $bot_reason — only on events where $is_bot is true: ua (the user agent names a crawler or automation tool, e.g. HeadlessChrome, Googlebot), webdriver (navigator.webdriver is set, e.g. Playwright or Selenium), or no_plugins (a desktop browser reporting zero plugins, a weaker signal). A browser whose user agent names a mobile or tablet platform (including Android tablets and in-app browsers) is never flagged for having no plugins.
  • Set by the ingest edge, not the SDK (not for HIPAA-enabled locations): $is_bot becomes true and $bot_reason is ua when the user agent names a testing tool the SDK list misses (WebPageTest, Lighthouse, GTmetrix), frozen_browser (a plain desktop Chrome user agent carrying a full build number such as Chrome/117.0.5938.132, which real Chrome stopped sending in 2022; automation builds keep it), datacenter (the request came from a cloud provider's network: AWS, Google Cloud, Azure, DigitalOcean, OVH, Hetzner and others), or screen_800x600 (headless Chrome's default window). These replace no_plugins but never an SDK ua or webdriver. VPN and cloud-desktop users share the datacenter signal, so treat it as a flag, not proof.
  • $asn, $as_org — the network the request came from (Cloudflare's ASN and its owner), stamped at ingest with IP/geo enrichment.
  • $session_id, $device_id, distinct_id (and $user_id once identified) — Identity context