← Blog

Integrations

Cloudflare WAF en Mews: negen regels die boekingen killen

Je boekingstempo liep lekker. Toen at Cloudflare vier van de vijf chats op. Een veldgids voor de negen WAF-regels die zwijgen op precies het verkeerde moment.

Jacob Molkenboer· Oprichter · A Brand New Company· 10 jun 2026· 9 min
Messing sleutelplaat en klein ijzeren hangslot op crème indexkaart, groen zijden lint door het slot, ivoorkleurig papier.

Vrijdag, 23:14. De dienstdoende revenue manager van een boutique van 47 kamers in Utrecht kijkt op het dashboard. Vorig weekend om twaalf uur 's middags liep het boekingstempo nog. Sinds 17:00 is het vlak, en de chat-widget op de propertysite staat al sinds de happy hour te draaien. Booking.com heeft om 16:30 een kortingsmail eruit geknald. Driehonderd gasten openden 'm. Ongeveer veertig probeerden de chat. Zestien kwamen tot een datumkiezer. Drie kregen antwoord van de agent.

De andere zevenendertig liepen tegen een Cloudflare-regel aan. Niemand zag een nette foutmelding. De widget bleef gewoon hangen.

Dit is de veldgids die we hadden willen hebben toen we in 2023 onze eerste hotel-agent op Mews bouwden. Negen WAF-regels die je moet controleren vóór je volgende OTA-piek, op volgorde van hoe lang het duurt voor de revenue manager doorheeft dat er omzet weglekt. De eerste op de lijst slaan geen alarm tot het pace-rapport van maandag. De laatste leveren binnen een uur een boze tweet van een gast op.

De vijf surfaces die niemand op het architectuurschema tekent

Een hotel chat-agent op Mews en Booking.com raakt meer netwerk-surfaces dan het architectuurschema meestal laat zien. Je hebt de widget voor de gast, uiteraard. Daarnaast is er de Mews Connector API waar je agent state van de property mee uitleest. Er zijn Mews-webhooks die reserveringswijzigingen je stack in duwen. Er is de Booking.com Messaging API die OTA-gastenchats levert. En er is de uitgaande call van je agent naar zijn LLM-provider.

De meeste teams zetten Cloudflare voor de widget en denken dat ze klaar zijn. De andere vier surfaces gedragen zich totaal niet als browsers. Ze draaien geen JavaScript. Ze blijven niet eeuwig retryen. Ze falen op manieren die in het Cloudflare event log "challenge served" heten in plaats van "request blocked". Tegen maandagochtend is de helft van de fouten al uit het 24-uurs logvenster van het gratis plan gerold.

De negen regels, op volgorde van hoe stil ze toeslaan

De volgorde doet ertoe. Regel één merkt je revenue manager pas omdat het maandag-pace om onverklaarbare redenen tegenvalt. Regel negen levert tegen zaterdagbrunch al een klacht op in je inbox.

1. AI Crawlers managed ruleset blokkeert je eigen uitgaande calls

Cloudflare heeft een AI bots managed rule uitgerold die verkeer blokkeert dat zich identificeert als ChatGPT-User, Claude-Web, GPT-Bot en consorten. Draait je chat-agent op een Worker en roep je met de default User-Agent van de SDK een LLM aan, dan kan de regel je eigen uitgaande verkeer raken. De agent loopt op een timeout. De gebruiker ziet "Sorry, er ging iets mis". Je vindt dit nooit terug in het WAF-log van je eigen zone, want de block gebeurt aan de upstream-kant, niet bij inkomend verkeer op je domein.

2. User-Agent-block op de Mews Connector API

Mews roept je webhook-receiver aan met een User-Agent zoals Mews/2024.10. Verschillende managed rulesets markeren korte of versie-only UA's als verdacht. Je endpoint geeft 403 terug. Mews probeert het drie keer opnieuw en laat het event dan vallen. Maandagochtend opent de receptie het arrivals-tabblad en ziet twaalf gasten waarvan niemand wist dat ze kwamen. Er is geen widget-foutje om over te klagen. Er is geen Slack-alert. In het PMS zitten gewoon gaten.

