Analytics
Each recorded scan stores the time, location, device and how the scanner got there. Bots and prefetches aren't recorded, as covered in the introduction.
Scans are recorded on every plan, but reading them needs Pro. That covers the dashboard, the map, a code's scan history and the /scans API routes.
Where to look
- The dashboard shows totals and trends across your workspace.
- A code's own page lists its scans.
/mapplots scans by location and exports them as CSV./activityis the log of what people in your workspace changed.
What a scan stores
| Field | Notes |
|---|---|
| Time | When the scan happened |
| IP address | Deleted along with the scan if your deployment sets a retention period |
| Country, region, city, latitude, longitude | From Vercel's geolocation headers, so empty when running elsewhere |
| Device, device type, browser, OS | Parsed from the user agent |
| Referrer and category | Most QR scans have no referrer |
| UTM parameters | From the scan URL and from the code's own UTM settings |
| Unique visitor | Whether this IP and user agent had scanned this code before |
Unique visitors are an estimate. Two people on the same Wi-Fi with the same phone model count as one.
Tag a campaign
Set UTM parameters on a URL code to have them added to the destination and recorded with each scan. Print one code per placement, each with its own utm_content, to compare placements.
Get the numbers out
Use the API, or read totals directly:
curl -H "Authorization: Bearer $QRHOOKS_API_KEY" \
"https://your-domain/api/v1/scans/stats?from=2026-10-01T00:00:00Z"