Overview
Automations Dashboard

Trigger-condition-action rules, run from anywhere in your server

Automations turns server events into reactions: when a member joins from a brand-new account, hand them a probation role; when someone reacts with a verified emoji, post a welcome and grant access. The dashboard is a full builder — pick a trigger, layer conditions, list actions, dry-run, then publish.

Path
DashboardServerAutomations
Module
Automation
Required permission
customcommands.view

Before you build a rule

Automations is more powerful than commands and easier to misuse. Read these prerequisites once and you will skip a class of mistakes.

  • Automation module is enabled in Server Settings (or your guild is on Custom-Host).
  • You have customcommands.view to see the page; rule edits require customcommands.edit.
  • High-risk actions (Kick, Ban, Timeout) require highRiskActionsEnabled in Settings — off by default.
  • HTTP actions are off by default and gated by an explicit allowlist.
  • You know which Trigger you want — there are 19, and choosing wrong is the most common cause of a rule that "does nothing".
Safe Mode is on by default — that is intentional
The first time you publish a rule on a fresh server it runs in safeMode: it logs what it would do but does not perform side-effects. Disable Safe Mode on the Settings tab once you have inspected a few runs and are confident the rule behaves.

The six tabs

Every screen on the page lives behind one of these six tabs. Rules and Templates produce automation logic; Runs is where you watch them happen.

Rules
Templates
Runs
Variables
Audit
Settings
Rules
Browse and build rules. The 6-step builder lives behind a sub-tab here.
Templates
Pre-built rule templates SYNTHET ships, plus your own saved ones.
Runs
Live and historic execution log — every fire of every rule, with outcome.
Variables
Guild- and rule-scoped key/value store you can read and write from rule actions.
Audit
Who created, edited, enabled or deleted which rule.
Settings
Safety switches, rate limits, defaults and retention.

Rules tab — Library and Builder sub-tabs

Rules opens to Library by default — a card grid of every rule on the server. Switching to Builder loads the 6-step wizard.

LibraryBuilder

Library — what each card shows

  • Status chip: ATM_ENABLED (green), ATM_DISABLED (grey), ATM_DRAFT (yellow), ATM_ERROR (red).
  • Trigger summary — a one-line description of what wakes the rule up.
  • Run counts: today / 7 days, plus last outcome (succeeded / failed / dry run).
  • Quick actions: enable/disable toggle, duplicate, delete, open in builder.

Builder — the 6-step wizard

Rules → Builder
  • Step 1 — General: name, description, status (Draft / Enabled).
  • Step 2 — Trigger: pick one of the 19 trigger types and configure its specific options.
  • Step 3 — Conditions: optional gates that filter which events actually fire the rule.
  • Step 4 — Actions: ordered list of what the rule does. Up to maxActionsPerRun.
  • Step 5 — Options: trigger mode, failure policy, cooldowns, dry-run override.
  • Step 6 — Review: diff against the published version, dry-run preview, publish or save as draft.
Save as draft, publish later
Step 6 has two buttons. Save Draft persists the rule with status ATM_DRAFT and never fires it. Publish flips it to ATM_ENABLED. You can flip back from the Library card at any time.

Step 2 — Triggers, the 19 ways a rule wakes up

The trigger is the most important choice you will make. Pick the wrong one and your rule silently never fires. Below they are grouped by source.

Message triggers

  • MESSAGE_CREATED — fires on every new message. Filter aggressively with conditions.
  • MESSAGE_EDITED — fires when a message is edited.
  • MESSAGE_DELETED — fires when a message is deleted (most actions cannot reference the deleted content).
  • REACTION_ADDED — fires when any reaction is added; condition emoji is narrows it.

Member triggers

  • MEMBER_JOINED — new member arrives. Most-used trigger for verification flows.
  • MEMBER_LEFT — member leaves or is kicked.
  • ROLE_ADDED — a role is added to a member. Useful for promotion announcements.
  • ROLE_REMOVED — a role is removed.
  • VOICE_JOINED / VOICE_LEFT — voice channel transitions.

Server triggers

  • CHANNEL_CREATED / CHANNEL_DELETED — admin lifecycle events.
  • TICKET_CREATED / TICKET_CLOSED — only fire if Tickets module is enabled.
  • EVENT_RSVP — fires when a member RSVPs to an Events module event.

Scheduled and manual triggers

  • SCHEDULED_CRON — runs on a cron expression in your guild timezone.
  • SCHEDULED_INTERVAL — runs every N minutes.
  • SCHEDULED_ONCE — runs once at a specific date and time, then disables itself.
  • MANUAL_RUN — only fires when you click Run Now from the Library card. Great for testing.

Step 3 — Conditions, the gate that decides if a trigger fires

