Aller au contenu principal
Guides & Stratégie• 8 min de lecture

Chatbot WhatsApp service client : architecture et scénarios types

Architecture d'un chatbot WhatsApp pour service client africain. Scénarios types : FAQ, statut commande, réclamation, retour produit. Guide technique et fonctionnel complet.

Le service client est le cas d'usage numéro un des chatbots WhatsApp en Afrique. Et pour cause : il combine l'urgence d'une réponse rapide, la répétitivité de nombreuses questions, et la disponibilité 24h/24 que WhatsApp rend naturellement attendue. Un chatbot de service client bien architecturé peut traiter 70% des demandes sans intervention humaine tout en améliorant la satisfaction client.

Ce guide vous présente l'architecture de référence et les scénarios types d'un chatbot WhatsApp de service client africain.

Architecture de référence

                    MESSAGE ENTRANT WhatsApp
                            ↓
                    COUCHE DE RÉCEPTION
                    (Webhook Whakup)
                            ↓
                  PRÉTRAITEMENT LINGUISTIQUE
                  (normalisation, langue détection)
                            ↓
                    MOTEUR DE ROUTING
              ┌──────────────┴─────────────────┐
         Intention                          Sentiment
         détectée                          très négatif
              │                                 │
    ┌─────────┼──────────┐               ESCALADE
    │         │          │               URGENTE
   FAQ    TRANSACTIONNEL  COMPLEXE
    │         │          │
  BOT      API          NLP/LLM
 statique  intégrée     avancé
    │         │          │
    └─────────┼──────────┘
              │
         RÉPONSE CLIENTE
              │
         LOGGING & CRM

Scénario 1 : Réponse FAQ automatique

Le scénario le plus fréquent. 40-50% des messages entrants dans un service client africain typique sont des questions répétitives avec des réponses fixes.

// Système FAQ WhatsApp avec routing par intention
const faqFlows = {
  
  'horaires': {
    triggers: ['horaire', 'ouvert', 'fermé', 'heure', 'weekend', 'samedi', 'dimanche'],
    response: async () => {
      const schedule = await getBusinessSchedule();
      return `🕐 Nos horaires :
Lun-Ven : ${schedule.weekday}
Samedi : ${schedule.saturday}
Dimanche : ${schedule.sunday}

Notre chatbot est disponible 24h/24 pour les questions courantes.`;
    },
    follow_up_buttons: ['Commander', 'Suivi commande', 'Autre question']
  },
  
  'livraison_tarif': {
    triggers: ['livraison', 'délai', 'combien livraison', 'tarif livraison', 'frais port'],
    response: async (customerCity) => {
      const rates = await getDeliveryRates(customerCity);
      return `📦 Livraison :
${rates.map(r => `• ${r.city} : ${r.delay} — ${r.price} FCFA`).join('\n')}
✅ Livraison offerte dès ${rates.free_threshold} FCFA d'achat`;
    }
  },
  
  'paiement_modes': {
    triggers: ['payer', 'paiement', 'wave', 'orange money', 'mtn', 'mobile money'],
    response: `💳 Modes de paiement :
✅ Wave (Sénégal & Côte d'Ivoire)
✅ Orange Money (CI, Sénégal, Cameroun)
✅ MTN Mobile Money (CI, Cameroun)
✅ Carte bancaire Visa/Mastercard
✅ Paiement à la livraison (Abidjan et Dakar)

Tous les paiements sont sécurisés et confirmés par message.`
  }
};

async function handleFAQMessage(phone, message, intentionData) {
  const flow = faqFlows[intentionData.intent];
  
  if (!flow) return null; // Pas de FAQ pour cette intention
  
  const response = typeof flow.response === 'function' 
    ? await flow.response(intentionData.entities?.city)
    : flow.response;
  
  await sendMessage(phone, response);
  
  if (flow.follow_up_buttons) {
    await sendButtonMessage(phone, 
      "Puis-je vous aider avec autre chose ?",
      flow.follow_up_buttons
    );
  }
  
  return { handled: true, type: 'faq' };
}

Scénario 2 : Suivi de commande avec API

Le deuxième cas d'usage le plus fréquent, et l'un des plus rentables à automatiser.

