# Anatomy of a rule

> The four cards of the rule builder and the fields each one writes — name, accounts, filters, tasks and schedule.

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

---

## Key facts

- **Cards in the rule builder:** 4 (Basic Information, Filter Configuration, Tasks & Conditions, Schedule Configuration)
- **Actions per task:** exactly 1 (a rule holds as many tasks as you need, each with its own conditions)
- **Rule levels:** Campaigns or Ad sets (the level sets the Insights read level; actions are executed against campaigns)
- **Pre-filter fields:** 3 (Campaign ID, Campaign Name and Campaign Status)
- **Rule statuses:** DRAFT and ACTIVE (only ACTIVE rules are picked up by the execution engine)

An AdOps rule is one document with five moving parts: a name and the ad accounts it covers, pre-filters that narrow which campaigns are in scope, a level, a list of tasks that each pair a condition set with one action, and a schedule. The builder writes all five from a single page under the header **Create Rule**.

## Card 1 — Basic Information

Three fields.

**Rule Name** carries the hint "Choose a descriptive name for your automation rule" and the placeholder "e.g., Pause underperforming campaigns". Name rules after what they do; the name is what the Rule Logs sidebar, the Activity Log and the bulk bar all show you.

**Ad Accounts** is a set of removable chips plus a **+** button, hinted "Select up to 5 ad accounts you want to manage".

**Notifications** carries the hint "Get alerts about triggered actions via email" and holds an Email Address, a Recipient Name (placeholder "e.g., Marketing Team") and a Channel Type of Email.

## Card 2 — Filter Configuration

This card decides which campaigns the rule even looks at, before any metric is read.

A level button toggles between **Campaigns** and **Ad sets**. Beside it, a **+** button adds a filter chip on one of three fields:

| Field | Operators | Values |
| --- | --- | --- |
| Campaign ID | equal, not equal | a campaign id |
| Campaign Name | contains, does not contain | free text |
| Campaign Status | is, is not | ACTIVE or PAUSED |

Each chip renders as `<Field> <operator> <value>` and opens an inline editor when clicked. Underneath, a live readout shows **Estimated match: N Campaigns**, recalculated 500 milliseconds after any change, with a per-ad-account breakdown in its tooltip. Before you attach accounts it reads "Select ad accounts to see affected items".

Use it. It is the only place in the product that tells you the blast radius before you save.

## Card 3 — Tasks & Conditions

The toolbar holds **Templates**, **Add Task** and **Generate with AI**.

Each task card shows the action icon, the action name with the word "campaign" swapped for your chosen level, a one-line summary such as "Increase budget for all campaigns", copy and trash buttons, an **AND/OR** pill, and a table of conditions. Every condition row is four pickers and an input: metric, period, operator, value — plus a **Compare With** cog and a remove button.

The stored shape is plain JSON:

```json
{
  "level": "campaign",
  "status": "ACTIVE",
  "tasks": [
    {
      "action": "increase_budget_campaign",
      "action_frequency": "2_hours",
      "action_value": { "value_1": 100000, "value_2": 1000000, "value_3": "value" },
      "condition": {
        "operator": "AND",
        "conditions": [
          { "metric_key": "purchase_roas.omni_purchase", "period": "today", "operator": "GREATER_THAN", "value": "3", "compare": "value" },
          { "metric_key": "spend", "period": "today", "operator": "GREATER_THAN", "value": "0", "compare": "value" }
        ]
      }
    }
  ]
}
```

For every campaign in scope, the engine walks the tasks in order and evaluates each task's own conditions before running that task's own action. One rule can therefore encode a whole playbook — scale on good ROAS, pause on bad ROAS, tag either way — and each task is logged separately with its own `task_id`.

## Card 4 — Schedule Configuration

Either **Run every `<interval>`** or **Run on spesific days and time**, optionally bounded by **Run within a date range**. On a saved rule an info alert reports the **Next Scheduled Execution**. See [Scheduling a rule](/docs/scheduling-a-rule/) for the full detail.

## Draft or live

The header has two buttons: **Save as Draft** stores the rule with status `DRAFT`, and **Set Live** stores it as `ACTIVE`. Only ACTIVE rules are selected by the execution engine, so a draft is a safe place to leave work in progress. Editing an existing live rule turns the primary button into **Update Rule**.
