Odoo ERP

Shopee Odoo Integration: Orders, Stock, Fees and Returns

A practical walkthrough of Shopee Odoo integration: syncing orders and stock across shops, booking marketplace fees correctly, and handling returns cleanly.

Ravi Shanker SinghFounder & Odoo ConsultantPublished 7 min read
Share
Shopee Odoo Integration: Orders, Stock, Fees and Returns
Image: Valtra Tractors · Openverse · CC0
On this page

Every Shopee seller we have worked with in Thailand eventually hits the same wall. The Shopee Seller Center is fine for one shop. But once you run two or three shops alongside a physical store, nobody can tell you the real stock position without logging into four different screens. A Shopee Odoo integration solves that. It only works, though, if you build it around how Shopee actually behaves, not how you wish it behaved.

This is a walkthrough of how we set up Shopee Odoo integration on real projects. Order download. Stock sync across shops. Marketplace fees as proper journal entries. Returns. None of this is theoretical. It is the sequence we follow on actual projects, including the parts that are annoying.

How Shopee orders land in Odoo

Shopee exposes an Open Platform API that lets an external system pull orders, update stock, and push tracking numbers. Odoo has recently added an official Shopee connector that ships as a built-in module and syncs orders natively. That removes a lot of the plumbing we used to build by hand. Even so, it still needs to be wired into your specific chart of accounts and warehouse structure before it fits your business.

The pattern we use is a scheduled action, typically running every five to fifteen minutes. It pulls new orders from Shopee and creates a sales order in Odoo for each one. A few decisions matter here:

  • One sales order per Shopee order, not per line item, so that packing and invoicing match what the customer actually sees.
  • A dedicated Shopee customer record per shop (or a generic "Shopee Marketplace" partner), rather than creating a contact for every buyer. Marketplaces rarely give full buyer details, and thousands of one-off contacts clutter the database for no benefit.
  • Order status mapping. Shopee's "unpaid," "to ship," "shipped," "completed" and "cancelled" states need to map to Odoo's sales order and delivery states. Decide early what happens when a buyer cancels after you have already picked the item.

One limitation worth naming upfront: Shopee's API rate limits and occasional downtime mean your sync is eventually consistent, not real time. Build in a daily reconciliation job that compares order counts between Shopee and Odoo and flags gaps. We have seen orders silently skipped during platform maintenance windows. Nobody notices until a customer complains about a missing shipment. That one job pays for itself the first time it catches a gap.

Keeping stock in sync across multiple shops

If you sell the same SKU on a Bangkok storefront, a Shopee shop, and maybe Lazada too, the real question is not "how do I sync stock." It is "which system owns the truth." We almost always make Odoo the single source of inventory truth, with marketplaces as read-only consumers of a calculated available quantity. This is the core design decision behind every Shopee Odoo integration we have built.

The typical flow:

  1. Odoo calculates available-to-promise stock per SKU, per warehouse.
  2. A push job sends that number to Shopee, and to Lazada or TikTok Shop if connected, whenever it changes by more than a small threshold.
  3. When a Shopee order is confirmed, Odoo reserves stock immediately. That way a near-simultaneous Lazada order does not oversell the last unit.

For sellers running more than one Shopee shop, often to target different provinces or price tiers, we map each shop to its own Odoo warehouse or a dedicated stock location. One shop's stock then cannot silently cover another's promises. It also keeps delivery orders and picking lists sane during peak sale days like 9.9 or 11.11, when order volume can spike heavily in a short window.

The trade-off is real: near-real-time stock push means more API calls, and Shopee enforces its own rate limits per shop. For high-SKU catalogs we batch updates and prioritize fast-moving items. Slow movers might lag by an hour or two. That is a reasonable compromise in practice.

Booking Shopee fees as journal entries, not as a lump deduction

This is where most self-built integrations fall short. Shopee pays out net of commission, service fee, payment fee and sometimes a shipping subsidy clawback. If you just book the deposit as revenue, you lose visibility into actual margin per order.

What we configure instead:

Shopee deductionOdoo treatment
Commission feePosted as an expense line against a "Marketplace Commission" account, tied to the sales order
Payment/transaction feeSeparate expense account, often grouped under bank charges
Shipping fee subsidy or clawbackMatched against the delivery cost already recorded on the order
Withholding tax Shopee deductsPosted to the withholding tax receivable account used for PND 53 reconciliation
Net payoutReconciled against the actual bank deposit

In practice, your Shopee order generates a sales invoice at gross value, meaning what the customer paid. A separate vendor bill or journal entry captures the marketplace's deductions, dated to match Shopee's settlement report. The payout that lands in your bank account should then reconcile to the net of those two documents. Getting this right the first month is tedious. After that it is mostly automatic, and your accountant finally gets a clean answer when asked what Shopee actually costs you.

If your business is also registered for VAT, remember that Shopee's fee invoices may or may not carry a valid Thai tax invoice, depending on how Shopee Thailand issues them. Check this with your accountant before assuming full input VAT credit on every fee line. Our odoo erp services work usually covers this kind of fee reconciliation as part of the same engagement.

