When it fires
After UpdateProductService succeeds. Fires for dashboard edits and v1 API PATCH /products/{slug}.
Payload
ts
{
type: 'product.updated',
data: {
product: {
id: string
name: string
slug: string
icon: string | null
updatedAt: string // ISO timestamp
}
changes: Array<'name' | 'slug' | 'icon' | 'isPrivate'>
}
}changes lists the fields the request actually sent, so it is the only place the privacy switch shows up. The isPrivate value itself is not in the payload.
Example
json
{
"type": "product.updated",
"data": {
"product": {
"id": "0192a1b2-c3d4-7000-8000-000000000005",
"name": "Acme Platform",
"slug": "acme-core",
"icon": null,
"updatedAt": "2026-05-31T10:36:00.000Z"
},
"changes": ["slug"]
}
}Privacy is evaluated when the event is emitted, which is after the update is written. Turning a product private therefore filters the very product.updated event that reports the change: it only reaches endpoints whose creator can access the product.