Product-level status
Each product carries a top-level publish state:not yet published
The product has never been published to any target. It exists only in
MerchantOps.
published and in sync
The product has been published and its live data matches the current
MerchantOps version — nothing has changed since the last successful publish.
published but drifted
The product was published, but its data in MerchantOps has changed since then.
The live storefront is behind — publish an updated batch to bring it back in
sync.
A batch approved without a publishing target is shown as active in
MerchantOps but is never published, so it produces no publish status. The
affected products stay Draft at product level, and you’ll see no per-target
chips or outcomes for them until the batch is published to a target.
Per-target chips
A product can be published to more than one target and environment — for example a QA VTEX store and a production VTEX store. MerchantOps shows a chip per target so you can see each destination independently: one product might be Published on production and Modified on QA at the same time. Each chip reflects the most recent outcome for that destination. A product isn’t simply “published” or not — it’s published per target, and the chips make that explicit.Per-target, per-environment outcomes
Under the hood, every record in a batch carries an outcome for each target and each environment it was published to. Because outcomes are keyed by both the target and its environment, a single record holds an independent QA result and production result without one overwriting the other. A recorded outcome captures what happened on that publish:Succeeded vs failed vs skipped
Succeeded
Succeeded
The record was accepted by the destination. For a catalog record that means
the product/SKU was created or updated; for a price record, the price was
set. The record shows
success and drops out of any pending-publish queue.Failed
Failed
The destination rejected the record or a permanent error occurred — for
example a variant with no matching SKU in the store. The outcome carries an
error summary and a response code. Transient problems (rate limits,
temporary server errors) are retried automatically first; only a record that
can’t be published after retries lands as failed.Skipped
Skipped
The record was intentionally not published — for instance a connector chose
to skip it. The skip is stored on the record, so it doesn’t silently
disappear, but it is not counted toward the batch’s progress: only
success and failed advance the published/failed counts.That matters if you build your own connector: a
skipped record never reports as done, so a batch containing one does not
reach a final rollup state. Report success or failed for every record —
use failed with an error explaining the reason where you would
otherwise skip.Batch-level rollup
As records report outcomes, the batch tracks published and failed counts and, when every record is accounted for, reaches a final state:- Published — at least 95% of the batch’s records succeeded.
- Partial — fewer than 95% succeeded. Review the failed records’ error summaries, fix the underlying data, and publish again.
Some connectors surface warnings alongside outcomes — non-fatal issues that
didn’t fail the publish but need attention, such as a brand or category that
doesn’t exist in the destination yet (see VTEX). A warning
doesn’t turn a
success into a failed; it flags follow-up work.Fixing a partial batch
Partial (or Failed) means some records didn’t make it. Fix the underlying data — the product, variant, or price record the errors point at — and then re-drive the batch:
Republishing a catalog batch and pricing Publish now / Republish all
require approval permission (
catalog_batch:approve and pricing:approve
respectively).
Next steps
Publishing overview
How batches, targets, and scheduling fit together.
Build your own connector
Report outcomes from your own target and see them here.