ml-connector
OdooStripe

Odoo and Stripe integration

Odoo runs accounting and order management. Stripe processes online payments and subscriptions. Connecting the two keeps your customer records and billing in alignment. New customers in Odoo create matching Stripe customers, and sales invoices from Odoo flow into Stripe for payment collection. When Stripe records a payment, it updates the Odoo invoice status and posts the payment into the general ledger without manual reconciliation.

How Odoo works

Odoo exposes customers, invoices, sales orders, purchase orders, payments, and general ledger accounts through XML-RPC (HTTP POST to {base_url}/xmlrpc/2/object) and JSON-2 REST APIs (HTTP POST to {base_url}/json/2/<model>/<method>). Authentication uses an API key paired with a username. Odoo Online uses https://{subdomain}.odoo.com, Odoo.sh uses https://{subdomain}.odoo.sh, and self-hosted installations use custom domains. Odoo has no production-grade webhooks, so records are read by polling with a high-water-mark timestamp on the write_date field. Polling respects the integration user's Odoo access rights and record rules.

How Stripe works

Stripe exposes customers, invoices, payment intents, subscriptions, and events through REST API (HTTP verbs GET and POST to https://api.stripe.com/v1) with JSON responses. Authentication uses a secret API key sent via HTTP Basic Auth or Bearer token. Stripe supports both push via registered webhook endpoints (with HMAC-SHA256 signatures) and pull via the REST API, with webhook events including payment_intent., charge., invoice., and customer. events. Stripe imposes rate limits and enforces immutable pricing after creation.

What moves between them

The main flow is Odoo into Stripe. Odoo customers and invoices flow into Stripe as customers and invoices. When a customer is created or updated in Odoo, ml-connector posts the update to Stripe. When a sales invoice is confirmed in Odoo, ml-connector creates a matching Stripe invoice. Stripe webhooks push payment and subscription events back into Odoo so payment statuses update on the invoice and accounting records are posted automatically. Recurring orders in Odoo become Stripe subscriptions.

How ml-connector handles it

ml-connector polls Odoo using its high-water-mark timestamp on write_date to fetch only changed records. It authenticates Odoo with the API key and username pair and handles both XML-RPC and JSON-2 endpoints. On the Stripe side, ml-connector stores the secret key encrypted and authenticates via HTTP Basic Auth on every REST call. It maps Odoo's res.partner (customer) records to Stripe customers, and account.move (invoice) records to Stripe invoices. When a Stripe webhook arrives with a payment_intent.succeeded event, ml-connector updates the Odoo invoice status to Paid and creates an account.payment record in Odoo's general ledger. Subscriptions are created in Stripe from Odoo sales orders marked as recurring. Both systems are polled on a schedule you control, and every record carries an audit trail for replay if a downstream call fails. Stripe rate limits are handled with exponential backoff.

A real-world example

A mid-sized e-commerce company runs Odoo for order management and accounting, and Stripe for payment processing. Before the integration, the finance team manually entered customer and invoice data from Odoo into Stripe, tracked payments in both systems separately, and spent time reconciling discrepancies at month-end. After each payment in Stripe, the team re-keyed the payment status back into Odoo. With Odoo and Stripe connected, new customers in Odoo instantly create Stripe customers, confirmed invoices flow into Stripe automatically, and payments are recorded in Odoo as they complete. Month-end reconciliation is faster because the two systems are in sync, and customer service can see payment status in Odoo without logging into Stripe separately.

What you can do

  • Sync Odoo customers to Stripe customers so your customer records stay aligned across both systems.
  • Flow Odoo invoices into Stripe for payment collection without manual data entry.
  • Create Stripe subscriptions from recurring sales orders in Odoo and manage billing automatically.
  • Update Odoo invoice status and post payment records when Stripe payments arrive via webhook.
  • Poll Odoo on a schedule you control with retries and a full audit trail on every record.

Questions

Which direction does data move between Odoo and Stripe?
The main flow is Odoo into Stripe. Customers and invoices move from Odoo into Stripe, while payment and subscription events move from Stripe back into Odoo. Odoo accounting records are updated when payments complete in Stripe so reconciliation happens automatically.
Does Odoo's lack of production webhooks mean data moves slowly?
Odoo has no built-in production-grade webhooks, so ml-connector polls Odoo using a high-water-mark timestamp on the write_date field. This is efficient and reliable for most billing cadences. You control the poll frequency based on how quickly you need invoices to reach Stripe, typically every few minutes to once per hour.
How does ml-connector handle customer and invoice mapping between the two systems?
ml-connector stores a local map of Odoo customer IDs to Stripe customer IDs so duplicate customers are not created. When an Odoo customer is created or updated, ml-connector posts it to Stripe and records the mapping. When an Odoo invoice is created, ml-connector creates a matching Stripe invoice linked to the same Stripe customer. Both systems use the mapping to ensure payment events flow to the correct invoice.

Related integrations

Connect Odoo and Stripe

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started