Create Google app campaign (adsap_google_create_app_campaign)
Platform: Google Ads · Read or write: Write · Plan: Early Access · Consumes a task: Yes · Preview supported: Yes
What it does
Creates a full Google App campaign in one request: budget, campaign, location and language targeting, an ad group and the app ad. Google assembles the ad from your headlines, descriptions and optional media, and links it to the store listing on its own. The campaign is always created paused and optimizes for installs at your target cost per install. Ask for a preview first.
When to use it
- Use it to promote a mobile app with a new App campaign. Google builds the ads from your text and optional media.
- It needs the public store ID of the app. Android uses the package name. iOS uses the numeric App Store ID with
app_storeset toapple_app_store. target_cpiis required: your target cost per install, as a plain number in the account currency.- Images and videos are optional. They are asset IDs from
adsap_google_upload_asset. Text alone is valid: 2 to 5 headlines and 1 to 5 descriptions. - It supports a preview call. With
dry_runset totrue, Google validates the plan, nothing is created, and no task is used.
Worked example
You ask
“Preview an App campaign for our Android app com.example.app in account 1234567890. France, French speakers, 60 a day, target 2 per install.”
The assistant calls adsap_google_create_app_campaign
{
"ad_account_id": "1234567890",
"campaign": {
"name": "Example app installs, France",
"daily_budget": 60,
"app_id": "com.example.app",
"app_store": "google_play",
"target_cpi": 2
},
"geo": {
"location_ids": ["2250"]
},
"language_ids": ["1010"],
"ad": {
"headlines": ["Plan Your Trail Runs", "Free Route Maps"],
"descriptions": ["Find trails near you and track every run."]
},
"dry_run": true
}Adsap returns
The field names are the ones Adsap returns. The values are examples.
{
"ok": true,
"dry_run": true,
"platform": "google",
"action": "create_app_campaign",
"plan": {
"campaign": {
"name": "Example app installs, France",
"status_at_create": "PAUSED",
"daily_budget": 60,
"app_id": "com.example.app",
"app_store": "GOOGLE_APP_STORE",
"bidding_goal": "OPTIMIZE_INSTALLS_TARGET_INSTALL_COST",
"target_cpi": 2
},
"geo": {
"location_ids": ["2250"],
"negative_location_ids": []
},
"language_ids": ["1010"],
"ad_group": {
"name": "Example app installs, France - ad group",
"type": "none (App campaign ad groups take no type)"
},
"ad": {
"headlines": 2,
"descriptions": 1,
"images": 0,
"youtube_videos": 0,
"destination": "app store listing (no URL)"
},
"operations_count": 6,
"conversion_actions_found": 1
},
"google_validation": "passed",
"warnings": [
"Google recommends a daily budget of roughly 50x your target cost-per-install (100.00 for your target of 2) - lower budgets are allowed but can slow learning."
]
}How to read it
plan is what Adsap would send to Google. status_at_create is PAUSED, so nothing spends yet. app_store comes back in Google’s own naming. The ad group name was filled in because the call sent none. destination confirms the ad points at the store listing.
warnings never block the call. Here the budget of 60 is under 50 times the target_cpi of 2, so the tool warns that learning may be slow. google_validation is passed when Google accepts the plan. Otherwise it holds Google’s error message. To create the campaign, the assistant repeats the call without dry_run and gets a campaign_id and an ad_group_id back.
Parameters
Descriptions are shortened from the tool schema. Your assistant sees the full text.
| Name | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | Yes | Bare 10-digit Google Ads customer ID (from adsap_google_list_ad_accounts). No dashes, no act_ prefix. |
campaign | object | Yes | |
campaign.name | string | Yes | |
campaign.daily_budget | number | Yes | Daily budget in the ACCOUNT CURRENCY as a plain number (e.g. 50). NOT micros, NOT cents. Google recommends roughly 50x target_cpi. |
campaign.app_id | string | Yes | The app to promote. Android: the package name (e.g. com.example.app). iOS: the numeric App Store id as a string (e.g. 570060128). |
campaign.app_store | one of google_play, apple_app_store | Yes | Which store the app_id lives in. Mismatches fail with a clear Google error. |
campaign.target_cpi | number | Yes | Target cost per install in the account currency as a plain number (e.g. 1.50). Drives the campaign’s target-CPA bidding. |
campaign.bidding_goal | one of installs | No | v1 supports only ‘installs’ (OPTIMIZE_INSTALLS_TARGET_INSTALL_COST). Other goals are rejected. |
geo | object | Yes | |
geo.location_ids | array of string | Yes | Geo target constant ids to TARGET (from adsap_google_search_geo_targets). Campaign-level, like Search. |
geo.negative_location_ids | array of string | No | Geo target constant ids to EXCLUDE. |
language_ids | array of string | No | Language constant ids (e.g. 1000 = English, 1010 = French). Campaign-level; omit to target all languages. |
ad_group | object | No | |
ad_group.name | string | No | Ad group name (defaults to ‘<campaign name> - ad group’). App campaign ad groups take no type and no criteria. |
ad | object | Yes | |
ad.headlines | array of string | Yes | 2-5 headlines, max 30 chars each. Google enforces a floor of 2. |
ad.descriptions | array of string | Yes | 1-5 descriptions, max 90 chars each. |
ad.image_asset_ids | array of string | No | Optional: up to 20 image ASSET ids from adsap_google_upload_asset (1.91:1, 4:5 or 1:1; JPG/PNG up to 5MB). |
ad.video_asset_ids | array of string | No | Optional: up to 20 YouTube video ASSET ids from adsap_google_upload_asset (asset_type youtube_video; videos must be 10-60s). |
dry_run | boolean | No | Preview only: the request is validated and the resolved payload returned, nothing is created or changed. |
Example prompts
- “Preview an App campaign for com.example.app on Android at 5 dollars per install, targeting the US and Canada.”
- “Create an iOS App campaign for App Store id 570060128 with these headlines.”
- “Create the App campaign we just previewed.”
Notes
The tool takes no URL input, ever. Google recommends a daily budget of about 50 times the target cost per install; lower is allowed but slows learning. In-app action, value and pre-registration goals are not supported.
Related tools
adsap_google_create_demand_gen_campaign: Create a complete Google Ads Demand Gen campaign (YouTube, Discover, Gmail, Maps and the Google Display Network) in ONE atomic request…adsap_google_create_display_campaign: Create a classic standalone Google Display campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_create_pmax_campaign: Create a complete Google Ads Performance Max campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_create_search_campaign: Create a complete Google Ads Search campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_create_shopping_campaign: Create a complete standard Google Shopping campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED: activate later with…adsap_google_list_campaigns: List Google Ads campaigns in a Google Ads account (cache-first; auto-refreshes from Google when the cache is missing or older than 1 hour).
Guide
Read Google App campaigns for the workflow around this tool, and the Tool reference for every tool.
The Google Ads MCP server page shows how to connect Google Ads to Claude, ChatGPT or Perplexity.