A trigger fires often; conditions decide whether the rule should react. They are evaluated in order; if any condition fails the run is recorded as ATM_SKIPPED.

Condition types you can stack

  • contentMatches — substring or regex match against the message.
  • messageCountInWindow — author has posted N messages in the last X minutes (rate-limit guards).
  • accountAgeMs — Discord account is younger / older than threshold (anti-raid).
  • joinRatePerMinute — server-wide join rate exceeds N (anti-raid).
  • hasRole — author has (or does not have) a role.
  • channelIs — event happened in (or not in) a specific channel or category.
triggerMode: FIRST_MATCH_WINS vs ALL_MATCH_RUN
Set on Step 5. FIRST_MATCH_WINS stops at the first matching rule per event — clean for moderation. ALL_MATCH_RUN fires every matching rule — useful when you have logging rules layered on top of action rules. Default is FIRST_MATCH_WINS.

Step 4 — Actions, the things the rule actually does

Up to maxActionsPerRun (default 10) actions execute in order. Failures are governed by the failure policy on Step 5.

Available action types

  • SEND_MESSAGE — post in a channel. Supports template variables.
  • SEND_DM — DM the triggering user. Falls back to a public ping if DMs are closed.
  • ADD_REACTION — add an emoji to the source message.
  • DELETE_MESSAGE — delete the source message.
  • ADD_ROLE / REMOVE_ROLE — modify the triggering user's roles.
  • High-risk (off by default): TIMEOUT_USER, KICK_USER, BAN_USER.
High-risk actions need to be unlocked twice
On Settings tab toggle highRiskActionsEnabled. The builder will then accept Kick/Ban/Timeout. If you forget the toggle the action picker greys those options out — that is the guardrail.

Step 5 — Options, controlling how the rule behaves

triggerModeDropdown

FIRST_MATCH_WINS stops the engine at the first matching rule; ALL_MATCH_RUN runs every match.

Example: FIRST_MATCH_WINS

failurePolicyDropdown

BEST_EFFORT continues to the next action when one fails; FAIL_FAST aborts the run on first failure.

Example: BEST_EFFORT

dryRunToggle

Force this rule to dry-run regardless of guild Safe Mode. Outcomes show as ATM_DRY_RUN_OK in Runs.

Example: Off

cooldownDuration

Per-user cooldown — same member cannot fire the rule again until the window expires.

Example: 60 seconds

Step 6 — Review and publish

What the review screen shows

  • Diff vs. the currently published version (if any) — added/removed steps shown side by side.
  • A dry-run preview against synthetic events you can edit in-place.
  • Validation errors — missing required fields are blockers; warnings (e.g., no conditions on MESSAGE_CREATED) are non-blocking.
  • Two buttons: Save Draft (green when valid) and Publish (only enabled when zero blockers).

Templates tab

A grid of pre-built rules SYNTHET ships, plus any rule you save with Save as Template. Click any card to scaffold a new rule with the template values pre-filled.

Useful templates to start from

  • Anti-raid: new account quarantine — MEMBER_JOINED + accountAgeMs < 7 days → ADD_ROLE (Probation).
  • Reaction-role gate — REACTION_ADDED on a specific message → ADD_ROLE.
  • Daily standup — SCHEDULED_CRON 09:00 weekdays → SEND_MESSAGE in #standup.
  • Goodbye logger — MEMBER_LEFT → SEND_MESSAGE in #server-log.

Runs tab — every execution, every outcome

Runs is the single most useful tab when something is wrong. Every fire of every rule lands here, even dry runs and skipped ones.

Outcome chips

ATM_SUCCEEDED
All actions ran cleanly. The intended side-effects happened.
ATM_FAILED
At least one action errored under FAIL_FAST, or the rule itself raised. Click to see the stack.
ATM_DRY_RUN_OK
Rule matched and would have run — Safe Mode or rule-level dryRun was on, so nothing happened.
ATM_BUDGET_EXCEEDED
The rule was rate-limited by maxRunsPerMinute or maxActionsPerRun.
ATM_SKIPPED
Trigger fired but a condition rejected the event. Expected most of the time.
Runs is also the debugger
Click any row to expand the per-step trace: which condition rejected, which action ran, what payload Discord saw. This is where you find out why your rule "isn't working" — usually it's an over-strict condition.

Variables tab — the rule key/value store

Variables let rules share state. Counters, last-seen timestamps, opt-in flags. Two scopes, four types.

Scope ATM_GUILD
Available to every rule in the server. Use for shared counters or feature flags.
Scope ATM_RULE
Tied to one rule. Use for per-rule counters that should not leak.

Supported types

Use the right type — strings sort lexicographically
  • string — names, IDs, channel names.
  • number — counters and thresholds.
  • boolean — feature flags.
  • duration_ms — for cooldowns and time windows.

