Alerting & tasks
The right message, to the right channel, only when it matters.
A subscription decides which runs notify anyone, then delivers the result to vetted recipients on five channels. Runs with rows can open a task that stays open until the data is clean, and anomaly detection can replace fixed triggers with a statistical baseline.
- 5delivery channels
- 3notification triggers
- 3anomaly methods
When does a run notify?
Every run is recorded with a status, and recipients are notified only when it is Sent. A run with no rows ends as No results, whatever the trigger. Pick a trigger to see how the same seven runs play out.
- 09:000 rowsNo resultszero rows never notify
- 10:003 rowsSent0 → 3, changed
- 11:003 rowsSilenced3 → 3, unchanged
- 12:005 rowsSent3 → 5, changed
- 13:002 rowsSent5 → 2, changed
- 14:002 rowsSilenced2 → 2, unchanged
- 15:000 rowsNo resultszero rows never notify
3 of 7 runs notify the recipients.
A run is compared with the last run that was not skipped. With anomaly detection on, the trigger is not used: after the same checks, a run is Sent only when its row count is unusual (section 04).
One run, five formats.
Each channel receives the same run in its own format: a title, the preview rows (at most 20, cut further by the subscription's Max rows and the channel's own limits), and the total row count. Rows are PII-masked before any channel sees them.
| payment_id | merchant | amount |
|---|---|---|
| pay_7Q2K81 | Northwind Outfitters Ltd | 129.00 |
| pay_7Q2K64 | Blue Fern Cafe | 8.40 |
| pay_7Q2K50 | Contoso Travel | 412.75 |
| pay_7Q2K47 | Acme Hardware | 56.10 |
| pay_7Q2K33 | Tailspin Toys | 34.99 |
| pay_7Q2K29 | Fabrikam Home and Garden | 218.00 |
| pay_7Q2K18 | Litware Books | 22.50 |
| pay_7Q2K12 | Adatum Pharmacy | 17.80 |
| pay_7Q2K09 | Proseware Fitness | 49.00 |
| pay_7Q2K05 | Wingtip Florist | 64.30 |
payment_id | merchant | amount | currency | decline_code -----------+----------------------+--------+----------+--------------------- pay_7Q2K81 | Northwind Outfitt... | 129.00 | EUR | insufficient_funds pay_7Q2K64 | Blue Fern Cafe | 8.40 | EUR | do_not_honor pay_7Q2K50 | Contoso Travel | 412.75 | EUR | card_velocity_exc... pay_7Q2K47 | Acme Hardware | 56.10 | EUR | expired_card pay_7Q2K33 | Tailspin Toys | 34.99 | EUR | insufficient_funds pay_7Q2K29 | Fabrikam Home and... | 218.00 | EUR | do_not_honor pay_7Q2K18 | Litware Books | 22.50 | EUR | incorrect_cvc pay_7Q2K12 | Adatum Pharmacy | 17.80 | EUR | insufficient_funds pay_7Q2K09 | Proseware Fitness | 49.00 | EUR | expired_card pay_7Q2K05 | Wingtip Florist | 64.30 | EUR | do_not_honor pay_7Q2J98 | Coho Winery | 140.00 | EUR | insufficient_funds pay_7Q2J91 | Lucerne Publishing | 12.00 | EUR | incorrect_cvcView Full Results
- To
- ops@acme.example
- Subject
- [Beacon] Payments DB - Failed card payments
Total records: 12
| payment_id | merchant | amount | currency | decline_code | created_at |
|---|---|---|---|---|---|
| pay_7Q2K81 | Northwind Outfitters Ltd | 129.00 | EUR | insufficient_funds | 2026-10-15 09:14 |
| pay_7Q2K64 | Blue Fern Cafe | 8.40 | EUR | do_not_honor | 2026-10-15 09:13 |
| pay_7Q2K50 | Contoso Travel | 412.75 | EUR | card_velocity_exceeded | 2026-10-15 09:11 |
| pay_7Q2K47 | Acme Hardware | 56.10 | EUR | expired_card | 2026-10-15 09:10 |
| pay_7Q2K33 | Tailspin Toys | 34.99 | EUR | insufficient_funds | 2026-10-15 09:08 |
| pay_7Q2K29 | Fabrikam Home and Garden | 218.00 | EUR | do_not_honor | 2026-10-15 09:06 |
| pay_7Q2K18 | Litware Books | 22.50 | EUR | incorrect_cvc | 2026-10-15 09:05 |
| pay_7Q2K12 | Adatum Pharmacy | 17.80 | EUR | insufficient_funds | 2026-10-15 09:03 |
| pay_7Q2K09 | Proseware Fitness | 49.00 | EUR | expired_card | 2026-10-15 09:02 |
| pay_7Q2K05 | Wingtip Florist | 64.30 | EUR | do_not_honor | 2026-10-15 09:01 |
| pay_7Q2J98 | Coho Winery | 140.00 | EUR | insufficient_funds | 2026-10-15 09:00 |
| pay_7Q2J91 | Lucerne Publishing | 12.00 | EUR | incorrect_cvc | 2026-10-15 08:59 |
- Type
- Task
- Priority
- Medium
- Labels
- Beacon
Total records: 12
| payment_id | merchant | amount | currency | decline_code | created_at |
|---|---|---|---|---|---|
| pay_7Q2K81 | Northwind Outfitters Ltd | 129.00 | EUR | insufficient_funds | 2026-10-15 09:14 |
| pay_7Q2K64 | Blue Fern Cafe | 8.40 | EUR | do_not_honor | 2026-10-15 09:13 |
| pay_7Q2K50 | Contoso Travel | 412.75 | EUR | card_velocity_exceeded | 2026-10-15 09:11 |
| pay_7Q2K47 | Acme Hardware | 56.10 | EUR | expired_card | 2026-10-15 09:10 |
| pay_7Q2K33 | Tailspin Toys | 34.99 | EUR | insufficient_funds | 2026-10-15 09:08 |
| pay_7Q2K29 | Fabrikam Home and Garden | 218.00 | EUR | do_not_honor | 2026-10-15 09:06 |
| pay_7Q2K18 | Litware Books | 22.50 | EUR | incorrect_cvc | 2026-10-15 09:05 |
| pay_7Q2K12 | Adatum Pharmacy | 17.80 | EUR | insufficient_funds | 2026-10-15 09:03 |
| pay_7Q2K09 | Proseware Fitness | 49.00 | EUR | expired_card | 2026-10-15 09:02 |
| pay_7Q2K05 | Wingtip Florist | 64.30 | EUR | do_not_honor | 2026-10-15 09:01 |
| pay_7Q2J98 | Coho Winery | 140.00 | EUR | insufficient_funds | 2026-10-15 09:00 |
| pay_7Q2J91 | Lucerne Publishing | 12.00 | EUR | incorrect_cvc | 2026-10-15 08:59 |
- 09:15 Beacon added the same content as a comment (12 rows).
- 09:45 Beacon commented: a later delivery, 15 rows.
- 10:00 Beacon commented: a later delivery, 18 rows.
{ "timestamp": "2026-10-15T09:15:03.218Z", "source": "Beacon", "subscriptionName": "Failed card payments", "subscriptionId": 42, "dataSourceName": "Payments DB", "totalRecords": 12, "executionTimeMs": 212.6, "previousResultCount": 0, "timedOut": false, "records": [ { "payment_id": "pay_7Q2K81", "merchant": "Northwind Outfitters Ltd", "amount": 129.00, "currency": "EUR", "decline_code": "insufficient_funds", "created_at": "2026-10-15T09:14:08Z" }, { "payment_id": "pay_7Q2K64", "merchant": "Blue Fern Cafe", "amount": 8.40, "currency": "EUR", "decline_code": "do_not_honor", "created_at": "2026-10-15T09:13:41Z" } ], "notificationUrl": "https://beacon.acme.example/beacon/notifications/981"}| Channel | Inline rows | Attachment |
|---|---|---|
| Teams | First 10 rows, first 3 columns | None |
| Slack | First 25 rows, first 5 columns, each column cut to 20 characters | None |
| The preview rows, as an HTML table | CSV or XLSX | |
| Jira | The preview rows, as a table | None |
| Webhook | The preview rows, as JSON | None |
Teams, Slack and the webhook link back to the run's notification page when a base URL is set. The SQL is included only with Show query text in notification on. Slack and the webhook also carry anomaly details when detection flagged the run. A webhook recipient can replace the body with its own template.
A task stays open while the problem does.
With Create a task on, the first run with rows opens a task. Later runs update it, and a run with no rows resolves it. Notifications say that something happened; tasks track whether someone dealt with it.
The SLA counts down against the subscription's SLA hours, or 24 hours when none is set; an Admin sets 1 to 720 hours from the task page. Every run that executes the query updates the task, whatever its notification status.
Notify on the unusual, not on every change.
With anomaly detection on, a subscription compares each run's row count with the runs of its lookback window and notifies only when the run is unusual. It is statistical and needs no LLM. Switch the sensitivity to move the threshold.
| Sensitivity | Std. deviation | Percentage change |
|---|---|---|
| High | 1.5σ | 15% |
| Medium | 2σ | 25% |
| Low | 3σ | 40% |
High alerts most often. IQR ignores the sensitivity: its bounds are always 1.5 × IQR beyond Q1 and Q3. Severity follows the size of the deviation (for standard deviation: Medium from 2, High from 3, Critical from 4).
The metric is the row count
Beacon measures how many rows a run returns. Write the query to return one row per item, not a single COUNT(*) row. No run is an anomaly until the lookback window holds the minimum data points (7 by default).
Failed card payments, one morning.
A payments team wants to hear about card failures when they grow, and wants someone to own the problem until it stops. One subscription does both.
SELECT payment_id, merchant, amount, currency, decline_code, created_atFROM payments.card_paymentsWHERE status = 'failed' AND created_at > now() - interval '1 hour'ORDER BY created_at DESC;- Cron expression
- */15 * * * * (every 15 minutes)
- Send notification
- When result count increases
- Recipients
- Teams, Jira PAY, email ops@acme.example
- Tasks
- Create a task and keep it open while the query returns rows
- Attachment
- CSV (email only)
- 09:000 rowsNo resultsNothing is sent; no task exists.
- 09:1512 rowsSent12 is higher than 0. Teams, Jira (issue PAY-214) and email are notified. Task #57 opens.
- 09:3012 rowsSilencedNot higher, so nobody is notified. The task's executions climb.
- 09:4515 rowsSentHigher again. Jira gets a comment on PAY-214. Ana Horvat presses A and sets the priority to High.
- 10:0018 rowsSentStill growing: three unique counts in four executions.
- 10:150 rowsResolvedThe provider recovered. No results, nothing is sent, and the task resolves itself.
Recipients deliver only where they are allowed to.
A recipient is one destination on one channel. Only an Admin or a SecurityAdmin creates or changes one; everyone else attaches existing recipients without seeing where they deliver. Every destination is checked when it is saved and again when Beacon connects.
| Type | Destination | Result |
|---|---|---|
| Slack | https://hooks.slack.com/services/T…/B…/… | Allowed |
| Teams | https://prod-12.westeurope.logic.azure.com/… | Allowed |
| Teams | https://outlook.office.com/webhook/… | Retired connector |
| Jira | acme;PAY;bot@acme.example;•••• | Allowed |
| Webhook | http://hooks.acme.example/beacon | HTTPS only |
| Webhook | https://bot:pw@hooks.acme.example/ | Credentials in URL |
| Webhook | https://10.20.4.12/alerts | Private network |
Vendor hosts
Slack delivers to hooks.slack.com, Teams to *.webhook.office.com, *.logic.azure.com and *.environment.api.powerplatform.com, Jira to *.atlassian.net and api.atlassian.com. A host can extend each list.
No private networks
Private, loopback and link-local addresses are unreachable unless the host lists them. Beacon connects only to an address it checked itself, and never follows redirects.
Encrypted secrets
Destinations and header values are encrypted when saved and shown masked. Webhook headers are limited to an allow-list such as Authorization and X-Api-Key.
Reviewed changes
When the approval workflow is enabled, a new or changed destination receives nothing until a second person approves exactly where it now delivers. Reviewers compare fingerprints, never credentials.