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.
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 theread_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: everyview_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:
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.

