Skip to main content

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

Recurring billing in productionScheme enrolment from a mobile appCounter payments reconciled tooOdoo Enterprise, custom module

Clients

Businesses that run on what we built

  • Ladder Logix
  • Avasar Agency
  • Aria Jewellers
  • Freiburger Bund
  • Jo Ann's
  • Opsio
  • LittleQ

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.

Which System Owns What
ObjectSystem of recordDirectionConflict rule
Card, UPI mandate, payment methodRazorpayNever leaves RazorpayOdoo stores a token or reference only, never instrument data
Customer identityOdooOdoo to Razorpay on first chargeThe Odoo partner id is the key and travels in the payment notes
Plan, scheme or priceOdooOdoo to RazorpayA plan edited only at the gateway will drift. Change it in Odoo
Payment outcomeRazorpayRazorpay to Odoo by webhookThe signed webhook is the truth. The browser redirect is only a hint
Mandate and autopay stateRazorpayRazorpay to OdooA cancelled or expired mandate must change the Odoo state, not just the gateway
Subscription or scheme stateOdooBoth, reconciledOdoo decides what the state entitles the customer to
RefundsWherever issuedBothEither way it ends as a credit note in Odoo, never only at the gateway
Invoice and journal entryOdooOdoo onlyGateway 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.

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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.

Native Provider, Community Module or Custom Integration?
Your needApproachWhy
One-time payments on the Odoo website or portalOdoo's built-in Razorpay providerConfiguration. No project needed
Payment links or invoice paymentBuilt-in, with accounting set up properlyThe gateway is the easy half. The journal mapping is the half that matters
Standard subscriptions on EnterpriseSubscriptions app with the providerFine while nothing outside Odoo depends on the payment
A scheme or plan Odoo does not modelCustom moduleWhat Aria Jewellers needed: monthly gold saving schemes are not a stock subscription
Payments starting in your own appCustom API layerEnrolment and payment from a mobile app, with Odoo as the system of record
Online and counter payments in one ledgerCustom, plus POS or terminal handlingOnline Razorpay and a Paytm EDC terminal, reconciled against the same customer
Payouts and vendor disbursementSeparate scopingA 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

  1. 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.

  2. 02

    API keys and webhook secrets live in the server environment, never in the database, never in a module and never in a repository.

  3. 03

    Webhook endpoints verify the signature, rate-limit, and do exactly one thing: enqueue a verified event for processing.

  4. 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.

  5. 05

    Every inbound event and outbound call is logged with its identifier, so a disputed payment can be traced end to end months later.

  6. 06

    Customer mobile numbers used for OTP or notification stay inside your systems and the provider you already use. Aria send OTP through MSG91.

  7. 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

  1. 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.

  2. Ownership and mapping

    The matrix above completed, with the plan, product and journal mapping between Odoo and Razorpay agreed with finance.

  3. Build in test mode

    The whole flow against test keys, including the awkward paths: failed charge, retry, revoked mandate, refund, duplicate webhook, expired subscription.

  4. Reconciliation first

    The daily comparison job is built before go-live, not after the first settlement nobody can match.

  5. Controlled go-live

    Live keys, a small cohort first, webhooks watched, and a rollback path that never strands a customer who has paid.

  6. 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.

Razorpay and Odoo in Production
ProjectIndustryOdooKey capabilitiesTechnology
Aria JewellersJewellery retail & manufacturingOdoo EnterpriseJewellery Management Base · Jewellery Account · Jewellery Account Payment Mode · Jewellery AppOdoo 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

Request the assessment

What clients say

In Their Words

Questions

Razorpay and Odoo Questions, Answered Directly

Bhavesh Selarka

COO & Co-Founder, Heliconia Solutions

Not answered here? Ask Bhavesh directly, the person who reviewed this page, not a sales queue. Odoo 16 Functional Certification.

Ask a question

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.

Read the project

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.

Mobile app development

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.

The finance side

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.