3. SQL-injectieregel op gastnamen met een apostrof

Een gast met de naam Marie O'Brien typt "Hé, kan ik inchecken om 23:00?" in de widget. De apostrof in haar naam (meegestuurd in de session metadata) matcht OWASP-regel 942100. Cloudflare geeft 403. Je agent ziet het bericht nooit. De widget blijft eeuwig draaien. Marie boekt alsnog via Booking.com. Je betaalt 17 procent commissie voor een gast die direct probeerde te boeken.

4. JS Challenge op het webhook-pad

Een algemene regel "challenge alles wat op /api/* geautomatiseerd lijkt" eet je Mews webhook-receiver op. Mews stuurt een POST met een JSON body. Cloudflare stuurt een HTML-pagina terug die om JavaScript-evaluatie vraagt. De HTTP-client van Mews kan geen JavaScript evalueren. De signature-check aan jouw kant draait niet eens, want de body is nu HTML. Na drie mislukkingen zet Mews het endpoint op een backoff. Je krijgt geen reserveringsupdates meer tot je opnieuw deployt.

5. Bot Fight Mode vangt Booking.com-webhooks op

Bot Fight Mode is die ene knop in het gratis dashboard. Hij blokkeert alles zonder browser-fingerprint. De webhook-calls van Booking.com hebben geen browser-fingerprint. De block is snel en stil: een 403 zonder body. Je messaging-integratie valt uit tijdens de drukste twee uur van de nacht, en herstelt pas als de retry-queue van de OTA leeg is.

6. OWASP CRS 949110, de inkomende anomaly-threshold

De Cloudflare OWASP Core Ruleset kent aan elke match een score toe en blokkeert op een drempel. Een gast plakt een lange vraag met een URL, een datumrange en een prijsvergelijking. De cumulatieve score gaat over 949110 heen en het request krijgt een 403. De agent krijgt niks. De gast denkt dat de bot stuk is en boekt via de OTA. Deze regel raakt onevenredig vaak echte boekingsintentie, omdat dat soort berichten langer is en cijfers bevat.

7. Landenblock raakt je nachtdienst en gasten met een VPN

Vorig voorjaar heb je een land geblokkeerd na een brute-force poging. De Filipijnse nachtauditor die vanuit haar appartement in Cebu werkt, krijgt het back-office-dashboard niet open. De Duitse gast die een Amerikaanse VPN gebruikt om het nieuws te lezen, krijgt de chat-widget niet open. Hier kom je pas achter als personeel klaagt, en op een rustige vrijdagavond kan dat zes uur duren.

