Explanation and example queries using adset targeting data

This article will guide you through using ad set targeting data with example queries that answer specific questions about audience demographics, locations, and other targeting criteria in your ad campaigns.

Overview

  • The adset_targeting in the Ads table contains details on targeting parameters for the adset (e.g. location, age, gender).
  • The adset_targeting.target_key nested column contains the targeting category key.
[
  'age_min',
  'age_max',
  'geo_locations_countries',
  'geo_locations_location_types',
  'brand_safety_content_filter_levels',
  'excluded_custom_audiences',
  'custom_audiences',
  'targeting_automation_advantage_audience',
  'geo_locations_custom_locations',
  'flexible_spec',
  'device_platforms',
  'publisher_platforms',
  'facebook_positions',
  'instagram_positions',
  'genders',
  'excluded_geo_locations_countries',
  'Excluded_geo_locations_location_types'
]
  • The adset_targeting.target_values nested column contains the specific values associated with the targeting category key. The result is returned as an array.

Using Ad Set Targeting Data: Example Queries

Question 1: Which genders are being targeted in campaigns that include “Summer” in their names?

This query looks for campaigns with “Summer” in their names and filters for targeting parameters where adset_targeting.target_key is set to 'genders'. The result will show all the gender-targeted campaigns within the selected date range.

SELECT DISTINCT
 campaign_id,
 campaign_name,
 adset_targeting.target_key AS target_key,
 adset_targeting.target_values AS target_values,
 target_value
FROM
 ads_table a ARRAY
 JOIN adset_targeting ARRAY
 JOIN adset_targeting.target_values AS target_value
WHERE
 campaign_name LIKE '%Summer%'
 AND adset_targeting.target_key = 'genders'
 AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)

Question 2: Which geographical locations are targeted in campaigns that include “Tops” in their names.

This query searches for campaigns with “Tops” in their names, focusing on geo_locations_countries within adset_targeting.target_key. The results will show which countries these campaigns are aiming to reach.

SELECT DISTINCT
 campaign_id,
 campaign_name,
 adset_targeting.target_key AS target_key,
 adset_targeting.target_values AS target_values,
 target_value
FROM
 ads_table a ARRAY
 JOIN adset_targeting ARRAY
 JOIN adset_targeting.target_values AS target_value
WHERE
 campaign_name LIKE '%Tops%'
 AND adset_targeting.target_key = 'geo_locations_countries'
 AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)

Question 3: Which custom audiences are included and excluded in campaigns with “Prospecting” in their names?

This query checks for both custom_audiences (included) and excluded_custom_audiences (excluded) in adset_targeting.target_key. You’ll get a breakdown of custom audience groups, helping you see how these campaigns selectively target or avoid specific audience segments.

SELECT DISTINCT
 campaign_id,
 campaign_name,
 adset_targeting.target_key,
 simpleJSONExtractString(target_value, 'name') AS audiences_name
FROM
 ads_table a ARRAY
 JOIN adset_targeting ARRAY
 JOIN adset_targeting.target_values AS target_value
WHERE
 campaign_name LIKE '%Prospecting%'
 AND adset_targeting.target_key IN ('excluded_custom_audiences', 'custom_audiences')
 AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)

Question 4: Which age groups being targeted in campaigns that include “Bottoms” in their names.

This query focuses on campaigns with “Bottoms” in their names, filtering for age_min and age_max in adset_targeting.target_key. The output provides the age range, allowing you to assess the age demographics these campaigns are reaching.

SELECT DISTINCT
 campaign_id,
 campaign_name,
 adset_targeting.target_key AS target_key,
 adset_targeting.target_values AS target_values,
 target_value
FROM
 ads_table a ARRAY
 JOIN adset_targeting ARRAY
 JOIN adset_targeting.target_values AS target_value
WHERE
 campaign_name LIKE '%Bottoms%'
 AND adset_targeting.target_key IN ('age_min', 'age_max')
 AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)

Question 5: Which campaigns are specifically targeted at females aged 18-65 in the United States?

This complex query uses common table expressions (CTEs) to isolate different targeting parameters (country, gender, age range) for campaigns aimed at females aged 18-65 in the US. By joining these CTEs, the query outputs campaigns that meet all the specified targeting criteria. This query is particularly useful for identifying hyper-targeted campaigns and understanding their scope within specific demographics.

WITH
 country AS (
   SELECT DISTINCT adset_id
   FROM ads_table a ARRAY
   JOIN adset_targeting ARRAY
   JOIN adset_targeting.target_values AS target_value
   WHERE adset_targeting.target_key = 'geo_locations_countries'
   AND target_value = 'US'
   AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)
 ),
 gender AS (
   SELECT DISTINCT adset_id
   FROM ads_table a ARRAY
   JOIN adset_targeting ARRAY
   JOIN adset_targeting.target_values AS target_value
   WHERE adset_targeting.target_key = 'genders'
   AND target_value = 'female'
   AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)
 ),
 age_min AS (
   SELECT DISTINCT adset_id
   FROM ads_table a ARRAY
   JOIN adset_targeting ARRAY
   JOIN adset_targeting.target_values AS target_value
   WHERE adset_targeting.target_key = 'age_min'
   AND target_value = '18'
   AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)
 ),
 age_max AS (
   SELECT DISTINCT adset_id
   FROM ads_table a ARRAY
   JOIN adset_targeting ARRAY
   JOIN adset_targeting.target_values AS target_value
   WHERE adset_targeting.target_key = 'age_max'
   AND target_value = '65'
   AND event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)
 )
SELECT
 ads1.*
FROM
 ads_table AS ads1
 INNER JOIN country USING (adset_id)
 INNER JOIN gender USING (adset_id)
 INNER JOIN age_min USING (adset_id)
 INNER JOIN age_max USING (adset_id)
WHERE
 ads1.channel = 'facebook-ads'
 AND ads1.event_date = DATE_SUB(current_date(), INTERVAL 1 DAY)