// Flow complet de suivi de commande
const orderTrackingFlow = {
  
  step1_ask_order_number: {
    message: "Pour suivre votre commande, envoyez-moi votre numéro de commande (ex: CMD-2026-1234).",
    waiting_for: 'order_number',
    validation: /^CMD-\d{4}-\d+$/i
  },
  
  step2_verify_and_display: async (phone, orderNumber) => {
    const order = await ordersAPI.getOrder(orderNumber);
    
    if (!order) {
      return {
        message: `Ce numéro de commande n'existe pas dans notre système 🤔
Vérifiez votre email de confirmation ou tapez *aide* pour parler à un agent.`,
        type: 'not_found'
      };
    }
    
    // Vérifier que la commande appartient à ce numéro WhatsApp
    if (order.customer_phone !== phone) {
      return {
        message: "Ce numéro de commande ne correspond pas à votre compte. Pour des raisons de sécurité, je ne peux pas afficher ces informations. Tapez *agent* pour parler à un conseiller.",
        type: 'security_check'
      };
    }
    
    const statusMessages = {
      'pending': '⏳ En attente de traitement',
      'confirmed': '✅ Commande confirmée',
      'preparing': '📦 En préparation',
      'shipped': '🚚 En cours de livraison',
      'out_for_delivery': '🛵 Livreur en route vers vous !',
      'delivered': '✅ Livré',
      'returned': '↩️ Retour en cours'
    };
    
    const statusLine = statusMessages[order.status] || `Statut: ${order.status}`;
    
    return {
      message: `Commande *${orderNumber}*
      
${statusLine}

📅 Commandée le : ${formatDate(order.created_at)}
🎁 Articles : ${order.items.map(i => i.name).join(', ')}
💰 Total : ${formatCurrency(order.total)}
${order.tracking_url ? `\n🔗 Suivi en temps réel : ${order.tracking_url}` : ''}
${order.estimated_delivery ? `\n📅 Livraison estimée : ${formatDate(order.estimated_delivery)}` : ''}`,
      
      follow_up: order.status !== 'delivered' 
        ? ['Modifier adresse', 'Annuler', 'Contacter agent']
        : ['Commander à nouveau', 'Retour/Échange', 'Laisser un avis']
    };
  }
};

Scénario 3 : Gestion de réclamation

Le scénario le plus délicat — ici, l'empathie et la rapidité sont cruciales.

// Flow de réclamation avec sentiment monitoring
const reclamationFlow = {
  
  async handle(phone, message, customerData) {
    // Empathie d'abord, TOUJOURS
    await sendMessage(phone,
      "Je suis vraiment désolé pour ce problème et je vais m'en occuper personnellement. " +
      "Pour vous aider au mieux, pouvez-vous me donner :"
    );
    
    // Collecter les informations via formulaire WhatsApp Flows
    await sendFlowMessage(phone, {
      flow_id: 'complaint_form',
      fields: [
        { name: 'order_id', label: 'Numéro de commande', required: true },
        { name: 'problem_type', label: 'Type de problème', type: 'select',
          options: ['Produit non reçu', 'Produit défectueux', 'Mauvais produit', 
                   'Problème de paiement', 'Autre'] },
        { name: 'description', label: 'Décrivez le problème', max_chars: 500 }
      ]
    });
    
    // À la réception du formulaire rempli
    return { next_step: 'process_complaint_form' };
  },
  
  async processComplaintForm(phone, formData) {
    // Créer ticket dans le système
    const ticket = await createComplaintTicket(phone, formData);
    
    // Notifier l'équipe concernée
    await notifyRelevantTeam(ticket);
    
    // Confirmer au client avec délai de résolution
    await sendMessage(phone,
      `Votre réclamation *#${ticket.id}* est bien enregistrée ✅

Notre équipe va la traiter en priorité.
Délai de réponse : *2h en heures ouvrables*.

Vous recevrez une mise à jour par WhatsApp.
Merci de votre patience — nous allons résoudre cela. 🙏`
    );
  }
};

Scénario 4 : Retour produit automatisé

