# Actions reference

> All 11 actions a task can execute, the parameters each one takes, and which of them accept an action frequency.

Source: https://adops.id/docs/actions-reference/
Last updated: 2026-08-20
Publisher: AdOps (https://adops.id) — an independent product, not affiliated with Meta Platforms, Inc.

---

## 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_1` holds 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.

```json
{
  "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`:

- `TEXT` appends the text as written.
- `APPEND` appends after the bot separator ` ✚ `.
- `OVERWRITE` replaces 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.
