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

# FAQ

> Frequently asked questions about Scanova Conversion Tracking — setup, attribution, events, privacy, and billing.

## General

### Is Conversion Tracking the same as Web Tracking?

Yes. The feature is called **Conversion Tracking** in this documentation and in new dashboard UI. Some older parts of the dashboard still show **Web Tracking** — they refer to the same feature.

### Do I need both browser and server events?

No — you can use either one on its own. Browser events require no backend setup and are the fastest way to get started. Server events require an API key and backend code, but are more reliable (not affected by ad blockers) and allow you to report revenue values and server-side conversions.

Most setups use both: the browser SDK for engagement data, and server events for confirmed conversions.

### Can I track conversions without a QR Code scan?

No. The Browser SDK requires a `scan_session_id` to send any event — if a user arrives at your site without scanning a QR Code, the SDK detects the missing session and sends nothing. The server events API also requires `scan_session_id` as a mandatory field.

Scanova Conversion Tracking is built specifically for QR-scan-attributed measurement. It does not function as a general-purpose web analytics tool.

***

## Browser SDK

### Which browsers does the SDK support?

The SDK supports all modern browsers: Chrome, Firefox, Safari, Edge, and mobile equivalents. It does not require any specific browser features beyond `XMLHttpRequest` or `fetch` and `localStorage`.

### Can the SDK be blocked by ad blockers?

Yes — browser events sent from `t.scanova.io` can be blocked by privacy-focused ad blockers and browser extensions. For critical conversion tracking (purchases, sign-ups), use [server-side events](/conversion-tracking/server/send-events) which cannot be blocked.

### Does the SDK affect my page performance?

The SDK loads asynchronously (`async` attribute) and does not block page rendering. The script is approximately 10 KB minified and gzipped. Events are sent in the background after the page loads.

### Can I use the SDK on multiple pages?

Yes — install the snippet in your site's global `<head>` template and it will run on every page. The `scan_session_id` persists across pages via `localStorage`, so the full user journey is attributed to the original QR scan.

### What happens if a user visits without scanning a QR Code?

No events are sent. The Browser SDK checks for a `scan_session_id` before sending any event. If there is none (the user arrived directly, not via a QR scan), the SDK skips the event entirely. Nothing is stored for that visit.

### How long does scan attribution last?

60 days. If a user scans a QR Code and returns to your site within 60 days, their visits are still attributed to that scan. After 60 days, the `_scnv` localStorage entry expires and attribution is lost.

***

## Server-Side Events

### How do I get the scan\_session\_id on my server?

Pass it from the browser to your server. Common approaches:

* Include it in a hidden form field
* Send it in the request body when your frontend calls your API
* Read it from the URL parameter when the page loads and store it in the user's server-side session

See [Send Server Events](/conversion-tracking/server/send-events#passing-scan_session_id-from-browser-to-server) for code examples.

### Can I send batch events?

Yes. Use `POST /server-events/batch` with up to 100 events per request. This is recommended for high-volume backends and queue-based architectures.

### What happens if I retry a failed request?

If you resend the same `event_id`, the duplicate is marked as such and excluded from conversion counts. Always use the same `event_id` across retries. See [Idempotency & Retries](/conversion-tracking/server/idempotency-retries).

### Can I send events for past timestamps?

Yes — use the `event_time` field to set when the event occurred. This is useful when sending events asynchronously from a queue. The field accepts ISO 8601 format in UTC.

***

## Privacy & Data

### Should I send raw email addresses?

No. Never include raw email addresses in `metadata` or `properties`. Use `user_identifiers.email_hash` with a SHA-256 hash of the lowercased email address.

### What is the `consent` field for?

The `consent` field carries the user's GDPR consent signal to the tracking pipeline:

* `granted` — all fields are stored normally
* `denied` or `pending` — PII fields (`page_url`, `referrer`, `city`, `metadata`) are stripped before storage

The `consent` value itself is always stored as an audit record.

### How long is data retained?

Events are retained for 2 years by default. Orphan records (events whose scan session cannot be resolved) are automatically deleted after 24 hours.

***

## Dashboard & Reporting

### How long until events appear in reports?

Typically within 10–30 seconds under normal load. Delays up to a few minutes can occur during high-traffic spikes.

### How do I pause tracking for a site?

Use the site status toggle in the **Integrations → Conversion Tracking** site details modal. When a site is paused, events from that site return `400`.

### What is an orphan event and when does it get deleted?

An orphan event is one where the `scan_session_id` is present but cannot yet be resolved to a QR Code — this happens when an event arrives before the identity pipeline has linked the session to a QR Code record. Orphan events are automatically cleaned up after 24 hours if the session data never arrives. If the data does arrive in time, the orphan is backfilled and retained for the standard 2-year period.
