Ad performance daily
Daily delivery and conversions per ad, the Google Ads "Ads" view by day.
- Grain
- date_day x account_id x ad_id (ad_group_id is carried in the key as well, because Google identifies an ad by ad group and ad ID together)
- Built from
- 5Raw tables
- 5Staging
- 1Core
- 1Analytics
- Reads from Google Ads
- accountadad_groupad_statscampaign
- Ships as
- Weld and dbt SQL, open source on GitHub
1-- core.google_ads.ad_performance_daily
2-- Daily delivery and conversions per ad, the Google Ads "Ads" view by day.
3--
4-- Grain: date_day x account_id x ad_id (ad_group_id is carried in the key as
5-- well, because Google identifies an ad by ad group and ad ID together).
6-- Currency: the account's. Depends on: staging.google_ads.ad_stats, .ad,
7-- .ad_group, .campaign, .account
8--
9-- The leading columns follow the cross-channel ad contract shared with the other
10-- paid ads templates in this repo, so the models can be stacked with UNION ALL.
11--
12-- conversions is Google's "Conversions" column: conversion actions marked as
13-- primary ("Include in Conversions"), each under its own attribution model and
14-- click-through window, dated on the day of the ad interaction. It can be
15-- fractional under data-driven attribution. conversion_value is the matching
16-- value. "All conversions" is not in the standard report; view-through
17-- conversions are carried separately and are not part of conversions.
18--
19-- Covers ads only. Performance Max, Smart and some App campaigns have no ad
20-- level rows, so this model sums to less than campaign_performance_daily for
21-- accounts that run them.
22
23WITH daily AS (
24 -- The report is split by device and ad network; collapse to one row per ad.
25 SELECT
26 date_day,
27 account_id,
28 campaign_id,
29 ad_group_id,
30 ad_id,
31 MAX(account_name) AS report_account_name,
32 MAX(campaign_name) AS report_campaign_name,
33 MAX(ad_group_name) AS report_ad_group_name,
34 MAX(ad_name) AS report_ad_name,
35 SUM(spend) AS spend,
36 SUM(impressions) AS impressions,
37 SUM(clicks) AS clicks,
38 SUM(interactions) AS interactions,
39 SUM(conversions) AS conversions,
40 SUM(conversion_value) AS conversion_value,This model and the 6 it depends on. Deploy them together; refs like {{staging.…}} resolve to the matching folders in Weld, and the dbt view uses source() and ref().
How it counts. And where it stops.
The leading columns follow the cross-channel ad contract shared with the other paid ads templates in this repo, so the models can be stacked with UNION ALL. conversions is Google's "Conversions" column: conversion actions marked as primary ("Include in Conversions"), each under its own attribution model and click-through window, dated on the day of the ad interaction. It can be fractional under data-driven attribution. conversion_value is the matching value. "All conversions" is not in the standard report; view-through conversions are carried separately and are not part of conversions. Covers ads only. Performance Max, Smart and some App campaigns have no ad level rows, so this model sums to less than campaign_performance_daily for accounts that run them.
Raw tables it reads
- raw.google_ads.account
- raw.google_ads.ad
- raw.google_ads.ad_group
- raw.google_ads.ad_stats
- raw.google_ads.campaign
More Google Ads models
Put Google Ads in front
of your agents.
Connect Google Ads, deploy the models, and ask questions in Claude, Cursor or ChatGPT. Free for 14 days, no credit card.