Djupdykning· Shopping & PMax · 13 min läsning

Shopping-sökfrågerapporten Google inte ger dig

Shopping- och PMax-rapporter visar sökfrågan men aldrig produkten. Bygg om sökfråga-×-produkt-rapporten med en URL-parameter och två GA4-dimensioner.

Illustration som parar en stapel sökfrågor med en enda produkt, den saknade länken Googles rapporter döljer.
De seriösa fakta är på riktigt — artikelomslagen är det inte.

Kort sagt: Shopping- och PMax-rapporter visar sökfrågan men döljer produkten. Lägg till en URL-parameter — {lpurl}?utm_content={product_id} — och inom en vecka räcker GA4 dig den avskaffade sökfråga × produkt- rapporten genom att joina sessionManualAdContent med sessionGoogleAdsQuery. På ett verkligt konto avslöjade det att 85 % av utgifterna gick genom noll-konverterande par och att en skiva på 0,25 % bar hela kontot på 46,8× ROAS.

78 %
av klicken matchade sökfråga × produkt
22
kampanjer uppdaterade
1
URL-parameter — det är hela stacken
7 dagar
till verifierad data i GA4

Lägg till en URL-parameter på dina Shopping- och Performance Max-kampanjer och, inom en vecka, räcker GA4 dig rapporten Google i tysthet avskaffade: varje betalt klick parat som sökfråga × produkt — med sessioner, konverteringar och intäkt knutna till sig. Just det paret är där pengarna gömmer sig — vilka produkter som drar skräptrafik, vilka titlar som missar verklig efterfrågan, vilka sökfrågor som bränner budget och aldrig säljer. Bygget är den ena parametern; resten av den här artikeln är vad du gör med det som kommer tillbaka.

Om du kör Shopping- eller Performance Max-kampanjer känner du sökfrågerapporten. Vad du kanske inte lagt märke till — eftersom Google aldrig påpekar det — är vad som saknas i den: produkten.

Du ser att någon sökte på “sladdlös dammsugare under 2000”. Du ser klick och kostnad. Du ser inte vilken av dina 5 000 produkter den sökfrågan utlöste, landade på eller sålde.

För flera år sedan gav AdWords-API:et dig det här paret. Idag gör det inte det. Och för ett e-handelskonto är det inte ett kosmetiskt gap — sökfråga-till-produkt är där den verkliga optimeringen sitter: om dina titlar matchar verklig efterfrågan, vilka produkter som drar skräptrafik, varför en produkt får klick men aldrig konverterar.

Innan du frågar: nej, det finns ingen inställning för det här. Ingen rapport, inget API-fält, inget skript som hämtar tillbaka det från Googles sida. Du måste bygga om det själv — och ombygget är nästan pinsamt enkelt.

Fixen: en parameter, två GA4-dimensioner

Lägg till en spårningsmall

På dina Shopping- och PMax-kampanjer: {lpurl}?utm_content={product_id}. ValueTrack-variabeln {product_id} skickar Merchant Center-produkt-ID:t med varje klick.

GA4 lagrar produkten

UTM:en landar i dimensionen Session manual ad content (sessionManualAdContent).

GA4 känner redan sökfrågan

Auto-tagging (gclid) fyller sessionGoogleAdsQuery på samma session.

Joina de två dimensionerna

Varje betalt klick blir ett sökfråga × produkt-par — med sessioner, konverteringsfrekvens och intäkt knutna till sig.

Auto-tagging och den manuella UTM:en slåss inte mot varandra: gclid fortsätter hantera källa, medium och kampanj; din UTM bär bara produkt-ID:t.

Vet vad du får (och vad du inte får)

  • Bara klickade sökfrågor. Det här datasetet börjar vid klicket. Sökfrågor där din annons visades men ingen klickade når aldrig GA4 — analys på visningsnivå stannar i Googles standardrapport (utan produkter).
  • ~20 % av klicken paras inte ihop: consent-avvisade sessioner, PMax-ytor utan någon sökfråga alls (Display, YouTube, Gmail), klick som aldrig avfyrade analytics.
  • Session-scopad. En session = ett produkt-ID — det klickade, även om användaren sedan bläddrar genom tio andra.

Att dra ut rapporten ur GA4

I gränssnittet: Explore → free form. Dimensioner: Session manual ad content + Session Google Ads query. Mått: sessioner, konverteringar, köpintäkt. Filter: session source/medium = google / cpc.

Via Data API:t — för något seriöst matar det här en dashboard eller en BigQuery-join:

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"),
    )),
)

Joina sessionManualAdContent mot din product feed (id → titel, pris, kategori) och rapporten är komplett: sökfråga × produkt × titel × ekonomi.

Verifierat, inte teoretiserat

