Francophone Africa agricultural inputs market: ~$3 billion/year. But 80% of farmers pay retail prices (often +40% vs bulk). A B2B bulk marketplace connects wholesale suppliers to cooperatives + farmer groups with massive savings.
TL;DR
- B2B inputs marketplace: seeds, fertilizers, pesticides, tools.
- Cooperative group buying = -25% to -40% vs retail.
- Stack: Next.js + Postgres + Wave Business + partner logistics.
- Francophone Africa TAM: ~$800M/year.
Marketplace architecture `
[Suppliers / wholesalers / importers]
↓
[Product catalog listings + bulk prices]
↓
[Cooperative initiates group order]
↓
[Cooperative members confirm quantity]
↓
[When bulk minimum reached: order validated]
↓
[Wave/MTN grouped payment]
↓
[Logistics village delivery or pickup point]
↓
[Coop member distribution]
`
Step 1 — data model `prisma
model Supplier {
id String @id @default(cuid())
companyName String
ninea String?
contactPerson String
email String
phone String
warehouseCity String
warehouseAddress String
bankAccount Json
certifications String[]
rating Float?
isVerified Boolean
}
model Product {
id String @id @default(cuid())
supplierId String
category String
subcategory String
name String
brand String?
packagingSize String
bulkPriceXof Int
minimumOrderQty Int
retailComparison Int?
description String
images String[]
certifications String[]
inStock Boolean
expiryDate DateTime?
}
model GroupOrder {
id String @id @default(cuid())
cooperativeId String
initiatedBy String
status String
minimumThreshold Int
currentQuantity Int @default(0)
closingDate DateTime
productId String
product Product @relation(fields: [productId], references: [id])
participants GroupOrderParticipant[]
}
model GroupOrderParticipant {
id String @id @default(cuid())
groupOrderId String
groupOrder GroupOrder @relation(fields: [groupOrderId], references: [id])
producerId String
quantity Int
paymentStatus String
walletTransactionId String?
}
`
Step 2 — bulk product page `tsx
export default async function ProductPage({ params }) {
const product = await getProduct(params.slug);
return (
{product.name}
{product.brand} · {product.packagingSize}
{product.bulkPriceXof.toLocaleString()} XOF / {product.packagingSize}
{product.retailComparison && (
Retail price: {product.retailComparison.toLocaleString()} XOF
)}
Savings: -{Math.round((1 - product.bulkPriceXof / product.retailComparison) * 100)}%
Minimum order: {product.minimumOrderQty} units
Availability: {product.inStock ? '✓ In stock' : 'On order'}
Need a professional website? Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
Start group order
Join existing order
);
}
`
Step 3 — group order workflow `tsx
async function initiateGroupOrder(productId: string, myQuantity: number) {
const product = await getProduct(productId);
const order = await fetch('/api/group-orders', {
method: 'POST',
body: JSON.stringify({
productId,
minimumThreshold: product.minimumOrderQty,
closingDate: addDays(new Date(), 7),
myQuantity,
}),
});
const coop = await getCooperative(currentUser.cooperativeId);
for (const member of coop.members) {
await sendWhatsApp(member.whatsapp, {
template: 'group_order_invitation',
params: [
product.name,
product.bulkPriceXof.toLocaleString(),
order.minimumThreshold,
https://kolonell.com/group-orders/${order.id},
],
});
}
}
async function joinGroupOrder(groupOrderId: string, myQuantity: number) {
await fetch(/api/group-orders/${groupOrderId}/join, {
method: 'POST',
body: JSON.stringify({ quantity: myQuantity }),
});
}
async function placeBulkOrder(groupOrderId: string) {
const order = await getGroupOrder(groupOrderId);
if (order.currentQuantity < order.minimumThreshold) {
throw new Error('Minimum threshold not yet reached');
}
for (const p of order.participants) {
await initiateWavePayment({
receiverWallet: 'kolonell-escrow',
amount: order.product.bulkPriceXof * p.quantity,
reference: ${order.id}_${p.id},
payerWallet: p.producer.walletNumber,
});
}
await prisma.groupOrder.update({
where: { id: groupOrderId },
data: { status: 'PLACED' },
});
}
`
Step 4 — distribution logistics Three models:
Model 1 — Direct cooperative delivery
Supplier delivers directly to coop HQ. Coop redistributes to members.
Model 2 — Pickup point
Platform truck delivers to pickup points (village shop, school). Farmers come collect.
Model 3 — Last-mile to village
More expensive but accessible to remote farmers. Variable fee per distance.
Step 5 — integrated financing Pair with digital agricultural credit → for cashless farmers:
`
[Cashless farmer]
↓
[Inputs credit request at order]
↓
[Quick alternative scoring]
↓
[If approved: inputs + spread repayment]
↓
[Harvest → sale → auto repayment]
`
Real case — Senegal-CI startup Profile: 380 connected cooperatives, ~22,000 farmers.
Metric Year 1 Year 2 Group orders 280 1,850 Monthly GMV 45M XOF 320M XOF Average farmer savings 28% 34% Platform commission (3%) 1.35M 9.6M Onboarded suppliers 12 47
Common pitfalls Last-minute farmer cancellations — escrow + commitment date critical.Diverging product quality — supplier verification + return possible.No supplier stock — desynced listings. API or frequent updates.Acute seasonality — fertilizer, seeds = 2-3-month peak/year. Diversify categories.Suppliers don't deliver — insurance + multiple alternative suppliers.FAQ Q: Competition?
A: Apollo Agriculture (KE), Babban Gona (NG), Hello Tractor. Emerging UEMOA market.
Q: Typical margins?
A: 3-7% platform commission + 1-2% supplier spread = 4-9% gross margin.
Q: Initial investment?
A: $800K-2.5M for stack + team + 12 ops months. Investors Acumen, Aspen Network, Mercy Corps.
Conclusion Bulk inputs marketplace = powerful lever for African agricultural productivity. 24-36 month ROI on clean execution. Massive Francophone Africa TAM, low saturation in 2026.
Tags: #Marketplace #Inputs #Bulk #AgriTech #Cooperatives #Africa
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.
Table of contents Need a website? Showcase sites from 400,000 FCFA. E-commerce with Wave and Orange Money.
Free quote