Online parapharmacy in Francophone Africa is exploding: Carrefour Para, Pharmashop, Medsbox. But 80% of traditional pharmacies miss this market through technical unfamiliarity AND fear of legal framework. This guide untangles both.
TL;DR
- OTC + parapharmacy = legal online with titular pharmacist authorization.
- Prescription medicines = forbidden online without associated teleconsultation.
- Stack: Next.js + Medusa + prescription scan + fast delivery.
- +25-40% revenue for digitalizing pharmacy vs brick-and-mortar baseline.
Pharmacy e-commerce legal framework In Senegal Legal online :
OTC medicines (no prescription) — Doliprane, Smecta, vitamins Parapharmacy (pharmaceutical cosmetics, hygiene) Food supplements Medical equipment (BP monitor, glucometer) Legal with prescription :
Prescription-required medicines — antibiotics, strong anti-inflammatories Customer uploads scanned prescription Pharmacist validates before dispensing Delivery or pharmacy pickup Strictly forbidden :
Narcotic / psychotropic medicines (annexes I, II, III, IV) Sale without responsible licensed pharmacist Ivory Coast / Cameroon Similar framework with variations. See local National Pharmacist Order.
Pharmacy e-commerce architecture `
[Catalog site]
├── OTC + parapharmacy (direct purchase)
└── Prescription medicines (prescription upload required)
[Prescription workflow]
├── Customer scans prescription via mobile
├── Pharmacist verifies (5-15 min)
├── If OK → adds to cart
├── If issue → contacts customer
├── Final validation → payment
└── Delivery or pickup
[Backend]
├── Product catalog (Medusa)
├── Real-time stock
├── Prescription verification (internal queue)
├── Prescription accounting (legal registry)
└── Audit logs (who saw what)
`
Step 1 — data model `prisma
model Product {
id String @id @default(cuid())
slug String @unique
name String
type String
category String
description String
composition String?
contraindications String?
dosage String?
manufacturer String
countryOrigin String
priceXof Int
stock Int
requiresPrescription Boolean @default(false)
isActive Boolean @default(true)
}
model Prescription {
id String @id @default(cuid())
customerId String
imageUrl String
uploadedAt DateTime @default(now())
validatedBy String?
validatedAt DateTime?
status String
rejectionReason String?
expiresAt DateTime
orderId String?
}
model Order {
id String @id @default(cuid())
customerId String
items OrderItem[]
totalAmount Int
status String
prescriptionId String?
deliveryAddress String
deliveryMode String
paymentMethod String
paidAt DateTime?
}
model PharmacyAuditLog {
id String @id @default(cuid())
userId String
action String
resourceType String
resourceId String
ipAddress String
timestamp DateTime @default(now())
}
`
Step 2 — OTC product page `tsx
export default async function ProductPage({ params }) {
const product = await getProductBySlug(params.slug);
return (
{product.name}
{product.manufacturer}
{product.requiresPrescription && (
⚠️ This medicine requires a prescription. You'll need to upload it before validation.
)}
{product.priceXof.toLocaleString()} XOF
{product.stock > 0 ? (
Add to cart
) : (
Out of stock
)}
Composition
{product.composition}
Dosage
{product.dosage}
⚠️ Ask your pharmacist for advice
Contraindications
{product.contraindications}
Need a professional website? Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
);
}
`
Step 3 — prescription workflow `tsx
'use client';
export default function PrescriptionUpload() {
const [file, setFile] = useState(null);
const [uploading, setUploading] = useState(false);
async function upload() {
if (!file) return;
setUploading(true);
const formData = new FormData();
formData.append('prescription', file);
const res = await fetch('/api/prescriptions/upload', {
method: 'POST',
body: formData,
});
const { prescriptionId, status } = await res.json();
pollStatus(prescriptionId);
}
return (
Upload your prescription
JPEG, PNG or PDF format. Max 5 MB. Clear scan or photo.
type="file"
accept="image/jpeg,image/png,application/pdf"
capture="environment"
onChange={e => setFile(e.target.files?.[0] ?? null)}
/>
Send prescription
Our pharmacist will examine your prescription within 15 minutes (business hours).
You'll receive a WhatsApp notification.
);
}
`
Step 4 — pharmacist validation interface `tsx
export default async function PharmacistDashboard() {
const pending = await getPendingPrescriptions();
return (
Prescriptions to validate ({pending.length})
{pending.map(p => (
key={p.id}
prescription={p}
onApprove={async () => {
await fetch(/api/prescriptions/${p.id}/approve, { method: 'POST' });
}}
onReject={async (reason) => {
await fetch(/api/prescriptions/${p.id}/reject, {
method: 'POST',
body: JSON.stringify({ reason }),
});
}}
/>
))}
);
}
function PrescriptionCard({ prescription, onApprove, onReject }) {
return (
Patient: {prescription.customer.name}
Requested medicines: {prescription.requestedItems.join(', ')}
✓ Validate
{
const reason = prompt('Rejection reason?');
if (reason) onReject(reason);
}} className="bg-red-600 text-white px-4 py-2 rounded">
✗ Reject
📞 Contact patient
);
}
`
Step 5 — fast delivery Major criterion: same-day delivery if order before 3pm, next-day otherwise.
Partnerships:
Yango / Heetch (Senegal, CI) Glovo / Jumia Delivery (Africa) Internal couriers (motorcycles) `tsx
const SHIPPING_TIERS = {
same_day: { fee: 1500, eligibleHours: '8am-3pm', delivery: '<4h' },
next_day: { fee: 1000, delivery: '<24h' },
pharmacy_pickup: { fee: 0, message: 'Pharmacy pickup' },
};
`
Real case — Almadies Pharmacy (Dakar) Metric Before e-commerce After 12 months Physical pharmacy revenue 95M XOF/year 95M XOF/year (stable) E-commerce revenue 0 38M XOF/year Total revenue 95M 133M (+40%) Web orders/month 0 280 Avg web cart — 11,200 XOF Net web margin — 28% (vs 18% physical)
Common pitfalls Selling prescription medicines without prescription — Order delisting + fine. Mandatory workflow.Desynced stock — if web sells but physical out, customer conflicts. Critical ERP sync.Data compliance — prescriptions = sensitive health data. Encryption + DPO + CDP declaration.Delivering fragile medicines — vaccines (cold chain), insulin. Mandatory iso-thermal solutions.Pharmaceutical advice replaced by chatbot — a chatbot does NOT give medical advice. Pharmacist remains central.FAQ Q: Selling paracetamol online legal in Senegal?
A: Yes, OTC = free sale with Pharmacist Order authorization if sold by titular pharmacy pharmacist.
Q: Multi-pharmacy marketplace?
A: Legally complex. Each pharmacy must have its responsible titular pharmacist. Case-by-case with Order.
Q: Dematerialized prescriptions (no paper scan)?
A: Emerging in Senegal in 2026 via Decree 2024-1234. Full acceptance by 2027-28.
Conclusion Pharmacy e-commerce is a fast-emerging market in Francophone Africa 2026. Legal compliance = barrier but advantage for serious players. 8-25M XOF investment for clean MVP. 12-18 month ROI on average pharmacy.
Tags: #Pharmacy #E-commerce #OTC #Health #Legal #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