Aller au contenu principal

WhatsApp pour la relance client via l'API : tutoriel pour les éditeurs

Tutoriel relance client WhatsApp API : configurez votre premier flux de relance pas à pas — template, déclencheur, appel API et suivi des réponses en 5 étapes.

Ce tutoriel vous guide pas à pas pour mettre en place votre premier flux de relance client via l'API WhatsApp Business. À la fin, vous aurez un déclencheur événementiel fonctionnel, un template validé par Meta et un système de suivi des réponses intégré dans votre plateforme. Durée estimée : 2 à 4 heures selon votre architecture existante.

Prérequis

Avant de commencer ce tutoriel :

  • Vous avez un compte Whakup actif avec vos clés API.
  • Vous avez un numéro WhatsApp Business connecté (ou accès au sandbox Whakup).
  • Votre base de données clients contient les numéros de téléphone en format E.164 (+33XXXXXXXXX) et les statuts de consentement WhatsApp.
  • Votre plateforme émet des événements métier (via queue, webhook interne, ou cron).

Si vous partez de zéro sur l'intégration API, lisez d'abord notre guide complet de l'API WhatsApp Business avant de suivre ce tutoriel.

Étape 1 : Définir votre cas d'usage de relance

Ce tutoriel implémente une relance de devis non signé : 72 heures après la création d'un devis, si le statut est toujours "en attente", un message WhatsApp est envoyé au prospect.

Vous pouvez adapter ce flux à n'importe quel déclencheur : client inactif depuis N jours, contrat expirant dans N jours, rendez-vous non confirmé, etc. La structure technique est identique.

Définissez ces paramètres avant de coder :

Paramètre Valeur pour ce tutoriel
Événement déclencheur quote.created
Délai 72 heures
Condition de sortie Statut devis = "signé" ou "annulé"
Nombre max de relances 2 (J+3 et J+7)
Canal de fallback Email

Étape 2 : Créer et soumettre le template

2.1 Rédiger le template

Rédigez le corps du message en respectant les règles Meta pour la catégorie Marketing (une relance de devis est un message commercial) :

Bonjour {{1}}, votre devis {{2}} de {{3}} € est toujours en attente.
Des questions avant de valider ? Répondez à ce message ou appelez-nous directement.

Ajoutez un bouton URL : "Voir mon devis" → https://votre-plateforme.fr/devis/{{4}}

2.2 Soumettre via l'espace Whakup

  1. Connectez-vous à l'espace éditeur Whakup.
  2. Section "Templates" → "Créer un template".
  3. Nom : quote_followup_fr / Catégorie : Marketing / Langue : Français.
  4. Collez le corps, ajoutez le bouton.
  5. Soumettez.

La validation Meta prend 24 à 48 heures pour les templates Marketing. Utilisez le sandbox en attendant.

2.3 Vérifier l'approbation

Whakup envoie une notification quand le statut passe à APPROVED. Vous pouvez aussi requêter le statut via l'API :

curl -X GET https://api.whakup.com/v1/templates/quote_followup_fr \
  -H "Authorization: Bearer $WHAKUP_TOKEN"

Étape 3 : Implémenter le déclencheur

3.1 Worker de traitement des devis en attente

Voici un exemple de worker en Python qui s'exécute toutes les heures :

import httpx
import os
from datetime import datetime, timedelta
from your_db import get_quotes_pending_since

WHAKUP_TOKEN = os.environ['WHAKUP_TOKEN']
WHAKUP_API = 'https://api.whakup.com/v1/messages'

async def process_quote_reminders():
    # Récupère les devis créés il y a 72h±1h, non signés, non annulés
    cutoff_start = datetime.now() - timedelta(hours=73)
    cutoff_end = datetime.now() - timedelta(hours=71)

    pending_quotes = await get_quotes_pending_since(
        created_between=(cutoff_start, cutoff_end),
        status='pending',
        reminder_1_sent=False,
        has_whatsapp_consent=True
    )

    for quote in pending_quotes:
        await send_quote_reminder(quote)
        await mark_reminder_sent(quote.id, reminder_number=1)

async def send_quote_reminder(quote):
    payload = {
        "to": quote.client_phone,  # Format E.164
        "template": {
            "name": "quote_followup_fr",
            "language": "fr",
            "components": [
                {
                    "type": "body",
                    "parameters": [
                        {"type": "text", "text": quote.client_firstname},
                        {"type": "text", "text": quote.reference},
                        {"type": "text", "text": f"{quote.amount:,.2f}".replace(",", " ")},
                        {"type": "text", "text": quote.id}
                    ]
                },
                {
                    "type": "button",
                    "sub_type": "url",
                    "index": 0,
                    "parameters": [
                        {"type": "text", "text": str(quote.id)}
                    ]
                }
            ]
        },
        "metadata": {
            "quote_id": quote.id,
            "reminder_number": 1
        }
    }

    async with httpx.AsyncClient() as client:
        response = await client.post(
            WHAKUP_API,
            json=payload,
            headers={"Authorization": f"Bearer {WHAKUP_TOKEN}"}
        )
        response.raise_for_status()
        return response.json()['message_id']

3.2 Ajouter la logique de deuxième relance

Pour la deuxième relance (J+7), dupliquez le worker avec reminder_2_sent=False et reminder_1_sent=True. Vous pouvez utiliser un template différent — le deuxième message peut être plus direct ou proposer un appel.

Étape 4 : Traiter les webhooks

