# Safety model

> The rules that keep your AI assistant inside your limits on real ad accounts.

Roasby lets AI assistants act on real ad accounts, so it is designed around one idea: **your AI can analyse freely, but it changes things only through previews and guardrails, and it is built to ask for your approval.** These rules apply in every workspace.

## Everything new starts paused

Nothing Roasby creates runs or spends until you enable it, or your assistant does with your explicit confirmation.

### New campaigns

- A campaign your AI assistant creates through Roasby is always created **paused**. Its ad groups, keywords and ads are created ready under it.
- The whole campaign is one change with one confirmation, created all at once or not at all.
- If an ad platform makes only part of it, it stays paused, and Roasby doesn't enable it until its next sync shows every part of it.

### New keywords, ad groups and ads

- **Keywords** your assistant adds to an ad group you already have are created **paused** too, even when the ad group is running. Your assistant offers to enable exactly those keywords with one more confirmation.
- A new keyword's own bid must be within the ad account's max bid when it has one. A keyword whose bid is above the max bid (for example after you lowered it) is not enabled until its bid is within it.
- **Ad groups** your assistant adds to a campaign you already have are created **paused** as well, with their keywords and ads ready under them. An ad group the ad platform made only partly is not enabled by Roasby until its next sync shows an ad in it.
- Any ad group (new or not) whose default bid, or the own bid of an enabled keyword in it, is above the max bid is not enabled until the bids are within it.
- When you change a keyword's text (or its match type on Google Ads, which can't change it in place), the new keyword is added **paused** and the old one paused, so neither runs until you enable the new one.
- **Responsive search ads** your assistant adds to an ad group you already have are created **paused** too. Roasby doesn't enable a responsive search ad in an ad group that already runs the 3 the ad platforms allow.
- Roasby never sends an ad twice: if the ad platform doesn't answer, Roasby doesn't try again, and its next sync shows whether the ad was made (paused).

### Assets

Sitelinks, callouts and other assets are linked **paused** on Google Ads. Microsoft Ads can't pause an asset link, so there Roasby links new assets only to a paused campaign or ad group, where they show nothing until you enable it, and never to a whole account.

### Reverts

When you revert a change yourself, these checks don't hold you back: a revert puts back what you had. Your AI assistant's reverts get no such exemption.

## Nothing is ever deleted

Roasby never deletes or archives (removes) anything, because a removed item cannot come back on most ad platforms. Items that are already archived are read-only.

Through Roasby you can pause, enable, change budgets and bids, edit ad text in place, create (paused) and add negative keywords, and most of those changes can be reverted. A few things are taken away, and only in ways you can undo:

- Reverting added negative keywords removes exactly the ones that change added, never ones that were there before.
- Editing a search campaign's countries or ad schedule replaces those targets: the ones no longer wanted are taken away and new ones added. The change log keeps the old ones, so reverting the change puts them back.
- Assets are never removed. On Microsoft Ads, which can't pause an asset link, pausing a link takes the link away (never the asset), and enabling it or reverting the pause links it again.

## Budget and bid guardrails

Each ad account has these guardrails, set by workspace owners and admins under **Ad accounts → Guardrails**:

- **Max daily budget per campaign**, in the account's currency. Empty means no cap.
- **Max budget change per step**, in percent of the current budget. New accounts start at your workspace's default (50% unless you changed it): at 50%, a $20 budget can rise to $30 in one change. A cut is never held to it: lowering spend takes one change.
- **Max bid**, in the account's currency, for any ad group or keyword. Empty means no cap.
- **Max bid change per step**, in percent of the current bid. New accounts start at your workspace's default (50% unless you changed it): at 50%, a $2.00 bid can rise to $3.00 in one change, and a cut takes one change. A keyword without its own bid is measured against its ad group's bid.
- **Max target CPA** (optional), in the account's currency, for a campaign's or ad group's target CPA. Empty means no cap.
- **Min target ROAS** (optional), in percent, for a campaign's target ROAS. Empty means no floor.

A new campaign needs a max daily budget on its ad account, and its budget must stay within it.