Audit tab

Paginated list of every rule lifecycle event. Same column layout as the Audit tab elsewhere on the dashboard: timestamp, actor, action, before/after diff, source.

  • rule_created, rule_updated, rule_published, rule_disabled, rule_deleted
  • template_saved, template_deleted
  • variable_set, variable_deleted
  • settings_updated — every change to the Settings tab is recorded here

Settings tab — four groups of knobs

Defaults for new rules, server-wide safety, rate limits and retention. Changes save instantly.

Safety

SettingTypeDefaultDescription
killSwitchtoggleOffMaster off-switch. Disables every rule on the server, including those marked enabled.
safeModetoggleOn (new servers)All actions become dry-run regardless of rule config. Recommended on for the first day or two.
highRiskActionsEnabledtoggleOffUnlocks KICK_USER, BAN_USER, TIMEOUT_USER in the action picker.
httpActionsEnabledtoggleOffUnlocks the HTTP action type. Requires httpDomainAllowlist to be non-empty.
httpDomainAllowlisttags[]Hostnames the HTTP action can post to. Wildcards not supported.

Rate limits

SettingTypeDefaultDescription
maxRulesPerGuildnumber50Hard cap on total rules.
maxEnabledRulesnumber25How many rules can be in ATM_ENABLED at once.
maxRunsPerMinutenumber120Server-wide rule executions per minute. Excess events queue up to a small buffer then drop with ATM_BUDGET_EXCEEDED.
maxActionsPerRunnumber10Cap on Step 4 list length.
maxHttpActionsPerDaynumber500Daily budget for outbound HTTP actions.

General defaults

triggerModeDefaultDropdown

Default for Step 5 on new rules.

Example: FIRST_MATCH_WINS

failurePolicyDefaultDropdown

Default failure policy on new rules.

Example: BEST_EFFORT

guildTimezoneDropdown

Used by SCHEDULED_CRON triggers and Audit timestamps.

Example: Europe/London

botEventSuppressionToggle

If on, MESSAGE_CREATED triggers ignore bot authors. Recommended on.

Example: On

Data retention

SettingTypeDefaultDescription
runRetentionDaysnumber14How long Runs rows live before they are pruned.
stepRetentionDaysnumber7How long the per-step trace inside a run is kept. Older runs lose their trace but the outcome stays.
auditRetentionDaysnumber90How long Audit rows live.

Common tasks

1

Build your first rule from scratch

A welcome DM on join — the simplest sensible rule.

Start at AutomationsRulesBuilder.

  • Step 1 — name the rule "Welcome DM", leave status as Draft.
  • Step 2 — pick MEMBER_JOINED.
  • Step 3 — leave conditions empty (we want every join).
  • Step 4 — add SEND_DM action with a friendly message and the {{user.mention}} placeholder.
  • Step 5 — defaults are fine.
  • Step 6 — Save Draft, then Run Now from the Library to test on yourself, then Publish when happy.
2

Quarantine new accounts under 7 days old

Anti-raid pattern.

  • Builder Step 2: MEMBER_JOINED.
  • Step 3: add condition accountAgeMs with operator < and value 7 days.
  • Step 4: ADD_ROLE → Probation (you create this role first; deny it from chat channels).
  • Step 4 (second action): SEND_DM explaining the verification process.
  • Step 6: Publish. Verify by checking Runs after a real join.
3

Diagnose a rule that does nothing

The Runs tab is the answer 90% of the time.

  • Open Runs and filter by your rule name.
  • If you see ATM_SKIPPED rows — your conditions are too tight. Open the row to see which condition rejected.
  • If you see ATM_DRY_RUN_OK — Safe Mode is on or rule dryRun is on.
  • If you see ATM_BUDGET_EXCEEDED — bump maxRunsPerMinute or add a per-user cooldown.
  • If you see no rows at all — your trigger is wrong. Confirm by manually firing MANUAL_RUN.

Troubleshooting

Rule is enabled but no Runs rows ever appear
The trigger does not fire for the events you think it does. The most common cause is choosing MESSAGE_CREATED when you meant REACTION_ADDED, or expecting MEMBER_JOINED to fire on rejoin when Discord already considered the user present. Try MANUAL_RUN to confirm the action chain works.
Action picker greys out Kick/Ban/Timeout
highRiskActionsEnabled is off in Settings. Toggle it on, save, refresh the builder.
Rule keeps running on bot messages and spamming
botEventSuppression is off. Turn it on in Settings → General. As a belt-and-braces, add a condition hasRole excluding your bot role.
Cron rule fires at the wrong time
guildTimezone is wrong. Cron expressions are evaluated in that zone, not UTC. Fix it in Settings → General; the next tick will be on the right schedule.