Skip to main content
Alert templates let you control the exact content and wording of the alerts Coalesce Quality sends so an alert reads the way your team expects.

The alert template editor — compose the message from ordered blocks written in Jinja, set a title template, and reference available variables.

Choosing a template mode

Every alert offers three template modes. Pick one at the top of the template editor:

Pick a template mode: Standard uses the built-in format, Custom plain text sets a fixed message, and Custom dynamic composes the message from blocks.

Alerts for business stakeholders can be set up as templated alerts with a custom subject and body — write plain-language content that non-technical teams (marketing, operations, sales) can act on. Scope the alert to a specific test or monitor to tailor the message per rule, and route it to the channels they already use.

Plain text templates

Custom plain text lets you define a fixed title and body. Leave a field empty to use the default for that alert. Use this mode when you want a fixed, unchanging message, like sending static content to stakeholders.

Dynamic templates

Alpha feature. Customizing alert content with Dynamic templates as described here — are currently in Alpha. Contact the Coalesce team to have them enabled for your workspace.
Dynamic templates use block-based template layout that is interpreted by a Jinja engine. They allow you more control over the alert content with variables and sections.

The block model

A template is an ordered list of blocks. Each block is a small, self-contained fragment written in Jinja, and each block renders on its own — a block cannot reference or inherit from another block. There is no shared base template: {% extends %} and {% include %} are not supported and will fail to render. Each alert ships with a default template made up of the shared catalog blocks below. When you save a custom template it replaces the default entirely — so to keep a section you must keep its block, and to remove a section you simply omit its block.

Layout sections

A rendered alert is laid out in two sections, and every block belongs to one of them: Catalog blocks have fixed placements per channel, so they land in the right section automatically. A custom block renders in whichever section you assign it to.

Catalog blocks

Catalog blocks land in a fixed layout section — you don’t place them yourself. The sections below are the defaults for Ungrouped Issue alerts; Grouped Issue alerts may repeat a block across both sections.

Custom blocks

You are not limited to the catalog. Add your own named block with whatever Jinja content you like; it renders in list order within the layout section you assign it to.

Variables and filters

Variables carry the alert’s data; filters (tagged filter below) format a value. Apply a filter with a pipe: {{ asset.name | bold }}. Every variable is optional — a value that isn’t available for a given alert renders as empty rather than erroring, and a filter applied to an empty value renders as empty text. Click Available variables in the editor to open a reference panel listing every variable and filter grouped by category, so you can browse and insert them without leaving the editor.

The Available variables panel — every variable and filter, grouped by category.

The following are available on every alert: Filters are channel-aware: the same template renders native Slack markup, HTML email, or MS Teams markup depending on where the alert is sent — you don’t (and can’t) branch on the channel yourself. The mention field on owners and downstream_owners is already formatted for the channel, so print it directly.

Ungrouped Issue alerts

Alerts that fire once per issue expose these in addition to the common set:

Grouped Issue alerts

Alerts that group issues by failing entity expose these in addition to the common set:

Worked examples

A stripped-back analyst Slack alert

To give analysts a lean alert, keep the headline, affected products, ownership, and error message, and drop the asset metadata and incident-management sections. Because a custom template replaces the default, you achieve this by keeping only the blocks you want: Omitting asset_metadata and incident_mgmt removes those sections — and because incident_mgmt is gone, the Slack Set Status button is dropped too.

A headline that leads with the schema

To surface the schema in the headline, override the headline block on a per-issue alert:
For an issue that was just created on analytics.orders, this renders as analytics/orders created. (Use this on per-issue alerts — asset.schema is not available on grouped alerts.) The summary can carry more than the default blocks. Add a custom block and assign it to the Summary section to include a “what to do next” line — for example, a link to your team’s runbook for fixing the issue:
Because the link is a plain Jinja string, you can point it at any URL — a Confluence page, a Notion doc, a GitHub README. The link filter renders it as a native hyperlink in Slack, email, and Microsoft Teams alike. To make the link follow the asset, build the URL from a variable instead of hard-coding it:
This new block renders alongside the headline in the alert summary, so recipients see how to respond right next to what went wrong.

When a template breaks

Templates are validated as you edit: the live preview in the editor renders your template against a sample alert and shows any parse or render error inline, so you can fix it before saving. Because filters are channel-aware, the same template is previewed as it will appear in each channel — switch the preview between Slack, Email, and Microsoft Teams:

Live preview — how the template renders as a Slack message.

Live preview — the same template rendered as an HTML email.

Live preview — the same template rendered as a Microsoft Teams card.

If a saved template ever fails to render when a real alert fires — for example a typo introduced later, or a variable used in a way that errors — Coalesce Quality falls back to the default template for that alert and sends it. Delivery is never blocked and no partial message is sent.