Naar inhoud

Lead scraping: spamfilters en de AVG overleven in de EU

De meeste koude outreach-lijsten zijn illegaal, onbestelbaar, of allebei. Dit is het draaiboek dat wij hanteren om mail te scrapen, verrijken en versturen die landt en compliant blijft.

Jacob Molkenboer
Jacob Molkenboer
Oprichter · A Brand New Company
Gepubliceerd
29 mei 2026
Leestijd
9 min leestijd
Categorie
Data scraping
Koperen kaartenbak op een kier met cremekleurige kaarten, groen tabje, gevouwen grootboekpapier en rode lak op ivoor.

Het is elf uur op een dinsdagavond en je sales lead heeft net een spreadsheet in Slack gedropt. Tweeduizendveertig rijen. Beslissers bij Nederlandse afbouwbedrijven met vijftig tot driehonderd man. Het plan: morgenochtend om negen uur in een sequencer pompen en de reacties laten binnenrollen.

Dit loopt op twee manieren af. Of Google begraaft donderdag stilletjes je sending reputation, of een klacht bij de Autoriteit Persoonsgegevens levert het bedrijf acht maanden later een beleefde maar dure brief op. Vaak allebei. We hebben er genoeg opgeruimd om op te schrijven wat echt werkt.

Het juridische kader in gewone taal

Het nuttigste dat je moet weten over koude B2B-outreach in de EU: het is niet standaard illegaal. De kwaadwillende variant (LinkedIn scrapen op schaal, lijstjes kopen via een Telegram-kanaal, mailen naar persoonlijke Gmail-adressen uit een gelekte database) geeft de hele categorie een slechte naam. Echte koude outreach naar een specifieke zakelijke contactpersoon, voor een relevant doel, kan legaal zijn onder artikel 6 lid 1 sub f van de AVG, de 'gerechtvaardigd belang'-grondslag.

De catch: gerechtvaardigd belang is geen vrijbrief. Het is een afwegingstoets. Je hebt een duidelijk doel nodig, een redelijke verwachting bij de ontvanger, en een gedocumenteerde beoordeling dat hun rechten niet boven die van jou gaan. De richtsnoeren van de Autoriteit Persoonsgegevens over direct marketing zijn de helderste samenvatting die we in welk EU-land dan ook hebben gevonden. Lees ze één keer per jaar door en bewaar een Legitimate Interest Assessment van één pagina per campagne in je repo, naast de campagne-config.

Boven op de AVG liggen twee lagen. De ePrivacy-richtlijn (artikel 13) en artikel 11.7 van de Nederlandse Telecommunicatiewet regelen ongevraagde elektronische communicatie specifiek. Voor B2B-mail naar een zakelijk adres (info@, sales@, of een duidelijk zakelijk mailbox zoals naam@bedrijfsdomein.nl) geldt in Nederland opt-out: je mag versturen, maar je moet een frictieloze afmelding aanbieden en die permanent honoreren. Voor persoonlijke adressen (Gmail, Hotmail, Outlook) geldt harde opt-in. Geen uitzonderingen, geen slimme omwegen.

Openbaar is niet hetzelfde als vrij

'Het staat op hun website' is geen juridische grondslag. De uitspraak van het Europese Hof in Ryanair v PR Aviation (C-30/14) maakte duidelijk dat de gebruiksvoorwaarden van een website een scraper kunnen binden, ook als het databankenrecht niet van toepassing is. De meeste sites die je wilt scrapen hebben voorwaarden die geautomatiseerd verzamelen verbieden. Dat maakt je scraper niet automatisch strafbaar, maar het verandert wel het gesprek als er iets misgaat.

