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.

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:
{
  "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:
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

CauseFix
Snippet not in <head>Paste snippet before </head>, not in <body>
Script blocked by CSPAdd https://cdn.scanova.io and https://t.scanova.io to your Content-Security-Policy
Ad blocker or browser extension blocking the requestTest in a private/incognito window with extensions disabled
autoPageview: false and no manual track callEither enable autoPageview or add a manual event
Called init but SDK hasn’t loaded yetThe 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
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.

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 for details.