Skip to Content

Odoo Integrations

Odoo and Stripe Integration

Stripe is one of the integrations Odoo ships itself, in Community, so the connection is configuration rather than a project. The work that remains is accounting: Stripe pays you in batches, net of fees, and the amount that reaches the bank matches no single figure in your sales.

Part of our guide to Odoo Integrations

Native, and in Community

payment_stripe is in the Odoo 19 Community addons, verified against source. So this is not a connector project. You enable the payment provider, supply the keys, and it works.

The setup steps are genuinely short: enable the provider, enter the API keys, configure the webhook endpoint, set the journal that payments post to, and test in Stripe's test mode before going live.

Because that part is easy, the mistake is treating the whole integration as easy. Everything difficult about Stripe and Odoo is downstream of the payment succeeding.

Webhooks are not optional

A payment does not always finish in the browser. The customer closes the tab, the network drops, the payment method settles asynchronously, the bank takes a day.

Webhooks are how Odoo learns what happened in all those cases, and how it hears about anything initiated on Stripe's side: a refund issued from the dashboard, a dispute opened, a subscription payment failing.

Skip them and the failure is specific and nasty: the money is taken, the customer sees success, and Odoo shows the order unpaid. Nobody notices until someone chases an invoice that was already settled.

Configure the endpoint, verify the signature, and check that events are arriving before go-live rather than assuming.

Fees, and why they must be posted

Stripe deducts its fee before paying you. Charge 100 and roughly 97 arrives, and that difference is a cost of sale, not a discount and not a rounding error.

Post it as an expense against a processing-fees account. Two things follow that are worth stating.

The bank reconciliation clears, because the deposit is explained by the invoice total minus the recorded fee. Without the fee posted, every single deposit is short and every one needs a manual adjustment.

And your margin becomes honest. Card fees on a low-margin product are a meaningful share of the profit, and a margin report that ignores them overstates performance consistently rather than randomly.

Payouts are batches, not payments

Stripe pays out on a schedule, aggregating many charges into one bank deposit, net of fees, refunds and adjustments in the same period.

So the deposit corresponds to no invoice. Attempting to match deposits to invoices one to one does not work and is where finance teams lose days.

The approach that works is to treat the Stripe balance as an account: charges increase it, fees and refunds decrease it, and a payout moves the net to the bank. Reconcile the payout against the Stripe report for that period rather than against sales, and the bank line clears cleanly.

Refunds, disputes and chargebacks

Refunds can be issued in Odoo or in Stripe. Pick one place and stay there. Refunding in Stripe without a corresponding credit note leaves Odoo believing revenue exists that has been returned.

Disputes are worse, because money is removed from your balance immediately and may or may not come back, plus a dispute fee. Decide the accounting treatment before the first one arrives, not during it.

Chargebacks arrive as webhook events. If nothing consumes them, they appear only as an unexplained shortfall in a later payout.

Multi-currency

Stripe converts, charges a conversion cost, and settles in your account currency.

Odoo has its own exchange-rate handling, so decide which rate is authoritative for the books. The two will differ, and the difference belongs somewhere deliberate rather than accumulating in an unexplained variance.

Testing before real money

Use Stripe's test mode and its test card numbers to walk the full set of paths: a successful payment, a declined card, a payment requiring authentication, a refund, and a webhook arriving after the browser has closed.

That last one is the case most likely to be skipped and most likely to matter, and it is easy to simulate by paying and closing the tab immediately.

Then run a small live payment before opening it to customers. Test mode confirms the logic; a live transaction confirms the keys, the webhook endpoint and the journal are the real ones.

Related decisions

If you are also taking payments through PayPal, the same fee and payout treatment applies with different specifics, and running both means two balance accounts to reconcile rather than one.

FAQ

Questions, answered.

Is Stripe included in Odoo Community?

Yes. The payment_stripe module is present in the Odoo 19 Community addons, so Stripe is available without an Enterprise subscription. It is configured as a payment provider rather than installed as a connector.

Why does the Stripe payout not match our Odoo invoices?

Because Stripe settles in batches, net of processing fees, refunds and chargebacks, on a delay. The payout is a net figure covering a period, so it will not equal any individual invoice or a simple sum of them. Reconcile against the payout report and post the fees as a cost.

Do we need webhooks for Stripe in Odoo?

Yes, for anything asynchronous. A customer closing the browser after paying, a delayed payment method, a dispute or a refund made in the Stripe dashboard all reach Odoo only through webhooks. Without them the payment succeeds at Stripe and Odoo never finds out.

With CODEerts

Want your systems talking properly?

We are certified Odoo partners. We connect Odoo to stores, payment providers, messaging and reporting tools, and we maintain those connections through upgrades.

See how we can helpBook a call