Het praktische filter dat wij hanteren: openbare registers (KVK in Nederland, Companies House in het VK, het Belgische KBO/BCE) zijn er om bevraagd te worden. Brancheverenigingen met een door robots.txt toegestane lijstpagina zijn voor kleinschalig gebruik meestal prima. Persoonlijke socialmediaprofielen en afgeschermde B2B-platformen niet. Als een site eist dat je ingelogd bent om de data te zien, scrape je geen openbare data meer. Dan omzeil je toegangsbeveiliging, en gaat het gesprek van de AVG naar artikel 138ab van het Wetboek van Strafrecht. Daar stop je.

Een scraping-budget dat je kunt verdedigen

De meeste scrapers worden geblokkeerd omdat ze er als scraper uitzien. Eén request per 200 milliseconden, de standaard user agent van python-requests, robots.txt negeren, en hetzelfde URL-patroon in een platte volgorde ophalen. Zelfs een gemiddelde WAF pakt dit binnen de eerste honderd requests.

Het frame dat we nieuwe operators meegeven heet een 'scraping budget'. Je bepaalt vooraf de maximale uurlijkse footprint die je jezelf toestaat op één domein. Voor het meeste leadwerk is vijftien pagina's per uur per domein meer dan genoeg, en lijkt het op een nieuwsgierige onderzoeker in plaats van een bot. Iets agressievers vraagt om een schriftelijke onderbouwing, een contact-e-mail in de user agent, en idealiter een out-of-band bericht aan de site-eigenaar waarin je uitlegt wat je doet.

import asyncio, random, urllib.robotparser
from playwright.async_api import async_playwright

UA = "ABN-Research/1.0 (+https://abn.company/contact; research@abn.company)"
BASE = "https://www.example.nl"

def allowed(url: str) -> bool:
    rp = urllib.robotparser.RobotFileParser()
    rp.set_url(f"{BASE}/robots.txt")
    rp.read()
    return rp.can_fetch(UA, url)

async def polite_fetch(page, url: str):
    if not allowed(url):
        return None
    # 200-400 seconds per request, jittered, ~15 fetches/hour
    await asyncio.sleep(random.uniform(200, 400))
    resp = await page.goto(url, wait_until="domcontentloaded")
    return await page.content() if resp and resp.ok else None

async def crawl(urls: list[str]):
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        ctx = await browser.new_context(user_agent=UA)
        page = await ctx.new_page()
        for url in urls:
            html = await polite_fetch(page, url)
            if html:
                yield url, html
        await browser.close()

Drie details doen er meer toe dan ze lijken. De user agent identificeert je en geeft een echt contactadres dat een nieuwsgierige sysadmin daadwerkelijk kan bereiken. De robots.txt-check is niet optioneel, het is je schriftelijke bewijs van goede trouw als iemand later vragen stelt. De sleep is lang. Vijftien pagina's per uur voelt op dag één pijnlijk en op dag dertig vanzelfsprekend.

Verrijk vanuit openbare registers, niet vanuit mensen

De best te verdedigen verrijkingsbron voor Nederlandse leads is de KVK Open Data API. Elk Nederlands bedrijf heeft een openbaar KVK-nummer, een geregistreerd adres, een SBI-sectorcode, en (voor veel inschrijvingen) de namen van bestuurders en een geregistreerd contactadres. Je kunt een website matchen aan een KVK-record, de officiële contactgegevens ophalen, en het scrapen van persoonlijke profielen volledig overslaan. Hetzelfde geldt voor Companies House in het VK en de BCE/KBO in België. Geen van deze hoef je te scrapen. Ze hebben endpoints die juist bedoeld zijn om bevraagd te worden.

Een werkend patroon: scrape de lijstpagina één keer voor bedrijfsnaam en URL. Koppel het bedrijf aan een registratie-ID. Verrijk al het andere via de API. Je houdt één scrape-touch per bedrijf over, een compleet audit-spoor van waar elk veld vandaan komt, en een lijst records die teruggrijpen op een openbaar document dat een toezichthouder ook zelf kan opvragen.

De deliverability-laag die de meeste teams overslaan

