Ukratko
GAQL izgleda kao SQL - SELECT, FROM, WHERE, ORDER BY, LIMIT - ali SQL nije, i ta razlika ujede čim prvi put napišete upit koji meša nekompatibilan metric i segment. Nema JOIN-a, nema subquery-ja, i resurs u vašoj FROM klauzuli određuje koje metrics i segments uopšte smete da tražite. Ako pogrešite kombinaciju, zahtev pada na validaciji.
12
gotovih upita za izveštaje, spremnih za copy-paste ispod
5
klauzula koje ćete stvarno koristiti (SELECT/FROM/WHERE/ORDER BY/LIMIT)
1
operacija se naplaćuje po search() ili searchStream() pozivu, bez obzira na broj redova
20.000
maksimalan broj stavki u jednoj IN klauzuli
Brz odgovor
GAQL (Google Ads Query Language) je sintaksa kojom se obraćate metodi GoogleAdsService.search() ili searchStream() da izvučete reporting podatke iz API-ja. Upit ima do pet klauzula - SELECT, FROM, WHERE, ORDER BY, LIMIT - a svako polje koje selektujete spada u jednu od četiri kategorije: atribut resursa (campaign.id), atribut pridruženog resursa koji stiže kroz implicitni join (ad_group.name dok vam je FROM ad_group_ad), metric (metrics.clicks) ili segment (segments.date). Svaki metric ne može se spariti sa svakim segmentom ili svakim resursom - Google-ov Query Validator postoji baš zato što ta kompatibilnost nije očigledna samo iz imena polja.
Svakog jutra, pre nego što sednem za sto, skript izvuče GAQL izveštaje za 27 klijentskih naloga - trošenje, search terms, konverzije, učinak asseta. Ništa od toga ne radi dok auth lanac najpre ne proradi, a to sam pokrio u vodiču za autentifikaciju. Ako vam google-ads.yaml i OAuth tok još nisu podešeni, krenite tamo - ovaj tekst nastavlja tačno tamo gde se onaj završava, sa konekcijom koja radi i bez ideje šta zapravo da je pitate.
Ovo je deo koji vam niko ne da kao podsetnik: anatomija GAQL upita, kad koristiti search() a kad searchStream(), dvanaest upita za izveštaje izvučenih direktno iz mojih sopstvenih skriptova za nadzor naloga, i zamke zbog kojih upit naizgled radi kako treba, ali vrati pogrešnu stvar - ili se uopšte ne validira.
Anatomija GAQL upita
Prema Google-ovom pregledu jezika upita, GAQL podržava pet klauzula: SELECT, FROM, WHERE, ORDER BY i LIMIT (plus opciona PARAMETERS klauzula za rubne slučajeve). Obavezni su samo SELECT i FROM - upit nad GoogleAdsFieldService-om, kojim pregledate metapodatke o poljima, izbacuje čak i FROM i zadržava samo SELECT i WHERE.
Svako polje koje stavite u SELECT pripada jednoj od četiri kategorije, i ta kategorija određuje sa čim smete da ga kombinujete:
| Tip polja | Primer | Šta je to |
|---|---|---|
| Atribut resursa | campaign.id, campaign.name | Direktno svojstvo resursa iz vaše FROM klauzule |
| Pridruženi resurs | ad_group.name dok je FROM ad_group_ad | Resurs implicitno pridružen glavnom - njegovi atributi su dostupni za SELECT bez pisanja JOIN-a |
| Metric | metrics.impressions, metrics.cost_micros | Merenje učinka |
| Segment | segments.date, segments.device | Dimenzija za grupisanje - dodate je uz metrics i ti metrics se dele po segmentu (više redova) |
Jedna laka greška: atribut resursa na samom FROM resursu stigne "besplatno" čim selektujete bilo šta sa njega, ali atribut pridruženog resursa - recimo ad_group.name kad vam je FROM campaign - morate selektovati eksplicitno, ili ga naprosto neće biti u odgovoru.
WHERE podržava duži spisak operatora nego čist SQL. Prema referenci GAQL gramatike:
= != > >= < <= IN NOT IN
LIKE NOT LIKE
CONTAINS ANY CONTAINS ALL CONTAINS NONE
IS NULL IS NOT NULL
DURING BETWEEN
REGEXP_MATCH NOT REGEXP_MATCHLIKE radi samo na string poljima, ne na nizovima - za nizove koristite CONTAINS ANY/ALL/NONE. REGEXP_MATCH radi na RE2 sintaksi, a DURING ide uz fiksan skup literala za period, ne proizvoljnu računicu sa datumima:
LAST_7_DAYS LAST_14_DAYS LAST_30_DAYS LAST_BUSINESS_WEEK
LAST_MONTH LAST_WEEK_MON_SUN LAST_WEEK_SUN_SAT
THIS_MONTH THIS_WEEK_MON_TODAY THIS_WEEK_SUN_TODAY
TODAY YESTERDAYORDER BY uzima ime polja sa opcionim ASC ili DESC, a LIMIT pozitivan ceo broj. Oba su opciona, ali svaki upit za izveštaj ispod koristi bar jedno - Google-ova dokumentacija preporučuje da selektujete samo polja koja vam zaista trebaju, i referencu polja vredi zapamtiti pre nego što napišete išta netrivijalno.
search() naspram searchStream() - koju kad koristiti
Obe metode izvršavaju isti GAQL i vraćaju iste GoogleAdsRow objekte, prema Google-ovom pregledu reportinga. Razlika je isključivo u tome kako odgovor stiže.
| search() | searchStream() | |
|---|---|---|
| Oblik odgovora | Paginiran - sami iterirate kroz next_page_token | Kontinuiran stream, paginacija ide automatski |
| Za šta je dobar | Manji setovi rezultata, ili kad hoćete eksplicitnu kontrolu nad paginacijom | Veliki setovi rezultata, manje koda za paginaciju da održavate |
| Cena po kvoti | 1 operacija po pozivu; dalji paginirani zahtevi na validan token se ne broje ponovo | 1 operacija ukupno, bez obzira koliko redova ili batch-eva stigne |
U mom sopstvenom steku, svaki modul u ppc_ops, noćnom skriptu koji prolazi kroz 27 klijentskih naloga, zove search(), ne searchStream(). Nalozi su u opsegu hiljada redova, ne miliona, pa eksplicitna kontrola paginacije ne košta ništa i kod ostaje jednostavniji za debug kad izveštaj stigne pogrešan. searchStream() se isplati tek kad skenirate ceo MCC odjednom i broj redova pređe u desetine hiljada - jedan poziv i dalje košta jednu operaciju u oba slučaja, što je detalj koji vredi zapamtiti kad planirate dnevnu kvotu.
12 GAQL izveštaja za copy-paste
Ovo su anonimizovani, radni upiti - većina izvučena direktno iz skriptova koji svako jutro rade nad živim klijentskim nalozima. Nekoliko je dole označeno kao standardni obrazac, a ne linija preuzeta iz konkretnog fajla. Zamenite periode i status filtere svojima.
1. Trošenje kampanje, poslednjih 30 dana
SELECT campaign.name, campaign.status, campaign.id,
segments.date, metrics.impressions, metrics.clicks,
metrics.cost_micros, metrics.conversions, metrics.conversions_value
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING LAST_30_DAYS2. Search terms izveštaj za period
SELECT search_term_view.search_term, search_term_view.status,
campaign.name, campaign.advertising_channel_type, ad_group.name,
metrics.impressions, metrics.clicks, metrics.cost_micros,
metrics.conversions, metrics.conversions_value
FROM search_term_view
WHERE segments.date BETWEEN '2026-01-01' AND '2026-01-31'3. Konverzije po danu, za praćenje pacing-a i trenda
SELECT campaign.id, segments.date,
metrics.cost_micros, metrics.impressions, metrics.clicks,
metrics.conversions, metrics.conversions_value
FROM campaign
WHERE segments.date BETWEEN '2026-01-01' AND '2026-03-31'Jedno povlačenje od 90 dana, koje posle lokalno sečem na prozore od 7/30 dana i prethodni period, umesto četiri odvojena poziva - API naplaćuje po pozivu, ne po redu.
4. Učinak ključnih reči sa Quality Score-om
SELECT
campaign.name,
ad_group.name,
ad_group_criterion.keyword.text,
ad_group_criterion.keyword.match_type,
ad_group_criterion.quality_info.quality_score,
ad_group_criterion.quality_info.creative_quality_score,
ad_group_criterion.quality_info.post_click_quality_score,
ad_group_criterion.quality_info.search_predicted_ctr,
metrics.cost_micros,
metrics.clicks,
metrics.impressions,
metrics.conversions,
metrics.conversions_value,
metrics.ctr,
metrics.search_impression_share
FROM keyword_view
WHERE campaign.status = 'ENABLED'
AND ad_group_criterion.status = 'ENABLED'
AND segments.date BETWEEN '2026-01-01' AND '2026-01-31'
AND metrics.cost_micros > 0
ORDER BY metrics.cost_micros DESCFilter metrics.cost_micros > 0 je namerni izbor - izbaci ključne reči bez trošenja iz Quality Score izveštaja, gde su šum, ne signal.
5. Učinak RSA asseta i ad strength
SELECT ad_group_ad.ad.id,
ad_group_ad.ad.type,
ad_group_ad.ad.responsive_search_ad.headlines,
ad_group_ad.ad.responsive_search_ad.descriptions,
ad_group_ad.ad_strength,
ad_group_ad.status,
ad_group_ad.policy_summary.approval_status,
ad_group_ad.policy_summary.policy_topic_entries,
ad_group.id, ad_group.name, ad_group.status,
campaign.id, campaign.name, campaign.status,
campaign.advertising_channel_type,
metrics.impressions, metrics.clicks, metrics.cost_micros,
metrics.conversions
FROM ad_group_ad
WHERE ad_group_ad.status != 'REMOVED'
AND campaign.status = 'ENABLED'
AND segments.date BETWEEN '2026-01-01' AND '2026-01-31'6. Ad strength asset group-a u PMax-u
SELECT asset_group.id, asset_group.name, asset_group.status,
asset_group.ad_strength, campaign.name, campaign.status
FROM asset_group
WHERE asset_group.status != 'REMOVED' AND campaign.status = 'ENABLED'7. Audit podešenih conversion action-a
SELECT
conversion_action.id,
conversion_action.name,
conversion_action.type,
conversion_action.status,
conversion_action.category,
conversion_action.primary_for_goal,
conversion_action.counting_type,
conversion_action.attribution_model_settings.attribution_model,
conversion_action.value_settings.default_value,
conversion_action.value_settings.always_use_default_value
FROM conversion_action
WHERE conversion_action.status = 'ENABLED'
ORDER BY conversion_action.primary_for_goal DESCKorisna kao prva provera na svakom novom nalogu - primarni cilj, counting type i attribution model, u jednom pozivu, pre nego što dirnete Smart Bidding.
8. Change event log - trag ko je šta menjao
SELECT change_event.change_date_time,
change_event.change_resource_type,
change_event.change_resource_name,
change_event.client_type,
change_event.user_email,
change_event.changed_fields,
change_event.resource_change_operation,
change_event.old_resource,
change_event.new_resource,
campaign.name,
ad_group.name
FROM change_event
WHERE change_event.change_date_time >= '2026-08-01 00:00:00'
AND change_event.change_date_time <= '2026-08-29 23:59:59'
ORDER BY change_event.change_date_time DESC
LIMIT 1000change_event je resurs gde ni filter po datumu ni LIMIT nisu opcioni, i oba imaju čvrst plafon - period ne sme ići više od 30 dana unazad, a LIMIT ne sme preći 10.000. Vidite zamku ispod.
9. Ciljna vrednost na portfolio (deljenim) bidding strategijama
SELECT bidding_strategy.id,
bidding_strategy.name,
bidding_strategy.type,
bidding_strategy.status,
bidding_strategy.campaign_count,
bidding_strategy.maximize_conversion_value.target_roas,
bidding_strategy.target_roas.target_roas,
bidding_strategy.target_cpa.target_cpa_micros,
bidding_strategy.maximize_conversions.target_cpa_micros
FROM bidding_strategyPortfolio strategija je mesto gde se cilj najčešće "sakrije" - polje na samoj kampanji dođe prazno, pa je ovo resurs koji ga zaista nosi.
10. Učinak Shopping-a i proizvoda
SELECT segments.product_title, metrics.impressions, metrics.clicks,
metrics.cost_micros, metrics.conversions, metrics.conversions_value
FROM shopping_performance_view
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.cost_micros DESC11. Asseti na nivou naloga (sitelinks, callouts)
SELECT customer_asset.field_type, customer_asset.status,
asset.id, asset.type
FROM customer_asset
WHERE customer_asset.status != 'REMOVED'Proverite ovo pre nego što obeležite "kampanja nema sitelinkove" - asset na nivou naloga se pojavi na svakoj kampanji koja nema sopstveni, i preskakanje ovog upita pravi lažan nalaz.
12. Pacing budžeta (standardan obrazac)
SELECT campaign.id, campaign.name,
campaign_budget.amount_micros,
campaign_budget.delivery_method,
metrics.cost_micros
FROM campaign
WHERE campaign.status = 'ENABLED'
AND segments.date DURING THIS_MONTHOvaj je standardan obrazac, ne linija preuzeta iz konkretnog skripta - sopstvenu pacing računicu gradite na amount_micros naspram cost_micros od početka meseca.
Zamke: metrics/segments, redovi bez impresija, micros
Šta stvarno saseca ljude u produkciji
- Kompatibilnost metric/segment nije univerzalna. Ne može se svaki segment spariti sa svakim metric-om, i neslaganje pada na validaciji, ne tiho. Novi oblik upita provucite kroz Query Validator pre nego što ode u produkciju.
- Odbijen zahtev se i dalje računa u kvotu. Google-ova dokumentacija o kvotama ne pravi izuzetak za neuspelu validaciju - upit koji nikad ne vrati nijedan red i dalje potroši jednu operaciju iz dnevnog limita, pa nove oblike upita testirajte lokalno kroz Query Validator, ne pokušajima na živom nalogu.
- Redovi bez impresija su normalni, ne bag.
keyword_viewi slični resursi mirno vraćaju redove sa nula klikova i nula impresija. Ako izveštaj treba da pokaže samo aktivne stavke, filtrirajte eksplicitno -metrics.cost_micros > 0ilimetrics.impressions > 0. - Svako novčano polje je u micros.
cost_micros,cpc_bid_micros,target_cpa_micros- podelite sa 1.000.000 za stvarni iznos u valuti. Moj sopstveni reporting kod to radi svuda:cost = cost_micros / 1_000_000. change_eventtraži i filter po datumu i LIMIT, i oba imaju plafon. Period ne sme preći 30 dana unazad, a LIMIT ne sme preći 10.000. Izostavite bilo koji od ta dva uslova, ili pređite bilo koji plafon, i upit pada na validaciji - nije opciono kao kod većine drugih resursa. Vidite Google-ovu dokumentaciju za change_event.- IN klauzula staje na 20.000 stavki, prema dokumentaciji o kvotama. Duže liste ID-jeva podelite na više poziva.
- gRPC odgovor je ograničen na 64 MB, takođe prema dokumentaciji o kvotama. Za veliko povlačenje, selektujte manje polja ili pređite na
searchStream(), umesto da pretpostavite da će jedan ogroman upit proraditi sam od sebe. - Konfiguracioni resursi nemaju metrics. Account Budget, Ad, Billing Setup i slični resursi ne mogu se kombinovati sa
metrics.*poljima - oni opisuju podešavanje, ne učinak. Query Validator deli resurse na te dve grupe ako želite da proverite unapred.
Query Validator - proverite pre nego što pustite u rad
Google objavljuje Query Validator / Query Builder koji proverava kompatibilnost segmenta, metric-a i resursa pre nego što uopšte pošaljete zahtev. Resursi se dele u dve grupe - one sa metrics i one bez - i alat uhvati nevalidnu kombinaciju segment-metric pre nego što postane runtime greška u skriptu koji radi bez nadzora usred noći. Vredi jednom provući svaki novi oblik upita kroz njega, pogotovo pre nego što ode u zakazan posao.
Limiti i kvote
Prema Google-ovoj dokumentaciji o kvotama, zahtev search ili searchStream se računa kao tačno jedna operacija u vašu dnevnu kvotu operacija - bez obzira koliko redova ili streaming batch-eva stigne. Paginirani zahtevi koji nastavljaju na validan page token se ne broje ponovo. Pređete kvotu i dobijate RESOURCE_EXHAUSTED.
Promena od 9. septembra 2026.
Google je tog datuma ukinuo developer tokene. Nivo pristupa sad nosi Google Cloud projekat iz kog dolaze OAuth kredencijali, a ne token - stari developer token se i dalje može poslati u pozivu, ali API ga ignoriše. Limiti u tabeli ispod ostaju isti, samo se dodela nivoa promenila.
| Nivo pristupa | Dnevne operacije, produkcioni nalozi | Dnevne operacije, test nalozi |
|---|---|---|
| Explorer | 2.880 | 15.000 |
| Basic | 15.000 | 15.000 |
Godinu dana je moj noćni reporting za svih 27 klijentskih naloga radio na Explorer nivou - svaki upit iz ovog teksta prolazi bez problema i na njemu. Od septembra 2026. sam prešao na Basic Access, pa je ovo sad potvrđeno iskustvo, ne pretpostavka: Basic je otključao Keyword Planner (GenerateKeywordIdeas, GenerateKeywordHistoricalMetrics), dok su reporting upiti iz ovog vodiča radili identično i pre prelaska, na Explorer nivou. Ako se pitate da li vam Basic uopšte treba samo zbog GAQL izveštavanja - ne treba; treba vam tek kad posegnete za planiranjem. Ceo proces prijave opisao sam u vodiču za Basic Access.
Često postavljena pitanja
Šta je GAQL, i da li je to isto što i SQL?▼
ad_group.name dok upitujete ad_group_ad, a da pritom sami ne pišete join. Ima i duži spisak WHERE operatora nego čist SQL, uključujući CONTAINS ANY/ALL/NONE i DURING za fiksne literale perioda.Kad da koristim search() umesto searchStream()?▼
search() kad je set rezultata mali do umeren ili hoćete eksplicitnu kontrolu nad paginacijom - svaki modul u mom sopstvenom steku za nadzor naloga to radi, jer su nalozi u pitanju u hiljadama redova, ne milionima. Koristite searchStream() za veća povlačenja gde ne biste ručno pisali iteraciju kroz page token. Obe se računaju kao jedna operacija u dnevnu kvotu po pozivu, bez obzira koliko redova stigne.Zašto mi GAQL izveštaj vraća redove sa nula impresija i nula troška?▼
keyword_view vraćaju svaki red koji odgovara upitu, uključujući one bez ikakve aktivnosti u periodu. Ako hoćete samo redove koji su stvarno trošili ili se prikazivali, dodajte eksplicitan filter u WHERE, na primer metrics.cost_micros > 0 ili metrics.impressions > 0.Šta znači nastavak "_micros" na poljima kao cost_micros?▼
cost_micros, cpc_bid_micros, target_cpa_micros i slična - izraženo je u micros, fiksnoj jedinici jednakoj jednom milionitom delu valute naloga. Podelite sa 1.000.000 da dobijete stvarni iznos. Lako se propusti prvi put, i onda prijavite trošak koji je pogrešan za šest redova veličine.Da li mi treba Basic Access za GAQL izveštaje, ili Explorer pristup pokriva to?▼
KeywordPlanIdeaService (GenerateKeywordIdeas vraća keyword ideje sa mesečnim volumenom, nivoom konkurencije i rasponom cene klika) i GenerateKeywordHistoricalMetrics za istorijski volumen 12 meseci unazad. ReachPlanService ostaje blokiran i na Basic nivou - to je zaseban allowlist. Ceo proces prijave je u vodiču za Basic Access.Hoćete ovakve izveštaje da rade nad vašim nalozima?
Gradim i vodim tačno ovaj GAQL reporting sloj za klijentske naloge - trošenje, search terms, Quality Score, učinak asseta, pacing budžeta - na vrhu ispravno podešene Google Ads API konekcije.
Zakažite besplatnu konsultacijuGoogle Ads Konsultacije
Jednokratni audit ili tekuća saradnja na strategiji.
Google Ads Upravljanje
Kompletno vođenje naloga, uključujući nadzor preko API-ja.
Google Ads API Vodič za Autentifikaciju
OAuth2 tok, Cloud projekat kao nosilac pristupa i zamka od 7 dana kod refresh tokena.
Google Ads API Basic Access Vodič
Četiri nivoa pristupa i kako se danas dodeljuju preko Google Cloud projekta, ne developer tokena.
Google API Pristupi za Agencije
Jedan Cloud projekat, šest API-ja: Ads, GA4, Search Console, GTM i drugi.
Offline Conversion Import za B2B
Kako zatvorene poslove vraćate nazad u Google Ads, na istom API-ju.
Besplatni alati
Proverite nalog sami, bez ostavljanja emaila
Cetiri alata koja rade u pretrazivacu: provera Performance Max kampanje kroz 38 tacaka, budzet kalkulator, GA4 audience framework i checklista za audit naloga.
Besplatni alati, bez forme
Alati koje sam napravio za sopstvene naloge
Napravio sam ih zato sto su mi trebali u radu na nalozima. Rade u pretrazivacu, ne traze email i pokazuju ceo rezultat odmah.
PMax Check
38 tacaka provere, ponderisan skor po grupi
Budzet kalkulator
koliko nalogu treba po fazi
GA4 audience framework
25 lista, 6 stubova
Audit checklista
50 stavki za prolaz kroz nalog
