Skip to main content

product.updated

Fired when an existing product is updated in the store.

Event Structure

{
"event_type": "product.updated",
"payload": { ... }
}

Payload

{
"id": "6753a1b2c3d4e5f6a7b8c9d0",
"title": "Classic Cotton T-Shirt",
"handle": "classic-cotton-t-shirt",
"description": "A comfortable 100% cotton t-shirt for everyday wear.",
"store_id": "store_abc123",
"tags": ["clothing", "t-shirt", "cotton"],
"quantity": 150,
"pricing": {
"price": 4500,
"compareAtPrice": 6000
},
"identification": {
"sku": "TSH-CLR-001",
"barcode": "1234567890123"
},
"dimensions": {
"length": 70,
"width": 50,
"height": 2
},
"weight": {
"value": 200,
"unit": "g"
},
"seo": {
"title": "Classic Cotton T-Shirt | My Store",
"description": "Shop the classic cotton t-shirt."
},
"images": [
{
"id": "img_001",
"fileName": "tshirt-front.jpg",
"fileUrl": "https://cdn.example.com/images/tshirt-front.jpg"
}
],
"collections": [
{
"id": "col_001",
"title": "Summer Collection",
"handle": "summer-collection",
"image": {
"id": "img_col_001",
"fileName": "summer.jpg",
"fileUrl": "https://cdn.example.com/images/summer.jpg"
},
"status": "active"
}
],
"options": [
{
"id": "opt_001",
"name": "Color",
"type": "color",
"values": [
{
"id": "val_001",
"label": "Black",
"type": "color",
"value": "Black",
"colorCode": "#000000",
"image": null,
"sortOrder": 0
},
{
"id": "val_002",
"label": "White",
"type": "color",
"value": "White",
"colorCode": "#FFFFFF",
"image": null,
"sortOrder": 1
}
]
},
{
"id": "opt_002",
"name": "Size",
"type": "text",
"values": [
{
"id": "val_003",
"label": "M",
"type": "text",
"value": "M",
"colorCode": null,
"image": null,
"sortOrder": 0
},
{
"id": "val_004",
"label": "L",
"type": "text",
"value": "L",
"colorCode": null,
"image": null,
"sortOrder": 1
}
]
}
],
"variants": [
{
"id": "var_001",
"options": ["val_001", "val_003"],
"images": [
{
"id": "img_002",
"fileName": "tshirt-black-m.jpg",
"fileUrl": "https://cdn.example.com/images/tshirt-black-m.jpg"
}
],
"pricing": {
"price": 4500,
"compareAtPrice": 6000
},
"quantity": 50,
"identification": {
"sku": "TSH-BLK-M",
"barcode": "1234567890124"
},
"dimensions": {
"length": 70,
"width": 50,
"height": 2
},
"weight": {
"value": 200,
"unit": "g"
},
"allowBackorder": false,
"trackQuantity": true
}
],
"createdAt": "2025-12-01T10:30:00.000Z",
"updatedAt": "2025-12-05T14:15:00.000Z"
}

Payload Fields

FieldTypeDescription
idstringUnique product ID
titlestringProduct title
handlestringURL-friendly slug
descriptionstringProduct description
store_idstringStore ID that owns this product
tagsstring[]Array of product tags
quantitynumberTotal available quantity
pricingobjectProduct pricing info
pricing.pricenumberPrice in minor units (e.g. cents)
pricing.compareAtPricenumberCompare-at price in minor units
identificationobjectProduct identifiers
identification.skustringSKU code
identification.barcodestringBarcode value
dimensionsobjectProduct dimensions
dimensions.lengthnumberLength
dimensions.widthnumberWidth
dimensions.heightnumberHeight
weightobjectProduct weight
weight.valuenumberWeight value
weight.unitstringWeight unit (e.g. g, kg)
seoobjectSEO metadata
seo.titlestringSEO title
seo.descriptionstringSEO description
imagesarrayProduct images
images[].idstringImage ID
images[].fileNamestringImage file name
images[].fileUrlstringFull image URL
collectionsarrayCollections the product belongs to
collections[].idstringCollection ID
collections[].titlestringCollection title
collections[].handlestringCollection URL slug
collections[].imageobject | nullCollection image
collections[].statusstringCollection status
optionsarrayProduct options (e.g. Color, Size)
options[].idstringOption ID
options[].namestringOption name
options[].typestringOption type
options[].valuesarrayAvailable values for this option
options[].values[].idstringOption value ID
options[].values[].labelstringDisplay label
options[].values[].typestringValue type
options[].values[].valuestringRaw value
options[].values[].colorCodestring | nullHex color code (for color type)
options[].values[].imagestring | nullImage reference (for image swatch type)
options[].values[].sortOrdernumberDisplay order
variantsarrayProduct variants
variants[].idstringVariant ID
variants[].optionsstring[]Array of selected option value IDs
variants[].imagesarrayVariant-specific images
variants[].pricingobjectVariant pricing
variants[].quantitynumberVariant stock quantity
variants[].identificationobjectVariant SKU and barcode
variants[].dimensionsobjectVariant dimensions
variants[].weightobjectVariant weight
variants[].allowBackorderbooleanWhether backorders are allowed
variants[].trackQuantitybooleanWhether inventory is tracked
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last update timestamp

Example Handler

app/routes/webhooks.products.tsx
import { authenticate } from "~/qumra.server";

export async function action({ request }: { request: Request }) {
const { payload, topic, storeId } =
await authenticate.admin(request);

if (topic === "product.updated") {
console.log(`Product updated: ${payload.title} (${payload.id})`);
console.log(`Price: ${payload.pricing.price}`);
console.log(`Variants: ${payload.variants.length}`);

// Sync changes to external system, refresh cache, etc.
}

return Response.json({ success: true });
}