Part 4: Syncing WooCommerce Customers to Odoo Contacts
Billable hours refers to the time spent on all activities on services for your client or employer that you’re getting payed for.

Yann Paul
HR Manager
Management

Part 4: Syncing WooCommerce Customers to Odoo Contacts
Customer data is one of the most important parts of a WooCommerce to Odoo integration.
Products define what is being sold. Orders define what has been purchased. But customers define who the sale belongs to.
If customer data is mapped incorrectly, the integration can quickly create duplicate contacts, incorrect invoices, disconnected sales history, and messy reporting inside Odoo.
Before syncing WooCommerce customers to Odoo, you need to understand how both systems store customer data and how customer records should be matched, created, and updated.
The main goal is to answer one simple question:
When a customer places an order in WooCommerce, which contact should that order connect to in Odoo?
This article will cover how to sync WooCommerce customers to Odoo contacts, including registered customers, guest customers, billing details, shipping details, company records, duplicate prevention, customer matching, and the res.partner model in Odoo.
Customer Data in WooCommerce
In WooCommerce, customer data is usually created during checkout.
A customer may exist as:
A registered WordPress user
A WooCommerce customer
A guest customer attached only to an order
This is an important difference.
Not every WooCommerce customer has a WordPress user account. Many stores allow guest checkout, which means the customer details are saved against the order, but no permanent user account is created.
For this reason, WooCommerce customer syncing should not only look at WordPress users. It also needs to look at order-level billing and shipping data.
WooCommerce Customer Data
WooCommerce customer data may include:
Customer Data | WooCommerce Source / Field |
|---|---|
Customer User ID |
|
Username |
|
Email Address |
|
First Name |
|
Last Name |
|
Display Name |
|
Billing First Name |
|
Billing Last Name |
|
Billing Company |
|
Billing Email |
|
Billing Phone |
|
Billing Address Line 1 |
|
Billing Address Line 2 |
|
Billing City |
|
Billing State / Region |
|
Billing Postcode / ZIP |
|
Billing Country |
|
Shipping First Name |
|
Shipping Last Name |
|
Shipping Company |
|
Shipping Address Line 1 |
|
Shipping Address Line 2 |
|
Shipping City |
|
Shipping State / Region |
|
Shipping Postcode / ZIP |
|
Shipping Country |
|
Customer Note |
|
Order ID |
|
Order Number |
|
Order History | Linked through |
For most WooCommerce to Odoo syncs, the most important fields are:
Billing email
Billing first name
Billing last name
Billing phone
Billing company
Billing address
Shipping address
Customer user ID, if the customer is registered
The billing email is usually the primary field used to match customers between WooCommerce and Odoo.
Customer Data in Odoo
In Odoo, customer data is usually stored in the res.partner model.
This model is used for contacts, companies, customers, vendors, invoice addresses, delivery addresses, and related contact records.
This is different from WooCommerce.
WooCommerce usually treats the customer as a checkout record or WordPress user.
Odoo treats the customer as a contact record that may have multiple related addresses and commercial relationships.
For example, one Odoo customer could be structured like this:
Odoo Record | Purpose |
|---|---|
Main Contact | The main customer or company |
Invoice Address | The billing address used for invoices |
Delivery Address | The shipping address used for deliveries |
Contact Person | A person connected to a company |
This structure is more powerful, but it also means customer syncing needs to be planned carefully.
Odoo Customer Data
Odoo customer data may include:
Customer Data | Odoo Model / Field |
|---|---|
Contact Name |
|
Company Name |
|
Is Company |
|
Contact Type |
|
Parent Company / Parent Contact |
|
Email Address |
|
Phone Number |
|
Mobile Number |
|
Street Address |
|
Street Address 2 |
|
City |
|
State / Region |
|
Country |
|
ZIP / Postcode |
|
VAT / Tax ID |
|
Customer Rank |
|
Supplier Rank |
|
Salesperson |
|
Pricelist |
|
Payment Terms |
|
Fiscal Position |
|
Internal Notes |
|
Company ID |
|
Language |
|
Active Status |
|
Related Sales Orders |
|
Related Invoices |
|
Invoice Address |
|
Delivery Address |
|
Contact Address |
|
The most important Odoo model for customer sync is:
res.partner
This is the record that WooCommerce customers will usually map to.
Mapping WooCommerce Customers to Odoo Contacts
Customer mapping is the process of deciding how WooCommerce customer data should connect to Odoo contact data.
At a basic level, the mapping may look like this:
WooCommerce Data | WooCommerce Field | Odoo Data | Odoo Field |
|---|---|---|---|
Billing First Name + Billing Last Name |
| Contact Name |
|
Billing Company |
| Company Name |
|
Billing Email |
| Email Address |
|
Billing Phone |
| Phone Number |
|
Billing Address Line 1 |
| Street Address |
|
Billing Address Line 2 |
| Street Address 2 |
|
Billing City |
| City |
|
Billing State / Region |
| State / Region |
|
Billing Country |
| Country |
|
Billing Postcode / ZIP |
| ZIP / Postcode |
|
Shipping First Name + Shipping Last Name |
| Delivery Contact Name |
|
Shipping Company |
| Delivery Company |
|
Shipping Address Line 1 |
| Delivery Street Address |
|
Shipping Address Line 2 |
| Delivery Street Address 2 |
|
Shipping City |
| Delivery City |
|
Shipping State / Region |
| Delivery State / Region |
|
Shipping Country |
| Delivery Country |
|
Shipping Postcode / ZIP |
| Delivery ZIP / Postcode |
|
Customer Note | Order customer note / | Internal Notes |
|
Customer User ID |
| External Reference | Custom field, for example |
Billing VAT / Tax Number | Custom checkout field, for example | VAT / Tax ID |
|
This mapping should be reviewed before customer sync is enabled.
The main question is not just what fields sync.
The main question is how the integration decides whether a customer already exists.
Customer Matching Rules
Customer matching is where most customer sync problems happen.
If the sync does not identify customers correctly, it may create duplicate contacts in Odoo.
For example, the same customer could appear as:
Tim Lopez
Timothy Lopez
Tim L
Tim Lopez Trading LLC
All of these may be the same customer, but Odoo will only know that if the sync has a clear matching rule.
Common matching rules include:
Matching Rule | WooCommerce Field | Odoo Field |
|---|---|---|
Match by Email Address |
|
|
Match by Phone Number |
|
|
Match by Company Name |
|
|
Match by VAT / Tax ID | Custom field, for example |
|
Match by WooCommerce Customer ID |
| Custom field, for example |
Match by WooCommerce Order Billing Details |
|
|
For most WooCommerce stores, email address is the simplest matching field.
The sync process would usually work like this:
A WooCommerce order is placed.
The sync reads the billing email from
_billing_email.Odoo is searched for a
res.partnerwhereemailmatches.If a matching customer is found, the order is connected to that customer.
If no customer is found, a new
res.partneris created.
This works well for simple B2C stores.
However, it may not be enough for B2B stores.
B2C Customer Mapping
For B2C stores, the customer is usually an individual person.
For example:
Field | Value |
|---|---|
Name | Sarah Jones |
Phone | 021 123 456 |
Billing Address | 10 Queen Street |
Shipping Address | Same as billing |
In this case, it is usually fine to create one res.partner record for the customer.
A simple B2C mapping may look like this:
WooCommerce | Odoo |
|---|---|
|
|
|
|
|
|
Billing address fields |
|
This creates a clean contact record in Odoo.
The WooCommerce order can then be linked to this Odoo customer.
B2B Customer Mapping
B2B customer mapping needs more care.
For B2B stores, the customer may be a company rather than an individual person.
For example:
Field | Value |
|---|---|
Company | ABC Dental Limited |
Contact Name | Sarah Jones |
Billing Address | 20 Business Park Road |
Shipping Address | Warehouse 3, Distribution Road |
VAT / Tax ID | 123456789 |
In Odoo, this could be represented as:
Odoo Record | Field Setup |
|---|---|
Company |
|
Contact Person |
|
Invoice Address |
|
Delivery Address |
|
This is more accurate for B2B, but it requires better mapping rules.
A B2B sync may need to match by:
Company name
Billing email
VAT / Tax ID
Existing Odoo company ID
Custom WooCommerce customer ID
For B2B stores, email matching alone may not be enough because multiple staff members may order for the same company.
For example:
Customer | Company | |
|---|---|---|
Sarah Jones | ABC Dental Limited | |
Mike Brown | ABC Dental Limited |
These should not always become two separate company records in Odoo.
They may need to become two contacts under one company.
Guest Customer Syncing
Guest checkout is common in WooCommerce.
A guest customer places an order without creating a WordPress user account.
In this case, WooCommerce may store the customer data only against the order.
The customer may not exist in:
wp_users
But their billing and shipping details will still exist in order meta fields such as:
_billing_email
_billing_first_name
_billing_last_name
_billing_phone
For guest customers, the sync needs to decide whether to:
Create a new Odoo customer
Match against an existing Odoo customer by email
Create a generic guest customer
Attach all guest orders to one default customer
Only create a customer after payment is completed
For most stores, the best option is to match by billing email first.
If no Odoo customer exists, create a new res.partner.
This gives better customer history, reporting, and invoice records.
However, some stores may prefer not to create a new customer record for every guest checkout, especially if they have a high volume of one-time customers.
This should be decided before the integration is enabled.
Billing and Shipping Addresses
WooCommerce stores billing and shipping information directly against the order.
Odoo can store invoice and delivery addresses as separate contact records.
This creates an important mapping decision.
Should WooCommerce billing and shipping addresses update the main Odoo customer record, or should they create child address records?
A common Odoo structure is:
Address Type | Odoo Setup |
|---|---|
Main Customer Contact |
|
Invoice / Billing Address |
|
Delivery / Shipping Address |
|
The invoice and delivery address records are usually linked using:
res.partner -> parent_id
For example:
WooCommerce Data | Odoo Record |
|---|---|
Customer name and email | Main |
Billing address | Child |
Shipping address | Child |
This is useful when the billing and shipping addresses are different.
For example, the invoice may go to the business office, but the delivery may go to a warehouse or branch location.
Updating Existing Customers
Another important decision is whether WooCommerce should update existing Odoo contacts.
For example, if a customer changes their phone number or shipping address in WooCommerce, should that update the Odoo contact?
There is no single correct answer.
It depends on which system is the source-of-truth.
If WooCommerce is the source-of-truth for customer contact details, then updates from WooCommerce should update Odoo.
If Odoo is the source-of-truth, then WooCommerce should not overwrite Odoo customer records without clear rules.
This is especially important for businesses where Odoo is used by sales, finance, account managers, or operations teams.
A customer record in Odoo may contain:
Payment terms
Salesperson
Tax information
Pricelist
Internal notes
Credit control information
Accounting settings
These should not be overwritten by basic WooCommerce checkout data.
A safer approach may be:
Field Type | Recommended Update Rule |
|---|---|
Name | Create if missing, update carefully |
Use for matching, avoid overwriting unless confirmed | |
Phone | Update if blank or if WooCommerce is source-of-truth |
Billing Address | Create/update invoice address |
Shipping Address | Create/update delivery address |
Payment Terms | Keep controlled in Odoo |
Pricelist | Keep controlled in Odoo |
Salesperson | Keep controlled in Odoo |
VAT / Tax ID | Update only if trusted and validated |
The sync should not blindly overwrite every Odoo customer field.
Preventing Duplicate Customers
Duplicate customer records are one of the most common issues in WooCommerce to Odoo integrations.
Duplicates usually happen because:
Customers checkout with different emails
Existing Odoo contacts have missing emails
Company names are written differently
Phone numbers use different formats
Guest customers are not matched properly
The sync creates a new contact before searching properly
Billing and shipping contacts are created as main contacts instead of child contacts
Before syncing, it is useful to clean existing Odoo contact data.
Check for:
Duplicate emails
Missing emails
Duplicate company names
Inconsistent phone numbers
Contacts that should be companies
Companies that should be contacts
Old inactive customers
Missing VAT / Tax IDs
A good customer sync should always search before creating.
The sync logic should usually be:
Search for existing Odoo customer.
If found, use that customer.
If not found, create a new customer.
Store the WooCommerce customer ID or order reference if required.
Link the WooCommerce order to the correct Odoo customer.
This prevents unnecessary duplicate records.
Customer Source-of-Truth
Before syncing customer data, you need to define which system controls which customer fields.
This is the customer source-of-truth.
For example:
Field | Recommended Source-of-Truth |
|---|---|
Customer Name | WooCommerce or Odoo |
WooCommerce | |
Phone | WooCommerce |
Billing Address | WooCommerce |
Shipping Address | WooCommerce |
Company Name | WooCommerce or Odoo |
VAT / Tax ID | Odoo or validated WooCommerce field |
Payment Terms | Odoo |
Pricelist | Odoo |
Salesperson | Odoo |
Internal Notes | Odoo |
Customer Account Status | Odoo |
A practical setup is:
WooCommerce controls checkout contact details
WooCommerce controls billing and shipping address data from the order
Odoo controls accounting, tax, payment, salesperson, and internal customer fields
This allows WooCommerce to remain the customer-facing storefront, while Odoo remains the operational and accounting system.
Recommended Customer Mapping Rules
A reliable WooCommerce to Odoo customer sync should usually follow these rules:
Use billing email as the primary customer matching field for B2C stores.
Use company name, VAT number, or custom ID for B2B stores where required.
Always search Odoo before creating a new
res.partner.Store the WooCommerce customer ID in Odoo if customers are registered users.
Support guest checkout customers using order billing details.
Do not blindly overwrite existing Odoo customer records.
Store billing and shipping addresses separately if the business needs accurate invoice and delivery records.
Use
res.partner -> parent_idto link child contacts to companies or main contacts.Keep payment terms, pricelists, salesperson, and accounting fields controlled in Odoo.
Clean duplicate Odoo contacts before enabling the sync.
Customer Mapping Checklist
Before syncing WooCommerce customers to Odoo, confirm the following:
Are WooCommerce customers mostly B2C, B2B, or both?
Does the store allow guest checkout?
Should guest customers be created in Odoo?
Should every WooCommerce order create a customer record?
Should the sync match customers by email?
Should the sync match companies by company name?
Should the sync match customers by VAT / Tax ID?
Should the WooCommerce customer ID be stored in Odoo?
Should billing addresses become invoice addresses in Odoo?
Should shipping addresses become delivery addresses in Odoo?
Should billing and shipping addresses be stored as child contacts?
Should WooCommerce update existing Odoo contacts?
Which fields should WooCommerce be allowed to update?
Which fields should remain controlled by Odoo?
What happens if an existing Odoo customer has the same email?
What happens if two WooCommerce customers use the same email?
What happens if the billing and shipping addresses are different?
What happens if the customer changes their address after the first order?
How should company customers be handled?
How should individual customers be handled?
Should inactive Odoo contacts be used or ignored?
Should customers be archived, merged, or left unchanged if duplicates already exist?
These questions should be answered before turning customer sync on.
Common Customer Sync Problems
Most customer sync problems come from unclear matching rules or poor data quality.
Problem | Cause |
|---|---|
Duplicate customers in Odoo | No clear matching rule |
Orders linked to the wrong customer | Email, phone, or company matching not precise enough |
Guest orders not syncing correctly | Sync only checks WordPress users and ignores order billing data |
Company customers duplicated | B2B company matching not configured |
Billing address overwritten | WooCommerce updates the main Odoo contact instead of invoice address |
Shipping address missing | Sync does not create delivery address records |
Odoo payment terms overwritten | WooCommerce is allowed to update too many fields |
Invoices linked to generic customer | Guest checkout mapping not configured properly |
Customer reports are inaccurate | Orders are spread across duplicate customer records |
VAT details missing | WooCommerce does not collect or map tax ID fields |
Most of these problems can be avoided by defining customer matching rules before implementation.
Final Thoughts
Customer syncing is not just about copying names and email addresses from WooCommerce into Odoo.
It is about making sure every WooCommerce order connects to the correct Odoo contact.
For simple B2C stores, this may be as easy as matching customers by billing email and creating a new res.partner when no match exists.
For B2B stores, the process may need to support companies, child contacts, invoice addresses, delivery addresses, VAT numbers, and existing Odoo customer records.
The most important steps are to define the customer source-of-truth, decide how customers are matched, decide how billing and shipping addresses are handled, and prevent duplicate records before they happen.
When this is done correctly, WooCommerce can remain the customer-facing checkout system, while Odoo becomes the reliable source for customer history, sales orders, invoices, accounting, and reporting.




