Reference

From product.csv to Consented Conversions

For: teams whose catalog still reaches Google and Amazon as an exported spreadsheet. Premise: the spreadsheet isn't wrong, it's late. Everything below replaces the lateness, not the catalog. Companions: The Trust Framework for why a record matters; AI Trust Framework Requirements for the REST layer; Global compliance harness checklist for the wider release gate. Download: CONSENTED-DATA-LAYER-TEST-HARNESS.md, the eighteen-test harness · diagrams as image or PDF (challenge, solution, benefit) and image or PDF (before and after).

The gap, in one sentence

A product.csv export describes the catalog as it was when someone ran the export. Google and Amazon now ask about each event as it happens, and they drop the events that can't show consent.

A nightly file can't say what a shopper agreed to at 14:32, because at 14:32 the file didn't exist.

What changed in the last year

DatePlatformChangeWhat it does to a CSV data layer
2026-08-18GoogleContent API for Shopping sunset; HTTP 410 errors from Sept 1, full shutdown early 2027Programmatic feeds must move to the Merchant API
2026-06-30AmazonConsent signal required on the Ad Tag, Conversions API and Events API for UK and EEA traffic; some sources add SwitzerlandConversions with no signal aren't used
2026-06-15Googlead_storage alone gates conversions and remarketing (reported, not yet confirmed by Google)No fallback when consent is missing
2026-04-14GoogleProduct data spec update: video_link, handling cutoff, minimum order value; 500×500 image minimum from 2027-01-31New columns a static export doesn't carry
2025-07-31AmazonXML and flat-file listings feeds retiredListings must go out as JSON_LISTINGS_FEED

None of these is a ban on spreadsheets. Each one moves a decision from the file to the moment of the event.

Challenge, solution, benefit

From product.csv to consented conversions, in four rows. Source: a product.csv snapshot goes stale between imports; Shopify webhooks keep a live PIM record; feeds match the store. Feeds: the Google Content API and Amazon XML feeds are retired; the Merchant API v1 and JSON_LISTINGS_FEED replace them; feeds keep flowing. Joins: ERP, CRM and PIM are matched by spreadsheet row; one shared key, shopify_variant_id plus market, replaces the row; ownership is clear and only the CRM holds people data. Consent: Google and Amazon drop conversions with no signal; Consent Mode v2 and Amazon ACS or TCF vendor 793 travel with every event; UK, EEA and Swiss conversions count.

Open the SVG full size (1600 × 744) · Download the image · Download the PDF.

Read each row left to right. The consent row is the goal. The other three make sure the data that reaches it is current, joined by key and owned by one system.

  1. Source. The export is replaced by webhooks. A price changed in Shopify reaches the PIM when it changes, not at the next import.
  2. Feeds. The retired channels are replaced by the APIs that replaced them. Nothing about the catalog changes; only the door it leaves through.
  3. Joins. Rows matched by position are replaced by one key, shopify_variant_id + market. ERP cost and stock arrive keyed by SKU and variant.
  4. Consent. The consent state travels with the event instead of being assumed. An event without it is not sent.

Before and after

Before and after. Before: ERP and Shopify exports are joined by row into product.csv, uploaded by hand or through the retired Content API, while browser tags fire with no consent signal; both reach Google and Amazon. After: Shopify and ERP changes arrive by webhook, keyed by SKU and variant, into PIM Sync, which feeds the Google Merchant API v1 and the Amazon JSON listings feed. Separately the shopper's consent banner sets Consent Mode v2 and ACS, CRM Sync stores the consent record, and server events carry consent state and a dedupe ID to Google and Amazon. The PIM and CRM paths are joined only offline, by shopify_variant_id and market.

Open the SVG full size (1600 × 848) · Download the image · Download the PDF.

The catalog and consent take separate paths, and that separation is the design, not a gap.

A PIM that never holds personal data can't leak it, and it doesn't have to be in scope for every privacy request.

Readiness checklist

Each item has a test with the same ID in the harness below.

Feeds

Identifiers and joins

Consent

PIM and CRM boundary

The test harness

Download the consented data layer test harness (Markdown) →

Eighteen tests, one per checklist item. Seven are shell commands you can run from the repository root today. One runs in the PIM's own test page. The other ten are browser or dashboard checks with a stated pass condition.

Run it in order. The feed and boundary checks are fast and catch code problems. The consent checks need a UK or EEA exit and a clean browser, and they catch configuration problems that no code search will find.

A test that hasn't run is not a pass. The harness ends with a results log. An empty row is an open item, not a green one.

Sources