Why WhatsApp Bots Are One of the Best Businesses to Start in Africa Right Now
WhatsApp has 2.8 billion users globally. In Nigeria alone, over 90 million people use it daily — more than any other communication tool. Yet most businesses still respond to customer messages manually, one by one, for hours every day.
That gap is your business.
A WhatsApp bot handles FAQs, takes orders, qualifies leads, books appointments, and sends reminders — automatically. Businesses that understand this will pay ₦30,000 to ₦200,000 per month for a bot that saves their staff 30+ hours of repetitive work.
You build it once. You charge monthly. You maintain it in a few hours per week.

Understanding the Market
Before you write a single line of code, understand who you're selling to.
Ideal Clients
| Business Type | Problem They Have | What the Bot Solves |
|---|---|---|
| Restaurants | Answering "what's on the menu?" 50x per day | Menu bot, reservation booking |
| Salons & spas | Manual appointment booking via chat | Appointment scheduler |
| Clinics | Patient FAQs, appointment reminders | FAQ bot + reminder system |
| Real estate agents | Lead qualification taking hours | Auto-qualifier, viewing scheduler |
| E-commerce stores | Order tracking, return queries | Order status, return initiation |
| Schools | Fee payment queries, timetable requests | Info bot, payment confirmation |
Pricing Reality
| Service Tier | What's Included | Monthly Price |
|---|---|---|
| Basic | FAQ bot, menu/info display | ₦30,000 – ₦60,000 |
| Standard | FAQ + appointment booking + lead capture | ₦60,000 – ₦120,000 |
| Premium | Full automation + CRM integration + analytics | ₦120,000 – ₦250,000 |
| Enterprise | Multi-location + custom workflows + SLA | ₦250,000+ |
At 5 Standard clients, that's ₦400,000–₦600,000/month. Your stack costs roughly ₦35,000/month total.
The Free Stack (Start With This)
| Tool | Purpose | Free Limit | Monthly Cost |
|---|---|---|---|
| Twilio WhatsApp Sandbox | Testing (not production) | Free | $0 |
| Meta WhatsApp Business API | Production messaging | Free to set up | Per-message fees |
| Node.js + Express | Bot server | Free | $0 |
| Railway.app | Server hosting | $5 free credits/month | $5–$10 |
| Supabase | Database for bot state | 500MB free | $0 |
| n8n (self-hosted) | Advanced workflows | Free | $0 (you host it) |
Total: ₦0–₦8,000/month for the first 3 clients
The Paid Stack (When You Have 10+ Clients)
| Tool | Purpose | Monthly Cost | Why Upgrade |
|---|---|---|---|
| Twilio WhatsApp API | Production messaging | ~$0.005/message | More reliable, better support |
| DigitalOcean Droplet | Dedicated server | $12/month | More resources, better uptime |
| Supabase Pro | Database | $25/month | More storage, daily backups |
| Typebot or Botpress | Visual bot builder | $39/month | Manage client bots without code |
Step-by-Step: Building Your First Bot
Step 1: Set Up Your Development Environment
mkdir whatsapp-bot && cd whatsapp-bot
npm init -y
npm install express twilio dotenv
Create a .env file:
TWILIO_ACCOUNT_SID=your_account_sid
TWILIO_AUTH_TOKEN=your_auth_token
TWILIO_WHATSAPP_NUMBER=whatsapp:+14155238886
PORT=3000
Step 2: Build the Core Bot Engine
// server.js
require('dotenv').config()
const express = require('express')
const { MessagingResponse } = require('twilio').twiml
const app = express()
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
// In-memory session store (replace with Supabase in production)
const sessions = new Map()
// Bot configuration — customise per client
const BOT_CONFIG = {
businessName: 'Lagos Grill Restaurant',
greeting: 'Hello! Welcome to Lagos Grill. How can I help you today?',
menu: {
trigger: ['menu', 'food', 'what do you have', '1'],
response: `*Our Menu* 🍽️
*Starters*
- Peppered Snail — ₦2,500
- Suya Platter — ₦3,500
*Main Courses*
- Jollof Rice + Chicken — ₦4,500
- Pepper Soup (Goat) — ₦5,000
- Fried Rice + Fish — ₦4,000
*Drinks*
- Fresh Juice — ₦1,500
- Malt/Soft Drinks — ₦500
Reply *ORDER* to place an order or *HOURS* for opening times.`
},
hours: {
trigger: ['hours', 'open', 'time', '2'],
response: `*Opening Hours* ⏰
Monday – Saturday: 11am – 10pm
Sunday: 12pm – 9pm
We're located at 14 Awolowo Road, Ikoyi, Lagos.
Reply *MENU* to see our menu or *BOOK* to make a reservation.`
},
booking: {
trigger: ['book', 'reservation', 'reserve', 'table', '3'],
response: `To book a table, please provide:
1. Your name
2. Number of guests
3. Preferred date and time
4. Any special requests
Our team will confirm your booking within 30 minutes.
Or call us directly: 0801 234 5678`
}
},
function getResponse(inboundMessage, phoneNumber) {
const msg = inboundMessage.toLowerCase().trim()
// Check for menu trigger
if (BOT_CONFIG.menu.trigger.some(t => msg.includes(t))) {
return BOT_CONFIG.menu.response
}
// Check for hours trigger
if (BOT_CONFIG.hours.trigger.some(t => msg.includes(t))) {
return BOT_CONFIG.hours.response
}
// Check for booking trigger
if (BOT_CONFIG.booking.trigger.some(t => msg.includes(t))) {
return BOT_CONFIG.booking.response
}
// Default greeting for new sessions
if (!sessions.has(phoneNumber)) {
sessions.set(phoneNumber, { started: Date.now() })
return BOT_CONFIG.greeting + '\n\nReply with:\n*1* or MENU — View our menu\n*2* or HOURS — Opening times\n*3* or BOOK — Make a reservation'
}
// Fallback
return "I didn't quite catch that. Reply with:\n*1* — Menu\n*2* — Hours\n*3* — Book a table\n*HUMAN* — Talk to our team"
},
app.post('/webhook', (req, res) => {
const inboundMessage = req.body.Body || ''
const phoneNumber = req.body.From || ''
const reply = getResponse(inboundMessage, phoneNumber)
const twiml = new MessagingResponse()
twiml.message(reply)
res.type('text/xml').send(twiml.toString())
})
app.listen(process.env.PORT, () => {
console.log(`Bot running on port ${process.env.PORT}`)
})
Step 3: Make It Client-Configurable
Instead of hardcoding each client's config, store it in Supabase:
-- In Supabase SQL Editor
create table bot_configs (
id uuid primary key default gen_random_uuid(),
client_name text not null,
phone_number text unique not null,
config jsonb not null,
active boolean default true,
created_at timestamptz default now()
);
-- RLS: service key only
alter table bot_configs enable row level security;
create policy "service only" on bot_configs for all
using (auth.role() = 'service_role');
Now fetch the config dynamically:
// In your webhook handler
const { data: client } = await supabase
.from('bot_configs')
.select('config')
.eq('phone_number', req.body.To) // bot's number
.eq('active', true)
.single()
const config = client?.config || DEFAULT_CONFIG
This means one codebase runs every client's bot. Adding a new client is just inserting a row in Supabase.
Step 4: Deploy to Railway
# Install Railway CLI
npm install -g @railway/cli
# Login and deploy
railway login
railway init
railway up
Railway gives you a public URL like https://your-bot.railway.app. That becomes your Twilio webhook URL.
Step 5: Getting Clients
The Cold Walk-In Pitch
Walk into any restaurant, salon, or clinic that you can see is handling WhatsApp manually. The evidence is usually obvious: a phone sitting on the counter with someone typing, a notice saying "WhatsApp us at 08X..." on a printed flyer.
Your opening line: "How many WhatsApp messages does your business get per day?"
When they say 20–100 (they always do), follow with: "What if your phone handled all of those automatically, 24/7, while your staff focused on actually serving customers?"
Show them a demo on your phone. A live bot they can message right now. That closes the conversation.
The Discovery Questions That Sell
| Question | Why You're Asking It |
|---|---|
| "How many WhatsApp messages do you get per day?" | Establishes the pain quantitatively |
| "Who answers them right now?" | Identifies who's losing time |
| "What are the 5 most common questions?" | This becomes your bot's menu |
| "What happens when you miss a message at night?" | Gets them imagining lost revenue |
| "Have you tried any other solution for this?" | Positions you against their alternatives |
The Proposal Structure
Keep proposals simple. One page. Three sections:
- The Problem: "Your team answers 50+ repetitive WhatsApp messages daily. That's 3+ hours of staff time that could go toward serving customers."
- The Solution: "A custom WhatsApp bot that handles [their top 5 questions] automatically, 24/7, with a human handoff option."
- The Investment: "₦80,000/month. Includes setup, monthly maintenance, and unlimited message volume."
Scaling From 1 to 10 Clients
What Changes at Scale
| Stage | Clients | Key Challenge | Solution |
|---|---|---|---|
| Starting | 1–3 | Building the first one | Focus on one industry |
| Growing | 4–7 | Managing multiple configs | Supabase multi-tenant setup |
| Scaling | 8–15 | Client support time | Build a client portal |
| Mature | 15+ | Technical complexity | Hire a junior dev or use Botpress |
The Client Portal (Build This at 5 Clients)
A simple dashboard where clients can:
- View their bot's conversation history
- Edit their menu/FAQ responses
- See response time analytics
- Submit change requests
This reduces your support time dramatically and increases perceived value — clients who can see their bot working are far less likely to cancel.
What Could Go Wrong (And How to Prevent It)
| Risk | Likelihood | Prevention |
|---|---|---|
| Twilio outage | Low | Set up Supabase logs so you get alerts when messages stop |
| Client wants complex custom feature | High | Define scope clearly in the contract — "extras" are billed separately |
| Server goes down at 2am | Medium | Set up Railway health checks and uptime monitoring via UptimeRobot (free) |
| Client cancels after month 1 | Medium | Lock clients into 3-month minimum contracts |
| Messages cost more than expected | Low | Set Twilio spending limits per client |
The Real Numbers at 6 Months
A solo developer who follows this guide consistently:
- Month 1: 1 client, ₦80,000 revenue, ₦12,000 costs, ₦68,000 profit
- Month 2: 2 clients, ₦160,000 revenue, ₦15,000 costs, ₦145,000 profit
- Month 3: 4 clients, ₦320,000 revenue, ₦25,000 costs, ₦295,000 profit
- Month 6: 8 clients, ₦640,000 revenue, ₦45,000 costs, ₦595,000 profit
That is a ₦595,000/month business running on approximately 20 hours of work per week.

