Changelog

Every AdOps release, newest first.

The AdOps changelog lists 8 releases, from 7 November 2025 to 12 August 2026, newest first. Each entry names its version and release date, marks whether it is a feature, an improvement, a fix or a security change, and lists what shipped. The same notes are published as an RSS feed.

Versioned, dated, and written the same day the code went out. Linkable per release, so a support thread can point at the exact version.

Follow the RSS feed

The feed carries release notes and blog posts in one stream.

2026

Version 2.0.0 Feature

AI rule builder for plain-language goals

What shipped

  • A free-text goal box returns rule tasks together with a confidence score from 0 to 100
  • The prompt is assembled from the live metric catalogue in the database, so a metric added there is available on the next request
  • Generated tasks land in the same task list a person edits, each carrying an AI Generated badge and its confidence
  • Every generation is written to an audit log with the request, the response, the response time in milliseconds and the confidence score

The AdOps AI rule builder turns a described goal into rule tasks. You type an outcome in plain language, AdOps assembles a prompt from the live metric catalogue held in its database, sends it to its Claude-backed rule service, and returns a set of tasks with a confidence score from 0 to 100.

Where does the output land?

In the ordinary rule editor, not in a separate artefact. Generated tasks are pushed into the same task list a person edits by hand, each rendered with an AI Generated badge and a confidence pill. The modal shows example goals, runs a six-stage progress bar while it waits, and locks itself so the window cannot be closed mid-generation. Nothing reaches a campaign until the rule is saved and set live.

What is recorded?

Each call writes a pending row before dispatch and updates it afterwards with the response body, the response time in milliseconds, the confidence score and a success or error status. Those records are browsable, scoped to the requesting user, and filterable by rule, so a team can review every generation attempt against the rule it was made for. The request times out after 30 seconds.

Two things to know

The Generate with AI button sits behind a feature flag in the rule builder. And AdOps does not validate the model’s output against its metric grammar before showing it, so read every generated task, check its metric, operator and threshold, and edit before setting the rule live.

The AdOps AI Rule Generator modal: a goal field holding a typed objective about scaling campaigns above ROAS 3, four example goals below it, and a Generate Rules button. Sample data
Describe the outcome and let the assistant draft the conditions. A preview — this panel is behind a feature flag in the shipped build. Read the details

Version 1.9.0 Feature

Queue progress and the slow-rule profiler

What shipped

  • Queue Progress lists in-flight batches with start time, rule name, ad account and an executed-of-total progress bar
  • The worker reports progress after every campaign, so the bar advances in whole percent from 0 to 100
  • Slow Rule filters executions by a minimum execution time in seconds over Today, Yesterday, Last 7 days or Last 30 days
  • A slow execution prints its per-step timing breakdown and every condition's value, operator, target and Pass or Fail

The AdOps Benchmark screen answers two operational questions: what is running right now, and what is slow. The Queue Progress tab lists in-flight batches with their start time, the rule, the ad account and an executed-of-total progress bar. The Slow Rule tab filters finished executions by a minimum execution time over a chosen date range.

How does the progress bar know?

The worker recomputes progress after each campaign in a batch finishes and pushes the whole-number percentage back to the queue, so a batch of 400 campaigns moves in visible steps rather than sitting on a spinner. Each row shows its start timestamp with a relative age beside it, links through to the batch and to the rule, and batches that applied to no items at all are filtered out of the list.

What does the slow-rule profiler show?

Set a minimum execution time in seconds and pick Today, Yesterday, Last 7 days or Last 30 days. Each matching execution prints the start date, the total time in seconds highlighted in red above 10 seconds, the rule name with the campaign and its ID, and then the detail: the task number and its action, the initial and new values, the per-step timing breakdown, and every condition’s value, operator, target and Pass or Fail badge.

The benchmark summary behind it covers the last 7 days and excludes runs that applied to nothing, so the list is the work that actually touched campaigns.

The AdOps Performance Dashboard showing a Purchase ROAS card at 2.380x and an Aggregated ROAS card at 2.088x, both badged Profitable, a Monthly Budget card at Rp 155jt, and a Spend Breakdown ranking the top five ad accounts against a budget utilisation bar at 45.5 per cent. Sample data
Two ROAS figures to three decimals, a budget meter, and spend ranked by ad account — over Today, Last 7 days, Last 30 days or This month. Read the details

Version 1.8.0 Improvement

Bulk activate and deactivate ad accounts

