Build complete Google Ads structures with a reviewed atomic plan
Preview, native validation, exact-plan confirmation and readback for Google Ads builds and modifications.
IntentCreate or duplicate paused Search, Display, Demand Gen and Performance Max structures, upload assets, and verify each write.
- 8
- Steps
- 4
- Tools
- 2
- Rules
- 6
- Failure modes
When to use it
Use it when
- Creating campaigns with ad groups, ads, keywords and targeting.
- Uploading image or video creatives, building PMax asset groups, or testing writes in a sandbox.
Do not use it when
- Classic VIDEO campaign creation: Google Ads API does not support it. Demand Gen requires an explicit choice, not a silent substitution.
- Shopping without a usable Merchant Center link, or claims about real delivery from a sandbox.
What it needs first
Required
Preconditions
- The account is ticked in the dashboard, confirmed via list_accounts.
Inputs
customerIdrequired- Selected advertising customer, not its manager MCC.
currencyrequired- Actual account currency. Native monetary fields are integer micros.
buildrequired- Explicit names, budgets, dates, targeting, ad content and political advertising declaration.
Procedure
In order. Every tool named is one the gateway ships, and links to its reference.
Confirm the selected account with list_accounts; read customer.id, currency_code, test_account and existing campaign settings. A test run must assert test_account=true.
For duplication, read the source campaign/budget, all ad groups, ads/assets and criteria. Map supported mutable fields explicitly; retain bidding, dates, locations, languages and exclusions. Report any setting that cannot be reproduced. Use new names and PAUSED status.
Upload image and text assets to the library before linking them to PMax groups. Use assetOperation with imageAsset.data or textAsset.text. Preview, validateOnly, then confirm the matching expectedPlanHash. Keep the returned positive resource names.
For video bytes, supply nonempty title/description and explicitly choose UNLISTED; preview and confirm the exact hash. Query you_tube_video_upload.state and video_id until PROCESSED. Create a youtubeVideoAsset using that video ID. Large videos above 16 MiB require an existing YouTube video or another upload workflow.
Build an ordered plan with temporary negative resource IDs. Search uses RSA ads and keyword criteria; Display uses responsiveDisplayAd; Demand Gen uses video, multi-asset image or carousel ads. Carousel cards need finalUrls and unique existing images. Conversion-based Demand Gen requires conversion tracking configured; do not invent production conversion actions.
For PMax, link campaign BUSINESS_NAME/LOGO assets when brandGuidelinesEnabled=true; otherwise link those assets at asset-group level. Create the paused asset group and all required links atomically, referencing uploaded text/image assets. Native errors identify missing assets; do not claim a complete creative from an empty campaign.
Show the exact plan and its hash, run validateOnly, then execute only the approved unchanged plan with confirm=true and expectedPlanHash. Apply testAccountOnly=true for every sandbox write.
Read back every returned ID, its parent, status, budget, targeting and creative fields. On an uncertain response, search by names/IDs before retrying a creation. Remove only disposable test fixtures, after checking references.
Decision rules
The observable condition, what it lets you conclude, and what takes the conclusion back.
When
Validation succeeds
Conclude
The request is accepted, but nothing was created; only mutation plus readback proves creation.
When
The native API rejects a prerequisite
Conclude
Fix that prerequisite or report it precisely. Do not silently switch campaign type or treat a mock as sandbox proof.
Evidence every conclusion must carry
- Record the test account flag, native validation response, mutation resource names and exact readbacks.
- Separate native API tests, hosted MCP tests, OAuth consent UI and real ad delivery; one does not prove the others.
Where the agent stops
- Show changes and obtain confirmation before applying; a plan hash binds the exact payload, not the person's intent.
- Video upload is UNLISTED on YouTube, not private. Creating paused ads does not make uploaded video private.
- Do not change production accounts as part of sandbox acceptance.
How it goes wrong quietly
The cases where the analysis is wrong and still looks right. Read them before trusting a number.
- Counting previews as API mutations.
- Google ad.name is immutable. Edit mutable creative fields or explicitly create a replacement paused ad; never promise an in-place ad rename.
- Creating PMax text assets and asset-group links together can yield missing-text errors in the sandbox; upload text assets first.
- Reusing the same image across carousel cards.
- Empty upload descriptions are rejected. Video title/description are immutable after upload in v25.
- A Merchant Center test account cannot be linked to Google Ads; it is not an end-to-end Shopping fixture.
What the answer contains
- 01Applied changes
- Account, currency, IDs, hierarchy and verified states.
- 02Coverage and limits
- What was natively tested and which external prerequisites or unsupported operations remain.