Le checkout sans frottement : payer Wave sans sortir de WhatsApp en 2026
Sénégal, avril 2026 : Wave compte 8,5 millions d'utilisateurs actifs mensuels (source : annual report Wave 2025). WhatsApp Business : 4,2 millions d'utilisateurs PME. L'intersection est massive — mais la majorité des e-commerçants pousse encore le client hors de WhatsApp vers un site externe pour payer. Résultat : taux d'abandon checkout 38-58 %.
L'architecture que je documente ici, déployée pour 3 clients depuis octobre 2025, divise le taux d'abandon par 3 (de 48 % à 15 %). Le client reste dans la conversation WhatsApp, reçoit un lien Wave généré dynamiquement pour son montant exact, paie en 8 secondes, reçoit la confirmation dans la même conversation.
Ce guide est destiné aux devs e-commerce et tech leads PME. Snippets Node.js production-ready.
H2 : Architecture cible
`
┌─────────────┐ 1. message ┌────────────────────┐
│ Client │ ────────────────▶ │ WhatsApp Cloud │
│ (WA app) │ ◀──────────────── │ API │
└─────────────┘ 6. ack paid └─────────┬──────────┘
│ webhook
▼
┌──────────────────────┐
│ Votre backend Node │
│ (Next.js API route) │
└─────┬────────┬───────┘
│ │
- order │ │ 4. wave webhook
▼ ▲
┌──────────────────────┐
│ Wave Business API │
│ (génération URL + │
│ notifications) │
└──────────────────────┘
│ 3. payment URL
▼
┌──────────────────────┐
│ Client paie Wave │
│ (in-app Wave) │
└──────────────────────┘
`
H2 : Étape 1 — Webhook entrant WhatsApp
Le client envoie "Je veux acheter le tagine 12500" dans WA. Meta forward au webhook.
`javascript
// pages/api/whatsapp/webhook.js (Next.js 14 API route)
import { detectIntent } from '@/lib/nlp';
import { createWavePaymentUrl } from '@/lib/wave';
import { sendWhatsAppMessage } from '@/lib/whatsapp';
export async function POST(req) {
const body = await req.json();
const message = body.entry?.[0]?.changes?.[0]?.value?.messages?.[0];
if (!message) return Response.json({ ok: true });
const from = message.from; // ex: "221775969333"
const text = message.text?.body || '';
// Détection intention via Claude API ou règles
const intent = await detectIntent(text);
if (intent.type === 'purchase') {
// Génération URL Wave pour ce montant + ce client
const paymentUrl = await createWavePaymentUrl({
amount: intent.amount, // 12500
currency: 'XOF',
reference: WA-${from}-${Date.now()},
metadata: { whatsapp_from: from, product: intent.product },
});
// Envoi du lien Wave dans WA
await sendWhatsAppMessage(from, {
type: 'interactive',
interactive: {
type: 'button',
body: {
text: `Parfait ! Cliquez pour régler ${intent.amount} FCFA via Wave.
Livraison dès paiement confirmé.`,
},
action: {
buttons: [
{ type: 'reply', reply: { id: paymentUrl, title: 'Payer Wave' } },
],
},
},
});
}
return Response.json({ ok: true });
}
`
H2 : Étape 2 — Génération URL Wave Business
Wave Business API permet de créer des sessions de paiement avec montant pré-rempli.
`javascript
// lib/wave.js
const WAVE_BASE = 'https://api.wave.com/v1';
export async function createWavePaymentUrl({ amount, currency, reference, metadata }) {
const res = await fetch(${WAVE_BASE}/checkout/sessions, {
method: 'POST',
headers: {
Authorization: Bearer ${process.env.WAVE_API_KEY},
'Content-Type': 'application/json',
'Idempotency-Key': reference, // évite double charge
},
body: JSON.stringify({
amount,
currency,
client_reference: reference,
success_url: https://maboutique.com/wa/success?ref=${reference},
Besoin d'un site web professionnel ?
Kolonell crée des sites web qui attirent des clients, optimisés pour le marché sénégalais. Devis gratuit en 2 minutes.
error_url: https://maboutique.com/wa/error?ref=${reference},
metadata,
}),
});
if (!res.ok) throw new Error('Wave checkout creation failed');
const data = await res.json();
return data.wave_launch_url; // URL deep-link Wave
}
`
Le wave_launch_url retourné est un deep-link qui :
- sur Android, ouvre directement l'app Wave avec le montant pré-rempli ;
- sur iOS, ouvre l'app Wave si installée, sinon Safari fallback ;
- desktop : QR code Wave Web.
H2 : Étape 3 — Webhook Wave entrant
Wave notifie votre backend dès que le paiement est confirmé.
`javascript
// pages/api/wave/webhook.js
import crypto from 'crypto';
import { sendWhatsAppMessage } from '@/lib/whatsapp';
import { fulfillOrder } from '@/lib/orders';
export async function POST(req) {
const sig = req.headers.get('wave-signature');
const rawBody = await req.text();
// Vérification HMAC
const expectedSig = crypto
.createHmac('sha256', process.env.WAVE_WEBHOOK_SECRET)
.update(rawBody)
.digest('hex');
if (sig !== expectedSig) return new Response('Invalid signature', { status: 401 });
const event = JSON.parse(rawBody);
if (event.type === 'checkout.session.completed') {
const { client_reference, metadata, amount } = event.data;
const whatsappFrom = metadata.whatsapp_from;
// Confirmer en DB + déclencher logistique
await fulfillOrder({ reference: client_reference, amount, customer: whatsappFrom });
// Ack auto au client dans WhatsApp
await sendWhatsAppMessage(whatsappFrom, {
type: 'text',
text: {
body: `Paiement reçu ! ${amount} FCFA confirmé.
Votre commande ${client_reference} part à la prep. Livraison sous 2h Dakar / 24h régions.
Merci !`,
},
});
}
return Response.json({ ok: true });
}
`
H2 : Étape 4 — Follow-up automatique
Si le client clique sur "Payer Wave" mais ne finalise pas en 15 minutes, on relance.
`javascript
// Cron job toutes les 5 min (utiliser BullMQ ou Vercel Cron)
import { db } from '@/lib/prisma';
import { sendWhatsAppMessage } from '@/lib/whatsapp';
export async function GET() {
const pendingOrders = await db.order.findMany({
where: {
status: 'awaiting_payment',
createdAt: { lt: new Date(Date.now() - 15 * 60 * 1000) },
followUpSent: false,
},
});
for (const order of pendingOrders) {
await sendWhatsAppMessage(order.whatsappFrom, {
type: 'text',
text: {
body: `Bonjour, votre commande ${order.reference} est en attente de paiement (${order.amount} FCFA). Lien Wave toujours valide : ${order.waveUrl}
Une question ? Répondez ici.`,
},
});
await db.order.update({
where: { id: order.id },
data: { followUpSent: true },
});
}
return Response.json({ relanced: pendingOrders.length });
}
`
H2 : Métriques observées (4 PME e-com Dakar, oct 2025 - avril 2026)
| Métrique | Avant (checkout externe) | Après (Wave embedded WA) |
|---|---|---|
| Taux conversion message → paiement | 32 % | 71 % |
| Délai moyen paiement | 14 min | 2 min 40 s |
| Taux abandon checkout | 48 % | 15 % |
| Panier moyen | 18 500 FCFA | 24 800 FCFA |
| Coût technique (mensuel) | 22 000 FCFA | 35 000 FCFA |
Le coût supplémentaire (13 KFCFA / mois) est largement compensé par +34 % conversion.
FAQ
Faut-il un compte Wave Business pour utiliser l'API ?
Oui — Wave Business (KYC entreprise complet) avec activation API auprès du support Wave. Délai 5-15 jours ouvrés. Coûts : 1 % commission par transaction (vs 2-3 % cartes bancaires).
Combien coûte WhatsApp Cloud API ?
Conversations utilisateur-initiées : gratuites (les 1 000 premières / mois). Au-delà : ~0,005 € par conversation. Templates entreprise-initiés : ~0,03-0,06 € selon catégorie (marketing > utility > authentication).
Compatible Orange Money, Free Money ?
Orange Money a une API Senghor mais moins documentée et plus lente (KYC 30-60j). Free Money : pas d'API publique en avril 2026. Wave reste le leader API en 2026. Beaucoup d'e-com proposent Wave par défaut + virement bancaire en backup.
Gestion remboursement ?
Wave API supporte refund via POST /v1/refunds/. Délai : 24-72h. Envoyez systématiquement un message WhatsApp de confirmation du remboursement (+1 message gratuit utilisateur-initié).
Comment monitorer en production ?
Sentry pour erreurs backend + dashboard Grafana avec : taux ack webhook Wave, latence Cloud API WhatsApp, taux échec paiement par type d'erreur, alertes Slack si > 5 % échecs / 5 min.
Discutons de votre cas
Intégration WhatsApp + Wave embedded : 1,8-4,5 M FCFA selon volume produits et complexité backend. Délai 3-6 semaines. WhatsApp +221 77 596 93 33.
Mohamed Bah
Fondateur, Kolonell
Passionné par le digital et l'entrepreneuriat en Afrique, Mohamed accompagne les entreprises sénégalaises dans leur transformation digitale depuis 2020. Fondateur de Kolonell, il croit que chaque PME mérite une présence en ligne professionnelle et accessible.

