Hoppa till innehåll

Scan-tracking & analys

Översikt

Varje skanning av en dynamisk QR-kod skapar en scan-record i din workspace. Datainsamlingen sker helt på Cloudflare Edge — utan externa spårningstjänster, utan cookies och utan att den ursprungliga IP-adressen någonsin når din databas.

Tre sätt att konsumera skanningsdata:

Aggregerings-API

GET /v1/codes/:id/scans — tidsserier + toppländer/-enheter/-OS för ett enskilt kodobjekt.

Webhooks (realtid)

qr.scanned-event per skanning, HMAC-SHA256-signerat. Se Webhooks.

Dashboard

Visualisering i qr3.app-dashboarden — inget API-anrop krävs.


Vilka data samlas in

För varje skanning skapas en post i tabellen scans:

FältKällaExempel
idServergenererad UUIDscn_d1f8…
code_idKod-ID för den skannade QR-kodenqr_a1b2c3d4
workspace_idKodens workspacews_xxx
countryCloudflare cf.countryAT
regionCloudflare cf.regionVienna
cityCloudflare cf.cityWien
device_typeUser-Agent-parsningmobile, tablet, desktop
osUser-Agent-parsningiOS, Android, macOS, Windows
browserUser-Agent-parsningSafari, Chrome, Firefox
refererHTTP Referer-headerhttps://example.com/landing
languageAccept-Language-header (första språket)de
redirected_toFaktiskt omdirigeringsmålhttps://example.com
ip_hashSHA-256(IP + dagligt salt) — inte reversibelt8f3a…
scanned_atISO-8601-tidsstämpel2026-05-12T14:32:11.000Z

Geolokalisering på Edge

Alla geodata (country, region, city) kommer från cf-objektet i Cloudflare och baseras på Cloudflare Geo-IP-databasen. Inga externa Geo-IP-tjänster anropas — upplösningen sker i samma worker som utför omdirigeringen.

Detta får tre konsekvenser:

  1. Låg latens — inget extra hopp, ingen DNS-sökning mot en extern leverantör.
  2. Dataskydd — IP-adressen lämnar inte Cloudflare och vidarebefordras aldrig till tredje part.
  3. Begränsad granularitetcity är inte alltid tillgänglig (t.ex. vid VPN, mobiloperatörer eller små regioner). Räkna med null-värden och kalkylera med dem i dina dashboards.

Hämta skanningsanalys

GET /v1/codes/:id/scans

Returnerar aggregerad analysdata för en enskild QR-kod under en valbar tidsperiod.

Terminal window
curl "https://qr3.app/v1/codes/qr_a1b2c3d4/scans?days=30" \
-H "Authorization: Bearer qr3_sk_..."

Query-parametrar:

ParameterTypStandardBeskrivning
daysinteger30Tidsperiod i dagar (1–365)

Svar (HTTP 200):

{
"data": {
"code_id": "qr_a1b2c3d4",
"short_code": "r7f3Kx",
"total_scans": 1842,
"period_days": 30,
"period_scans": 367,
"scans_by_day": [
{ "date": "2026-04-13", "count": 12 },
{ "date": "2026-04-14", "count": 18 }
],
"top_countries": [
{ "value": "AT", "count": 142 },
{ "value": "DE", "count": 98 },
{ "value": "CH", "count": 41 }
],
"top_devices": [
{ "value": "mobile", "count": 281 },
{ "value": "desktop", "count": 72 },
{ "value": "tablet", "count": 14 }
],
"top_os": [
{ "value": "iOS", "count": 158 },
{ "value": "Android", "count": 123 },
{ "value": "macOS", "count": 48 }
]
},
"meta": { "request_id": "req_xyz123" }
}

Svarsfält:

FältBeskrivning
total_scansTotalt antal skanningar under kodens livstid (oberoende av fönstret för days)
period_scansTotalt antal skanningar under det valda tidsfönstret
scans_by_dayDags-buckets, stigande efter datum, tomma dagar utelämnas
top_countriesTopp 8 länder under tidsfönstret, fallande
top_devicesTopp 5 enhetstyper (mobile, tablet, desktop)
top_osTopp 5 operativsystem

Aggregering över flera koder

Workspace-övergripande summor (t.ex. skanningar per månad för alla koder) finns tillgängliga via GET /v1/workspaces/:id i fältet scans_this_month. För analyser över flera koder rekommenderar vi dashboarden eller en periodisk export.


Realtidskonsumtion via webhooks

Om du vill bearbeta skanningsevents så fort de inträffar — till exempel för live-dashboards, lead-tracking oder CRM-integrationer — prenumerera på qr.scanned-eventet:

Terminal window
curl -X POST https://qr3.app/v1/webhooks \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/qr3",
"events": ["qr.scanned"],
"secret": "my-secret-key-min-16-chars"
}'

Payload:

{
"id": "evt_abc123xyz",
"type": "qr.scanned",
"created": "2026-05-12T14:32:11.000Z",
"data": {
"code_id": "qr_a1b2c3d4",
"short_code": "r7f3Kx",
"scan_id": "scn_d1f8...",
"country": "AT",
"device_type": "mobile",
"os": "iOS"
}
}

Fullständig dokumentation om signaturverifiering, retry-logik och leveransloggar finns i API → Webhooks.


GDPR & dataskydd

Scan-records innehåller inga personuppgifter i form av IP-adresser. Den ursprungliga IP-adressen ersätts i Edge-workern med en kryptografisk hashfunktion (SHA-256) med ett dagligt roterande salt. Detta innebär:

  • Ingen återidentifiering är möjlig, även om algoritmen är känd
  • Ingen korrelation av samma besökare över flera dagar
  • Den ursprungliga IP-adressen når aldrig D1-databasen

Retention (lagringstid) beror på ditt abonnemang:

AbonnemangLagringstid
Free7 dagar
Pro90 dagar
Business / Agency1 år
EnterpriseCustom (SLA)

Ett dagligt cron-jobb (purgeOldScans) tar automatiskt bort äldre poster — total_scans på kodobjektet påverkas inte av detta.


Best practices

  • Pollingfrekvens: Aggregerings-API:et är resurssnålt men inte avsett för anrop varje sekund. För live-uppdateringar bör du alltid föredra webhooks och endast använda API:et för backfills / dashboards.
  • Caching: Svaret innehåller tidsserier — vid stora tidsfönster (days=365) kan payloaden bli flera KB stor. Cachelagra på klientsidan med en kort TTL (t.ex. 60 s).
  • Topp-N-begränsningar: top_countries, top_devices och top_os är begränsade på serversidan till 8 respektive 5 poster. För djupare analyser bör du exportera rådata.
  • Tolerera null-värden: country, region, city, referer och language kan vara null. Hantera detta som “Okänd” i dina analyser.