> ## 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.

# Auto-Tracked Events

> What the Scanova Browser SDK tracks automatically — page views, clicks, scroll depth, and form submissions. See the exact event type, metadata, and payload for each.

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:**

```json theme={null}
{
  "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](/conversion-tracking/browser/spa-frameworks).

***

## 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:**

```json theme={null}
{
  "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:

```html theme={null}
<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:**

| 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:**

```json theme={null}
{
  "event_type": "form_submit",
  "metadata": {
    "form_name": "Contact Form",
    "form_action": "/contact"
  }
}
```

**Custom form name:**

```html theme={null}
<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:**

| Key            | Description                                             |
| -------------- | ------------------------------------------------------- |
| `scroll_depth` | Percentage milestone reached: `25`, `50`, `75`, or `90` |

**Payload examples:**

```json theme={null}
{ "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:

```javascript theme={null}
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' });
});
```
