Odoo Stripe Integration: Complete Setup Guide for UAE Businesses
Stripe is one of the cleanest ways to accept card payments in Odoo. It handles Visa, Mastercard, Apple Pay, and Google Pay out of the box, settles in AED, and — unlike a bolted-on bank redirect — keeps the customer on your own checkout. Across the implementations we run at Oakland, Stripe is the payment provider we reach for most often when a UAE business wants online card acceptance without the friction of a hosted bank page. This guide walks through the full setup for modern Odoo (versions 16, 17, and 18), including the parts most tutorials skip: webhooks, test-to-live promotion, and how the payment ties back into your VAT-compliant invoices.
Before you start: prerequisites
Getting this right the first time means having a few things in place before you touch the Odoo configuration screen.
- An activated Stripe account. For a UAE entity, Stripe supports onboarding with a trade licence, Emirates ID of the signatory, and a corporate bank account for AED payouts. Complete the account verification fully — payouts stay on hold until Stripe confirms your business documents.
- Odoo with the right apps installed. For online sales, install Website and eCommerce. For invoice payment links and subscriptions, install Accounting (or Invoicing) and, if you bill recurring plans, the Subscriptions app.
- A correctly configured company currency and VAT. Set your company currency to AED and confirm your 5% VAT tax and Tax Registration Number (TRN) are entered under the company settings, so Stripe-paid orders feed clean, FTA-ready invoices.
- HTTPS on your domain. Stripe will not process live card data over an unsecured connection, and webhooks require a public HTTPS endpoint. Odoo Online and Odoo.sh handle this automatically; on a self-hosted server, make sure your SSL certificate is valid.
Step 1 — Enable the Stripe payment provider in Odoo
Stripe ships as a built-in payment provider in Odoo, so there is nothing to download from the App Store. Navigate to Accounting (or Website) and open the configuration menu.
- Go to Accounting → Configuration → Payment Providers (in Website it is Configuration → eCommerce → Payment Providers).
- Open the Stripe card and set its State. Use Test mode while you configure and validate, and switch to Enabled only when you go live.
- Note that Odoo offers a one-click "Connect Stripe" onboarding for some regions, but for full control over keys and environments we recommend the manual credential method described below.
Step 2 — Get your Stripe API keys
Odoo authenticates with Stripe using two keys: a publishable key (used by the browser) and a secret key (used server-side). Both come in test and live variants, and mixing them is the single most common cause of a broken integration.
- Log in to your Stripe Dashboard and open Developers → API keys.
- Toggle the dashboard to Test mode and copy the Publishable key (starts with pk_test_) and the Secret key (starts with sk_test_).
- In Odoo, open the Stripe provider and paste both keys into the Credentials tab. Save.
Treat the secret key like a password. Never paste it into a frontend template, a public document, or a support ticket — anyone with it can create charges on your account.
Step 3 — Configure the webhook
The webhook is the part that quietly breaks integrations when it is skipped. It lets Stripe notify Odoo asynchronously when a payment succeeds, fails, or is disputed — which matters for 3D Secure flows, delayed payment methods, and recurring subscription renewals where the customer is no longer on the page.
- In the Stripe Dashboard, go to Developers → Webhooks → Add endpoint.
- Set the endpoint URL to your Odoo domain followed by the Stripe webhook path: https://yourdomain.com/payment/stripe/webhook.
- Subscribe to the events Odoo expects — at minimum checkout.session.completed and payment_intent.succeeded; add payment_intent.payment_failed and the invoice events if you run subscriptions.
- Copy the resulting Signing secret (it starts with whsec_) and paste it into the Webhook Signature field on the Stripe provider in Odoo. This lets Odoo verify that incoming calls genuinely came from Stripe.
In recent Odoo versions the one-click Stripe onboarding can create this webhook for you, but if you entered keys manually you must create it yourself. Always confirm the signing secret is saved — a missing one means Odoo silently ignores the callbacks.
Step 4 — Test the integration
With test keys in place and the provider in Test mode, run a full transaction before anyone real sees the checkout. Stripe provides test card numbers that simulate every outcome.
- Successful payment: card 4242 4242 4242 4242, any future expiry date, any 3-digit CVC, and any postal code.
- 3D Secure / authentication required: card 4000 0027 6000 3184, to confirm the secure-customer-authentication redirect completes and returns to Odoo cleanly.
- Declined payment: card 4000 0000 0000 0002, to verify Odoo shows the failure gracefully and does not confirm the order.
After each test, check three places: the Odoo sales order or invoice moved to the right state, a payment transaction was logged under the provider, and the event shows as delivered in the Stripe webhook logs. If the order paid in Stripe but stayed unpaid in Odoo, your webhook is misconfigured — go back to Step 3.
Step 5 — Go live
Switching to production is deliberate, not a single toggle. Live keys are different from test keys, and the live webhook is a separate endpoint.
- In the Stripe Dashboard, switch off Test mode and copy your live publishable (pk_live_) and secret (sk_live_) keys.
- Replace the test keys in Odoo with the live ones, then set the Stripe provider State to Enabled.
- Create a fresh live webhook endpoint pointing at the same /payment/stripe/webhook URL, and update the signing secret in Odoo to the live whsec_ value.
- Make one small real purchase with your own card, confirm it appears in Stripe and in Odoo, then refund it. This proves the live path end to end before your customers exercise it.
Refunds and recurring payments
Refunds
Odoo supports refunds directly from the payment transaction when Stripe is enabled, so you do not have to bounce into the Stripe Dashboard. Open the transaction on the related invoice and use the Refund action; Odoo calls Stripe, reverses the charge, and you can then issue the corresponding credit note to keep your books and VAT records aligned. For partial refunds, confirm the credit note amount matches the refunded value so your reported output VAT stays correct.
Subscriptions and recurring billing
For recurring revenue, Odoo's Subscriptions app stores the customer's payment token after the first successful Stripe charge and automatically bills the saved card on each renewal. This is exactly where the webhook earns its keep: renewals happen server-to-server with no customer present, so Odoo relies on Stripe's callbacks to mark each period paid and to flag failed renewals for dunning. Test a renewal in test mode before launching any subscription product, and make sure tokenization is allowed on the Stripe provider so cards can be saved for future payments.
Common pitfalls we see in the field
- Mixed test and live keys. A pk_live_ paired with an sk_test_ throws an authentication error on every charge. Keys must match the environment, and both must be live before you enable the provider.
- No webhook, or a missing signing secret. Payments appear successful in Stripe but the Odoo order stays as quotation/unpaid. This is the number one Stripe support ticket — always verify webhook delivery.
- Currency mismatch. If your Odoo prices are in AED but the Stripe account is set to another presentment currency, customers see conversions and you absorb FX. Keep the company currency, product pricelists, and Stripe payouts aligned to AED.
- VAT applied at the wrong layer. Stripe charges the gross amount Odoo sends it; it does not calculate your 5% VAT. Make sure the tax is configured on the product or order in Odoo so the invoice — not Stripe — is your source of truth for FTA reporting.
- Ignoring Stripe fees in reconciliation. Stripe deducts its processing fee before payout, so the AED that lands in your bank is less than the invoice total. Record the fee as a bank charge during reconciliation so your Odoo bank balance matches reality.
Get it set up right the first time
Stripe and Odoo work well together, but the details — webhooks, environment-correct keys, AED currency, and VAT that feeds clean FTA returns — are where a quick setup turns into weeks of reconciliation headaches. Oakland is UAE's #1 Odoo Gold Partner and part of ARMOR Group, with 120+ Odoo implementations behind us and a typical 90-day go-live. If you want your payment stack configured, tested, and reconciled correctly from day one, book a free assessment with our certified consultants and we'll map the right setup for your business.