---
updatedAt: 2026-02-24T17:13:10.000Z
agentTools:
  projectIndex: https://docs.pelcro.com/v2.4/llms.txt
---

# 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`](#productcreated) | A new product was created        |
| [`product.updated`](#productupdated) | An existing product was modified |
| [`product.deleted`](#productdeleted) | A product was deleted            |

### Product SKU Events

| Event                                        | Description                             |
| -------------------------------------------- | --------------------------------------- |
| [`product_sku.created`](#product_skucreated) | A new product SKU (variant) was created |
| [`product_sku.updated`](#product_skupdated)  | An existing product SKU was modified    |
| [`product_sku.deleted`](#product_skudeleted) | 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

```json
{
  "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.

```json
{
  "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

```json
{
  "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

```json
{
  "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.

```json
{
  "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

```json
{
  "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 `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

* [Webhooks Overview](webhooks) - Setup, signatures, and configuration
* [Order Webhooks](https://docs.pelcro.com/docs/webhooks-orders) - Order events that reference products and SKUs

# Sibling pages

* [Email Templates](https://docs.pelcro.com/v2.4/docs/e-mail-templates-for-webhooks.md)
* [Addresses](https://docs.pelcro.com/v2.4/docs/webhooks-addresses.md)
* [Bills](https://docs.pelcro.com/v2.4/docs/webhooks-bills.md)
* [Campaigns](https://docs.pelcro.com/v2.4/docs/webhooks-campaigns.md)
* [Charges](https://docs.pelcro.com/v2.4/docs/webhooks-charges.md)
* [Customers](https://docs.pelcro.com/v2.4/docs/webhooks-customers.md)
* [Exports](https://docs.pelcro.com/v2.4/docs/webhooks-exports.md)
* [Fraud Prevention](https://docs.pelcro.com/v2.4/docs/webhooks-fraud-prevention.md)
* [Invoices](https://docs.pelcro.com/v2.4/docs/webhooks-invoices.md)
* [Members](https://docs.pelcro.com/v2.4/docs/webhooks-members.md)
* [Newsletters](https://docs.pelcro.com/v2.4/docs/webhooks-newsletters.md)
* [Orders](https://docs.pelcro.com/v2.4/docs/webhooks-orders.md)
* [Payment Methods](https://docs.pelcro.com/v2.4/docs/webhooks-payment-methods.md)
* [Plans](https://docs.pelcro.com/v2.4/docs/webhooks-plans.md)
* [Subscriptions](https://docs.pelcro.com/v2.4/docs/webhooks-subscriptions.md)
* [Vendors](https://docs.pelcro.com/v2.4/docs/webhooks-vendors.md)