Google Ads model

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
  1. 5
    Raw tables
  2. 5
    Staging
  3. 1
    Core
  4. 1
    Analytics
Reads from Google Ads
accountadad_groupad_statscampaign
Ships as
Weld and dbt SQL, open source on GitHub
core.google_ads.ad_performance_daily
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().

Notes

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

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.