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.
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".
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 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.
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
- 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.
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.
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.
Step 5 — Options, controlling how the rule behaves
FIRST_MATCH_WINS stops the engine at the first matching rule; ALL_MATCH_RUN runs every match.
Example: FIRST_MATCH_WINS
BEST_EFFORT continues to the next action when one fails; FAIL_FAST aborts the run on first failure.
Example: BEST_EFFORT
Force this rule to dry-run regardless of guild Safe Mode. Outcomes show as ATM_DRY_RUN_OK in Runs.
Example: Off
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.
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
- 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
| Setting | Type | Default | Description |
|---|---|---|---|
| killSwitch | toggle | Off | Master off-switch. Disables every rule on the server, including those marked enabled. |
| safeMode | toggle | On (new servers) | All actions become dry-run regardless of rule config. Recommended on for the first day or two. |
| highRiskActionsEnabled | toggle | Off | Unlocks KICK_USER, BAN_USER, TIMEOUT_USER in the action picker. |
| httpActionsEnabled | toggle | Off | Unlocks the HTTP action type. Requires httpDomainAllowlist to be non-empty. |
| httpDomainAllowlist | tags | [] | Hostnames the HTTP action can post to. Wildcards not supported. |
Rate limits
| Setting | Type | Default | Description |
|---|---|---|---|
| maxRulesPerGuild | number | 50 | Hard cap on total rules. |
| maxEnabledRules | number | 25 | How many rules can be in ATM_ENABLED at once. |
| maxRunsPerMinute | number | 120 | Server-wide rule executions per minute. Excess events queue up to a small buffer then drop with ATM_BUDGET_EXCEEDED. |
| maxActionsPerRun | number | 10 | Cap on Step 4 list length. |
| maxHttpActionsPerDay | number | 500 | Daily budget for outbound HTTP actions. |
General defaults
Default for Step 5 on new rules.
Example: FIRST_MATCH_WINS
Default failure policy on new rules.
Example: BEST_EFFORT
Used by SCHEDULED_CRON triggers and Audit timestamps.
Example: Europe/London
If on, MESSAGE_CREATED triggers ignore bot authors. Recommended on.
Example: On
Data retention
| Setting | Type | Default | Description |
|---|---|---|---|
| runRetentionDays | number | 14 | How long Runs rows live before they are pruned. |
| stepRetentionDays | number | 7 | How long the per-step trace inside a run is kept. Older runs lose their trace but the outcome stays. |
| auditRetentionDays | number | 90 | How long Audit rows live. |
Common tasks
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.
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.
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.