Configurez votre endpoint webhook dans l'espace Whakup. Cet endpoint reçoit tous les événements de statut et les messages entrants.

4.1 Statuts de livraison

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhooks/whakup', methods=['POST'])
def handle_webhook():
    data = request.json
    event_type = data.get('type')

    if event_type == 'message_status':
        message_id = data['message_id']
        status = data['status']  # sent, delivered, read, failed

        if status == 'failed':
            # Récupérer le quote_id depuis les metadata
            quote_id = data.get('metadata', {}).get('quote_id')
            if quote_id:
                trigger_email_fallback(quote_id)

        elif status == 'read':
            # Le prospect a lu le message : notifier le commercial
            quote_id = data.get('metadata', {}).get('quote_id')
            if quote_id:
                notify_sales_rep_message_read(quote_id)

    elif event_type == 'message_received':
        # Le prospect a répondu !
        handle_incoming_reply(data)

    return jsonify({'status': 'ok'}), 200

4.2 Traitement des réponses

Quand un prospect répond, une fenêtre de conversation de 24 heures s'ouvre. Routez ce message vers le bon commercial dans votre CRM :

def handle_incoming_reply(data):
    from_phone = data['from']  # Numéro du prospect
    message_text = data['text']['body']

    # Retrouver le devis associé au numéro
    quote = get_quote_by_phone(from_phone, status='pending')

    if quote:
        # Créer une notification dans le CRM pour le commercial
        create_crm_notification(
            sales_rep_id=quote.sales_rep_id,
            channel='whatsapp',
            from_phone=from_phone,
            message=message_text,
            quote_id=quote.id,
            priority='high'  # Prospect chaud !
        )

Étape 5 : Mesurer les résultats

5.1 Métriques à tracker

Ajoutez ces colonnes dans votre table de relances :

  • wa_sent_at : horodatage de l'envoi.
  • wa_delivered_at : horodatage de livraison (webhook).
  • wa_read_at : horodatage de lecture (webhook).
  • wa_replied : booléen, mis à true si réponse reçue.
  • wa_converted : booléen, mis à true si le devis est signé dans les 7 jours suivant l'envoi.

5.2 Requête d'analyse mensuelle

SELECT
    DATE_TRUNC('week', wa_sent_at) as week,
    COUNT(*) as total_sent,
    COUNT(wa_delivered_at) as delivered,
    COUNT(wa_read_at) as read,
    SUM(CASE WHEN wa_replied THEN 1 ELSE 0 END) as replied,
    SUM(CASE WHEN wa_converted THEN 1 ELSE 0 END) as converted,
    ROUND(100.0 * SUM(CASE WHEN wa_converted THEN 1 ELSE 0 END) / COUNT(*), 1) as conversion_rate
FROM quote_reminders
WHERE wa_sent_at >= NOW() - INTERVAL '3 months'
GROUP BY 1
ORDER BY 1 DESC;

Ces données alimentent votre dashboard éditeur et votre argumentaire commercial.

FAQ

Peut-on personnaliser le délai de relance par client ou par type de devis ?

Oui. Stockez le délai de relance dans la fiche client ou dans la configuration du type de devis. Votre worker filtre les devis en fonction de leur propre délai configuré, pas d'un délai global.

Que faire si un client répond "Pas intéressé" ou "Arrêtez de me contacter" ?

Votre webhook de messages entrants doit détecter ces signaux de désabonnement (analyse NLP ou liste de mots-clés : "stop", "arrêt", "non merci"). Marquez immédiatement le contact comme whatsapp_opted_out = true et ne lui envoyez plus aucun message WhatsApp. C'est une obligation légale et une bonne pratique pour préserver votre score de qualité Meta. Lisez notre article sur les prix et structures tarifaires WhatsApp pour comprendre comment les blocages impactent vos coûts indirects.

Comment intégrer ce flux dans une plateforme no-code ou low-code ?

Si votre plateforme expose un système de webhooks internes ou un moteur de règles, vous pouvez déclencher l'appel à l'API Whakup via une action personnalisée. Le pattern est identique : événement → condition → appel HTTP POST vers Whakup. L'API Whakup est REST standard et compatible avec n'importe quel outil capable de faire des requêtes HTTP (Zapier, Make, n8n, ou code custom).

Ce flux est-il compatible avec une architecture microservices ?

Oui. Le worker de relance peut être un microservice indépendant qui consomme des événements depuis votre bus de messages (Kafka, RabbitMQ, SQS). Il n'a besoin que d'accéder à l'API Whakup et à votre base de données de devis. Le service webhook de réception peut être un autre microservice qui émet des événements internes vers votre CRM.


Ce tutoriel couvre l'essentiel pour un premier déploiement de relance client WhatsApp. Pour les besoins avancés — gestion de campagnes multi-étapes, scoring des prospects en fonction de leurs interactions WhatsApp, intégration avec un LLM pour les réponses automatiques — explorez la documentation complète et les exemples avancés sur l'espace éditeur Whakup.

#intégration whatsapp#relance client whatsapp#tutoriel
Arthur Lyonnet
Arthur LyonnetCo-fondateur & CEO

Co-fondateur de Whakup, Arthur accompagne les entreprises africaines dans leur transformation digitale via WhatsApp depuis 2022. Passionné par le growth marketing et l'entrepreneuriat en Afrique francophone.

🚀

Prêt à passer à l'action ?

Essayez Whakup gratuitement pendant 15 jours. Aucune carte bancaire requise.

Démarrer l'essai gratuit