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

# Verify & Debug Browser SDK

> Confirm the Scanova Browser SDK is installed correctly, events are being sent, and attribution is working. Step-by-step DevTools checklist.

## Verification checklist

Use this checklist after installing the snippet to confirm everything is working:

### 1. Check for the network request

1. Open your website in Chrome or Firefox
2. Open **DevTools** (F12 or right-click → Inspect)
3. Go to the **Network** tab
4. Filter by `/ct`
5. Hard-reload the page (Ctrl+Shift+R / Cmd+Shift+R)

You should see a `POST` request to `https://t.scanova.io/ct` with status `200`.

### 2. Inspect the request payload

Click the `/ct` request → **Payload** tab. Confirm:

* `site_id` matches your tracking site ID from the dashboard
* `event_type` is `pageview` (if `autoPageview: true`)
* `scan_session_id` is present (if you visited with a `?scnv=` URL parameter)

**Example of a healthy payload:**

```json theme={null}
{
  "event_id": "f9ac7db6-f900-4d8e-8918-c846834195a8",
  "site_id": "YOUR_SITE_ID",
  "event_type": "pageview",
  "scan_session_id": "7ad26d4f-3181-4ef8-b6ca-b8f59499dd43",
  "page_url": "https://yoursite.com/?scnv=7ad26d4f-3181-4ef8-b6ca-b8f59499dd43",
  "timestamp": "2026-05-13T10:00:00.000Z"
}
```

### 3. Test QR attribution

Visit your page with a `?scnv=` parameter (simulate a scan):

```
https://yoursite.com/?scnv=00000000-0000-0000-0000-000000000001
```

Check the payload — `scan_session_id` should match the value you used.

### 4. Enable debug mode temporarily

Add `debug: true` to your init call and reload. The SDK prints all activity to the browser console:

```javascript theme={null}
scanova('init', 'YOUR_SITE_ID', { debug: true, autoPageview: true });
```

Console output should show:

```
[QCG SDK] Initialized with Site ID: YOUR_SITE_ID
[QCG SDK] Loaded version 1.x.x
```

Remove `debug: true` before deploying to production.

***

## Common errors and fixes

### No `/ct` request appears

| Cause                                                | Fix                                                                                       |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| Snippet not in `<head>`                              | Paste snippet before `</head>`, not in `<body>`                                           |
| Script blocked by CSP                                | Add `https://cdn.scanova.io` and `https://t.scanova.io` to your `Content-Security-Policy` |
| Ad blocker or browser extension blocking the request | Test in a private/incognito window with extensions disabled                               |
| `autoPageview: false` and no manual `track` call     | Either enable `autoPageview` or add a manual event                                        |
| Called `init` but SDK hasn't loaded yet              | The SDK queues calls made before it loads — this should resolve automatically             |

### `400` — Bad request

The `site_id` is invalid, empty, or belongs to an inactive site. Double-check that:

* You are using the `site_id` from the correct tracking site in the dashboard
* The site is active (check the status in the dashboard)

### `403` — Domain not allowed

Your website's domain is not in the **Allowed Domains** list for this tracking site.

1. Go to **Integrations → Conversion Tracking**
2. Select your site → click **Edit**
3. Add the exact hostname (e.g. `yoursite.com`, `www.yoursite.com`, `staging.yoursite.com`)
4. Save

<Note>
  The domain check uses the `Origin` or `Referer` header of the request. Make sure you add exactly the hostname shown in the browser address bar — including or excluding `www` matters.
</Note>

### `422` — Validation error

The event payload failed validation. Common causes:

* `event_type` is missing or empty
* A field exceeds the allowed length
* `metadata` contains a raw email address — use `user_identifiers` with a hashed value instead
* `metadata` exceeds 10 KB

### `429` — Rate limit exceeded

Your site is sending events faster than the allowed rate (100 events/min per IP for browser events). This is rare during normal usage. If you see this in testing, space out your test events.

### Events appear in network but not in dashboard

* Wait up to 60 seconds — there is a short processing delay
* Confirm you are looking at the correct tracking site in the dashboard
* Verify the `site_id` in the event payload matches the dashboard site

### No `/ct` request appears for a specific visit

If a visit produces no network request, the user most likely arrived without a QR Code scan — the `?scnv=` parameter is absent. The SDK skips sending any event when there is no `scan_session_id`. This is expected behaviour: the SDK only tracks QR-scan-originated traffic.

### Two events firing per page load

You have both `autoPageview: true` and a manual `scanova('track', 'page_view', ...)` call in your code. Remove one. See [Auto-Tracked Events](/conversion-tracking/browser/auto-tracking#page-view) for details.
