Narrow a video campaign to a specific audience
A YouTube campaign with no targeting shows your ad to everyone, and “everyone” is expensive. This recipe narrows one to people who have already shown they want what you sell.
1. Describe who you want
A custom audience is a segment you define by listing signals — here, what people searched for:
resource "google_ads_custom_audience" "privacy_searchers" { name = "Privacy tool searchers" description = "People searching for ad and tracker blocking" type = "SEARCH"
member { keyword = "ad blocker" } member { keyword = "block trackers" } member { keyword = "stop being tracked online" }}type = "SEARCH" means “people who searched Google for these” — the
most direct signal there is. See
google_ads_custom_audience
for the other kinds.
2. Point the campaign at it
resource "google_ads_campaign_criterion" "privacy_intent" { campaign = google_ads_campaign.instream.id
audience { custom_audience = google_ads_custom_audience.privacy_searchers.id }}That’s the whole link. bidsmith apply creates the segment and the
targeting together, in the right order.
3. Add the other angles
Each axis is one more criterion resource on the same campaign. Mix as many as fit your test:
# Run on a specific tech channel.resource "google_ads_campaign_criterion" "tech_channel" { campaign = google_ads_campaign.instream.id
youtube_channel { channel_id = "UCXuqSBlHAE6Xw-yeJA0Tunw" }}
# Run on videos about computers and electronics.resource "google_ads_campaign_criterion" "computers_topic" { campaign = google_ads_campaign.instream.id
topic { topic_constant = "topicConstants/278" }}
# Reach people Google already classes as privacy-interested.resource "google_ads_campaign_criterion" "privacy_interest" { campaign = google_ads_campaign.instream.id
user_interest { user_interest_category = "customers/1234567890/userInterests/80546" }}4. Exclude what you don’t want
Add negative = true and the same block becomes an exclusion:
resource "google_ads_campaign_criterion" "exclude_under_25" { campaign = google_ads_campaign.instream.id negative = true
age_range { type = "AGE_RANGE_18_24" }}5. Test two cohorts side by side
Everything above targets the whole campaign. When you want to compare
cohorts — the same creative shown to two different audiences — put the
targeting on the ad group instead. Same blocks, same negative
switch, on
google_ads_ad_group_criterion:
resource "google_ads_ad_group" "instream_35_up" { name = "In-stream — 35+" campaign = google_ads_campaign.instream.id type = "VIDEO_TRUE_VIEW_IN_STREAM" cpv_bid_micros = 35000}
resource "google_ads_ad_group_criterion" "cohort_35_44" { ad_group = google_ads_ad_group.instream_35_up.id
age_range { type = "AGE_RANGE_35_44" }}
resource "google_ads_ad_group_criterion" "cohort_privacy_intent" { ad_group = google_ads_ad_group.instream_35_up.id
audience { custom_audience = google_ads_custom_audience.privacy_searchers.id }}Two cohorts are then two ad groups in one campaign, sharing one budget and one set of results to compare — rather than two campaigns that happen to run the same video.
Ad-group location and language work the same way, and intersect
with the campaign’s: a viewer has to match both. That’s how one campaign
holds one localized ad group per market.
What bidsmith owns
Once a campaign or ad group declares any criterion of a kind, bidsmith
owns that kind there: a channel somebody added in the Google Ads website
shows up in plan as something to remove, and deleting a block from
your file removes the targeting. Kinds you never declare are left
completely alone — declaring channels doesn’t give bidsmith an opinion
about your topics, and ad-group targeting says nothing about the
campaign’s.
That’s the point: the file is the audience, and a change to the audience is a pull request.
See also
google_ads_campaign_criterion— every targeting block.google_ads_ad_group_criterion— the same blocks scoped to one ad group.google_ads_custom_audience— building the segment.- Cap how often people see your video ad — the other half of video control.
- Drift — why a website change shows up in
plan.