Sklep meblowy WooCommerce, 122 SKU, dwa segmenty (premium tapicerowane meble + budget skandi). Klient po wcześniejszej agencji: 0 konwersji w Ads, 8 tys. zł wydatku miesięcznie. Po 60 dniach od przejęcia: 47 konwersji/mc, ROAS 15,8x na bestsellerach, łączny ROAS konta 6,2x. Pokazujemy dokładnie, jak był wdrożony Performance Max — krok po kroku, z liczbami.
Stan zastany
Wskakując na konto, znaleźliśmy:
- 3 stare kampanie Performance Max ustawione w 2024 — bez asset groups, bez audience signals, jedna na cały katalog, jedna na „Łóżka”, jedna na „Promocje”
- Conversion tracking podłączony do obcego conversion ID (17118183951) — czyli konwersje raportowane były do losowego konta, nie do naszego. Klasyczny GTM hijack.
- Brak Custom Labels w feedzie Merchant Center
- Brak offline conversions z WooCommerce — wszystko liczone tylko z online checkout (~70% pokrycia)
- Feed: 122 produkty, ale 18 dis approved, 24 bez wymiarów, 0 z GTIN, 0 z cost_of_goods_sold
Wniosek: silnik nie ma jak się uczyć, bo nie widzi konwersji. Trzeba przebudować od dołu.
Krok 1: Conversion tracking
Najpierw fundament. Nie ruszyliśmy żadnej kampanii, dopóki tracking nie był 100% szczelny:
- Audyt GTM — znaleziono 5 tagów Google Ads Conversion raportujących do obcego AW-17118183951. Wszystkie podmienione na nasz AW-XXXX-NASZ z poprawnymi conversion labels.
- DataLayer purchase — sprawdzono w WooCommerce, czy purchase event ma `transaction_id`, `value`, `currency` i `items[]` z product_id + price. Brakowało `transaction_id` na 30% transakcji (wtyczka source’owała z wrong field). Fix: mu-plugin który hashuje order_id przez SHA-256 (salt z AUTH_KEY) i tworzy unikalny gm_xxxx ID.
- Offline conversions — podpięto WooCommerce → Google Ads przez REST API. Każda transakcja w WooCommerce po 24h jest exportowana do Ads z prawidłowym GCLID. Pokrycie wzrosło z 70% do 96%.
- Enhanced Conversions for Web — włączone, hashowany email klienta wysyłany razem z konwersją. Wzrost match rate o 12%.
- Weryfikacja — przez 7 dni porównaliśmy: WooCommerce orders vs GA4 purchase vs Ads conversions. Różnice <5% — zakwalifikowane jako szum normalny (cancelled orders, returns).
Krok 2: Custom Labels w feedzie
Performance Max używa feedu Merchant Center jako głównego sygnału. Custom Labels (5 slotów: 0–4) pozwalają oznaczać produkty kategoriami, których Google nie ma natywnie. U nas:
- custom_label_0 = margin tier (high / mid / low) — produkty z marżą 50%+, 30–50%, <30%
- custom_label_1 = performance tier (bestseller / standard / longtail) — top 20 produktów po sprzedaży / reszta katalogu / produkty z <1 sprzedaż w 90 dni
- custom_label_2 = price range (premium > 3k zł / mid 1–3k / budget <1k)
- custom_label_3 = seasonality (winter / summer / evergreen)
- custom_label_4 = strategy (loss_leader / standard / margin_max) — produkty, na których celowo nie chcemy zarabiać marży, by ściągnąć ruch / produkty standardowe / produkty maksymalizujące marżę
Custom labels są generowane automatycznie przez nasze CLI (Python) co 24h — bierze dane z WooCommerce (sprzedaż, marża, stan magazynu) i propaguje do feedu w Merchant Center.
Krok 3: Struktura kampanii Power Pack 2026
Wszystkie stare kampanie spauzowane (nie usunięte — historical data zostaje), nowa struktura:
PMax Hero — Bestsellery
- Budżet: 87 zł/dzień (~2 600 zł/mc)
- Listing group: custom_label_1 = „bestseller” (top 20 produktów)
- Bidding: Maximize Conversion Value, target ROAS = brak (let algorithm learn)
- Asset Group „Bestsellery”: 11 assets (logo, 5 obrazów lifestyle, 2 video krótkie, 8 headlines, 5 descriptions, 4 long headlines)
- Audience signals: Customer Match (lista 2 000 emaili z WooCommerce), in-market „Home & Garden > Furniture”, custom audience z search terms „łóżko 160”, „biurko gamingowe regulowane”
PMax Reszta Katalogu
- Budżet: 65 zł/dzień (~2 000 zł/mc)
- Listing group: cały feed BEZ bestsellerów (custom_label_1 != bestseller)
- Bidding: Maximize Conversion Value
- Asset Group „Cały Katalog”: 11 assets (różne od Hero, bardziej generyczne)
- Audience signals: szersze niż w Hero — wszystkie in-market segments related to furniture
Shopping Discovery
- Budżet: 43 zł/dzień (~1 300 zł/mc)
- Cały feed, manual CPC = 0,5 zł / Max Clicks z cap CPC
- Harmonogram: 13:00–23:00 (analityka pokazała, że to godziny najwyższego konwersji w sklepie meblowym)
- Cel: discovery — produkty, które PMax algorytm jeszcze nie odkrył, dane uzupełniają learning
Krok 4: Wyniki po 60 dniach
| Metryka | Przed | Po 60 dniach |
|---|---|---|
| Wydatek/mc | 8 100 zł | 5 900 zł |
| Konwersje raportowane w Ads | 0 | 47 |
| Przychód z Ads | brak danych | 36 600 zł |
| ROAS PMax Hero | — | 15,8x |
| ROAS konta łącznie | — | 6,2x |
| CPA średni | — | 125 zł |
Co się sprawdziło, co nie
Sprawdziło się
- Podział Hero/Rest — Hero ROAS 15,8x wynosił cały rachunek, mimo że Rest dowoził tylko 2,1x. Algorytm dostał wyraźny sygnał: te 20 produktów to priorytet, alokuj tu więcej budżetu
- Custom Match (audience signals) — pierwsza wersja kampanii bez Customer Match miała ROAS Hero 8x. Po dodaniu listy 2 000 emaili wzrost do 15,8x w 3 tygodnie
- Offline conversions — wzrost match rate z 70% do 96% oznacza, że algorytm widzi 30% więcej konwersji, lepiej optymalizuje
Nie sprawdziło się
- Shopping Discovery — po 6 tygodniach okazało się, że to wydatek z ROAS 1,8x. Spauzowane. Może wrócimy w innej formie, ale aktualnie PMax pokrywa cały discovery
- Video assets — short krótkie video w PMax dawały słabsze CTR niż statyczne obrazy lifestyle. Dla branży meblowej viewer chce zobaczyć produkt z kąta, nie 5-sekundowy clip. Zredukowaliśmy video do minimum
- In-market „Home Improvement” jako audience signal — za szeroka kategoria, dawała traffic z DIY niche zamiast finished furniture buyers. Wykluczono
Następne kroki
Plan na kolejne 90 dni:
- Dodać AI Max jako trzeci typ kampanii (beta od Google) — eksperyment z dynamicznymi asset groups generowanymi przez Gemini
- Demand Gen dla brand awareness — Discover + YouTube Shorts dla młodszej demografii
- Refresh asset groups (co 90 dni standardowo) — nowe obrazy lifestyle, sezonowe headlines
- POAS reporting — przejście z ROAS na Profit on Ad Spend, gdy cost_of_goods_sold wypełnione w 100%
Pełen przewodnik po setupie kampanii — Google Ads dla e-commerce. Audyt na start (90 min + raport) — tutaj. Model rozliczeń — wycena.