Sinds februari 2024 hebben de bulk sender-regels van Google en Yahoo de juridische laag bijna losgekoppeld van de technische. Als jouw domein SPF, DKIM en DMARC-alignment niet passeert, en je verstuurt meer dan 5.000 berichten per dag naar Gmail-ontvangers, beland je stilletjes onder 'promoties' in het beste geval en 'spam' in het slechtste. De bulk sender-eisen van Google zijn nu de bodem, niet het plafond.

Wat we minimaal opzetten voordat er een lijst de deur uitgaat:

  • Een apart sending-subdomein (mail.bedrijfsdomein.nl), nooit het rootdomein.
  • Een SPF-record met alleen de IP's die je echt gebruikt.
  • DKIM met een 2048-bits sleutel, jaarlijks geroteerd.
  • Een DMARC-policy van minimaal p=quarantine, met rua-rapporten naar een echte mailbox die iemand wekelijks leest.
  • Een one-click List-Unsubscribe header volgens RFC 8058, niet alleen een link in de footer.

De List-Unsubscribe header is wat de meeste teams vergeten. Zonder die header wordt de 'meld als spam'-knop het enige feedbacksignaal dat Gmail krijgt, en dat signaal is dodelijk. Wij draaien de suppressielijst en de verzendwachtrij als een durable workflow op Postgres, zodat een afmelding in seconden doorwerkt en niet pas bij de volgende dagelijkse sync.

Warmup en batchgroottes die kloppen met de realiteit

Een vers subdomein kan op dag één geen tweeduizend berichten versturen. Het kan er ook geen tweehonderd versturen. De warmup-curve die wij hanteren, gebaseerd op wat de reputatie-grader van Gmail overleeft zonder hem te triggeren, ziet er ongeveer zo uit: week één, twintig berichten per dag naar uitsluitend betrokken ontvangers. Week twee, vijftig per dag. Week drie, honderdvijftig. Week vier, driehonderd. Daar twee weken vasthouden, daarna opvoeren met vijftig per week.

'Uitsluitend betrokken ontvangers' tijdens warmup betekent seed-accounts die je zelf beheert plus een kleine groep bestaande klanten die hebben aangegeven incidenteel productupdates te willen ontvangen. Koude leads erbij stoppen in de eerste tien dagen is de snelste manier om je domein te verbranden. Twee weken geduld hier bespaart een maand opruimen later.

Onthoud dit

Een lijst van tweeduizend koude contacten is een verzendplan van zes weken, geen blast op dinsdagochtend. Wie je iets anders wil verkopen, verkoopt je het volgende domein.

Drie regels waar het bericht zelf zich aan moet houden

Geen van deze regels gaat over slimme copy. Onder artikel 14 van de AVG moet je de ontvanger vertellen hoe je aan zijn gegevens komt en wat je ermee van plan bent. Twee duidelijke zinnen in de footer volstaan, maar ze moeten er staan. Bied een werkende afmelding die direct verwerkt wordt, niet 'binnen dertig dagen'. En houd één suppressielijst aan over alle campagnes heen, niet per campagne. Iemand die heeft afgemeld opnieuw mailen is de meest voorkomende reden dat een klacht bij de AP uitmondt in een werkelijke boete.

Personalisatie doet ertoe voor je responsratio, maar nog meer voor je juridische positie. Een bericht dat verwijst naar de rol van de ontvanger bij zijn daadwerkelijke bedrijf, met één zin over waarom je juist hém aanschrijft, ziet er voor zowel een mens als voor een spamclassifier uit als doordachte outreach. Een mailmerge naar 'Hi {first_name}, ik zag dat jouw bedrijf...' ziet eruit als precies wat het is.

Reageren op herkomstvragen in één alinea

