Catalog Management and Health

The Product catalog page is both your setup page and your ongoing health dashboard. After you have connected your sources and verified that products are flowing, the same page gives you a live view of what the catalog contains, how fresh each source is, and the exact stored state of any product.

Can we see your products?

The Can we see your products? card is the page's status check. It shows one of four states:

StatusMeaning
Waiting for first productNo products have arrived yet.
PopulatingA source is actively importing products for the first time.
DegradedThe catalog has products, but one or more sources have errors or have not synced recently.
Receiving productsProducts are in the catalog and flowing normally.

Next to the status you'll see two live numbers: how many product-view events A vs B has seen from your storefront in the last 15 minutes, and the total product count (all active products across all sources, deduplicated by SKU).

Once a product arrives, the card shows the most recent one exactly as A vs B parsed it: title, SKU, and price. If a required field is missing or was not mapped, a note under the sample lists which ones (title, price, image, or link) so you can fix your mapping. availability is never flagged as missing: if a source doesn't send it, A vs B assumes in_stock.

Check a product code

The Check a product code box lets you paste any product SKU or external variant code and see exactly what it resolves to: a product, a variant that maps to one of your products, or no match at all. Matching is exact, the same way A vs B matches codes when serving recommendations, so this is the fastest way to confirm a code from your storefront or an order lands on the right product.

If the code you paste has extra spaces and a trimmed version would match, A vs B tells you rather than silently succeeding, so you can fix the stray whitespace at the source.

Is your catalog complete?

The Is your catalog complete? card is a quick completeness check across everything currently stored: how many products are missing a price, missing an image, have no category, or are out of stock. Click any number to jump straight to those products in the list below, already filtered, so you can fix them.

Catalog source health

The Catalog source health section shows a row for each source connected to your project:

ColumnMeaning
SourceThe source type: shopify, push_api, feed, upload, or live_event. Shown alongside a readable name: Shopify, Push API, Product feed, CSV / upload, or Live from your storefront.
StatusThe underlying value is idle, syncing, ok, or error, shown as a badge with a human label: Never synced (idle, nothing has arrived yet), Idle (idle, has synced before), Syncing…, OK, or Error.
Products seenHow many products this source has contributed
Last syncedWhen this source last wrote a product update
Last full syncFor Shopify: when the most recent bulk import completed
ErrorThe most recent error message, if any: click to see the full text

While any source shows Syncing…, the section refreshes itself every 30 seconds, so the status, products seen, and last-synced time move without a reload.

Enable and disable a source

Each source row has an enable/disable toggle. Disabling a source stops it from contributing new product data. Products already in the Live Catalog from that source are not removed: they stay with their last-known values. Disable a source when you want to pause a feed without deleting its configuration, or when you are troubleshooting an error.

Re-enabling a source does not automatically trigger a sync: use the manual sync button (below) to pull fresh data immediately.

Manual sync

Feed, Push API, Upload, and Shopify each show a manual-sync button, but the button doesn't do the same thing everywhere:

  • Shopify shows a Re-sync button. It starts a new, trackable import job that re-pulls your full product catalog, with live progress shown while it runs.
  • Feed shows a Sync now button that fetches your feed URL immediately, regardless of the configured cadence.
  • Push API and Upload also show a Sync now button, but clicking it only records that you're expecting fresh data. A vs B has no way to reach out and pull from these sources, since they push data to A vs B rather than the other way round: push your data as normal afterwards.
  • Live event has no manual-sync button. It's a passive stream of whatever shoppers browse, so there's nothing to trigger.

Each button is disabled while its source is switched off, or while a sync for that source is already running.

Products: search and inspect

The Your products section lets you search the Live Catalog directly and inspect any product exactly as A vs B stored it.

Searching

Enter a product title or partial SKU in the search box. A vs B searches against the stored sku and title fields. Results are paginated (up to 20 per page) and can be browsed by clicking "Load more". Products marked as removed are not shown in search results.

Inspecting a product

