Working With Notification Templates

Accessing Notification Templates

  1. In ADOC, go to Settings.
  2. Select Notifications.
  3. Click Notification Templates.

You’ll see a list of existing templates and template groups (if configured).

Creating a Notification Template

Create the Template Group

  1. On the Notification Templates page, click Create Template.

  2. Enter:

    1. Name: Use something descriptive (e.g., Prod – DQ – Slack & PagerDuty)
    2. Description (Optional): Include purpose and audience, e.g., “On-call alerts for prod DQ policies”
  3. Click Save.

You’ll be redirected to the Edit Notification Template page for this new group.

Customizing Templates by Source and Channel

Templates in a group are defined per source type and per channel.

Select Source Type and Channel

In the Edit Notification Template page:

  1. From the left panel, choose a Source Type (for example, Data Quality, Pipeline Monitoring, Profile).
  2. Select a Channel:
    1. Email
    2. Webhook
    3. Slack
    4. Google Chat
    5. Microsoft Teams
    6. ServiceNow
    7. Jira

ADOC loads the system template for that combination as a starting point.

Edit Subject / Content

For each channel:

ChannelWhat You Edit
EmailSubject and Body (HTML or plain text)
WebhookJSON payload content
SlackBlock Kit JSON body
Google ChatCard JSON body
Microsoft TeamsMessageCard / Adaptive Card JSON
ServiceNowPlain text body or JSON fields
JiraJSON payload (issue fields / ADF document)

You write the content in FreeMarker Template Language (FTL) using variables such as: ${policy.name}, ${execution.resultStatus}, ${result.qualityScore}, etc.

For Jira and ServiceNow, the first test creates a record; subsequent tests update the same record.

Associating Template Groups to Notification Groups

Once your Template Group is ready:

  1. Navigate to Settings > Notifications > Notification Groups.
  2. Open or create a Notification Group.
  3. In the group configuration, select your Notification Template Group.
  4. Click Save.

From now on, alerts that use that Notification Group will:

  • Use your custom templates when available.
  • Fall back to system templates for source+channel combinations you haven’t customized.
ConceptRelationship
Notification GroupWho receives the alert and via which channels
Template GroupHow each alert looks for each channel and source type

ADOC Variable Model

Variables are exposed to templates based on policy type and execution context. You can explore them from the Variables tab (right panel) in the editor.

Below is a consolidated reference of the key categories. Exact availability may vary by source type.

Variable Categories

CategoryWhat It DescribesTypical Prefix
Execution ContextResult, severity, timestamps, messagesexecution
Policy InformationPolicy id, name, type, description, tagspolicy
Data Quality ResultsScores, row counts, rule outcomesresult, rule
Reconciliation ResultsCross-system record comparisonresult, reconciliation
Schema DriftStructural changes to assetsdrift
Data DriftDistribution changesdrift
FreshnessExpected vs. actual arrival timesfreshness
Pipeline MonitoringPipeline execution metrics and errorspipeline
Environmental ContextTenant, domains, assets, integrationstenant, asset, integration
Incident ContextIncident entity for failures/warnings onlyincident, severity, status, etc.

Detailed Variable Reference

Note This table focuses on the most heavily used fields. Your Variables panel in ADOC is the source of truth for exact names and availability.

Execution Context

VariableTypeDescriptionExample Usage
execution.resultStatusStringExecution result: SUCCESS / WARNING / FAILED / ERRORED${execution.resultStatus}
execution.severityStringAlert severity: Critical / High / Medium / Low${execution.severity}
execution.startTimeTimestampPolicy execution start time${execution.startTime?string["yyyy-MM-dd HH:mm:ss"]}
execution.endTimeTimestampPolicy execution end time${execution.endTime?string["yyyy-MM-dd HH:mm:ss"]}
execution.idNumberUnique execution identifier${execution.id}
execution.messageStringExecution details / error message${execution.message}

Policy Information

VariableTypeDescriptionExample Usage
policy.nameStringHuman-readable policy name${policy.name}
policy.idNumberUnique policy identifier${policy.id}
policy.typeStringPolicy type (DATA_QUALITY, RECONCILIATION, etc.)${policy.type}
policy.descriptionStringPolicy description${policy.description}
policy.scheduledBooleanWhether the policy runs on schedule${policy.scheduled?string('Yes','No')}
policy.tagsArrayTags assigned to policy${policy.tags?join(", ")}

Data Quality Results

Applies to Data Quality policies.

VariableTypeDescriptionExample Usage
result.qualityScoreNumberOverall quality score (%)${result.qualityScore}%
result.totalRowsScannedNumberTotal rows evaluated${result.totalRowsScanned?string[",###"]}
result.rowsPassedNumberRows that passed all rules${result.rowsPassed}
result.rowsFailedNumberRows that failed one or more rules${result.rowsFailed}
result.warningRowsNumberRows in warning threshold${result.warningRows!0}
result.totalRulesNumberNumber of rules evaluated${result.totalRules}
result.rulesPassedNumberRules that passed${result.rulesPassed}
result.rulesFailedNumberRules that failed${result.rulesFailed}

Rule-level details are typically exposed via a rules collection:

Field NameDescription
rule.nameRule name
rule.descriptionRule description
rule.statusFAILED / PASSED
rule.failedRows(If available) Number of bad rows

Reconciliation Results

Applies to reconciliation policies.

