AN-441822 Add Google Ads API enum values to paid media schemas#2112
Conversation
Extend paid media field group enums to support Google Ads API v23 data ingestion while keeping schemas platform-agnostic. Additions include: - campaignType: performance_max, demand_gen, multi_channel, local, local_services, hotel, travel, smart - adGroupType: hotel, travel, audio - bidStrategyType: maximize_conversion_value, manual_cpm, manual_cpv, target_cpm, target_cpv, target_cpc, percent_cpc, commission, manual_cpa, fixed_cpm - adType: audio, call, smart, local, hotel, travel - assetType: dynamic, call, app_link, booking, location, hotel_property, message - servingStatus: LIMITED, LEARNING, NOT_ELIGIBLE - experienceType: audio - dimensionalBreakdowns.platform: new cross-platform enum - dimensionalBreakdowns.position/adPosition: new cross-platform enum Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove enum constraints from dimensional breakdown fields that were originally free-form strings. The ingest process will maintain mappings on their side for flexibility. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
| "sponsored_tv": "Sponsored TV (Amazon)", | ||
| "traffic": "Traffic Campaign", | ||
| "performance_max": "Performance Max Campaign (Google)", | ||
| "demand_gen": "Demand Gen Campaign (Google)", |
There was a problem hiding this comment.
I want to understand the difference between this field and automatedCampaignType?
Do we expect automatedCampaignType to be mapped with Campaign Type or Campaign Sub Type in case of Google Ads?
https://github.com/googleads/google-ads-python/blob/main/google/ads/googleads/v23/enums/types/advertising_channel_type.py
https://github.com/googleads/google-ads-python/blob/main/google/ads/googleads/v23/enums/types/advertising_channel_sub_type.py
There was a problem hiding this comment.
Here what is the definition of AutomationCampaignType? Is it any campaign type using automated bid strategies like TCPA/TROAS etc?
There was a problem hiding this comment.
Good questions. I've clarified the mapping in the latest commit:
campaignTypemaps to Google Ads advertising_channel_type — it's the primary campaign channel identity (SEARCH, DISPLAY, PERFORMANCE_MAX, etc.)automatedCampaignTypeis a cross-platform automation product classification, not a 1:1 mapping of any single Google field. For Google Ads, automated sub-types from advertising_channel_sub_type (e.g., SMART_CAMPAIGN → SMART_PLUS, APP_CAMPAIGN → AUTO_CAMPAIGN) map here.subType(free-form string) maps to advertising_channel_sub_type for non-automated variants (e.g., VIDEO_NON_SKIPPABLE, VIDEO_SEQUENCE).isAutomatedCampaign= true for inherently automated campaign types (performance_max, smart, demand_gen) and platform automation features (TikTok Smart+, Meta Advantage+).
I also removed PERFORMANCE_MAX from automatedCampaignType since it's already captured by campaignType — having it in both was creating ambiguity.
|
"xdm:productSource": { |
|
paidMedia.campaignDetails.targeting.interestTargeting.customAudiences.audienceType custom, lookalike, retargeting, similar UNSPECIFIED = 0 |
components/fieldgroups/paid-media/core-paid-media-adgroup-details.schema.json
Show resolved
Hide resolved
Add the same bid strategy enum list from adgroup-level bidStrategyType to campaign-level bidStrategy field, since bid strategy is predominantly a campaign-level setting in search networks like Google Ads. Update example file to use a valid enum value. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…add enums - Clarify campaignType vs automatedCampaignType relationship: campaignType maps to Google Ads advertising_channel_type, automatedCampaignType is a cross-platform automation classification (not a 1:1 platform field mapping) - Remove PERFORMANCE_MAX from automatedCampaignType (already in campaignType) - Update subType description to clarify it maps to advertising_channel_sub_type for non-automated variants - Add GOOGLE_MERCHANT_CENTER to productSource enum for Shopping campaigns - Add Google Ads user_list_type values to audienceType enum: logical, rule_based, crm_based (REMARKETING/EXTERNAL_REMARKETING already covered by retargeting) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
added GOOGLE_MERCHANT_CENTER to the productSource enum |
Added logical, rule_based, and crm_based to the audienceType enum. The existing retargeting value already covers REMARKETING and EXTERNAL_REMARKETING, and similar/lookalike were already present. |
components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json
Show resolved
Hide resolved
components/fieldgroups/paid-media/core-paid-media-campaign-details.schema.json
Show resolved
Hide resolved
Add responsive_search, responsive_display, and dynamic_assembly to experienceType enum to support Google Ads experience ID derivation where experienceID = ad.id for standard campaigns and experienceID = exp_ + asset_group.id for PMax. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Change lowest_cost_without_cap to lowest_cost in Meta campaign example to match the bidStrategy enum added in PR adobe#2112. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
responsive_search,responsive_display, anddynamic_assemblyexperience type enums to support Google Ads experience ID derivation (where experienceID = ad.id for standard campaigns, experienceID = exp_ + asset_group.id for PMax)Closes #2113
Details
For comprehensive documentation of the Google Ads API → XDM enum mapping (including match type analysis, per-value rationale, and open questions), see the internal Jira ticket: AN-441822
Experience Type Enums Added
responsive_searchad.type == RESPONSIVE_SEARCH_ADresponsive_displayad.type == RESPONSIVE_DISPLAY_ADdynamic_assemblycampaign.type == PERFORMANCE_MAXGoogle Ads Experience ID Derivation Logic
This mirrors the Meta convention where the first conditions use native platform IDs (no prefix) and synthetic/fallback IDs use the
exp_prefix.Files Changed
core-paid-media-campaign-details.schema.jsoncampaignType(+8 values, clarified description),bidStrategy(added enum matching adgroup-level),automatedCampaignType(removed PERFORMANCE_MAX, clarified description),subType(clarified description),productSource(+1 GOOGLE_MERCHANT_CENTER)core-paid-media-adgroup-details.schema.jsonadGroupType(+3),bidStrategyType(+10)core-paid-media-ad-details.schema.jsonadType(+6)core-paid-media-asset-details.schema.jsonassetType(+7)core-paid-media-metadata.schema.jsonservingStatus(+3)core-paid-media-experience-details.schema.jsonexperienceType(+4: audio, responsive_search, responsive_display, dynamic_assembly)core-paid-media-dimensional-breakdowns.schema.jsonplatform,position,adPositionkept as free-form textpaid-media-targeting.schema.jsonaudienceType(+3: logical, rule_based, crm_based)Validation
npm test— 2366 passingnpm run lint— clean (no formatting changes)🤖 Generated with Claude Code