Skip to content

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