· 2 min · TextMeFlow Team

WhatsApp-berichten personaliseren per ontvanger via de API

Met de officiële WhatsApp Business API moet je berichten vooraf laten goedkeuren als "template" bij Meta, met vaste placeholders zoals {{1}} en {{2}}. Dat duurt dagen en elke wijziging in de tekst betekent opnieuw wachten op goedkeuring.

TextMeFlow werkt anders: je stuurt platte tekst naar POST /v1/messages. Er is geen template-registratie, geen goedkeuringswachttijd en geen vast placeholder-formaat. Het nadeel is dat je zelf verantwoordelijk bent voor personalisatie — het voordeel is dat je volledige vrijheid hebt over elke zin, per ontvanger, zonder op iemand te wachten. Dit artikel laat zien hoe je dat in de praktijk opbouwt.

Waarom personalisatie meer is dan een naam invullen

Identieke tekst naar tientallen contacten in één batch is precies het patroon dat de interne risk-score van TextMeFlow laat oplopen: content-uniciteit is een van de signalen die meetellen, samen met het aantal unieke ontvangers en de bounce-rate van de afgelopen 24 uur (zie /docs/anti-spam). Een herinnering die voor iedereen woordelijk hetzelfde is, oogt als een blast. Diezelfde herinnering met naam, datum en een klein detail erbij oogt als een persoonlijk bericht — en dat scheelt in de praktijk een hoop support-vragen en opt-outs.

De aanpak: tekst opbouwen vóór je verstuurt

Omdat de API geen placeholder-syntax kent, bouw je de string gewoon zelf samen in je eigen code, per rij uit je database of CSV, en stuur je elk bericht apart naar de API.

<?php

$apiKey = getenv('TEXTMEFLOW_API_KEY');

$afspraken = [
    ['naam' => 'Sofie', 'telefoon' => '+32472932208', 'datum' => 'donderdag 14u', 'dienst' => 'onderhoud'],
    ['naam' => 'Karim', 'telefoon' => '+32498112233', 'datum' => 'vrijdag 9u30', 'dienst' => 'bandenwissel'],
];

foreach ($afspraken as $a) {
    $tekst = sprintf(
        "Hoi %s, je afspraak voor %s staat gepland op %s. Antwoord STOP om af te melden.",
        $a['naam'],
        $a['dienst'],
        $a['datum']
    );

    $response = file_get_contents('https://api.textmeflow.eu/v1/messages', false, stream_context_create([
        'http' => [
            'method'  => 'POST',
            'header'  => "Authorization: Bearer {$apiKey}\r\nContent-Type: application/json\r\n",
            'content' => json_encode(['to' => $a['telefoon'], 'text' => $tekst]),
        ],
    ]));

    // Respecteer de rate-limit: max 1 bericht per seconde per nummer.
    usleep(1_100_000);
}

De sprintf-aanpak is bewust simpel: geen templating-library nodig voor een paar variabelen. Bij grotere volumes (honderden rijen) is een korte pauze tussen calls — zoals de usleep hierboven — voldoende om binnen de limiet van 1 bericht per seconde per nummer te blijven. Boven die limiet antwoordt de API met 429 Too Many Requests; vang die response af en herprobeer met een korte backoff in plaats van de hele batch te laten crashen.

Varieer meer dan alleen de naam

Een paar manieren om verder te personaliseren zonder complexiteit toe te voegen:

  • Context uit je eigen systeem: bedrag, bestelnummer, kenteken, kamernummer — alles wat je al in je database hebt staan, hoort in de tekst, niet alleen de naam.
  • Tijdstip-gevoelige formulering: "morgenochtend" in plaats van een vaste datumnotatie leest persoonlijker en voorkomt dat 200 berichten letterlijk identiek zijn.
  • Korte variatie in zinsbouw: wissel "je afspraak staat gepland op" af met "we verwachten je op" voor een deel van de batch. Kleine wisselingen zijn genoeg om de content-uniciteit omlaag te brengen.

Media hoort er ook bij

Personalisatie stopt niet bij tekst. Het media_url-veld op /v1/messages accepteert een link naar een bestand tot 100 MB — een factuur-PDF met het juiste bedrag, een foto van de juiste kamer, een op maat gegenereerde QR-code. Genereer dat bestand per ontvanger vóór je het verzendt en geef de URL mee naast de tekst.

Wat je niet moet doen

Stuur geen identieke tekst naar een lijst van gekochte of niet-opt-in nummers — dat is sowieso verboden, personalisatie verandert daar niets aan. En gebruik de urgent-vlag op /v1/messages niet om stelselmatig de quiet-hours te omzeilen; die vlag is bedoeld voor uitzonderingen, niet als gewoonte. Hoe je bulkverzendingen verder spreidt om onder de radar van broadcast-detectie te blijven, staat uitgewerkt in ons artikel over bulk-herinneringen.

De volledige request- en response-schema's, inclusief foutcodes, vind je in de API-referentie.

Begin vandaag

Je hoeft niet te wachten op een Meta-goedkeuring om te testen. Maak een gratis account, haal je API-key op en stuur je eerste gepersonaliseerde bericht binnen enkele minuten.

Start gratis — 50 berichten/maand

Zelf WhatsApp-berichten versturen via API?

Gratis voor altijd tot 50 berichten/maand. QR scannen en binnen 5 minuten verstuur je je eerste bericht.

Gratis voor altijd