Quand votre boutique sénégalaise commence à exporter — vers la Côte d'Ivoire, le Nigeria, le Kenya, l'Europe — chaque devise ajoutée cache des pièges : taux de change, marges absorbées par les variations, taxes douanières, modes de paiement non disponibles, tickets de support en plusieurs langues.
TL;DR
- 5 devises maximum recommandées pour une PME : XOF + NGN + KES + EUR + USD couvre 80 % des cas africains.
- Stratégie tarif : prix de référence en USD/EUR, conversion auto avec marge de sécurité 2,5 %.
- Mise à jour taux de change : daily via API Open Exchange Rates (gratuit jusqu'à 1000 req/mois).
Pourquoi multi-devise est nécessaire
Cas client réel — boutique mode haut de gamme à Dakar :
- 62 % CA en XOF (clients SN, CI, BJ)
- 18 % CA en NGN (Lagos, Abuja)
- 9 % CA en EUR (diaspora France/Belgique/Allemagne)
- 7 % CA en KES (Nairobi, Mombasa)
- 4 % CA en USD (international, payeurs USA/Canada)
Forcer tout en XOF perdrait ~38 % du CA.
Architecture multi-devise
`
[Visiteur arrive]
↓
[Détection IP → pays → devise par défaut]
↓
[Sélecteur devise (haut)]
↓
[Prix produit recalculé live (cache 6h)]
↓
[Checkout]
↓
[PaymentRouter par (devise, pays)]
↓
[Paiement dans la devise affichée]
↓
[Settlement comptable en EUR ou XOF]
`
Stratégie tarif : USD/EUR comme référence
Stocker les prix en USD (ou EUR) en base, calculer les prix d'affichage à la volée :
`ts
// lib/pricing.ts
const RATES_CACHE_KEY = 'fx:rates:v1';
const RATES_TTL = 6 * 3600; // 6h
async function getRates(): Promise
const cached = await redis.get(RATES_CACHE_KEY);
if (cached) return JSON.parse(cached);
const res = await fetch(
https://openexchangerates.org/api/latest.json?app_id=${process.env.OXR_KEY}&base=USD
);
const { rates } = await res.json();
await redis.setex(RATES_CACHE_KEY, RATES_TTL, JSON.stringify(rates));
return rates;
}
export async function priceFor(productPriceUsd: number, currency: string): Promise
const rates = await getRates();
const rate = rates[currency.toUpperCase()];
if (!rate) throw new Error(Currency unsupported: ${currency});
const safetyMargin = 1.025; // 2.5% buffer pour volatilité
const raw = productPriceUsd * rate * safetyMargin;
// Arrondi par devise
switch (currency.toUpperCase()) {
case 'XOF': return Math.ceil(raw / 100) * 100; // arrondi 100 XOF
case 'NGN': return Math.ceil(raw / 50) * 50; // arrondi 50 NGN
case 'KES': return Math.ceil(raw / 10) * 10; // arrondi 10 KES
case 'EUR':
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.
case 'USD': return Math.ceil(raw * 100) / 100; // arrondi 0.01
default: return Math.ceil(raw);
}
}
`
Sélecteur devise UX
Afficher le sélecteur devise visible mais discret. Pré-sélectionner la devise par IP :
`tsx
// components/CurrencySelector.tsx
const FLAGS = {
'XOF': { flag: '🇸🇳', label: 'FCFA (Afrique de l\'Ouest)' },
'XAF': { flag: '🇨🇲', label: 'FCFA (Afrique Centrale)' },
'NGN': { flag: '🇳🇬', label: '₦ Naira' },
'KES': { flag: '🇰🇪', label: 'KSh Shilling' },
'GHS': { flag: '🇬🇭', label: '₵ Cedi' },
'EUR': { flag: '🇪🇺', label: '€ Euro' },
'USD': { flag: '🇺🇸', label: '$ Dollar' },
};
export function CurrencySelector() {
const { currency, setCurrency } = useCurrency();
return (
{Object.entries(FLAGS).map(([code, { flag, label }]) => (
))}
);
}
`
Paiement par devise
Routing checkout selon devise sélectionnée :
| Devise | Passerelles | Notes |
|---|---|---|
| XOF | Wave, Orange Money, PayDunya, CinetPay | UEMOA |
| XAF | Orange Money, MTN MoMo, Express Union | CEMAC |
| NGN | Paystack, Flutterwave, Squad | Nigeria |
| KES | M-Pesa, Stripe | Kenya |
| GHS | MTN MoMo, Vodafone Cash, Hubtel | Ghana |
| EUR | Stripe, PayPal | Europe |
| USD | Stripe, PayPal | International |
Pièges fiscaux et logistiques
1. TVA / VAT : la TVA dépend du pays du vendeur ET du pays de l'acheteur (B2C UE = TVA pays acheteur via OSS pour vendeurs UE, mais hors UE c'est variable). Au Sénégal : TVA 18 % obligatoire sur les ventes internes.
2. Douanes import : un client à Lagos qui achète un produit XOF expédié depuis Dakar paie des droits import à l'arrivée. Affichez ces frais ou intégrez-les dans le prix d'export (DDP — Delivered Duty Paid).
3. Trésorerie multi-devise : si vous facturez en NGN mais payez vos fournisseurs en XOF, vous accumulez du risque de change. Solutions : compte multi-devise (Wise Business, Mercury Africa) ou conversion immédiate.
4. Returns transfrontaliers : un retour Lagos → Dakar coûte plus cher que la marge produit pour les petits paniers. Politique returns différenciée par pays.
Cas réel — boutique mode Dakar (12 mois)
Avant multi-devise (XOF only) :
- CA : 28M FCFA/mois
- 19 % paniers internationaux abandonnés au checkout
Après multi-devise (XOF, NGN, EUR, USD) :
- CA : 41M FCFA/mois (+46 %)
- 6 % paniers internationaux abandonnés
- Coût intégration multi-devise : 2,8M FCFA, ROI 2,2 mois
FAQ
Q : Faut-il afficher TVA incluse ou hors TVA ?
R : Selon le pays cible. UE B2C : TTC obligatoire. Afrique B2C : usage local TTC. Pour B2B export : HT + mention TVA non applicable / DDP.
Q : Le client peut-il changer de devise en cours de panier ?
R : Techniquement oui, mais éviter — recalculer les frais de port + recalculer les conversions est buggy. Verrouiller au début du checkout.
Q : Comment éviter les pertes sur la marge fx ?
R : Buffer 2,5 % à 3,5 % selon volatilité. Pour les devises très volatiles (NGN), monter à 5 %.
Conclusion
Multi-devise n'est pas un luxe — c'est le passage obligé pour scaler au-delà de 30M FCFA/mois en Afrique. La stack technique se monte en 2-3 semaines, mais le vrai défi est la logistique et la fiscalité multi-pays. Plan, testez sur 1 corridor (ex : SN → CI), puis dupliquez.
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.

