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:
| Key | Description |
|---|
element_type | HTML tag name: A, BUTTON |
element_text | Visible text or aria-label of the element (max 100 chars). If data-scnv-name is set, that value is used instead. |
destination_url | href 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>
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:
| Key | Description |
|---|
form_name | Form identifier. Priority order: data-scnv-name → aria-label → name attribute → id → "unnamed-form" |
form_action | The 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>
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:
| Key | Description |
|---|
scroll_depth | Percentage 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' });
});