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 devet 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 devet 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.
| Nivo pristupa | Dnevne operacije, produkcioni nalozi | Dnevne operacije, test nalozi |
|---|---|---|
| Explorer | 2.880 | 15.000 |
| Basic | 15.000 | 15.000 |
Ceo moj noćni reporting za svih devet klijentskih naloga radi na Explorer nivou - svaki upit iznad na njemu prolazi bez problema. Po mom iskustvu, prelazak na Basic Access uglavnom otključava alate za planiranje kao što je Keyword Planner, ne same reporting resurse; ceo proces prijave, uključujući brzu prijavu od jula 2026, 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?▼
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, developer tokeni i zamka od 7 dana kod refresh tokena.
Google Ads API Basic Access Vodič
Kako da vam odobre developer token, uključujući brzu prijavu od jula 2026.
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 video audit
Dobijte personalizovani video audit vašeg Google Ads naloga
Snimićemo 15-minutni pregled vaših kampanja gde pokazujemo tačno gde gubite novac i šta bi prvi popravili.
Besplatni personalizovani video audit
Želite video pregled vašeg Google Ads naloga?
Lično ću snimiti 15-minutni video u kome prolazim kroz vaše kampanje, pokazujem gde gubite novac i dajem 3 konkretne stvari za popravku odmah. Bez prodaje - samo vrednost.
Šta dobijate:
- 15-min personalizovana video analiza
- 3 konkretna quick wins za implementaciju
- Preporuke za budžet i bidding
Uslovi:
- Ad spend: €1.500+/mesečno
- Aktivan nalog minimum 3 meseca
- eCommerce ili Lead Gen biznis
Ograničeno na 5 audita mesečno. Odgovor u roku od 48h.