{"id":335597,"date":"2026-07-22T12:20:48","date_gmt":"2026-07-22T12:20:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/connector-for-odoo\/"},"modified":"2026-10-22T07:34:05","modified_gmt":"2026-10-22T07:34:05","slug":"erp7-solutions-sync-for-odoo-and-woocommerce","status":"publish","type":"plugin","link":"https:\/\/it.wordpress.org\/plugins\/erp7-solutions-sync-for-odoo-and-woocommerce\/","author":14895929,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.3.4","stable_tag":"2.3.4","tested":"7.1.3","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Odoo Integration for WooCommerce","header_author":"Smgom","header_description":"Sync WooCommerce products, orders, customers, and inventory with Odoo ERP through the OdooConnector cloud service. Supports all Odoo versions via a single unified API.","assets_banners_color":"2d203f","last_updated":"2026-10-22 07:34:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/odooconnector.cloud","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":30,"downloads":1799,"num_ratings":8,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"smgom","date":"2026-07-22 12:20:35","revision":3618563},"2.1.1":{"tag":"2.1.1","author":"smgom","date":"2026-07-24 12:45:48","revision":3621276},"2.1.2":{"tag":"2.1.2","author":"smgom","date":"2026-07-27 06:13:50","revision":3624017},"2.1.3":{"tag":"2.1.3","author":"smgom","date":"2026-07-30 07:17:46","revision":3628070},"2.1.4":{"tag":"2.1.4","author":"smgom","date":"2026-08-03 07:12:06","revision":3632450},"2.2.0":{"tag":"2.2.0","author":"smgom","date":"2026-08-06 06:22:59","revision":3636162},"2.2.1":{"tag":"2.2.1","author":"smgom","date":"2026-08-07 06:10:14","revision":3637414},"2.2.10":{"tag":"2.2.10","author":"smgom","date":"2026-09-29 12:14:16","revision":3718997},"2.2.2":{"tag":"2.2.2","author":"smgom","date":"2026-08-07 16:23:15","revision":3638102},"2.2.3":{"tag":"2.2.3","author":"smgom","date":"2026-08-18 10:47:51","revision":3652567},"2.2.4":{"tag":"2.2.4","author":"smgom","date":"2026-08-20 05:46:25","revision":3655879},"2.2.5":{"tag":"2.2.5","author":"smgom","date":"2026-08-21 16:09:30","revision":3659338},"2.2.6":{"tag":"2.2.6","author":"smgom","date":"2026-09-04 10:07:06","revision":3681011},"2.2.8":{"tag":"2.2.8","author":"smgom","date":"2026-09-18 11:42:25","revision":3701899},"2.2.9":{"tag":"2.2.9","author":"smgom","date":"2026-09-25 05:59:41","revision":3712454},"2.3.0":{"tag":"2.3.0","author":"smgom","date":"2026-09-29 12:51:31","revision":3719071},"2.3.1":{"tag":"2.3.1","author":"smgom","date":"2026-10-02 13:43:06","revision":3724890},"2.3.2":{"tag":"2.3.2","author":"smgom","date":"2026-10-07 10:01:59","revision":3732312},"2.3.3":{"tag":"2.3.3","author":"smgom","date":"2026-10-19 13:42:58","revision":3754853},"2.3.4":{"tag":"2.3.4","author":"smgom","date":"2026-10-22 07:34:05","revision":3759473}},"upgrade_notice":{"2.3.4":"<p>Orders sent to Odoo as they happen now go into the sales team you chose under Sales Team Mapping, instead of Odoo&#039;s default team.<\/p>","2.3.3":"<p>Exported orders match WooCommerce \u2014 coupons, VAT per line, totals \u2014 Export Products no longer overwrites Odoo&#039;s prices or cost, and checkout no longer waits for Odoo. The first Export Products after updating sends each product once more.<\/p>","2.3.2":"<p>Fixes the Plans tab showing a Pro card with no price and no way to subscribe, and &quot;Pro plan active&quot; appearing on stores that never paid. Product import now follows the schedule you set, excluded categories are excluded everywhere, order status changes in Odoo can update existing WooCommerce orders, and progress bars count the run you are watching. Recommended for every store.<\/p>","2.3.1":"<p>Fixes a fatal error when activating the plugin on stores west of UTC. Install this if activation failed for you on 2.3.0.<\/p>","2.3.0":"<p>Odoo 20 is fully supported \u2014 imported order lines arrive with their descriptions, and invoices, payments and credit notes all use Odoo 20&#039;s own call shapes. Credit notes raised in Odoo now import as WooCommerce refunds. A sync your plan does not cover stops and says so instead of retrying for days. Recommended for every store, and required for anyone on Odoo 20.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":8},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3621283,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3621283,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3621283,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3733735,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3733931,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","2.1.1","2.1.2","2.1.3","2.1.4","2.2.0","2.2.1","2.2.10","2.2.2","2.2.3","2.2.4","2.2.5","2.2.6","2.2.8","2.2.9","2.3.0","2.3.1","2.3.2","2.3.3","2.3.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3681011,"resolution":"1","location":"assets","locale":"","width":1280,"height":860},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3681011,"resolution":"2","location":"assets","locale":"","width":1280,"height":860},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3681011,"resolution":"3","location":"assets","locale":"","width":1280,"height":860},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3681011,"resolution":"4","location":"assets","locale":"","width":1280,"height":860},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3681011,"resolution":"5","location":"assets","locale":"","width":1280,"height":860},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3681011,"resolution":"6","location":"assets","locale":"","width":1280,"height":860},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3681011,"resolution":"7","location":"assets","locale":"","width":1280,"height":860}},"screenshots":{"1":"WooCommerce Odoo sync dashboard \u2014 what has synced, what runs next, and the last orders that reached Odoo","2":"WooCommerce product sync with Odoo \u2014 import from Odoo and export back, each direction switched on separately","3":"WooCommerce to Odoo order sync settings \u2014 export on checkout at the statuses you choose, and import Odoo orders back","4":"Odoo sync logs \u2014 a plain-language record of every product and order, filterable by type and context","5":"WooCommerce customer export to Odoo \u2014 in bulk or the moment an account changes, limited to the roles you pick","6":"Odoo sync defaults: company, warehouse and price list \u2014 company, warehouse, price list, journals and tax, chosen from your own Odoo","7":"Plans \u2014 every feature is in the plugin; the service plan governs how much you sync, never what works"}},"plugin_section":[],"plugin_tags":[12827,152463,19380,65950,286],"plugin_category":[45],"plugin_contributors":[272789],"plugin_business_model":[],"class_list":["post-335597","plugin","type-plugin","status-publish","hentry","plugin_tags-erp","plugin_tags-inventory-sync","plugin_tags-odoo","plugin_tags-order-sync","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-smgom","plugin_committers-smgom"],"banners":{"banner":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/banner-772x250.png?rev=3733931","banner_2x":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/banner-1544x500.png?rev=3733735","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/icon.svg?rev=3621283","icon":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/icon.svg?rev=3621283","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/screenshot-1.png?rev=3681011","caption":"WooCommerce Odoo sync dashboard \u2014 what has synced, what runs next, and the last orders that reached Odoo"},{"src":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/screenshot-2.png?rev=3681011","caption":"WooCommerce product sync with Odoo \u2014 import from Odoo and export back, each direction switched on separately"},{"src":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/screenshot-3.png?rev=3681011","caption":"WooCommerce to Odoo order sync settings \u2014 export on checkout at the statuses you choose, and import Odoo orders back"},{"src":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/screenshot-4.png?rev=3681011","caption":"Odoo sync logs \u2014 a plain-language record of every product and order, filterable by type and context"},{"src":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/screenshot-5.png?rev=3681011","caption":"WooCommerce customer export to Odoo \u2014 in bulk or the moment an account changes, limited to the roles you pick"},{"src":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/screenshot-6.png?rev=3681011","caption":"Odoo sync defaults: company, warehouse and price list \u2014 company, warehouse, price list, journals and tax, chosen from your own Odoo"},{"src":"https:\/\/ps.w.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/assets\/screenshot-7.png?rev=3681011","caption":"Plans \u2014 every feature is in the plugin; the service plan governs how much you sync, never what works"}],"raw_content":"<!--section=description-->\n<p><strong>Sync WooCommerce and Odoo automatically \u2014 orders, products, inventory, customers, invoices and payments, in both directions, with no CSVs and no manual re-keying.<\/strong><\/p>\n\n<p>This WooCommerce Odoo integration connects your storefront to your back office. Set it up once and every order, customer, product and payment reaches Odoo's Sales, Inventory and Invoicing apps on its own. <a href=\"https:\/\/odooconnector.cloud\/docs\">Read the setup guide<\/a> or <a href=\"https:\/\/odooconnector.cloud\/pricing\">see how the plans compare<\/a>.<\/p>\n\n<p>Built for stores that cannot afford synchronization errors, this connector runs on an asynchronous background queue. This means a slow Odoo server will never slow down your WooCommerce checkout.<\/p>\n\n<p>Fully compatible with Odoo 16, 17, 18, 19, and 20, WooCommerce HPOS, and block-based checkouts.<\/p>\n\n<h4>Automated Order Management (Bi-Directional)<\/h4>\n\n<ul>\n<li><strong>Triggered on Checkout:<\/strong> Orders export to Odoo before the customer even sees the thank-you page.<\/li>\n<li><strong>Status-Based Rules:<\/strong> Choose exactly which orders export. (e.g., Send \"Processing\" orders automatically, but hold \"Pending Payment\" or \"COD\" orders).<\/li>\n<li><strong>Quotation or Sales Order:<\/strong> Draft incoming WooCommerce orders as Odoo Quotations for manual review, or push them straight through as confirmed Sales Orders.<\/li>\n<li><strong>Custom Numbering:<\/strong> Keep your exact WooCommerce order numbers in Odoo (with optional prefixes\/suffixes) so your referencing stays clean.<\/li>\n<li><strong>Discount &amp; Shipping Mapping:<\/strong> Shipping costs and coupon codes land on their own specific Odoo order lines, keeping your accountant happy and reporting accurate.<\/li>\n<li><strong>Odoo to WooCommerce Import:<\/strong> Pull Odoo sales orders down into WooCommerce on a schedule or on demand.<\/li>\n<li><strong>Built for Volume:<\/strong> Orders travel to Odoo in batches of 25 rather than one at a time, which is what turns a backlog of several thousand orders into a job of hours rather than days.<\/li>\n<\/ul>\n\n<h4>Smart Invoicing &amp; Payment Routing<\/h4>\n\n<ul>\n<li><strong>Automated Financials:<\/strong> Odoo invoices are created automatically based on the order statuses you define.<\/li>\n<li><strong>Payment Journal Mapping:<\/strong> Route funds correctly. Stripe payments, PayPal funds, and Cash on Delivery can each land in their own dedicated Odoo payment journal \u2014 eliminating month-end reclassification.<\/li>\n<li><strong>Automated Credit Notes:<\/strong> Processing a refund in WooCommerce automatically generates the corresponding credit note in Odoo.<\/li>\n<li><strong>Invoice State Control:<\/strong> Separate your triggers. Choose one status to mark an invoice in payment and another to mark it fully paid.<\/li>\n<\/ul>\n\n<h4>Complete Product &amp; Inventory Sync<\/h4>\n\n<ul>\n<li><strong>Two-Way Product Sync:<\/strong> Import and export products, including complex variations, attributes, nested categories, and high-res images.<\/li>\n<li><strong>Intelligent Stock Rules:<\/strong> Sync Quantity Available or Quantity On Hand based on what your fulfillment team actually trusts. Limit stock sync to specific Odoo warehouses.<\/li>\n<li><strong>Field Mapping:<\/strong> Carry custom data between systems. Map WooCommerce standard or custom fields directly to Odoo custom fields (<code>x_...<\/code>), in either direction, including fields on variants.<\/li>\n<li><strong>Barcode &amp; SKU Matching:<\/strong> Prevent duplicates. Link your existing Odoo catalog to your store via Internal Reference (<code>default_code<\/code>) or Barcode matching.<\/li>\n<li><strong>Safe Updates:<\/strong> On re-import, choose to update everything, update price\/stock only, or leave existing WooCommerce product details untouched.<\/li>\n<li><strong>Images on Their Own Terms:<\/strong> Import images on a dedicated Media tab, at the size you choose (thumbnail through to the full 1920px), and an image is downloaded again only when Odoo's copy has actually changed.<\/li>\n<\/ul>\n\n<h4>Customer &amp; CRM Alignment<\/h4>\n\n<ul>\n<li><strong>Flexible Customer Handling:<\/strong> Create a unique Odoo contact for every buyer, log guest checkouts, route orders by tag, or map all B2C retail orders to one single \"Web Sales\" customer account.<\/li>\n<li><strong>Role-Based Export:<\/strong> Choose which WordPress user roles sync to Odoo, keeping your ERP contacts free of store administrators and subscribers.<\/li>\n<\/ul>\n\n<h4>Built for Enterprise Reliability<\/h4>\n\n<p>We know what happens when a sync fails during a busy sales event. We built this connector to be transparent, resilient, and honest.<\/p>\n\n<ul>\n<li><strong>Asynchronous Background Queue:<\/strong> Every sync runs through a background queue with automatic retries. Your site performance is completely isolated from Odoo's uptime.<\/li>\n<li><strong>Human-Readable Logs:<\/strong> No cryptic error codes. Get plain-language messages (e.g., \"Odoo returned a temporary error \u2014 retrying automatically\"). Full technical payloads are one click away for debugging.<\/li>\n<li><strong>Secure Webhooks:<\/strong> Authenticated webhook callbacks confirm every synchronization result.<\/li>\n<li><strong>Honest Dashboards:<\/strong> Live progress reporting. See exactly how many records synced and how many failed. Failures never quietly disappear from the total.<\/li>\n<li><strong>Multi-Company Odoo Support:<\/strong> Explicitly pick which Odoo company your store synchronizes with.<\/li>\n<\/ul>\n\n<h4>Pricing &amp; Transparency<\/h4>\n\n<p>Every single feature listed above is fully functional in the plugin itself. There are no disabled code paths, trialware gates, or hidden \"Pro-only\" toggle switches inside WordPress. The connection runs through the OdooConnector service.<\/p>\n\n<ul>\n<li><strong>Free Plan:<\/strong> Includes 10 orders, 10 products, and 10 customers synced per month forever. Ideal for testing and very low-volume setups.<\/li>\n<li><strong>Paid Plans:<\/strong> Removes the volume limits for growing stores. Every paid plan includes a 14-day free trial (cancel anytime, no charge until the trial ends).<\/li>\n<li><strong>Real Support:<\/strong> Live-chat support is built directly into the plugin settings page \u2014 and yes, we provide support to Free plan users, too.<\/li>\n<\/ul>\n\n<h4>Technical Requirements<\/h4>\n\n<ul>\n<li>WooCommerce 7.0 or higher<\/li>\n<li>Compatible with WooCommerce High-Performance Order Storage (HPOS)<\/li>\n<li>An active Odoo instance (URL, database name, username, password)<\/li>\n<li>Compatible with Odoo versions 16, 17, 18, 19, and 20<\/li>\n<li>Network access to the OdooConnector service<\/li>\n<\/ul>\n\n<h4>Ready in 3 Minutes<\/h4>\n\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Enter your Odoo URL and credentials, then click \"Test Connection.\"<\/li>\n<li>Place a test order in WooCommerce and watch it appear in Odoo instantly.<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/erp7-solutions-sync-for-odoo-and-woocommerce\/<\/code> (or install via WordPress admin)<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress<\/li>\n<li>Navigate to WooCommerce \u2192 Odoo Connector and enter your Odoo URL, database, username, and password, then test the connection<\/li>\n<li>Configure sync preferences and save<\/li>\n<li>Optionally subscribe to the OdooConnector service from the Features tab for unlimited middleware order sync<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20plugin%20free%3F%20does%20it%20require%20a%20paid%20service%3F\"><h3>Is this plugin free? Does it require a paid service?<\/h3><\/dt>\n<dd><p>The plugin is free and every feature in it is fully functional. Synchronization runs through the OdooConnector cloud service, whose free plan includes 10 order, 10 product, and 10 customer syncs per calendar month \u2014 enough to run a small store or evaluate everything. Paid service plans remove the limits and add inventory\/price sync, and come with a 14-day free trial.<\/p><\/dd>\n<dt id=\"how%20do%20i%20sync%20woocommerce%20orders%20to%20odoo%3F\"><h3>How do I sync WooCommerce orders to Odoo?<\/h3><\/dt>\n<dd><p>Install the plugin, enter your Odoo URL and credentials, and enable \"Export on checkout\". From then on every order is created in Odoo automatically \u2014 customer, order lines, invoice, and payment included. You can also export on specific status changes or with one click from the Orders tab.<\/p><\/dd>\n<dt id=\"can%20i%20import%20products%20from%20odoo%20to%20woocommerce%3F\"><h3>Can I import products from Odoo to WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Product sync works in both directions: import your Odoo catalog into WooCommerce (variations, attributes, categories, and images included) or export WooCommerce products to Odoo, manually or on a schedule.<\/p><\/dd>\n<dt id=\"are%20any%20features%20locked%20behind%20a%20paid%20upgrade%20in%20the%20plugin%3F\"><h3>Are any features locked behind a paid upgrade in the plugin?<\/h3><\/dt>\n<dd><p>No \u2014 everything is built into this one plugin, with no license check, feature gate, or add-on to install. Here is what each plan of the OdooConnector service provides:<\/p>\n\n<p>Free:<\/p>\n\n<ul>\n<li>Order export to Odoo \u2014 automatic on checkout, on status change, and manual<\/li>\n<li>Order import from Odoo, invoice creation, payment registration, and refund sync (credit notes)<\/li>\n<li>Product import and export, customer export<\/li>\n<li>10 orders, 10 products, and 10 customers synced per month<\/li>\n<li>Dashboard, sync logs, and live-chat support<\/li>\n<\/ul>\n\n<p>Paid:<\/p>\n\n<ul>\n<li>Everything in Free, with unlimited syncs<\/li>\n<li>Inventory and price sync (scheduled and on-demand, per warehouse)<\/li>\n<li>Scheduled automation with background processing<\/li>\n<li>Priority email support<\/li>\n<li>14-day free trial \u2014 cancel anytime<\/li>\n<\/ul>\n\n<p>The Plans tab in the plugin shows the full comparison.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20odoo%20online%20%28odoo.com%29%20and%20odoo.sh%3F\"><h3>Does it work with Odoo Online (odoo.com) and Odoo.sh?<\/h3><\/dt>\n<dd><p>Yes. Any Odoo instance the OdooConnector service can reach over the internet works: Odoo Online (odoo.com), Odoo.sh, and self-hosted Odoo Community or Enterprise.<\/p><\/dd>\n<dt id=\"which%20odoo%20versions%20are%20supported%3F\"><h3>Which Odoo versions are supported?<\/h3><\/dt>\n<dd><p>Odoo 16 through 20 are supported. For Odoo 16\u201318 the service communicates with your Odoo instance over XML-RPC; for Odoo 19 and later it uses Odoo's modern JSON-2 API. Your Odoo version is detected automatically when you connect \u2014 there is nothing to select or configure, and the detected version is shown in the API Connection bar.<\/p><\/dd>\n<dt id=\"how%20do%20i%20create%20an%20odoo%20api%20key%3F\"><h3>How do I create an Odoo API key?<\/h3><\/dt>\n<dd><p>In Odoo, open Preferences \u2192 Account Security \u2192 New API Key, copy the generated key, and paste it into the Password \/ API Key field on the API Settings tab. The key is shown only once. An API key is required on Odoo 19 and later; on Odoo 16\u201318 your account password also works. Full step-by-step guide, including where to find your server URL, database name and username: https:\/\/odooconnector.cloud\/docs\/odoo-api-credentials<\/p><\/dd>\n<dt id=\"is%20hpos%20supported%3F\"><h3>Is HPOS supported?<\/h3><\/dt>\n<dd><p>Yes, this plugin is fully compatible with WooCommerce High-Performance Order Storage (HPOS).<\/p><\/dd>\n<dt id=\"how%20do%20i%20sync%20woocommerce%20stock%20with%20odoo%20inventory%3F\"><h3>How do I sync WooCommerce stock with Odoo inventory?<\/h3><\/dt>\n<dd><p>Turn on Inventory sync in Settings \u2192 Products. Stock levels are read from Odoo on a schedule you choose and written to the matching WooCommerce products, matched by SKU. The inventory sync owns quantities on its own \u2014 no field mapping is needed for it, and a mapping rule cannot write stock, so the two can never fight over the same number.<\/p><\/dd>\n<dt id=\"how%20do%20i%20sync%20woocommerce%20refunds%20as%20odoo%20credit%20notes%3F\"><h3>How do I sync WooCommerce refunds as Odoo credit notes?<\/h3><\/dt>\n<dd><p>Both directions work. A refund made in WooCommerce is sent to Odoo as a credit note against the invoice for that order. A credit note raised in Odoo is imported back as a WooCommerce refund, matched to the order it belongs to \u2014 line by line when the note names lines, and as a total otherwise.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20odoo%20community%20edition%3F\"><h3>Does it work with Odoo Community edition?<\/h3><\/dt>\n<dd><p>Yes. The plugin reads and writes Odoo's standard models \u2014 products, sale orders, contacts and invoices \u2014 all of which are in Community. You need the Sales and Inventory apps installed for product and order sync, and Invoicing if you want invoices and payments.<\/p><\/dd>\n<dt id=\"how%20do%20i%20connect%20woocommerce%20to%20odoo%2017%2C%2018%2C%2019%20or%2020%3F\"><h3>How do I connect WooCommerce to Odoo 17, 18, 19 or 20?<\/h3><\/dt>\n<dd><p>The same way for every version: paste your Odoo URL, database name, username and API key on the API Settings tab, then press Test Connection. Your Odoo version is detected for you \u2014 XML-RPC is used for Odoo 16 to 18 and Odoo's JSON-2 API for 19 and later \u2014 so there is nothing to choose.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20the%20free%20and%20paid%20versions%3F\"><h3>What is the difference between the free and paid versions?<\/h3><\/dt>\n<dd><p>Every feature is in the plugin itself, free. The paid plan governs how much you sync, never what works: the free plan includes 10 order, product and customer syncs per month, and Pro removes the limits. Nothing is disabled, no feature is held back, and your settings keep working if a plan lapses.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.3.4<\/h4>\n\n<ul>\n<li>Fixed - Orders sent to Odoo as they happen go into the sales team chosen under Sales Team Mapping. Only orders sent with Export Orders carried it; every other order landed in Odoo's default team, so a store that picked \"Website\" found its orders under \"Sales\" (or its translation). Orders already in Odoo keep their team, and with no team chosen Odoo still picks one<\/li>\n<\/ul>\n\n<h4>2.3.3<\/h4>\n\n<ul>\n<li>Added - Customer import (Odoo \u2192 WooCommerce) has controls you can find. The flow existed but had no screen: its switch and frequency were on a tab that is not in the menu, there was no way to start it, and nothing said whether it had ever run. It now has a card on the Customers tab with a switch, a frequency, an Import Customers button and the time of the last run. Addresses are optional: off, only the name, email and phone come over and WooCommerce's own addresses are left alone. A run queues every customer Odoo has, instead of the same arbitrary 500 every time while the rest stayed unreachable. Contacts are read in batches rather than one at a time, so a thousand customers take a minute instead of eight. An Odoo too large for one run carries on from where it stopped. A run shows its progress and names each contact as it arrives \u2014 customer import was missing from the list the sync widget reads, so it reported nothing anywhere<\/li>\n<li>Added - Field mapping for Orders and Customers. The tabs said \"Coming soon\" for something three-quarters built: the sync paths already applied a mapping and only the editor was missing. Order export, order import, customer export and customer import now all map custom fields<\/li>\n<li>Added - Your settings are sent to support, redacted. An Odoo password, username, API key or webhook secret is never included \u2014 only whether one is set \u2014 so a configuration question can be answered without handing over admin access to your site<\/li>\n<li>Added - \"Publish Odoo internal notes\", off by default. See the fix below for why it exists<\/li>\n<li>Added - \"Update price on existing products\", on by default, under Products \u2192 Export to Odoo. Turn it off where Odoo owns pricing: an export then carries names, SKUs, categories and stock as usual but never changes the price of a product Odoo already has. A product being created is still given its price, because there is nothing to preserve. The mirror of \"Update prices\" on the import side, which has governed the other direction all along<\/li>\n<li>Added - \"VAT from WooCommerce on each line\" under Orders \u2192 Shipping and discounts, off by default. Each exported order line, shipping included, gets the Odoo sales tax matching the rate WooCommerce charged \u2014 a 5.5% book and a 20% gift card each get theirs, and an untaxed line stays untaxed \u2014 ahead of the Sync defaults order tax. A rate with no matching Odoo tax keeps the tax it would have had, and the log says so. The Orders tab now explains which tax a line gets with it on and off. Needs the matching connector update<\/li>\n<li>Added - The Odoo order shows the coupon codes used and the customer's note from checkout. Neither reached Odoo before. Coupon codes on orders sent with Export Orders need the matching connector update<\/li>\n<li>Added - An exported order's total is checked against WooCommerce's. A few cents of rounding are covered by one untaxed \"Rounding (WooCommerce total)\" line on a service product, so Odoo's total matches; a larger difference is logged and left as it is, not hidden. Needs the matching connector update<\/li>\n<li>Added - A warning under Export Stock while order export is on too. Each exported order already creates a delivery in Odoo, so writing WooCommerce's quantity as on-hand takes sold items off twice<\/li>\n<li>Fixed - A product sync no longer attaches a category the product does not belong to. Products filed under one category came back from every sync with an unrelated one as well \u2014 women's vests also under footwear, men's windbreakers also under t-shirts \u2014 the same products and the same wrong pairing on every run, and correcting them by hand was undone by the next sync. The plugin records which Odoo category each WooCommerce category stands for, and nothing kept that one to one; where two of them claimed the same Odoo category, the import took whichever had been recorded first, which was not the right one. That record is now kept one to one, a category is identified by its name and its place in the tree rather than by whichever row answered first, and an import can take back a category it assigned and no longer sends. A category you added in WooCommerce yourself is left alone<\/li>\n<li>Fixed - Refunding part of an order no longer credits all of it in Odoo. A refund entered as an amount \u2014 the ordinary way to refund part of an order \u2014 arrived with no lines, which read as \"refund everything\": a 25.00 refund against a 110.00 invoice raised a 110.00 credit note and marked the invoice reversed, crediting the customer 85.00 nobody had given them. An amount smaller than the invoice now credits that amount. A refund for the whole invoice still reverses it line by line, which keeps the invoice's own tax treatment<\/li>\n<li>Fixed - Editing a customer's billing address no longer adds another contact to them in Odoo every time. One customer reached six, and the oldest \u2014 the one Odoo displays and earlier records point at \u2014 held the address they had moved away from. The customer save was using the matcher written for order addresses, which keeps a separate contact for each distinct address because an order already shipped has to keep the address it went to. A customer's own address book is now one invoice and one delivery contact, kept current<\/li>\n<li>Fixed - A refund imported from Odoo is no longer sent straight back to Odoo as a second credit note. Nothing asked where a refund had come from, so an imported credit note was raised again \u2014 crediting the order twice, once by whoever raised it in Odoo and once by this<\/li>\n<li>Fixed - An invoice whose reply was lost can be found again. When the call that creates an invoice timed out on the way back, Odoo had created it but the store never learned its number, and every retry was told the order was already invoiced and treated that as a failure. Refund export for that order then failed for good with \"No invoice found in Odoo for this order\". A retry now returns the invoice that already exists<\/li>\n<li>Fixed - An imported product is not put on sale without a price. A new product was created published and out of stock with no price at all, and stayed that way until the separate inventory and price sync ran \u2014 on a daily schedule, a day of shop a customer could neither buy from nor judge. It is created as a draft now and published as soon as it has a price. This only happens where \"Update prices\" is on, because the price sync is what publishes it; with that off nothing would ever lift the draft and the import behaves as before. A product you have already published is never unpublished by an import, and a draft you created yourself is left alone<\/li>\n<li>Fixed - A WooCommerce order cancelled in Odoo is no longer reported as a refusal. The cancellation itself worked, and the order was then noted with \"Odoo did not cancel this order\" and a warning in the log, because the plugin was looking for a word in the reply that the reply does not carry<\/li>\n<li>Fixed - An order Odoo has locked now completes in WooCommerce. Odoo's final state was being read as \"processing\", so Completed could never arrive from Odoo however the store was configured. Odoo 19 and 20 have no such state, so this affects 16, 17 and 18<\/li>\n<li>Fixed - The settings reported for support are the settings you have. Most of them are kept in a single record, and that record was large enough to be dropped whole as \"too large\" \u2014 so 93 of the 130 settings the support view describes read as never configured while the plugin was using real values<\/li>\n<li>Fixed - A tax of 10% is written in the log as 10%, not 1000%<\/li>\n<li>Fixed - \"Export Price\" and \"Export Stock\" apply to variations. They were read only when building a simple product, so a store that had turned Export Price off kept sending variation prices to Odoo while its simple products withheld theirs \u2014 the settings quietly meant \"simple products only\". The values are now left out of the payload rather than sent as zero, and every place that writes a variant treats a missing price as \"leave Odoo's alone\": sending the 0 they previously fell back to would have made a setting that means \"do not export prices\" erase them instead<\/li>\n<li>Fixed - Odoo's internal notes could be published on your storefront. Odoo keeps two description fields: an internal one staff write for each other, and a Sales Description it shows customers. The import put the internal one into the WooCommerce long description \u2014 the body of the public product page. The customer-facing text is used now; the old behaviour is available as a setting<\/li>\n<li>Fixed - \"Odoo Order Creation State: Quotation\" was ignored and every exported order arrived confirmed. The cause was a step that confirmed any draft order \"to trigger tax calculation\", whatever the setting said. Odoo works out the tax on a quotation by itself. Asking for an invoice still confirms the order, because Odoo cannot invoice a quotation, and the log says so when it happens<\/li>\n<li>Fixed - Customers were exported even when no user role was selected. The scheduled run and the Start Export button both refused, as the help text promised; the live update when a customer was saved checked nothing and sent every one<\/li>\n<li>Fixed - An order tax deleted in Odoo now fails the export with the name of the setting that holds it and the page to fix it on, instead of Odoo's own \"Record does not exist or has been deleted. (Record: account.tax(284,), User: 2)\"<\/li>\n<li>Fixed - A WooCommerce order cancelled after export now cancels its Odoo sale order<\/li>\n<li>Fixed - Credit notes raised in Odoo can be imported as WooCommerce refunds on demand, not only on a schedule<\/li>\n<li>Fixed - Order status import no longer reopens orders you have finished. Completed and Cancelled orders were being set back to Processing<\/li>\n<li>Fixed - Pressing Update on an unchanged product no longer rewrites Odoo's price and stock with WooCommerce's older copy, and no longer writes a price of zero over it. A simple product is written twice in Odoo \u2014 on the template and on its variant \u2014 and the second write was sending the regular price over the sale price the first had just set, or a zero when there was no price to send<\/li>\n<li>Fixed - The inventory and price import honours \"Exclude from Odoo sync\"<\/li>\n<li>Fixed - New import settings apply to products you already have, instead of waiting for the Odoo product to change<\/li>\n<li>Fixed - A product image replaced in Odoo now reaches WooCommerce, and the old file no longer stays behind in the Media Library. Images are deliberately left out of the check that decides whether a product needs rewriting, because an image carries a check of its own \u2014 but the two were each waiting for the other, so a product whose only change in Odoo was its picture kept the old one indefinitely<\/li>\n<li>Fixed - Buttons that finish with nothing to do say so. \"Import Images\" wrote its message into a panel it then animated shut, so the button looked broken<\/li>\n<li>Fixed - Run counts describe the run. \"Products Created: 37\" for three new products, \"imported \u2192\" in the log for products that were skipped, and a dashboard reading 0 exported after two exports<\/li>\n<li>Fixed - Each Products sub-tab reports its own last run. Inventory and Media showed the product import's time under their own heading<\/li>\n<li>Fixed - The dashboard names an order the way Odoo does \u2014 S00042, or your WooCommerce number \u2014 instead of Odoo's internal row id, which appears nowhere in Odoo and cannot be looked up<\/li>\n<li>Fixed - Products with no value in the field your store matches on are counted and reported once, with the field named. A catalogue with 34 such products logged 34 failures on every run<\/li>\n<li>Fixed - The connection message reports the version Odoo itself gives, not the one picked in the dropdown, so it stops disagreeing with the badge beside it<\/li>\n<li>Fixed - A coupon sent to Odoo as a discount line takes the tax down as it does in WooCommerce. The discount is split into one line per VAT rate, each with that rate; a single untaxed line left Odoo taxing the full price (Odoo 56.47 for a WooCommerce 55.80). Orders sent with Export Orders need the matching connector update<\/li>\n<li>Fixed - With a Discount product named, orders exported as they happen send the coupon as its own line, as the Orders tab says, instead of discounting the product lines. The \"Discount the product lines instead\" switch greys as soon as a product is typed, not only after saving<\/li>\n<li>Fixed - Checkout no longer waits 15\u201330 seconds for the customer to be written in Odoo. With customer export on, a customer saved at checkout is sent by the background queue; saves in wp-admin still go at once<\/li>\n<li>Fixed - Export Products no longer re-sends a product nobody changed. A product whose price or stock had just been sent went out again on the next run. The first run after updating sends each product once more<\/li>\n<li>Fixed - The Export Products panel stays open when the run ends and says what happened \u2014 sent, unchanged, left out, failed \u2014 instead of disappearing. A run with nothing to send still logs that it finished, including one started straight after another<\/li>\n<li>Fixed - The order export summary adds up: never a negative \"skipped\" or a total of 0, and an order exported on its own reads \"1 exported, 0 skipped or failed (of 1 total)\"<\/li>\n<li>Fixed - Saving Connection or Sync defaults returns to the same tab once setup is done, instead of moving on to the next setup step every time<\/li>\n<li>Fixed - \"Next Scheduled Sync\" counts order import and customer import schedules. A store scheduling only those read \"Not scheduled\"<\/li>\n<li>Fixed - Prices go to Odoo as 25.99, not 25.989999999999998, on hosts whose PHP writes decimals at full precision<\/li>\n<li>Fixed - The Cache tab shows when cached Odoo data expires on hosts with Redis or Memcached, instead of \"Expired\" for everything even after Refresh<\/li>\n<li>Fixed - \"Undefined array key 0\" warnings in PHP logs when Odoo returned a linked record as a record rather than a pair. The link itself \u2014 a sales team's company, for one \u2014 was lost too<\/li>\n<li>Fixed - A line with no tax is noted in the log instead of being reported as a fault<\/li>\n<li>Fixed - Cancelling an order in WooCommerce reaches Odoo even when the store's connector token had just been cleared \u2014 it expires, and it is cleared when the company is changed in Sync defaults. The cancel was refused as \"not connected\" until some other call fetched a new token; it now logs in first. Card and plan changes on the Plans screen benefit the same way<\/li>\n<li>Changed - Help text that described behaviour the plugin does not have. Shipping, fee and coupon amounts are not dropped when you name no product \u2014 one is created from the method or fee name. Only one price goes to Odoo, which has a single sales price per product, and it is the one a customer pays<\/li>\n<li>Changed - The Cache tab no longer offers Territories, Cost Centers or Customer Groups. They are vocabulary from another system, nothing read them, and refreshing them did nothing<\/li>\n<li>Changed - \"Enable Product Export\" turns the feature on; it no longer sends a product every time one is saved. Exporting on save is its own setting now, \"Export as products are saved\", off by default. The master switch registering the save hooks meant anything that saves products in bulk \u2014 a CSV import, a bulk edit, another plugin \u2014 produced one request to Odoo per product with no pacing, which is a common cause of timeouts during an import. The Export Products button is unaffected: the master switch still governs it<\/li>\n<li>Changed - A product with no SKU is no longer exported to Odoo, and the log names the product and says why. SKU is what the two systems match on \u2014 it becomes Odoo's Internal Reference, or Barcode under the other mapping, and it is how a later export finds the record it already created instead of making a second one. Variations were already refused for exactly this, so a store could export a SKU-less product while every SKU-less variation under it was skipped. It is one rule now. A variable product is the exception it has to be: Odoo keeps the reference on each variant and a template with several of them commonly has none, so a parent without a SKU is exported as long as its variations have them \u2014 and refused only when nothing underneath has one either<\/li>\n<\/ul>\n\n<h4>2.3.2<\/h4>\n\n<ul>\n<li>Added - Order status changes in Odoo can now update orders that already exist in WooCommerce, not only orders being imported for the first time. One switch, \"Update order\", and it is obeyed by both the manual import and the scheduled one<\/li>\n<li>Added - Product import schedules are followed as set. A schedule changed to Daily kept running hourly, and \"Batch size\" now means what it says \u2014 how many records are read from Odoo per call \u2014 instead of silently capping the whole run<\/li>\n<li>Added - A product import whose previous run is still going is skipped rather than queued behind it, so an hourly schedule and a two-hour catalogue no longer pile up<\/li>\n<li>Fixed - The Plans tab could show a Pro card with no price and no subscribe button, with no way to pay. A failed price lookup was being cached as \"this connector sells nothing\" for five minutes; a failure is now a failure, the last known prices keep serving, and when there is genuinely nothing to show the card says so and offers to retry<\/li>\n<li>Fixed - \"Pro plan active\" could appear on a store that had never paid, while the page below it offered a free trial. The badge read a leftover local record; it now reads the same verdict as every other screen<\/li>\n<li>Fixed - A subscription that had been cancelled or moved to another store could linger locally forever. The hourly check now acts on \"this store has no subscription\" instead of ignoring it<\/li>\n<li>Fixed - A checkout in progress was not recorded locally at all: the column holding its id was too short for the id, and the write failed without a word<\/li>\n<li>Fixed - Importing images only asks Odoo for the products that have one. A catalogue of 20,000 products with few photos queued 20,000 jobs to discover there was nothing to fetch<\/li>\n<li>Fixed - Progress bars count the run you are watching. Four flows measured themselves against every row the site had ever queued, or against a start time the database could not read, so a 3,942-order export opened at 3,996 and a scheduled import reported from stale counters<\/li>\n<li>Fixed - Excluding a product category now excludes it everywhere \u2014 the scheduled import, the manual import and the counts all honour it<\/li>\n<li>Fixed - A variant whose SKU changed in Odoo is picked up again. Products were compared by a date that moves on any edit, so a renamed SKU could be skipped<\/li>\n<li>Fixed - Credit notes are matched to the WooCommerce order they belong to more reliably, including orders exported to Odoo before the note was raised<\/li>\n<li>Fixed - The dashboard's \"Products Synced\" tile counts the catalogue, not the successes twice: a run of 100 with 4 failures reads 96\/100<\/li>\n<li>Fixed - A sync started from an external cron manager shows its own progress and its own log, instead of 0% under the previous run's output<\/li>\n<li>Fixed - \"Subscription already active\" no longer blocks a new checkout when nothing is actually active \u2014 an abandoned checkout or a lapsed trial is not a subscription<\/li>\n<li>Fixed - The payment method can be updated with any method the account offers, not card only<\/li>\n<li>Changed - The Orders and Customers tabs under Field mapping say \"Coming soon\" on the page instead of in a tooltip nobody sees. Their standard fields already sync; only custom-field mapping is still to come<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Fixed - Activating the plugin could fail outright on stores west of UTC. A one-off queue repair that runs during activation read a class constant before activation had loaded that class, which is a fatal error rather than a warning \u2014 and it only fires on a negative GMT offset, so every store in the Americas met it and no store east of London did<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Added - Odoo 20 is supported end to end. Order import reads a line's description from <code>label<\/code>, which is where Odoo 20 moved it \u2014 on Odoo 20 every imported line previously arrived with an empty description. Invoicing, payment registration and credit notes were re-checked against Odoo 20's own call shapes, and product images are read in the form Odoo 20 returns<\/li>\n<li>Added - Credit notes raised in Odoo import into WooCommerce as refunds, matched to the order they belong to, line by line where the note names lines<\/li>\n<li>Added - \"Export Invoice\" now issues the invoice at every point an order reaches Odoo, not only on one path. Stores had 7,958 exported orders and no invoices<\/li>\n<li>Added - A notification email address, so welcome, payment and uninstall mail can go somewhere other than the store's admin address<\/li>\n<li>Fixed - A sync the plan does not cover now stops and says so. Product import, product export and inventory sync used to retry the service's refusal every couple of hours indefinitely \u2014 one store did so for six days with its progress bar frozen at 50% and nothing on screen explaining why<\/li>\n<li>Fixed - The free monthly allowance is honoured even when the service cannot be reached. An unanswered usage check was treated as \"no limit\", and one store queued its entire 20,003-product catalogue on a free plan<\/li>\n<li>Fixed - Pressing Import Products no longer leaves the previous run's \"an active plan is required\" notice on screen after the plan is upgraded<\/li>\n<li>Fixed - Product export no longer stalls silently when the service declines to read your Odoo categories. The queued items are failed with the reason instead of being retried for ever<\/li>\n<li>Fixed - Two PHP warnings on sites with WP_DEBUG on: an undefined variable in the billing history fetch (which also meant the row limit never reached the service) and an undefined array key on stores with no customer accounts<\/li>\n<\/ul>\n\n<h4>2.2.9<\/h4>\n\n<ul>\n<li>Fixed - Stop could not end a sync that was still collecting the products it was about to work on. Nothing had been queued yet, so Stop found nothing to cancel and left the run marked as preparing: the widget went on reporting \"Sync in progress\" and the button could be pressed repeatedly with no effect<\/li>\n<li>Fixed - A new sync opened showing the previous run's log lines beneath a progress bar reading 0%, which reads as a run already well under way. The console is now cleared the moment a run starts collecting, and says what it is doing<\/li>\n<li>Fixed - Starting an image import on a large catalogue read the Odoo link back one product at a time \u2014 twenty thousand extra database queries inside a single admin request, long enough to be cut off before the run had queued anything<\/li>\n<\/ul>\n\n<p>For older releases, see the full changelog: https:\/\/plugins.svn.wordpress.org\/erp7-solutions-sync-for-odoo-and-woocommerce\/trunk\/changelog.txt<\/p>","raw_excerpt":"WooCommerce Odoo integration: sync orders, products, inventory, customers, invoices and payments automatically. Odoo 16 to 20, HPOS ready.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=335597"}],"author":[{"embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/smgom"}],"wp:attachment":[{"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335597"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335597"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335597"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335597"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335597"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/it.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}