logo
Why "Sync Successful" Doesn't Always Mean It Worked

Why "Sync Successful" Doesn't Always Mean It Worked

A sync job can report "completed" and still be wrong. Not because BPS Cloud lied about it — because WooCommerce itself can return a clean HTTP 200 on a batch update while silently rejecting one of the fields you sent. If your sync tool only checks for an error key in the response, it will never catch this. We found the exact case that proves it, and built a fix into the matching engine because of it.

The bug we caught during testing

While testing on a real product ahead of the Marketplace launch, we synced sale_price: 60 over an existing regular_price: 45. The job came back ok. The sheet showed ok. The store's sale price never actually changed.

The cause is a documented WooCommerce behavior: a sale price is only valid if it's lower than the regular price. When it isn't, $product->save() silently clears the field rather than rejecting the request — and the /products/batch endpoint still returns HTTP 200 with no per-item error. From the API's point of view, nothing went wrong. From the merchant's point of view, a price update they asked for just didn't happen, with nothing telling them so.

Why "no error" was never proof

This is exactly the silent-failure class BPS Cloud exists to close off. A sync engine that only trusts a 200 status, or an absent error field, is trusting the wrong signal — WooCommerce can accept a request and still not apply it. The only way to know a field actually landed is to check what the store is now reporting for that field against what you sent.

BPS Cloud menu in Google Sheets

Verification runs as part of the same Sync you already trigger from this menu — no extra step.

What BPS Cloud checks now

Every sync compares the payload you sent against the field WooCommerce actually returns for that product, not just whether the call succeeded. For the sale-price case specifically, a mismatch downgrades that row from ok to completed_with_errors, with the code sale_price_rejected and a clear message in your sheet — instead of a false "done." The row still relinks correctly (the product id is valid; only the price was rejected), so you're not stuck re-matching anything, just re-checking the price.

This same compare-sent-vs-returned pattern extends to other WooCommerce fields known to get silently normalized or dropped, as we find them — not something we tried to guess exhaustively up front, since the goal is catching real cases, not theoretical ones.

Try it

BPS Cloud is free to install from the Google Workspace Marketplace. New to the matching engine this builds on? Start with why we rebuilt SKU matching from scratch.

Prefer the WordPress plugin? See the Bulk Product Sync plugin page for pricing and details.