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

EventDescription
product.createdA new product was created
product.updatedAn existing product was modified
product.deletedA product was deleted

Product SKU Events

EventDescription
product_sku.createdA new product SKU (variant) was created
product_sku.updatedAn existing product SKU was modified
product_sku.deletedA 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

FieldTypeDescription
idintegerUnique identifier for the product
object_idstring | nullExternal gateway identifier (e.g., Stripe product ID)
namestringProduct display name
name_internalstring | nullInternal product name (not shown to customers)
typestringProduct type (e.g., "good", "service")
activestringProduct status: "active" or "archived"
descriptionstring | nullProduct description
address_requiredboolean | nullWhether a shipping address is required
countriesarray | nullArray of ISO country codes where the product is available
entitlementsarray | nullEntitlement keys granted by this product
is_importedboolean | nullWhether the product was imported from an external system
is_hiddenboolean | nullWhether the product is hidden from customers
languagestring | nullLanguage code for the product
livemodebooleanWhether this is a live (not test) product
metadataobject | nullCustom key-value metadata
shippablebooleanWhether the product requires shipping
statement_descriptorstring | nullStatement descriptor for charges
site_idsarrayArray of site IDs where the product is available
created_atstringISO 8601 timestamp when the product was created
updated_atstringISO 8601 timestamp when the product was last modified

Product SKU Object

FieldTypeDescription
objectstringObject type identifier, always product_sku
idintegerUnique identifier for the SKU
product_idintegerParent product ID
namestringSKU display name
priceintegerPrice in cents
weightfloat | nullWeight of the item
currencystringThree-letter ISO currency code
countriesarray | nullArray of ISO country codes where the SKU is available
metadataobject | nullCustom key-value metadata
expires_atstring | nullISO 8601 timestamp when the SKU expires
entitlementsarray | nullEntitlement keys granted by this SKU
inventory_typeintegerInventory tracking type: 0 (infinite), 1 (finite), 2 (bucket)
inventory_quantityintegerCurrent inventory count (for finite inventory)

Previous Attributes (updated events only)

FieldTypeDescription
previous_attributesobjectContains only the fields that changed, with their previous values before the update. Only includes publishable fields.

Notes

  • The Product object does not include an object field in the payload (unlike most other webhook resources). It uses the top-level type field to identify the event.
  • The Product SKU object includes object: "product_sku" in the payload.
  • active on the Product is a string ("active" or "archived"), not a boolean.
  • inventory_type values: 0 = infinite (never runs out), 1 = finite (tracked quantity), 2 = bucket.
  • price on the SKU is in cents (e.g., 1999 = $19.99).

Related