Brevo data-export en migratie: hoe je je gegevens erin of eruit krijgt
Exporteer contacten, statistieken en logs uit Brevo, ontdek precies wat niet meeverhuist, en volg een stap-voor-stap checklist voor migratie in beide richtingen.
Het zoekvolume op zinnen als “brevo data export migration to another platform” komt voort uit één zorg: dat de gegevens die je hebt opgebouwd er makkelijker in gaan dan eruit. Het eerlijke antwoord voor Brevo is dat het meeste er netjes uit komt, een deel eruit komt in een vorm die je opnieuw moet opbouwen, en een klein maar belangrijk deel helemaal niet mee kan.
Deze gids behandelt beide richtingen. Hij somt precies op wat wel exporteert, wat niet, welke API-aanroepen je nodig hebt voor accounts die te groot zijn voor de interface, en biedt een migratiechecklist die onderdrukkingslijsten en verzendreputatie als hoofdzaak behandelt in plaats van als bijzaak.
Wat je echt uit Brevo kunt exporteren
| Gegevens | Hoe het eruit komt | Formaat |
|---|---|---|
| Contacten en attributen | Export op de pagina Contacts, of POST /v3/contacts/export | CSV |
| Lijstlidmaatschap | Export per lijst, of het metadataveld _listIds | CSV |
| Abonnementsstatus | exportSubscriptionStatus op de exportjob | CSV |
| Campagnestatistieken | Export van het campagnerapport, of GET /v3/emailCampaigns | CSV, PDF, JSON |
| Transactionele gebeurtenislogs | GET /v3/smtp/statistics/events of een bulkexportjob | JSON, CSV |
| Templates | GET /v3/smtp/templates geeft htmlContent terug | JSON |
| Bedrijven en deals | Export vanaf de betreffende CRM-pagina | CSV |
Contacten en attributen
Het pad in de interface is CRM en dan Contacts. Wil je de hele database exporteren, zorg dan dat er geen lijst of segment geladen is en dat er geen filters actief zijn. Wil je één lijst of segment exporteren, klik dan eerst op “Load a list or segment” en kies hem.
Vervolgens selecteer je welke standaard- en eigen attributen je meeneemt. EMAIL, de datum van laatste wijziging en de aanmaakdatum staan standaard aangevinkt, de rest voeg je zelf toe, en dat is de stap die mensen het vaakst verkeerd doen. Kies je CSV-scheidingsteken, puntkomma of komma, en zet eventueel “Send export by email” aan zodat er een downloadlink naar het adres van de accounteigenaar gaat. Klik op “Start export” en download het bestand daarna via het meldingenklokje naast je accountnaam.
Lijsten en segmenten
Lijsten exporteren als lidmaatschap: draai één export per lijst, of neem de metadata _listIds op in één volledige export en splits het bestand achteraf. GET /v3/contacts/lists geeft je de lijstnamen, id’s en map-id’s zodat je de structuur aan de andere kant kunt nabouwen.
Segmenten liggen anders, en dat is het eerste echte gat. GET /v3/contacts/segments geeft alleen id, segmentName, categoryName en updatedAt terug. De filtervoorwaarden die een segment definiëren worden niet blootgesteld. Je kunt de leden van een segment op een bepaald moment exporteren, maar de regel die ze opleverde moet je van het scherm aflezen en met de hand nabouwen in de nieuwe tool. Maak van elk segment een schermafbeelding voordat je het account opzegt.
Campagnestatistieken
Vanuit een campagnerapport kun je de gegevens als CSV exporteren, en e-mail- en SMS-rapporten bieden daarnaast een PDF-versie om te delen of af te drukken. Voor een volledige historische ophaalactie accepteert GET /v3/emailCampaigns een parameter statistics met de waarden globalStats, linksStats of statsByDomain, plus een startDate en endDate die samen een periode van maximaal twee jaar dekken.
Transactionele logs
Twee paden, met verschillende vensters.
GET /v3/smtp/statistics/events geeft losse gebeurtenissen terug, gefilterd op type (delivered, opened, clicks, hardBounces, spam, unsubscribed en andere). De periode mag niet langer zijn dan 90 dagen, en valt standaard terug op de afgelopen 30 dagen als je noch een periode noch de parameter days meegeeft.
Voor bulk maakt POST /v3/webhooks/export een exportjob over de afgelopen 7 dagen aan ruwe gebeurtenissen, begrensd op 20 exportjobs per periode van 7 dagen. Hij geeft een processId terug, roept je notify-URL aan zodra hij klaar is en levert CSV met kolommen als date, email, event, message-id, reason, sending_ip, subject, tag en template_id. Grote volumes komen binnen als een gecomprimeerd archief met meerdere CSV-bestanden.
Het praktische gevolg: wil je meer dan 90 dagen transactionele geschiedenis, dan had je die al die tijd al volgens een schema moeten exporteren. Zet die job nu op, niet in de week dat je besluit te vertrekken.
Wat niet met je meegaat
Dit is het deel dat de meeste migratiegidsen overslaan.
- De structuur van automatiseringen. De API kan automatiseringen via gebeurtenissen aanzetten, maar er is geen gedocumenteerd endpoint dat de vertakkingen, wachttijden en voorwaarden van een workflow teruggeeft. Elke workflow bouw je handmatig opnieuw op in het nieuwe platform.
- Filterdefinities van segmenten. Zoals hierboven: alleen de namen en de huidige leden zijn op te halen.
- Volledige engagementgeschiedenis per contact. Je kunt de openers, klikkers, niet-openers, afmelders, hard bounces of soft bounces van een specifieke campagne exporteren met
customContactFilterop het exportendpoint. Wat je niet kunt ophalen is één net bestand met “elke opening en klik die dit contact ooit heeft gedaan”, omdat de ruwe gebeurtenisendpoints begrensd zijn tot 90 dagen. - Getrouwe rendering van templates.
htmlContentexporteert netjes, maar drag-and-dropblokken, de syntaxis van merge tags en de plaatshouders voor afmeldlinks zijn platformspecifiek. De HTML die je exporteert is een startpunt, geen afgemaakte template. Reserveer tijd om elke template opnieuw te testen in de nieuwe editor. - Bezorgbaarheidsreputatie. Afzenderreputatie zit op de verzendende IP-adressen en het geauthenticeerde domein. Nieuw platform, nieuwe IP-pool, nieuwe opwarmperiode. Hetzelfde domein en dezelfde DKIM-configuratie behouden houdt de domeinkant van de reputatie in stand, wat echt helpt, maar de IP-kant gaat niet mee.
- Id’s van formulieren, landingspagina’s en tracking. Aanmeldingsformulieren, landingspagina’s en het trackingscript hebben allemaal platformspecifieke id’s. Alles wat op je website is ingebed moet worden vervangen, en elke analyse die aan die id’s hangt breekt bij de overstap.
Gescripte export voor grote accounts
Boven ongeveer 100.000 contacten wordt de export via de interface traag en onhandig, en wil je sowieso een herhaalbare job. Het exportendpoint voor contacten is asynchroon: het accepteert een filter, geeft een process-id terug en levert je een CSV zodra het klaar is.
curl --request POST \ --url https://api.brevo.com/v3/contacts/export \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --header 'api-key: YOUR_API_KEY' \ --data '{ "customContactFilter": { "actionForContacts": "allContacts" }, "exportMandatoryAttributes": true, "exportAttributes": ["FIRSTNAME", "LASTNAME", "SMS", "COUNTRY"], "exportMetadata": ["_listIds", "ADDED_TIME", "MODIFIED_TIME"], "exportSubscriptionStatus": ["email_marketing", "sms_marketing"], "exportDateInUTC": true, "notifyUrl": "https://example.com/hooks/brevo-export" }'Een geslaagde aanroep geeft HTTP 202 terug met een body die een processId bevat. exportMandatoryAttributes staat standaard op true en dekt EMAIL, ADDED_TIME en MODIFIED_TIME, dus in exportAttributes noem je je eigen velden. Met exportSubscriptionStatus zet je de marketingtoestemming voor e-mail en SMS in het bestand, en het weglaten daarvan is verreweg de meest voorkomende manier waarop mensen een export produceren die onbruikbaar is voor een compliant migratie.
Blader je liever door records dan te wachten op een job, dan accepteert GET /v3/contacts een limit tot 1000 met een offset, plus modifiedSince en createdSince voor incrementele ophaalacties. Elk contact komt terug met emailBlacklisted, smsBlacklisted, listIds, listUnsubscribed en consentGroups, en dat is alles wat je nodig hebt om de toestemmingsstatus te reconstrueren.
Let op de rate limits terwijl je dit scriptt. Contactendpoints staan 36.000 verzoeken per uur en 10 per seconde toe op standaardabonnementen, verdubbeld op Professional en Enterprise, terwijl de meeste andere endpoints op 100 verzoeken per uur zitten. Een miljoen contacten doorbladeren met 1000 per pagina is 1000 verzoeken, ruim binnen het contactbudget, maar campagne- of template-endpoints in een lus afhameren is dat niet.
Waarom je onderdrukkingslijst als eerste mee moet
Verhuis de afmeldingen voordat je iets anders verhuist.
Het juridische argument is simpel. Een contact dat zich afmeldde trok zijn toestemming in bij jouw merk. Die intrekking wordt niet teruggezet omdat je van leverancier wisselt. Onder de AVG is het vastleggen van toestemming en intrekking jouw verplichting als verwerkingsverantwoordelijke, en onder CAN-SPAM moet een afmelding binnen tien werkdagen worden gehonoreerd en blijft die onbeperkt gelden. De lijst kwijtraken in een migratie is geen technisch ongelukje, het is een nalevingsfout met een papieren spoor dat naar jou wijst.
Het bezorgbaarheidsargument is in de praktijk nog erger. Onderdrukte adressen zijn onevenredig vaak mensen die klaagden, hard bouncten of er actief vanaf wilden. Die mailen vanaf een gloednieuw IP-adres zonder reputatie is de snelst bekende manier om een verse verzendopzet in de eerste week geknepen of geblokkeerd te krijgen. Een paar duizend hergebruikte spamvallen en klagers maken een maand zorgvuldig opwarmen ongedaan.
Exporteer de onderdrukte groepen dus expliciet in plaats van te hopen dat ze impliciet meekomen. Op het exportendpoint accepteert actionForContacts de waarde unsubscribed voor contacten die op welke manier dan ook geblokkeerd zijn, en unsubscribedPerList voor contacten die zich voor één specifieke lijst hebben afgemeld. Doe een aparte ronde voor hardBounces per campagne. Bij binnenkomst in een nieuw platform importeer je dat bestand in de onderdrukkingslijst, niet in een mailbare lijst.
Brevo regelt ook het omgekeerde geval: het ondersteunt het importeren van een lijst met geblokkeerde contacten, en de import-API neemt de booleans emailBlacklist en smsBlacklist zodat een geïmporteerd bestand als onderdrukt binnenkomt. Let op de asymmetrie die Brevo terecht afdwingt: contacten kunnen niet in bulk van de blokkeerlijst worden gehaald, want iemand in bulk opnieuw abonneren die met rust wilde worden gelaten zou onwettig zijn. Onderdrukking is makkelijk toe te voegen en bewust moeilijk te verwijderen. Zie dat als het juiste gedrag, niet als een obstakel.
Migratiechecklist, weg uit Brevo
- Inventariseer. Tel contacten, lijsten, segmenten, actieve automatiseringen, templates en integraties. Schrijf op welke integraties naar Brevo schrijven, want dat zijn de leidingen die je opnieuw moet omleggen.
- Exporteer. Contacten met alle attributen plus abonnementsstatus, één bestand per lijst of één bestand met
_listIds, onderdrukte groepen als aparte bestanden, campagnestatistieken, transactionele gebeurtenissen zo ver terug als het venster van 90 dagen toelaat, en de HTML van templates. - Archiveer wat verloopt. Alles wat in tijd begrensd is (ruwe gebeurtenissen, logs) is weg zodra het venster doorschuift. Bewaar het nu in je eigen datawarehouse of objectopslag.
- Opschonen en toewijzen. Ontdubbel, normaliseer datum- en telefoonformaten en schrijf een expliciete toewijzing van kolom naar veld voor het nieuwe platform. Dit is ook het natuurlijke moment om adressen te schrappen die al een jaar niets doen, wat goedkoper is dan betalen om dood gewicht op te warmen. Onze gids voor het opschonen van je e-maillijst behandelt de drempelwaarden.
- Laad eerst de onderdrukking. Importeer afmeldingen en hard bounces in de onderdrukkingslijst van het nieuwe platform, controleer of de aantallen overeenkomen met je export, en laad pas daarna de mailbare contacten.
- Warm op. Begin met je meest betrokken segment, verhoog het volume geleidelijk en houd bounce- en klachtpercentages dagelijks in de gaten. Onze gids over bezorgbaarheid van e-mail beschrijft de volgorde in detail.
- Draai parallel. Houd Brevo live en laat het je kritieke transactionele post versturen terwijl het nieuwe platform een groeiend deel van de marketingverzendingen overneemt. Zet niet allebei tegelijk om.
- Verifieer. Stem contactaantallen af, controleer twintig contacten veld voor veld, bevestig met een testverzending dat onderdrukte contacten daadwerkelijk onderdrukt zijn, en vergelijk een week verzendvolume met het oude platform.
- Zet om en houd een terugweg. Wijzig DNS en integratie-endpoints in een venster waarin iemand meekijkt. Houd het Brevo-account minimaal één volledige facturatieperiode na de omzetting actief en betaald, met de geëxporteerde bestanden opgeslagen buiten beide platforms. Dat, en niet een belofte van een leverancier, is je echte terugvalplan.
Migreren naar Brevo vanaf een ander platform
Dezelfde checklist draait omgekeerd, met drie Brevo-specifieke kanttekeningen.
Zorg voor een echte export bij de huidige leverancier. De meeste platforms geven je contacten en hun eigen velden als CSV. Vraag expliciet om de onderdrukkingslijst en de bouncelijst, die vaak in een aparte export zitten die mensen vergeten aan te vragen. Kom je van een prijsmodel per contact, vergelijk dan wat je straks echt betaalt met onze Brevo prijzengids.
Wijs velden toe voordat je uploadt. Brevo-attributen hebben types (tekst, getal, datum, boolean, categorie), en een datum die in een tekstattribuut belandt is later niet filterbaar. Maak de attributen eerst aan met de juiste types en importeer daarna.
Importeer via de API voor alles van formaat. POST /v3/contacts/import accepteert inline CSV in fileBody, een JSON-array in jsonBody, beide begrensd rond 10 MB, of een extern bestand via fileUrl, plus listIds of een newList-object. updateExistingContacts staat standaard op true en matcht op e-mailadres. Draai één import met emailBlacklist op true voor je onderdrukkingsbestand en daarna een tweede import voor mailbare contacten. De volledige werkende scripts staan in onze gids over CSV-contacten importeren in Brevo met een script.
Bouw daarna opnieuw op wat niet meeverhuisde: automatiseringen, segmenten, formulieren en templates. Stuur een seed-test naar een handvol mailboxaanbieders voordat je naar iemand echt verstuurt.
Laat de volgende migratie geen ravijn zijn
De reden dat een platformmigratie als een ravijn voelt, is dat het platform het systeem van registratie is geworden. Bestelgeschiedenis, abonneestatus en campagneresultaten leven binnen één leverancier, en ze verhuizen voelt als een evacuatie.
Het alternatief is je eigen bron van waarheid aanhouden en het verzendplatform een bestemming laten zijn in plaats van een kluis. Worden je winkelgegevens, toestemmingsstatus en engagementgebeurtenissen continu naar je eigen systemen gesynchroniseerd, dan is wisselen of een kanaal toevoegen een configuratiewijziging in plaats van een project. Dat is het werk dat Tajo doet tussen Brevo en de stack van een verkoper: de gegevens beide kanten op laten stromen zodat het platform nooit de enige kopie is.
Hoe dan ook: de exportjobs die hierboven staan zijn het waard om nu al volgens een schema te draaien, of je nu van plan bent te vertrekken of niet. De goedkoopste migratie is die waarbij de gegevens al buiten het platform staan op het moment dat je besluit.