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.
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
More Oracle NetSuite integrations
Other systems that connect to WooCommerce
Connect Oracle NetSuite and WooCommerce
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started