Pricing

Cross-regio prijsmonitoring voor reizen en SaaS

5 min read Published Updated 896 words

Een hotelkamer in Parijs die op Booking.com voor €200 wordt aangeboden vanaf een Frans IP-adres kost €260 wanneer dezelfde browser dezelfde URL bezoekt vanaf een Amerikaans IP-adres. Dat is geen valuta-omzettingsartefact — het is bewuste dynamische prijsstelling op basis van geolocatie. Voor SaaS kan dezelfde zitplaats in Slack of Jira 40% verschillen tussen de Verenigde Staten en India. Het monitoren van deze prijsverschillen op schaal vereist een proxy-infrastructuur die dezelfde anti-fraudesystemen overleeft die luchtvaartmaatschappijen en cloudleveranciers inzetten tegen scrapers.

Waarom dezelfde SKU in verschillende landen andere prijzen heeft

Drie mechanismen drijven geo-arbitrageprijzen aan. Ten eerste valutaomrekening met verborgen opslagen — de boekingsengine van het hotel past een wisselkoersmarge van 3-5% toe die per land verschilt. Ten tweede lokale belastingregimes: btw in de EU, GST in India, omzetbelasting in de VS. Ten derde, en het meest agressief, vraaggestuurde dynamische prijsstelling. Een vlucht van Londen naar New York met British Airways toont een hogere prijs wanneer de aanvraag afkomstig is van een Brits IP-adres dan van een Duits IP-adres, omdat het algoritme ervan uitgaat dat Britse reizigers een hogere betalingsbereidheid hebben. SaaS-leveranciers zoals Atlassian en Salesforce hanteren aparte prijslijsten per regio, vaak met 30-50% korting voor opkomende markten. De enige manier om deze prijzen programmatisch vast te leggen, is door de aanvraag te laten lijken alsof deze uit elke doelmarkt komt.

Proxy-architectuur voor prijsverzameling in meerdere regio's

Een enkele pool van residentiële proxy's is niet voldoende. Je hebt een pool van exitnodes nodig die overeenkomen met het land, de stad en soms zelfs de provider (bijv. een Franse mobiele provider versus een Franse residentiële DSL). De standaardaanpak gebruikt een proxy-broker die een wisselende lijst van geverifieerde proxy's onderhoudt. Hieronder staat een minimale curl-opdracht die een hotelprijs ophaalt via een Franse proxy, de Accept-Language-header instelt op fr-FR en een realistische User-Agent stuurt van een recente Chrome-build:

curl -s -x "http://user:pass@fr-proxy.example.com:3128" \
  -H "Accept-Language: fr-FR,fr;q=0.9" \
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" \
  "https://www.booking.com/hotel/fr/paris-ritz.html" | grep -oP '"price":"[^"]+"'

Deze enkele opdracht zal 60-80% van de tijd mislukken als de proxy bekend is bij een botdetectiedienst zoals DataDome of Akamai. Het faalpercentage daalt pas wanneer je proxyrotatie combineert met sessiepersistentie en header-fingerprinting die overeenkomt met de echte provider van de proxy.

Anti-fraude botdetectie: de echte bottleneck

Reis- en SaaS-platformen investeren zwaar in botdetectie. Ze controleren niet alleen de reputatie van het IP-adres, maar ook de TLS-handshake-fingerprint (JA3), HTTP/2-instellingen, timing-jitter en de volgorde van HTTP-headers. Een proxy die de ene controle doorstaat, kan bij een andere falen. Een datacenterproxy met een schoon IP-adres maar een JA3-handtekening die overeenkomt met een bekend scraping-tool, wordt bijvoorbeeld onmiddellijk geblokkeerd. Residentiële proxy's zijn niet immuun — veel zijn afkomstig van geïnfecteerde apparaten en staan op zwarte lijsten. De meest effectieve strategie is het gebruik van een speciale proxypool die je hebt getest tegen de detectiestack van de doelsite. Verwacht een succespercentage van 10-20% per proxy, zelfs onder ideale omstandigheden. Dat betekent dat je minstens 5-10 proxy's per doelregio nodig hebt om een stabiel scrape-tempo van één verzoek per 5-10 seconden te handhaven.

Hier bijt de afweging: hogere proxykwaliteit (residentieel, statische IP's, hoge reputatie) kost 10x meer dan datacenterproxy's, maar het succespercentage kan slechts verdubbelen. Voor een prijsmonitoringsoperatie die 100 SKU's per uur over 10 regio's verwerkt, kan de maandelijkse proxyrekening oplopen tot meer dan $2.000. Het alternatief — het gebruik van gratis openbare proxy's — is geen optie, omdat hun IP's al zijn gemarkeerd door elke grote anti-botdienst. Een enkel verzoek via een gratis proxy leidt tot een CAPTCHA of een 403-reactie.

Praktische workflow: rate limiting, IP-cooldowns en foutafhandeling

Je scraper moet per proxy-IP een toestandsmachine implementeren. Na een succesvol verzoek gaat de proxy een cooldown-periode in — 30 seconden voor hotelsites, 60 seconden voor SaaS-beheerpanelen. Na een fout (HTTP 403, 429 of CAPTCHA-pagina) wordt de cooldown verlengd tot 5 minuten en wordt de proxy gemarkeerd voor herevaluatie. Gebruik een token-bucket-rate-limiter die een globale limiet van bijvoorbeeld 2 verzoeken per seconde over alle proxy's afdwingt. Het volgende Python-fragment (met asyncio en aiohttp) toont de kernlus:

import asyncio, aiohttp, random

PROXY_POOL = [{"url": "http://user:pass@fr1:3128", "cooldown_until": 0}]

async def fetch_price(session, proxy, url):
    now = asyncio.get_event_loop().time()
    if now < proxy["cooldown_until"]:
        await asyncio.sleep(proxy["cooldown_until"] - now)
    try:
        async with session.get(url, proxy=proxy["url"],
                               headers={"Accept-Language": "fr-FR"}) as resp:
            if resp.status == 200:
                proxy["cooldown_until"] = now + 30
                return await resp.text()
            else:
                proxy["cooldown_until"] = now + 300
                return None
    except Exception:
        proxy["cooldown_until"] = now + 300
        return None

Voeg exponentiële backoff toe bij opeenvolgende fouten van dezelfde proxy — na drie fouten wordt dat IP 24 uur buiten gebruik gesteld. Monitor de verhouding tussen succesvolle reacties en totale pogingen; als deze voor een regio onder de 20% zakt, roteer dan de gehele proxypool voor dat land. Log ten slotte elke response-header, met name Set-Cookie en X-Frame-Options, omdat deze onthullen of de site een botdetectiescript uitvoert dat JavaScript-uitvoering vereist. Voor sites die afhankelijk zijn van client-side rendering, moet je overschakelen naar een headless browser zoals Playwright of Puppeteer, wat een extra orde van grootte aan latentie en proxy-kosten toevoegt. Prijsmonitoring over regio's heen is geen weekendproject — het is een doorlopende engineeringinvestering die constante afstemming vereist op een bewegend doelwit.