Le WordPress d'aujourd'hui, décodé pour les développeurs

Headless & API

Un webhook Sendinblue qui ne parvenait jamais au front headless

Une automatisation marketing modifiait bien le contenu WordPress, mais le site vitrine découplé n'affichait jamais la mise à jour. Le webhook s'arrêtait avant le front.

Par WordPress Développement • 30 septembre 2026 • 4 min de lecture • Aucun commentaire
Un webhook Sendinblue qui ne parvenait jamais au front headless

« Webhook delivered — 200 OK » : c’est ce qu’affichait le tableau de bord Sendinblue pour chaque déclenchement de l’automatisation censée republier une page promotionnelle sur le site vitrine découplé d’une enseigne de prêt-à-porter, après chaque campagne d’e-mailing. Pourtant, la page en question restait figée sur son ancienne version, parfois plusieurs jours durant, sans qu’aucune erreur ne remonte nulle part.

Symptôme : un webhook « livré », un contenu jamais rafraîchi

L’automatisation Sendinblue, déclenchée à l’envoi d’une campagne, appelait un endpoint REST personnalisé côté WordPress chargé de mettre à jour un champ ACF sur une page promotionnelle, puis de notifier le front Gatsby pour déclencher un nouveau build via un webhook Netlify. Le tableau de bord Sendinblue confirmait systématiquement une livraison réussie du premier appel, avec un code 200. Le contenu WordPress lui-même était bien à jour après vérification manuelle dans l’administration. Seul le site public restait figé.

Diagnostic : où s’arrêtait réellement la chaîne

Le point de blocage ne se trouvait ni côté Sendinblue, ni côté mise à jour du contenu WordPress : il se trouvait dans l’étape intermédiaire, silencieuse, entre les deux. L’endpoint REST personnalisé, une fois le champ ACF mis à jour, appelait wp_remote_post vers le webhook de build Netlify — mais renvoyait sa réponse HTTP 200 à Sendinblue avant d’attendre le résultat de cet appel, avec un paramètre 'blocking' => false :

function traiter_webhook_sendinblue(WP_REST_Request $request) {
    update_field('promo_active', true, $request->get_param('page_id'));

    wp_remote_post('https://api.netlify.com/build_hooks/xxxx', [
        'blocking' => false, // <- l'appel part, sans jamais verifier son issue
        'timeout'  => 0.01,
    ]);

    return rest_ensure_response(['status' => 'ok']);
}

Avec 'blocking' => false et un délai d’expiration de dix millisecondes, la requête vers Netlify était souvent interrompue avant même d’avoir quitté le serveur WordPress — un choix initialement fait pour répondre rapidement à Sendinblue, mais qui sacrifiait la fiabilité de l’étape suivante sans que personne ne s’en aperçoive, faute de journal associé à cet appel spécifique.

Correctif : rendre l’appel vérifiable, pas silencieux

La correction a consisté à séparer les deux préoccupations : répondre vite à Sendinblue reste nécessaire, mais l’appel vers Netlify doit être fiabilisé indépendamment, avec un journal explicite de son résultat plutôt qu’un envoi tiré à l’aveugle.

L'essentiel à retenir : Le journal du webhook côté fournisseur ne suffit pas à garantir la réception ; Une réponse HTTP 200 trop précoce masque un traitement resté incomplet ; Chaque étape du relais doit produire une trace vérifiable
function traiter_webhook_sendinblue(WP_REST_Request $request) {
    $page_id = $request->get_param('page_id');
    update_field('promo_active', true, $page_id);

    // Reponse immediate a Sendinblue, sans dependre du declenchement Netlify.
    $response = rest_ensure_response(['status' => 'ok']);

    // Declenchement du build en tache differee, avec journal.
    wp_schedule_single_event(time(), 'declencher_build_netlify', [$page_id]);

    return $response;
}

add_action('declencher_build_netlify', function ($page_id) {
    $resultat = wp_remote_post('https://api.netlify.com/build_hooks/xxxx', [
        'blocking' => true,
        'timeout'  => 10,
    ]);

    if (is_wp_error($resultat) || wp_remote_retrieve_response_code($resultat) >= 300) {
        error_log(sprintf(
            'Echec declenchement build Netlify pour page %d : %s',
            $page_id,
            is_wp_error($resultat) ? $resultat->get_error_message() : wp_remote_retrieve_response_code($resultat)
        ));
    }
}, 10, 1);

L’appel vers Netlify s’exécute désormais dans une tâche différée avec un délai d’expiration réaliste et un résultat consigné, tout en laissant la réponse à Sendinblue rester immédiate, comme avant.

Prévention : ne jamais faire confiance à un statut « livré » du fournisseur

  • Un webhook marqué « livré » côté fournisseur signifie seulement que le premier appel a réussi, jamais que la chaîne complète qui en découle a fonctionné.
  • Un appel non bloquant avec un délai d’expiration trop court équivaut, en pratique, à un envoi sans garantie.
  • Chaque étape d’un relais de webhook mérite son propre journal, vérifiable indépendamment des autres.

Un webhook « réussi » ne raconte que la première moitié de l’histoire. Tout ce qui se passe après la réponse HTTP mérite sa propre vérification, sans quoi la panne se cache exactement là où personne ne regarde.

En résumé

Cette panne n’avait rien à voir avec la délivrabilité des e-mails Sendinblue ni avec la configuration de l’automatisation marketing elle-même : elle se logeait dans un choix technique isolé, un appel non bloquant avec un délai trop court, invisible tant que personne ne cherchait spécifiquement à vérifier cette étape intermédiaire du relais.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi