Odoo integration
Connect Razorpay Payments and Subscriptions to Odoo
Our production evidence is the hard end of Razorpay: automated recurring billing behind monthly gold saving schemes, with enrolment in a mobile app and the ledger in Odoo. One-time checkout is the easy case.
- Checkout
- Recurring billing
- Webhooks
- Refunds
- Reconciliation
Reviewed by Bhavesh Selarka, COO & Co-Founder, Heliconia Solutions · Odoo 16 Functional Certification · Odoo Partner · Updated
Proof
Clients
Businesses that run on what we built
The short answer
What Does a Razorpay and Odoo Integration Cover?
Razorpay holds the payment instrument and moves the money. Odoo holds the customer, the order or subscription, and the accounting entry. The integration is a signed webhook flow inbound and an authenticated API call outbound. For one-time payments that is a short job. For recurring billing it is a lifecycle, and the lifecycle is where the work actually is.
Odoo's built-in Razorpay payment provider handles online payments from the Odoo website and portal. If that is all you need, configure it and stop reading. You don't need a development project to take a card payment.
You need an integration when a payment has consequences elsewhere: a scheme instalment recorded against a customer ledger, a membership period extended, a delivery released, a reminder sequence stopped.
That is the work we did for Aria Jewellers, where a custom subscription module runs monthly gold saving schemes with automated Razorpay recurring billing, customers enrol from a mobile app, and counter payments come in through a Paytm EDC terminal into the same ledger.
The first decision
Which System Owns What
Settle this before anyone writes code. Nearly every payment integration bug is a disagreement about a row in this table.
| Object | System of record | Direction | Conflict rule |
|---|---|---|---|
| Card, UPI mandate, payment method | Razorpay | Never leaves Razorpay | Odoo stores a token or reference only, never instrument data |
| Customer identity | Odoo | Odoo to Razorpay on first charge | The Odoo partner id is the key and travels in the payment notes |
| Plan, scheme or price | Odoo | Odoo to Razorpay | A plan edited only at the gateway will drift. Change it in Odoo |
| Payment outcome | Razorpay | Razorpay to Odoo by webhook | The signed webhook is the truth. The browser redirect is only a hint |
| Mandate and autopay state | Razorpay | Razorpay to Odoo | A cancelled or expired mandate must change the Odoo state, not just the gateway |
| Subscription or scheme state | Odoo | Both, reconciled | Odoo decides what the state entitles the customer to |
| Refunds | Wherever issued | Both | Either way it ends as a credit note in Odoo, never only at the gateway |
| Invoice and journal entry | Odoo | Odoo only | Gateway reports are not your books |
The fifth row is the one that bites on recurring billing in India. Mandates get revoked at the bank or the app, and if nothing carries that back into Odoo the scheme keeps expecting money that will never arrive.
The lifecycle
From Enrolment to Reconciled Ledger
The recurring case, which contains the one-time case inside it.
Step 01
Enrolment
The customer joins a plan or scheme, from the Odoo portal, your own frontend or a mobile app. Aria Jewellers enrol from the app, so the API had to be there first.
- Odoo + app
Step 02
Mandate
An authorisation is set up at Razorpay for future charges. Until it is confirmed, the subscription is pending in Odoo and grants nothing.
- Razorpay
Step 03
Scheduled charge
The instalment falls due and is charged. Odoo records the attempt, not just the success, because the failures are what you act on.
- Scheduled
Step 04
Confirmation
Razorpay sends a signed webhook. Odoo verifies it, matches by reference, posts the payment and advances the period. Repeated deliveries change nothing.
- Webhook
Step 05
Consequence
This is the point of the integration: the instalment lands on the customer's scheme ledger, the maturity calculation moves, the reminder stops, the benefit continues.
- Custom
Step 06
Failure path
A failed charge starts retries and a defined dunning timetable in Odoo. A revoked mandate suspends the scheme and tells someone, rather than failing quietly every month.
- Odoo
Step 07
Offline payments
Counter payments belong in the same ledger. Aria take card payments on a Paytm EDC terminal at the counter, recorded against the same customer record.
- POS
Step 08
Reconciliation
Settlements arrive in batches, net of fees, after the transactions. Payments, fees and the bank line are matched in Odoo daily rather than at month end.
- Accounting
Which pattern
Native Provider, Community Module or Custom Integration?
Work down this list. We will say so when the built-in option already covers you.
| Your need | Approach | Why |
|---|---|---|
| One-time payments on the Odoo website or portal | Odoo's built-in Razorpay provider | Configuration. No project needed |
| Payment links or invoice payment | Built-in, with accounting set up properly | The gateway is the easy half. The journal mapping is the half that matters |
| Standard subscriptions on Enterprise | Subscriptions app with the provider | Fine while nothing outside Odoo depends on the payment |
| A scheme or plan Odoo does not model | Custom module | What Aria Jewellers needed: monthly gold saving schemes are not a stock subscription |
| Payments starting in your own app | Custom API layer | Enrolment and payment from a mobile app, with Odoo as the system of record |
| Online and counter payments in one ledger | Custom, plus POS or terminal handling | Online Razorpay and a Paytm EDC terminal, reconciled against the same customer |
| Payouts and vendor disbursement | Separate scoping | A different Razorpay product with different controls. We would not carry scheme evidence across to it |
Our production proof is recurring subscription billing and counter payments. Razorpay also sells payouts, smart collect and lending products, and we would scope those on their own merits rather than claim them here.
Failure handling
What Makes It Survive a Bad Day
- Signature verification on every webhook, with anything unsigned or stale rejected before it is read
- Idempotent handlers keyed on the gateway event id, because duplicate deliveries are routine rather than exceptional
- A queue with retry and backoff, so a short Odoo outage can’t lose a payment confirmation
- A scheduled catch-up that fetches recent payments from the gateway and fills any gap, because a webhook that never arrived can’t be retried by anyone
- Idempotency on outbound charge requests, so a network timeout never turns into a second debit
- Mandate state monitored, so revocations and expiries suspend the scheme instead of producing silent monthly failures
- Daily reconciliation of gateway payments, settlements and fees against Odoo, reported before finance finds the gap
- Alerting on failed charges, failed webhook processing and queue depth, addressed to a named person
Security boundary
Credentials, Data and What We Do Not Touch
- 01
Card and UPI credentials never reach Odoo or our code. The gateway holds the instrument, Odoo holds a reference, and that is what keeps your compliance scope small.
- 02
API keys and webhook secrets live in the server environment, never in the database, never in a module and never in a repository.
- 03
Webhook endpoints verify the signature, rate-limit, and do exactly one thing: enqueue a verified event for processing.
- 04
Access to the Razorpay dashboard stays yours. We ask for the least access that lets us build and debug, and we don't need your login.
- 05
Every inbound event and outbound call is logged with its identifier, so a disputed payment can be traced end to end months later.
- 06
Customer mobile numbers used for OTP or notification stay inside your systems and the provider you already use. Aria send OTP through MSG91.
- 07
We are not a payment institution. Questions about RBI rules, mandate norms or your own licensing go to your compliance adviser, and we build to what they decide.
How we run it
Implementation Sequence
Assessment
Odoo version and edition, where payments start, what a payment must cause, one-time or recurring, volumes, and whether offline payments share the ledger.
Ownership and mapping
The matrix above completed, with the plan, product and journal mapping between Odoo and Razorpay agreed with finance.
Build in test mode
The whole flow against test keys, including the awkward paths: failed charge, retry, revoked mandate, refund, duplicate webhook, expired subscription.
Reconciliation first
The daily comparison job is built before go-live, not after the first settlement nobody can match.
Controlled go-live
Live keys, a small cohort first, webhooks watched, and a rollback path that never strands a customer who has paid.
First cycle support
We stay close through the first full billing cycle and the first settlement reconciliation, which is when real data finds the gaps.
Evidence
Razorpay and Odoo in Production
One deep implementation rather than a list of logos: recurring billing, a custom scheme module, a mobile app and counter payments in one ledger.
| Project | Industry | Odoo | Key capabilities | Technology |
|---|---|---|---|---|
| Aria Jewellers | Jewellery retail & manufacturing | Odoo Enterprise | Jewellery Management Base · Jewellery Account · Jewellery Account Payment Mode · Jewellery App | Odoo Enterprise · Python · PostgreSQL · GraphQL (Graphene) · OWL / QWeb |
Integration assessment
Request an Integration Assessment
Send your Odoo version and edition, where payments start, what a successful payment has to trigger, one-time or recurring, your volumes and any connector you already run. You get the ownership matrix filled in and a straight answer on whether the built-in provider is enough.
- Data ownership matrix completed for your setup
- Payment capture, subscription lifecycle and reconciliation mapped separately
- Built-in provider, Subscriptions app or custom module, with the reasoning
- Mandate and dunning handling defined before build, not after the first failed month
- Accounting treatment of fees and settlements agreed with your finance team
What clients say
In Their Words
Heliconia transformed our business with Odoo. They implemented a dynamic website with e-commerce capabilities, enhancing our online presence significantly.
Sandesh ThummarBusiness Owner, Ladder Logix
Heliconia provided a unique canteen solution, saving us valuable ordering time. Their innovative approach has been invaluable to our operations.
Pradeep LakhaniBusiness Owner, Avasar Agency
Questions
Razorpay and Odoo Questions, Answered Directly
Does Odoo support Razorpay out of the box?
Yes. Razorpay is one of the payment providers Odoo ships, and for online payments on the Odoo website or portal it is configuration rather than development.
You need an integration when the payment has to drive something else: a scheme ledger, an entitlement, a fulfilment step or a specific accounting treatment. That part isn't in the box.
Can Razorpay handle recurring billing against Odoo?
Yes, and we run it in production. Aria Jewellers bill monthly gold saving schemes automatically through Razorpay, with a custom Odoo subscription module holding the scheme, the instalments and the customer ledger.
The gateway charges the money. Odoo decides what the payment means and what happens when it fails.
What happens when a customer revokes their mandate?
The webhook for the mandate change moves the Odoo subscription into a suspended state, stops further charge attempts and notifies whoever owns the customer relationship. Without that path the scheme fails silently every month and nobody notices until a customer complains.
Can we take payments from our own app instead of the Odoo website?
Yes. Aria Jewellers customers enrol in schemes and pay from a mobile app, with Odoo holding the products, schemes, customers and ledger behind an API.
Can counter payments and online payments share one ledger?
They should. Aria take card payments at the counter on a Paytm EDC terminal and online instalments through Razorpay, and both post against the same customer scheme in Odoo. Two systems of record for one customer balance is a reconciliation problem you will pay for monthly.
Do you work with Razorpay payouts, or only collections?
Our production evidence is collections: online payments and automated recurring billing. Payouts are a different Razorpay product with different controls and approvals, so we would scope that on its own rather than imply the scheme work covers it.
How do gateway fees and settlements appear in the accounts?
Deliberately, because settlement arrives in batches, net of fees, after the transaction. We agree the treatment with your finance team up front: gross revenue, fee expense and the settlement matched against the bank line.
Next step
Make the Payment Mean Something in Odoo
Tell us what a successful payment has to cause and what a failed one has to stop. That is the integration, and we will tell you honestly if Odoo already does it.