What shipped

  • Every ad account discovered from Meta is stored inactive until a person turns it on
  • Selecting rows raises a bulk bar showing the number selected, with Activate and Deactivate buttons
  • Each bulk action is confirmed in a dialog, applied to every selected account, and followed by a reload of the list
  • The active flag is what scopes spend refresh, both ROAS cards, the spend breakdown, the campaign leaderboard and the account comparison

AdOps stores every ad account it discovers from Meta as inactive. Nothing is refreshed, measured or automated on an account until someone switches it on. The Ad Accounts screen raises a bulk bar the moment rows are selected, showing how many are selected next to an Activate button and a Deactivate button.

Why do accounts start switched off?

Because the active flag is the platform’s blast radius. It is the single condition that scopes the month-to-date spend refresh, the Purchase ROAS and Aggregated ROAS cards, the spend breakdown, the campaign leaderboard and the account comparison. An account left inactive is discovered and listed but otherwise untouched, which makes connecting a Meta profile with dozens of accounts a safe first step rather than a commitment.

What does the bulk bar do?

Selecting rows and pressing Activate or Deactivate opens a confirmation dialog. On confirm, AdOps applies the status change to every selected account and reloads the table. Around it sit the controls that make a large portfolio workable: a search over account name and account ID, filter pills for Active, All accounts and Inactive, and a sort menu covering account name, account ID and status.

Syncing from Meta keeps existing choices. Pulling the account list again adds what is new without resetting which accounts you had already activated.

The AdOps integrations page showing Meta Ads, Google Sheets and email notifications connected, and TikTok Ads, Google Ads and Slack marked as coming soon. Sample data
What AdOps is wired into today, and what it is not. Meta Ads and Google Sheets are the two that carry data. Read the details

Version 1.7.0 Feature

Purchase ROAS and Aggregated ROAS dashboard

What shipped

  • Purchase ROAS and Aggregated ROAS cards, each to three decimals with a trend arrow and a Profitable, Moderate or Low badge
  • Both cards prefer Meta's own purchase_roas and website_purchase_roas fields and are requested with the unified attribution setting
  • Four periods: Today, Last 7 days, Last 30 days and This month, opening on the last 7 days
  • Every widget is cached per user and per period for 1 hour, with a Live or Cached indicator and a refresh that forces new numbers

The AdOps dashboard opens on two ROAS cards. Purchase ROAS and Aggregated ROAS are computed across every active ad account for the selected period and shown to three decimals with an x suffix, a trend arrow and a badge reading Profitable at 1.0 and above, Moderate at 0.5 and above, or Low below that.

Where do the ROAS numbers come from?

Both account-level cards prefer Meta’s own attributed fields, purchase_roas and website_purchase_roas, and are requested with the unified attribution setting so the window matches the one configured on the ad set. Only when Meta returns no attributed value does AdOps fall back to summing action values, de-duplicating the umbrella purchase type against its sub-types so a conversion is not counted twice.

What else is on the screen?

A Monthly Budget card with a spend bar, the days left in the month and the count of active accounts. A Spend Breakdown ranking the top 5 ad accounts by spend with each one’s share of the total, and a utilisation bar that turns amber at 80% and red at 100%. A campaign leaderboard split into Top Performing and Underperforming tabs, and an account comparison naming the best performer and the account that needs attention.

How fresh are the figures?

Every widget is cached per user and per period for 1 hour, and the header states whether what you are reading is Live or Cached along with the time it was last updated. Refresh re-requests all five widgets with live numbers.

Version 1.6.0 Feature

Rule log detail with per-condition evidence

What shipped

  • One card per task per campaign, badged Executed, Not Executed or Skipped
  • Condition Evaluations print the actual value against the expected value with a Pass or Fail badge, including nested AND and OR groups
  • A Value Changes block shows the before value and the after value for budget and name actions
  • An action still inside its cooldown is written as a skipped result carrying the reason and the time it becomes eligible again

The AdOps rule log detail view is the evidence for a single run. For every campaign in a batch, AdOps renders one card per task carrying an Executed, Not Executed or Skipped badge, the action’s own parameters, the execution time in seconds and the date of the next scheduled execution.

How does AdOps explain why a campaign was not touched?

The Condition Evaluations panel lists every condition the engine resolved, each with its metric label, its reporting period, a green Pass or red Fail badge, and the sentence Actual value, operator, Expected value. Nested condition groups render their own AND or OR badge above their children, so a group that failed can be opened to see which individual term was true and what number it saw. A task blocked by its action cooldown is not silently dropped: AdOps writes a skipped result carrying the skip reason and the time the action becomes eligible again.

What proves a value actually changed?

