Skip to main content
DPO Pay Gateway for Odoo — A build-to-order Odoo payment provider that connects checkout, invoicing and subscriptions to DPO  — 1/1Illustrative preview

A build-to-order Odoo payment provider that connects checkout,

invoicing and subscriptions to DPO Group so African merchants can take card, mobile-money and bank payments in local currencies. ECOSIRE scopes, builds, installs and supports it — it is not an instant apps.odoo.com download.

What is DPO Pay Gateway for Odoo?

A build-to-order Odoo payment provider that connects checkout, invoicing and subscriptions to DPO Group so African merchants can take card, mobile-money and bank payments in local currencies. ECOSIRE scopes, builds, installs and supports it — it is not an instant apps.odoo.com 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

New `payment.provider` with `code='dpo'`, split test/live credentials (Company Token, service IDs, endpoint) stored as encrypted fields on the provider form
`payment.transaction` extended to call DPO's XML/Direct API: `createToken` to open, hosted `payURL` redirect, `verifyToken` for authoritative final state
Card, mobile money (M-Pesa, MTN MoMo, Airtel Money, Tigo Pesa) and bank rails routed through one transaction via a per-currency DPO service-type map
Multi-currency pan-African support (KES, TZS, UGX, ZMW, GHS, RWF, NGN, ZAR and more) with per-country service selection
Server-side notification controller re-verifies every payment with `verifyToken` — the browser redirect is never trusted to set `done`
State machine wired to Odoo natives: `_set_pending`/`_set_done`/`_set_canceled` auto-post `account.payment`, confirm the SO and validate the invoice
Idempotency keyed on the DPO transaction reference so retried or duplicated webhooks cannot double-post a payment
Token-based recurring: DPO token stored against the partner and charged from a scheduled `ir.cron` automated action for subscription/recurring invoices
Webhook reconciliation view that matches DPO settlement references to `account.move` lines and flags mismatches for finance
`ir.model.access.csv` access rights plus record rules scoping provider config and transaction data to the right groups/company
Full multi-company / multi-website support so each brand or country entity can carry its own DPO service credentials
QWeb payment-receipt report and transaction data exposed over the standard XML-RPC/JSON-RPC API for external finance tooling
Chatter and audit logging on every transaction state change, plus refund/void handling mapped back to DPO where the account permits
Configurable payment-status and error mapping so declines, timeouts and pending mobile-money confirmations surface clearly to the shopper

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

Merchants across Africa lose sales at checkout because Odoo core ships no DPO Group integration. Out of the box, payment only wires the generic providers (Stripe, PayPal, Adyen, wire transfer, demo), none of which cover the DPO reality of pan-African cards plus mobile money (M-Pesa, MTN MoMo, Airtel Money, Tigo Pesa) settled in KES, TZS, UGX, ZMW, GHS, RWF, ZAR and more. Teams end up reconciling DPO settlements by hand against Odoo invoices, or bolting a half-finished script onto sale/account that breaks on the next upgrade. The gap is not a config toggle — it is a real payment.provider implementation Odoo does not include.

ECOSIRE builds a proper DPO provider as a first-class Odoo module. We add a payment.provider record with code='dpo', its own __manifest__.py declaring the payment (and payment_custom) dependencies, and a models.Model layer that extends payment.transaction to speak DPO's XML/Direct API — createToken to open a transaction, the hosted payURL redirect for the customer, and verifyToken to confirm the final state. Provider credentials (Company Token, service IDs, endpoint, currency map) live on the provider form as encrypted fields, split cleanly between test and live so you can validate on staging before go-live. Card, mobile-money and bank rails are all routed through the same transaction, with a per-currency service-type map so each country charges the right way.

Technically, the money path is event-driven, not screen-scraped. A controller route receives DPO's redirect and back-channel notification, we re-verify server-side with verifyToken (never trusting the browser round-trip), and the transaction is moved through _set_pending, _set_done or _set_canceled so Odoo's own state machine posts the payment, confirms the sale order and validates the invoice via account.move. Idempotency is enforced on the DPO transaction reference so a retried webhook cannot double-post. For subscriptions, we store the DPO token against the customer and drive tokenized recurring charges from a scheduled ir.cron automated action, so sale.subscription/recurring invoices settle without re-prompting the cardholder. Access is locked down with ir.model.access.csv plus record rules on the provider and transaction data, and every state change is written to the chatter and to download/audit logs for reconciliation. Where you need branded proof of payment, we ship a QWeb report and expose the transaction over the standard XML-RPC/JSON-RPC API for your finance tooling.

Because this is build-to-order, you are not downloading a frozen zip and hoping it fits. We start from a short scoping call to confirm your DPO service configuration, the exact countries and currencies, whether you need mobile money and/or recurring, and which Odoo edition and version you run — the module is delivered targeting your Odoo 17.0, 18.0 or 19.0 database and works on both Community and Enterprise (Enterprise adds the accounting-automation and subscription niceties; on Community we wire the equivalents against account and cron). Typical delivery is one working week from confirmed scope. You receive installable source, a staging UAT with a rollback plan, documentation, a training session and a post-go-live support window — and the full git repository, so the code is yours.

What you get

  • Installable module source code targeting your exact Odoo edition and version (17.0 / 18.0 / 19.0)
  • Installation and configuration on your environment, including DPO test/live credential wiring and currency/service mapping
  • Technical documentation: manifest, models, controller routes, cron jobs, security rules and DPO API mapping
  • End-user guide plus a live training session for your finance and store-operations team
  • UAT on a staging database with sandbox DPO transactions and a documented rollback plan
  • Post-go-live support window for defect fixes and configuration adjustments
  • Full git repository handover — the source code and history are yours to keep

