We are using the Google Ads API to get the list of adgroups every 15 minutes.
async function getGoogleAdsDataFromBO(
nextPageToken,
startDate,
endDate,
accessToken,
clientConfig,
account
) {
console.log(`<< Obtaining ad groups for ${account} account...>>`);
//initial query, this is used when we just need to query the first 10000 adGroups
const dataWithoutNextPage = JSON.stringify({
pageSize: 10000,
query: `SELECT segments.date,
ad_group.ad_rotation_mode,
ad_group.base_ad_group,
ad_group.campaign,
ad_group.cpc_bid_micros,
ad_group.cpm_bid_micros,
ad_group.cpv_bid_micros,
ad_group.display_custom_bid_dimension,
ad_group.effective_target_cpa_micros,
ad_group.effective_target_cpa_source,
ad_group.effective_target_roas,
ad_group.effective_target_roas_source,
ad_group.id,
ad_group.labels,
ad_group.name,
ad_group.resource_name,
ad_group.status,
ad_group.target_cpa_micros,
ad_group.target_cpm_micros,
ad_group.target_roas,
ad_group.type,
metrics.absolute_top_impression_percentage,
metrics.active_view_cpm,
metrics.active_view_ctr,
metrics.active_view_impressions,
metrics.active_view_measurability,
metrics.active_view_measurable_cost_micros,
metrics.active_view_measurable_impressions,
metrics.active_view_viewability,
metrics.all_conversions,
metrics.all_conversions_by_conversion_date,
metrics.all_conversions_from_interactions_rate,
metrics.all_conversions_value,
metrics.all_conversions_value_by_conversion_date,
metrics.average_cost,
metrics.average_cpc,
metrics.average_cpe,
metrics.average_cpm,
metrics.average_cpv,
metrics.average_page_views,
metrics.average_time_on_site,
metrics.bounce_rate,
metrics.clicks,
metrics.conversions,
metrics.conversions_by_conversion_date,
metrics.conversions_from_interactions_rate,
metrics.conversions_value,
metrics.conversions_value_by_conversion_date,
metrics.cost_micros,
metrics.cost_per_all_conversions,
metrics.cost_per_conversion,
metrics.cost_per_current_model_attributed_conversion,
metrics.cross_device_conversions,
metrics.ctr,
metrics.current_model_attributed_conversions,
metrics.current_model_attributed_conversions_value,
metrics.engagement_rate,
metrics.engagements,
metrics.gmail_forwards,
metrics.gmail_saves,
metrics.gmail_secondary_clicks,
metrics.impressions,
metrics.interaction_event_types,
metrics.interaction_rate,
metrics.interactions,
metrics.percent_new_visitors,
metrics.phone_calls,
metrics.phone_impressions,
metrics.phone_through_rate,
metrics.search_absolute_top_impression_share,
metrics.search_budget_lost_absolute_top_impression_share,
metrics.search_budget_lost_top_impression_share,
metrics.search_exact_match_impression_share,
metrics.search_impression_share,
metrics.search_rank_lost_absolute_top_impression_share,
metrics.search_rank_lost_impression_share,
metrics.search_rank_lost_top_impression_share,
metrics.search_top_impression_share,
metrics.top_impression_percentage,
metrics.value_per_all_conversions,
metrics.value_per_all_conversions_by_conversion_date,
metrics.value_per_conversion,
metrics.value_per_conversions_by_conversion_date,
metrics.value_per_current_model_attributed_conversion,
metrics.video_quartile_p100_rate,
metrics.video_quartile_p25_rate,
metrics.video_quartile_p50_rate,
metrics.video_quartile_p75_rate,
metrics.video_view_rate,
metrics.video_views,
metrics.view_through_conversions
FROM ad_group WHERE segments.date >= '${startDate}' and segments.date <= '${endDate}'`,
});
//this query is used to get the next 10000 adGroups with the pageToken property
const dataWithNextPage = JSON.stringify({
pageSize: 10000,
query: `SELECT segments.date,
ad_group.ad_rotation_mode,
ad_group.base_ad_group,
ad_group.campaign,
ad_group.cpc_bid_micros,
ad_group.cpm_bid_micros,
ad_group.cpv_bid_micros,
ad_group.display_custom_bid_dimension,
ad_group.effective_target_cpa_micros,
ad_group.effective_target_cpa_source,
ad_group.effective_target_roas,
ad_group.effective_target_roas_source,
ad_group.id,
ad_group.labels,
ad_group.name,
ad_group.resource_name,
ad_group.status,
ad_group.target_cpa_micros,
ad_group.target_cpm_micros,
ad_group.target_roas,
ad_group.type,
metrics.absolute_top_impression_percentage,
metrics.active_view_cpm,
metrics.active_view_ctr,
metrics.active_view_impressions,
metrics.active_view_measurability,
metrics.active_view_measurable_cost_micros,
metrics.active_view_measurable_impressions,
metrics.active_view_viewability,
metrics.all_conversions,
metrics.all_conversions_by_conversion_date,
metrics.all_conversions_from_interactions_rate,
metrics.all_conversions_value,
metrics.all_conversions_value_by_conversion_date,
metrics.average_cost,
metrics.average_cpc,
metrics.average_cpe,
metrics.average_cpm,
metrics.average_cpv,
metrics.average_page_views,
metrics.average_time_on_site,
metrics.bounce_rate,
metrics.clicks,
metrics.conversions,
metrics.conversions_by_conversion_date,
metrics.conversions_from_interactions_rate,
metrics.conversions_value,
metrics.conversions_value_by_conversion_date,
metrics.cost_micros,
metrics.cost_per_all_conversions,
metrics.cost_per_conversion,
metrics.cost_per_current_model_attributed_conversion,
metrics.cross_device_conversions,
metrics.ctr,
metrics.current_model_attributed_conversions,
metrics.current_model_attributed_conversions_value,
metrics.engagement_rate,
metrics.engagements,
metrics.gmail_forwards,
metrics.gmail_saves,
metrics.gmail_secondary_clicks,
metrics.impressions,
metrics.interaction_event_types,
metrics.interaction_rate,
metrics.interactions,
metrics.percent_new_visitors,
metrics.phone_calls,
metrics.phone_impressions,
metrics.phone_through_rate,
metrics.search_absolute_top_impression_share,
metrics.search_budget_lost_absolute_top_impression_share,
metrics.search_budget_lost_top_impression_share,
metrics.search_exact_match_impression_share,
metrics.search_impression_share,
metrics.search_rank_lost_absolute_top_impression_share,
metrics.search_rank_lost_impression_share,
metrics.search_rank_lost_top_impression_share,
metrics.search_top_impression_share,
metrics.top_impression_percentage,
metrics.value_per_all_conversions,
metrics.value_per_all_conversions_by_conversion_date,
metrics.value_per_conversion,
metrics.value_per_conversions_by_conversion_date,
metrics.value_per_current_model_attributed_conversion,
metrics.video_quartile_p100_rate,
metrics.video_quartile_p25_rate,
metrics.video_quartile_p50_rate,
metrics.video_quartile_p75_rate,
metrics.video_view_rate,
metrics.video_views,
metrics.view_through_conversions
FROM ad_group WHERE segments.date >= '${startDate}' and segments.date <= '${endDate}'`,
pageToken: nextPageToken,
});
// if there's a nextPageToken, then we use that, if not, we use the normal query to get the first adGroup list
const data = nextPageToken ? dataWithNextPage : dataWithoutNextPage;
const config = {
method: "post",
url: clientConfig.dbUrl,
headers: {
"Content-Type": "application/json",
"developer-token": clientConfig.devToken,
"login-customer-id": clientConfig.managerId,
Authorization: `Bearer ${accessToken}`,
},
data: data,
};
//gets the google ads data and then returns it to the index.js script
const response = await axios(config);
const adGroups = response.data.results;
const nextPageTokenRes = response.data.nextPageToken;
console.log(`<< Ad groups obtained for ${account} account...>>`);
console.log(`<< Time range from ${startDate} to ${endDate}...>>`);
//A. here we get the adGroups, and second the nextPageToken, necessary to get the next 10000 adgroups
return [adGroups, nextPageTokenRes];
}
We are getting the response from the google Ads API, but when we compare that data with the data showed in Ad groups from the google UI there are missing ad groups in the google Ads API response. We identified more than 4000 missing ad groups.
The google UI and the Google Ads API are synchronized? Is this an error on our side? or is expected to have those differences between the google Ads API and the Google UI?