Budget and name actions write a Value Changes block on the result: the previous value in red, the new value in green. The Action Details column beside it prints the action’s own inputs, such as the mode, the separator and the text for a naming action, or the increase amount, the maximum budget cap and the value type for a budget action, plus the level, the ad account and the timestamp.

Users with the ADMIN role also get an Execution Steps timeline: the numbered stages of the evaluation, each with its message, its elapsed seconds and the pass or fail of the metric it resolved.

Version 1.5.0 Feature

Live metric tokens inside campaign names

What shipped

  • Six tokens: a date, a time, a metric for a chosen period, a field from the campaign object, and two forms of custom metric
  • Three placement modes, TEXT, APPEND and OVERWRITE, with a separator you supply between parts
  • AdOps re-reads the campaign name from Meta immediately before writing, so a manual rename is not overwritten from a stale copy
  • Every name change records the value before and the value after on the rule result

AdOps can write live figures into a Meta campaign name. The Add to name action takes a multi-line template in which every brace-wrapped line is expanded at execution time: a date, a clock time, a metric over a chosen reporting period, a campaign field, or a custom metric.

Which tokens are available?

Six: {date} for YYYY-MM-DD, {time} for HH:MM:SS, {metric|<metric_key>|<date_preset>} for a live Insights value over that period, {metric|<campaign_field>} for a field straight off the campaign object, and {metric|custom_metric|<id>} or {custom_metric|<id>} for a computed custom metric. The builder inserts them for you: the Insert Shortcode modal drops the token at the cursor position and shows a read-only preview of the result.

How does AdOps avoid clobbering a human-written name?

The action carries a placement mode. TEXT appends the rendered text raw. APPEND writes after a bot separator, keeping the human-written part of the name intact. OVERWRITE replaces everything after the last bot separator, so a name refreshed on a schedule does not grow every run. Two sibling actions handle the rest of the housekeeping: Remove from name strips a substring, and Replace text in name swaps one for another.

Before any of the three writes, AdOps re-reads the campaign name from the Graph API rather than trusting the copy carried in the job, and records the before and after values on the rule result.

An AdOps execution log detail: one campaign, two action panels badged Not Executed, each listing the action parameters and every condition evaluated with its actual value, its expected value and a Pass or Fail badge. Sample data
Why a rule did nothing is recorded as carefully as why it did something — actual against expected, condition by condition. Read the details

2025

Version 1.4.0 Feature

Ten rule templates in the builder

What shipped

  • Ten templates across four categories: budget, status, naming and monitoring
  • Preview shows the template's goal and every task, with its action, cooldown, values and conditions, before anything is imported
  • Pause Unprofitable Campaigns pauses a campaign when spend is at or above 200,000 and Purchase ROAS is under 2
  • Tiered Budget Scaling stacks three tiers at Purchase ROAS above 3, 5 and 8, each on a 2-hour action cooldown

AdOps has ten rule templates behind the Templates button in the rule builder. Each is a named recipe carrying a category, a goal and a complete set of tasks: conditions, actions, action values and cooldowns. Preview shows every task before anything is imported, and imported values are defaults that stay editable inside the rule.

What is in the template library?

The ten are Scale Profitable Campaigns, Pause Unprofitable Campaigns, Tiered Budget Scaling, Night Budget Reset, Tag Campaign Performance, Pause + Tag Failed, Re-enable Paused Winners, Budget Cap Protection, Performance Monitor and Stop & Label Campaign. Every one is defined at campaign level, sorted into budget, status, naming or monitoring, and carries a high, medium or low popularity badge. The modal filters by those four category pills.

What do the shipped thresholds look like?

They are written as concrete numbers, not placeholders. Pause Unprofitable Campaigns fires on spend >= 200,000 AND purchase_roas < 2 and pauses the campaign. Tiered Budget Scaling defines three tiers: purchase_roas > 3 adds 50,000, purchase_roas > 5 adds 100,000, and a third tier sits at purchase_roas > 8, each capped to one action every 2 hours. Between them the ten templates use three metric keys: Purchase ROAS, spend and daily budget.

What happens on import?

Import copies the template’s tasks into the rule you are editing, alongside anything already there. Nothing is locked: every threshold, budget amount, cooldown and condition can be edited, and the rule still has to be saved and set live by hand.

Version 1.3.0 Feature

Custom metrics read from Google Sheets

