Help centre

How can we help?

Guides, FAQ, and integration walkthroughs. Search or browse by topic.

← All topics

Woocommerce

WooCommerce sync

Pull customers, orders and subscriptions from a WordPress WooCommerce store into the CRM. Contacts are deduplicated by email so re-runs are safe. Sync runs on demand and on a nightly cron.

Before you start

  • A WordPress site with WooCommerce 3.5 or newer installed. Older versions have a different REST API surface and the sync will fail silently.
  • An admin user on the WordPress site. Only admins can generate REST API keys.
  • The store URL, exactly as it is: with or without www, with or without trailing slash. Get it wrong and you get 404s on every request.
  • Pretty permalinks enabled in WP Admin > Settings > Permalinks. If it is set to "Plain" the REST API returns 404 for every endpoint. Change it to "Post name" and save.
  • 5 minutes for setup, plus the sync time (about 1000 orders per minute over decent bandwidth).

Step 1: Enable the WooCommerce REST API

WooCommerce ships with the REST API enabled but you still need to generate a key for the CRM to authenticate.

  1. Log in to your WordPress admin.
  2. Go to WooCommerce > Settings > Advanced > REST API.
  3. Click Add key.
  4. Description: Unavoidable CRM sync.
  5. User: pick an admin user (yourself is fine).
  6. Permissions: Read (not Read/Write - the CRM should never mutate your store).
  7. Click Generate API key.

Step 2: Copy the keys somewhere safe

WooCommerce shows the Consumer Key and Consumer Secret exactly once. If you close the page without copying them, you have to generate new ones.

  • Consumer key: starts with ck_
  • Consumer secret: starts with cs_

Paste both into a password manager before you leave the page.

Step 3: Connect the store in the CRM

  1. In the CRM's main nav go to WooCommerce.
  2. Click + Connect store.
  3. Fill in:
    • Store name: any friendly label, e.g. Main site.
    • Store URL: the full URL including https://, no trailing slash. Example: https://shop.example.com.
    • Consumer key: paste the ck_ value.
    • Consumer secret: paste the cs_ value.
  4. Click Test connection. The CRM hits GET {store}/wp-json/wc/v3/system_status. If it returns 200, you see a green tick and the WooCommerce version.
  5. If the test passes, click Save and sync.

Step 4: Run the first sync

The initial sync is the slow one. It fetches the whole customer, order and subscription history in pages of 100.

  1. Click Sync now. You will see a live progress bar: Fetched 3200 of 12500 customers...
  2. Do not close the tab during the first sync. Nightly incremental syncs are async but the manual first-sync is foreground.
  3. Expect roughly 60 seconds per 1000 customers plus 90 seconds per 1000 orders on a normal shared-host WordPress. If your store is on WP Engine or Kinsta, it is faster.
  4. When it finishes, the counter at the top of the WooCommerce module shows your totals: customers synced, orders synced, subscriptions synced.

Step 5: Understand what gets synced (and what does not)

Customers

Every WooCommerce customer becomes a contact in the CRM. Fields mapped:

  • email - primary dedupe key. If the email already exists in the CRM, the existing contact is enriched, not duplicated.
  • first_name, last_name - combined into contact_name.
  • billing.phone - copied to phone.
  • billing.company - copied to business_name.
  • billing.city, billing.postcode, billing.country.
  • total_spent, orders_count - stored as custom fields for segmentation.

Orders

Every order becomes an entry on the contact's timeline with the order number, status, total, and line items. Orders are linked back to the WooCommerce order via the source ID so future updates (status change from Processing to Completed) update the same entry.

Subscriptions

Only pulled if the store uses the WooCommerce Subscriptions plugin (WooCommerce.com paid extension). Subscription status and next-payment date become contact fields, feeding the MRR and Churn reports.

What does not sync

  • Product catalog - the CRM does not need it. Use WooCommerce for that.
  • Refunds - visible on the order in WooCommerce, not backfilled as a separate CRM event yet.
  • Reviews - use the Reviews module, powered separately.
  • Cart abandonment - WooCommerce does not expose this via REST. Use a WordPress plugin (Retainful, Cartflows) if you need it, then Zapier into the CRM.

Step 6: Set the nightly sync

The first sync is manual. From then on, a cron runs every night at 03:00 server time and pulls anything modified in the last 24 hours (uses modified_after filter, so it is fast).

  • The cron is configured under the hood. You do not need to do anything.
  • To force an incremental sync any time, click Sync now - it uses the same "modified since last sync" logic.
  • To force a full re-sync, click Advanced > Reset sync cursor. Warning: this re-fetches everything and can take an hour on large stores.

How to test it works

  1. In WooCommerce, create a test customer with email testsync+{timestamp}@example.com.
  2. Place a test order for that customer.
  3. In the CRM click Sync now.
  4. Go to Contacts and search for the test email. The contact should exist with the order on its timeline.
  5. Update the order in WooCommerce from Processing to Completed.
  6. Click Sync now again. The order status on the CRM timeline should update to Completed.

Common problems

Test connection returns "Unauthorized"
Consumer key or secret was copied with a leading/trailing space. Re-copy carefully. Or the store URL is wrong (e.g. you used http:// when the site is https://).
Test connection returns "404 not found"
Pretty permalinks are disabled. Go to WordPress Settings > Permalinks, set to "Post name", click Save. Retry.
Sync starts but stalls at 500 customers
Your host is rate-limiting. Add ?per_page=50 in the advanced settings to slow the sync. Or ask your host to whitelist the CRM's outbound IP.
Contacts are duplicating on each sync
WooCommerce customer email is blank on those records (guest checkouts). The dedupe key becomes null, so every sync creates a new contact. Fix: enable "require login before checkout" in WooCommerce, or manually clean up guest contacts using the CRM's dedupe tool.
Sync succeeds but nothing appears in the CRM
Company scope mismatch. If you have multiple companies in the CRM, the store is attached to one company - contacts only visible when scoped to that company. Check Advanced > Store belongs to company.
Orders are in the wrong currency
WooCommerce stores all orders in the store's base currency, but individual orders may have been placed in another currency via a multi-currency plugin. The CRM stores the base amount. If you need per-order currency, ask support.

What this unlocks in the CRM

Every WooCommerce buyer becomes a targetable contact with real spend history. Filter contacts by total_spent > 500 to find high-value repeat buyers. Segment by product category (via order line items) to run relevant campaigns. Trigger sequences automatically when someone hits a spend threshold. The Analytics module reports on order value trends alongside pipeline data so you can attribute marketing spend to actual purchase behaviour, not just leads.

Still stuck?
Email us and we’ll come back within one business day.
info@unavoidablecrm.com