Shopify geeft je geen logbestanden. Hier is een complete technische handleiding om ze te verkrijgen met Cloudflare (of elke Edge CDN).
Een grote blinde vlek in e-commerce is eindelijk opgelost
Sinds de dag dat Shopify werd gelanceerd, heeft het platform ruwe serverlogboeken volledig buiten bereik van winkeleigenaren gehouden. Je krijgt conversietrechters en verkooprapportages. Wat je niet krijgt is het enige dat je echt vertelt wat je server raakt: het HTTP-verzoeklogboek.
Jarenlang was dit een klein ongemak. Wie maalt er om ruwe logbestanden als je paginaweergaven en conversiepercentages hebt? Google Analytics volgt je menselijke bezoekers. Je advertentieplatform volgt je campagnes. Het leven is goed.
Toen kwam AI.
ChatGPT, Claude, Perplexity, Google AI Overviews, Microsoft Copilot - ze sturen allemaal nu bots naar je winkel. Sommige crawlen je pagina’s om trainingsdata op te bouwen. Andere halen je productinhoud in realtime op om de vraag van een klant te beantwoorden. En het vervelende? Traditionele analysetools zoals Google Analytics kunnen hier niets van zien. Ze zijn afhankelijk van client-side JavaScript die bots nooit uitvoeren. Het grootste deel van de AI-interactie met je winkel is onzichtbaar voor je.
Dit is de nieuwe blinde vlek in e-commerce. AI-bots voeren je trackingscripts niet uit. Ze accepteren geen cookies. Ze verschijnen niet in je GA4-rapporten. Maar ze lezen absoluut je productpagina’s, nemen je beschrijvingen op in AI-gegenereerde antwoorden en bepalen mede of klanten je merk ooit ontdekken.
Nieuwe tools gericht op “agent analytics” komen op om site-eigenaren te helpen AI-crawleractiviteit en AI-gegenereerde verwijzingen te begrijpen via server-side tracking, botclassificatie en IP-verificatie. De industrie erkent dat het oude client-side analysemodel fundamenteel niet werkt voor het tijdperk van AI-first contentontdekking. Daarom hebben we het WISLR AI Visibility Dashboard gebouwd - om merken een duidelijk beeld te geven van hoe AI-platforms met hun content omgaan, van crawlfrequenties tot fetch-verzoeken tot AI-gestuurd verwijzingsverkeer.
Maar als je op Shopify zit, heb je een uniek probleem: je hebt geen controle over de server. Je kunt geen server-side tracking rechtstreeks installeren. Je kunt je toegangslogboeken niet bekijken. Je kunt niet zoeken naar GPTBot. De infrastructuur van Shopify is een black box, en ze hebben geen haast getoond om deze te openen.
Dat is nu voorbij. Hier lees je hoe je je logboeken terugkrijgt.
Deze handleiding leidt je door het bouwen van je eigen complete request logging pipeline voor een Shopify-winkel met Cloudflare. Elk HTTP-verzoek. Volledige geolocatiegegevens. Prestatiemetrieken. En het allerbelangrijkste: volledige botdetectie en -classificatie, zodat je eindelijk precies kunt zien welke AI-systemen je winkel bezoeken, hoe vaak, en welke pagina’s ze interesseren.
Hoe werkt Cloudflare request logging voor Shopify?
Bezoeker vraagt je Shopify-winkel aan
│
▼
Cloudflare CDN (je domein geproxied via Cloudflare)
│
▼
Cloudflare Worker (draait bij elk verzoek)
├──→ Stuurt verzoek door naar Shopify origin (bezoeker krijgt normaal antwoord)
└──→ POST een JSON-logvermelding naar je log-ontvanger (non-blocking, via ctx.waitUntil)
│
▼
Cloudflare Tunnel
(CNAME op je domein → tunnel → localhost op je server)
│
▼
Node.js HTTP-ontvanger (localhost:9090)
│
▼
JSON-logbestanden geschreven naar schijf
Er worden geen poorten publiek geopend. De Cloudflare Tunnel regelt het veilige transport van Cloudflare’s edge naar je server via een alleen-uitgaande verbinding.
Wat heb je nodig om Shopify request logging in te stellen?
- Een Shopify-winkel met een aangepast domein dat via Cloudflare wordt geproxied (oranje wolk ingeschakeld)
- Een server om logboeken te ontvangen
- Node.js geinstalleerd op de server
- Een Cloudflare-account met Workers ingeschakeld
- Wrangler CLI geinstalleerd (npm install -g wrangler)
- Cloudflared geinstalleerd op de server
Stap 1: Maak de Cloudflare Worker aan
De Worker onderschept elk verzoek op je domein, stuurt het door naar Shopify en verstuurt asynchroon een logvermelding naar je ontvanger.
1a. Worker-broncode (cloudflare-worker.js)
/**
* Shopify Request Logger
*
* Cloudflare Worker that:
* 1. Logs ALL requests to a self-hosted log receiver (via Cloudflare Tunnel)
* 2. Optionally logs detailed bot request data to a database
*/
// ============================================
// CONFIG - update these for your setup
// ============================================
const INGEST_URL = 'https://log-collector.yourdomain.com/collect'; // Your tunnel hostname
const INGEST_API_KEY = process.env.INGEST_API_KEY || ''; // Set as Worker secret
// ============================================
// BOT DETECTION PATTERNS
// ============================================
const BOT_PATTERNS = {
// AI realtime fetchers (user-triggered queries)
'ChatGPT-User': { pattern: /ChatGPT-User/i, type: 'realtime' },
'Perplexity-User': { pattern: /Perplexity-User/i, type: 'realtime' },
// Add your own patterns here for other AI bots
// Search engine crawlers
'Googlebot': { pattern: /Googlebot/i, type: 'crawler' },
'Bingbot': { pattern: /bingbot/i, type: 'crawler' },
// Social link preview bots
'FacebookBot': { pattern: /facebookexternalhit/i, type: 'preview' },
'LinkedInBot': { pattern: /LinkedInBot/i, type: 'preview' },
};
function identifyBot(userAgent) {
if (!userAgent) return { name: 'unknown', type: 'unknown' };
for (const [name, config] of Object.entries(BOT_PATTERNS)) {
if (config.pattern.test(userAgent)) return { name, type: config.type };
}
return { name: 'other', type: 'unknown' };
}
function isKnownBot(userAgent) {
if (!userAgent) return false;
return Object.values(BOT_PATTERNS).some(config => config.pattern.test(userAgent));
}
async function logToReceiver(request, env, perfData = {}) {
const url = new URL(request.url);
const cf = request.cf || {};
const bot = identifyBot(request.headers.get('user-agent') || '');
const logEntry = {
// Request basics
timestamp: new Date().toISOString(),
method: request.method,
url: request.url,
path: url.pathname,
host: url.hostname,
userAgent: request.headers.get('user-agent') || '',
ip: request.headers.get('cf-connecting-ip') || '',
referer: request.headers.get('referer') || '',
cfRay: request.headers.get('cf-ray') || '',
// Bot classification
botName: bot.name,
botType: bot.type,
// Cloudflare geo data
country: cf.country || '',
region: cf.region || '',
city: cf.city || '',
postalCode: cf.postalCode || '',
latitude: cf.latitude || '',
longitude: cf.longitude || '',
timezone: cf.timezone || '',
continent: cf.continent || '',
// Network info
asn: cf.asn || '',
asOrganization: cf.asOrganization || '',
colo: cf.colo || '',
httpProtocol: cf.httpProtocol || '',
tlsVersion: cf.tlsVersion || '',
// Client hints (helps detect headless browsers)
secChUa: request.headers.get('sec-ch-ua') || '',
secChUaMobile: request.headers.get('sec-ch-ua-mobile') || '',
secChUaPlatform: request.headers.get('sec-ch-ua-platform') || '',
// Fetch metadata (helps detect programmatic requests)
secFetchDest: request.headers.get('sec-fetch-dest') || '',
secFetchMode: request.headers.get('sec-fetch-mode') || '',
secFetchSite: request.headers.get('sec-fetch-site') || '',
// Performance metrics
edgeStartTimestamp: perfData.startTime || '',
edgeEndTimestamp: perfData.endTime || '',
edgeTimeToFirstByteMs: perfData.ttfbMs ?? '',
clientTcpRttMs: cf.clientTcpRtt ?? '',
cacheCacheStatus: perfData.cacheStatus || '',
originResponseStatus: perfData.responseStatus ?? '',
};
try {
await fetch(INGEST_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': env.INGEST_API_KEY,
},
body: JSON.stringify({ logs: [logEntry] }),
});
} catch (e) {
console.error(`Log ingest failed: ${e.message}`);
}
}
export default {
async fetch(request, env, ctx) {
const startTime = Date.now();
const url = new URL(request.url);
// Avoid infinite loop - skip logging for your ingest hostname
if (url.hostname === 'log-collector.yourdomain.com') {
return fetch(request);
}
// Fetch the origin response (Shopify)
const response = await fetch(request);
const endTime = Date.now();
// Ship log entry asynchronously (does not delay the response)
ctx.waitUntil(logToReceiver(request, env, {
startTime,
endTime,
ttfbMs: endTime - startTime,
cacheStatus: response.headers.get('cf-cache-status') || '',
responseStatus: response.status,
}));
return response;
}
};
1b. Wrangler-configuratie (wrangler.toml)
name = "shopify-request-logger"
main = "cloudflare-worker.js"
compatibility_date = "2024-01-01"
routes = [
{ pattern = "www.yourdomain.com/*", zone_name = "yourdomain.com" }
]
Vervang www.yourdomain.com door het aangepaste domein van je Shopify-winkel.
1c. Worker Secrets instellen
wrangler secret put INGEST_API_KEY
# Paste your generated API key when prompted
1d. Deployen
npx wrangler deploy
Stap 2: Stel de log-ontvanger in op je server
Een minimale Node.js HTTP-server die logbatches accepteert en naar schijf schrijft.
2a. Ontvangerscript (receive-logs.js)
const http = require('http');
const fs = require('fs');
const path = require('path');
const PORT = 9090;
const API_KEY = process.env.LOG_API_KEY;
const LOG_DIR = '/var/log/cdn-requests'; // Choose your log directory
if (!API_KEY) {
console.error('LOG_API_KEY environment variable is required');
process.exit(1);
}
// Ensure log directory exists
fs.mkdirSync(LOG_DIR, { recursive: true });
const server = http.createServer((req, res) => {
// Health check
if (req.method === 'GET' && req.url === '/status') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ status: 'ok' }));
return;
}
// Log ingest endpoint
if (req.method === 'POST' && req.url === '/collect') {
const apiKey = req.headers['x-api-key'];
if (apiKey !== API_KEY) {
res.writeHead(401, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'unauthorized' }));
return;
}
let body = '';
let size = 0;
const MAX_BODY = 10 * 1024 * 1024; // 10MB limit
req.on('data', chunk => {
size += chunk.length;
if (size > MAX_BODY) {
res.writeHead(413, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'payload too large' }));
req.destroy();
return;
}
body += chunk;
});
req.on('end', () => {
try {
JSON.parse(body); // Validate JSON
} catch (e) {
res.writeHead(400, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'invalid JSON' }));
return;
}
const filename = `logs-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.json`;
const filepath = path.join(LOG_DIR, filename);
fs.writeFile(filepath, body, err => {
if (err) {
console.error(`Write failed: ${err.message}`);
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'write failed' }));
return;
}
console.log(`Wrote ${filename} (${size} bytes)`);
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ ok: true }));
});
});
} else {
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'not found' }));
}
});
server.listen(PORT, '127.0.0.1', () => {
console.log(`Log receiver listening on 127.0.0.1:${PORT}`);
});
Belangrijke punten:
- Bindt aan
127.0.0.1alleen - niet blootgesteld aan het internet - Authenticeert verzoeken met een
X-API-Keyheader - Schrijft elke logbatch als een JSON-bestand met tijdstempel
- 10MB payload-limiet per verzoek
2b. Systemd-service
Maak /etc/systemd/system/log-receiver.service aan:
[Unit]
Description=Shopify request log receiver
After=network.target
[Service]
Type=simple
Environment=LOG_API_KEY=<your-generated-api-key>
ExecStart=/usr/bin/node /opt/log-receiver/receive-logs.js
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Inschakelen en starten:
systemctl daemon-reload
systemctl enable --now log-receiver
Stap 3: Stel de Cloudflare Tunnel in
De tunnel maakt een beveiligde verbinding van Cloudflare’s edge naar je server - geen open poorten, geen firewallregels nodig.
3a. Installeer cloudflared
# Debian/Ubuntu
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \
-o /tmp/cloudflared.deb
dpkg -i /tmp/cloudflared.deb
3b. Authenticeren
cloudflared tunnel login
# Opens a browser (or gives you a URL) to authorize with your Cloudflare account
Dit slaat een cert.pem op in ~/.cloudflared/.
3c. Maak de tunnel aan
cloudflared tunnel create shopify-log-collector
Dit geeft een Tunnel ID (een UUID) terug en maakt een credentials JSON-bestand aan in ~/.cloudflared/.
3d. Configureer de tunnel
Maak ~/.cloudflared/config.yml aan:
tunnel: <YOUR-TUNNEL-ID>
credentials-file: /root/.cloudflared/<YOUR-TUNNEL-ID>.json
ingress:
- hostname: log-collector.yourdomain.com
service: http://localhost:9090
- service: http_status:404
hostname: Het subdomein waarnaar je Worker de logboeken POSTservice: Routeert naar je Node.js-ontvanger op localhost:9090- Catch-all-regel: Retourneert 404 voor elke andere hostnaam (vereist door cloudflared)
3e. Maak het DNS-record aan
cloudflared tunnel route dns shopify-log-collector log-collector.yourdomain.com
Dit maakt een CNAME-record aan in je Cloudflare DNS:
log-collector.yourdomain.com → <TUNNEL-ID>.cfargotunnel.com
Het record wordt geproxied via Cloudflare (oranje wolk) - de tunnel-ID in de CNAME is niet publiek betekenisvol.
3f. Installeer als systeemservice
cloudflared service install
systemctl enable --now cloudflared
Dit kopieert je configuratie naar /etc/cloudflared/config.yml en maakt een systemd-unit aan.
Verifieer de tunnel
systemctl status cloudflared
# Should show: active (running)
curl https://log-collector.yourdomain.com/status
# Should return: {"status":"ok"}
Stap 4: Genereer je API-sleutel
Genereer een willekeurige API-sleutel die gedeeld wordt tussen de Worker en de ontvanger:
openssl rand -hex 32
Stel deze waarde in:
- Als een Worker secret via
wrangler secret put INGEST_API_KEY - In de systemd Environment-regel van de ontvanger (LOG_API_KEY=…)
Stap 5: Verifieer de volledige werking
- Bezoek je Shopify-winkel in een browser
- Controleer de ontvangerlogboeken:
journalctl -u log-receiver -f
# Should show: Wrote logs-1234567890-abc123.json (1234 bytes)
- Bekijk een logbestand:
cat /var/log/cdn-requests/logs-*.json | head -1 | python3 -m json.tool
Je zou een volledige logvermelding moeten zien met verzoekdetails, geolocatiegegevens en prestatiemetrieken.
Voorbeeld logvermelding
{
"logs": [{
"timestamp": "2026-03-04T15:19:55.584Z",
"method": "GET",
"url": "https://www.yourdomain.com/products/example",
"path": "/products/example",
"host": "www.yourdomain.com",
"userAgent": "Mozilla/5.0 ...",
"ip": "198.51.100.23",
"country": "US",
"city": "Seattle",
"asn": 16509,
"asOrganization": "Amazon.com",
"colo": "SEA",
"edgeTimeToFirstByteMs": 109,
"originResponseStatus": 200,
"cacheCacheStatus": "HIT",
"botName": "other",
"botType": "unknown"
}]
}
Hoe werkt de volledige Shopify logging pipeline?
| Component | Wat het doet | Waar het draait |
|---|---|---|
| Cloudflare Worker | Onderschept elk verzoek, stuurt door naar Shopify, verstuurt een logvermelding | Cloudflare edge (gedeployed via Wrangler) |
| Cloudflare Tunnel | Verbindt Cloudflare edge veilig met je server (geen open poorten) | cloudflared daemon op je server |
| DNS CNAME | log-collector.yourdomain.com naar <tunnel-id>.cfargotunnel.com |
Cloudflare DNS voor je zone |
| Node.js-ontvanger | Accepteert JSON-log-POST’s, authenticeert via API-sleutel, schrijft naar schijf | Je server, gebonden aan localhost:9090 |
Gegevensstroom
1. Bezoeker opent https://www.yourdomain.com/products/something
2. Cloudflare routeert via de Worker
3. Worker haalt origin-antwoord op van Shopify → stuurt het terug naar de bezoeker
4. Worker POST { logs: [entry] } naar https://log-collector.yourdomain.com/collect
(non-blocking - bezoeker hoeft hier niet op te wachten)
5. Cloudflare lost log-collector.yourdomain.com op via tunnel CNAME
6. Tunnel stuurt verzoek door naar localhost:9090 op je server
7. Ontvanger valideert X-API-Key, schrijft JSON-bestand naar schijf
Welke Shopify-verzoekgegevens kun je vastleggen die Shopify je niet laat zien?
Shopify’s beheerpaneel toont je paginaweergaven, bestellingen en verwijzingsbronnen. Het toont je niet welke AI-bots op bezoek kwamen, welke pagina’s ze ophaalden, waar ze vandaan kwamen, of hoe snel je server reageerde. Deze opzet legt meer dan 40 velden per verzoek vast in de volgende categorieen:
| Categorie | Velden |
|---|---|
| Verzoek | timestamp, method, url, path, host, userAgent, ip, referer |
| Botdetectie | botName, botType (realtime / crawler / preview / unknown) |
| Cloudflare Geo | country, region, city, postalCode, latitude, longitude, timezone, continent |
| Netwerk | asn, asOrganization, colo, httpProtocol, tlsVersion |
| Client Hints | sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform |
| Fetch Metadata | sec-fetch-dest, sec-fetch-mode, sec-fetch-site |
| Prestaties | edgeTimeToFirstByteMs, clientTcpRttMs, cacheCacheStatus, originResponseStatus |
Client Hints en Fetch Metadata zijn bijzonder nuttig voor het identificeren van headless browsers en niet-ondertekende bots - echte browsers sturen deze headers, de meeste bots niet.
Welke AI-bots bezoeken je Shopify-winkel?
Shopify maakt geen onderscheid tussen menselijke bezoekers en AI-crawlers. Deze Worker classificeert elke User-Agent in twee categorieen die belangrijk zijn voor AI-zichtbaarheid:
| Type | Beschrijving | Voorbeelden |
|---|---|---|
realtime |
AI-assistenten die pagina’s ophalen als reactie op gebruikersvragen | ChatGPT-User, Claude-Web, Perplexity-User |
crawler |
Bots die content indexeren voor zoekmachines of AI-training | GPTBot, Googlebot, ClaudeBot, Bingbot |
Verzoeken van niet-herkende User-Agents worden getagd als other / unknown - je kunt deze later analyseren om niet-ondertekende crawlers te vinden. Dit zijn gegevens die Shopify, Google Analytics en de meeste SaaS-analyseplatforms simpelweg niet bieden.
Hoe sla je Shopify-botgegevens op in een database voor diepere analyse?
Voor diepgaandere botanalyses kun je de Worker uitbreiden om botverzoeken te loggen naar Supabase (of elke andere database) naast het schrijven naar schijf. Voeg deze Worker secrets toe:
wrangler secret put SUPABASE_URL
wrangler secret put SUPABASE_SERVICE_KEY
Voeg vervolgens een logToDatabase()-functie toe die POST naar de REST API van je database, aangeroepen via ctx.waitUntil() voor bekende botverzoeken. Dit geeft je gestructureerde, doorzoekbare botgegevens naast de ruwe logbestanden.
Hoe configureer je Cloudflare DNS voor een Shopify-winkel met request logging?
Om deze opzet te laten werken, moet je domein geproxied worden via Cloudflare (oranje wolk). Een typische Shopify + Cloudflare DNS-configuratie:
| Type | Naam | Doel | Proxy |
|---|---|---|---|
| CNAME | www |
shops.myshopify.com |
Geproxied (oranje) |
| CNAME | log-collector |
<tunnel-id>.cfargotunnel.com |
Geproxied (oranje) |
De www CNAME wijst naar Shopify - Cloudflare proxiet en cachet. De log-collector CNAME wijst naar je tunnel - Cloudflare routeert logverkeer veilig naar je server.
Belangrijk: De Worker-route moet overeenkomen met de geproxiede hostnaam (bijv.
www.yourdomain.com/*). Deze wordt niet geactiveerd op niet-geproxiede (grijze wolk) records.
Hoe monitor en onderhoud je je Shopify log pipeline?
# Check receiver status
systemctl status log-receiver
# Check tunnel status
systemctl status cloudflared
# Tail live logs
journalctl -u log-receiver -f
# Count stored log files
ls /var/log/cdn-requests/*.json | wc -l
# Check disk usage
du -sh /var/log/cdn-requests/
Overweeg een cron job toe te voegen om schijfgebruik te monitoren en een waarschuwing te geven wanneer de opslag je limiet nadert.
Veelgestelde vragen
Waarom kunnen Shopify-winkeleigenaren geen toegang krijgen tot serverlogboeken?
Shopify is een volledig beheerd SaaS-platform. Winkeleigenaren hebben geen toegang tot de onderliggende serverinfrastructuur, wat betekent dat er geen toegang is tot ruwe HTTP-verzoeklogboeken, toegangslogboeken of foutlogboeken. Shopify biedt een eigen analysedashboard met paginaweergaven, bestellingen en verwijzingsgegevens, maar dit omvat geen individuele HTTP-verzoeken, bot user agents, reactietijden of geolocatiegegevens op verzoekniveau. Er is geen Shopify-abonnement, inclusief Shopify Plus, dat toegang tot ruwe serverlogboeken biedt. De enige manier om deze gegevens vast te leggen is het onderscheppen van verzoeken op de CDN-laag voordat ze Shopify’s origin-servers bereiken.
Hoe volg je AI-botverkeer op een Shopify-winkel?
AI-botverkeer kan niet worden gevolgd via Google Analytics, Shopify Analytics of enige client-side JavaScript-analysetool, omdat AI-bots geen JavaScript uitvoeren. De enige betrouwbare methode is server-side request logging. Voor Shopify-winkels betekent dit het onderscheppen van verzoeken op de CDN-laag met een Cloudflare Worker (of een vergelijkbare edge-functie op een andere CDN). De Worker logt elk binnenkomend verzoek, inclusief de User-Agent header, die specifieke AI-bots identificeert zoals ChatGPT-User, GPTBot, ClaudeBot, PerplexityBot en andere. Dit is dezelfde aanpak die wordt gebruikt door opkomende “agent analytics”-platforms, maar zelf gehost en volledig onder je eigen controle.
Welke AI-bots crawlen momenteel Shopify-winkels?
Per 2026 vallen de voornaamste AI-bots die Shopify-winkels bezoeken in twee categorieen. Realtime fetch-bots (ChatGPT-User, Claude-User, Perplexity-User) halen content op aanvraag op tijdens live gebruikersgesprekken. Trainingscrawlers (GPTBot, ClaudeBot, PerplexityBot, Bytespider, Amazonbot, Applebot) verzamelen content volgens een schema voor modeltraining en indexopbouw. Zonder server-side logging verschijnt geen van deze in Shopify’s analyses of Google Analytics.
Hoeveel gegevensvelden logt Cloudflare per verzoek?
Deze opzet legt meer dan 40 velden per verzoek vast, waaronder verzoekbasis (tijdstempel, methode, URL, pad, user agent, IP, referer), botclassificatie (botnaam en type), Cloudflare-geolocatiegegevens (land, regio, stad, postcode, breedtegraad, lengtegraad, tijdzone, continent), netwerkinfo (ASN, organisatie, datacenter, HTTP-protocol, TLS-versie), client hints (sec-ch-ua headers die helpen bij het detecteren van headless browsers), fetch metadata (sec-fetch headers die programmatische verzoeken identificeren) en prestatiemetrieken (time to first byte, TCP round trip time, cachestatus, origin-antwoordstatus).
Hoe verhoudt dit zich tot Shopify’s ingebouwde analyses?
Shopify’s analysedashboard toont paginaweergaven, sessies, conversiepercentages en verwijzingsbronnen. Het toont geen individuele HTTP-verzoeken, bot user agents, geografische gegevens op verzoekniveau, prestatiemetrieken van reacties, of enige AI-botactiviteit. Google Analytics, waarmee Shopify integreert, heeft dezelfde beperking omdat het afhankelijk is van client-side JavaScript. Deze op Cloudflare gebaseerde logging-opzet legt elk verzoek vast dat je domein raakt, inclusief verzoeken van bots die nooit JavaScript uitvoeren, waardoor je een compleet beeld krijgt dat Shopify’s tools niet kunnen bieden.
Kun je deze opzet gebruiken met een andere CDN dan Cloudflare?
De architectuur is toepasbaar op elke edge CDN die edge-functies en beveiligde tunneling ondersteunt. Cloudflare Workers hebben equivalenten op andere platforms: Vercel Edge Functions, AWS CloudFront Functions, Fastly Compute en Akamai EdgeWorkers kunnen allemaal verzoeken onderscheppen en loggegevens versturen. Het tunnelcomponent kan worden vervangen door elke beveiligde verbindingsmethode (SSH-tunnel, VPN, direct HTTPS-eindpunt met IP-allowlisting). Het kernpatroon is hetzelfde: onderschep aan de edge, log asynchroon, verstuur naar je eigen ontvanger.