google/campaigns/ directory (or wherever your account root points via imports). A single file can contain multiple [[campaigns]] entries. Adjar reads these files to understand your current campaign setup and writes changes back in the same format — making your entire campaign structure readable and editable by both humans and AI agents.
Full Example
[[campaigns]] Fields
The display name of the campaign as it appears in Google Ads. Names must be unique within the account.A clear naming convention helps AI agents identify campaigns without ambiguity. A common pattern is:
Controls whether the campaign is actively serving ads.
| Value | Behaviour |
|---|---|
"ENABLED" | Campaign is live and eligible to serve |
"PAUSED" | Campaign is suspended but retains all settings |
ENABLED and PAUSED are the only values you set in config. To remove a campaign, delete its block from TOML — the next apply archives the live campaign. (Internally Adjar writes Google’s REMOVED state during that archive; it is never something you author.)The Google Ads channel this campaign runs on.
Additional channel types (e.g.
| Value | Description |
|---|---|
"SEARCH" | Text ads on Google Search results pages |
DISPLAY, PERFORMANCE_MAX) will be documented as Adjar adds support for them.The automated bidding strategy Google uses to set bids for this campaign.
Only the strategy kind is modeled here.
| Value | Description |
|---|---|
"MANUAL_CPC" | You set bids manually (per ad group / keyword); the simplest baseline |
"TARGET_SPEND" | Maximises clicks within the daily budget (Google’s “Maximize Clicks”) |
"MAXIMIZE_CONVERSIONS" | Maximises conversions within the budget |
"MAXIMIZE_CONVERSION_VALUE" | Maximises total conversion value within the budget |
"TARGET_CPA" | Sets bids to achieve a target cost per acquisition |
"TARGET_ROAS" | Sets bids to achieve a target return on ad spend |
TARGET_CPA / TARGET_ROAS targets, and the conversion tracking the conversion-driven strategies require, are configured in the Google Ads UI — switching to one in TOML seeds an empty target that Google may reject until you set it (apply’s server-side validation will surface this).An optional maximum cost-per-click cap in US dollars applied on top of the automated bid strategy. Google will not bid above this amount for any single click.Only valid when
bid_strategy is "TARGET_SPEND".The average daily spend limit for this campaign in US dollars. Google may spend up to twice this amount on a given day, but will not exceed the monthly equivalent (daily × 30.4) over a calendar month.
How the daily budget is paced.
| Value | Behaviour |
|---|---|
"STANDARD" | Spends the budget evenly throughout the day (recommended) |
"ACCELERATED" | Front-loads spend; deprecated by Google for most campaign types and accepted mainly for round-trip on import |
The date the campaign begins serving,
YYYY-MM-DD. Omit to let Google use the campaign’s existing/created start date.The date the campaign stops serving,
YYYY-MM-DD. Omit for an open-ended campaign — Adjar leaves the end date unset rather than writing a phantom value.A list of sitelink asset IDs to attach at the campaign level. These IDs must be defined in your
assets.toml.Attachment resolves at the most specific level — Google never merges. Omitting the field (or setting it empty) inherits the account-level sitelinks; a non-empty list replaces the account set for this campaign. To keep an account-wide sitelink showing on a campaign that adds its own, re-list its ID here.Campaign-level callout asset IDs, with the same inherit-or-override semantics as
sitelinks.Campaign-level structured-snippet asset IDs, with the same inherit-or-override semantics as
sitelinks.[campaigns.network]
Controls which networks the campaign serves on — Google’s network_settings. All fields default to a Google-Search-only campaign, so omitting the block keeps the campaign off Search partners and the Display Network. This is deliberate: Display spend inside a Search campaign produces no search terms and is easy to miss. The block is always compared against the live campaign, so a Display opt-in flipped on in the UI shows up as drift on the next plan.
Serve on the main Google Search results pages.
search_partners requires this to be true.Also serve on Google’s Search-partner sites.
Also serve on the Display (“Content”) Network.
[campaigns.targeting]
The [campaigns.targeting] table controls who sees ads from this campaign. All fields are optional — omitting a field leaves that dimension unrestricted.
List of country codes (ISO 3166-1 alpha-2) to target. Ads will only be eligible to show to users in these locations.Adjar maps each code to Google’s numeric geo-target constant from a built-in whitelist. Currently supported:
US, CA, GB, DE, FR, NL, AU, JP, IN, SG. An unrecognised code is rejected — extend the map in the CLI to add a new market.List of language codes to target. Ads will only show on Google properties using one of these languages.As with geos, codes map to Google’s numeric language constants from a built-in whitelist. Currently supported:
en, de, fr, es, ja, zh. An unrecognised code is rejected.List of device types to target. Ads will only be eligible to serve on the specified devices.
| Value | Device |
|---|---|
"DESKTOP" | Desktop and laptop computers |
"MOBILE" | Smartphones |
"TABLET" | Tablet devices |
[[campaigns.negative_keywords]]
Campaign-level negative keywords prevent ads in this campaign from showing on searches that match. They apply to every ad group within the campaign.
The keyword text to exclude. Do not include match type syntax characters (e.g. quotes or brackets) — use the
match_type field instead.How broadly the negative keyword blocks traffic.
See the Keywords reference for a full explanation of match type behaviour, including ad-group-level negatives.
| Value | Blocks |
|---|---|
"BROAD" | Any search containing all words in any order |
"PHRASE" | Searches containing the exact phrase |
"EXACT" | Searches that match the keyword exactly |
[[campaigns.ad_groups]]
Ad groups sit inside a campaign and contain keywords and ads. Each [[campaigns.ad_groups]] entry must appear after the [[campaigns]] entry it belongs to.
The display name of the ad group as it appears in Google Ads. Names must be unique within the parent campaign.A clear name reflects the keyword theme the ad group targets, making it easy for both humans and AI agents to identify which ad group to edit.
Controls whether the ad group is eligible to serve ads.
As with campaigns,
| Value | Behaviour |
|---|---|
"ENABLED" | Ad group is active and its keywords can trigger ads |
"PAUSED" | Ad group is suspended but retains all settings |
ENABLED and PAUSED are the only values you set; remove the ad-group block to archive it.The ad group’s default maximum cost-per-click bid in US dollars. Used when the campaign’s
bid_strategy is "MANUAL_CPC"; automated strategies set bids at the campaign level and ignore this.[[campaigns.ad_groups.keywords]] and [[campaigns.ad_groups.ads]]. See Keywords and Creatives for those fields.
Related Pages
- Account Root — how campaigns are imported via
google.toml - Keywords — keyword entries, match types, and negatives at the ad group level
- Creatives — ads, headlines, and descriptions nested inside ad groups
- Assets — the sitelinks, callouts, and structured snippets that campaign attachments reference
- Conversions — the conversion actions that conversion-based
bid_strategyvalues feed