xuly.io

Automation rules

React to data changes with if-this-then-that rules. Email, Slack, Telegram, webhooks.

Automation rules are declarative: a trigger fires an action. Rules run after every sync completes, so alerts are as fresh as your data.

Triggers

  • KPI drop — a KPI (NGR, FTD, clicks) drops by > X% vs a baseline (last 7d, last 30d, or same-day last week). Supports per-integration or org-wide.
  • Integration health — integration fails N runs in a row, or goes M hours without a successful sync.
  • High-value event — FTD > $X, deposit > $X, new sub-affiliate joined.
  • Goal reached — daily / weekly / monthly revenue hits a threshold.

Actions

Every trigger can fire any combination of:

  • Email — to the rule owner, a specified address, or an SMTP-backed distribution list.
  • Slack — via Incoming Webhook or a bot user; attach a pre-rendered chart.
  • Microsoft Teams — Incoming Webhook connector.
  • Telegram — bot DM or channel.
  • Discord — webhook to any server.
  • Custom webhook — signed JSON POST to any URL.
  • In-app alert — shows up under Alerts and in the topbar bell.

Example: Slack me when Stake NGR drops 30%

{
  "name": "Stake NGR drop alert",
  "trigger": {
    "type": "kpi_drop",
    "integrationKey": "stake-affiliates",
    "metric": "ngr",
    "thresholdPct": -30,
    "baseline": "last_7d_avg"
  },
  "action": {
    "type": "slack",
    "channel": "#affiliate-alerts",
    "attachChart": true
  }
}

Rule evaluation

Rules are evaluated in a dedicated Trigger.dev job after each sync run. Evaluation is cheap (all math happens on already-written rows) so there's no limit on how many rules you can define. Rules that don't apply to the completed sync short-circuit immediately.

Rate limiting

To avoid alert fatigue, each rule tracks a "last fired" timestamp. You can configure a cooldown window (default 1 hour) so the same alert doesn't fire on every sync.

Muting temporarily

Click the toggle next to a rule to disable it without deleting. Disabled rules don't evaluate.