- Any new budget outside the guardrails is refused with a clear reason, whoever sets it (a person's revert skips only the max change per step).
- Enabling is checked too: a campaign whose daily budget is above the max daily budget stays off until you lower the budget or raise the cap. A campaign that was only partly created stays off until a sync shows an ad in it. Reverting your own pause is the one exception.
- When you lower the cap below a campaign's current budget, that budget can be brought down to the new cap, or below it, in one step.

Only people can change guardrails, in Roasby itself. Your AI assistant can read them (`list_ad_accounts`, and the workspace's safety defaults with `get_current_workspace`) but never loosen them.

### Bid adjustments

A campaign's device and ad schedule bid adjustments raise or lower every bid, so they keep the **max bid change per step** too. Roasby measures them as multipliers (+20% is 1.2, -50% is 0.5) in whole hundredths and checks every pair of a device and a quarter hour of the week that shows ads after the change, with whole numbers only, so no rounding lets one slip past:

- **Each pair** may rise at most one step: the device multiplier times the hour's multiplier after the change must be at most the same product before × (1 + max change). At 50%, with mobile and Mondays 9:00–17:00 both at +0%, mobile may go to +50%, or Mondays to +50%, or mobile to +20% and Mondays to +25% (1.2 × 1.25 = 1.5), but not both to +50% (2.25).
- **What showed no ads before** counts as no adjustment (1.0) and gets no rise in that step: a device at -100% may come back at 0% at most (times the hours as they were), and hours a schedule left out, where no ads ran, may be added at 0% at most (times the device as it was). A rise past that is the next step.
- **No schedule** means every hour at 0%. A slot moved to other times is checked hour by hour the same way, and so is taking the schedule away: hours that ran lower before, or ran no ads, rise to 0%.
- Lowering an adjustment and switching a device off are always allowed.

A rise past a step is refused, naming each device and time slot (for example "Mobile in Monday 09:00–17:00: +125% asked, at most +50% in one step").

- If you ask your assistant to limit it to the guardrails, Roasby lowers each adjustment to what its pairs allow, and then every rise by the same share until all pairs fit. The preview lists them, with the values asked for as the next step.
- When taking a schedule away would raise bids too far, the schedule stays in that step, its slots raised as far as allowed, and taking it away is the next step.
- An AI assistant's revert of a lowered adjustment is held to the same rule; your own revert on the web restores what you had.

### Bidding targets

Bidding targets have their own guardrails, and the bid change per step:

- A target impression share's or maximize clicks' **max cost per click** stays within the account's **max bid** when one is set.
- A **target CPA** is a cost per conversion, usually many times a cost per click, so it stays within the account's **max target CPA** when one is set, never within the max bid. For example, a max bid of EGP 120 doesn't hold a target CPA of EGP 1,500.
- A **target ROAS** stays at or above the account's **min target ROAS** when one is set.
- In one step, a target CPA or a max cost per click rises at most the **max bid change**.
- A **target ROAS** falls at most that much in one step, because a lower ROAS spends more.
- A first target has no step, and bidding without a target spends up to the daily budget, within its guardrails.
- Maximize conversions and conversion value without goals that record conversions are allowed with a warning: the tracking is yours to fix in the ad platform.
- Roasby changes only bidding it could put back exactly, and a revert restores the strategy and every target.
- While a campaign bids automatically, Roasby refuses changes to its keyword and ad group bids.

See [Bidding and goals](/docs/bidding-and-goals).

### Safety defaults for new ad accounts

Each workspace has two **safety defaults**: the max budget change per step and the max bid change per step that every ad account you connect starts with. They need no currency, so you set them once for the workspace:

- **At sign-up**, before the workspace's pages, Roasby walks owners and admins of a new workspace through them, with 50% filled in and an example of what each value allows. If an invitation to another workspace is waiting for you, you see it first, and a note on the dashboard links to this setup. The same screen asks whether members may change ads (in shared workspaces) and which emails you want: the weekly report and alerts. Choose **Save and continue**, or **Set later** to keep the values filled in.
- **Later**, owners and admins change them under **Workspace settings → Safety defaults**. Ad accounts you already connected keep their own guardrails; change those under **Ad accounts → Guardrails**.

The money caps need the account's currency, so you set them when you connect it: right after connecting, Roasby opens each account new to the workspace (not one you reconnect) with its **max daily budget** and **max bid**, with the change limits filled in from your safety defaults. Save them, or choose **Set later** for that account. Until an account has a max daily budget, your AI assistant cannot create campaigns in it.

## Limits on how fast things change

- An ad account accepts at most **60 changes in any 60 minutes**, which stops a runaway assistant. A [batch](#batches-many-items-in-one-change) counts as one change. Reverting a change yourself is never blocked by this limit and does not count toward it.
- One change at a time per item: a second change to the same budget or status is refused until the first one is applied, so try again a moment later.
- Where an ad platform limits how often one item may change, Roasby holds you to the same limit with a clear message, instead of letting the platform fail the change.

## A change log you can revert

Every change is recorded in the **Change log** (in the sidebar) with who or what made it (you, a teammate, an AI assistant, or Roasby itself), the value before and the value after.

- A change is **Pending** until the ad platform confirms it, then **Applied**, or **Failed** with the reason.
- An applied status, budget or bid change shows in Roasby at once. After a new campaign, Roasby usually syncs that ad account within a few minutes, so everything the platform made shows (this doesn't use your **Sync now** allowance).

Anyone who may change ads (see below) can **Revert** an applied change with one click:

- Reverting a new campaign pauses it.
- Reverting negative keywords takes away the ones the change added (and reverting that adds them again).
- Reverting an ad text edit writes the ad's old text back (your assistant may do that too: ad text spends no money).
- For a status or budget, the revert is a new change in the log that puts the value before back. It is checked by the same guardrails, except the max change per step, since it restores a value the item already had. A revert by an AI assistant is held to the max change too.

A change can be reverted once (a revert the ad platform refused can be tried again), and only while the item still has the value it set: if it changed again since, revert the newer change first.

Your assistant can read the log with `list_ad_changes`, for example *"What did you change in my Google Ads account today?"*. See [Change log](/docs/change-log) for every status, what each revert does and what can't be reverted.

## Batches: many items in one change

You can pause or enable many campaigns, ad groups, ads and keywords of one ad account together, on the [Campaigns page](/docs/campaigns#changing-many-items-at-once) or through your assistant. Your assistant can also [change the bids](/docs/bidding-and-goals#changing-bids-through-your-ai-assistant) of many ad groups and keywords, or edit many ads or keywords, as one batch. A batch works like this:

- **One preview.** Roasby checks every item with the same rules as a single change, and shows how many items will change, which are refused and why. Refused items stay as they are; confirming changes only the items that pass.
- **One confirmation.** Your assistant gets one confirmation token for the whole batch, and only for those items with the values they have now. If any item changes before you confirm, the batch is previewed again.
- **A result for every item.** Each item is applied or fails on its own, with the ad platform's reason. The change log shows the batch as one entry (**Applied**, **Partly applied** or **Failed**); open it to see each item.
- **The same guardrails for every bid.** Each bid in a batch is checked like one bid change: the max bid, the max bid change per step, and only campaigns that use your bids. If you ask Roasby to limit bids to the guardrails, a bid beyond them moves only as far as they allow, and is marked as limited; it never goes past them. Only people change the guardrails, on the **Ad accounts** page.
- **One revert.** **Revert batch** puts back the value before of every item the batch applied, as a new batch (for keywords, ad groups or ads it added, it pauses them). You can still revert a single item of a batch on its own.
- **One change toward your limits.** A batch counts as one change toward your workspace's monthly changes and the hourly limit of the ad account. Your workspace can change only so many items in one batch (see [Billing](/docs/billing); each ad group, keyword, negative keyword and ad a batch adds counts as one, and so does every part of a [new campaign](/docs/creating-campaigns#the-whole-campaign-at-once), which is one change), and on Google Ads a batch must also fit Roasby's shared daily Google Ads capacity.

## Who can change ads

Workspace **owners and admins** can change ads: pause, enable and set campaign budgets on the [Campaigns page](/docs/campaigns), revert changes in the change log, and make every change Roasby offers through their AI assistant. **Members** can read everything but change nothing, unless an owner or admin turns on **Allow members to change ads** in **Workspace settings** (under **Manage** in the sidebar). Every switch of that setting is recorded.

Guardrails, ad platform connections and the setting itself always stay with owners and admins. An AI assistant acts with exactly the rights of the person who connected it, and only people can change who may change ads. See [Workspaces](/docs/workspaces#roles) for roles and invitations.

## Your assistant previews every change

Reading reports and finding problems needs no confirmation. Every change takes two steps:

1. **Preview.** Your assistant calls a `preview_*` tool (for example `preview_update_campaign_budget`). Roasby checks the change against all the rules above without changing anything, and tells the assistant the value before and after, the account's guardrails, and either why the change would be refused or a **confirmation token**.
2. **Confirm and apply.** Your assistant is told to show you the change and ask you to confirm before it calls the matching tool (for example `update_campaign_budget`) with the token, and Roasby checks everything again.

The token works **once**, for **10 minutes**, and only for that exact change, by you and that assistant. If anything differs (a different amount, another item, or the item changed in the meantime), the change is refused and your assistant previews it again. Many AI apps also ask you before they run a tool that changes something: read that prompt before you approve it.

### Steps only a person can do

Some steps are for a person, in Roasby or in an ad platform: for example setting or raising a guardrail, reconnecting an ad account, or declaring EU political ads for a whole Google Ads account. A preview or a result lists them in `user_actions`: what to do, why, where, and a link when there is one.

- Your assistant is told to explain each step to you in plain words, with its place and link, and never to say or suggest that it did the step itself.
- A step marked `optional` is a choice, not a requirement. Your assistant first offers what it can do within the rules (a smaller step, a value within the cap).
- Where a Roasby tool does the same step (making an ad account active, writing to support), your assistant offers it through the usual preview and confirmation.

## Limitations

- The confirmation token proves your assistant previewed the change, not that you agreed. Read your AI app's own prompt before you approve a change.
- Your assistant can't change guardrails, safety defaults or who may change ads. When only you can do something, it tells you what, why and where.
- A change can be reverted once, and only while the item still has the value it set. On an account that is over the limit, only a person can revert, on the web; an account set read-only by support refuses reverts too.
- A batch changes one ad account at a time, and has at most as many items as your workspace allows in one batch.
- A bidding target moves at most one max bid change per step (a target CPA or max cost per click up, a target ROAS down), and stays within the guardrails that are set.
- A bid adjustment (device or ad schedule) rises at most one max bid change per step, also when a device and a time slot multiply; a larger rise takes several steps.
- Roasby never deletes anything, so a mistake is fixed by pausing or reverting, never by removing.

See every limit by platform on [Limitations](/docs/limitations).