8. Managed Challenge op /api/*-paden

De Managed Challenge-mode van Cloudflare vangt alles op dat niet op een echte browser lijkt. De Mews mobiele staff-app gebruikt in sommige builds een WebView met een afwijkende UA. Housekeeping kan kamers niet schoon-melden. Receptie kan reserveringen niet bewerken. De widget op de publieke site werkt nog wel, dus niemand escaleert tot housekeeping iets door de portofoon roept.

9. Rate limiting op POST naar het chat-endpoint

De luidruchtigste. Standaard rate-limit-regels ("10 requests per 10 seconden per IP") gaan slecht samen met bedrijfsnetwerken waar 30 gasten achter één NAT zitten. Zodra de Booking.com-mail binnenkomt en verkeer vanaf het HQ-netwerk van een hotelketen omhoogschiet, komt de eerste gast erdoor. De volgende twintig krijgen een 429. De widget toont "Probeer het later opnieuw". Dit is de regel waar de revenue manager over hoort, want gasten klagen op social media.

Let op

Cloudflare bewaart op het gratis plan WAF-events 24 uur. Draait je pace-rapport op maandag en was de piek vrijdag, dan is het bewijs al weg. Stuur events naar je eigen logstore voordat je gaat graven.

De audit van twintig minuten die je vóór de checkout kunt draaien

Je hoeft niet weg van Cloudflare om dit te fixen. Je moet weten welke regels op welke paden afgaan.

Stuur eerst een webhook-achtig request naar je eigen endpoint, vanaf buiten je kantoornetwerk:

curl -X POST https://yourdomain.com/webhooks/mews \
  -H "Content-Type: application/json" \
  -H "User-Agent: Mews/2024.10" \
  -d '{"event":"reservation.modified","reservationId":"test-001"}' \
  -w "\nHTTP %{http_code} in %{time_total}s\n"

Een 200 betekent dat het pad vrij is. Een 403 of 503 betekent dat er een regel in de weg zit. Een HTML-body betekent een challenge.

Filter daarna in het Cloudflare-dashboard de Security Events op de hostname waar je webhook op draait, met action "block" of "challenge", over de afgelopen 24 uur. Sorteer op rule. De top drie regels zijn je top drie verdachten.

Schrijf als derde een configuratieregel (onder Security in het nieuwe dashboard) die Bot Fight, Browser Integrity Check en Managed Challenges uitschakelt op precies die paden die je server-to-server-verkeer gebruikt: /webhooks/*, /api/internal/* en alle callback-paden die je OTA-integraties nodig hebben. Whitelist de IP-ranges van Mews en Booking.com als je ze kunt krijgen. Sign elke webhook, zodat het uitschakelen van de challenge je werkelijke veiligheidsvloer niet verlaagt.

Wat we hotelklanten als volgende stap aanraden

De reflex na zo'n lijst is alles uitzetten. Niet doen. De WAF doet nuttig werk op het widget-pad. De fix is pad-specifieke configuratie, geen securityterugtocht.

Toen we de chat-agent bouwden voor een Nederlandse hotelgroep met zeven properties op Mews, was de regel die ons het hardst raakte nummer twee in deze lijst. De User-Agent van Mews leek genoeg op een scanner dat de default managed ruleset tien dagen lang elke webhook met 403 afkeurde voor we het doorhadden. Uiteindelijk hebben we al het server-to-server-verkeer via een apart subdomein gerouteerd met een eigen (veel kleinere) ruleset, en een eigen request-logger vóór de WAF gezet zodat we blocks zagen zonder afhankelijk te zijn van Cloudflare's log-retentie. Bouw of beheer je AI-agents bovenop een PMS, audit dan eerst de integratiepaden. De boeking gaat zelden verloren bij de widget die de gast ziet.

Open nu het Security Events-tabblad van Cloudflare. Filter op webhook-hostname, laatste 24 uur, action is block. Staat er ook maar één regel, dan heb je je weekendlectuur te pakken.

Kern

De Cloudflare-regel die je boekingen kost zit zelden op het widget-pad. Hij zit op de webhook die je PMS gebruikt om te melden dat de reservering is veranderd.

FAQ

Loop ik risico op aanvallen als ik Cloudflare Bot Fight Mode uitschakel?

Niet als je hem alleen uitschakelt op de specifieke server-to-server-paden die je PMS en OTA gebruiken, en hem actief houdt op de widget voor gasten. Pad-gescopete regels zijn het antwoord.

Hoe krijg ik IP-ranges van Mews en Booking.com om te whitelisten?

Mews deelt op verzoek outbound IP-ranges met enterprise-klanten. Booking.com-partners kunnen het bij hun accountmanager opvragen. Heb je geen ranges, vergrendel dan op User-Agent plus een signed payload.

Blokkeert de AI Crawlers-ruleset Claude- of ChatGPT-API-calls?

Hij kan uitgaand verkeer vanuit Workers matchen als de SDK een default User-Agent stuurt die op een bekende crawler lijkt. Zet een expliciete, beschrijvende UA op je LLM-client en het komt meestal door.

Waar zie ik Cloudflare WAF-events ouder dan 24 uur?

Daar heb je een betaald plan voor nodig (Pro en hoger verlengen de retentie), of je stuurt events via Cloudflare Logpush door naar je eigen logstore. Regel dit voor je het nodig hebt, niet erna.

integrationsai agentschat agentssecurityoperationsarchitecture

Iets bouwen?

Start een project