Modelowane listy odbiorców nie zawierają konkretnych osób, tylko prawdopodobieństwa. Wyjaśniam, jak powstają, gdzie ich szukać w panelu i jak czytać ich raporty.
Jest jeden rodzaj problemu, który w sklepie pojawia się wyłącznie wtedy, gdy sprzedaż idzie dobrze. Plik produktowy przez jedenaście miesięcy w roku działa bez zarzutu, a w tygodniu wyprzedaży zaczyna opowiadać Google o produktach, których już nie ma na półce.
Mechanizm jest prosty i dlatego łatwo go przegapić. Feed opisuje stan magazynu z chwili, w której został wygenerowany. Kiedy przez cały dzień sprzedaje się kilka sztuk, godzinne opóźnienie nie ma znaczenia. Kiedy sprzedaje się kilkaset, ten sam feed po dwudziestu minutach jest dokumentem historycznym.
Poniżej opisuję, co z tym robię przed wyprzedażą i w jej trakcie. Zaczynam od tego, gdzie właściwie powstaje rozjazd, bo od tego zależy, które z narzędzi ma sens.
Między liczbą sztuk w magazynie a informacją, którą widzi kupujący w reklamie, jest zwykle kilka ogniw: system magazynowy, baza sklepu, warstwa cache, generator pliku, transfer do Google i przetworzenie po stronie Merchant Center. Każde z nich dodaje własne opóźnienie.
Z mojego doświadczenia najczęściej winne są dwa. Pierwsze to cache po stronie sklepu — plik jest generowany co godzinę, ale generator odczytuje dane z pamięci podręcznej odświeżanej rzadziej. Wygląda to jak problem z feedem, a jest problemem z konfiguracją sklepu. Drugie to kolejka zadań: generowanie pliku dla dużego katalogu trwa i przy obciążonym serwerze potrafi się rozciągnąć albo przerwać w połowie.
Osobna kategoria to rezerwacja stanu. W wielu sklepach produkt schodzi z magazynu w chwili opłacenia zamówienia, a nie w chwili dodania do koszyka. W szczycie oznacza to, że kilkadziesiąt sztuk jest jednocześnie „w drodze” i nie wiadomo, czy je masz.
O dostępności decyduje przede wszystkim jedno pole i warto rozumieć jego zachowanie, zanim zaczniemy kombinować.
Czego w tym polu nie ma: liczby sztuk. Google nie oczekuje w standardowym pliku informacji o tym, że masz trzy egzemplarze. To ważne, bo część zespołów próbuje sterować widocznością przez liczbę stanów magazynowych i dziwi się, że nic z tego nie wynika. Widoczność sterujesz statusem, ewentualnie regułą, która ten status wylicza.
Pierwsza rzecz, którą robi większość osób, to skrócenie odstępu między pobraniami pliku. Warto to zrobić, ale trzeba wiedzieć, gdzie ta droga się kończy.
Standardowe pobranie pliku z adresu URL można ustawić na raz dziennie o wybranej godzinie. Przy wyprzedaży samo przesunięcie tej godziny na moment przed startem obniżek jest już poprawą — feed pobrany o czwartej nad ranem opisuje stan sprzed doby.
Częstsze odświeżanie wymaga innego mechanizmu niż zwykły plik. I tu zaczyna się prawdziwa decyzja: albo wysyłasz zmiany do Merchant Center aktywnie, albo pozwalasz Google czytać stronę produktu. Sam harmonogram, choćby najgęstszy, ma tę wadę, że przesyła cały katalog — a przy dużym asortymencie generowanie i transfer pełnego pliku kilka razy na godzinę to obciążenie, którego serwer w szczycie sprzedaży nie potrzebuje.
Dwa narzędzia, które w szczycie robią najwięcej różnicy, są oba oparte na tej samej idei: przesyłać tylko to, co się zmieniło.
Feed dodatkowy to lekki plik zawierający identyfikator produktu i wyłącznie te pola, które chcesz nadpisać. Może zawierać kilkaset wierszy zamiast kilkudziesięciu tysięcy, więc generuje się i przesyła szybko. Używam go do dwóch rzeczy: do wyłączania z reklam wąskiej grupy produktów, które właśnie się skończyły, i do nadpisywania etykiet własnych w trakcie akcji promocyjnej. Ważne zastrzeżenie: feed dodatkowy nadpisuje dane z feedu głównego, więc gdy nadpisanie przestaje być potrzebne, trzeba je świadomie usunąć. Zapomniany feed dodatkowy potrafi trzymać kategorię wyłączoną tygodniami.
Aktualizacje przez API to rozwiązanie właściwe, jeśli sklep sprzedaje na tyle intensywnie, że opóźnienie liczone w godzinach jest kosztem. Sklep wysyła zmianę statusu i ceny w momencie, w którym ona zachodzi. Od sierpnia interfejsem docelowym jest Merchant API — stare Content API for Shopping działa nadal, ale Google podało datę jego wyłączenia na sierpień 2026, więc nowej integracji nie budowałbym już na nim.
Decyzję o integracji podejmuje się jednak przed sezonem, nie w jego trakcie. Jeśli czytasz to na tydzień przed wyprzedażą i nie masz API, to Twoim narzędziem jest feed dodatkowy i mechanizmy z następnej sekcji.
Jest mechanizm, który działa bez żadnej integracji i o którym część sklepów nie wie, że ma go włączony.
Aktualizacje automatyczne pozwalają Google korzystać z danych strukturalnych na stronie produktu, żeby poprawić rozbieżność między feedem a stroną, zanim skończy się to odrzuceniem oferty. Warunek jest jeden i całkowicie po Twojej stronie: znaczniki na karcie produktu muszą być poprawne i muszą zawierać cenę oraz dostępność.
Traktuję to jako siatkę bezpieczeństwa, a nie jako podstawowy kanał aktualizacji. Ma dwie wady. Po pierwsze, Google musi stronę odwiedzić, więc reakcja nie jest natychmiastowa. Po drugie, jeśli dane strukturalne są błędne — a bywają, zwłaszcza po wdrożeniu nowego szablonu — mechanizm z entuzjazmem propaguje błąd.
Dlatego przed sezonem robię prostą rzecz: biorę kilka kart produktu z różnych kategorii, w tym wariantowych, i sprawdzam, czy znaczniki podają tę samą cenę i ten sam status dostępności co widoczna część strony. Rozjazd na produktach wariantowych to najczęstsza usterka, jaką w tym miejscu spotykam.
Skoro opóźnienia nie da się zredukować do zera, warto zostawić sobie margines.
Najprostszy bufor polega na tym, że produkt przestaje być reklamowany, zanim naprawdę się skończy. Reguła jest banalna: jeśli stan spada poniżej ustalonego progu, feed raportuje niedostępność. Przy niskiej rotacji nie ma to sensu, przy wyprzedaży ratuje przed płaceniem za kliknięcia w pustą kartę. Próg ustalam osobno dla asortymentu szybkorotującego i osobno dla reszty — jedna wartość dla całego katalogu zawsze jest albo zbyt ostrożna, albo bezużyteczna.
Drugi mechanizm to etykiety własne, ale użyte inaczej niż zwykle: nie do dzielenia asortymentu według marży, a do oznaczenia produktów wrażliwych na wyczerpanie. Kilkadziesiąt pozycji, które w tym sezonie odpowiadają za większość obrotu, chcę mieć w osobnej grupie, żeby móc je obserwować i wyłączyć bez ruszania całej kampanii.
W trakcie akcji nie mam czasu na analizy, więc patrzę na cztery rzeczy i tylko na nie.
Pierwsza: liczba produktów aktywnych w Merchant Center w porównaniu z dniem poprzednim. Nagły spadek o kilka procent oznacza problem z pobraniem albo masowe odrzucenie, nie sukces sprzedażowy. Druga: ostrzeżenia o niezgodności ceny i dostępności. W szczycie ich liczba zawsze rośnie, ale skok o rząd wielkości to sygnał, że feed przestał nadążać.
Trzecia: godzina ostatniego udanego pobrania. Zaskakująco często okazuje się, że ostatnie pobranie nie doszło, bo serwer odrzucił żądanie pod obciążeniem. Czwarta: koszt kliknięć na produktach, które zniknęły z magazynu. To najbardziej bezpośrednia miara tego, ile kosztuje opóźnienie feedu — i najlepszy argument w rozmowie o integracji przez API, którą warto przeprowadzić w styczniu, na spokojnie.
Używamy plików cookies, aby ułatwić Ci nawigację oraz wykonywanie określonych funkcji. Szczegółowe informacje o wszystkich plikach cookies znajdziesz w każdej kategorii zgody poniżej.
Pliki cookies oznaczone jako "Niezbędne" są przechowywane w Twojej przeglądarce, ponieważ są one kluczowe dla zapewnienia podstawowych funkcji strony.
Używamy również plików cookies firm trzecich, które pomagają nam analizować, w jaki sposób korzystasz z tej strony, zapamiętują Twoje preferencje oraz dostarczają treści i reklamy odpowiednie dla Ciebie. Te pliki cookies będą przechowywane w Twojej przeglądarce tylko za Twoją uprzednią zgodą.
Możesz zdecydować, czy chcesz włączyć lub wyłączyć niektóre bądź wszystkie te pliki cookies, jednak wyłączenie niektórych z nich może wpłynąć na Twoje doświadczenia podczas przeglądania strony.
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __cf_bm | 13 minutes | Cloudflare bot management — distinguishes humans from bots. |
| rc::* | Persistent | Google reCAPTCHA — localStorage holding anti-bot challenge state. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| wpEmojiSettingsSupports | Session | WordPress — sessionStorage flag caching whether the browser can render emoji (feature detection). |
| ytidb* | Persistent | YouTube — IndexedDB storing playback/search state for embedded videos. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| _ga_* | 400 days | Google Analytics 4 — persists session state per property. |
| _ga | 400 days | Google Analytics — distinguishes unique users via a client id. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| NID | 183 days | Google — stores preferences for personalized ads. |
| fr | 90 days | Meta — encrypted Facebook id and browser id for ads. |
| _gcl_au | 90 days | Google AdSense/Ads — experiments with advertising efficiency (conversion linker). |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __Secure-YNID | 180 days | |
| YSC | Session | |
| __Secure-ROLLOUT_TOKEN | 180 days | |
| VISITOR_INFO1_LIVE | 180 days | |
| VISITOR_PRIVACY_METADATA | 180 days | |
| datr | 400 days | |
| sb | 400 days | |
| wd | 7 days |