1 - Introduction
The Action Engine lets you build automations without writing code. You place blocks on a canvas, connect them, and CADLY runs the graph whenever a matching event happens.
Every automation answers three questions: what happened, should we act, and what do we do. Those map to the three kinds of block — events, conditions and flow control, and actions.
The Action Engine used to be part of ER:LC. It is now bot-wide and has its own Action Engine tab in server settings. ER:LC is still the largest source of events, but the engine itself is no longer tied to it.
1.1 - Table of Contents
Section What it covers
How It Works Events, graphs, and execution
Variables Using data from the event that fired
Blocks Every event, action, and flow-control block
Safety Limits Loop protection, block cap, rate limits
Troubleshooting When an automation does not fire
1.2 - Links to Related Documents
2 - How It Works
An event happens. CADLY finds every event block matching it, then walks the connections outward, running each block it reaches.
type: flow
title: Example automation
meta: Action Engine
status: Active
steps:
- Event | A player spawns a restricted vehicle.
- Condition | Their Discord account is missing the required role.
- Action | Send a warning PM in game and post to the staff channel.Blocks run in the order they are connected. Branches run at the same time, so two chains from one block do not wait for each other.
2.1 - Execution History
Every run is recorded. Open Execution History on the Action Engine page to see what fired, what it did, and why anything was skipped.
This is the first place to look when an automation does not behave. A skipped block records its reason rather than failing silently — a cooldown that blocked, a value that was empty, a condition that came out false.
3 - Variables
Variables carry data from the event into your blocks. When a player joins, you have that player. When a log is created, you have the log, who filed it, and who it is about.
3.1 - Using a Variable
Click Insert variable in any text field. The picker is grouped by what the event gave you, and every row shows its current value so you can pick by recognising the value rather than decoding a name.
type: setting
title: Variable picker
meta: On Player Kill
status: Ready
items:
- Killer / Username | Vex_Rally
- Killer / Team | Police
- Victim / Username | brickhaus
- Server / Slot | ARows with an arrow are objects — click to open them. A player, for example, contains a username, a Roblox ID, a team, and their linked Discord account.
3.2 - Whole Variables
Some fields want a whole thing rather than text. Issue Infraction needs a person, not a name. Those fields show a short dropdown of only the compatible options.
On a log event, that dropdown offers the log's creator and the log's target. On a kill event, the killer and the victim. This is why one block works across different events without extra setup.
3.3 - Validation
If a variable is not available on the event that triggers it, the graph will not save and the editor tells you which block is wrong. This is deliberate — an automation that saves but silently produces blank messages is worse than one that refuses to save.
4 - Blocks
4.1 - Events
Events available today. More sources are being added.
Event When it fires
Player Joined A player enters the ER:LC server.
Player Left A player leaves.
Team Changed A player switches team.
Player Kill A kill appears in the log. Gives you both the killer and the victim.
Mod Call A player calls a moderator.
Command Used A command appears in the ER:LC command log.
Entered Zone A player enters a configured play zone.
Left Zone A player leaves a play zone.
Team Over Limit A team exceeds its configured member limit.
Vehicle Violation A player spawns a restricted vehicle without the required roles.
Livery Violation A player uses a restricted livery.
Role Violation A player lacks the roles required for a server or team.
Schedule Fired A configured interval or reminder comes due.
Play zones, vehicle restrictions, livery restrictions, team limits and role restrictions are configured in ER:LC settings, not here. They detect the situation and raise the event; the Action Engine decides what happens next. On their own they take no action.
4.2 - Actions
Action What it does
ER:LC Command Runs an in-game command such as :pm, :kick, or :ban.
Discord Message Posts to a Discord channel.
Add Role / Remove Role Changes a member's Discord roles.
Create Log Creates a real CADLY log entry.
System Notification Writes an internal notification, visible to staff in the panel.
Issue Infraction Issues a warning or strike against a member.
Set Text Builds a value you can reuse later in the graph.
Convert User Resolves a Roblox player to their linked Discord account.
Convert User is a separate block on purpose. Matching a Roblox player to a Discord account is a lookup that can fail, and having it as a visible step means you can see where it happened and branch on whether it worked.
4.3 - Conditions and Flow Control
Block What it does
Condition One or more comparisons, combined with ALL, ANY, or NONE. Has a true and a false output.
Invert Swaps true and false.
Wait for All Continues once every incoming branch has arrived.
Wait for Any Continues as soon as the first branch arrives.
Wait for N Continues once a set number of branches arrive.
Cooldown Blocks repeat runs for a set time.
Wait Pauses before continuing.
Percentage Continues only a set percentage of the time.
Randomize Picks one outgoing path at random.
The comparisons offered depend on what you are comparing. Text offers contains and starts with; numbers offer greater than and less than; lists offer contains and count. You cannot build a comparison that makes no sense for the value.
Wait for Any does not cancel the other branches. They keep running to completion. Only what comes _after_ the block continues early.
4.4 - Cooldown Scope
A cooldown is either global, which limits the whole block, or per value, which limits separately for each thing you choose.
Per value asks you which thing. On a kill event you might cool down per killer, so one player spamming kills does not silence alerts about everyone else. If the value you choose is empty when the automation runs, the cooldown blocks and records why rather than letting the action through.
5 - Safety Limits
5.1 - Loop Protection
Some actions cause the events that trigger them. Create Log causes On Log Created. Issue Infraction causes On Infraction Issued. Point one at the other and you have a loop.
CADLY stops this. An automation that triggers itself is allowed to chain a few levels deep, then stops. When that happens the workspace is disabled and the reason is shown on the page and in Execution History.
If your workspace switches itself off, this is almost always why. Find the block that triggers its own event, break the cycle, and re-enable.
There is also a cap on how many times automations can run per minute. It is high enough that normal use never reaches it, and low enough that a runaway graph cannot flood your server.
5.2 - Block Limit
Plan Blocks
Free 50
Server PRO 150
Counted across your whole canvas. Sticky notes do not count.
If a server's PRO expires while over the limit, existing automations keep running. You can still edit and remove blocks; you just cannot add more until you are back under 50.
5.3 - Command Pacing
In-game commands from automations share the same queue as staff commands and are paced so automation cannot crowd out a moderator trying to act. Automations that fire commands frequently will see them spread out rather than sent all at once.
For anything that punishes, add a cooldown and a Discord Message action so there is a record a human can audit.
6 - Troubleshooting
6.1 - The Automation Did Not Fire
Check Execution History first — it will usually tell you directly.
If there is no entry at all, the event never fired: confirm the event actually matches what you expect, and that the underlying feature is configured (a zone event needs a zone, a vehicle violation needs a restriction).
If there is an entry that stopped early, the reason is recorded on it.
6.2 - The Workspace Disabled Itself
An automation triggered itself in a loop. See Loop Protection.
6.3 - A Message Came Out Blank
A variable resolved to nothing. This is recorded in Execution History rather than failing silently. Common cause: a player with no linked Discord account, where the automation expected one. Add a Condition checking the value was found before using it.
6.4 - The Graph Will Not Save
A block references a variable the triggering event cannot provide. The editor names the block. This most often happens after changing which event feeds a chain.
6.5 - Commands Are Slow
Expected under load. See Command Pacing.
7 - Getting Support and Resources
If you need help, several resources are available:
- CADLY Documentation: Detailed reference for all features.
- CADLY Support Server: Join for fast help from the team.
- CADLY Email Support: Reach out via email for direct support.