33 lines
1.7 KiB
Markdown
33 lines
1.7 KiB
Markdown
# 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
|