Přeskočit na obsah

Sledování skenů a analytika

Přehled

Každé naskenování dynamického QR kódu vytvoří záznam o skenu (Scan-Record) ve vašem workspace. Sběr dat probíhá kompletně na Cloudflare Edge – bez externích sledovacích služeb, bez souborů cookies a bez toho, aby původní IP adresa kdykoli dosáhla vaší databáze.

Tři způsoby, jak využívat data o skenech:

Agregační API

GET /v1/codes/:id/scans — časové řady + nejčastější země/zařízení/OS pro jeden objekt kódu.

Webhooks (v reálném čase)

Událost qr.scanned na každý sken, podepsaná pomocí HMAC-SHA256. Viz Webhooks.

Dashboard

Vizualizace na nástěnce qr3.app – není nutné žádné volání API.


Jaká data jsou shromažďována

Pro každý sken se vytvoří záznam v tabulce scans:

PoleZdrojPříklad
idUUID generované serveremscn_d1f8…
code_idID naskenovaného QR kóduqr_a1b2c3d4
workspace_idWorkspace kóduws_xxx
countryCloudflare cf.countryAT
regionCloudflare cf.regionVienna
cityCloudflare cf.cityWien
device_typeParsování User-Agentamobile, tablet, desktop
osParsování User-AgentaiOS, Android, macOS, Windows
browserParsování User-AgentaSafari, Chrome, Firefox
refererHTTP hlavička Refererhttps://example.com/landing
languageHlavička Accept-Language (první jazyk)de
redirected_toSkutečný cíl přesměrováníhttps://example.com
ip_hashDenní pseudonym HMAC-SHA-256 (dlouhodobé tajemství + účel + den UTC + IP)8f3a…
scanned_atČasové razítko ISO-86012026-05-12T14:32:11.000Z

Geolokace na Edge

Všechna geografická data (country, region, city) pocházejí z objektu cf od Cloudflare a jsou založena na databázi Cloudflare Geo-IP. Nedotazují se žádné externí Geo-IP služby – vyhodnocení probíhá ve stejném Workeru, který provádí i přesměrování.

To má tři důsledky:

  1. Nízká latence – žádný další skok (hop), žádný DNS dotaz na externího poskytovatele.
  2. Ochrana osobních údajů – IP adresa neopustí Cloudflare a nikdy není předána třetím stranám.
  3. Omezená granularita – hodnota city není vždy k dispozici (např. u VPN, mobilních operátorů nebo malých regionů). Počítejte s hodnotami null a zohledněte je ve svých nástěnkách.

Dotazování na analytiku skenů

GET /v1/codes/:id/scans

Vrací agregovanou analytiku pro jeden QR kód za zvolené časové období.

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

Parametry dotazu (Query Parameters):

ParametrTypVýchozíPopis
daysinteger30Časové období ve dnech (1–365)

Odpověď (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" }
}

Pole odpovědi:

PolePopis
total_scansCelkový počet skenů kódu za celou dobu (nezávisle na časovém okně days)
period_scansSoučet skenů ve zvoleném časovém okně
scans_by_dayDenní skupiny (buckets), vzestupně podle data, prázdné dny jsou vynechány
top_countriesNejčastějších 8 zemí v časovém okně, sestupně
top_devicesNejčastějších 5 typů zařízení (mobile, tablet, desktop)
top_osNejčastějších 5 operačních systémů

Agregace přes více kódů

Celkové součty za celý workspace (např. skeny za měsíc přes všechny kódy) jsou k dispozici přes GET /v1/workspaces/:id v poli scans_this_month. Pro analýzy napříč kódy doporučujeme použít nástěnku (dashboard) nebo pravidelný export.


Zpracování v reálném čase přes webhooks

Pokud chcete zpracovávat události skenování okamžitě, jakmile nastanou – například pro živé nástěnky, sledování leadů nebo integraci s CRM – přihlaste se k odběru události qr.scanned:

Terminál
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 (tělo zprávy):

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

Kompletní dokumentace k ověřování podpisů, logice opakování (retry) a protokolům doručení (delivery logs) v API → Webhooks.


GDPR a ochrana osobních údajů

Záznamy neukládají původní IP. Edge Worker odvodí pseudonym HMAC-SHA-256 z dlouhodobého tajemství, účelu a dne UTC; pseudonym zůstává osobním údajem.

  • Bez tajemství není hodnota přímo vratná, držitel tajemství však může pro den UTC znovu vypočítat známé kandidáty IP.
  • Účel a den UTC jsou součástí odvození, proto hashe stejného skeneru v různých dnech nejsou přímo porovnatelné.
  • Původní IP nedosáhne D1, KV ani R2.

V období přes více dnů je unique_scanners metrika Dny skenování, nikoli lidí: stejný skener dostane pro každý den UTC samostatný pseudonym.

Doba uchování (retence) závisí na tarifu:

TarifDoba uchování
Free7 dní
Pro90 dní
Business / Agency1 rok
EnterpriseVlastní (SLA)

Denně spouštěná plánovaná úloha (cron job purgeOldScans) automaticky odstraňuje starší záznamy – hodnota total_scans u objektu kódu tím zůstává nedotčena.


Doporučené postupy

  • Frekvence dotazování (polling): Agregační API je rychlé a efektivní, ale není určeno pro dotazování každou sekundu. Pro živé aktualizace vždy upřednostňujte webhooks a API používejte pouze pro zpětné načítání dat (backfills) nebo nástěnky.
  • Caching (ukládání do mezipaměti): Odpověď obsahuje časové řady – při velkých časových oknech (days=365) může mít payload velikost několik KB. Ukládejte data do mezipaměti na straně klienta s krátkou dobou platnosti (TTL, např. 60 s).
  • Limity Top-N: Pole top_countries, top_devices a top_os jsou na straně serveru omezeny na 8, respektive 5 záznamů. Pro hlubší analýzy exportujte surová data.
  • Tolerance hodnot null: Pole country, region, city, referer a language mohou mít hodnotu null. Ve svém vyhodnocení s nimi pracujte jako s „Neznámými“ (Unknown).