Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.scanova.io/llms.txt

Use this file to discover all available pages before exploring further.

When you enable auto-tracking options in scanova('init', ...), the SDK captures user actions automatically with no additional code. This page shows exactly what each auto-tracking feature sends.

Page view

Enabled by: autoPageview: true Fires once per page load, as soon as the SDK initialises. Event type: pageview Metadata captured: (none — page context is in the top-level fields) Full payload example:
{
  "event_id": "f9ac7db6-f900-4d8e-8918-c846834195a8",
  "event_type": "pageview",
  "site_id": "YOUR_SITE_ID",
  "scan_session_id": "7ad26d4f-3181-4ef8-b6ca-b8f59499dd43",
  "web_session_id": "2d0c328a-01d0-4010-85f4-f327130d1bd4",
  "visitor_id": "363fe851-7d8f-4090-902f-0f5a462829f5",
  "page_url": "https://yoursite.com/?scnv=7ad26d4f-3181-4ef8-b6ca-b8f59499dd43",
  "referrer": "https://google.com",
  "timestamp": "2026-05-13T10:00:00.000Z",
  "device": {
    "user_agent": "Mozilla/5.0 ...",
    "screen_width": 1440,
    "screen_height": 900,
    "language": "en-US"
  },
  "metadata": {}
}
Important: autoPageview fires on SDK initialisation. If you also call scanova('track', 'page_view', ...) manually, you will send two events per page load. Use one or the other. Deduplication: The SDK guards against firing pageview twice for the same URL within a single SDK lifecycle. If a user navigates away and back to the same URL in a traditional multi-page site, the second load re-initialises the SDK and fires normally. In a SPA where the URL changes client-side, the guard means returning to a previously visited route does not re-fire the pageview — you must handle this manually. See the SPA guide.

Click

Enabled by: autoClicks: true Fires when a user clicks on a link (<a>), button (<button>), or any element with role="button". Event type: click Metadata captured:
KeyDescription
element_typeHTML tag name: A, BUTTON
element_textVisible text or aria-label of the element (max 100 chars). If data-scnv-name is set, that value is used instead.
destination_urlhref value for link elements (only included when present and not javascript: or mailto:)
Payload example:
{
  "event_type": "click",
  "metadata": {
    "element_type": "A",
    "element_text": "View Pricing",
    "destination_url": "/pricing"
  }
}
Custom element labels: Add data-scnv-name to any element to control the captured label in reports:
<button data-scnv-name="Hero CTA">Get Started Free</button>
<a href="/pricing" data-scnv-name="Nav Pricing">Pricing</a>

Form submission

Enabled by: autoForms: true Fires when a user submits any <form> on the page. Field values are never captured — only the form’s identity. Event type: form_submit Metadata captured:
KeyDescription
form_nameForm identifier. Priority order: data-scnv-namearia-labelname attribute → id"unnamed-form"
form_actionThe form’s action attribute, or the current pathname if not set
Payload example:
{
  "event_type": "form_submit",
  "metadata": {
    "form_name": "Contact Form",
    "form_action": "/contact"
  }
}
Custom form name:
<form data-scnv-name="Newsletter Signup" action="/subscribe">
  ...
</form>

Scroll depth

Enabled by: autoScroll: true Fires when the user scrolls past specific milestones on the page. Each milestone fires once per page load — repeated scrolling up and down does not re-fire the same milestone. Event type: scroll Milestones: 25%, 50%, 75%, 90% Metadata captured:
KeyDescription
scroll_depthPercentage milestone reached: 25, 50, 75, or 90
Payload examples:
{ "event_type": "scroll", "metadata": { "scroll_depth": 25 } }
{ "event_type": "scroll", "metadata": { "scroll_depth": 50 } }
{ "event_type": "scroll", "metadata": { "scroll_depth": 75 } }
{ "event_type": "scroll", "metadata": { "scroll_depth": 90 } }
Scroll events use a 100ms debounce to avoid firing on minor scroll jitter. SPA caveat: Scroll milestones are tracked in memory and are not reset on route changes in a SPA. If a user scrolls to 75% on /home and navigates to /pricing, the SDK will not fire 25%, 50%, or 75% scroll events on /pricing — only events for milestones beyond what was already reached. To reset scroll tracking on route change, reload the SDK or implement a manual scroll event approach for SPAs.

Combining auto-tracking with custom events

Auto-tracked events and custom events coexist without conflict. A typical setup tracks page views and scroll depth automatically, and adds custom events for specific high-value actions:
scanova('init', 'YOUR_SITE_ID', {
  autoPageview: true,
  autoScroll: true,
  autoClicks: false,  // disabled; we use custom click tracking below
  autoForms: false
});

// Manual click event for a specific button
document.getElementById('cta-btn').addEventListener('click', () => {
  scanova('track', 'cta_click', { plan: 'pro', section: 'hero' });
});