Odoo 20 migration, automation and a WhatsApp management agent for a field-services firm
We moved a Nairobi cleaning and moving company to Odoo 20, automated its billing, jobs and WhatsApp messages, and gave its directors dashboards, a daily briefing and a pilot read-only AI agent.
- Nairobi cleaning and moving company
- Kenya
- 2026
The starting point
The company ran sales, invoicing, field jobs and payroll on Odoo 19, on a server it was leaving. Invoices, job scheduling and payment follow-up depended on staff remembering to do them, and the directors had no single view of cash, sales and jobs. They needed a safe move to Odoo 20, routine work handled by the system, and answers they could get from their phones.
What we delivered
- Odoo 19 to 20 migration onto a new server, with an audit that compared the migrated database against production before go-live
- Fixes for what the migration broke, including a KES price list and sales orders relabelled as USD and six reset number sequences
- A website with seven service pages, a quote form that creates CRM leads and an online shop, running in the same Odoo database
- Billing and job automation, with deposit and balance invoices from confirmed orders and one Field Service job per confirmed order
- WhatsApp invoice messages from the official WhatsApp Business number; job-arrival messages and payment reminders at 7, 30 and 60 days are built and switch on once Meta approves their templates
- Four director dashboards (cash, sales, jobs, expenses) and a daily briefing that checks 46 rules and assigns each item to an owner
- A pilot read-only management AI agent on WhatsApp for the directors, which passed its evaluation gate, with payroll, HR and expense data blocked and phone numbers, emails, ID numbers, KRA PINs and bank account numbers masked
- M-Pesa Daraja STK Push and Paybill reconciliation, built and tested but not yet live, awaiting the production Paybill keys
In numbers
Each figure comes from the project's own records and shows the month we verified it.
135
payslips missing from the migrated database, caught before go-live
513
sales orders the migration relabelled from KES to USD, restored before go-live
46
rules checked by the directors' daily briefing
25/25
evaluation cases the management agent passed before its pilot began
The starting point
A Nairobi cleaning and moving company ran its whole business on Odoo 19: quotes and sales orders, invoices, field jobs, expenses and payroll. It was moving to Odoo 20 on a new server. The owner wanted the move to do more than change version numbers. Routine work should run by itself, and the directors should know each morning what needed their attention.
Checking the data before trusting it
Before go-live we compared the migrated database with production. Sales, invoices, payments, bank lines, expenses and employees matched. Three things did not.
None of the 135 payslips had come across, and neither had some draft journal entries and stock transfers. The migration had relabelled the KES price list and all 513 sales orders as US dollars. And six number sequences had been reset, so the next sales order would have been S00001.
We fixed the currency and the sequences in code, with tests, so the fix ran the same way on every copy of the database. The owner decided how to treat the missing historical records, which are kept in a final backup of the old system. We found it by counting, not by clicking through screens.
Routine work, done by the system
Confirming an order now starts the rest of the process. Billing rules raise a deposit invoice at confirmation for residential jobs and a balance invoice on completion. Deposits can be switched off with one setting, and the owner has since done so. Each confirmed order creates one Field Service job, with a scheduling to-do for the salesperson.
Invoice messages go to customers on WhatsApp from the company’s official WhatsApp Business number. The job-arrival message is built and goes live once Meta approves its template. Payment reminder levels at 7, 30 and 60 days are configured and will be switched on once payment records are up to date and Meta approves the reminder template.
We built M-Pesa payments directly on Safaricom’s Daraja API: STK Push for paying an order, and Paybill reconciliation that matches each payment to the invoice or order number the customer types. A payment against an order number pays that order’s open invoices oldest first, deposit first, and anything unmatched goes to a review list. It is built and tested but not live yet. It goes live when the production Paybill keys are issued; until then, shop customers pay on pickup or delivery.
We also removed 64 Odoo modules for AI, OCR, SMS, letters and in-app purchases, so the company is never billed for credits it did not ask for.
What the directors see
Four dashboards cover cash, sales, jobs and expenses, with read-only access for the directors. Every morning a briefing page checks 46 rules across accounts, payroll, jobs, sales and the website: bank and M-Pesa lines not matched, overdue invoices, expenses without receipts, jobs waiting to be scheduled. Each item names an owner, links straight to the filtered list in Odoo and becomes a to-do. Anything still open after three days is escalated. An evening update reaches the directors on WhatsApp.
A management agent on WhatsApp, in pilot
In a pilot, the directors ask the business questions in a WhatsApp chat. How much came in yesterday? Who owes us the most? Which jobs are still to schedule?
The agent is read-only. It uses each director’s own Odoo access, so it can see only what that director can see. Payroll, HR and expense data are blocked. Phone numbers, emails, ID numbers, KRA PINs and bank account numbers are masked before anything reaches the AI model. Customers who message the same number never reach the agent; their messages stay with staff as before.
Before the pilot began, the agent had to pass an evaluation gate. It passed all 25 evaluation cases, including all 11 safety cases. It remains a pilot for this company’s directors, being evaluated in daily use, not a product deployed for other clients. Changing the AI provider later is a configuration change, not a rebuild.
What it runs on
- Odoo 20 Enterprise
- Python
- PostgreSQL
- WhatsApp Business API
- M-Pesa Daraja
- TypeScript
- Docker
- nginx
Find out what your systems could run on their own
Start with a free 30-minute automation audit. We look at how your team works across WhatsApp, M-Pesa and other mobile money, your bank, Odoo and eTIMS, and you leave with a one-page map of what to automate first.