Click any product in the list to open its detail view. This shows:

  • Summary: title, SKU, price (with the original "was" price and a savings badge when the product is on sale), availability, and stock count when a source has sent one.
  • Full stored record: the complete JSON of every field A vs B has stored for this product, including custom fields, variant data, and the per-field-class sources map.
  • Field provenance ("How we know this"): four groups, always shown together, each naming the source that last wrote it and when: Price & stock, Title & description, Images, and Category & brand. For example: "Price & stock last updated 2h ago via shopify".

You can also remove a product from every recommendation feed straight from this view, without waiting for the source that sent it to stop sending it.

What you see here is what gets served

The product inspector shows exactly what the Live Catalog contains. This is what a recommendation card reads for title, price, image, and availability. If the inspector shows a stale price, the recommendation cards will too: until the source that owns that field syncs again.

Catalog coverage

Catalog coverage, the share of your recommended products that had a Live Catalog row at the last successful recipe build, plus a freshness proxy, is shown on the Commerce hub page rather than here on the Product catalog page. It's built from the same catalog data this page manages, so what follows still explains what you'll see there.

MetricMeaning
CoveragePercentage of recommended items that had a catalog row at the last successful recipe build
Items with catalog dataHow many recommended items had a catalog row (the numerator)
Recommended itemsTotal recommended items across all enabled recipes at their last successful run (the denominator)
Recipes countedHow many enabled recipes contributed to this calculation
Recipes enabledTotal number of enabled recipes

How coverage is calculated

Coverage is a build-time measurement, not a live per-request check. During each nightly recipe build, the engine checks every recommended item against the Live Catalog. Items that have no matching catalog row (cat:{projectId}:{sku}) are counted as dropped and are not written into the output. The droppedNoCatalog count is stored with each recipe's run stats.

The coverage card rolls up this number across all enabled recipes to give a project-level view:

Plain text
coveragePercent = itemsWithCatalogData / recommendedItems × 100
Plain text1 line

A high coverage percentage means most of what your recipes recommend will show correct titles, images, and prices on recommendation cards. A low number means your catalog is missing products that your order or browsing data references.

Coverage is from the last build

Coverage reflects the state of the catalog at the time of the last successful nightly run for each recipe. It is not recalculated live. Run a recipe manually (with the Run now button on the recipe detail page) to get a fresh reading after adding products to the catalog.

Edge cases

  • No recipes have run yet: coverage shows "No recipes have run yet" rather than 0%. This is not a problem; it resolves after the first nightly run or a manual run.
  • Catalog is empty: if your catalog currently has zero products, the card leads with a note that the catalog is empty and needs a source connected, rather than a bare percentage. The percentage itself still reflects the last successful build, which may be old news: the card also shows the total product count so you can see the root cause at a glance.
  • Some recipes are new: recipes that ran before a recent platform update may not yet contribute to the roll-up. The "Recipes counted" number reflects how many actually contributed; the rest will join the roll-up after their next run.

Freshness signals

The catalog management page surfaces several freshness signals to help you spot drift between what your sources hold and what the Live Catalog contains.

What "freshness" means here

A vs B does not compare the Live Catalog to your storefront's live pages: it reads only what your configured sources send. "Drift" here means catalog-vs-source freshness: how recently each source wrote product data, and whether shoppers are actively browsing while a source is stale or erroring.

Specifically:

  • If shoppers are viewing products (recent product views are non-zero) but every source's freshest sync is over a day old, the catalog may be showing outdated prices or availability for those products.
  • The field provenance in the product inspector shows the exact age of each field group: "Price & stock last updated 6h ago via feed" tells you when the feed last contributed this product's price.
A vs B never scrapes your storefront

A vs B reflects the data your configured sources send: it does not fetch or compare against your live product pages. The freshness signals here are about how recently your sources have delivered updates, not how the catalog compares to your store right now.

How to act on freshness signals

  • A source in error status means it has not successfully synced. Open the error detail and fix the underlying issue, then use the manual-sync button to refresh.
  • A feed that last synced many hours ago but is set to hourly cadence may have an unreachable URL. Check the error detail.
  • A Shopify source with a lastFullSyncAt that is days old but frequent lastSyncAt updates is normal: the full sync runs on reconnect or manually; a Shopify webhook keeps things current between full syncs.
  • A live event source (live_event) that shows low productsSeen means fewer product-view events are reaching A vs B than expected. Check your snippet installation.
Was this helpful?