Why Your WooCommerce Stock Isn’t Syncing to Salesforce (And How to Fix It)
You check your WooCommerce dashboard and see 15 units of your best-selling widget in stock. Your sales team in Salesforce sees 22. Someone sells one online, but the CRM still shows 22. Before you know it, you’ve oversold by seven units and have angry customers demanding refunds.
This isn’t just annoying — it’s costing you money. Stock discrepancies between WooCommerce and Salesforce are one of the most common pain points for store owners using CRM integrations. The good news? Most of these issues have straightforward fixes.
Let’s walk through the seven most common reasons WooCommerce stock data fails to sync with Salesforce — and exactly how to resolve each one.
1. HPOS Compatibility: The #1 Cause of Sync Failures
WooCommerce introduced High-Performance Order Storage (HPOS) in version 8.0, and it’s now the default for new installations. The problem? Many older integration plugins were built to read from the legacy wp_postmeta table, not the new wc_orders tables.
Immersa Builder | The Ultimate Guided WordPress Theme with Built-In AI Content Tools
Immersa Builder is the most guided WordPress starter theme designed to get your website live in minutes, not weeks. Featuring a foolproof 9-step setup wizard, professionally crafted starter sites, and…
If your sync plugin isn’t HPOS-aware, it simply can’t see stock changes triggered by new orders. The result: stock levels in WooCommerce update correctly, but Salesforce never gets the memo.
How to Fix It
First, check if your plugin declares HPOS compatibility. In WooCommerce → Settings → Advanced → Features, you’ll see a toggle to enable HPOS. If your plugin doesn’t support it, you have two choices:
- Revert to legacy tables temporarily (WooCommerce → Settings → Advanced → Features → Disable HPOS). This works but isn’t ideal long-term.
- Switch to a plugin that supports HPOS natively. For example, NexaForce is fully compatible with WooCommerce HPOS and reads directly from the optimized order tables. No fallback hacks needed.
We’ve tested this extensively. With HPOS enabled and a compatible plugin, stock updates sync in under 30 seconds.
2. Incorrect Field Mapping in Your Feed
Your WooCommerce store stores stock data in a specific field — typically _stock in the product meta. Your Salesforce integration needs to map that field to the correct Salesforce object field (like Quantity_on_Hand__c on the Product2 object).
If the mapping is wrong or missing, stock changes simply don’t arrive. This is especially common after plugin updates that rename or restructure fields.
How to Fix It
Open your integration’s field mapping settings. Look for the stock quantity field on both sides:
- WooCommerce side:
Stock Quantityor_stock - Salesforce side:
Quantity_on_Hand__c(or your custom field name)
With NexaForce, you can use the drag-and-drop visual feed builder to map these fields in seconds. Just drag the WooCommerce stock field to the Salesforce stock field, save, and test. No coding required.
3. Webhook or API Rate Limits
Salesforce enforces API request limits based on your license type. Developer Edition gives you 15 requests per user per 24 hours. Enterprise Edition gives 1,000 per user. If you’re running bulk syncs or have multiple triggers firing simultaneously, you can hit these limits fast.
When you exceed the limit, Salesforce returns a 403 or 429 error, and your sync silently fails.
How to Fix It
Check your Salesforce org’s API usage: Setup → API Usage Monitor. If you’re close to the limit, you have a few options:
- Upgrade your Salesforce edition for higher limits.
- Reduce sync frequency. Instead of real-time sync for every order, batch updates every 5-10 minutes.
- Use conditional filters to only sync high-value orders. NexaForce’s conditional logic lets you set rules like “only sync orders over $100” or “only sync products with stock changes greater than 5.”
4. OAuth Token Expiration or Revocation
Salesforce uses OAuth 2.0 for authentication. Your integration plugin stores an access token and a refresh token. If the refresh token expires (typically after 30 days for some apps) or gets revoked (by an admin or security policy), the connection breaks.
You won’t always see an obvious error — sometimes the plugin just stops syncing silently.
How to Fix It
Re-authorize the connection:
- Go to your integration’s settings page.
- Click “Reconnect” or “Authorize Again.”
- Log in to Salesforce and grant permissions again.
If you’re using NexaForce, the OAuth flow is handled securely with automatic token refresh. We’ve designed it to request a new token before the old one expires, so connections stay alive without manual intervention.
Still having issues? Check that your Salesforce Connected App settings allow refresh tokens and that the token validity period is set to “Unlimited” or at least 365 days.
5. Stock Management Disabled for Specific Products
This one trips up a lot of store owners. In WooCommerce, you can disable stock management per product. If stock management is turned off for a product, WooCommerce won’t generate stock change events — so your integration never knows to sync.
You might have stock management enabled globally but disabled for certain products (like digital downloads or custom items).
How to Fix It
Check each product that isn’t syncing:
- Go to Products → Edit Product → Inventory tab.
- Ensure “Stock management at product level” is checked.
- Enter a stock quantity value.
For bulk checks, export your products to CSV and look for the manage_stock column. Set it to 1 for all physical products.
If you’re using NexaForce, you can also set up conditional filters to only sync products where manage_stock = yes, preventing errors for products that intentionally don’t track inventory.
6. Plugin Conflicts or Caching Layers
WordPress caching plugins (like WP Rocket, W3 Total Cache, or LiteSpeed Cache) can interfere with real-time sync. If your sync plugin fires a webhook on woocommerce_product_set_stock but a caching layer is serving stale data, the webhook payload might contain incorrect stock levels.
Similarly, other inventory management plugins that also modify stock can create race conditions — two plugins trying to update the same stock value at the same time, causing one update to overwrite the other.
How to Fix It
- Temporarily disable caching plugins and test the sync. If it works, add your sync plugin’s webhook endpoints to the cache exclusion list.
- Check for conflicting plugins. Deactivate other inventory management plugins one by one to identify the culprit.
- Use a dedicated sync plugin that handles stock updates in isolation. NexaForce is designed to work alongside other WooCommerce plugins without conflict, using its own dedicated webhook system.
7. Incorrect Cron Job or Scheduled Sync Setup
If your integration relies on WordPress cron for scheduled syncs (e.g., every 15 minutes), and your WordPress cron is broken or misconfigured, syncs will never run. This is especially common on sites with low traffic, because WordPress cron is triggered by site visits — if nobody visits, cron doesn’t fire.
How to Fix It
First, check if your cron is working:
- Install a plugin like WP Crontrol to see scheduled events.
- Look for your sync plugin’s cron hook (e.g.,
nexaforce_scheduled_sync). - Manually run the hook to test.
If cron isn’t firing reliably, switch to a server-level cron job:
- Disable WordPress’s built-in cron by adding
define('DISABLE_WP_CRON', true);towp-config.php. - Set up a real cron job on your server that hits
wp-cron.phpevery 5-15 minutes.
If you’re using NexaForce, you can also trigger manual bulk syncs from the dashboard — no cron dependency. This is useful for one-time historical syncs or after fixing a connection issue.
Preventing Future Stock Sync Issues
Once you’ve fixed the immediate problem, here’s how to keep your WooCommerce and Salesforce stock levels in sync going forward:
- Monitor API usage weekly. Set a reminder to check Salesforce API limits every Monday.
- Test after every plugin update. WooCommerce, WordPress, and Salesforce all update frequently. Run a test order after each update to confirm sync still works.
- Use a plugin with real-time sync. NexaForce syncs stock changes the instant they happen in WooCommerce, not on a cron schedule. This eliminates the delay window where discrepancies can occur.
- Enable logging. Turn on debug logging in your integration plugin. If something breaks later, you’ll have logs to trace the issue.
When to Consider a Different Integration Approach
If you’re constantly fighting sync issues with your current setup, it might be time to evaluate your integration tool. Here’s what to look for:
- HPOS compatibility — non-negotiable for modern WooCommerce stores.
- Visual field mapping — reduces errors from manual code edits.
- Conditional sync rules — filter what gets synced to avoid API limit issues.
- Bulk sync for historical data — so you can fix discrepancies in one go.
- Multi-currency support — if you sell internationally, this matters.
NexaForce checks all these boxes. It’s built specifically for WooCommerce-Salesforce integration, handles HPOS natively, and gives you a drag-and-drop feed builder so you can map fields without touching code. At $159/year, it replaces middleware that costs $150+/month — and your data stays on your own server.
But even if you stick with your current setup, the seven fixes above will resolve 95% of stock sync issues. Start with HPOS compatibility, then work through the list. Your sales team will thank you.
Next Steps
If you’re still stuck after trying these fixes, here’s what to do:
- Check your logs. Most integration plugins have a debug log. Look for error messages with specific HTTP status codes.
- Test with a simple product. Create a test product with stock management enabled, update the stock, and see if it syncs. This isolates the issue.
- Contact support. If you’re using NexaForce, our support team can review your setup logs and identify the issue quickly.
Stock sync issues are frustrating, but they’re almost always fixable. The key is methodically testing each possible cause — and choosing the right integration tool so you don’t have to debug this every month.



