Ukratko: Izvještaji za Shopping i PMax pokazuju upit, ali skrivaju proizvod. Dodaj jedan URL parametar — {lpurl}?utm_content={product_id} — i unutar tjedna GA4 ti vraća umirovljeni izvještaj upit × proizvod spajanjem dimenzije sessionManualAdContent s sessionGoogleAdsQuery. Na stvarnom je računu otkrio da 85 % potrošnje prolazi kroz parove bez ijedne konverzije i da djelić od 0,25 % nosi cijeli račun uz ROAS od 46,8×.
Dodaj jedan URL parametar svojim Shopping i Performance Max kampanjama i, unutar tjedna, GA4 ti vraća izvještaj koji je Google tiho umirovio: svaki plaćeni klik uparen kao upit × proizvod — uz pridružene sesije, konverzije i prihod. Upravo se u tom uparivanju skriva novac — koji proizvodi vuku bezvrijedan promet, koji naslovi promašuju stvarnu potražnju, koji upiti troše proračun i nikad ne prodaju. Postavljanje je taj jedan parametar; ostatak ovog članka govori što ćeš s onim što ti se vrati.
Ako vodiš Shopping ili Performance Max kampanje, znaš za izvještaj o korisničkim upitima. Ono što možda nisi primijetio — jer ti Google nikad to ne kaže — jest ono što u njemu nedostaje: proizvod.
Vidiš da je netko pretražio “bežični usisavač do 200”. Vidiš klikove i trošak. Ne vidiš koji je od tvojih 5.000 proizvoda taj upit pokrenuo, na koji je vodio ni što je prodao.
Prije mnogo godina AdWords API ti je davao ovo uparivanje. Danas ti ga neće dati. A za e-commerce račun to nije kozmetička rupa — odnos upit-proizvod je mjesto na kojem živi prava optimizacija: podudaraju li se tvoji naslovi sa stvarnom potražnjom, koji proizvodi privlače bezvrijedan promet, zašto proizvod dobiva klikove, ali nikad ne konvertira.
Prije nego pitaš: ne, za ovo ne postoji nikakva postavka. Nema izvještaja, nema API polja, nema skripte koja bi to vratila s Googleove strane. Moraš to sam rekonstruirati — a rekonstrukcija je gotovo neugodno jednostavna.
Rješenje: jedan parametar, dvije GA4 dimenzije
Dodaj predložak za praćenje
Na svoje Shopping i PMax kampanje: {lpurl}?utm_content={product_id}. ValueTrack varijabla {product_id} šalje ID proizvoda iz Merchant Centra sa svakim klikom.
GA4 pohranjuje proizvod
UTM stiže u dimenziju Session manual ad content (sessionManualAdContent).
GA4 već zna upit
Auto-tagging (gclid) puni sessionGoogleAdsQuery u istoj sesiji.
Spoji dvije dimenzije
Svaki plaćeni klik postaje par upit × proizvod — uz pridružene sesije, stopu konverzije i prihod.
Auto-tagging i ručni UTM se ne sukobljavaju: gclid i dalje obrađuje izvor, medij i kampanju; tvoj UTM nosi samo ID proizvoda.
Znaj što dobivaš (i što ne dobivaš)
- Samo kliknuti upiti. Ovaj skup podataka počinje na kliku. Upiti za koje se tvoj oglas prikazao, ali nitko nije kliknuo nikad ne dolaze do GA4 — analiza na razini pojavljivanja ostaje u Googleovom standardnom izvještaju (bez proizvoda).
- ~20 % klikova neće se upariti: sesije s odbijenom privolom, PMax površine bez ikakvog upita (Display, YouTube, Gmail), klikovi koji nikad nisu okinuli analitiku.
- Vezano uz sesiju. Jedna sesija = jedan ID proizvoda — onaj kliknuti, čak i ako korisnik potom pregleda još deset drugih.
Izvlačenje izvještaja iz GA4
U sučelju: Explore → free form. Dimenzije: Session manual ad content + Session Google Ads query. Metrike: sesije, konverzije, prihod od kupnji. Filter: izvor/medij sesije = google / cpc.
Putem Data API-ja — za bilo što ozbiljno, ovo hrani dashboard ili BigQuery spajanje:
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
RunReportRequest, DateRange, Dimension, Metric, FilterExpression, Filter
)
request = RunReportRequest(
property=f"properties/{GA4_PROPERTY_ID}",
dimensions=[
Dimension(name="sessionManualAdContent"), # product ID
Dimension(name="sessionGoogleAdsQuery"), # search term
],
metrics=[
Metric(name="sessions"),
Metric(name="conversions"),
Metric(name="purchaseRevenue"),
],
date_ranges=[DateRange(start_date="30daysAgo", end_date="today")],
dimension_filter=FilterExpression(filter=Filter(
field_name="sessionSourceMedium",
string_filter=Filter.StringFilter(value="google / cpc"),
)),
)
Spoji sessionManualAdContent sa svojim product feedom (id → naslov, cijena, kategorija) i izvještaj je potpun: upit × proizvod × naslov × ekonomika.
Provjereno, ne teoretizirano
Postavili smo ovo na živi račun — češki trgovac elektronikom s 22 omogućene Shopping kampanje — i provjerili GA4 sedam dana kasnije:
GA4, 7 dana nakon postavljanja
- Redaka google/cpc prometa 9.753
- Nosi ID proizvoda (utm_content) 96 %
- Nosi upit za pretraživanje (sessionGoogleAdsQuery) 81 %
- Nosi oboje — funkcionalan izvještaj upit × proizvod 78 %
Sad zabavni dio: što ti govore parovi
1 · Praznina u naslovu
Stavi upite uz naslov i opis koje su pokrenuli. Nepodudarnost odmah upada u oči:
Roadmap za feed piše se sam od sebe. I tu AI obogaćivanje feeda prestaje biti skok vjere i postaje mjerljiva petlja: prepiši naslov oko potražnje koju si upravo dokazao, pa gledaj kako se CTR i stopa konverzije po upitu mijenjaju.
2 · Tko je još na “tvojem” upitu — i s kojim proizvodom
Jedno što ne možeš učiniti: dodati negativne ključne riječi po proizvodu. Google ti ne daje takvu polugu u Shoppingu ili PMaxu. Zato, kada par upit × proizvod podbaci, pitanje nije “kako da ga isključim” — nego “zašto podbacuje”.
Uzmi upit i dohvati stvarnu stranicu rezultata za njega. Konkretno: DataForSEO, endpoint serp/google/organic/live/advanced — jedan POST s tekstom upita i location_code-om tvojeg tržišta, i vraća ti cijelu stranicu rezultata kao strukturirani JSON: plaćeni oglasi, Shopping blokovi s imenima trgovaca i cijenama, organski ispod. Po ~0,0035 $ po upitu, provjera 200 upita košta oko 0,70 $.
Tipičan nalaz: tvoja vreća za spavanje srednje klase skuplja klikove na generičkom upitu — a isti upit prikazuje tri budget brenda u istoj kategoriji za upola tvoje cijene. Tvoj proizvod nije loš; on je nadigran cijenom u toj konkretnoj aukciji.
Sad imaš stvarne opcije: promijeni cijenu; gurni diferencijator u naslov (“punjenje paperjem, komfor −15 °C”); premjesti proizvod u kampanju čije licitiranje odgovara stvarnosti njegove marže; ili prihvati upit kao gornji dio lijevka i sudi mu po asistiranim metrikama umjesto po zadnjem kliku.
3 · Odluke o strukturi i licitiranju
Proizvodi koji privlače upite s visokom namjerom zaslužuju vlastite grupe elemenata i proračune. Proizvodi koji skupljaju samo generički promet pripadaju u catch-all grupe s konzervativnim ciljevima. Ovaj izvještaj je dokazna baza za segmentaciju Shoppinga — a ne osjećaj u trbuhu.
4 · Zdravstveni pregled za PMax
PMax ti ne govori gotovo ništa o pretraživanju. Ovaj izvještaj je najbliže što ćeš dobiti reviziji onoga što PMax zapravo kupuje za tebe na search površini — po proizvodu.
Gledaj me kako prolazim jedan stvarni izvoz, korak po korak
Sve gore je zašto. Evo kako to zapravo izgleda — svaki korak, što preuzimaš, u što buljiš, i stvaran broj koji se vrati.
Podaci su drugi račun: drugačiji srednje veliki češki e-shop (ne trgovac elektronikom iz GA4 okvira gore — koristim ga jer mu je katalog dovoljno širok da se svaki obrazac pokaže u punom opsegu). Povukao sam njegov sirovi izvještaj o korisničkim upitima za Shopping kroz Google Ads API u lokalnu SQLite tablicu i pokrenuo donje agregacije. Jedna napomena prije: ovaj sirovi izvještaj daje ti grupu oglasa / grupu proizvoda pod kojom je upit posluživan, ne pojedinačni proizvod. To je upravo rupa koju zatvara UTM trik — ali čak i na razini grupe proizvoda, međurezultati su dovoljno glasni da poentiraju.
Izvor za svaki broj u ovom odjeljku: Google Ads izvještaj o korisničkim upitima za Shopping, jedan srednje velik češki e-shop račun, ~22,6 mil. redaka, podaci povučeni u travnju 2026.
Korak 1 · Povuci sirovi izvještaj i izmjeri hrpu
Što radiš: izvezi izvještaj o korisničkim upitima za Shopping putem Google Ads API-ja (search_term_view) u lokalnu tablicu — SQLite ili BigQuery, bilo što na čemu možeš pokrenuti GROUP BY. Zašto baš prvo ovo: prije nego išta spojiš, moraš osjetiti koliko je velika i koliko bučna sirova hrpa. Ta jedna činjenica resetira svako očekivanje koje slijedi.
Pokreni običan COUNT(*) i par SUM-ova i evo što slijeće:
Sirova hrpa — jedan COUNT, tri SUM-a
- Redaka izvještaja (upit × grupa proizvoda) 22.640.716
- Različitih korisničkih upita 5.370.131
- Grupa proizvoda pod kojima su posluživani 10.393
- Potrošnja / prihod (kombinirani ROAS 6,8×) 2,57 mil. / 17,4 mil. CZK
Što imaš: 22,6 milijuna redaka, 5,4 milijuna jedinstvenih upita. To nijedan čovjek ne čita. Jedini posao tog broja jest da ti kaže sljedeći potez — sruši ovu hrpu po dimenziji koja plaća račune — i da te upozori da je svaka ručna trijaža red-po-red beznadna.
Korak 2 · Baci 96 % toga prije nego išta analiziraš
Što radiš: izbroji redove s nula klikova, pa ih izfiltriraj. Zašto: izvještaj o korisničkim upitima za Shopping bilježi svaki upit za koji se tvoj oglas prikazao, a većinu njih nitko nije kliknuo. Ti redovi samo s pojavljivanjima ne mogu te koštati ni konvertirati — to je šum koji čini tablicu zastrašujućom.
Situacija: 22,6 mil. redaka, ne znaš gdje početi. Akcija:
WHERE clicks > 0. Rezultat: tablica se ruši na 738.444 redaka — savladiva veličina.
Poplava pojavljivanja
- Redaka s nula klikova (čista pojavljivanja) 21.902.272 — 96,7 %
- Redaka koji su ikad koštali ijednu krunu 738.444 — 3,3 %
Što imaš: 96,7 % zastrašujućeg broja nikad nije bilo ništa drugo nego šum. Sad radiš s tablicom od 738 tis. redaka, ne 22,6 mil. — i svaka donja agregacija vrti se na onom dijelu koji zapravo troši novac.
Korak 3 · Postavi jedno pitanje koje preokreće cijeli račun
Što radiš: na kliknutim redovima podijeli potrošnju na “konvertirao barem jednom” naspram “nikad nije konvertirao” i zbroji trošak svake skupine. Zašto: ovo je broj koji “račun je u redu, ROAS je 6,8” pretvara u “većina proračuna ne radi ništa”. To je glavni međurezultat — izračunaj ga prije bilo koje ideje o optimizaciji.
Teret nula konverzija
- Redaka izvještaja koji su konvertirali nula puta 99,75 %
- Udio ukupne potrošnje koji su ti redovi pojeli 85,5 %
- Potrošnja bez ijedne konverzije iza sebe 2,20 mil. CZK (~88 tis. €)
- Od samo kliknutih redaka, udio s nula konverzija 92,3 %
Što imaš: 85 % proračuna proteklo je kroz kombinacije upit × grupa proizvoda koje nikad nisu konvertirale. To nije pogreška zaokruživanja koju optimiziraš kasnije — to je glavni događaj. A vidio si to samo zato što si srušio upit do onoga protiv čega je prodavan.
Korak 4 · Provjeri je li rasipanje nekoliko negativaca ili cijela gomila
Što radiš: sortiraj kliknute redove po trošku, uzmi gornjih 1 % i gornjih 10 % i pogledaj koliko ukupne potrošnje drže. Zašto: to odlučuje tvoju taktiku. Ako šačica pojmova spaljuje proračun, pauziraš ih i gotov si. Ako je rasipanje razmazano tanko, pauziranje pojmova je besmisleno — trebaju ti strukturalni popravci.
Gdje rasipana potrošnja zapravo sjedi
- Gornjih 1 % kliknutih redaka po trošku 10,5 % potrošnje
- Gornjih 10 % kliknutih redaka po trošku 29,8 % potrošnje
Što imaš: teret je dugorepi, ne nekoliko prijestupnika — gornji 1 % skupih redaka drži jedva desetinu potrošnje. Dakle, pauziranje 20 loših pojmova ne mijenja ništa. Ovo je podacima potkrijepljen razlog da popravljaš strukturu (koji proizvodi sjede u kojoj kampanji s kojim ciljem) umjesto da juriš pojedinačne upite — i podsjetnik da ti Google ionako neće ni dopustiti dodavanje negativne ključne riječi po proizvodu.
Korak 5 · Otkrij zašto dugi rep curi: jedan upit, mnogo proizvoda
Što radiš: za svaki korisnički upit izbroji kroz koliko je različitih grupa proizvoda posluživan. Zašto: to mehanički objašnjava rasipanje. Shopping uparuje upit sa signalima cijelog tvojeg feeda, a ne s relevantnošću jednog proizvoda — pa jedan upit curi po nepovezanim kutovima tvojeg kataloga, a ti plaćaš svaki promašaj.
Situacija: “uređaj protiv laveža” stalno spaljuje proračun. Akcija:
COUNT(DISTINCT ad_group)za taj pojam. Rezultat: posluživan je pod 139 različitih grupa oglasa / proizvoda za 976 CZK i ~0 konverzija. “lego technic” dotaknuo je 300.
Raspršivanje upita po katalogu
- Različitih pojmova posluživanih pod više od jedne grupe proizvoda 46,7 %
- Najviše grupa proizvoda koje je jedan upit dosegao 6.661
- "uređaj protiv laveža" → grupe / trošak / konverzije 139 / 976 CZK / ~0
Što imaš: gotovo polovica tvojih upita razmazana je po više grupa proizvoda, a najgori prijestupnici dosežu tisuće. To je motor tereta nula konverzija iz Koraka 3 — i upravo ono što napokon možeš vidjeti kad svaki klik nosi svoj ID proizvoda.
Korak 6 · Pogledaj najgore nepodudarnosti — apsurdne su
Što radiš: izvuci redove s najvišim troškom koji nikad nisu konvertirali i pročitaj upit uz grupu proizvoda protiv koje je prodavan. Zašto: agregatne brojke uvjeravaju tvoju tablicu; ova tri reda uvjeravaju tvojeg šefa. Oni su čovjeku čitljivo lice Koraka 5.
| Korisnički upit | Posluživan pod grupom proizvoda | Klikovi | Trošak | Konv. |
|---|---|---|---|---|
| ovratnik za dresuru psa | Torbe | 97 | 270 CZK | 0 |
| uređaj protiv laveža | Proizvodi za bebe | 76 | 239 CZK | 0 |
| lego technic | Rasvjeta | 70 | 169 CZK | 0 |
Upit za ovratnik za dresuru psa plaćen pod tvojom grupom Torbe. Uređaj protiv laveža prodavan protiv Proizvoda za bebe. Grupa proizvoda nema nikakve veze s upitom — Google se uparivao na širokim signalima feeda, skupio klik i naplatio ti ga. Uz upit × proizvod ovo vidiš na prvi pogled; uz Googleov standardni izvještaj nikad nećeš. (Ilustrativni primjer — kategorije prevedene i anonimizirane.)
Korak 7 · Sad nagrada: 0,25 % koji plaća cijeli račun
Što radiš: invertiraj Korak 3 — izoliraj samo redove koji jesu konvertirali i zbroji njihov trošak i prihod. Zašto: ovo je razlog zašto je cijela vježba bitna. Kada jednom možeš odvojiti pobjednike od tereta, štitiš pobjednike i izgladnjuješ ostatak.
Djelić koji zarađuje svoj kruh
- Redaka koji su konvertirali (udio svih redaka) 57.209 — 0,25 %
- Koliko su koštali 372 tis. CZK (~14,9 tis. €)
- Koliko su vratili 17,4 mil. CZK (~697 tis. €)
- ROAS na tom djeliću 46,8×
Što imaš: četvrtina jednog posto redaka radi uz 46,8× ROAS i praktički nosi cijeli račun; ostalih 99,75 % vuče kombiniranu brojku dolje na 6,8×. Pronaći taj djelić, zaštititi mu proračun i strukturirati sve ostalo dalje od njega — to je cijeli posao — i ništa od toga nije moguće dok svaki redak ne nosi proizvod protiv kojeg je prodavan. To ti kupuje UTM s jednim parametrom s vrha ovog članka.
Predložak + tri zamke
{lpurl}?utm_content={product_id}- Nemoj stavljati prilagođeni parametar u utm_campaign. Google Ads sanitizira vrijednosti prilagođenih parametara — imena tvojih kampanja se prepisuju i puca GA4 povijesni kontinuitet. Šalji samo
utm_content; auto-tagging obavlja ostalo. - Primijeni samo na OMOGUĆENE Shopping + PMax kampanje. Searchu ne treba; pauzirane kampanje samo zagađuju tvoju povijest izmjena.
- API caka: postavljaš programatski? Nedavne verzije Google Ads API-ja izbacile su
client.get_type(“FieldMask”)— umjesto toga uvezifield_mask_pb2.FieldMask.
FAQ
Radi li ovo za Performance Max?
Da, za search/shopping površinu. Klikovi s Displaya, YouTubea i Gmaila nose ID proizvoda, ali ne i upit — očekuj da će ti redovi imati praznu dimenziju upita.
Hoće li UTM pokvariti moju GA4 atribuciju?
Ne. Auto-tagging (gclid) i dalje obrađuje izvor/medij/kampanju; ti samo dodaješ ad content. Ono što bi pokvarilo stvari jest prilagođeni parametar unutar utm_campaign — to nemoj raditi.
Zašto samo 78 % pokrivenosti?
Consent mode, PMax površine bez upita i blokatori analitike pojedu ostatak. 78 % je sasvim dovoljno za svaki gornji slučaj uporabe — čitaš obrasce, ne revidiraš svaku lipu.
Mogu li vidjeti upite za koje se moj oglas prikazao, ali nitko nije kliknuo?
Ne. Ovaj skup podataka počinje na kliku. Analiza na razini pojavljivanja ostaje u standardnom izvještaju o korisničkim upitima — bez proizvoda.
Radi li ovaj obrazac izvan Googlea — Bing, Sklik?
Da, prenosiv je: bilo koja platforma s URL predloškom, makronaredbom za proizvod i dimenzijom analitike koja će je uhvatiti. Konkretne se makronaredbe razlikuju po platformi.
Koliko dugo dok ne dobijem upotrebljive podatke?
Ovisi o volumenu. Naš je račun imao upotrebljiv izvještaj za 7 dana; manji bi računi trebali prikupljati 30.