Upload Baseline
The upload baseline is a server-side path to a complete catalog. It is meant to be a starting point before a live source is ready, or a permanent safety floor under all other sources.
Uploading a product table as a dataset and activating it also mirrors that data into the Live Catalog, as a baseline source. Your existing upload-based workflow keeps working as it does today. Uploading a product table to power recommendations or commerce audiences is unaffected either way.
Turn it on
One dataset per project feeds the Live Catalog, and you choose which:
- Go to Commerce → Datasets and open the table dataset holding your products.
- Turn on Use this dataset as the Live Catalog source.
- Activate a version of that dataset. That is what fills the catalog.
The toggle appears on table datasets only, since the mirror reads your file as a product table. If no version is live yet, the toggle says so: the catalog fills the first time you activate one.
Choosing a different dataset later moves the designation to it, and the old one quietly stops feeding the catalog. Rows it already wrote stay in the catalog until a higher-priority source or a later upload replaces them. Turning the toggle off stops future activations from writing, and also leaves what is already there.
The Product catalog page shows the current choice read-only on its upload source row, so you can see at a glance which dataset the catalog is reading from.
How it works
Activating a TABLE-type dataset version streams the uploaded file row by row. Each row is written into the Live Catalog through the standard freshest-wins merge. This is the upload source.
The key design choice is priority: upload is the lowest-priority catalog source. Say a higher-priority source has already written a value for a product field. Higher-priority sources include Shopify, the Push API, a product feed, and a real-time browser product view. The upload never overwrites that value. It only fills in fields that no higher-priority source has touched.
In practice this means:
- If you have Shopify connected, Shopify's version of a product's price, title, and availability always wins.
- If you have a Push API job writing daily updates, those values are authoritative.
- Your uploaded table acts as the floor. It provides coverage for products that have not yet been seen by any other source.
Priority in the freshest-wins merge
Upload writes are tagged source upload. In the merge order:
live_event > shopify > push_api ≈ feed > uploadThe upload is always the least authoritative source. It never overwrites a more recent write from any other source.
Column mapping
A vs B recognises these column names when reading an uploaded product table (case-insensitive):
| Catalog field | Accepted column names |
|---|---|
sku | sku, id, product_id, productid |
title | title, name, product_name, productname |
description | description, desc, body, body_html |
href | href, url, link, product_url, producturl |
image | image, image_url, imageurl, image_link, imagelink, thumbnail |
brand | brand, vendor, manufacturer |
category | category, product_type, producttype, type |
price | price, price_minor, priceminor |
compareAtPrice | compare_at_price, compareAtPrice, was_price, original_price, rrp |
currency | currency, currency_code, currencycode |
availability | availability, status, in_stock, stock_status |
stock | stock, quantity, inventory, inventory_quantity |
createdAtSrc | created_at, createdat, created_at_src |
Only columns present in your file are mapped. A column you leave out is simply absent from the catalog write for that product. So a higher-priority source's value for that field is left unchanged.
The dataset's key field (the column you chose as the unique row identifier when creating the dataset) maps to the catalog sku. The key field must be present and non-empty on every row.
Availability values
The availability column accepts:
in_stock,out_of_stock,preorder,removed: exact string values1,true,yes: mapped toin_stock0,false,no: mapped toout_of_stock
Price columns
The stored catalog record always holds price and compareAtPrice in minor units (whole-number cents, pence, and so on). This is true whatever column name your file uses.
Whatever you send in a price column, A vs B rounds it to the nearest whole number and stores that number as minor units directly. There is no conversion from major units (dollars) to minor units (cents).
Sending 8900 gives you a stored price of 8900 minor units, for example $89.00. Sending 89.00 in a column named plain price gives you a stored price of 89 minor units, for example $0.89, not $89.00. Always send whole-number minor units, regardless of which column name you use.
When you upload a CSV, the preview warns you if a price column holds an amount with a decimal point, and shows the whole number to write instead.
What counts as the baseline source
Activating a version of the designated dataset triggers the mirror. Re-activating a version, or activating a new version of the same dataset, re-runs it. The catalog is then updated to match the new version.
The upload source row appears on the Product catalog page under Sources once the first mirror has run. It shows:
- Last synced: when the most recent activation mirror completed
- Products seen: how many rows were successfully written
- Any per-row errors that caused rows to be skipped (missing key field, invalid JSON)
Existing upload-based recipes still work
Say you already use the product-catalog dataset, or a custom TABLE dataset, to power recommendation recipes. Those continue to work unchanged, whether or not you designate one of them as the upload source. The dataset itself is never modified: the mirror is a parallel write into the Live Catalog. Recipes that use the dataset directly also benefit from the full Live Catalog, which means the upload data plus anything higher-priority sources have added or updated.
Starting with an upload baseline is a practical first step. You get the catalog populated immediately. As you add Shopify, the Push API, or a feed, those sources automatically take priority for the products they cover. You do not need to remove the upload: the merge handles it.