Handling returns without breaking stock valuation

Returns on Shopee follow the platform's own return and refund workflow, and the seller is often the last to know a return has been approved. Our integrations poll the return endpoint separately from the order endpoint. A returned order needs different handling in Odoo than a fresh order.

When a return is confirmed:

  • Odoo creates a return delivery, reversing the original delivery order, so the stock quant goes back into the correct warehouse rather than a generic "returns" bucket nobody reconciles later.
  • A credit note is generated against the original invoice, matching the refunded amount. This is not always the full order value, since Shopee sometimes processes partial refunds for damaged-item claims.
  • If the returned item is damaged or no longer sellable, we route it to a separate "damaged stock" location rather than back into available inventory. This protects your available-to-promise number on other channels.

One thing to decide early: automatic return processing, or a manual approval step before stock and accounting are touched? We lean toward manual approval for the first few months of any Shopee Odoo integration, specifically for returns. Damaged-goods photos and buyer disputes need a human look before the books are updated. Full automation can come later, once the pattern of disputes is well understood.

Where Shopee Odoo integration usually breaks in practice

A few recurring issues from our implementations:

  • SKU mismatches. Shopee lets sellers rename or clone product variants loosely. Matching a Shopee item ID to an Odoo product reliably requires an explicit mapping table rather than trusting SKU strings to always match.
  • Currency and multi-shop accounting. If you sell through Shopee in Thailand and also through a Shopee shop in another country, your Odoo company structure needs to reflect that, usually as separate companies or at least separate analytic accounts.
  • Promotions and seller-funded discounts. Shopee flash sales and voucher codes often shift the actual price the seller receives below the listed price. If your order sync only reads the gross order value and ignores the voucher breakdown, your revenue recognition will be wrong.

None of these are deal-breakers. But they are exactly the kind of detail that turns a "quick API connector" into a project that needs proper API integration services rather than a weekend script. We usually scope the first phase around order download and stock sync. We prove it on one shop for two to three weeks. Then we extend to fee accounting and returns once the basics are stable.

Extending the same approach beyond Shopee

If you are also running Lazada or TikTok Shop alongside Shopee, the same architecture extends to those platforms. Different API quirks, same core decisions: single source of stock truth, gross-and-fee accounting rather than net deposits, and a reconciliation job nobody has to remember to run manually. For the accounting side specifically, pair this with your existing e-commerce development setup. The storefront, marketplaces and Odoo accounting should all agree on the same numbers.

For sellers already deep into Thai tax compliance, the Shopee fee journals described above sit naturally alongside the withholding tax and e-Tax invoice work most of our Thai retail clients already have running in Odoo. It is worth reviewing that setup at the same time you connect Shopee. Our odoo consultancy services team usually folds this into the same engagement rather than treating it as a separate project.

Share

Frequently asked questions

Does Odoo have a built-in Shopee connector?

Yes. Odoo has introduced an official Shopee connector that ships as a built-in module and synchronizes orders natively between Shopee and Odoo. It still needs configuration against your chart of accounts and warehouse structure to fit your business.

Can I sync stock between Shopee and my physical store in real time?

Near real time is realistic, true real time is not, because Shopee enforces API rate limits and has periodic maintenance windows. We push stock updates whenever quantities change beyond a threshold and run a daily reconciliation job to catch any gaps.

How should Shopee commission and fees be recorded in Odoo?

Book the customer-facing invoice at the gross order value, then record Shopee's commission, payment fee and withholding tax as separate journal entries or a vendor bill dated to the settlement report. The bank deposit should reconcile to the net of those two documents, not be booked directly as revenue.

What happens to stock when a Shopee return is approved?

A properly configured integration creates a return delivery that puts stock back into the correct warehouse location, generates a credit note matching the refunded amount, and routes damaged items to a separate location so they do not inflate your available-to-promise quantity on other channels.

Is it safe to automate Shopee returns fully from day one?

We generally recommend a manual approval step for the first few months. Damaged-item disputes and partial refunds need a human look before stock and accounting entries are posted, and full automation works better once you understand your actual return patterns.

Sources

About the author

Ravi Shanker Singh

Founder & Odoo Consultant

Founder of Tech After Me and Odoo consultant. Ravi implements, customises and supports Odoo ERP and builds web, mobile and data products for companies in Thailand, the USA and India, working from Bangkok, New York and Delhi NCR.

More from this author

Keep reading

Odoo VAT Thailand Setup: 7% Tax, Invoices, and ReportsOdoo ERP

Odoo VAT Thailand Setup: 7% Tax, Invoices, and Reports

A practical walkthrough of Odoo VAT Thailand setup: 7% tax configuration, input and output VAT, tax invoice versus receipt, and the reports your accountant needs at close.

Ravi Shanker Singh6 min read

Put what you read into practice

The team writing these guides is the same team that ships them. Tell us what you are working on.

Get new articles in your inbox

Get new articles in your inbox

Odoo guides and IT news that matter to your business. At most one email a week.