{
  "kb_version": "1.0.0",
  "file": "03-metric-dictionary",
  "definition": "A metric is COLLECTED, not computed. If it can be reconstructed from other metrics in this file, it belongs in 05-kpi-library.json instead.",
  "record_schema": {
    "id": "mtr.<source>.<snake_name>",
    "unit": "count | currency | ratio | percent | seconds | position | score | bytes",
    "grain": "finest time grain the source reliably exposes",
    "entity": "what is being counted",
    "caveat": "the specific way this metric lies — mandatory field, used by the confidence engine"
  },
  "metrics": {
    "src.ga4": [
      {"id": "mtr.ga4.sessions", "name": "Sessions", "unit": "count", "grain": "day", "entity": "session", "caveat": "GA4 session definition differs from UA (30-min timeout, no campaign-change restart). Not comparable to UA history."},
      {"id": "mtr.ga4.total_users", "name": "Total users", "unit": "count", "grain": "day", "entity": "user", "caveat": "Cookie/consent dependent; cross-device users double-count unless User-ID or Signals are on. Cannot be summed across days."},
      {"id": "mtr.ga4.active_users", "name": "Active users", "unit": "count", "grain": "day", "entity": "user", "caveat": "Non-additive across periods; must be recomputed per window."},
      {"id": "mtr.ga4.new_users", "name": "New users", "unit": "count", "grain": "day", "entity": "user", "caveat": "'New' = new cookie, not new customer. Cookie churn (ITP/consent) inflates this systematically on Safari/iOS."},
      {"id": "mtr.ga4.engaged_sessions", "name": "Engaged sessions", "unit": "count", "grain": "day", "entity": "session", "caveat": "Threshold-based (>10s, or 2+ pageviews, or a conversion). Threshold is configurable — compare only within one property config."},
      {"id": "mtr.ga4.engagement_time_msec", "name": "User engagement time", "unit": "seconds", "grain": "day", "entity": "session", "caveat": "Only counts foreground/visible time; background tabs excluded. Undercounts long-read content on some browsers."},
      {"id": "mtr.ga4.screen_page_views", "name": "Views", "unit": "count", "grain": "day", "entity": "pageview", "caveat": "SPA route changes counted only if virtual pageviews are configured."},
      {"id": "mtr.ga4.event_count", "name": "Event count", "unit": "count", "grain": "day", "entity": "event", "caveat": "Meaningless without event_name dimension; totals mix incomparable events."},
      {"id": "mtr.ga4.key_events", "name": "Key events (conversions)", "unit": "count", "grain": "day", "entity": "event", "caveat": "Marking an event as key is a config choice; changing it silently rewrites the trend line going forward but not backward."},
      {"id": "mtr.ga4.purchase_revenue", "name": "Purchase revenue", "unit": "currency", "grain": "day", "entity": "transaction", "caveat": "Client-side tracked; systematically under-reports vs the order backend (ad blockers, consent denial, checkout redirects). Never present as the revenue source of truth."},
      {"id": "mtr.ga4.transactions", "name": "Transactions", "unit": "count", "grain": "day", "entity": "transaction", "caveat": "Duplicate transaction_ids on refresh unless deduplication is implemented."},
      {"id": "mtr.ga4.item_views", "name": "Item views (view_item)", "unit": "count", "grain": "day", "entity": "item", "caveat": "Requires ecommerce implementation; list-view impressions are view_item_list, a different event."},
      {"id": "mtr.ga4.add_to_carts", "name": "Add to carts", "unit": "count", "grain": "day", "entity": "item", "caveat": "Counts events, not unique users; a user adding 5 items produces 5."},
      {"id": "mtr.ga4.checkouts", "name": "Begin checkout", "unit": "count", "grain": "day", "entity": "session", "caveat": "Off-site hosted checkouts frequently break the funnel here; cross-domain measurement must be verified before any checkout KPI is trusted."},
      {"id": "mtr.ga4.bounce_rate", "name": "Bounce rate", "unit": "percent", "grain": "day", "entity": "session", "caveat": "GA4 bounce = 1 − engagement rate. Not the UA definition. Prefer engagement rate to avoid misinterpretation."},
      {"id": "mtr.ga4.session_source_medium", "name": "Session source/medium", "unit": "dimension", "grain": "session", "entity": "session", "caveat": "Session-scoped attribution ≠ the key-event attribution used in Advertising reports. Two different numbers exist for 'channel'; both are correct under their own model."},
      {"id": "mtr.ga4.landing_page", "name": "Landing page", "unit": "dimension", "grain": "session", "entity": "session", "caveat": "High-cardinality: unindexed query strings explode the dimension and trigger the (other) bucket."},
      {"id": "mtr.ga4.exit_rate_by_step", "name": "Funnel step exits (exploration)", "unit": "count", "grain": "session", "entity": "session", "caveat": "Explorations sample above 10M events per query on standard properties; sampled funnels must not drive alerts."}
    ],
    "src.gsc": [
      {"id": "mtr.gsc.clicks", "name": "Clicks", "unit": "count", "grain": "day", "entity": "click", "caveat": "Google organic only. Will never match GA4 organic sessions (different entity, different attribution, redirects, JS failures)."},
      {"id": "mtr.gsc.impressions", "name": "Impressions", "unit": "count", "grain": "day", "entity": "impression", "caveat": "Counts appearance in results, including below the fold; SERP-feature appearances count as impressions with near-zero click potential."},
      {"id": "mtr.gsc.ctr", "name": "CTR", "unit": "percent", "grain": "day", "entity": "derived_native", "caveat": "Source-computed clicks/impressions; re-derive it when aggregating, never average CTRs."},
      {"id": "mtr.gsc.avg_position", "name": "Average position", "unit": "position", "grain": "day", "entity": "query_page", "caveat": "Impression-weighted mean across every query and location; a 'position improvement' can be caused purely by losing low-ranking long-tail impressions. Never treat as a rank tracker."},
      {"id": "mtr.gsc.indexed_pages", "name": "Indexed pages (Index Coverage)", "unit": "count", "grain": "day", "entity": "url", "caveat": "Index status reports cover ~3 months only, unlike the 16-month performance window."},
      {"id": "mtr.gsc.discovered_not_indexed", "name": "Discovered/Crawled not indexed", "unit": "count", "grain": "day", "entity": "url", "caveat": "Strong quality/crawl-budget signal at scale; noisy for small sites."},
      {"id": "mtr.gsc.core_web_vitals_url_groups", "name": "CWV URL groups (CrUX-based)", "unit": "count", "grain": "28d_rolling", "entity": "url_group", "caveat": "Field data from real Chrome users over a 28-day rolling window — it lags a fix by up to 28 days. Do not expect same-week movement after a deploy."},
      {"id": "mtr.gsc.rich_result_items", "name": "Rich result / enhancement items", "unit": "count", "grain": "day", "entity": "url", "caveat": "Eligibility only, not guaranteed display."}
    ],
    "src.google_ads": [
      {"id": "mtr.google_ads.impressions", "name": "Impressions", "unit": "count", "grain": "day", "entity": "impression", "caveat": "—"},
      {"id": "mtr.google_ads.clicks", "name": "Clicks", "unit": "count", "grain": "day", "entity": "click", "caveat": "Always exceeds GA4 paid sessions (bounce-before-load, redirect loss, consent). A 10–25% gap is normal, not a bug."},
      {"id": "mtr.google_ads.cost", "name": "Cost", "unit": "currency", "grain": "day", "entity": "spend", "caveat": "The most reliable metric in the entire stack; use spend as the anchor when reconciling sources."},
      {"id": "mtr.google_ads.conversions", "name": "Conversions", "unit": "count", "grain": "day", "entity": "conversion", "caveat": "Attributed to CLICK date, not conversion date, and fractional under data-driven attribution. Never compare day-by-day with a conversion-date source without shifting."},
      {"id": "mtr.google_ads.conversion_value", "name": "Conversion value", "unit": "currency", "grain": "day", "entity": "conversion", "caveat": "Includes modelled conversions; modelling share is not exposed, which caps confidence."},
      {"id": "mtr.google_ads.search_impression_share", "name": "Search impression share", "unit": "percent", "grain": "day", "entity": "auction", "caveat": "Reported only above a privacy floor; low-volume campaigns return no value."},
      {"id": "mtr.google_ads.search_lost_is_budget", "name": "Lost IS (budget)", "unit": "percent", "grain": "day", "entity": "auction", "caveat": "The single most actionable Ads metric for scaling decisions."},
      {"id": "mtr.google_ads.search_lost_is_rank", "name": "Lost IS (rank)", "unit": "percent", "grain": "day", "entity": "auction", "caveat": "Conflates bid, quality and landing-page experience."},
      {"id": "mtr.google_ads.avg_cpc", "name": "Average CPC", "unit": "currency", "grain": "day", "entity": "click", "caveat": "Mix-sensitive; a CPC rise can be pure keyword-mix shift."},
      {"id": "mtr.google_ads.quality_score", "name": "Quality Score", "unit": "score", "grain": "day", "entity": "keyword", "caveat": "Keyword-level only; unavailable for PMax/Demand Gen, which is where most spend now sits."},
      {"id": "mtr.google_ads.pmax_asset_group_perf", "name": "PMax asset group performance", "unit": "mixed", "grain": "day", "entity": "asset_group", "caveat": "Channel-level breakdown inside PMax is heavily limited; treat PMax as a black box and diagnose it via incrementality tests, not attribution."}
    ],
    "src.meta_ads": [
      {"id": "mtr.meta_ads.impressions", "name": "Impressions", "unit": "count", "grain": "day", "entity": "impression", "caveat": "—"},
      {"id": "mtr.meta_ads.reach", "name": "Reach", "unit": "count", "grain": "day", "entity": "person", "caveat": "Non-additive across days; frequency = impressions/reach only within one window."},
      {"id": "mtr.meta_ads.spend", "name": "Amount spent", "unit": "currency", "grain": "day", "entity": "spend", "caveat": "Reliable anchor metric."},
      {"id": "mtr.meta_ads.link_clicks", "name": "Link clicks", "unit": "count", "grain": "day", "entity": "click", "caveat": "Distinct from 'clicks (all)'. Since the 2026 attribution change only link clicks drive click-through attribution."},
      {"id": "mtr.meta_ads.purchases", "name": "Purchases (attributed)", "unit": "count", "grain": "day", "entity": "conversion", "caveat": "Default window is 7-day click + 1-day engage-through + 1-day view-through, reported on IMPRESSION date. Includes modelled conversions. Structurally higher than GA4 last-click."},
      {"id": "mtr.meta_ads.purchase_value", "name": "Purchase conversion value", "unit": "currency", "grain": "day", "entity": "conversion", "caveat": "Same attribution caveat; view-through share should be inspected before treating ROAS as real."},
      {"id": "mtr.meta_ads.cpm", "name": "CPM", "unit": "currency", "grain": "day", "entity": "impression", "caveat": "Auction-driven and seasonal; a CPM spike is often market-wide, not account-specific."},
      {"id": "mtr.meta_ads.frequency", "name": "Frequency", "unit": "ratio", "grain": "window", "entity": "person", "caveat": "Only valid over the exact window requested."},
      {"id": "mtr.meta_ads.thumbstop_3s_views", "name": "3-second video plays", "unit": "count", "grain": "day", "entity": "video_play", "caveat": "Autoplay inflates; use as a relative creative comparator only."},
      {"id": "mtr.meta_ads.hold_rate_15s", "name": "15-second / ThruPlay", "unit": "count", "grain": "day", "entity": "video_play", "caveat": "Best available proxy for creative quality within Meta."}
    ],
    "src.clarity": [
      {"id": "mtr.clarity.rage_clicks", "name": "Rage clicks", "unit": "count", "grain": "session", "entity": "session", "caveat": "Heuristic (rapid repeated clicks). False-positives on maps, sliders, games and any intentionally repeated interaction."},
      {"id": "mtr.clarity.dead_clicks", "name": "Dead clicks", "unit": "count", "grain": "session", "entity": "session", "caveat": "False-positives on decorative imagery users expect to be clickable — which is itself a UX finding, but not a bug."},
      {"id": "mtr.clarity.excessive_scroll", "name": "Excessive scrolling", "unit": "count", "grain": "session", "entity": "session", "caveat": "Confounded by long pages and infinite feeds."},
      {"id": "mtr.clarity.quick_backs", "name": "Quick backs", "unit": "count", "grain": "session", "entity": "session", "caveat": "The strongest single 'wrong page' signal available for free; correlate with landing page, not site-wide."},
      {"id": "mtr.clarity.script_errors", "name": "JavaScript errors", "unit": "count", "grain": "session", "entity": "session", "caveat": "Third-party script noise dominates; filter by whether the error precedes an abandonment."},
      {"id": "mtr.clarity.scroll_depth", "name": "Scroll depth (heatmap)", "unit": "percent", "grain": "page", "entity": "page", "caveat": "Aggregated per page version; a template change invalidates historical comparison."}
    ],
    "src.hotjar": [
      {"id": "mtr.hotjar.recordings", "name": "Session recordings", "unit": "count", "grain": "session", "entity": "session", "caveat": "Sampled on lower plans — recording counts are NOT traffic counts and must never be used as a volume metric."},
      {"id": "mtr.hotjar.funnel_step_dropoff", "name": "Funnel step drop-off", "unit": "percent", "grain": "step", "entity": "session", "caveat": "Defined on URL/event rules that silently break when routes change."},
      {"id": "mtr.hotjar.survey_responses", "name": "Survey / feedback responses", "unit": "count", "grain": "day", "entity": "response", "caveat": "Self-selected respondents; strong qualitative value, zero statistical representativeness."},
      {"id": "mtr.hotjar.form_field_dropoff", "name": "Form field drop-off", "unit": "percent", "grain": "field", "entity": "form_interaction", "caveat": "The highest-value diagnostic in the stack for any long form; requires per-field configuration."}
    ],
    "src.matomo": [
      {"id": "mtr.matomo.visits", "name": "Visits", "unit": "count", "grain": "day", "entity": "visit", "caveat": "Self-hosted/cookieless configurations change user identification; compare only within one configuration era."},
      {"id": "mtr.matomo.unique_visitors", "name": "Unique visitors", "unit": "count", "grain": "day", "entity": "visitor", "caveat": "Under cookieless heuristics, uniqueness is a daily approximation."},
      {"id": "mtr.matomo.site_search_keywords", "name": "Site search keywords", "unit": "dimension", "grain": "day", "entity": "search", "caveat": "First-party intent data, unaffected by search-engine query redaction — a genuine advantage over GSC."},
      {"id": "mtr.matomo.search_no_results", "name": "Searches with no results", "unit": "count", "grain": "day", "entity": "search", "caveat": "Directly actionable for merchandising and content gaps."}
    ],
    "src.yandex_metrica": [
      {"id": "mtr.yandex.visits", "name": "Visits", "unit": "count", "grain": "day", "entity": "visit", "caveat": "—"},
      {"id": "mtr.yandex.bounce_rate", "name": "Bounce rate", "unit": "percent", "grain": "day", "entity": "visit", "caveat": "Yandex defines a bounce as a visit under 15 seconds with one pageview — NOT the GA definition. Cross-tool comparison of bounce rate is invalid."},
      {"id": "mtr.yandex.webvisor_sessions", "name": "Webvisor session replays", "unit": "count", "grain": "session", "entity": "session", "caveat": "Sampling configurable; treat like Hotjar recordings."},
      {"id": "mtr.yandex.form_analytics", "name": "Form analytics", "unit": "mixed", "grain": "field", "entity": "form", "caveat": "Built-in per-field analysis without extra configuration."}
    ],
    "src.firebase": [
      {"id": "mtr.firebase.first_open", "name": "first_open", "unit": "count", "grain": "day", "entity": "install", "caveat": "Reinstalls on a new device count again; not equal to store 'installs'."},
      {"id": "mtr.firebase.dau_mau", "name": "DAU / MAU", "unit": "count", "grain": "day", "entity": "user", "caveat": "App-instance based; a user with two devices is two users unless User-ID is set."},
      {"id": "mtr.firebase.retention_cohort", "name": "Cohort retention (D1/D7/D30)", "unit": "percent", "grain": "cohort_day", "entity": "user", "caveat": "The canonical mobile retention source; definition of 'retained' (any open) is looser than product-meaningful retention."},
      {"id": "mtr.firebase.crash_free_users", "name": "Crash-free users (Crashlytics)", "unit": "percent", "grain": "day", "entity": "user", "caveat": "A crash-rate regression is one of the few technical metrics with an immediate, provable revenue link."},
      {"id": "mtr.firebase.iap_revenue", "name": "In-app purchase revenue", "unit": "currency", "grain": "day", "entity": "transaction", "caveat": "Gross, pre-store-commission; net revenue requires store console data."}
    ],
    "src.app_store_consoles": [
      {"id": "mtr.appstore.product_page_views", "name": "Product page views", "unit": "count", "grain": "day", "entity": "view", "caveat": "Store-side only; cannot be joined to user-level app data."},
      {"id": "mtr.appstore.impressions", "name": "Store impressions", "unit": "count", "grain": "day", "entity": "impression", "caveat": "Includes search and browse surfaces with very different intent."},
      {"id": "mtr.appstore.units", "name": "Downloads / installs", "unit": "count", "grain": "day", "entity": "install", "caveat": "The store's number, not the SDK's; a persistent gap with Firebase first_open is normal."},
      {"id": "mtr.appstore.proceeds", "name": "Proceeds (net)", "unit": "currency", "grain": "day", "entity": "revenue", "caveat": "Net of commission — the only true app revenue figure."},
      {"id": "mtr.appstore.skan_conversions", "name": "SKAdNetwork / attribution postbacks", "unit": "count", "grain": "cohort", "entity": "conversion", "caveat": "Delayed, privacy-thresholded, coarse-grained and non-deterministic; never mix SKAN counts with SDK counts in one chart."}
    ],
    "src.ecommerce_platform": [
      {"id": "mtr.shop.orders", "name": "Orders", "unit": "count", "grain": "order", "entity": "order", "caveat": "SOURCE OF TRUTH for order counts; supersedes GA4 in every reconciliation."},
      {"id": "mtr.shop.gross_revenue", "name": "Gross revenue", "unit": "currency", "grain": "order", "entity": "order", "caveat": "Define inclusive/exclusive of tax and shipping once, globally; the single most common cross-tool discrepancy."},
      {"id": "mtr.shop.discounts", "name": "Discount amount", "unit": "currency", "grain": "order", "entity": "order", "caveat": "Required for discount-dependency KPIs; often missing from analytics-side revenue."},
      {"id": "mtr.shop.refunds", "name": "Refunds / returns", "unit": "currency", "grain": "refund", "entity": "refund", "caveat": "Lags the order by days or weeks — net revenue for a recent period is always overstated until the return window closes."},
      {"id": "mtr.shop.cogs", "name": "Cost of goods sold", "unit": "currency", "grain": "order_line", "entity": "order_line", "caveat": "Frequently absent or stale; without it, every margin and contribution KPI must be marked UNAVAILABLE rather than estimated."},
      {"id": "mtr.shop.customer_id", "name": "Customer identifier", "unit": "dimension", "grain": "order", "entity": "customer", "caveat": "Enables true repeat/LTV KPIs; guest checkout without email-matching breaks the customer entity."},
      {"id": "mtr.shop.inventory_level", "name": "Inventory / variant availability", "unit": "count", "grain": "hour", "entity": "variant", "caveat": "Point-in-time snapshots cannot reconstruct historical stock-outs unless captured continuously — capture from day one or lose it."},
      {"id": "mtr.shop.fulfilment_time", "name": "Fulfilment / delivery time", "unit": "seconds", "grain": "order", "entity": "order", "caveat": "Operational KPI with a measurable conversion and repeat-purchase link."}
    ],
    "src.payment_platform": [
      {"id": "mtr.pay.authorisation_rate", "name": "Authorisation rate", "unit": "percent", "grain": "day", "entity": "payment_attempt", "caveat": "Invisible to every analytics tool: a checkout that reaches payment and fails looks identical to abandonment in GA4. Often worth several percent of revenue."},
      {"id": "mtr.pay.declines_by_reason", "name": "Declines by reason code", "unit": "count", "grain": "day", "entity": "payment_attempt", "caveat": "Issuer vs technical vs fraud declines demand completely different actions."},
      {"id": "mtr.pay.3ds_challenge_rate", "name": "3DS/SCA challenge and pass rate", "unit": "percent", "grain": "day", "entity": "payment_attempt", "caveat": "A major and under-diagnosed source of checkout loss in SCA regions."},
      {"id": "mtr.pay.chargeback_rate", "name": "Chargeback rate", "unit": "percent", "grain": "month", "entity": "transaction", "caveat": "Lags 30–120 days; a guardrail, never a same-period KPI."},
      {"id": "mtr.pay.failed_recurring_payments", "name": "Failed recurring charges (dunning)", "unit": "count", "grain": "day", "entity": "subscription_charge", "caveat": "The direct measurement of involuntary churn — frequently the largest single churn component in subscription businesses."}
    ],
    "src.crm": [
      {"id": "mtr.crm.leads_created", "name": "Leads created", "unit": "count", "grain": "day", "entity": "lead", "caveat": "Deduplication rules define this number; duplicates inflate conversion rates."},
      {"id": "mtr.crm.stage_transitions", "name": "Pipeline stage transitions", "unit": "count", "grain": "event", "entity": "opportunity", "caveat": "Depends on rep discipline; stage timestamps are frequently backfilled and distort velocity KPIs."},
      {"id": "mtr.crm.closed_won_value", "name": "Closed-won value", "unit": "currency", "grain": "event", "entity": "opportunity", "caveat": "SOURCE OF TRUTH for B2B revenue; the only place marketing effort meets money."},
      {"id": "mtr.crm.lead_source", "name": "Lead source / original touch", "unit": "dimension", "grain": "lead", "entity": "lead", "caveat": "Usually last-touch and often manually overwritten; must be reconciled against click IDs to be trustworthy."},
      {"id": "mtr.crm.disqualification_reason", "name": "Disqualification reason", "unit": "dimension", "grain": "lead", "entity": "lead", "caveat": "The highest-value and most under-used field in the stack — it converts lead volume into lead quality."},
      {"id": "mtr.crm.account_id", "name": "Account identifier", "unit": "dimension", "grain": "account", "entity": "account", "caveat": "Required for any account-based KPI; without it B2B analysis is stuck at lead level."}
    ],
    "src.email_platform": [
      {"id": "mtr.email.sends", "name": "Sends", "unit": "count", "grain": "campaign", "entity": "message", "caveat": "—"},
      {"id": "mtr.email.delivered", "name": "Delivered", "unit": "count", "grain": "campaign", "entity": "message", "caveat": "Delivered ≠ inboxed; spam-folder placement is invisible without seed testing."},
      {"id": "mtr.email.opens", "name": "Opens", "unit": "count", "grain": "campaign", "entity": "message", "caveat": "Structurally unreliable since Apple Mail Privacy Protection pre-fetches images. Open rate must not drive any automated decision; use click and revenue instead."},
      {"id": "mtr.email.clicks", "name": "Clicks", "unit": "count", "grain": "campaign", "entity": "message", "caveat": "Inflated by security scanners in B2B; deduplicate bot clicks before use."},
      {"id": "mtr.email.unsubscribes", "name": "Unsubscribes", "unit": "count", "grain": "campaign", "entity": "contact", "caveat": "Guardrail metric for send-frequency experiments."},
      {"id": "mtr.email.spam_complaints", "name": "Spam complaints", "unit": "percent", "grain": "campaign", "entity": "contact", "caveat": "Hard guardrail — sustained rates above mailbox-provider thresholds cause deliverability collapse."},
      {"id": "mtr.email.list_active_contacts", "name": "Active contacts", "unit": "count", "grain": "day", "entity": "contact", "caveat": "'Active' definition is platform-specific; normalise before reporting list health."}
    ],
    "src.product_analytics": [
      {"id": "mtr.pa.feature_event_count", "name": "Feature event count", "unit": "count", "grain": "event", "entity": "event", "caveat": "Requires a governed tracking plan; ungoverned event sprawl makes adoption KPIs meaningless."},
      {"id": "mtr.pa.dau_wau_mau", "name": "DAU/WAU/MAU", "unit": "count", "grain": "day", "entity": "user", "caveat": "'Active' must be defined as a value event, not app-open, or the whole engagement layer is inflated."},
      {"id": "mtr.pa.funnel_conversion_by_step", "name": "Product funnel conversion by step", "unit": "percent", "grain": "step", "entity": "user", "caveat": "Strictly-ordered vs any-order funnel settings produce very different numbers."},
      {"id": "mtr.pa.retention_matrix", "name": "Retention matrix (N-day / unbounded)", "unit": "percent", "grain": "cohort", "entity": "user", "caveat": "N-day and unbounded retention differ by a factor that grows with usage frequency; declare which one the KPI uses."},
      {"id": "mtr.pa.account_level_usage", "name": "Account-level usage rollup", "unit": "mixed", "grain": "day", "entity": "account", "caveat": "Requires group analytics; user-level rollups misstate B2B health."}
    ],
    "src.seo_tools": [
      {"id": "mtr.seo.keyword_rank", "name": "Tracked keyword rank", "unit": "position", "grain": "day", "entity": "keyword", "caveat": "Location/device/personalisation-dependent snapshot; differs from GSC average position by design, not by error."},
      {"id": "mtr.seo.search_volume", "name": "Search volume estimate", "unit": "count", "grain": "month", "entity": "keyword", "caveat": "Modelled estimate, often clickstream-derived. Treat as directional; never compute market share from it and present it as fact."},
      {"id": "mtr.seo.backlinks_referring_domains", "name": "Referring domains", "unit": "count", "grain": "day", "entity": "domain", "caveat": "Crawler-coverage dependent; different vendors disagree substantially."},
      {"id": "mtr.seo.serp_feature_presence", "name": "SERP feature presence (AI overviews, packs)", "unit": "dimension", "grain": "day", "entity": "query", "caveat": "The key explanatory variable for impressions-up-clicks-down patterns that GSC alone cannot explain."},
      {"id": "mtr.seo.crawl_stats", "name": "Crawl / log-file stats", "unit": "count", "grain": "day", "entity": "url", "caveat": "Requires server logs; the only ground truth for crawl behaviour."}
    ],
    "src.social_organic": [
      {"id": "mtr.social.impressions_reach", "name": "Organic impressions / reach", "unit": "count", "grain": "day", "entity": "impression", "caveat": "Definitions differ per network and change without notice."},
      {"id": "mtr.social.engagements", "name": "Engagements", "unit": "count", "grain": "post", "entity": "interaction", "caveat": "Composite of incomparable actions; decompose before use."},
      {"id": "mtr.social.outbound_clicks", "name": "Outbound clicks", "unit": "count", "grain": "post", "entity": "click", "caveat": "Always exceeds referral sessions in web analytics; in-app browsers and dark-social sharing break attribution."},
      {"id": "mtr.social.follower_growth", "name": "Follower growth", "unit": "count", "grain": "day", "entity": "follower", "caveat": "Weak business KPI on its own; useful only as an audience-asset trend."}
    ],
    "src.gtm_server": [
      {"id": "mtr.gtm.tag_fire_success_rate", "name": "Tag firing success rate", "unit": "percent", "grain": "day", "entity": "tag_event", "caveat": "Not a business metric — it is the metric that tells you whether the other metrics are real."},
      {"id": "mtr.gtm.consent_state_distribution", "name": "Consent state distribution", "unit": "percent", "grain": "day", "entity": "session", "caveat": "The denominator for every measured KPI; a consent-banner change silently rewrites every trend."},
      {"id": "mtr.gtm.server_event_delivery_rate", "name": "Server-side event delivery rate", "unit": "percent", "grain": "day", "entity": "event", "caveat": "Detects CAPI/Measurement-Protocol delivery failures before they show up as a fake conversion drop."}
    ]
  }
}
:root{--primary:#2b9e9b;--primary-deep:#147f7d;--mint:#77e0dd;--mint-soft:#eafaf9;--gold:#eac37f;--ink:#333;--muted:#6d7777;--line:#e9eeee;--surface:#fff;--surface-soft:#f7f9f9;--shadow-card:0 14px 44px #23505017;--shadow-soft:0 8px 26px #244e4e12;--radius-xl:28px;--radius-lg:20px;--radius-md:14px;--ease:cubic-bezier(.22, 1, .36, 1)}*{box-sizing:border-box}html{scroll-behavior:smooth;direction:rtl;max-width:100%;font-family:Vazirmatn,Tahoma,Arial,sans-serif;overflow-x:hidden}body{background:var(--surface);max-width:100%;color:var(--ink);font-synthesis:none;text-rendering:optimizelegibility;margin:0;font-family:Vazirmatn,Tahoma,Arial,sans-serif;font-size:16px;font-weight:400;line-height:1.85;overflow-x:hidden}button,a,input,textarea,select{font-family:inherit}a{color:inherit;cursor:pointer;text-decoration:none}button,a,summary{touch-action:manipulation}img{max-width:100%;display:block}h1,h2,h3,h4,p{margin-top:0}main{min-height:100dvh;overflow:clip}.shell{width:min(1120px,100% - 48px);margin-inline:auto}.svg-icon{background:currentColor;flex:none;display:inline-block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.topbar{z-index:20;background:linear-gradient(90deg, #88e7e4 0%, var(--mint) 54%, #6fd5d2 100%);border-radius:0 0 10px 10px;min-height:64px;position:relative}.topbar-inner{grid-template-columns:1fr auto 1fr;align-items:center;gap:24px;min-height:64px;display:grid}.header-logo{justify-self:start;align-items:center;width:140px;min-height:44px;display:inline-flex}.header-logo img{width:100%;height:auto}.header-tagline{color:#174a49;justify-self:center;font-size:15px;font-weight:700}.header-phone{color:#174a49;justify-self:end;align-items:center;min-height:44px;font-size:14px;font-weight:700;display:inline-flex}.hero-section{background:linear-gradient(#fff 0% 72%,#f8fbfb 100%);min-height:520px;padding:44px 0 50px;position:relative}.hero-layout{z-index:2;grid-template-columns:minmax(0,1.05fr) minmax(320px,.8fr);align-items:center;gap:56px;display:grid;position:relative}.hero-copy{max-width:630px;padding-block:28px}.eyebrow{color:#3e4646;align-items:center;gap:8px;margin-bottom:10px;font-size:15px;font-weight:700;display:inline-flex}.eyebrow:before{background:var(--primary);content:"";border-radius:999px;width:24px;height:2px}.hero-copy h1{color:var(--primary-deep);letter-spacing:-.045em;margin-bottom:20px;font-size:clamp(40px,5.2vw,72px);font-weight:900;line-height:1.32}.hero-copy h1 em{color:var(--primary);font-style:normal}.hero-copy>p{color:#4e5959;max-width:610px;margin-bottom:28px;font-size:16px;line-height:2}.hero-actions{flex-wrap:wrap;gap:14px;display:flex}.button{min-width:174px;min-height:50px;transition:transform .22s var(--ease), box-shadow .22s ease, background-color .22s ease, color .22s ease;border:1px solid #0000;border-radius:8px;justify-content:center;align-items:center;padding:11px 24px;font-size:15px;font-weight:700;line-height:1.4;display:inline-flex}.button:hover{transform:translateY(-2px)}.button:active{transform:translateY(0)}.button:focus-visible{outline-offset:4px;outline:3px solid #147f7d52}.header-logo:focus-visible{outline-offset:4px;outline:3px solid #147f7d52}.header-phone:focus-visible{outline-offset:4px;outline:3px solid #147f7d52}.footer-nav a:focus-visible{outline-offset:4px;outline:3px solid #147f7d52}.social-links a:focus-visible{outline-offset:4px;outline:3px solid #147f7d52}.button-primary{background:var(--primary);color:#fff;box-shadow:0 10px 22px #2b9e9b33}.button-primary:hover{background:var(--primary-deep);box-shadow:0 13px 28px #2b9e9b47}.button-outline{color:var(--primary-deep);background:#ffffffc2;border-color:#2b9e9b8c}.button-outline:hover{border-color:var(--primary);background:var(--mint-soft)}.hero-mascot{place-items:center;min-height:430px;display:grid;position:relative}.hero-mascot img{z-index:2;object-fit:contain;filter:drop-shadow(0 20px 22px #265d5c2e);width:auto;height:430px;animation:5.5s ease-in-out infinite mascot-drift;position:relative}.mascot-halo{filter:blur(4px);background:radial-gradient(circle,#77e0dd6b,#77e0dd0d 64%,#0000 72%);border-radius:50%;width:330px;height:330px;position:absolute}.mascot-shadow{z-index:1;filter:blur(14px);background:#2b9e9b29;border-radius:50%;width:210px;height:34px;position:absolute;bottom:24px}.hero-blob{pointer-events:none;filter:blur(4px);border-radius:50%;position:absolute}.hero-blob-one{background:radial-gradient(circle,#77e0dd6b,#77e0dd00);width:410px;height:290px;bottom:-80px;left:-70px}.hero-blob-two{border:1px solid #2b9e9b14;width:380px;height:380px;top:70px;right:-180px}.workflow-section{z-index:4;margin-top:-34px;padding-bottom:26px;position:relative}.workflow-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;display:grid}.workflow-card{border-radius:var(--radius-xl);min-height:305px;box-shadow:var(--shadow-card);text-align:center;transition:transform .25s var(--ease), box-shadow .25s ease, border-color .25s ease;background:#fffffff5;border:1px solid #e0e9e9db;padding:32px 28px 26px}.workflow-card:hover{border-color:#2b9e9b33;transform:translateY(-5px);box-shadow:0 18px 50px #23505021}.workflow-icon{border-radius:50%;place-items:center;width:72px;height:72px;margin:0 auto 18px;display:grid}.tone-violet .workflow-icon{color:#8b65dc;background:#f0eaff}.tone-rose .workflow-icon{color:#ed6686;background:#fff0f3}.tone-blue .workflow-icon{color:#6394ea;background:#edf3ff}.workflow-card h2{color:#272c2c;margin-bottom:2px;font-size:19px;line-height:1.55}.workflow-card h3{color:var(--primary-deep);margin-bottom:14px;font-size:14px;line-height:1.7}.workflow-card p{color:#4f5959;margin-bottom:0;font-size:14px;line-height:1.95}.system-cta{color:#fff;direction:ltr;background:linear-gradient(105deg,#55d5d0 0%,#2baca9 54%,#1d9290 100%);border-radius:22px;grid-template-columns:118px minmax(0,1fr) auto;align-items:center;gap:28px;min-height:162px;margin-block:2px 66px;padding:28px 38px;display:grid;overflow:hidden;box-shadow:0 16px 36px #2b9e9b2e}.system-cta>div:not(.cta-icon){direction:rtl}.system-cta h2{margin-bottom:3px;font-size:25px;line-height:1.5}.system-cta p{color:#ffffffe6;margin-bottom:0;font-size:15px}.cta-icon{color:#ffffff9e;background:#ffffff21;border-radius:50%;place-items:center;width:104px;height:104px;display:grid}.button-white{color:var(--primary-deep);background:#fff;box-shadow:0 10px 20px #0a4b4a21}.button-white:hover{background:#f5ffff;box-shadow:0 13px 25px #0a4b4a33}.why-section{background:linear-gradient(#fff,#f9fcfc);padding:24px 0 72px}.why-shell{text-align:center}.why-panel{text-align:right;background:radial-gradient(circle at 10% 90%,#77e0dd40,#0000 30%),linear-gradient(135deg,#f7fdfc 0%,#fff 58%,#f1fbfa 100%);border:1px solid #2b9e9b29;border-radius:28px;grid-template-columns:minmax(0,1fr) 360px;align-items:center;gap:54px;padding:44px 52px;display:grid;position:relative;overflow:hidden;box-shadow:0 20px 54px #23505014}.why-kicker{color:var(--primary);align-items:center;gap:10px;margin-bottom:8px;font-size:22px;font-weight:900;display:inline-flex}.why-kicker:before{background:var(--gold);content:"";border-radius:99px;width:32px;height:3px}.why-content h2{color:#293737;max-width:620px;margin-bottom:14px;font-size:clamp(26px,3vw,38px);line-height:1.55}.why-content .why-copy{color:#526060;max-width:650px;margin:0;font-size:15px;line-height:2}.why-content .why-copy p{margin-bottom:5px}.why-map{width:340px;height:340px;margin-inline:auto;position:relative}.why-map-ring{background:radial-gradient(circle,#77e0dd24,#0000 68%);border:1px solid #2b9e9b4d;border-radius:50%;position:absolute;inset:48px;box-shadow:inset 0 0 0 18px #77e0dd0a}.why-map-ring:before,.why-map-ring:after{content:"";background:linear-gradient(90deg,#0000,#2b9e9b3d,#0000);position:absolute;top:50%;left:50%}.why-map-ring:before{width:274px;height:1px;transform:translate(-50%,-50%)}.why-map-ring:after{width:1px;height:274px;transform:translate(-50%,-50%)}.why-core{background:#fff;border:12px solid #ffffffc7;border-radius:50%;place-items:center;width:108px;height:108px;display:grid;position:absolute;inset:50% auto auto 50%;transform:translate(-50%,-50%);box-shadow:0 14px 34px #2b9e9b2e}.why-core img{width:58px;height:58px}.why-node{z-index:2;min-width:88px;color:var(--primary-deep);text-align:center;background:#fffffff0;border:1px solid #2b9e9b33;border-radius:999px;padding:8px 13px;font-size:12px;font-weight:700;position:absolute;box-shadow:0 8px 22px #23505017}.node-data{top:12px;left:50%;transform:translate(-50%)}.node-strategy{top:50%;right:0;transform:translateY(-50%)}.node-execution{bottom:12px;left:50%;transform:translate(-50%)}.node-optimize{top:50%;left:0;transform:translateY(-50%)}.why-panel+.benefit-row{margin-top:20px}.benefit-row{direction:rtl;grid-template-columns:repeat(5,minmax(0,1fr));align-items:stretch;gap:12px;display:grid}.benefit-item{box-shadow:var(--shadow-soft);text-align:right;background:#fff;border:1px solid #e8eeee;border-radius:18px;padding:22px 18px;position:relative}.benefit-item>span{color:#fff;background:#2c3131;border-radius:50%;place-items:center;width:28px;height:28px;margin:0 0 14px;font-size:13px;font-weight:700;display:grid}.benefit-item h3{color:var(--primary-deep);margin-bottom:2px;font-size:16px;line-height:1.55}.benefit-item h4{color:var(--primary);margin-bottom:12px;font-size:13px;line-height:1.7}.benefit-item p{color:#5a6464;margin-bottom:0;font-size:12.5px;line-height:1.9}.customers-section{background:#f7f9f9;border-block:1px solid #edf1f1;padding:60px 0 64px}.section-heading{text-align:center;max-width:780px;margin:0 auto 34px}.section-heading>span{color:var(--primary);margin-bottom:3px;font-size:20px;font-weight:900;display:block}.section-heading h2{color:var(--primary-deep);margin-bottom:8px;font-size:clamp(26px,3vw,37px);line-height:1.55}.section-heading p{color:#596363;margin:0 auto;font-size:15px;line-height:1.95}.compact-heading{max-width:760px;margin-bottom:28px}.compact-heading>span{font-size:22px}.compact-heading h2{font-size:24px}.customer-logos{grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;display:grid}.customer-logo{height:96px;min-height:96px;box-shadow:var(--shadow-soft);transition:transform .22s var(--ease), border-color .22s ease, box-shadow .22s ease;background:#fff;border:1px solid #e6ebeb;border-radius:12px;place-items:center;padding:0;display:grid;position:relative;overflow:hidden}.customer-logo img{object-fit:contain;padding:8px 10px;width:100%!important;height:100%!important;inset:0!important}.customer-logo:hover{border-color:#2b9e9b59;transform:translateY(-3px);box-shadow:0 13px 30px #2350501c}.features-section{background:#fff;padding:70px 0 68px}.capabilities-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;display:grid}.capability-card{border-radius:var(--radius-md);min-height:320px;box-shadow:var(--shadow-soft);transition:transform .25s var(--ease), box-shadow .25s ease, border-color .25s ease;direction:ltr;background:#fff;border:1px solid #e8eded;align-items:center;gap:20px;padding:22px 24px 18px 16px;display:flex;overflow:hidden}.capability-card.mascot-right{flex-direction:row-reverse}.capability-card:hover{border-color:#2b9e9b47;transform:translateY(-4px);box-shadow:0 14px 34px #244e4e1c}.capability-wide{grid-column:1/-1;min-height:310px}.capability-mascot{flex:0 0 156px;align-self:stretch;min-height:280px;position:relative}.capability-mascot:before{content:"";background:linear-gradient(#77e0dd0a,#77e0dd2e);border-radius:50% 50% 18px 18px;position:absolute;inset:24% 4px 4px}.capability-mascot img{z-index:1;object-fit:contain;object-position:center bottom;max-width:none;transform:translate(50%);width:auto!important;height:250px!important;inset:auto 50% 0 auto!important}.capability-wide .capability-mascot{flex-basis:260px}.capability-social .capability-mascot{flex-basis:184px}.capability-social .capability-mascot img{height:315px!important}.capability-social{min-height:355px}.capability-campaign .capability-mascot{flex-basis:184px}.capability-copy{direction:rtl;flex:1;min-width:0}.capability-copy h3{color:var(--primary-deep);margin-bottom:2px;font-size:21px;line-height:1.55}.capability-copy h4{color:var(--primary);margin-bottom:7px;font-size:13px;line-height:1.8}.capability-copy>p{color:#515c5c;margin-bottom:11px;font-size:13.5px;line-height:1.9}.capability-copy ul{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 10px;margin:0;padding:0;list-style:none;display:grid}.capability-copy li{color:#687171;padding-right:14px;font-size:11.5px;line-height:1.7;position:relative}.capability-copy li:before{background:var(--mint);content:"";border-radius:50%;width:5px;height:5px;position:absolute;top:.72em;right:0}.final-cta{color:#fff;direction:ltr;background:linear-gradient(105deg,#56d8d3 0%,#2aaba8 52%,#148b89 100%);border-radius:22px;align-items:center;gap:34px;min-height:240px;margin-bottom:68px;padding:34px 48px;display:flex;overflow:hidden;box-shadow:0 18px 40px #2b9e9b33}.final-cta-mascot{flex:0 0 230px;align-self:stretch;position:relative}.final-cta-mascot img{object-fit:contain;filter:drop-shadow(0 14px 18px #0a4e4c26);width:auto;height:304px;position:absolute;bottom:-44px;left:-14px}.final-cta-copy{direction:rtl;flex:1}.final-cta h2{color:#fff;margin-bottom:7px;font-size:clamp(24px,3vw,34px);line-height:1.55}.final-cta p{color:#ffffffeb;max-width:780px;margin-bottom:20px;font-size:14px}.button-light-outline{color:#fff;background:0 0;border-color:#fffc}.button-light-outline:hover{background:#ffffff1f}.site-footer{background:#fff;border-top:1px solid #e6ebeb;padding:26px 0 30px}.footer-grid{grid-template-columns:1fr auto 1fr;align-items:center;gap:36px;display:grid}.footer-contact{justify-self:start;gap:13px;font-size:13px;display:grid}.footer-contact>a{align-items:center;min-height:44px;font-weight:700;display:inline-flex}.social-links{flex-wrap:wrap;gap:8px;display:flex}.social-links a{color:#4c5757;width:40px;height:40px;transition:background-color .2s ease, color .2s ease, transform .2s var(--ease);border:1px solid #e4eaea;border-radius:50%;place-items:center;display:grid}.social-links a:hover{background:var(--mint-soft);color:var(--primary-deep);transform:translateY(-2px)}.social-icon{background:currentColor;display:block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.social-instagram:hover{color:#e4405f}.social-facebook:hover{color:#1877f2}.social-linkedin:hover{color:#0a66c2}.social-telegram:hover{color:#26a5e4}.social-youtube:hover{color:red}.social-aparat:hover{color:#ed145b}.footer-nav{color:#505959;flex-wrap:wrap;justify-content:center;gap:20px;font-size:13px;display:flex}.footer-nav a{align-items:center;min-height:44px;transition:color .2s;display:inline-flex}.footer-nav a:hover{color:var(--primary-deep)}.footer-brand{text-align:right;justify-self:end}.footer-brand img{width:136px;height:auto}.footer-brand p{color:#3e4848;margin:4px 0 0;font-family:Arial,sans-serif;font-size:11px;font-weight:700}.footer-brand span{color:#7b8484;font-size:11px}.motion-ready [data-reveal]{opacity:0;transition:opacity .52s var(--ease) var(--delay,0s), transform .52s var(--ease) var(--delay,0s);transform:translateY(22px)}.motion-ready [data-reveal].is-visible{opacity:1;transform:translateY(0)}@keyframes mascot-drift{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@media (max-width:980px){.shell{width:min(100% - 40px,820px)}.hero-section{padding-top:28px}.hero-layout{grid-template-columns:minmax(0,1fr) 280px;gap:28px}.hero-mascot,.hero-mascot img{height:360px;min-height:360px}.workflow-card{min-height:330px;padding-inline:22px}.system-cta{grid-template-columns:88px minmax(0,1fr)}.system-cta .button{grid-column:2;justify-self:end}.cta-icon{grid-row:1/span 2;width:84px;height:84px}.why-panel{grid-template-columns:minmax(0,1fr) 300px;gap:30px;padding:36px}.why-map{width:300px;height:300px}.why-map-ring{inset:42px}.why-map-ring:before{width:232px}.why-map-ring:after{height:232px}.benefit-row{grid-template-columns:repeat(3,minmax(0,1fr));gap:32px 0}.customer-logos{grid-template-columns:repeat(3,minmax(0,1fr))}.capabilities-grid{grid-template-columns:1fr}.capability-wide{grid-column:auto}.footer-grid{grid-template-columns:1fr 1fr}.footer-nav{grid-area:2/1/auto/-1}}@media (max-width:820px){body{font-size:16px}.shell{width:min(100% - 28px,600px)}.topbar-inner{grid-template-columns:1fr 1fr;gap:10px}.header-logo{width:112px}.header-tagline{display:none}.header-phone{font-size:12px}.hero-section{min-height:auto;padding:30px 0 66px}.hero-layout{grid-template-columns:1fr;gap:8px}.hero-copy{text-align:center;max-width:none;padding-block:0}.eyebrow{font-size:13px}.hero-copy h1{margin-bottom:16px;font-size:clamp(37px,12vw,52px);line-height:1.36}.hero-copy>p{font-size:15px;line-height:1.95}.hero-actions{justify-content:center}.button{flex:160px;min-width:0}.hero-mascot{order:2;min-height:320px}.hero-mascot img{height:320px}.mascot-halo{width:280px;height:280px}.workflow-section{margin-top:-28px}.workflow-grid{grid-template-columns:1fr}.workflow-card{min-height:auto;padding:28px 24px}.system-cta{text-align:center;grid-template-columns:1fr;gap:16px;margin-bottom:54px;padding:28px 22px}.cta-icon{grid-row:auto;justify-self:center;width:76px;height:76px}.system-cta .button{grid-column:auto;justify-self:stretch}.system-cta h2{font-size:23px}.why-section{padding-bottom:56px}.why-panel{grid-template-columns:1fr;gap:22px;padding:28px 22px}.why-kicker{font-size:19px}.why-content h2{font-size:24px}.why-content .why-copy{font-size:14px}.why-map{width:min(290px,100%);height:290px}.why-map-ring{inset:44px}.why-map-ring:before{width:212px}.why-map-ring:after{height:212px}.why-node{min-width:78px;padding:7px 10px;font-size:11px}.benefit-row{text-align:right;grid-template-columns:1fr;gap:12px}.benefit-item{box-shadow:var(--shadow-soft);background:#fff;border:1px solid #e8eeee;border-radius:16px;grid-template-columns:44px 1fr;column-gap:14px;padding:18px;display:grid}.benefit-item+.benefit-item,.benefit-item:nth-child(4){border:1px solid #e8eeee}.benefit-item>span{background:var(--primary-deep);grid-row:1/span 3;width:40px;height:40px;margin:0;font-size:14px}.benefit-item h3,.benefit-item h4,.benefit-item p{grid-column:2}.benefit-item h4{margin-bottom:7px}.customers-section,.features-section{padding-block:54px}.section-heading>span{font-size:18px}.section-heading h2{font-size:25px}.section-heading p{font-size:14px}.customer-logos{grid-template-columns:repeat(2,minmax(0,1fr))}.customer-logo{height:86px;min-height:86px}.customer-logo img{padding:7px 8px;inset:0!important}.capability-card,.capability-card.mascot-right{direction:rtl;flex-direction:column;align-items:stretch;gap:12px;min-height:auto;padding:22px}.capability-mascot,.capability-wide .capability-mascot{flex-basis:auto;width:100%;min-height:220px}.capability-mascot:before{inset:40% 18% 2px}.capability-mascot img{height:210px!important}.capability-social .capability-mascot{min-height:275px}.capability-social .capability-mascot img{height:265px!important}.capability-copy h3{font-size:18px}.capability-copy h4{font-size:12.5px}.capability-copy>p{font-size:13px}.capability-copy ul{grid-template-columns:1fr;gap:4px}.capability-copy li{font-size:11.5px}.final-cta{text-align:center;flex-direction:column-reverse;gap:8px;min-height:auto;margin-bottom:48px;padding:30px 22px 0}.final-cta h2{font-size:24px}.final-cta-mascot{flex-basis:auto;align-self:center;width:210px;min-height:220px}.final-cta-mascot img{height:245px;bottom:-24px;left:50%;transform:translate(-50%)}.footer-grid{text-align:center;grid-template-columns:1fr;justify-items:center}.footer-contact,.footer-brand{text-align:center;justify-self:center}.footer-contact>a,.social-links{justify-content:center}.footer-nav{grid-area:auto;gap:14px}.footer-brand img{margin-inline:auto}}@media (max-width:440px){.shell{width:calc(100% - 24px)}.hero-actions{flex-direction:column}.button{flex-basis:auto;width:100%}.capability-card{flex-direction:column;display:flex}.capability-mascot,.capability-wide .capability-mascot{width:100%;min-height:200px}.capability-mascot img{height:190px!important}.capability-social .capability-mascot{min-height:245px}.capability-social .capability-mascot img{height:240px!important}.footer-nav{grid-template-columns:repeat(2,1fr);display:grid}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.motion-ready [data-reveal]{opacity:1;transform:none}}