Kais Center
Odoo 18 customisation for a Saudi accounting training centre: Arabic chart of accounts, Laravel marketing site reading cohort data live, completion rate jumped from 71% to 92%.
About the project.
Kais Center is a Saudi accounting training institute that runs its operations on Odoo 18 and its public face on a Laravel marketing site. I customised the Odoo accounting module for an Arabic chart of accounts that real Saudi firms recognise, and wired the marketing site to read cohort and seat data straight from Odoo so the team never has to update two places. Alongside the engineering, I taught two cohorts on the same stack so the staff could maintain it without me.
What changed.
modules taught
learners certified
completion rate
What we walked into.
A Saudi accounting training center wanted a working Odoo instance their students could actually log into, plus a public site that doubled as a sales surface for their cohorts.
What we did.
Odoo 18 customization for chart-of-accounts in Arabic, a Laravel marketing site that reads cohort data straight from Odoo, and a curriculum management view that lets the head trainer reorder modules without writing a line of code.
What it became.
Six modules taught across three live cohorts. 92% completion rate on the second cohort, up from 71% on the first.
My role on this project.
Solo · end-to-end. I customised the Odoo instance (Python + XML + PostgreSQL), built the Laravel marketing site, wired them together with a thin Odoo XML-RPC bridge, taught two cohorts on the same stack, and trained their staff to maintain it without me. No agency, no co-engineer.
Odoo engineer
Customised chart-of-accounts, invoice templates, and student-portal modules. Authored Python views + XML form definitions. Production data migration from the legacy spreadsheet workflow.
Laravel developer
Public marketing site reading cohort/seat/instructor data live from Odoo via XML-RPC. Bilingual content model, lead form pushing into Odoo CRM directly.
Trainer + curriculum designer
Taught two cohorts on accounting + Odoo basics. Wrote the curriculum and the staff handover playbook so the centre could maintain the platform alone after delivery.
Database + DevOps
PostgreSQL backups + restore drills. Odoo upgrade path documented. Domain + TLS + nginx vhost configured on the centre's VPS.
The numbers that matter.
- 92%Cohort 2 completion rateUp from 71% on Cohort 1 — improvement after curriculum + portal rework.
- 3Live cohorts taughtEach cohort runs 6 modules over 12 weeks.
- ~60Active studentsAcross cohorts to date — modest, by design (small-group training format).
- ~40%Lead-to-cohort time cutEstimated from staff feedback — single-form intake replaced manual spreadsheet handoff.
- BilingualArabic-first chart of accountsAccount names + report headers in Arabic, matching what real Saudi firms read.
- 0Sync drift eventsMarketing site + Odoo never drift — there is no second copy of cohort data to drift from.
What was actually broken.
Most Saudi accounting institutes either run on PowerPoint + WhatsApp or pay for closed-source LMS platforms that do not speak Arabic well and cannot model the actual accounting tools (debit/credit, chart-of-accounts, multi-currency) that students need to practise on. Kais wanted students to log into a real Odoo instance — the same ERP they would later configure for clients — not a sandboxed simulator. The public marketing site had to sell cohorts AND surface live availability without the staff updating two places.
The hard surface area.
- 01Reading live Odoo cohort + seat data from the public Laravel marketing site without exposing the Odoo admin surface to the internet or duplicating data into a second DB.
- 02Arabic chart-of-accounts that matches what Saudi firms actually use — not a transliteration of the default English COA. Required collaboration with the head trainer + cross-checks against real client books.
- 03Single-source-of-truth for student-portal credentials: students must log into the same Odoo their instructors use, with restricted permissions, not a "training mirror".
- 04Lead form on the marketing site pushes directly into Odoo CRM as a qualified lead — no copy-paste between systems, no lost enquiries.
- 05Curriculum management UI that lets the head trainer reorder modules and adjust capacity without touching Python or PostgreSQL.
Engineering wins worth naming.
Live-read without exposing Odoo
Built a thin Laravel proxy that hits Odoo XML-RPC over the internal network, caches results for 60 seconds in Redis, and serves them to the public site. Odoo never accepts a request from the open internet.
Arabic COA without breaking Odoo conventions
Used Odoo's `code` field for stable English codes (used by reports and integrations) while overriding `name` with Arabic per the head trainer's draft. Reports render in Arabic; integrations stay safe.
Student-instructor role split
Custom Odoo security group with row-level access controls so students see their own grades + their cohort's shared exercises, but not other students' work or instructor notes. Tested against horizontal privilege escalation.
How the system is wired.
Public marketing tier
Internal app tier
Data + backup tier
The decisions behind each choice.
Odoo 18 (ERP core)
- Real accounting ERP students will encounter in production — not a toy LMS that simulates accounting badly.
- Open-source Python codebase the centre can audit + customise without vendor lock-in.
- Native multi-company + multi-currency + Arabic support out of the box.
Laravel (marketing site)
- Same stack as the centre's other tools so they can maintain it after handover.
- Blade templating + Tailwind keeps the editing experience approachable for non-engineers on the team.
- First-class XML-RPC client + Redis driver — the Odoo bridge is 80 lines, not 800.
PostgreSQL (Odoo-native)
- Odoo standard — switching to MySQL means losing all the production-proven Odoo migrations.
- Native JSONB columns used for translation overlays + per-cohort metadata.
What the build taught us.
- When the goal is teaching a tool, students learn faster inside the real tool than inside a simulator. The harder setup paid off in completion rate.
- A 60-second Redis cache between a public site and an internal ERP is enough security + performance for SMB scale. Never expose Odoo directly.
- Arabic-first content model is not "translate the labels at the end" — it is a database design decision. Plan the COA in Arabic, then back-fill English codes.
