support.canned_reply.deleted
A saved reply is removed from a project's support inbox.
This is the final event for the given canned_reply.id. The snapshot is taken
just before the row goes, so the payload still names what disappeared even
though GET /v1/projects/{project}/support/canned-replies/{reply} now returns
404.
When this fires
A creator removes a saved reply from a project:
- Dashboard — the delete action on a snippet under Saved Replies in the support inbox.
- REST —
DELETE /v1/projects/{project}/support/canned-replies/{reply}. - MCP — the
delete_canned_replytool.
It does not fire when:
- The snippet was already gone. A second delete writes nothing and emits nothing.
- A message composed from the snippet is deleted or edited in a conversation. The saved reply is a template; what was sent is a separate message with its own lifecycle.
- The project itself is deleted. Its snippets go with it under
project.deletedwithout a per-snippet event.
Required ability
support-conversation:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "support.canned_reply.deleted",
"created_at": "2026-09-06T09:50:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"canned_reply": {
"id": "c2f8e6a1-7d34-4b9e-a05c-3e1f9b7d2a68",
"title": "Opening hours",
"shortcut": "open",
"sort_order": 1
},
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13"
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always support.canned_reply.deleted for this event. |
created_at | ISO 8601 timestamp | Server-side emission time. |
api_version | string | Webhook API contract version. |
project_id | string UUID | Project this event belongs to. |
data.canned_reply | object | Snapshot taken before the delete — id, title, shortcut, sort_order only. No body. |
data.canned_reply.id | string UUID | Saved reply identifier. No longer resolvable over the API. |
data.canned_reply.title | string | Picker label at the moment of deletion. |
data.canned_reply.shortcut | string, nullable | Expansion token at the moment of deletion, or null if none was set. |
data.canned_reply.sort_order | integer | Picker position at the moment of deletion. |
data.project_id | string UUID | Mirrors the envelope project_id. |
Caveats
- The body is gone with the row and was never in any event, so a mirror that wants to keep the text must have fetched it while the snippet existed.
- The freed
shortcutcan be reused by a new snippet straight away. Key a mirror onid, not on the shortcut. - Remaining snippets are not renumbered. Their
sort_ordervalues are unchanged and noupdatedevents follow a delete.
Related events
support.canned_reply.created— the snippet's first appearance.support.canned_reply.updated— edits between creation and this event.- Support events overview — back to family overview.
How is this guide?