Vi rullade ut det här på ett live-konto — en tjeckisk elektronikåterförsäljare med 22 aktiverade Shopping-kampanjer — och kollade GA4 sju dagar senare:

GA4, 7 dagar efter utrullning

  • Rader google/cpc-trafik 9 753
  • Bar produkt-ID:t (utm_content) 96 %
  • Bar sökfrågan (sessionGoogleAdsQuery) 81 %
  • Bar bägge — en fungerande sökfråga × produkt-rapport 78 %

Nu den roliga delen: vad paren berättar för dig

1 · Titel-gapet

Sätt sökfrågorna bredvid titeln och beskrivningen de utlöste. Missmatchningen hoppar ut:

What people actually search
sladdlös dammsugare djurhårdammsugare för hundhår allergihusdjur dammsugare tystbästa dammsugare djurhår 2026
What the title says
Dammsugare X300 Turbo 2000W — EAN 8595…
Beskrivning: "Högkvalitativ dammsugare med modern design och rikt tillbehör."
The gap: Titeln säljer watt ingen söker på och missar djurhårs-användningsfallet alla söker på. (Illustrativt exempel.)

Feed-roadmappen skriver sig själv. Och det är här AI-feed-berikning slutar vara ett trossprång och blir en mätbar loop: skriv om titeln runt efterfrågan du just bevisade, och titta sedan på hur CTR och konverteringsfrekvens per sökfråga rör sig.

2 · Vem mer som är på “din” sökfråga — och med vilken produkt

En sak du inte kan göra: lägga till negativa sökord per produkt. Google ger dig ingen sådan spak i Shopping eller PMax. Så när ett sökfråga × produkt-par underpresterar är frågan inte “hur exkluderar jag det” — det är “varför underpresterar det”.

Ta sökfrågan och skrapa resultatsidan live för den. Konkret: DataForSEO, endpoint serp/google/organic/live/advanced — en POST med sökfrågetexten och location_code för din marknad, och du får tillbaka hela resultatsidan som strukturerad JSON: betalda annonser, shopping-block med handlarnamn och priser, organiskt under. Vid ~0,0035 $ per fråga kostar att kolla 200 sökfrågor ungefär 0,70 $.

Ett typiskt fynd: din mellanklass-sovsäck samlar klick på en generisk sökfråga — och samma sökfråga visar tre lågprismärken i samma kategori till halva ditt pris. Din produkt är inte dålig; den är utklassad på pris i just den auktionen.

Nu har du verkliga alternativ: prissätt om; tryck in det som särskiljer produkten i titeln (“dunfyllning, −15 °C komfort”); flytta produkten in i en kampanj med budgivning som matchar dess marginalverklighet; eller acceptera sökfrågan som toppen av tratten och bedöm den på assisterade mått i stället för sista klick.

3 · Struktur- och budgivningsbeslut

Produkter som drar högintents-sökfrågor förtjänar sina egna tillgångsgrupper och budgetar. Produkter som bara samlar generisk trafik hör hemma i uppsamlingsgrupper med konservativa mål. Den här rapporten är bevisunderlaget för shopping-segmentering — inte magkänsla.

4 · En hälsokontroll för PMax

PMax berättar nästan inget om search. Den här rapporten är det närmaste du kommer en granskning av vad PMax faktiskt köper åt dig på search-ytan — per produkt.

Följ med genom en verklig export, steg för steg

Allt ovan är varför. Här är hur det faktiskt ser ut — varje steg, vad du laddar ner, vad du stirrar på, och den verkliga siffran som kommer tillbaka.

Datan är ett andra konto: en annan medelstor tjeckisk e-butik (inte elektronikåterförsäljaren från GA4-rutan ovan — jag använder den för att dess katalog är bred nog att varje mönster syns i full skala). Jag drog dess råa Shopping-sökfrågerapport genom Google Ads API in i en lokal SQLite-tabell och körde aggregeringarna nedan. Ett förbehåll först: den här råa rapporten ger dig annonsgruppen / produktgruppen sökfrågan serverades under, inte den enskilda produkten. Det är precis gapet UTM-tricket sluter — men även på produktgruppsnivå är mellanresultaten tydliga nog för att göra poängen.

Källa för varje siffra i den här sektionen: Google Ads Shopping-sökfrågerapport, ett medelstort tjeckiskt e-butikskonto, ~22,6M rader, data dragen april 2026.

Steg 1 · Dra den råa rapporten och mät högen

Vad du gör: exportera Shopping-sökfrågerapporten via Google Ads API (search_term_view) in i en lokal tabell — SQLite eller BigQuery, vad du än kan köra GROUP BY på. Varför det här först: innan du joinar något behöver du känna hur stor och hur brusig den råa högen är. Det enda faktumet återställer varje förväntning som följer.

