Rules
Actions reference
All 11 actions a task can execute, the parameters each one takes, and which of them accept an action frequency. This page of the AdOps documentation sits in the Rules section, last updated 20 August 2026. AdOps runs rules — conditions plus actions — against your Meta Ads campaigns on the schedule you set.
Key facts
- Executable actions
- 11 5 General, 3 Budget, 3 Name/Text
- Actions that accept an action frequency
- 5 Notify, Duplicate, Increase budget, Decrease budget, Set budget
- Action frequency options
- 11 15 minutes through Once in a lifetime
- Budget value types
- 3 fixed amount, percentage, or a custom metric
- Name write modes
- 3 TEXT, APPEND, OVERWRITE
A task executes exactly one action. AdOps ships 11 of them, presented in the action picker under three headings — General, Budget and Name/Text. Each action stores its parameters in an action_value object with numbered slots, and five of the eleven also accept an action frequency that limits how often that task may fire on the same campaign.
The full reference
| Action key | Picker label | Group | Parameters | Frequency |
|---|---|---|---|---|
notify | Notify | General | none | yes |
start_campaign | Start | General | none | no |
pause_campaign | Pause | General | none | no |
delete_campaign | Delete | General | none | no |
duplicate_campaign | Duplicate | General | none | yes |
increase_budget_campaign | Increase budget | Budget | value_1 amount or custom-metric id · value_2 Maximum budget cap · value_3 value / percent / custom_metric | yes |
decrease_budget_campaign | Decrease budget | Budget | value_1 amount or custom-metric id · value_2 Minimum budget cap · value_3 value / percent / custom_metric | yes |
set_budget_campaign | Set budget | Budget | value_1 amount or custom-metric id · value_3 custom_metric, otherwise the literal in value_1 | yes |
add_name_campaign | Add to name | Name/Text | value_1 mode TEXT / APPEND / OVERWRITE · value_2 separator · value_3 text template, one token per line | no |
remove_name_campaign | Remove from name | Name/Text | value_1 text to remove | no |
replace_name_campaign | Replace text in name | Name/Text | value_1 find text · value_2 replace with | no |
General actions
Start, Pause and Delete each write a status to the campaign object — ACTIVE, PAUSED and DELETED respectively. They take no parameters. They also do not write a Before → After block on the rule result, so their evidence in the log is the Executed badge and the recorded action, not a value change.
Duplicate submits an async batch request to Meta’s /{campaign_id}/copies edge with deep_copy=true, so Meta clones the whole campaign structure in the background. AdOps does not capture the new campaign’s id.
Notify is recorded on the rule result and shows up as a task in Rule Logs and the Activity Log. Message delivery is not wired up in the current engine release, so do not rely on it as an alerting channel.
Budget actions
All three re-read the campaign’s live daily_budget from Meta immediately before writing, rather than trusting the figure carried in the job.
value_3 picks how value_1 is interpreted:
value— a fixed amount.percent— a percentage of the current daily budget, on Increase and Decrease only. Set budget has no percentage path.custom_metric—value_1holds a custom-metric id and the engine resolves it against your Google Sheet at execution time.
The projected budget is floored to a whole number, then clamped. If Increase budget would cross the Maximum budget cap in value_2, the engine writes exactly the cap. If Decrease budget would fall under the Minimum budget cap, it writes exactly the minimum.
{
"action": "increase_budget_campaign",
"action_frequency": "2_hours",
"action_value": { "value_1": 20, "value_2": 1000000, "value_3": "percent" }
}
That task raises the daily budget by 20%, at most once every 2 hours per campaign, and never past Rp 1,000,000.
Name and text actions
Add to name builds a string from the multi-line template in value_3, joins the parts with the separator in value_2, and places the result according to the mode in value_1:
TEXTappends the text as written.APPENDappends after the bot separator✚.OVERWRITEreplaces everything after the last bot separator.
Lines wrapped in braces are expanded before writing:
| Token | Resolves to |
|---|---|
{date} | the date as YYYY-MM-DD |
{time} | the time as HH:MM:SS |
{metric|<field>|<period>} | a live Insights value for that period |
{metric|<field>} | a field read straight off the campaign object |
{metric|custom_metric|<id>} | a computed custom metric |
{custom_metric|<id>} | the same, in short form |
The Insert Shortcode modal builds these for you: pick a type (Facebook Metric, Custom Metric, Date or Time), a metric and a period, check the preview, then press Insert Shortcode.
Remove from name deletes the substring in value_1. Replace text in name swaps the substring in value_1 for the text in value_2. Both re-read the live campaign name first, write the new name back, and record a Before → After pair on the rule result.
Action frequency
Notify, Duplicate and the three budget actions accept a per-task cooldown, independent of how often the rule itself is evaluated: 15 minutes, 30 minutes, 1 hour, 2 hours, 3 hours, 6 hours, 12 hours, Once a day, Once in 2 days, Once in 3 days, Once in a lifetime.
A rule can therefore check every 15 minutes while a given campaign is scaled at most once every 2 hours. Once in a lifetime sets the next permitted execution to the year 2100, which is how a template tags a campaign exactly once and never again.
When a cooldown blocks a task, AdOps does not fail silently: it writes a Skipped result with the reason next_execute_not_reached and the time the task becomes eligible again.
Level and write scope
Actions are executed against campaigns. Setting a rule’s level to Ad sets changes the level of the Insights read and is recorded on the result; it does not give you ad-level writes.
Sample data Questions about this page
Which actions can change my spend?
Increase budget, Decrease budget and Set budget write a new daily budget to the campaign. Pause and Delete stop delivery. Start resumes it. The remaining five actions only rename a campaign, duplicate it, or record a notification.
What stops a budget increase from running away?
Increase budget takes a Maximum budget cap in value_2 and Decrease budget takes a Minimum budget cap. When the projected budget would cross the cap, the engine writes exactly the cap instead. The cap is a field you fill in, not a default — leave it empty and no ceiling is applied.
Does the engine trust the budget it read at the start of the run?
No. Before a budget action runs, AdOps re-reads daily_budget from the Meta Graph API, and before a name action it re-reads the campaign name, so a concurrent edit in Ads Manager is not overwritten from a stale figure.
Does the Notify action send an email?
The current engine records the Notify task on the rule result but does not deliver a message. Treat Notify as a marker you read in Rule Logs and the Activity Log, not as an alerting channel.