When it fires
After CreateProductService succeeds, and after DuplicateProductService succeeds. Fires for dashboard creates, v1 API POST /products and v1 API POST /products/{slug}/duplicate.
A duplicate emits a single product.created for the copy. The projects, environments and variables cloned underneath it do not emit their own *.created events.
Payload
ts
{
type: 'product.created',
data: {
product: {
id: string // UUID
name: string
slug: string
icon: string | null
createdAt: string // ISO timestamp
}
}
}Example
json
{
"type": "product.created",
"data": {
"product": {
"id": "0192a1b2-c3d4-7000-8000-000000000005",
"name": "Acme Platform",
"slug": "acme-platform",
"icon": null,
"createdAt": "2026-05-31T10:30:00.000Z"
}
}
}A copy of a private product stays private. Its product.created is only delivered to endpoints whose creator can access that product.