Who this is for

African travel / retail merchant on DPO

Already collects card and mobile-money payments through DPO Group and wants those same rails inside Odoo eCommerce and invoicing, in local currency, without manual reconciliation.

Multi-country e-commerce operator

Sells across Kenya, Tanzania, Uganda, Ghana or Zambia from one Odoo database and needs per-country currency and mobile-money routing under a single provider configuration.

Finance / accounts controller

Wants every DPO settlement to reconcile automatically against the matching `account.move`, with idempotent webhooks, an audit trail and QWeb receipts, instead of a spreadsheet at month-end.

Subscription or membership business

Runs recurring billing and needs tokenized DPO charges driven from a scheduled cron so renewals settle without re-prompting the cardholder each cycle.

How DPO Pay Gateway for Odoo Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
DPO Group support in OdooPurpose-built `payment.provider` with `code='dpo'`You build the provider yourself from scratchVaries; many listings are thin or unmaintainedNone — DPO not shipped in Odoo core
Fit to your version / editionBuilt for your exact 17/18/19 on Community or EnterpriseWhatever you scope and can maintainOften one version; upgrade at your riskGeneric providers only, no DPO
Mobile money + multi-currencyPer-currency service map across pan-African railsPossible but you design the whole mappingFrequently cards-only or single-countryNot applicable
Webhook verification & reconciliationServer-side `verifyToken`, idempotent, `account.move` matchingMust be built and hardened by youInconsistent; some trust the browser redirectN/A
Tokenized recurring billingDPO token + `ir.cron` scheduled chargesSignificant extra build effortRarely includedNot available for DPO
Testing & rollbackStaging UAT with sandbox DPO + rollback planDepends on your own QA disciplineInstall-and-hope, no UAT includedN/A
Ownership & supportFull git handover + post-go-live support windowYou own it and you support itVendor-locked; support quality variesCommunity forums only
Total cost & riskFixed build-to-order scope, expert-builtUnpredictable dev time and maintenanceLow sticker price, high integration riskFree but cannot take DPO payments

Frequently Asked Questions about DPO Pay Gateway

Is this a ready-made module I can download and install today?

No. DPO Pay Gateway for Odoo is build-to-order. ECOSIRE builds it against your specific Odoo version and DPO configuration, tests it on staging, then installs and supports it. It is not an instant apps.odoo.com download, and we never claim a same-day download.

How long does delivery take?

Typical delivery is one working week from confirmed scope. The timeline starts once we have agreed the countries, currencies, rails (cards / mobile money / recurring), your Odoo edition and version, and your DPO service credentials during the scoping call. Tighter scopes finish faster; heavy multi-country or subscription requirements sit at the upper end.

Which Odoo versions and editions does it support?

We build for Odoo 17.0, 18.0 or 19.0 on both Community and Enterprise. Enterprise gives you the richer accounting-automation and subscription features natively; on Community we wire the equivalent flows against `account` and `ir.cron`. We target one version per delivery unless you ask for more.

How does it handle mobile money and multiple currencies?

All rails — cards, mobile money (M-Pesa, MTN MoMo, Airtel Money, Tigo Pesa) and bank — run through one `payment.transaction` using a per-currency DPO service map, so each country settles in its own currency (KES, TZS, UGX, ZMW, GHS, RWF, ZAR and others) with the correct DPO service type. The exact list is confirmed against your DPO account during scoping.

How are payments reconciled and kept safe from double-posting?

Every payment is verified server-side with DPO's `verifyToken` on the notification, never on the browser redirect. Transactions are idempotent on the DPO reference, so a retried webhook cannot post twice, and confirmed payments flow through Odoo's native state machine to post the `account.payment` and validate the invoice, with a reconciliation view matching DPO settlements to `account.move` lines.

What about support and future updates?

Delivery includes a post-go-live support window for defect fixes and configuration changes. Because you receive the full git repository, your team (or ECOSIRE under a support agreement) can maintain and extend it. Version upgrades — for example carrying it to a newer Odoo release — are quoted separately as a follow-on engagement.

Can it handle recurring / subscription billing?

Yes. We store the DPO payment token against the customer and drive tokenized recurring charges from a scheduled `ir.cron` automated action, so subscription and recurring invoices settle without re-prompting the cardholder. This is confirmed as in-scope during the scoping call since it affects the build.

Request a quote

DPO Pay Gateway

A build-to-order Odoo payment provider that connects checkout, invoicing and subscriptions to DPO Group so African merchants can take card, mobile-money and bank payments in local currencies. ECOSIRE scopes, builds, installs and supports it — it is not an instant apps.odoo.com download.

  • New `payment.provider` with `code='dpo'`, split test/live credentials (Company Token, service IDs, endpoint) stored as encrypted fields on the provider form
  • `payment.transaction` extended to call DPO's XML/Direct API: `createToken` to open, hosted `payURL` redirect, `verifyToken` for authoritative final state
  • Card, mobile money (M-Pesa, MTN MoMo, Airtel Money, Tigo Pesa) and bank rails routed through one transaction via a per-currency DPO service-type map
  • Multi-currency pan-African support (KES, TZS, UGX, ZMW, GHS, RWF, NGN, ZAR and more) with per-country service selection

Request a Quotation

Tell us about your DPO Pay Gateway 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.