ml-connector
Oracle NetSuiteWooCommerce

Oracle NetSuite and WooCommerce integration

WooCommerce runs your online storefront and captures orders and customer data. Oracle NetSuite runs your back office ERP, inventory, and accounting. Connecting the two means every order placed in WooCommerce flows into NetSuite as a sales order with the correct items and customer records, inventory is reserved from your master stock, revenue is posted to the right GL account, and fulfillment status flows back to WooCommerce. No manual re-entry, no double-entry errors, no inventory mismatches.

How Oracle NetSuite works

WooCommerce is a self-hosted WordPress e-commerce plugin deployed on a customer's own domain. It exposes orders, refunds, customers, products, taxes, coupons, and payment information through a REST API at https://<customer-domain>/wp-json/wc/v3/ with HTTP Basic Auth using API Key Consumer Key and Consumer Secret pairs. WooCommerce publishes events via webhooks for order and customer lifecycle events (created, updated, deleted) with HMAC-SHA256 signature verification. Webhooks are disabled after 5 consecutive non-2xx responses and must be manually re-enabled. WooCommerce is self-hosted only, so there is no managed sandbox and no automatic HMAC signature on webhooks; webhook verification requires the shared secret.

How WooCommerce works

Oracle NetSuite is a cloud-based ERP and CRM platform accessible via REST and SOAP APIs. The REST API (SuiteTalk) uses OAuth 2.0 Client Credentials with a certificate (recommended) or Token-Based Authentication, and base URLs are tenant-specific at https://<accountId>.suitetalk.api.netsuite.com/services/rest/record/v1/. NetSuite exposes vendors, customers, sales orders, invoices, inventory items, GL accounts, departments, locations, and classifications. OAuth tokens are valid for 60 minutes with no refresh token in the M2M flow. NetSuite Event Subscriptions provide webhooks for record create/edit/delete on supported types like Sales Orders and Invoices, but do not include HMAC signature; instead, IP allowlist and shared secret are used. Polling is available via SuiteQL queries for bulk reads.

What moves between them

Orders and customers flow from WooCommerce into Oracle NetSuite. When a WooCommerce order is created or updated, ml-connector maps each line item to the corresponding NetSuite inventory item by SKU, reserves stock from the master location, creates or updates a NetSuite sales order with the matching customer record, and posts revenue to the designated GL account. Customer records are created or updated in NetSuite with billing and shipping address details. Order status changes are polled from NetSuite and pushed back to WooCommerce to keep fulfillment status in sync. Refunds in WooCommerce trigger credit memo creation in NetSuite with the same GL account mappings.

How ml-connector handles it

ml-connector stores the WooCommerce API Key pair (Consumer Key and Secret) and the NetSuite certificate and OAuth credentials encrypted at rest. It registers a webhook endpoint with WooCommerce to listen for order.created, order.updated, order.deleted, customer.created, and customer.updated events, and verifies each incoming webhook signature using HMAC-SHA256 with the WooCommerce webhook secret. On receiving a webhook, ml-connector maps WooCommerce order data to NetSuite sales order structure: customer name and email match or create a NetSuite customer record, each order line item is matched to a NetSuite inventory item via SKU, and tax amounts are applied. The order is posted to NetSuite via the REST API using an OAuth 2.0 bearer token; tokens are refreshed every 55 minutes to stay ahead of the 60-minute expiry. If a token call returns 401 (expired), the token is refreshed immediately and the request is retried. NetSuite rate limiting is handled with exponential backoff and jitter. Inventory allocations are applied to a designated master location per customer config. GL account mappings (revenue, tax, shipping) are templated per order type or product category. Fulfillment status is polled from NetSuite periodically and pushed to WooCommerce as order status updates. If a webhook is disabled after 5 consecutive failures, an alert is sent to the customer so the webhook can be manually re-enabled. Every record carries a job ID so failed syncs can be replayed without duplication.

A real-world example

A mid-sized online retailer runs WooCommerce for their e-commerce storefront and Oracle NetSuite for inventory management, accounting, and fulfillment. Before the integration, the fulfillment team manually exported orders from WooCommerce once a day, re-entered key data (customer, items, quantities, shipping address) into NetSuite, and then updated WooCommerce with shipment status after packing. Inventory was tracked in two places, leading to oversells and customer cancellations. Month-end revenue reconciliation required hours of manual matching between the two systems. With WooCommerce and NetSuite connected, each order is instantly created in NetSuite with the correct items and customer record, inventory is reserved in real time, revenue is posted automatically to the correct GL accounts by product category, and fulfillment status flows back to WooCommerce so customers see accurate tracking. The retailer no longer re-enters orders, overselling stops because inventory is a single source of truth, and month-end close is faster because revenue is already posted.

What you can do

  • Push WooCommerce orders into Oracle NetSuite as sales orders with inventory allocation and correct GL account posting for revenue, tax, and shipping.
  • Sync WooCommerce customers into NetSuite as new or updated customer records with full billing and shipping address detail.
  • Map WooCommerce product SKUs to NetSuite inventory items and reserve stock from a designated master location.
  • Handle OAuth 2.0 token lifecycle on NetSuite, validate HMAC-SHA256 webhook signatures on WooCommerce, and retry failed syncs with exponential backoff.
  • Push order fulfillment status from NetSuite back to WooCommerce and log every record sync in a searchable audit trail.

Questions

How do orders flow from WooCommerce to Oracle NetSuite?
WooCommerce publishes order.created and order.updated events via webhooks to ml-connector. ml-connector validates the webhook signature using HMAC-SHA256, maps each order line item to the matching NetSuite inventory item by SKU, creates or updates a customer record in NetSuite, creates a sales order with revenue posted to the configured GL account, and reserves inventory from the master location. If the webhook payload is invalid or the NetSuite API call fails, the sync is queued for retry with exponential backoff.
Does ml-connector handle NetSuite OAuth token refresh?
Yes. ml-connector stores the NetSuite OAuth certificate and credentials encrypted, obtains a bearer token that is valid for 60 minutes, and refreshes it every 55 minutes to stay ahead of expiry. If a call returns 401 (unauthorized), the token is refreshed immediately and the request is retried. Token errors are logged and alerted.
What happens if a WooCommerce product SKU does not match any NetSuite inventory item?
ml-connector logs the mismatch and moves the order to a review queue so the customer can map the missing SKU before the order is posted to NetSuite. Until the mapping is provided, the order is held. For subsequent orders with the same SKU, ml-connector uses the stored mapping to avoid repeating the lookup.

Related integrations

Connect Oracle NetSuite and WooCommerce

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started