Skip to content
Merchant guide
HTTPS · Signed events

product.updated — V2 event (envelope + data)

It reaches you on every meaningful-field update — and tells you exactly which columns changed via changed_columns, with a sequential identity per update.

Reviewed against implementation
YOUR INTEGRATION, AT A GLANCE
product.updated — full 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"
  }
}
See the implementation
On this page

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

product.updated — full 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

FieldMeaning
data itselfThe same fields as product.created in full — a complete snapshot after the update.
changed_columnsAn array naming the columns that actually changed in this update.
changed_atThe 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.