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.
Pytanie, które słyszę od klientów e-commerce częściej niż jakiekolwiek inne: „zrobiliśmy wyprzedaż, dlaczego w reklamach nie widać przekreślonej ceny?”. Odpowiedź prawie zawsze leży w pliku produktowym, a nie w kampanii. Google nie domyśla się, że akurat teraz macie promocję — musi to dostać w danych, w konkretnych atrybutach, i musi mieć potwierdzenie na stronie produktu.
Do tego od początku tego roku doszedł nam w Polsce drugi układ współrzędnych: obowiązek podawania najniższej ceny z 30 dni przed obniżką. Karta produktu, która wcześniej miała dwie liczby, ma dziś trzy — a plik produktowy nadal oczekuje jednej ceny bazowej i jednej promocyjnej. Sklepy, które nie przemyślały tego mapowania, dostają odrzucenia z powodu niezgodności ceny.
Poniżej opisuję, jak układam plik produktowy pod promocje: co wysyłać w którym atrybucie, na jakich warunkach Google pokazuje przekreśloną cenę i gdzie ta konfiguracja najczęściej się rozjeżdża. Bez obiecywania, że samo dopisanie jednej kolumny podniesie sprzedaż.
W pliku produktowym są dwa atrybuty, które opisują to, ile klient zapłaci. Atrybut price to cena bazowa — regularna, „normalna” cena produktu. Atrybut sale_price to cena promocyjna, ta faktycznie do zapłaty w trakcie obniżki.
Najczęstszy błąd, jaki widzę przy przejmowaniu konta, jest banalny: sklep w ogóle nie wysyła sale_price, tylko podmienia wartość w price na obniżoną. Z punktu widzenia zgodności danych wszystko jest w porządku — cena w pliku zgadza się z ceną na stronie, produkt się zatwierdza, reklama działa. Tylko Google nie ma pojęcia, że to promocja, bo nie dostał informacji o cenie odniesienia. Efekt: reklama wygląda dokładnie tak jak przez pozostałe jedenaście miesięcy roku.
Dopiero para price plus sale_price daje Merchant Center materiał do adnotacji o wyprzedaży — czyli tego układu, w którym cena regularna jest przekreślona, a obok stoi niższa. To adnotacja generowana przez Google, nie element, który wstawiasz sam. Ty dostarczasz dane i spełniasz warunki, decyzja o wyświetleniu należy do systemu.
Warto tu rozdzielić dwie rzeczy, które mylą się nawet doświadczonym osobom. Adnotacja o wyprzedaży bierze się z Twoich danych. Osobno istnieje oznaczenie spadku ceny, które Google wylicza z własnej historii cen produktu — na to nie masz wpływu przez plik i nie da się go „włączyć”. Jeśli ktoś obiecuje, że skonfiguruje Wam spadek ceny w feedzie, nie wie, o czym mówi.
Same atrybuty nie wystarczą. Wymagania są opisane w polityce Merchant Center i sprowadzają się do kilku warunków, które sprawdzam po kolei.
Ten ostatni punkt jest w praktyce najbardziej kłopotliwy, bo wymaga zgody między marketingiem i zespołem sklepu. Widzę to na większości kont, które przejmuję: plik jest przygotowany poprawnie, a szablon produktu pokazuje tylko cenę końcową, bo tak kiedyś zdecydował ktoś od UX. Zanim zacznę grzebać w feedzie, sprawdzam więc, co faktycznie renderuje się na karcie produktu.
Drugi atrybut, który w polskich sklepach bywa pomijany, to sale_price_effective_date. Podaje się w nim okres obowiązywania ceny promocyjnej jako dwie daty rozdzielone ukośnikiem, w formacie ISO 8601 razem ze strefą czasową — na przykład od piątego maja o dziewiątej rano do dwunastego maja o dwudziestej trzeciej pięćdziesiąt dziewięć.
Bez tego atrybutu sale_price obowiązuje tak długo, jak długo siedzi w pliku. To działa, dopóki ktoś pamięta o wycofaniu wiersza po zakończeniu wyprzedaży. Przy kilku tysiącach SKU i promocji rotującej co tydzień na pamięć nie ma co liczyć — a rozjazd między ceną w reklamie a ceną w koszyku to nie tylko odrzucenie produktu, ale też realny koszt kliknięć, które nie mogły się skonwertować.
Podanie zakresu dat ma jeszcze jedną zaletę: pozwala przygotować promocję zawczasu. Jeśli plik pobierany jest raz na dobę, a wyprzedaż startuje w środku dnia, nie musisz czekać na kolejne pobranie ani ręcznie wymuszać aktualizacji. Cena promocyjna wchodzi w życie w podanej godzinie po stronie Google.
Uwaga na strefę czasową. Pominięcie jej oznacza interpretację według strefy przypisanej do konta, a nie według czasu w Polsce, więc promocja potrafi wystartować z przesunięciem. Przy jednodniowych akcjach to różnica między działającą kampanią a straconym dniem.
Od pierwszego stycznia tego roku każda informacja o obniżce w polskim sklepie musi być opatrzona najniższą ceną z 30 dni przed obniżką. To wymóg prawny, wynikający z wdrożenia dyrektywy Omnibus, i dotyczy strony sklepu — Google nie ma osobnego atrybutu, w którym można tę liczbę przekazać.
Konsekwencja dla pliku produktowego jest jedna i trzeba ją zrozumieć: najniższa cena z 30 dni nie jest ceną bazową. Do price nadal idzie cena regularna, do sale_price cena do zapłaty, a wartość wymagana przepisami żyje wyłącznie w treści strony jako informacja dla konsumenta. Widziałem już wdrożenia, w których deweloper podłączył feed do tego samego pola, z którego szablon bierze najniższą cenę z 30 dni — i cała wyprzedaż przestała pokazywać jakikolwiek rabat, bo obie liczby były niemal równe.
Druga pułapka jest wizualna. Na karcie produktu stoją teraz trzy kwoty i nie zawsze da się na pierwszy rzut oka poznać, która jest ceną do zapłaty. Jeśli szablon przekreśla najniższą cenę z 30 dni albo wyróżnia ją wizualnie mocniej niż cenę końcową, rośnie ryzyko, że automat czytający stronę odczyta ją błędnie. Warto tu zadbać o dane strukturalne produktu i wskazać w nich jednoznacznie cenę faktycznie płaconą.
Najczęstszy komunikat, jaki zbierają sklepy w trakcie wyprzedaży, dotyczy niezgodności ceny podanej w pliku z ceną znalezioną na stronie. Google porównuje jedno z drugim i przy rozbieżności odrzuca produkt — bo z perspektywy użytkownika obietnica z reklamy nie została dowieziona.
Źródła są zwykle prozaiczne. Plik pobierany raz na dobę, a ceny zmieniane w systemie kilka razy dziennie. Cache na warstwie frontu, przez który robot widzi starszą wersję strony niż klient. Ceny zależne od zalogowania albo od kuponu, którego robot nie ma. Albo po prostu zakończona promocja, której nikt nie wyjął z pliku.
Dwie rzeczy, które w takiej sytuacji ustawiam. Po pierwsze, automatyczne aktualizacje produktów — funkcja, która pozwala Google poprawiać cenę i dostępność na podstawie danych strukturalnych ze strony, zanim dojdzie do odrzucenia. Wymaga poprawnych mikrodanych, więc nie jest to przełącznik do kliknięcia w oderwaniu od pracy nad sklepem. Po drugie, częstsze zasilanie danych: harmonogram pobierania ustawiony na godzinę, w której ceny są już świeże, a przy dużych i zmiennych asortymentach aktualizacja przez interfejs programistyczny zamiast jednego pliku raz na dobę.
Trzeba jasno powiedzieć jedną rzecz, bo oszczędza tygodnie szukania. Dodatek promocji w Merchant Center — ten, który pozwala podpiąć kod rabatowy albo darmową dostawę i wyświetlić przy produkcie link „specjalna oferta” — nie jest dostępny dla ofert z Polski. Lista krajów jest zamknięta i nie obejmuje naszego rynku. Poradniki opisujące atrybut z identyfikatorem promocji dotyczą kont z innych krajów.
Dla polskiego sklepu oznacza to, że narzędziem do komunikowania obniżki w reklamie produktowej pozostaje para cena regularna plus cena promocyjna wraz z datami obowiązywania. Kody rabatowe komunikujesz w innych miejscach — w tekstach reklam w wyszukiwarce, w bannerze na stronie, w mailingu.
Nie kontrolujesz też samego faktu wyświetlenia adnotacji. Spełnienie warunków polityki to warunek konieczny, nie gwarancja: sposób prezentacji zależy od formatu, urządzenia i miejsca, w którym pokazuje się oferta. Dlatego przy raportowaniu skutków wyprzedaży nie obiecuję klientowi, że przekreślona cena pojawi się w każdym wyświetleniu.
Kolejność, którą stosuję, jest zawsze taka sama i zaczyna się co najmniej miesiąc przed akcją — bo warunek trzydziestu dni dla ceny bazowej trzeba spełnić z wyprzedzeniem.
Najpierw sprawdzam, czy ceny bazowe w pliku są stabilne i zgodne z tym, co pokazuje sklep. Potem weryfikuję, że szablon produktu pokazuje obie kwoty w trakcie promocji i że dane strukturalne wskazują cenę do zapłaty. Następnie przygotowuję zasilanie promocji — u mniejszych sklepów jako dodatkowy plik danych z kolumnami ceny promocyjnej i zakresu dat, dopisywany do głównego pliku, bez ruszania eksportu z systemu sklepowego. Na końcu ustawiam harmonogram pobierania pod godzinę startu i planuję kontrolę statusów w pierwszych godzinach akcji.
Po zakończeniu wyprzedaży robię jeszcze jedno: sprawdzam, czy ceny promocyjne faktycznie wygasły i czy w pliku nie został żaden wiersz z zakończonym zakresem dat. To pięć minut pracy, które ratują przed najgłupszym scenariuszem — reklamą obiecującą rabat, którego w koszyku już nie ma.
Cała ta konfiguracja nie sprawi, że wyprzedaż sprzeda się sama. Sprawia natomiast, że komunikat o obniżce dociera do użytkownika w miejscu, w którym podejmuje decyzję, i że nie płacisz za kliknięcia w ofertę, która przestała być aktualna. Przy sezonie sprzedażowym to różnica między kampanią, która pracuje, a kampanią, która tłumaczy się z rozbieżności.
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 |