Kör ett enkelt COUNT(*) och ett par SUM:ar och det här landar:

Den råa högen — ett COUNT, tre SUM:ar

  • Rapportrader (sökfråga × produktgrupp) 22 640 716
  • Distinkta sökfrågor 5 370 131
  • Produktgrupper de serverades under 10 393
  • Utgift / intäkt (blandad ROAS 6,8×) 2,57M / 17,4M CZK

Vad du har: 22,6 miljoner rader, 5,4 miljoner unika sökfrågor. Ingen människa läser det. Siffrans enda jobb är att berätta nästa drag — kollapsa den här högen efter dimensionen som betalar räkningarna — och att varna dig att all manuell triage rad-för-rad är hopplös.

Steg 2 · Släng 96 % av den innan du analyserar något

Vad du gör: räkna raderna med noll klick, filtrera sedan bort dem. Varför: Shopping-sökfrågerapporten loggar varje sökfråga din annons visades för, varav de flesta ingen klickade på. Raderna med bara visningar kan inte kosta dig och kan inte konvertera — de är brus som får tabellen att se skrämmande ut.

Situation: 22,6M rader, du vet inte var du ska börja. Handling: WHERE clicks > 0. Resultat: tabellen kollapsar till 738 444 rader — en hanterbar storlek.

Visningsfloden

  • Rader med noll klick (rena visningar) 21 902 272 — 96,7 %
  • Rader som någonsin kostade en krona 738 444 — 3,3 %

Vad du har: 96,7 % av den skrämmande siffran var aldrig något annat än brus. Du jobbar nu en tabell på 738K rader, inte en på 22,6M — och varje aggregering nedan kör på den del som faktiskt spenderar pengar.

Steg 3 · Ställ den enda frågan som omformulerar kontot

Vad du gör: på de klickade raderna, dela utgiften i “konverterade minst en gång” vs “konverterade aldrig”, och summera kostnaden för var och en. Varför: det här är siffran som förvandlar “kontot är okej, ROAS är 6,8” till “större delen av budgeten gör inget”. Det är det viktigaste mellanresultatet — beräkna det före varje optimeringsidé.

Noll-konvertering-släpet

  • Rapportrader som konverterade noll gånger 99,75 %
  • Andel av total utgift de raderna åt 85,5 %
  • Utgift utan någon konvertering bakom sig 2,20M CZK (~88k €)
  • Av bara klickade rader, andel med noll konverteringar 92,3 %

Vad du har: 85 % av budgeten flöt genom sökfråga × produktgrupp-kombinationer som aldrig en enda gång konverterade. Det är inget avrundningsfel du optimerar senare — det är huvudnumret. Och du kunde bara se det för att du kollapsade sökfrågan ner till vad den såldes mot.

Steg 4 · Kolla om slöseriet är några få skurkar eller hela hopen

Vad du gör: sortera de klickade raderna efter kostnad, ta topp 1 % och topp 10 %, och se hur mycket av total utgift de håller. Varför: det här avgör din taktik. Om en handfull termer bränner budgeten pausar du dem och du är klar. Om slöseriet är tunt utspritt är att pausa termer meningslöst — du behöver strukturella fixar.

Var den slösade utgiften faktiskt sitter

  • Topp 1 % av klickade rader efter kostnad 10,5 % av utgiften
  • Topp 10 % av klickade rader efter kostnad 29,8 % av utgiften

Vad du har: släpet är långsvansat, inte några få bovar — topp 1 % av kostsamma rader håller knappt en tiondel av utgiften. Så att pausa 20 dåliga termer ändrar inget. Det här är det data-uppbackade skälet att fixa struktur (vilka produkter sitter i vilken kampanj på vilket mål) i stället för att jaga enskilda sökfrågor — och en påminnelse om att Google ändå inte ens låter dig lägga till en negativ per produkt.

Steg 5 · Ta reda på varför långsvansen läcker: en sökfråga, många produkter

Vad du gör: för varje sökfråga, räkna hur många distinkta produktgrupper den serverades under. Varför: det förklarar slöseriet mekaniskt. Shopping matchar en sökfråga mot din hela feeds signaler, inte mot en produkts relevans — så en enda sökfråga läcker över orelaterade hörn av din katalog, och du betalar för varje miss.

Situation: “antiskall-apparat” fortsätter bränna budget. Handling: COUNT(DISTINCT ad_group) för den termen. Resultat: den serverades under 139 olika annons- / produktgrupper för 976 CZK och ~0 konverteringar. “lego technic” rörde 300.

Sökfråge-spray över katalogen

  • Distinkta termer serverade under mer än en produktgrupp 46,7 %
  • Flest produktgrupper en enda sökfråga nådde 6 661
  • "antiskall-apparat" → grupper / kostnad / konverteringar 139 / 976 CZK / ~0