Het gaat gebeuren, ongeveer drie keer per duizend verzonden berichten. Iemand reageert en vraagt, beleefd of niet, waar je zijn adres vandaan hebt. Het antwoord dat je in het eerste uur geeft, is het verschil tussen een afgesloten kwestie en een formeel artikel 15-verzoek dat je een dag juridische tijd kost. Schrijf het antwoord vooraf uit:

'We vonden je contactgegevens op de openbare website van je bedrijf op 14 maart 2026. We hebben één outreach gestuurd over [onderwerp] omdat [reden in één zin]. We hebben je adres uit al onze lijsten verwijderd. Wil je zien wat we nog vasthouden of het laten verwijderen, reageer op dit adres en we handelen het binnen 72 uur af.'

Bewaar die template in je gedeelde docs en link naar je retentiebeleid. De kosten van het één keer schrijven zijn vijftien minuten. De kosten van het niet hebben zijn een halve dag paniek per verzoek, plus de ongemakkelijke mail aan juridisch die niemand graag verstuurt.

De vijf-minuten-audit die je vandaag kunt doen

Open je laatste koude campagne en controleer drie dingen. Eén: laat je verzendende domein door MXToolbox lopen en bevestig dat SPF, DKIM en DMARC alle drie alignment halen. Twee: open de raw source van één verzonden bericht en zoek op 'List-Unsubscribe-Post'. Mist de header, los het deze week op, niet volgend kwartaal. Drie: pak één willekeurige ontvanger en probeer alleen op basis van je eigen administratie te reconstrueren waar zijn adres vandaan kwam, op welke datum, en waarom je vond dat hij een redelijk doelwit was. Lukt dat niet, dan heb je geen verdedigbare lijst. Dan heb je een aansprakelijkheid die toevallig wat reacties oplevert.

Toen we vorig kwartaal de leadpipeline bouwden voor een Rotterdams uitzendbureau, was die derde check degene die het langst duurde om op te lossen. Het deliverability-werk was rechttoe rechtaan. Het lastige stuk was het reconstrueren van het herkomstspoor voor dertigduizend bestaande contacten, het soort opruimwerk dat wij doen onder onze procesautomatisering. Beter om met het spoor op orde te beginnen dan het onder tijdsdruk te reconstrueren.

Veel gestelde vragen

Is koude B2B-mail legaal in Nederland?+
Ja, naar zakelijke adressen op basis van gerechtvaardigd belang onder de AVG, met een werkende opt-out en duidelijke herkomst. Naar persoonlijke adressen zoals Gmail of Hotmail geldt strikte opt-in, zonder uitzonderingen.
Mag ik LinkedIn scrapen voor B2B-leads?+
Nee. LinkedIn zit achter een loginmuur, waardoor de vraag verschuift van AVG-toestemming naar het omzeilen van toegangsbeveiliging onder Europese en Nederlandse computercriminaliteitswetgeving. Gebruik openbare registers.
Welk warmup-schema moet ik aanhouden voor een nieuw verzenddomein?+
Begin met twintig e-mails per dag naar uitsluitend betrokken ontvangers. Verdubbel ongeveer wekelijks tot je op driehonderd per dag zit, voer daarna op met vijftig per week. Koude leads komen pas na week twee in beeld.
Wat is de minimale DMARC-policy voor koude outreach?+
p=quarantine op een apart verzendsubdomein, met SPF, DKIM van 2048 bits, en een one-click List-Unsubscribe header volgens RFC 8058. Alles wat zwakker is triggert de bulk-senderfilters van Gmail.
Hoe bewijs ik gerechtvaardigd belang als een toezichthouder ernaar vraagt?+
Houd per campagne een Legitimate Interest Assessment van één pagina bij, met doel, afweging tegen de rechten van ontvangers, en dataminimalisatie. Bewaar 'm naast je campagne-config, niet op een persoonlijke schijf.

Iets vergelijkbaars bouwen?

Stuur ons één alinea met het proces dat je het meeste tijd kost. Wij reageren met een eerlijk plan — binnen 4u op werkdagen.