ETL Google Ads (MCC) → BigQuery → Notion daily report. Agency-level pipeline через MCC account access.
Why: агентський MCC покриває кілька клієнтів Deltamedical, центральне місце для daily KPI замість ручних Google Ads UI-перевірок.
Status:
Виконавчі скрипти живуть у /srv/projects/google-ads-crew/. Розклад і власники — у глобальному реєстрі крон у MEMORY.md.
Канонічне джерело даних: ad-analytics-hub.ad_data.* — Google Ads native BigQuery Data Transfer Service (BQDTS) export.
ad-analytics-hub (location: EU)ad-analytics-hub.ad_data191-068-9182 → 1910689182 (без дефісів, суфікс у назвах таблиць)ads_* (поточні) + 90+ p_ads_* (історичні partition'и)_DATA_DATE лагає 2 дні (Google standard для conversion-aware reporting), тобто 2026-05-11 → latest_date=2026-05-09/srv/passepartout/google/ad-pipeline-worker-sa.json (роль BigQuery Data Viewer + BigQuery User)p_ads_AgeRange, p_ads_AdGroupCriterion, p_ads_Keyword, p_ads_Ad, p_ads_ClickStats1872.6 MB | 3.6M rows | p_ads_AgeRange_1910689182
1458.5 MB | 8.6M rows | p_ads_AdGroupCriterion_1910689182
1437.6 MB | 5.5M rows | p_ads_Keyword_1910689182
1403.4 MB | 2.1M rows | p_ads_Ad_1910689182
1049.0 MB | 3.1M rows | p_ads_ClickStats_1910689182
883.9 MB | 3.1M rows | p_ads_AdGroupAdLabel_1910689182
759.5 MB | 1.6M rows | p_ads_ParentalStatus_1910689182
511.8 MB | 3.5M rows | p_ads_CampaignCriterion_1910689182
489.7 MB | 1.3M rows | p_ads_GeoStats_1910689182
402.1 MB | 853K rows | p_ads_SearchQueryStats_1910689182
393.9 MB | 780K rows | p_ads_Gender_1910689182
383.4 MB | 1.7M rows | p_ads_AdGroupBidModifier_1910689182
279.4 MB | 790K rows | p_ads_HourlyAdGroupStats_1910689182
201.4 MB | 496K rows | p_ads_KeywordStats_1910689182
187.1 MB | 372K rows | p_ads_AdGroupAudience_1910689182
ads_AccountBasicStats_<mcc_id> — daily KPI на рівні account (impressions, clicks, cost, conversions)ads_CampaignStats_<mcc_id> — campaign-level з усіма метрикамиads_AdGroupStats_<mcc_id> — ad-group рівеньads_Keyword_<mcc_id> + ads_KeywordStats_<mcc_id> — keywords + статистикаads_SearchQueryStats_<mcc_id> — search query reportsads_AgeRange*, ads_Gender*, ads_ParentalStatus* — демографіяads_GeoStats_<mcc_id> — географіяads_HourlyAdGroupStats_<mcc_id> — погодинна аналітикаads_ClickStats_<mcc_id> — click-level (для conversion attribution)ads_AdGroupAudience_<mcc_id> + *Stats — audience-based reportingads_*ConversionStats_<mcc_id> — conversions per dimensionsads_*CrossDeviceStats_<mcc_id> — cross-device atrybucjaПрефікс p_ads_* — це Google's partition-зliating версія для бекфілу і повної історії. Префікс ads_* — поточна active table.
from google.cloud import bigquery
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/srv/passepartout/google/ad-pipeline-worker-sa.json"
client = bigquery.Client(project="ad-analytics-hub")
q = "SELECT MAX(_DATA_DATE) AS latest FROM `ad-analytics-hub.ad_data.ads_CampaignBasicStats_1910689182`"
print(next(client.query(q).result()).latest)
# Очікуване: today - 2 days
Налаштовується через GCP Console (BQDTS API не дозволяє менеджмент з нашого SA через permissions):
ad_data191-068-9182 (наш MCC)Авторизація: робиться через GCP user-account який має Google Ads access (через Manager Account). Якщо потрібно перенаправити transfer — robi його під masterdigital@ (всі Google Ads under it).
/srv/passepartout/google/google-ads.yamldeveloper_token + client_id/client_secret + refresh_token (читай /srv/passepartout/google/google-ads-readonly-savchenko.key.meta для деталей)/srv/projects/google-ads-crew/ — pipeline + AI-crewmcc_report_downloader.py — downloaddaily_analyzer.py — Notion reportaudit_campaigns.py, landing_healthcheck.py, setup_google_ads_oauth.py — utility scriptsgoogle-ads.yaml шлях (потрібен Passepartout audit)