Products
Receive notifications when products and product SKUs are created, updated, or deleted.
Overview
Product webhooks notify your application when products or product SKUs (variants) are created, modified, or deleted. Use these events to sync your product catalog, track inventory changes, and keep external systems in sync.
Use Cases
- Sync product catalog to your e-commerce storefront
- Track inventory changes when SKUs are updated
- Notify warehouse systems when new SKUs are created
- Update search indexes when product details change
- Archive product data when items are deleted
Events
Product Events
| Event | Description |
|---|---|
product.created | A new product was created |
product.updated | An existing product was modified |
product.deleted | A product was deleted |
Product SKU Events
| Event | Description |
|---|---|
product_sku.created | A new product SKU (variant) was created |
product_sku.updated | An existing product SKU was modified |
product_sku.deleted | A product SKU was deleted |
product.created
Triggered When
- A product is created via the Core API
- A product is created from the Platform
Payload
{
"type": "product.created",
"id": "evt_a1B2c3D4e5F6g7H8i9J0k1L2",
"created": 1704067200,
"data": {
"object": {
"id": 100001,
"object_id": "prod_XXXXXXXXXXXXXX",
"name": "Premium Poster Collection",
"name_internal": null,
"type": "good",
"active": "active",
"created_at": "2026-01-01T12:00:00.000000Z",
"updated_at": "2026-01-01T12:00:00.000000Z",
"address_required": null,
"countries": null,
"description": "A curated collection of premium art prints.",
"entitlements": null,
"is_imported": null,
"is_hidden": null,
"language": null,
"livemode": true,
"metadata": null,
"shippable": true,
"statement_descriptor": null,
"site_ids": [1]
}
}
}product.updated
Triggered When
- A product is updated via the Core API
- A product is updated from the Platform
Payload
The payload includes a previous_attributes object containing only the fields that changed.
{
"type": "product.updated",
"id": "evt_b2C3d4E5f6G7h8I9j0K1l2M3",
"created": 1704153600,
"data": {
"object": {
"id": 100001,
"object_id": "prod_XXXXXXXXXXXXXX",
"name": "Premium Poster Collection - Updated",
"name_internal": null,
"type": "good",
"active": "active",
"created_at": "2026-01-01T12:00:00.000000Z",
"updated_at": "2026-01-02T12:00:00.000000Z",
"address_required": null,
"countries": null,
"description": "An updated curated collection of premium art prints.",
"entitlements": null,
"is_imported": null,
"is_hidden": null,
"language": null,
"livemode": true,
"metadata": null,
"shippable": true,
"statement_descriptor": null,
"site_ids": [1]
},
"previous_attributes": {
"name": "Premium Poster Collection",
"description": "A curated collection of premium art prints."
}
}
}product.deleted
Triggered When
- A product is deleted (archived) via the Core API
- A product is deleted from the Platform
Payload
{
"type": "product.deleted",
"id": "evt_c3D4e5F6g7H8i9J0k1L2m3N4",
"created": 1704240000,
"data": {
"object": {
"id": 100001,
"object_id": "prod_XXXXXXXXXXXXXX",
"name": "Premium Poster Collection",
"name_internal": null,
"type": "good",
"active": "archived",
"created_at": "2026-01-01T12:00:00.000000Z",
"updated_at": "2026-01-03T12:00:00.000000Z",
"address_required": false,
"countries": null,
"description": "A curated collection of premium art prints.",
"entitlements": null,
"is_imported": null,
"is_hidden": null,
"language": null,
"livemode": true,
"metadata": null,
"shippable": false,
"statement_descriptor": null,
"site_ids": [1]
}
}
}product_sku.created
Triggered When
- A product SKU (variant) is created via the Core API
- A product SKU is created from the Platform
Payload
{
"type": "product_sku.created",
"id": "evt_d4E5f6G7h8I9j0K1l2M3n4O5",
"created": 1704067200,
"data": {
"object": {
"object": "product_sku",
"id": 200001,
"product_id": 100001,
"name": "Premium Poster - Large Format",
"price": 1999,
"weight": 0.3,
"currency": "usd",
"countries": ["US", "CA", "GB"],
"metadata": null,
"expires_at": null,
"entitlements": null,
"inventory_type": 1,
"inventory_quantity": 50
}
}
}product_sku.updated
Triggered When
- A product SKU is updated via the Core API
- A product SKU is updated from the Platform
- Inventory quantity changes (e.g., after an order is placed)
Payload
The payload includes a previous_attributes object containing only the fields that changed.
{
"type": "product_sku.updated",
"id": "evt_e5F6g7H8i9J0k1L2m3N4o5P6",
"created": 1704153600,
"data": {
"object": {
"object": "product_sku",
"id": 200001,
"product_id": 100001,
"name": "Premium Poster - Large Format",
"price": 1999,
"weight": 0.3,
"currency": "usd",
"countries": ["US", "CA", "GB"],
"metadata": null,
"expires_at": null,
"entitlements": null,
"inventory_type": 1,
"inventory_quantity": 49
},
"previous_attributes": {
"inventory_quantity": 50
}
}
}product_sku.deleted
Triggered When
- A product SKU is deleted via the Core API
- A product SKU is deleted from the Platform
Payload
{
"type": "product_sku.deleted",
"id": "evt_f6G7h8I9j0K1l2M3n4O5p6Q7",
"created": 1704240000,
"data": {
"object": {
"object": "product_sku",
"id": 200001,
"product_id": 100001,
"name": "Premium Poster - Large Format",
"price": 4999,
"weight": null,
"currency": "usd",
"countries": ["US", "CA"],
"metadata": {"category": "prints"},
"expires_at": null,
"entitlements": null,
"inventory_type": 1,
"inventory_quantity": 200
}
}
}Payload Fields
Product Object
| Field | Type | Description |
|---|---|---|
id | integer | Unique identifier for the product |
object_id | string | null | External gateway identifier (e.g., Stripe product ID) |
name | string | Product display name |
name_internal | string | null | Internal product name (not shown to customers) |
type | string | Product type (e.g., "good", "service") |
active | string | Product status: "active" or "archived" |
description | string | null | Product description |
address_required | boolean | null | Whether a shipping address is required |
countries | array | null | Array of ISO country codes where the product is available |
entitlements | array | null | Entitlement keys granted by this product |
is_imported | boolean | null | Whether the product was imported from an external system |
is_hidden | boolean | null | Whether the product is hidden from customers |
language | string | null | Language code for the product |
livemode | boolean | Whether this is a live (not test) product |
metadata | object | null | Custom key-value metadata |
shippable | boolean | Whether the product requires shipping |
statement_descriptor | string | null | Statement descriptor for charges |
site_ids | array | Array of site IDs where the product is available |
created_at | string | ISO 8601 timestamp when the product was created |
updated_at | string | ISO 8601 timestamp when the product was last modified |
Product SKU Object
| Field | Type | Description |
|---|---|---|
object | string | Object type identifier, always product_sku |
id | integer | Unique identifier for the SKU |
product_id | integer | Parent product ID |
name | string | SKU display name |
price | integer | Price in cents |
weight | float | null | Weight of the item |
currency | string | Three-letter ISO currency code |
countries | array | null | Array of ISO country codes where the SKU is available |
metadata | object | null | Custom key-value metadata |
expires_at | string | null | ISO 8601 timestamp when the SKU expires |
entitlements | array | null | Entitlement keys granted by this SKU |
inventory_type | integer | Inventory tracking type: 0 (infinite), 1 (finite), 2 (bucket) |
inventory_quantity | integer | Current inventory count (for finite inventory) |
Previous Attributes (updated events only)
| Field | Type | Description |
|---|---|---|
previous_attributes | object | Contains only the fields that changed, with their previous values before the update. Only includes publishable fields. |
Notes
- The Product object does not include an
objectfield in the payload (unlike most other webhook resources). It uses the top-leveltypefield to identify the event. - The Product SKU object includes
object: "product_sku"in the payload. activeon the Product is a string ("active"or"archived"), not a boolean.inventory_typevalues:0= infinite (never runs out),1= finite (tracked quantity),2= bucket.priceon the SKU is in cents (e.g.,1999= $19.99).
Related
- Webhooks Overview - Setup, signatures, and configuration
- Order Webhooks - Order events that reference products and SKUs
Updated about 6 hours ago
