Add Ad Group to Google Campaign
adsap_google_create_ad_groupAdd an ad group to an EXISTING Google Ads campaign (Search, Display or Demand Gen) in ONE atomic request: the ad group, optional keywords (Search only) and optionally one ad. This is the only tool that adds structure to an already-created campaign — the create-campaign tools always build a fresh campaign. Declare channel to match the campaign's type (SEARCH -> 'search', DISPLAY -> 'display', DEMAND_GEN -> 'demand_gen' — from adsap_google_list_campaigns); the workflow verifies the campaign exists and rejects mismatches (PMax uses asset groups and is NOT supported; App/Shopping ad groups are also unsupported). SAFETY: if the parent campaign is ACTIVE the new ad group is created PAUSED by default so it never starts spending unreviewed — pass ad_group.status 'ENABLED' to override; if the campaign is PAUSED the ad group is created ENABLED (the campaign gates serving). Per channel: SEARCH — ad_group.keywords [{text, match_type EXACT|PHRASE|BROAD}] (optional but the group gets no traffic without them) and an optional responsive search ad (3-15 headlines max 30 chars w/ optional pinned_field, 2-4 descriptions max 90, final_url, path1/path2). DISPLAY — optional optimized_targeting flag and an optional responsive display ad (same shape as adsap_google_create_display_campaign's ad: >=1 landscape AND >=1 square image asset id, 1-5 headlines, exactly 1 long_headline, 1-5 descriptions, business_name, final_url). DEMAND_GEN — geo is REQUIRED at the AD GROUP level (ad_group.geo.location_ids; unlike Search/Display where geo is campaign-level and cannot be set here), plus optional language_ids, channel controls (ad_group.channels.strategy or .selected) and an optional 'multi_asset' image ad or 'video_responsive' YouTube ad (same shapes as adsap_google_create_demand_gen_campaign). An ad group created WITHOUT an ad will not serve until an ad is added. EXISTING-GROUP MODE: pass ad_group_id INSTEAD of ad_group to add ONE responsive search ad to an ad group that already exists (Search only; ad becomes required; ad.status defaults to PAUSED — pass ENABLED to create it serving; the workflow verifies the group exists, is not removed, and belongs to campaign_id). Use dry_run: true first — Google validates the whole chain without creating anything. ad_account_id is the bare 10-digit customer ID.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ad | No | Optional — omit to create the ad group without an ad (it will not serve until one is added). | |
| channel | Yes | Must match the campaign's advertising channel type. The workflow verifies and rejects mismatches. | |
| dry_run | No | ||
| ad_group | No | CREATE MODE: the new ad group to create. Mutually exclusive with ad_group_id — exactly one of the two is required. | |
| ad_group_id | No | EXISTING-GROUP MODE: numeric id of an EXISTING ad group (from the campaign's ad group list) — the tool then ONLY creates one responsive search ad inside it (search only; `ad` required). Mutually exclusive with ad_group. | |
| campaign_id | Yes | Numeric id of the EXISTING campaign to add the ad group to (from adsap_google_list_campaigns). | |
| ad_account_id | Yes | Bare 10-digit Google Ads customer ID (from adsap_google_list_ad_accounts). No dashes, no act_ prefix. |