Le marché transport routier en Afrique de l'Ouest = 18 milliards USD/an mais 80 % désorganisé : un chargeur appelle 5-10 transporteurs avant trouver. Une marketplace B2B qui matche supply (transporteurs) avec demande (cargo) automatise tout.
TL;DR
- Marketplace bidirectionnelle : chargeurs poste cargo + transporteurs proposent prix.
- Stack : Next.js + Postgres + Mapbox + Wave Business + ePOD.
- Marché Africa de l'Ouest : 18Md USD/an. Players : Lori (KE-NG), Kobo (NG), Sendy (KE).
Architecture marketplace
`
[Chargeur poste mission]
- Origine, destination
- Type cargo, poids, volume
- Date pickup, deadline
- Budget max ou enchère
↓
[Algorithme match avec transporteurs disponibles]
↓
[Transporteurs voient + proposent prix]
↓
[Chargeur sélectionne → contrat digital signé]
↓
[Cargo livré → ePOD]
↓
[Paiement Wave/bank → libéré post-livraison]
↓
[Reviews mutuelles]
`
Modèle de données
`prisma
model Shipper {
id String @id @default(cuid())
companyName String
contactPerson String
email String
phone String
ninea String?
monthlyVolume Int? // tonnes/mois déclaré
walletProvider String
walletNumber String
rating Float?
isVerified Boolean
}
model Carrier {
id String @id @default(cuid())
companyName String
contactPerson String
email String
phone String
fleetSize Int
vehicles Vehicle[]
certifications String[] // ASTU, OHADA, etc.
walletProvider String
walletNumber String
rating Float?
totalShipments Int
isVerified Boolean
}
model FreightRequest {
id String @id @default(cuid())
shipperId String
shipper Shipper @relation(fields: [shipperId], references: [id])
cargoDescription String
cargoCategory String // GENERAL / HAZARDOUS / PERISHABLE / OVERSIZE
weightKg Int
volumeM3 Float?
vehicleTypeNeeded String // TRUCK_3T / TRUCK_15T / SEMI / CONTAINER_40
pickupAddress String
pickupGps Json
pickupBefore DateTime
deliveryAddress String
deliveryGps Json
deliveryBefore DateTime
budgetMaxXof Int?
status String // OPEN / BIDDING / AWARDED / IN_TRANSIT / DELIVERED / CANCELLED
bids FreightBid[]
awardedBidId String?
}
model FreightBid {
id String @id @default(cuid())
requestId String
request FreightRequest @relation(fields: [requestId], references: [id])
carrierId String
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.
carrier Carrier @relation(fields: [carrierId], references: [id])
priceXof Int
estimatedDuration Int // hours
notes String?
submittedAt DateTime @default(now())
status String // PENDING / ACCEPTED / REJECTED / WITHDRAWN
}
`
Pricing dynamique + bidding
Deux modes :
Mode A — Prix fixe (chargeur fixe budget, transporteurs accepent ou non)
Mode B — Enchères (transporteurs proposent prix, chargeur choisit)
`tsx
// app/freight/[id]/page.tsx
export default async function FreightRequestPage({ params }) {
const request = await getFreightRequest(params.id);
const bids = await getBids(request.id);
return (
{request.pickupAddress} → {request.deliveryAddress} {request.weightKg} kg · {request.cargoCategory} {bids.sort((a, b) => a.priceXof - b.priceXof).map(bid => ( key={bid.id} bid={bid} onAccept={async () => { await fetch( }} /> ))}Mission #{request.id}
Propositions transporteurs ({bids.length})
/api/bids/${bid.id}/accept, { method: 'POST' });
);
}
`
Pricing recommandation IA
`ts
// jobs/recommend-price.ts
async function recommendPriceForRequest(request: FreightRequest) {
// Historique missions similaires
const similarMissions = await prisma.shipment.findMany({
where: {
cargoCategory: request.cargoCategory,
vehicleTypeNeeded: request.vehicleTypeNeeded,
status: 'DELIVERED',
// distance similaire
},
take: 50,
orderBy: { createdAt: 'desc' },
});
const avgPrice = average(similarMissions.map(m => m.totalPrice));
const minPrice = avgPrice * 0.85;
const maxPrice = avgPrice * 1.15;
return {
suggested: Math.round(avgPrice),
range: [Math.round(minPrice), Math.round(maxPrice)],
};
}
`
Cas réel — marketplace SN-CI
| Métrique | Année 1 | Année 2 |
|---|---|---|
| Chargeurs actifs | 240 | 1 850 |
| Transporteurs onboardés | 380 | 2 100 |
| Missions/mois | 380 | 4 200 |
| GMV mensuel | 95M FCFA | 980M |
| Commission plateforme (5 %) | 4.75M | 49M |
| Couverture géographique | SN | SN + CI + ML + BJ |
Pièges fréquents
- Vérification transporteurs — fraude possible (faux camions). KYC + visite physique.
- Pas de bidding bot — manipulation enchères. Plafonds + détection anomalies.
- Cargo périssable — chaîne du froid critique. Catégorie spéciale + prix premium.
- Vol cargo — assurance partenaire (NSIA, Allianz Africa) intégrée.
- Paiement transporteur tardif — escrow + libération T+3 post-livraison.
FAQ
Q : Concurrence ?
R : Lori (KE-NG-CIV), Kobo (NG), Sendy (KE), TruckIt (NG). Marché Francophone Africa moins saturé.
Q : Commission ?
R : 4-7 % standard. Modèle freemium : posting gratuit, payment processing 2-3 % + comm 3-4 %.
Q : Investissement initial ?
R : 1.5-4M USD seed pour MVP + 18 mois ops. Investisseurs : Partech, 4DX, IFC.
Conclusion
Marketplace transporteurs B2B en Afrique 2026 = opportunité massive ($18Md TAM Afrique de l'Ouest). Stack tech tractable. Vrai défi = network effects + onboarding terrain. ROI 30-48 mois sur exécution propre.
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.