Skip to main content

Why

The embed collects behaviour from the moment it renders - but only going forward. If you already have a year of orders in Shopify or pageviews in GA4, importing them means your first model is trained on real customers instead of waiting a month to accumulate one. Everything here maps onto the same three questions: which item, which event, and when.

CSV

The simplest path, and the one that works regardless of which tools you use.
Upload it under Integrations → Import history. Columns are matched by name, not position, so you do not need to reorder your export. These are all recognised: Timestamps can be ISO 8601, epoch seconds, or epoch milliseconds. Event names are mapped for you - view_item, page_view and impression all become view; add_to_cart and select_item become click; order and transaction become purchase.

Shopify

Under Integrations → Shopify, paste an Admin API access token with the read_orders scope. Create it from a custom app in your own Shopify admin - there is no app to install or review. Order line items become purchase events. Shopify does not expose product views, so this gives you conversions, which is the signal the embed cannot collect.

Google Analytics

GA4 comes in two shapes, and the difference decides what you actually get.

BigQuery export - real training data

If you have linked GA4 to BigQuery, we can read per-user rows: every view_item, add_to_cart and purchase with the pseudonymous user id attached. This trains a model.

Data API - a popularity prior only

Without the BigQuery export, GA4’s reporting API returns aggregated item metrics with no user dimension at all. We import those as a popularity signal, which genuinely helps cold start - but there is no who in it, so it cannot train personalisation.
The console tells you which of these it is running. If you want GA4 to be more than a popularity prior, link GA4 to BigQuery first and re-import.

What happens to your rows

Item references resolve against both the identifier a feed supplied and the canonical URL a crawl recorded, so an import works whether your catalogue was built by crawling or by ingesting a feed. Rejections are reported by cause, because the two mean different things:
An import that silently discarded 40% of its rows would be worse than one that never ran. Check the rejection counts before treating an import as finished - a high unknown-item count means almost nothing landed.
Imports are safe to re-run. Every row carries a deterministic identifier derived from its own content, so importing the same export twice will not double-count anything.

After importing

Imported events are marked with their origin, so they can be weighted or excluded during training independently of live traffic. Once you have history in place, start a training run from Events → Training, or leave scheduled retraining to pick it up.