text field, a flat ticket API, a comma-separated region list). Leave the field blank if the default payload already works. Webhook channels and templates need Pro or Business.
What you can use
Stock helpers only (#if, #unless, #each, #with). No join, eq, or JSON escaping.
That means:
- There is no
joinhelper. To putincident.failing_regionsinto one string, iterate with#eachand insert separators yourself (#unless @lastin the example below). - There is no string-equality helper. You cannot write
{{#if (eq event "incident.resolved")}}. Branch onincident.resolved_atinstead of comparingevent: it is set after resolve andnullwhile the incident is still open. - Values are inserted as-is. There is no helper that JSON-escapes quotes or newlines inside a string. If a monitor name contains
"and you wrap{{monitor.name}}in JSON quotes, the body may not be valid JSON.
#if / #unless test whether a value is present. #each walks an array. #with shifts context to a nested object. Do not rely on helpers you know from other Handlebars setups; they are not registered here.
Example
This template builds a small JSON object: a human-readabletext line, and regions as a comma-separated list from incident.failing_regions.
Content-Type is application/json. If it is not JSON, Tallwatch sends text/plain. See for the headers.
Test and fallback
Test with Send test. That POST usesevent test and incident null, so paths like {{incident.status}} render empty. Use it to confirm the URL, the signature, and that the template compiles.
A broken template falls back to the canonical JSON. If Handlebars cannot compile or render the template, Tallwatch POSTs the JSON from instead of failing the dispatch. Fix the template and Send test again rather than assuming the receiver will keep seeing your custom shape.
Signature verification uses the bytes Tallwatch actually POSTs. If the template ran, those bytes are the rendered body. If it fell back, they are the canonical JSON. Verify against the raw request body. See .