Vad du har: nästan hälften av dina sökfrågor är utsmetade över flera produktgrupper, och de värsta bovarna når tusentals. Det är motorn bakom noll-konvertering-släpet från steg 3 — och exakt det du äntligen kan se när varje klick bär sitt produkt-ID.

Steg 6 · Ögna de värsta missmatchningarna — de är absurda

Vad du gör: dra de kostsammaste raderna som aldrig konverterade och läs sökfrågan bredvid produktgruppen den såldes mot. Varför: de aggregerade siffrorna övertygar ditt kalkylark; de här tre raderna övertygar din chef. De är det mänskligt läsbara ansiktet av steg 5.

Kostsammaste noll-konvertering sökfråga × produktgrupp-par (översatta och anonymiserade; illustrativa av de verkliga raderna).
SökfrågaListad under produktgruppKlickKostnadKonv.
hundträningshalsbandHandväskor97270 CZK0
antiskall-apparatBabyprodukter76239 CZK0
lego technicBelysning70169 CZK0

En hundträningshalsband-sökfråga betalad för under din Handväskor-grupp. En antiskall-apparat såld mot Babyprodukter. Produktgruppen har inget med sökfrågan att göra — Google matchade på breda feed-signaler, samlade klicket, och debiterade dig. Med sökfråga × produkt ser du det här med en enda blick; med Googles standardrapport gör du det aldrig. (Illustrativt exempel — kategorier översatta och anonymiserade.)

Steg 7 · Nu utdelningen: de 0,25 % som betalar för hela kontot

Vad du gör: invertera steg 3 — isolera bara raderna som faktiskt konverterade och summera deras kostnad och intäkt. Varför: det här är skälet hela övningen spelar roll. När du väl kan skilja vinnarna från släpet skyddar du vinnarna och svälter resten.

Skivan som gör rätt för sig

  • Rader som konverterade (andel av alla rader) 57 209 — 0,25 %
  • Vad de kostade 372k CZK (~14,9k €)
  • Vad de gav tillbaka 17,4M CZK (~697k €)
  • ROAS på den skivan 46,8×

Vad du har: en kvarts procent av raderna kör på 46,8× ROAS och bär i praktiken kontot; de andra 99,75 % drar den blandade siffran ner till 6,8×. Att hitta den skivan, skydda dess budget, och strukturera allt annat bort från den är hela jobbet — och inget av det är möjligt förrän varje rad bär produkten den såldes mot. Det är vad UTM:en med en enda parameter högst upp i artikeln köper dig.

The part you can steal

Mallen + de tre fällorna

{lpurl}?utm_content={product_id}
  1. Lägg inte en custom-parameter i utm_campaign. Google Ads sanerar custom-parametervärden — dina kampanjnamn skrivs om och GA4:s historiska kontinuitet bryts. Skicka bara utm_content; auto-tagging hanterar resten.
  2. Applicera bara på AKTIVERADE Shopping- + PMax-kampanjer. Search behöver det inte; pausade kampanjer förorenar bara din ändringshistorik.
  3. API-fälla: rullar du ut det programmatiskt? Senare Google Ads API-versioner släppte client.get_type(“FieldMask”) — importera field_mask_pb2.FieldMask i stället.

FAQ

Funkar det här för Performance Max?

Ja, för search-/shopping-ytan. Display-, YouTube- och Gmail-klick bär produkt-ID:t men ingen sökfråga — räkna med att de raderna har en tom sökfråge-dimension.

Bryter UTM:en min GA4-attribution?

Nej. Auto-tagging (gclid) fortsätter hantera källa/medium/kampanj; du lägger bara till annonsinnehåll. Det som skulle bryta saker är en custom-parameter inuti utm_campaign — gör inte det.

Varför bara 78 % täckning?

Consent mode, sökfrågelösa PMax-ytor och analytics-blockerare äter resten. 78 % räcker gott för varje användningsfall ovan — du läser mönster, granskar inte ören.

Kan jag se sökfrågor min annons visades för men ingen klickade på?

Nej. Det här datasetet börjar vid klicket. Analys på visningsnivå stannar i standard-sökfrågerapporten — utan produkter.

Funkar mönstret utanför Google — Bing, Sklik?

Ja, det överförs: vilken plattform som helst med en URL-mall, ett produkt-makro och en analytics-dimension att fånga det i. De specifika makrona skiljer sig per plattform.

Hur lång tid tar det innan jag har användbar data?

Beror på volym. Vårt konto hade en användbar rapport på 7 dagar; mindre konton bör samla 30.

Hela poängen med det här

Vill du ha den här nivån av insyn i ditt konto?

Ett mejl. Jag säger dig ärligt om det är värt det för din uppsättning.

Hör av dig →