# Feed sync deltas (seller MVP) High-value change signals from input feed syncs — without a full history table. ## Included | Signal | Source mapped fields | Where surfaced | |--------|----------------------|----------------| | **New** | GTIN not previously in catalog for this company | Feed `options.last_sync_deltas.new`, sync job enrichment | | **Price changed** | `price`, `sale_price`, `purchase_price` | counts + product filter `sync_change=price` | | **Stock changed** | `stock`, `quantity`, `qty` | counts + `sync_change=stock` | | **Availability changed** | `availability`, `stock_status`, `in_stock` | counts + `sync_change=availability` | | **Title changed** | `title`, `name`, `product_name` | counts + `sync_change=title` | | **Other changed** | any other mapped key change | counts + `sync_change=other` | | **Unchanged / skipped** | identical mapped JSON / bad rows | existing job counters | ## Storage - **Summary (last sync only):** `input_feeds.options.last_sync_deltas` — replaced each successful sync that processes rows (not when the whole feed file hash is unchanged). - **Product flags (latest modifying sync):** `raw_products.mapped_data._sync_changes` — string array, e.g. `["price","stock"]`. Replaced on the next content update for that GTIN. Not a durable audit log. ## Filters `GET /api/products?kind=unprocessed&sync_change=price` (also `stock`, `availability`, `title`, `other`, `new`, or `any`). Processed list supports the same query param via join to the linked raw row. ## Out of scope (MVP) - Multi-sync historical timelines / per-field before→after values - Diffs when the entire feed file hash is unchanged (short-circuit) - Shopify/Woo outbound push change reports