What shipped

  • A custom metric stores a spreadsheet ID, a sheet name, a lookup column and a value column
  • Rows are fetched from Google's CSV export endpoint with a 30-second timeout, falling back to the Sheets API client and then to the last copy AdOps mirrored
  • A custom metric is selectable as a condition metric, a comparison metric, a budget amount and a campaign-name token
  • Saving a metric reads the sheet first and refuses the save if the lookup column or the value column is missing

AdOps custom metrics let a rule read a number a person maintains in a Google Sheet. Each metric stores a spreadsheet ID, a sheet name, a lookup column and a value column. At evaluation time AdOps matches the first row whose lookup column equals the campaign ID and reads that row’s value column as a number.

Where can a custom metric be used?

Anywhere the rule builder asks for a metric. A custom metric can be the left side of a condition, the metric a condition is compared against, the amount an increase, decrease or set budget action writes, and a token inside a campaign-name template. Saved rules resolve the stored ID back to the metric’s name, so a log reads Blended ROAS > 3 instead of a hex string.

How does AdOps fetch the sheet?

Rows come from Google’s CSV export endpoint first, parsed by a quote-aware reader that keeps commas inside quoted cells, trims header names and drops any row whose column count does not match the header. If that call fails, AdOps retries through the Sheets API client. If Google is unreachable, it serves the rows it last mirrored into its own database. A fetched row set is held in memory and served while it is read at least once every 2 minutes.

What does AdOps check before saving a metric?

Saving reads the sheet and verifies that both the lookup column and the value column exist. When one is missing, the save is refused and AdOps lists the columns it actually found together with a short fix checklist.

Run the version you just read about.

Releases go to every account at once — there is no per-tenant rollout to wait for and no upgrade to schedule. Open the dashboard and the rule builder already has what shipped.

Contact us See pricing

14-day free trial · no card · billed in Rupiah

Inside the product

What the screens actually look like

Nine screens from the working dashboard — the rule builder, the metric picker, the dayparting grid and the log that records what happened. Scroll the strip.

  • The AdOps Performance Dashboard showing a Purchase ROAS card at 2.380x and an Aggregated ROAS card at 2.088x, both badged Profitable, a Monthly Budget card at Rp 155jt, and a Spend Breakdown ranking the top five ad accounts against a budget utilisation bar at 45.5 per cent.
    Performance Dashboard. Two ROAS figures to three decimals, a budget meter, and spend ranked by ad account — over Today, Last 7 days, Last 30 days or This month.
  • The AdOps rule list showing twelve automation rules, each with an on/off toggle, the ad accounts it manages, and when it last triggered — some minutes ago, others on a dated timestamp.
    Rule List. Every rule, what it manages and when it last fired. The toggle is the only thing between draft and live.
  • The AdOps condition builder showing a task with time-of-day conditions across seven day tags, a nested AND group holding a lifetime spend condition under 400,000, and a second task with four stacked metric conditions.
    Conditions. Metric, period, operator, value — joined with AND or OR, and nestable, so a rule can say something a dropdown cannot.
  • The AdOps metric picker open over a condition row: a panel with Meta Ads and Custom metrics tabs, a search box, and a scrolling list of metrics with Spend selected.
    Metric picker. Forty-five Meta metrics and your own sheet columns in the same list, each carrying a reporting period and any of six operators.
  • The AdOps dayparting timetable: a grid of hours against the seven days of the week, with the daytime hours filled navy for every day and the night hours and weekend evenings left empty.
    Dayparting grid. Or draw the hours instead. Anything outside the shape you fill in simply does not run.
  • An AdOps execution log detail: one campaign, two action panels badged Not Executed, each listing the action parameters and every condition evaluated with its actual value, its expected value and a Pass or Fail badge.
    Rule Log detail. Why a rule did nothing is recorded as carefully as why it did something — actual against expected, condition by condition.
  • The AdOps activity log listing budget increases and campaign renames, each row naming the affected campaign by id, the rule that caused it and how long ago it happened.
    Activity Log. One row per change AdOps made in your account, naming the campaign and the rule responsible.
  • The AdOps ad account list: eighteen Meta ad accounts with on/off toggles, account ids, Active or Inactive badges and this month’s spend in rupiah.
    Ad Accounts. Accounts discovered from Meta arrive switched off. Nothing is read, and nothing is changed, until you turn one on.
  • The AdOps custom metric editor mapping a Google Spreadsheet: a spreadsheet id, a sheet name, a column to match campaigns on and a column holding the values.
    Custom metric. Point AdOps at a sheet, name the matching column and the value column, and your own number joins the metric list.

Every figure is rebuilt from the product’s own interface and filled with invented data — no customer name, ad account or spend figure appears anywhere on this site. See how a run works