Trigger
INFO
Triggers can run a notification.webhook action that references a webhook by id ({"notification.webhook": {"webhook_id": <id>}}) instead of, or alongside, notification.email. Create the webhook first, then point the trigger's perform action at its id.
List
Required permission: admin.trigger
GET-Request sent: /api/v1/triggers
Details
json
// HTTP-Code 200 OK
[
{
"id": 2,
"name": "auto reply (on follow-up of tickets)",
"condition": {
"ticket.action": {
"operator": "is",
"value": "update"
},
"article.sender_id": {
"operator": "is",
"value": 2
},
"article.type_id": {
"operator": "is",
"value": [
1,
5,
11
]
}
},
"perform": {
"notification.email": {
"body": "<div>Your follow-up for <b>(#{config.ticket_hook}#{ticket.number})</b> has been received and will be reviewed by our support staff.</div>\n<br/>\n<div>To provide additional information, please reply to this email or click on the following link:\n<a href=\"#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}\">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>\n</div>\n<br/>\n<div>Your #{config.product_name} Team</div>\n<br/>\n<div><i><a href=\"https://zammad.com\">Zammad</a>, your customer support system</i></div>",
"recipient": "article_last_sender",
"subject": "Thanks for your follow-up (#{ticket.title})"
}
},
"disable_notification": true,
"localization": null,
"timezone": null,
"note": null,
"activator": "action",
"execution_condition_mode": "selective",
"active": false,
"updated_by_id": 1,
"created_by_id": 1,
"created_at": "2026-09-07T06:40:27.193Z",
"updated_at": "2026-09-07T06:40:27.193Z"
}
]INFO
recipient: "article_last_sender" emails whoever wrote the triggering article. In this example that is always the customer, because the condition requires article.sender_id to be 2 (Customer). If an agent wrote the article, the agent would receive the email instead. Use recipient: "ticket_customer" (see Create below) to always target the customer regardless of who performed the action.
Show
Required permission: admin.trigger
GET-Request sent: /api/v1/triggers/{id}
Details
json
// HTTP-Code 200 OK
{
"id": 4,
"name": "Notify customer on auto-close",
"condition": {
"operator": "AND",
"conditions": [
{
"name": "ticket.state_id",
"operator": "is",
"value": [
4
]
}
]
},
"perform": {
"notification.email": {
"recipient": "ticket_customer",
"subject": "Your ticket #{ticket.number} has been closed",
"body": "<div>Your ticket <b>#{ticket.number}</b> has been closed. Thank you for contacting us.</div>"
}
},
"disable_notification": false,
"localization": null,
"timezone": null,
"note": "Sends a confirmation email when a ticket is closed.",
"activator": "action",
"execution_condition_mode": "selective",
"active": true,
"updated_by_id": 3,
"created_by_id": 3,
"created_at": "2026-09-24T12:31:52.822Z",
"updated_at": "2026-09-24T12:31:52.822Z"
}Create
Required permission: admin.trigger
POST-Request sent: /api/v1/triggers
condition accepts two shapes: a flat object keyed by field name (as shown in the List example above, matching Zammad's stock triggers) and the explicit {"operator": "AND", "conditions": [...]} form used below.
In the example below, closing a ticket results in the ticket's customer receiving a confirmation email, because recipient: "ticket_customer" always resolves to the customer regardless of who performed the closing action.
Details
json
{
"name": "Notify customer on auto-close",
"condition": {
"operator": "AND",
"conditions": [
{
"name": "ticket.state_id",
"operator": "is",
"value": [
4
]
}
]
},
"perform": {
"notification.email": {
"recipient": "ticket_customer",
"subject": "Your ticket #{ticket.number} has been closed",
"body": "<div>Your ticket <b>#{ticket.number}</b> has been closed. Thank you for contacting us.</div>"
}
},
"disable_notification": false,
"activator": "action",
"execution_condition_mode": "selective",
"active": true,
"note": "Sends a confirmation email when a ticket is closed."
}Update
Required permission: admin.trigger
PUT-Request sent: /api/v1/triggers/{id}
Payload shape is identical to Create. The response is the updated record, same shape as Show/Create with updated_at refreshed.
TIP
A partial payload works too, e.g. {"active": false} to toggle just that field. To update a trigger by name, look up its id via GET /api/v1/triggers first, then send the PUT request to /api/v1/triggers/{id}.
Details
json
{
"name": "Notify customer on auto-close",
"condition": {
"operator": "AND",
"conditions": [
{
"name": "ticket.state_id",
"operator": "is",
"value": [
4
]
}
]
},
"perform": {
"notification.email": {
"recipient": "ticket_customer",
"subject": "Your ticket #{ticket.number} has been closed",
"body": "<div>Your ticket <b>#{ticket.number}</b> has been closed. Thank you for contacting us.</div>"
}
},
"disable_notification": false,
"activator": "action",
"execution_condition_mode": "selective",
"active": true,
"note": "Sends a confirmation email when a ticket is closed.",
"id": 4
}Delete
Required permission: admin.trigger
DANGER
This is a permanent removal
Please note that removing triggers cannot be undone.
DELETE-Request sent: /api/v1/triggers/{id}
Details
json
// HTTP-Code 200 OK
{}