Skip to main content
M-PESA Express Payment Base for Odoo — A build-to-order base module that wires M-PESA Express (STK Push) into Odoo as a first — 1/1Illustrative preview

A build-to-order base module that wires M-PESA Express (STK Push) into Odoo as a first-class payment provider

for both e-commerce checkout and Point of Sale.

ECOSIRE scopes, builds, installs, and supports it — this is not an off-the-shelf download.

What is M-PESA Express Payment Base for Odoo?

A build-to-order base module that wires M-PESA Express (STK Push) into Odoo as a first-class payment provider for both e-commerce checkout and Point of Sale. ECOSIRE scopes, builds, installs, and supports it — this is not an off-the-shelf download. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

Custom `payment.provider` and `payment.transaction` records so M-PESA Express appears as a native Odoo acquirer, selectable per company and per currency in test or live mode
STK Push (prompt-on-phone) initiation from `website_sale` checkout and the customer invoice portal, opening the transaction in `pending` until the operator responds
Secured, signature-gated callback controller that receives the asynchronous result, validates amount/currency/reference, and transitions the transaction to `done` or `error`
Custom `pos.payment.method` with an OWL payment-line UI: cashier-initiated prompt, live push/poll status, cancel and retry at the terminal
Credentials (consumer key/secret, shortcode, passkey) stored encrypted on the provider record — no hard-coded secrets, separate sandbox and production sets
Service layer for token retrieval, push initiate and status query with per-call timeout, retry, and idempotency keys to prevent double-charge/double-post
Dedicated request/callback log model for full audit trail, dispute evidence, and troubleshooting of every outbound and inbound message
Status-query fallback (`ir.cron` automated action) that reconciles transactions left `pending` when a callback is delayed or lost
Automatic posting against the originating `sale.order`, `pos.order`, or `account.move` using Odoo's standard confirm-and-reconcile flow
Access governed by `ir.model.access.csv` plus record rules — only Payment/POS managers reach credentials and transaction internals
Configurable phone-number normalization and amount/currency validation before a push is sent, rejecting malformed requests early
Overridable methods on the provider and transaction models plus a documented JSON/XML-RPC surface for clean downstream extension
Built and tested against your target Odoo 17.0, 18.0, or 19.0 line, respecting Community vs Enterprise module availability
Test-mode sandbox toggle so UAT runs true end-to-end STK pushes without moving real money

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

Odoo Compatibility
Odoo 17, Odoo 18, Odoo 19
Editions
Enterprise & Community
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
PostgreSQL 12+

About this Product

If you collect mobile-money payments today, the reconciliation gap is where the pain lives. A customer pays on their phone, a confirmation arrives in a separate portal or by SMS, and someone re-keys the amount and reference into Odoo by hand — or worse, marks a sales order paid on trust and chases the mismatch at month-end. Odoo core ships a generic payment provider framework and a pos.payment.method, but neither speaks the STK Push (prompt-on-phone) flow natively: there is no built-in provider that initiates a push request, waits on an asynchronous result callback, verifies the operator reference, and posts the payment against the right sale.order, pos.order, or account.move automatically. That last-mile automation is exactly what teams end up doing by hand, and it is what this base module removes.

We build a proper Odoo payment provider that extends the standard payment.provider and payment.transaction models so M-PESA Express behaves like any other acquirer in your database — configurable per company, per currency, in test or live mode, with credentials stored on the provider record (encrypted) rather than hard-coded. On the e-commerce and invoice-portal side, checkout triggers an STK Push to the shopper's number; the module opens a payment.transaction in pending, and a secured controller endpoint receives the operator's asynchronous result callback, validates it (amount, currency, reference and a shared-secret/signature check), then transitions the transaction to done or error and lets Odoo's native flow confirm the order and post the journal entry. On the POS side we register a custom pos.payment.method with an OWL-based payment line UI so a cashier can send the prompt, see live push/poll status at the terminal, and cancel or retry — the session closes cleanly because the payment is a real pos.payment tied to a verified transaction, not a manual note.

Under the hood the integration is built to hold up in production. Outbound calls (access-token retrieval, STK push initiate, status query) run through a small service layer with timeout, retry and idempotency handling so a dropped network response never double-charges or double-posts; every request and callback is written to a dedicated log model for audit and dispute resolution. Access is governed by ir.model.access.csv plus record rules so only Payment/POS managers see credentials and transaction internals, and the callback controller is CSRF-exempt but signature-gated. The provider is delivered against your target Odoo line — 17.0, 18.0 or 19.0 — and respects the Community vs Enterprise split (works on Community point_of_sale and website_sale; Enterprise-only touchpoints are only wired if your edition has them). Because it is a base module, it exposes clean extension hooks (overridable methods on the transaction and provider, plus the JSON/XML-RPC surface) so future add-ons — bill/paybill vs buy-goods flows, reversals, C2B/B2C, scheduled reconciliation via an ir.cron automated action — layer on without a rewrite.

Delivery is build-to-order: nothing is pre-downloaded. After a short scoping call we confirm your Odoo version and edition, sandbox vs production credentials, the currencies and companies in scope, and whether you need POS, e-commerce, or both. We build against a staging copy of your database, run UAT with you (test-mode STK pushes end to end), then install to production with a rollback plan and hand over the git repository. Typical delivery is one working week from confirmed scope. Pricing starts from $999 (indicative, single-company base scope covering one Odoo edition and the sandbox integration); multi-company or multi-currency setups, additional flows (buy-goods vs paybill, refunds/reversals, B2C payouts), deeper localization, and historical payment data migration increase the quoted scope.

