Alerts & Thresholds
In addition to scheduled reports, DURUM.ai warns you on Slack when an indicator leaves the normal range, when the engine acts on your ads, or when a condition you defined yourself is met.
Everything is set in the Notifications page (/notifications): every category has its switch and its Slack channel, per account. Messages go out in the account's language and currency.
Performance alerts
Internal code: perf_alerts
Checked once a day (15:00 UTC), over the account's last 7 days. Each alert type is sent at most once a day per account. An account with no spend, no sale and no booking over the period is not evaluated.
| Alert | Condition (last 7 days) | Level |
|---|---|---|
| CPA too high | CPA above 200, with at least one sale | Critical |
| Spend without sale | More than 500 spent and 0 sale | Critical |
| High no-show rate | More than 30% no-shows, with at least 3 bookings | Warning |
| Negative ROAS | ROAS below 1, with more than 200 spent and some revenue | Critical |
| Missing spend | No spend synced for one of the last 3 days, on an account with spend history | Critical for yesterday, Warning for earlier days |
| Abnormal event volume | The last 7 days count less than 30% of the weekly average of the previous 30 days (baseline of at least 5 per week) | Warning |
Amounts are read in the account currency. These thresholds are fixed; they are not set per account. For an alert at your own thresholds, use a trigger.
System alerts
Internal code: webhook_alerts
The category exists in the Notifications page, but system alerts (a webhook's error rate above 10% over 24 h, quarantine above 50%, no webhook received in 24 h) are computed for the whole platform and go to the DURUM team. They do not reach your channel. An incident that concerns you is reported by your account manager.
Engine actions
Internal code: moteur
Every ad cut and every budget moved by the Engine, with the numbers behind it. Two conditions: the category is enabled with a channel, and the rule has Notify on Slack on. Without an "Engine actions" channel, the message goes to the performance alerts channel.
Sent after every hourly run, for applied runs only (never simulations, never a run already notified). One line per decision:
Engine · My rule
• Cut: Retirement T2-I3 ($180 spent, 2 leads, CPL $90)
• Budget Retirement Quebec: $120 → $150 per day
• Ad set paused: Retirement Ontario
Undo in the app: Ads → Engine → Latest actions.For arbitration rules, every line carries the network, the level (network, campaign, ad set, ad), the node, the change and the reason; a decision refused by the network is reported with its message.
Scheduled messages and triggers
In the Notifications page, custom messages section, you compose your own Slack messages: a name, a channel, a text with variables (spend, leads, CPL, CPA, ROI, revenue, and their deltas, over a period of your choice) and mentions.
Two delivery modes:
- Scheduled: days of the week and a time (Eastern time, in 30-minute steps). Checked every 15 minutes.
- Trigger: a condition evaluated every hour (event triggers fire at the time of the event), with a cooldown (none, 5, 15 or 30 minutes, 1 h, 4 h, 24 h).
The triggers
| Category | Triggers and settings |
|---|---|
| Events | New lead, new application, new booking, no-show, sale closed, payment received, refund |
| Thresholds | CPA exceeds (amount, period), daily spend exceeds (amount), ROI below (ratio, period), no-show rate exceeds (%, on at least 3 bookings), no leads since (hours), CTR below (%, on more than 100 impressions) |
| Milestones | Monthly leads goal, sales goal, revenue goal; budget consumed (% of a budget) |
| Trends | CPA rising N days in a row, leads declining vs last week (%), best day of the month |
| Ads and engine | An ad cut by the engine; cost per lead moving over a window (see below) |
| Team | A rep's sales goal, a rep's closing below (%), a rep with no sale since (days), a rep's sales record |
An ad cut by the engine
Internal code: engine_ad_cut
Says which ad was cut, why, with its numbers and a link to view it (never an image). One message per cut ad, never the same one twice. Cuts come from both engines (Engine and legacy engine), applied runs only.
| Setting | Default |
|---|---|
| Send from (hour) / Stop sending after (hour) | 10 am to 1 pm, account time |
| Cuts from the last (hours) | 24 |
| Maximum messages per run | 5 |
Content: the ad (Meta preview link when available), the campaign, the ad set, the ad's spend, leads and CPL, the ad set reference (the ad set's cost per lead over 7 days) and the reason as the engine wrote it. The message checks that yesterday's synced spend covers at least 98% of what Meta reports; otherwise it says so ("Numbers underestimated…").
Cost per lead moving over a window
Internal code: cpl_delta_24h
Compares the last few days with the preceding baseline, per ad set (or per campaign, on request to your account manager), and names the ads that moved the cost. Numbers are read directly from Meta (spend and Lead conversions, same attribution windows as the Ads Manager screen), not from the DURUM.ai database.
| Setting | Proposed on creation | Engine value when empty |
|---|---|---|
| Minimum change (%) | 15 | 35 |
| Minimum spend per day | 100 | 0 |
| Minimum leads per day | 5 | 40 (conversions over the window) |
| Send from / Stop sending after | 10 am to 1 pm | no window |
| Maximum messages per run | 3 | 3 |
| Recent window / comparison baseline | none | 3 days against the previous 14 days |
| Minimum money at stake | none | 500 (account currency) |
| Level (ad set or campaign) and scope (campaigns or ad sets followed) | none | set with your account manager; without a scope, nothing is sent |
One message per ad set that moved, up or down, ranked by money at stake (what the window cost more or less than if the reference cost per lead had held): cost per lead before and after, change, spend and conversions per day, the whole followed scope, the other ad sets, and what moves the cost (the ad set's ads, with their link).
Why 3 days against 14
Over 24 h, at 35 conversions a day, chance alone moves the cost per lead by plus or minus 17%; a one-day alert held over the next three days only half the time. Over 3 days against 14, noise drops to plus or minus 10% and the gap holds 86% of the time. A campaign average, for its part, stays blind to an ad set that burns: that is why the ad set level is the default.
Threshold configuration
- Performance alerts have fixed thresholds (table above).
- Triggers are set by you, in the Notifications page, message by message. The level and scope of the cost per lead trigger are set with your account manager.
- Engine actions follow the Engine rules: the thresholds are those of each rule.
The internal alerts admin screen (/admin/notifications-slack) is reserved for the DURUM team: it manages platform monitoring, not your alerts.
Severity levels
| Color | Level | Meaning |
|---|---|---|
| Red | CRITICAL | A significant problem affects your results, action required |
| Orange | WARNING | Monitor, a metric is deteriorating |
Every performance alert carries a "View dashboard" link.
Alerts in the dashboard
The dashboard also shows, without Slack, the Bottlenecks (every funnel stage analyzed against its target) and the Detected anomalies (deviations from usual trends).
Advice
Check the dashboard every morning for the situation snapshot. Slack alerts are there to warn you between visits.