// Flow de retour produit
const returnFlow = {
  
  async initiate(phone, orderId) {
    const order = await ordersAPI.getOrder(orderId);
    
    // Vérifier éligibilité
    const daysSincePurchase = getDaysDiff(order.purchase_date, new Date());
    if (daysSincePurchase > 30) {
      return sendMessage(phone,
        "Désolé, le délai de retour de 30 jours est dépassé pour cette commande 😕\n" +
        "Si l'article est défectueux, cela reste possible. Tapez *défectueux* pour continuer."
      );
    }
    
    // Collecter la raison
    await sendListMessage(phone, "Pourquoi souhaitez-vous retourner cet article ?", [
      { id: 'wrong_size', title: 'Mauvaise taille' },
      { id: 'not_as_described', title: 'Ne correspond pas à la description' },
      { id: 'defective', title: 'Défectueux/Endommagé' },
      { id: 'changed_mind', title: 'Changement d\'avis' }
    ]);
  },
  
  async processReturn(phone, orderId, reason) {
    // Générer étiquette de retour
    const returnLabel = await returnsAPI.createReturnLabel(orderId, reason);
    
    await sendMessage(phone,
      `✅ Retour initié avec succès !

*Code retour : ${returnLabel.code}*

📍 Déposez votre colis dans n'importe quel point relais [Opérateur Logistique].
📅 Délai retour : déposez dans les 7 jours

💰 Remboursement sous *5-7 jours ouvrés* après réception.

Pour trouver le point relais le plus proche : ${returnLabel.points_relais_url}`
    );
  }
};

Pour approfondir, consultez notre guide sur le bot de vente WhatsApp et notre article sur l'automatisation WhatsApp flows.

FAQ

Q: Un chatbot de service client WhatsApp peut-il vraiment résoudre 70% des demandes ?

A: Oui, mais ce taux dépend de votre préparation. 70% est atteignable si vous avez : (1) une FAQ exhaustive et à jour, (2) une intégration API avec votre système de gestion des commandes pour le suivi en temps réel, (3) un flow de réclamation qui collecte les informations et crée les tickets automatiquement. Les entreprises qui démarrent sans ces trois éléments atteignent plutôt 40-50%.

Q: Comment gérer les cas où le client est insatisfait de la réponse du bot et demande un humain ?

A: Toujours escalader sans friction. Un bouton "Parler à un agent" doit être disponible à chaque étape du flow. Configurez une transition empathique : "Je comprends que vous souhaitez parler directement avec quelqu'un. Je vous connecte immédiatement." La satisfaction post-escalade est généralement meilleure que si le bot avait insisté à gérer seul.

Q: Le bot doit-il gérer les réclamations ou les transférer systématiquement à un humain ?

A: Le bot peut gérer la collecte des informations de réclamation (numéro commande, type de problème, description) et créer le ticket automatiquement. La résolution finale (remboursement, échange, geste commercial) doit être confirmée par un humain sauf pour les cas très standardisés (retour dans les délais = remboursement automatique sans condition). Ce découplage collecte/résolution est l'architecture optimale.

Q: Comment s'assurer que le bot ne promet pas ce que l'entreprise ne peut pas tenir ?

A: Votre system prompt et vos flows doivent être extrêmement précis sur ce que le bot est autorisé à promettre. Le bot ne doit jamais promettre un remboursement, une livraison express ou un geste commercial sans vérification humaine. Il peut dire "notre équipe va étudier votre demande de remboursement" mais pas "vous serez remboursé dans 48h" sans que ce soit une politique automatique confirmée.


Un chatbot de service client WhatsApp bien architecturé est le meilleur investissement que vous puissiez faire pour votre relation client en Afrique.

Créez votre chatbot de service client avec Whakup et automatisez 70% de vos demandes dès les premières semaines.

#whatsapp-business-api-guide#automatisation-whatsapp-flows#chatbot-whatsapp-guide
Pablo Lenormand
Pablo LenormandCo-fondateur & CPO

Co-fondateur et Chief Product Officer de Whakup, Pablo conçoit les fonctionnalités qui permettent aux marques africaines de maximiser leur impact sur WhatsApp.

🚀

Prêt à passer à l'action ?

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

Démarrer l'essai gratuit