What you get

  • Installable source code for your build — the module targeted to your exact Odoo version (17.0/18.0/19.0) and edition
  • On-staging installation plus production install and configuration of the payment provider and POS method
  • Technical documentation: models, controller endpoints, configuration fields, extension hooks, and the callback contract
  • End-user and cashier guide covering checkout and POS payment flows, plus a live training session for your team
  • Post-go-live support window for defect fixes and configuration adjustments after launch
  • UAT on a staging copy of your database with a documented rollback plan before any production change
  • Git repository handover with full commit history and README
  • Credential-and-environment setup checklist (sandbox vs production) so your team can rotate keys safely

Who this is for

Odoo-run retailer with a physical counter

Runs Point of Sale in Odoo and wants cashiers to trigger a phone prompt and see it confirm at the terminal, so shift close reconciles without manual mobile-money entries.

Online store or service business on `website_sale`

Sells via Odoo e-commerce or the invoice portal and needs checkout to push a payment prompt, auto-confirm the order on a verified callback, and post the journal entry cleanly.

Finance / accounting manager

Owns month-end and wants every mobile-money receipt matched to its order and journal entry automatically, with an auditable log for disputes instead of re-keyed references.

IT lead or Odoo partner

Needs a maintainable base provider with clean extension hooks and the RPC surface, delivered against their edition, so future flows (reversals, payouts, paybill vs buy-goods) layer on without a rewrite.

How M-PESA Express Payment Base for Odoo Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
How you get itBuilt to order for your database, then installed and supported by usYou brief and manage an in-house or freelance buildInstant download, then you self-configure and adaptNothing to install — no STK Push provider exists in core
STK Push + callback handlingSignature-gated callback, validation, retry and idempotency built inDepends entirely on your developer's rigorOften present but you inherit its assumptions and edge casesNot available
POS integrationCustom `pos.payment.method` with OWL live-status payment lineMust be designed and built from scratchMay be e-commerce-only or a separate paid add-onOnly generic/manual POS payment methods
Version & edition fitTargeted to your 17.0/18.0/19.0 and Community/EnterpriseWhatever you specify and testPinned to the versions the vendor chose to publishShips with your Odoo but has no such provider
Reconciliation & auditAuto-posts to the source order; dedicated request/callback log modelOnly if you build the logging and matching yourselfVaries; audit logging is often thinManual matching and re-keying
ExtensibilityDocumented hooks + RPC surface for reversals/payouts/paybill laterAs clean as your own architectureBounded by the vendor's code you cannot see roadmap forN/A
Ongoing supportPost-go-live window plus optional upgrade engagementsYou own all maintenance and upgradesTicket-based, shared queue, no context on your setupCommunity/your own team
Total cost shapeIndicative from $999, fixed quote after scopingUnbounded developer time and riskLow sticker price, hidden config/adaptation costFree but leaves the manual work with you

Frequently Asked Questions about M-PESA Express Payment Base

Is this a ready-to-download app from the Odoo app store?

No. This is a build-to-order module. ECOSIRE builds it against your specific Odoo version, edition, and payment configuration, then installs and supports it. There is no instant download — you request a quotation and we scope it with you first.

How long does delivery take?

Typical delivery is one working week from confirmed scope. The clock starts once we have agreed the Odoo version and edition, sandbox and production credentials, currencies and companies in scope, and whether you need POS, e-commerce, or both. Larger multi-company or multi-flow builds sit at the upper end of that range.

How does pricing and scoping work?

Pricing starts from $999 as an indicative single-company base scope. It is not a fixed price: after a short scoping call we give you a firm fixed quote. Drivers that move the number include multi-company/multi-currency, extra flows (buy-goods vs paybill, refunds/reversals, payouts), localization depth, and any historical payment-data migration.

What about support and future Odoo updates?

Every build includes a post-go-live support window for defect fixes and configuration adjustments. Beyond that we offer ongoing support and version-upgrade work (for example moving your build from 18.0 to 19.0) as a separate engagement, since the operator's API and Odoo's payment framework both evolve.

Which Odoo versions and editions do you support?

We build against Odoo 17.0, 18.0, and 19.0. The provider and e-commerce flow work on Community (`point_of_sale`, `website_sale`); where your edition is Enterprise we only wire Enterprise-only touchpoints that actually exist in your database. We confirm your exact version and edition during scoping.

Do we need our own operator/payment credentials?

Yes. You supply your own sandbox and production credentials (consumer key/secret, shortcode, passkey). They are stored encrypted on the Odoo provider record — never hard-coded — and we run UAT against the sandbox before switching to production. We can guide your team through obtaining and rotating them.

Can it handle both POS and online checkout at once?

Yes. The base module covers a custom `pos.payment.method` for the counter and the standard `payment.transaction` flow for `website_sale`/invoice-portal checkout. You can commission one or both; the shared provider record and callback layer are reused across them.

Request a quote

M-PESA Express Payment Base

A build-to-order base module that wires M-PESA Express (STK Push) into Odoo as a first-class payment provider for both e-commerce checkout and Point of Sale. ECOSIRE scopes, builds, installs, and supports it — this is not an off-the-shelf download.

  • Custom `payment.provider` and `payment.transaction` records so M-PESA Express appears as a native Odoo acquirer, selectable per company and per currency in test or live mode
  • STK Push (prompt-on-phone) initiation from `website_sale` checkout and the customer invoice portal, opening the transaction in `pending` until the operator responds
  • Secured, signature-gated callback controller that receives the asynchronous result, validates amount/currency/reference, and transitions the transaction to `done` or `error`
  • Custom `pos.payment.method` with an OWL payment-line UI: cashier-initiated prompt, live push/poll status, cancel and retry at the terminal

Request a Quotation

Tell us about your M-PESA Express Payment Base requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.