Product

product.updated

A product was renamed, re-slugged, had its icon changed, or switched privacy.

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.