Skip to Content

Odoo Integrations

Odoo and PayPal Integration

PayPal is a native Odoo payment provider and takes minutes to enable. It is also the one that generates the most reconciliation questions afterwards, because a PayPal balance behaves like an account you happen to own rather than like a card processor paying you out.

Part of our guide to Odoo Integrations

Native, and in Community

payment_paypal is present in the Odoo 19 Community addons. Like Stripe, it is enabled as a payment provider rather than installed as a connector, so the mechanics are configuration.

Supply the credentials, configure the notification endpoint, set the journal, test in sandbox, go live. That part is short.

The notification problem

PayPal confirms payments asynchronously, and this is the source of most PayPal support tickets in Odoo.

The customer pays, and whether Odoo hears about it depends on a notification reaching your server. If the customer closes the browser at the confirmation screen, if the payment is an eCheck that clears days later, if PayPal holds the funds for review, the browser tells Odoo nothing and the notification is the only channel.

When that endpoint is misconfigured, unreachable or silently failing, the symptom is consistent: money in the PayPal account, unpaid orders in Odoo, and a customer who is certain they paid.

Two things to verify rather than assume. That the endpoint is reachable from outside, which is the usual failure on a staging URL or behind a restrictive firewall. And that events are actually arriving, checked in PayPal's own dashboard rather than inferred from a successful test payment made in one browser session.

The balance is an account, not a bank

This is the accounting decision that determines whether reconciliation is straightforward or miserable.

Money sits in your PayPal balance. It is not in the bank. You withdraw it, sometimes automatically, sometimes when someone remembers, and the withdrawal is a transfer between two accounts you own.

So model PayPal as its own account in Odoo. Sales increase it, fees decrease it, refunds decrease it, and a withdrawal moves the balance to the bank account. The bank statement then shows a transfer that reconciles against a matching movement, rather than a mysterious deposit that corresponds to no invoice.

Posting PayPal sales directly to the bank account is the common shortcut, and it guarantees the bank never reconciles, because the deposit dates and amounts have no relationship to the sales.

Fees

PayPal deducts its fee per transaction, so the balance increases by less than the invoice.

Post the fee to a processing-fees expense account, for the same two reasons as any card processor: the account balance then explains itself, and the margin figures stop overstating profit by the fee percentage.

Cross-border and currency-conversion fees are separate and larger. If you sell internationally, they are worth their own account rather than being merged into general processing costs, because they change with your mix of markets and you want to see that.

Multi-currency

PayPal holds balances in several currencies at once and converts at its own rate with its own spread.

That means two decisions. Which currency you actually hold, since keeping foreign balances avoids conversion but complicates reporting. And which rate is authoritative in Odoo, given that its rate and PayPal's will differ.

Neither has a universally right answer, and both should be deliberate, because the difference lands somewhere regardless.

Disputes and buyer protection

PayPal's dispute process is buyer friendly, and funds can be held or reversed while a case runs.

The practical consequence for Odoo is that a payment marked received can be reversed later. If nothing consumes the reversal notification, the order stays paid in Odoo while the money has gone.

Decide the treatment before the first dispute: a reversal entry against the balance account, and a process for who investigates. Merchants selling physical goods internationally should expect these regularly rather than exceptionally.

Running PayPal alongside cards

Most businesses offer both, which means two balance accounts, two fee structures and two reconciliation routines.

Keep them separate in the chart of accounts. Merging them into one "online payments" account saves a line and costs you the ability to answer which channel is actually profitable, which is precisely the question a finance team asks when card fees start to matter. The equivalent Stripe treatment is the same shape with different specifics.

FAQ

Questions, answered.

Is PayPal available in Odoo Community?

Yes. The payment_paypal module ships in the Odoo 19 Community addons, so it is configured as a payment provider rather than installed as a third-party connector.

Why do PayPal payments not always mark the Odoo order as paid?

Usually the notification is not reaching Odoo. PayPal confirms asynchronously, so if the customer closes the browser or the payment settles later, the only route back is the notification endpoint. Without it working, the money arrives and the order stays unpaid.

How should PayPal balances be handled in Odoo accounting?

Treat the PayPal balance as its own account rather than as the bank. Sales increase it, fees decrease it, and a withdrawal to the bank is a transfer between two accounts. Posting PayPal sales straight to the bank is what makes the reconciliation impossible.

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