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:
| Event | Description | Config |
|---|---|---|
$pageview | Page load and SPA navigation with URL, title, referrer, and performance metrics | capture_pageview |
$pageleave | Page exit with $time_on_page, $exit_intent, and $trigger | capture_pageleave |
$engagement | Fires 10 seconds after page load ($time_to_engage: 10) | Always on |
$identify | User identification (via identify()) | Always on |
$create_alias | Alias creation (via alias()) | Always on |
$set | Person-property update (via identify() or setPersonProperties()) | Always on |
$autocapture | Clicks, form submissions, and input changes. The $event_type property is click, submit, or change | autocapture |
$exception | Uncaught JS errors and unhandled promise rejections, with $exception_type, $exception_message, and $exception_stack | error_tracking |
Feature-module events
These fire only when their feature is enabled (most are on by default — see the configuration reference):
| Event | Description | Config |
|---|---|---|
form_submitted | Form submission with extracted, mapped fields | auto_form_identify |
input_captured | Email detected in an input field | auto_input_capture |
appointment_booked / calendly_booked / acuity_booked | Booking API call detected | auto_booking_listener |
survey_completed / typeform_submitted / surveymonkey_completed | Survey submission detected | auto_survey_tracking |
Custom event_name | Fired per matched endpoint in network_endpoints | auto_network_intercept |
$web_vital_lcp, $web_vital_cls, $web_vital_inp, … | One event per Core Web Vital metric | web_vitals |
$cross_domain_linked | Session adopted from a cross-domain link | cross_domain_tracking |
$heatmap | Batch of click positions and scroll depths (pixels, no element identity) | capture_heatmaps |
$experiment_viewed | A third-party A/B tool (Convert.com) bucketed this visitor — once per session per assignment, with experiment_id, variation_id, variation_name, first_exposure, convert_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.
$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 (["<experimentId>:<variationId>"]) that every event carries once the assignment is known.
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 as $convert_visitor_id and $convert_experiments. $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 destination reads. 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__obrefcookie 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_gacookie, 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.
Auto-included context
Every event automatically includes:
$lib,$lib_version— SDK identifier and version$current_url,$host,$pathname,$page_title— Page context ($referrer/$referring_domainwhen available)$browser,$browser_version,$os,$device_type,$user_agent— User agent ($device_typeismobile,tablet, ordesktop)$screen_width,$screen_height,$viewport_width,$viewport_height,$screen_density$timezone,$timezone_offset,$browser_language$is_bot,$is_identified,$pageview_id$session_id,$device_id,distinct_id(and$user_idonce identified) — Identity context