In breve: I report Shopping e PMax mostrano la query ma nascondono il prodotto. Aggiungi un parametro URL — {lpurl}?utm_content={product_id} — ed entro una settimana GA4 ti consegna il report ritirato query × prodotto unendo sessionManualAdContent con sessionGoogleAdsQuery. Su un account reale ha rivelato l'85% della spesa che scorreva in coppie a conversione zero e una fetta dello 0,25% che reggeva l'intero account a 46,8× ROAS.
Aggiungi un parametro URL alle tue campagne Shopping e Performance Max e, entro una settimana, GA4 ti consegna il report che Google ha ritirato in silenzio: ogni clic a pagamento accoppiato come query × prodotto — con sessioni, conversioni e ricavi attaccati. Quella singola coppia è dove si nascondono i soldi — quali prodotti attirano traffico spazzatura, quali titoli mancano la domanda reale, quali query bruciano budget e non vendono mai. La costruzione è quell’unico parametro; il resto di questo articolo è cosa fai con ciò che torna indietro.
Se gestisci campagne Shopping o Performance Max, conosci il report delle query di ricerca. Ciò che potresti non aver notato — perché Google non te lo fa mai notare — è cosa manca: il prodotto.
Vedi che qualcuno ha cercato “aspirapolvere senza filo sotto i 200”. Vedi clic e costo. Non vedi quale dei tuoi 5.000 prodotti quella query ha attivato, su quale è atterrata o quale ha venduto.
Anni fa, l’API di AdWords ti dava questa coppia. Oggi non lo fa più. E per un account e-commerce non è un gap cosmetico — query-prodotto è dove vive la vera ottimizzazione: se i tuoi titoli corrispondono alla domanda reale, quali prodotti attirano traffico spazzatura, perché un prodotto riceve clic ma non converte mai.
Prima che tu lo chieda: no, non c’è alcuna impostazione per questo. Nessun report, nessun campo API, nessuno script che lo riporti indietro dal lato di Google. Devi ricostruirlo da te — e la ricostruzione è quasi imbarazzantemente semplice.
La soluzione: un parametro, due dimensioni GA4
Aggiungi un tracking template
Sulle tue campagne Shopping e PMax: {lpurl}?utm_content={product_id}. La variabile ValueTrack {product_id} invia l’ID prodotto Merchant Center a ogni clic.
GA4 memorizza il prodotto
L’UTM atterra nella dimensione Session manual ad content (sessionManualAdContent).
GA4 conosce già la query
L’auto-tagging (gclid) riempie sessionGoogleAdsQuery sulla stessa sessione.
Unisci le due dimensioni
Ogni clic a pagamento diventa una coppia query × prodotto — con sessioni, tasso di conversione e ricavi attaccati.
L’auto-tagging e l’UTM manuale non si pestano i piedi: gclid continua a gestire origine, mezzo e campagna; il tuo UTM porta solo l’ID prodotto.
Sappi cosa stai ottenendo (e cosa no)
- Solo query cliccate. Questo dataset parte dal clic. Le query per cui il tuo annuncio è apparso ma nessuno ha cliccato non arrivano mai a GA4 — l’analisi a livello di impressione resta nel report standard di Google (senza prodotti).
- ~20% dei clic non si accoppia: sessioni con consenso rifiutato, superfici PMax senza alcuna query (Display, YouTube, Gmail), clic che non hanno mai attivato analytics.
- Ambito di sessione. Una sessione = un ID prodotto — quello cliccato, anche se l’utente poi ne sfoglia altri dieci.
Tirare fuori il report da GA4
Nell’interfaccia: Esplora → formato libero. Dimensioni: Session manual ad content + Session Google Ads query. Metriche: sessioni, conversioni, ricavi da acquisto. Filtro: origine/mezzo sessione = google / cpc.
Tramite la Data API — per qualsiasi cosa seria, questo alimenta una dashboard o un join in BigQuery:
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"),
)),
)
Unisci sessionManualAdContent al tuo product feed (id → titolo, prezzo, categoria) e il report è completo: query × prodotto × titolo × economia.
Verificato, non teorizzato
Lo abbiamo messo in produzione su un account reale — un retailer di elettronica ceco con 22 campagne Shopping attive — e abbiamo controllato GA4 sette giorni dopo:
GA4, 7 giorni dopo il deploy
- Righe di traffico google/cpc 9.753
- Con l'ID prodotto (utm_content) 96 %
- Con la query di ricerca (sessionGoogleAdsQuery) 81 %
- Con entrambi — un report query × prodotto funzionante 78 %
Ora la parte divertente: cosa ti dicono le coppie
1 · Il title gap
Metti le query accanto al titolo e alla descrizione che hanno attivato. Il disallineamento salta all’occhio:
La roadmap del feed si scrive da sola. Ed è qui che l’arricchimento del feed con l’AI smette di essere un atto di fede e diventa un loop misurabile: riscrivi il titolo attorno alla domanda che hai appena dimostrato, poi guarda CTR e tasso di conversione per query muoversi.
2 · Chi altro c’è sulla “tua” query — e con quale prodotto
Una cosa che non puoi fare: aggiungere parole chiave escluse per prodotto. Google non ti dà questa leva in Shopping o PMax. Quindi quando una coppia query × prodotto rende poco, la domanda non è “come la escludo” — è “perché rende poco”.
Prendi la query e fai lo scraping della pagina dei risultati live per essa. Concretamente: DataForSEO, endpoint serp/google/organic/live/advanced — un POST con il testo della query e il location_code del tuo mercato, e ti restituisce l’intera pagina dei risultati come JSON strutturato: annunci a pagamento, blocchi shopping con nomi dei merchant e prezzi, organico sotto. A ~0,0035 $ per query, controllare 200 query costa circa 0,70 $.
Un risultato tipico: il tuo sacco a pelo di fascia media raccoglie clic su una query generica — e la stessa query mostra tre brand economici nella stessa categoria a metà del tuo prezzo. Il tuo prodotto non è scadente; è battuto sul prezzo in quella specifica asta.
Ora hai opzioni reali: ritoccare il prezzo; portare il fattore differenziante nel titolo (“imbottitura in piuma, comfort −15 °C”); spostare il prodotto in una campagna con una strategia di offerta che corrisponde alla sua realtà di margine; o accettare la query come upper-funnel e giudicarla sulle metriche assistite invece che sull’ultimo clic.
3 · Decisioni di struttura e di offerte
I prodotti che attirano query ad alto intento meritano i propri gruppi di asset e budget. I prodotti che raccolgono solo traffico generico stanno nei gruppi catch-all con target conservativi. Questo report è la base di prove per la segmentazione shopping — non l’istinto.
4 · Un check di salute per PMax
PMax ti dice quasi nulla sulla rete di ricerca. Questo report è la cosa più vicina che otterrai a un audit di ciò che PMax compra davvero per te sulla superficie search — per prodotto.
Guardami percorrere un export reale, passo per passo
Tutto ciò che precede è il perché. Ecco il com’è davvero — ogni passo, cosa scarichi, cosa fissi e il numero reale che torna indietro.
I dati sono di un secondo account: un diverso e-shop ceco di medie dimensioni (non il retailer di elettronica del box GA4 qui sopra — lo uso perché il suo catalogo è abbastanza ampio da far emergere ogni pattern a pieno regime). Ho estratto il suo report grezzo delle query di ricerca Shopping tramite la Google Ads API in una tabella SQLite locale e ho eseguito le aggregazioni qui sotto. Una precisazione prima: questo report grezzo ti dà il gruppo di annunci / gruppo di prodotti sotto cui la query è stata servita, non il singolo prodotto. È esattamente il gap che chiude il trucco dell’UTM — ma anche a livello di gruppo di prodotti, gli output intermedi sono abbastanza eloquenti da rendere l’idea.
Fonte per ogni numero in questa sezione: report delle query di ricerca Shopping di Google Ads, un account e-shop ceco di medie dimensioni, ~22,6 mln di righe, dati estratti ad aprile 2026.
Passo 1 · Estrai il report grezzo e misura il mucchio
Cosa fai: esporta il report delle query di ricerca Shopping tramite la Google Ads API (search_term_view) in una tabella locale — SQLite o BigQuery, qualsiasi cosa su cui tu possa eseguire GROUP BY. Perché per primo: prima di unire qualunque cosa, devi sentire quanto è grande e quanto è rumoroso il mucchio grezzo. Quel singolo fatto azzera ogni aspettativa che segue.
Esegui un semplice COUNT(*) e un paio di SUM ed ecco cosa atterra:
Il mucchio grezzo — un COUNT, tre SUM
- Righe del report (query × gruppo di prodotti) 22.640.716
- Query di ricerca distinte 5.370.131
- Gruppi di prodotti sotto cui sono state servite 10.393
- Spesa / ricavi (ROAS misto 6,8×) 2,57 mln / 17,4 mln CZK
Cosa hai ottenuto: 22,6 milioni di righe, 5,4 milioni di query uniche. Nessun umano le legge. L’unico compito del numero è dirti la mossa successiva — collassa questo mucchio in base alla dimensione che paga le bollette — e avvertirti che qualsiasi triage manuale riga per riga è senza speranza.
Passo 2 · Butta via il 96% prima di analizzare qualsiasi cosa
Cosa fai: conta le righe con zero clic, poi filtrale via. Perché: il report delle query di ricerca Shopping registra ogni query per cui il tuo annuncio è apparso, la maggior parte delle quali nessuno ha cliccato. Quelle righe di sole impressioni non possono costarti né convertire — sono rumore che fa sembrare la tabella spaventosa.
Situazione: 22,6 mln di righe, non sai da dove iniziare. Azione:
WHERE clicks > 0. Risultato: la tabella collassa a 738.444 righe — una dimensione gestibile.
L'inondazione di impressioni
- Righe con zero clic (pure impressioni) 21.902.272 — 96,7 %
- Righe che hanno speso anche solo una corona 738.444 — 3,3 %
Cosa hai ottenuto: il 96,7% del numero spaventoso non è mai stato altro che rumore. Ora lavori su una tabella da 738K righe, non da 22,6 mln — e ogni aggregazione qui sotto gira sulla parte che spende davvero soldi.
Passo 3 · Poni l’unica domanda che riformula l’account
Cosa fai: sulle righe cliccate, dividi la spesa tra “convertito almeno una volta” e “mai convertito”, e somma il costo di ciascuna. Perché: questo è il numero che trasforma “l’account va bene, il ROAS è 6,8” in “la maggior parte del budget non fa nulla”. È l’output intermedio di punta — calcolalo prima di qualsiasi idea di ottimizzazione.
Il peso morto a conversione zero
- Righe del report che hanno convertito zero volte 99,75 %
- Quota della spesa totale che quelle righe si sono mangiate 85,5 %
- Spesa senza alcuna conversione dietro 2,20 mln CZK (~88k €)
- Delle sole righe cliccate, quota con zero conversioni 92,3 %
Cosa hai ottenuto: l’85% del budget è fluito attraverso combinazioni query × gruppo di prodotti che non hanno convertito nemmeno una volta. Non è un errore di arrotondamento da ottimizzare dopo — è l’evento principale. E hai potuto vederlo solo perché hai collassato la query fino al prodotto a cui era abbinata.
Passo 4 · Verifica se lo spreco è qualche cattivo o tutta la folla
Cosa fai: ordina le righe cliccate per costo, prendi il top 1% e il top 10%, e vedi quanta spesa totale tengono. Perché: questo decide la tua tattica. Se una manciata di termini brucia il budget, li metti in pausa e hai finito. Se lo spreco è distribuito in modo sottile, mettere in pausa i termini è inutile — ti servono correzioni strutturali.
Dove sta davvero la spesa sprecata
- Top 1% delle righe cliccate per costo 10,5 % della spesa
- Top 10% delle righe cliccate per costo 29,8 % della spesa
Cosa hai ottenuto: il peso morto è long-tail, non qualche colpevole — il top 1% delle righe costose tiene a malapena un decimo della spesa. Quindi mettere in pausa 20 termini cattivi non cambia nulla. Questa è la ragione supportata dai dati per sistemare la struttura (quali prodotti stanno in quale campagna con quale target) invece di inseguire singole query — e un promemoria che Google comunque non ti lascia nemmeno aggiungere una parola chiave esclusa per prodotto.
Passo 5 · Scopri perché la long tail perde: una query, molti prodotti
Cosa fai: per ogni query di ricerca, conta sotto quanti gruppi di prodotti distinti è stata servita. Perché: spiega lo spreco a livello meccanico. Shopping abbina una query ai segnali del tuo intero feed, non alla pertinenza di un singolo prodotto — quindi una singola query si disperde tra angoli scorrelati del tuo catalogo, e tu paghi per ogni buco a vuoto.
Situazione: “dissuasore antiabbaio” continua a bruciare budget. Azione:
COUNT(DISTINCT ad_group)per quel termine. Risultato: è stato servito sotto 139 diversi gruppi di annunci / prodotti per 976 CZK e ~0 conversioni. “lego technic” ne ha toccati 300.
Dispersione della query nel catalogo
- Query distinte servite sotto più di un gruppo di prodotti 46,7 %
- Massimo numero di gruppi di prodotti raggiunti da una singola query 6.661
- "dissuasore antiabbaio" → gruppi / costo / conversioni 139 / 976 CZK / ~0
Cosa hai ottenuto: quasi metà delle tue query è spalmata su più gruppi di prodotti, e i peggiori ne raggiungono migliaia. È questo il motore del peso morto a conversione zero del Passo 3 — e proprio la cosa che puoi finalmente vedere una volta che ogni clic porta il suo ID prodotto.
Passo 6 · Osserva i disallineamenti peggiori — sono assurdi
Cosa fai: estrai le righe a costo più alto che non hanno mai convertito e leggi la query accanto al gruppo di prodotti a cui è stata abbinata. Perché: i numeri aggregati convincono il tuo foglio di calcolo; queste tre righe convincono il tuo capo. Sono il volto leggibile dall’uomo del Passo 5.
| Query di ricerca | Servita sotto il gruppo di prodotti | Clic | Costo | Conv. |
|---|---|---|---|---|
| collare addestramento cane | Borse | 97 | 270 CZK | 0 |
| dissuasore antiabbaio | Prodotti per bambini | 76 | 239 CZK | 0 |
| lego technic | Illuminazione | 70 | 169 CZK | 0 |
Una query per collare da addestramento pagata sotto il tuo gruppo Borse. Un dissuasore antiabbaio abbinato a Prodotti per bambini. Il gruppo di prodotti non ha nulla a che fare con la query — Google ha abbinato su segnali ampi del feed, ha raccolto il clic e te lo ha addebitato. Con query × prodotto vedi questo in un colpo d’occhio; con il report standard di Google non lo farai mai. (Esempio illustrativo — categorie tradotte e anonimizzate.)
Passo 7 · Ora la ricompensa: lo 0,25% che paga l’intero account
Cosa fai: inverti il Passo 3 — isola solo le righe che hanno convertito e somma il loro costo e ricavo. Perché: è la ragione per cui l’intero esercizio conta. Una volta che puoi separare i vincitori dal peso morto, proteggi i vincitori e affami il resto.
La fetta che si guadagna il pane
- Righe che hanno convertito (quota di tutte le righe) 57.209 — 0,25 %
- Quanto sono costate 372k CZK (~14,9k €)
- Quanto hanno reso 17,4 mln CZK (~697k €)
- ROAS su quella fetta 46,8×
Cosa hai ottenuto: un quarto dell’uno percento delle righe gira a 46,8× ROAS e di fatto regge l’account; l’altro 99,75% trascina il dato misto giù a 6,8×. Trovare quella fetta, proteggerne il budget e strutturare tutto il resto lontano da essa è l’intero lavoro — e niente di tutto questo è possibile finché ogni riga non porta il prodotto a cui è stata abbinata. È questo che ti compra l’UTM a un parametro all’inizio di questo articolo.
Il template + le tre trappole
{lpurl}?utm_content={product_id}- Non mettere un parametro personalizzato in utm_campaign. Google Ads sanitizza i valori dei parametri personalizzati — i nomi delle tue campagne vengono riscritti e la continuità storica di GA4 si rompe. Invia solo
utm_content; all’auto-tagging pensa il resto. - Applica solo alle campagne Shopping + PMax ATTIVE. La rete di ricerca non ne ha bisogno; le campagne in pausa inquinano solo la cronologia delle modifiche.
- Trabocchetto API: stai facendo il deploy in modo programmatico? Le versioni recenti della Google Ads API hanno rimosso
client.get_type(“FieldMask”)— importa invecefield_mask_pb2.FieldMask.
FAQ
Funziona per Performance Max?
Sì, per la superficie search/shopping. I clic su Display, YouTube e Gmail portano l’ID prodotto ma nessuna query — aspettati che quelle righe abbiano la dimensione query vuota.
L'UTM romperà la mia attribuzione GA4?
No. L’auto-tagging (gclid) continua a gestire origine/mezzo/campagna; tu aggiungi solo l’ad content. Ciò che romperebbe le cose è un parametro personalizzato dentro utm_campaign — non farlo.
Perché solo il 78% di copertura?
La modalità consenso, le superfici PMax senza query e i blocker analytics si mangiano il resto. Il 78% basta e avanza per ogni caso d’uso qui sopra — stai leggendo pattern, non controllando i centesimi.
Posso vedere le query per cui il mio annuncio è apparso ma nessuno ha cliccato?
No. Questo dataset parte dal clic. L’analisi a livello di impressione resta nel report standard delle query di ricerca — senza prodotti.
Il pattern funziona fuori da Google — Bing, Sklik?
Sì, è trasferibile: qualsiasi piattaforma con un template URL, una macro di prodotto e una dimensione analytics per catturarla. Le macro specifiche cambiano da piattaforma a piattaforma.
Quanto ci vuole prima di avere dati utilizzabili?
Dipende dal volume. Il nostro account aveva un report utilizzabile in 7 giorni; gli account più piccoli dovrebbero raccoglierne 30.