West Africa road transport market = $18 billion/year but 80% disorganized: a shipper calls 5-10 carriers before finding. A B2B marketplace matching supply (carriers) with demand (cargo) automates everything.
TL;DR
- Bidirectional marketplace: shippers post cargo + carriers propose prices.
- Stack: Next.js + Postgres + Mapbox + Wave Business + ePOD.
- West Africa market: $18B/year. Players: Lori (KE-NG), Kobo (NG), Sendy (KE).
Marketplace architecture
`
[Shipper posts mission]
- Origin, destination
- Cargo type, weight, volume
- Pickup date, deadline
- Max budget or auction
↓
[Algorithm matches available carriers]
↓
[Carriers see + propose prices]
↓
[Shipper selects → digital contract signed]
↓
[Cargo delivered → ePOD]
↓
[Wave/bank payment → released post-delivery]
↓
[Mutual reviews]
`
Data model
`prisma
model Shipper {
id String @id @default(cuid())
companyName String
contactPerson String
email String
phone String
ninea String?
monthlyVolume Int?
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[]
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
weightKg Int
volumeM3 Float?
vehicleTypeNeeded String
pickupAddress String
pickupGps Json
pickupBefore DateTime
deliveryAddress String
deliveryGps Json
deliveryBefore DateTime
budgetMaxXof Int?
status String
bids FreightBid[]
awardedBidId String?
}
model FreightBid {
id String @id @default(cuid())
requestId String
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
request FreightRequest @relation(fields: [requestId], references: [id])
carrierId String
carrier Carrier @relation(fields: [carrierId], references: [id])
priceXof Int
estimatedDuration Int
notes String?
submittedAt DateTime @default(now())
status String
}
`
Dynamic pricing + bidding
Two modes:
Mode A — Fixed price (shipper sets budget, carriers accept or not)
Mode B — Auction (carriers propose prices, shipper picks)
`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}
Carrier proposals ({bids.length})
/api/bids/${bid.id}/accept, { method: 'POST' });
);
}
`
AI price recommendation
`ts
async function recommendPriceForRequest(request: FreightRequest) {
const similarMissions = await prisma.shipment.findMany({
where: {
cargoCategory: request.cargoCategory,
vehicleTypeNeeded: request.vehicleTypeNeeded,
status: 'DELIVERED',
},
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)],
};
}
`
Real case — SN-CI marketplace
| Metric | Year 1 | Year 2 |
|---|---|---|
| Active shippers | 240 | 1,850 |
| Onboarded carriers | 380 | 2,100 |
| Missions/month | 380 | 4,200 |
| Monthly GMV | 95M XOF | 980M |
| Platform commission (5%) | 4.75M | 49M |
| Geographic coverage | SN | SN + CI + ML + BJ |
Common pitfalls
- Carrier verification — fraud possible (fake trucks). KYC + physical visit.
- No bidding bot — auction manipulation. Caps + anomaly detection.
- Perishable cargo — critical cold chain. Special category + premium price.
- Cargo theft — partner insurance (NSIA, Allianz Africa) integrated.
- Late carrier payment — escrow + T+3 release post-delivery.
FAQ
Q: Competition?
A: Lori (KE-NG-CIV), Kobo (NG), Sendy (KE), TruckIt (NG). Francophone Africa less saturated.
Q: Commission?
A: 4-7% standard. Freemium model: free posting, 2-3% payment processing + 3-4% comm.
Q: Initial investment?
A: $1.5-4M seed for MVP + 18 ops months. Investors: Partech, 4DX, IFC.
Conclusion
Africa B2B carrier marketplace 2026 = massive opportunity ($18B West Africa TAM). Tractable tech stack. Real challenge = network effects + ground onboarding. 30-48 month ROI on clean execution.
Mohamed Bah
Fondateur, Kolonell
Passionate about digital and entrepreneurship in Africa, Mohamed has been helping Sénégalese businesses with their digital transformation since 2020. Founder of Kolonell, he believes every SME deserves a professional and accessible online présence.