VariableTypeDescriptionExample Usage
result.totalRecordsNumberTotal records compared${result.totalRecords}
result.matchedRecordsNumberRecords that match${result.matchedRecords}
result.unmatchedRecordsNumberRecords that do not match${result.unmatchedRecords}
result.equalityPercentageNumberPercentage of equality${result.equalityPercentage}%
result.leftRowCountNumberRow count in left/source system${result.leftRowCount}
result.rightRowCountNumberRow count in right/target system${result.rightRowCount}
reconciliation.leftDataSourceStringLeft/source system identifier${reconciliation.leftDataSource}
reconciliation.rightDataSourceStringRight/target system identifier${reconciliation.rightDataSource}
reconciliation.joinKeysArrayJoin keys used for matching records${reconciliation.joinKeys?join(", ")}

Schema Drift

Applies to schema drift / structure monitoring policies.

VariableTypeDescriptionExample Usage
drift.addedColumnsArrayNewly added columns${drift.addedColumns?join(", ")}
drift.removedColumnsArrayRemoved columns${drift.removedColumns?join(", ")}
drift.modifiedColumnsArrayColumns with type or constraint changes${drift.modifiedColumns?join(", ")}
drift.lastAlteredTimeTimestampMost recent schema modification${drift.lastAlteredTime?string["yyyy-MM-dd HH:mm:ss"]}
drift.changeCountNumberTotal changes detected${drift.changeCount}

Example snippet:

Copy

Data Drift

VariableTypeDescription
drift.driftScoreNumberOverall drift score (change magnitude)
drift.driftedColumnsArrayColumns with significant distribution changes

Freshness

VariableTypeDescription
freshness.expectedTimeTimestampWhen data was expected
freshness.actualTimeTimestampWhen data actually arrived
freshness.delayMinutesNumberDelay in minutes
freshness.expectedBatchCountNumberExpected batch count (if batch-based)
freshness.actualBatchCountNumberActual batch count
freshness.warningThresholdNumberWarning threshold in minutes
freshness.failureThresholdNumberFailure threshold in minutes

Pipeline Monitoring

Applies to pipeline monitoring policies.

VariableTypeDescription
pipeline.idNumberPipeline identifier
pipeline.nameStringPipeline name
pipeline.statusStringSUCCESS, FAILED, etc.
pipeline.startTimeTimestampStart time
pipeline.endTimeTimestampEnd time
pipeline.durationNumberDuration (seconds)
pipeline.recordsProcessedNumberRecords processed
pipeline.bytesProcessedNumberBytes processed
pipeline.errorMessageStringError message for failed executions
pipeline.errorTypeStringError category
pipeline.dependenciesArrayUpstream / downstream dependencies

Environmental Context

VariableTypeDescription
tenant.nameStringTenant name
tenant.idStringUnique tenant identifier
domainsArrayLogical domains associated with the asset
asset.nameStringData asset (table / file / view) name
asset.idStringUnique asset identifier
asset.typeStringAsset type category
integration.nameStringRelated integration name
integration.idStringRelated integration id

Incident Variables (Failures / Warnings Only)

Available only when an incident is created (FAILED / WARNING executions).

VariableTypeDescription
incidentIdStringUnique incident identifier
createdAtTimestampIncident creation time
updatedAtTimestampLast updated time
severityStringIncident severity
statusStringIncident status
totalOccurrencesNumberNumber of times this incident occurred
openInAccelDataUrlStringDeep link to incident / execution in ADOC

These are not available for SUCCESS runs. Design templates either to:

  • Use conditionals to check availability, or
  • Have separate templates for success vs. failure notifications.

Working With Data Types in FreeMarker

Booleans

FreeMarker is strict about booleans. Do not use ${policy.scheduled} directly. Instead:

Copy

or:

Copy

Arrays and Collections

Use ?join for simple lists:

Copy

Or iterate:

Copy

Null Safety and Defaults

Use ! to provide default values:

Copy

Use ?? to test if a variable exists:

Copy

Number and Date Formatting

Copy

Basic Template Patterns

Interpolation

Copy

Conditionals

Copy

Iteration

Copy

Working Template Examples

This section provides complete, production-ready templates for common notification scenarios. These templates demonstrate best practices and can be used as starting points for your own customizations.

Data Quality Email Alert - Comprehensive Format

This template provides detailed data quality information in a well-structured HTML email format.

HTML
Copy

Slack Data Quality Alert - Block Kit Format

This template creates a rich, formatted Slack message using Block Kit for data quality alerts.

JSON
Copy

PagerDuty Webhook - Incident Trigger

This template creates a PagerDuty-compatible webhook payload for critical data quality failures.

JSON
Copy

ServiceNow Incident Creation

This template creates a ServiceNow incident with appropriate field mappings.

JSON
Copy

Pipeline Monitoring Email - Failure Alert

This template provides comprehensive pipeline failure information.

HTML
Copy

Reconciliation Slack Alert - Mismatch Notification

This template alerts on reconciliation mismatches between source and target systems.

JSON
Copy

Schema Drift Email - Change Summary

This template provides a clear summary of schema changes detected.

HTML
Copy

Data Freshness Microsoft Teams Alert

This template creates an Adaptive Card for Microsoft Teams to alert on data freshness issues.

JSON
Copy

Generic Webhook - Multi-Purpose Format

This template provides a flexible JSON structure suitable for most webhook integrations.

JSON
Copy
Type to search, ESC to discard
Type to search, ESC to discard
Type to search, ESC to discard