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 |
É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
- Connectez-vous à l'espace éditeur Whakup.
- Section "Templates" → "Créer un template".
- Nom :
quote_followup_fr/ Catégorie : Marketing / Langue : Français. - Collez le corps, ajoutez le bouton.
- 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.

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 gratuitArticles similaires
WhatsApp pour l'abandon de panier via l'API : tutoriel pour les éditeurs
Tutoriel technique abandon de panier WhatsApp : détection de l'événement, création du template, appel API REST, webhooks et attribution — guide pas à pas pour les éditeurs.
WhatsApp pour l'authentification OTP via l'API : tutoriel pour les éditeurs
Tutoriel OTP WhatsApp API pas à pas : créez et envoyez votre premier code d'authentification via l'API WhatsApp Business en moins d'une heure.
WhatsApp pour l'onboarding client via l'API : tutoriel pour les éditeurs
Tutoriel pas à pas pour intégrer WhatsApp dans l'onboarding client de votre plateforme via l'API Business : configuration, premiers appels API et gestion des webhooks.