01When does it fire?
- When a product is updated on any meaningful field from this list: name, description, category_id, price, compare_at_price, sku, barcode, image_url, has_variants, is_available, is_featured, stock_quantity, low_stock_threshold.
- Same-value writes generate no event — the change must be real.
- Every update carries changed_columns naming the actually-changed columns, and the sequential identity mwh:product-updated:<tenant_id>:<product_id>:<seq>.
02Full payload example
{
"id": "mwh:product-updated:9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b:7a2b9c4e-8f31-4d5a-b6c2-1e9f8a7b6c5d:1",
"type": "product.updated",
"api_version": "v2",
"tenant_id": "9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b",
"data": {
"product_id": "7a2b9c4e-8f31-4d5a-b6c2-1e9f8a7b6c5d",
"name": "Cotton T-shirt - Blue",
"description": "100% cotton t-shirt, multiple sizes",
"category_id": "8b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"price": 210,
"compare_at_price": 300,
"sku": "TSH-BLU",
"barcode": "6221048312571",
"image_url": "https://cdn.example.com/tshirt-blue.jpg",
"has_variants": true,
"is_available": true,
"is_featured": false,
"stock_quantity": 60,
"low_stock_threshold": 5,
"variants": [
{
"id": "2c4e6f8a-0b1d-4e2f-8a3b-5c6d7e8f9a0b",
"sku": "TSH-BLU-L",
"name": "Blue / L",
"color": "Blue",
"size": "L",
"price_override": 210,
"compare_at_price": 300,
"stock_quantity": 29,
"low_stock_threshold": 3
}
],
"variants_truncated": false,
"changed_columns": ["compare_at_price", "price"],
"changed_at": "2026-10-20T13:30:07.662018+00:00"
}
}03data fields
| Field | Meaning |
|---|---|
| data itself | The same fields as product.created in full — a complete snapshot after the update. |
| changed_columns | An array naming the columns that actually changed in this update. |
| changed_at | The update time, ISO 8601. |
04Event identity
Pattern: mwh:product-updated:<tenant_id>:<product_id>:<seq> — note the sequence suffix: every update has its own ordinal.
COMPLETE YOUR INTEGRATION
