Good question, and one that doesn’t have a tidy platform-level answer, because Shopify has no native concept of “pending approval” or optimistic locking on products. Every write to a product via the Admin API or CSV is last-write-wins. There’s no conflict detection baked in.
So the gap has to be filled by workflow and tooling. Here’s how the problem is typically handled in agency and multi-operator setups:
Snapshot-before-publish
Before applying the approved change, take a fresh read of the live product and compare it field-by-field against what was read at approval time. If anything has changed, surface the diff to whoever is about to publish. This is the most reliable approach but it requires a tool that holds the “approved state” snapshot and can compare it to the current state. Most teams don’t have this by default.
Field-scoped locking
Rather than locking the whole product, track which fields are “in review”. If a pending approval covers price and title, and an intervening change touches only the description, that’s safe to let through. If it touches price, flag it. This is fiddly to implement but much less disruptive than blanket invalidation.
Invalidate-on-any-change
Simpler and safer for regulated contexts (price accuracy, legal copy). Any change to the product after approval is issued resets the review. More rework, but no risk of publishing a stale-approved version over a live change.
Audit-log comparison
Shopify’s productVariantUpdate and related mutations return the updated resource. Apps that log every write (their own writes, plus anything they can detect via webhooks) can reconstruct a change log per product. The PRODUCTS_UPDATE webhook fires on any change to the product regardless of source, so you can track “did anything touch this product between approval time and publish time” just by listening.
Accept last-write-wins with visibility
Some agencies simply publish the approved version and treat conflicts as an ops problem to catch in QA. This works at low volume; it falls apart when multiple parties have access.
On the “what tools” part: most teams doing this at scale are either building it themselves on top of the webhook stream, or using a PIM (Akeneo, Plytix, etc.) as the source of truth with Shopify as the output, which sidesteps the conflict issue because the PIM owns approval and pushes final state. For teams that want field-level backup and restore without a full PIM, Product Save & Sync (disclosure: I built it) snapshots full product state including variants, metafields, metaobject references, and images, and can restore from any prior snapshot. That gives you the “compare live state to approved snapshot” primitive, though the workflow guard (detect conflict before publish) would still need to sit on top.