Większość artykułów o feedach XML zakłada, że sprzedajesz T-shirty.
To założenie miało sens dekadę temu, gdy „feed produktowy” oznaczał plik dla Google Shopping i nic więcej. Dziś już się nie sprawdza. Salon samochodowy, portal z ofertami pracy, sieć hoteli, portal nieruchomości i platforma bukmacherska prowadzą dziś reklamę opartą na feedach, a żadne z nich nie przesyła size ani gtin. Przesyłają numery VIN, kody IATA, liczbę sypialni, rodzaje zatrudnienia i godziny rozpoczęcia meczów.
Mechanika jest identyczna. Parametry — nie.
Ten przewodnik omawia jedno i drugie: zasady strukturalne obowiązujące w każdym feedzie XML niezależnie od branży oraz konkretne zestawy atrybutów dla każdego z głównych typów feedów — retail, lokalne stany magazynowe, pojazdy, turystyka, nieruchomości, oferty pracy oraz asortyment ograniczony w czasie, taki jak mecze, wydarzenia i seanse. Z działającym XML dla każdego z nich.
1. Czym właściwie jest feed XML
Feed XML to ustrukturyzowany plik opisujący asortyment w sposób, który maszyny mogą przetworzyć bez interpretacji przez człowieka. Platforma pobiera plik według harmonogramu, parsuje go i na podstawie tego, co znajdzie, tworzy oferty, reklamy lub wyniki wyszukiwania.
Format ma mniejsze znaczenie, niż większość osób sądzi. Liczy się kontrakt: każde miejsce docelowe publikuje specyfikację określającą, jakich pól wymaga, jakie wartości są dozwolone i jak zachowa się, gdy będą błędne. Feed to twoja strona tego kontraktu.
Wynikają z tego dwie konsekwencje i to one sprawiają, że feedy są trudniejsze, niż się wydaje:
Kontrakt jest osobny dla każdego miejsca docelowego. Specyfikacja produktów Google, specyfikacja katalogu Meta i XML ofert pracy Indeed nie mają prawie żadnych wspólnych nazw pól. Jeden katalog źródłowy trzeba przekształcać inaczej dla każdego z nich.
Naruszenia przeważnie kończą się cichą porażką. Błędnie sformatowane pole rzadko psuje cały plik. Powoduje odrzucenie jednego produktu, obniżenie jednej oferty albo usunięcie jednego atrybutu z reklamy — a nic w panelu kampanii o tym nie informuje.
2. Anatomia pliku
Większość reklamowych feedów XML używa RSS 2.0 z rozszerzeniem przestrzeni nazw. Struktura zawsze składa się z tych samych trzech warstw:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Example Store — Product Feed</title>
<link>https://example.com</link>
<description>Full catalogue, updated hourly</description>
<item>
<!-- one inventory item -->
</item>
</channel>
</rss>
- Deklaracja XML ustawia kodowanie. W praktyce musi to być
UTF-8; cokolwiek innego powoduje uszkodzenie znaków w katalogach w językach innych niż angielski i jest najczęstszą przyczyną zniekształconych tytułów produktów po turecku, niemiecku czy czesku. - Deklaracja przestrzeni nazw (
xmlns:g="...") sprawia, że<g:price>jest prawidłowe. Pomiń ją, a każdy element z prefiksem zostanie po cichu zignorowany — feed się sparsuje, ale prawie nic się nie zaimportuje. <channel>zawiera metadane na poziomie feedu.<item>to jedna jednostka asortymentu. To, czym jest „jedna jednostka”, jest decyzją, a nie oczywistością: jedno SKU, jeden wariant, jeden pojazd, jedna oferta pracy, jeden hotel, jeden mecz.
Nie każda branża używa tego kształtu. Feedy z ofertami pracy używają <source><job>, a niektóre marketplace’y definiują całkowicie własne elementy główne. Logika trzech warstw — dokument, kontener, powtarzający się element — obowiązuje niezależnie od tego.
3. Uniwersalny rdzeń
Siedem parametrów pojawia się w zasadzie w każdej specyfikacji feedu, jaką kiedykolwiek napisano, pod różnymi nazwami. Jeśli je rozumiesz, przeczytasz każdą specyfikację.
| Pojęcie | Google Shopping | Katalog Meta | Oferty pracy Indeed | Cel |
|---|---|---|---|---|
| Unikalny identyfikator | id | id / vehicle_id / home_listing_id | referencenumber | Tożsamość między synchronizacjami |
| Nazwa | title | title / name | title | Czym to jest |
| Szczegóły | description | description | description | Dlaczego to ważne |
| Docelowy URL | link | url | url | Gdzie następuje konwersja |
| Zdjęcie | image_link | image[0].url | — | Jak to wygląda |
| Cena | price | price | salary | Ile to kosztuje |
| Stan | availability | availability | (obecność w feedzie) | Czy jest aktywne |
Trzy zasady dotyczące identyfikatora, które obowiązują uniwersalnie i wyrządzają więcej szkód niż jakiekolwiek inne pojedyncze pole:
- Musi być stały. Jeśli identyfikator generuje się na nowo przy eksporcie — na podstawie kolejności wierszy, znacznika czasu czy skrótu zmieniającej się treści — każda synchronizacja niszczy zgromadzoną historię wyników produktu i zaczyna on od zera.
- Musi być unikalny. Zduplikowane identyfikatory powodują pomijanie późniejszych wierszy bez komunikatu o błędzie. Produkty po prostu znikają.
- Musi odpowiadać temu, co wysyła twój piksel lub tag. Dopasowywanie katalogu Meta, dynamiczny remarketing Google i każdy produkt retargetingowy zależą od tego, czy identyfikator w feedzie i identyfikator zdarzenia na stronie to ten sam ciąg znaków. To najczęstszy powód, dla którego dynamiczny retargeting „nie działa”.
4. Parametry retail / e-commerce
To najlepiej udokumentowana specyfikacja i podstawa, z której korzysta większość innych branż.
Wymagane
| Atrybut | Uwagi |
|---|---|
id | Maks. 50 znaków. Stały, unikalny, zgodny ze zdarzeniami piksela. |
title | Maks. 150 znaków. Na początku marka i frazy, które ludzie faktycznie wyszukują. |
description | Maks. 5000 znaków. Zwykły tekst; bez treści promocyjnych i HTML. |
link | Strona produktu, a nie kategorii czy wyników wyszukiwania. Musi być dostępna dla crawlera. |
image_link | Główne zdjęcie. Minimum 500x500 zgodnie ze specyfikacją z 2026 roku (patrz niżej). |
availability | in_stock, out_of_stock, preorder, backorder. |
price | Wartość plus waluta ISO: 899.90 TRY. Musi dokładnie odpowiadać stronie docelowej. |
Identyfikatory
brand, gtin, mpn i identifier_exists. GTIN to pole, które decyduje o tym, czy twój produkt zostanie dopasowany do grafu wiedzy o produktach Google — a więc czy w ogóle pojawi się w porównaniach i zakupowych wynikach AI. W praktyce nie jest opcjonalne, niezależnie od tego, co mówi specyfikacja.
Warianty
item_group_id, item_group_title, color, size, size_type, size_system, material, pattern, gender, age_group.
Warianty to osobny temat; w skrócie: item_group_id musi być identyczny w całej grupie i wyprowadzony ze stałych danych źródłowych, a gender i age_group są stałe w obrębie grupy, w przeciwieństwie do color i size.
Kategoryzacja
google_product_category (taksonomia Google, identyfikator lub pełna ścieżka), product_type (twoja własna taksonomia — to pole umożliwia budowanie struktury kampanii i ma dowolną formę, więc z niego korzystaj).
Dane handlowe
sale_price, sale_price_effective_date, unit_pricing_measure, unit_pricing_base_measure, installment, subscription_cost, loyalty_program.
Logistyka
shipping, shipping_weight, shipping_length / _width / _height, shipping_label, transit_time_label, min_handling_time, max_handling_time, tax.
Sterowanie kampanią
excluded_destination, included_destination, ads_redirect, od custom_label_0 do custom_label_4.
Pięć etykiet niestandardowych to najrzadziej wykorzystywane pola w całej specyfikacji. Nie mają dla Google żadnego znaczenia — istnieją wyłącznie po to, abyś mógł segmentować. Przedziały marży, głębokość stanów, sezonowość, wiek produktu, poziom wyników w GA4. Jeśli twoja struktura kampanii nie potrafi wyrazić reguły biznesowej, zwykle właśnie dlatego.
Multimedia
additional_image_link, lifestyle_image_link, virtual_model_link, video_link.
Minimalny, ale kompletny produkt retail
<item>
<g:id>KRC-4210-BLK</g:id>
<g:title>Karaca Fine Pearl 6-Person Dinner Set — Black</g:title>
<g:description>26-piece porcelain dinner set for six. Dishwasher and microwave safe.</g:description>
<g:link>https://example.com/urun/fine-pearl-6-kisilik</g:link>
<g:image_link>https://cdn.example.com/krc-4210-blk-01.jpg</g:image_link>
<g:additional_image_link>https://cdn.example.com/krc-4210-blk-02.jpg</g:additional_image_link>
<g:video_link>https://cdn.example.com/video/krc-4210.mp4</g:video_link>
<g:availability>in_stock</g:availability>
<g:price>4299.00 TRY</g:price>
<g:sale_price>3499.00 TRY</g:sale_price>
<g:sale_price_effective_date>2026-11-24T00:00+0300/2026-12-01T23:59+0300</g:sale_price_effective_date>
<g:brand>Karaca</g:brand>
<g:gtin>8680150042109</g:gtin>
<g:condition>new</g:condition>
<g:google_product_category>672</g:google_product_category>
<g:product_type>Home & Kitchen > Dinnerware > Dinner Sets</g:product_type>
<g:custom_label_0>high-margin</g:custom_label_0>
<g:custom_label_1>bf-2026</g:custom_label_1>
</item>
Zwróć uwagę na & i > w product_type. Niezakodowane znaki & w adresach URL i ścieżkach kategorii to najczęstsza przyczyna plików XML, których w ogóle nie da się sparsować.
5. Co zmieniło się w 2026 roku
Trzy zmiany w specyfikacji danych produktowych Google warto wdrożyć już teraz, a nie w ostatniej chwili.
Minimalna rozdzielczość zdjęć wynosi teraz 500x500 px dla image_link i additional_image_link, we wszystkich kategoriach i metodach marketingowych. Ostrzeżenia zaczęły pojawiać się w Merchant Center w kwietniu 2026 roku; egzekwowanie rozpoczyna się 31 stycznia 2027 roku. Google może automatycznie powiększać niektóre mniejsze zdjęcia, ale traktowanie tego jako rozwiązania to błąd — powiększone zdjęcia wyglądają na powiększone, a jakość zdjęcia wpływa na CTR.
video_link działa i jest wyświetlany. Filmy przesyłane przez ten atrybut kwalifikują się do wyświetlania od 30 czerwca 2026 roku, z weryfikacją zgodności z zasadami i jakości. Błędy blokują film, ale nie ofertę, co oznacza, że to pole o niskim ryzyku. Większość katalogów nie ma filmów dla większości SKU i właśnie dlatego generowanie ich na dużą skalę z danych feedu stało się dziś przewagą konkurencyjną, a nie miłym dodatkiem.
Rozszerzono ustawienia wysyłki na poziomie produktu. handling_cutoff_time ustala dzienny termin przetwarzania zamówień, a minimum_order_value określa minimalną wartość zamówienia dla dostawy. Atrybut shipping otrzymał też podatrybuty loyalty_program_label i loyalty_tier_label dla korzyści w dostawie związanych z programami lojalnościowymi.
Kierunek zmian jest konsekwentny: Google stale przenosi szczegóły, które kiedyś były na poziomie konta, na poziom produktu. Wszystko, co jest wyrażane dla każdego produktu, może zautomatyzować warstwa feedu, a proces ręczny — nie.
6. Mapa branż
Retail to jeden wiersz tej tabeli, a nie cała tabela.
| Branża | Miejsce docelowe w Google | Typ katalogu Meta | Inne popularne kanały |
|---|---|---|---|
| Retail / e-commerce | Reklamy produktowe, bezpłatne informacje o produktach | Produkty (e-commerce) | Marketplace’y, porównywarki cen, sieci afiliacyjne |
| Sprzedaż stacjonarna | Reklamy lokalnego asortymentu | Produkty z dostępnością lokalną | Lokalne platformy wyszukiwania |
| Motoryzacja | Reklamy pojazdów, oferty pojazdów | Pojazdy / oferty pojazdów | Portale ogłoszeniowe, marketplace’y motoryzacyjne |
| Hotele i zakwaterowanie | Reklamy hoteli (Hotel Center) | Hotele | OTA, metawyszukiwarki |
| Loty | Google Flights | Loty | Metawyszukiwarki |
| Kierunki i pakiety | — | Kierunki podróży | Afilianci turystyczni |
| Nieruchomości | — | Oferty nieruchomości | Portale nieruchomości, agregatory nieruchomości |
| Rekrutacja | Dane strukturalne ofert pracy (JobPosting) | — | Portale z ofertami pracy, dystrybucja z ATS, agregatory ofert pracy |
| Wydarzenia, mecze, seanse | Produkty (modelowane) | Produkty (modelowane) | Platformy biletowe, DSP |
Dwie zasady strukturalne, które warto przyswoić, zanim cokolwiek zbudujesz:
Katalog Meta zawiera dokładnie jeden typ asortymentu. Nie możesz mieszać hoteli i produktów. Jeśli sprzedajesz jedno i drugie, potrzebujesz dwóch katalogów.
Google rozdziela branże na poziomie źródła danych. Źródło danych o pojazdach musi być kierowane wyłącznie na reklamy pojazdów. Przesłanie pojazdów do źródła danych Shopping skutkuje odrzuceniami, a nie ofertami — a źródła danych o pojazdach nie powinny zawierać części zamiennych ani akcesoriów, które należą do zwykłego feedu produktowego.
7. Feedy pojazdów
Motoryzacja to branża, w której podejście „po prostu użyj specyfikacji retail” zawodzi najbardziej oczywiście. Samochód to unikalny obiekt fizyczny z prawnym identyfikatorem, a nie SKU z głębokością stanów.
Atrybuty pojazdów Google nadbudowane są na wspólnym rdzeniu:
| Atrybut | Uwagi |
|---|---|
vin | Prawna tożsamość pojazdu. Błędnie sformatowane numery VIN i niezgodności VIN/rocznika to najczęstsze przyczyny odrzuceń. |
year, model, trim | Wersja wyposażenia (trim) odróżnia ofertę od konkurencji w obrębie tego samego modelu. |
body_style | Wartość z listy (enum). |
mileage | Wartość plus jednostka (miles lub km). Musi odpowiadać stronie docelowej. Wartości spoza wiarygodnego zakresu dla danego rocznika są oznaczane. |
condition | Nowy, używany, certyfikowany używany. |
certified_pre-owned | Osobna flaga. |
engine, fuel_consumption, energy_consumption, co2_emissions, emissions_standard | Coraz ważniejsze na rynkach UE. |
electric_range, fuel_consumption_discharged_battery | Specyficzne dla pojazdów elektrycznych i hybrydowych. |
date_first_registered | Miesiąc i rok pierwszej rejestracji. |
vehicle_msrp, vehicle_price_type | Cena katalogowa a cena ofertowa. |
vehicle_fulfillment | Czy pojazd jest w salonie, może zostać przeniesiony lub dostarczony. Atrybut grupowy z podatrybutem store_code. |
store_code | Która fizyczna lokalizacja ma pojazd. |
<item>
<g:id>STK-88214</g:id>
<g:title>2023 Volkswagen Passat 1.5 TSI Business DSG</g:title>
<g:description>Single owner, full service history, no accident record.</g:description>
<g:link>https://example.com/ilan/88214</g:link>
<g:image_link>https://cdn.example.com/88214-01.jpg</g:image_link>
<g:price>1450000.00 TRY</g:price>
<g:condition>used</g:condition>
<g:brand>Volkswagen</g:brand>
<g:model>Passat</g:model>
<g:trim>1.5 TSI Business DSG</g:trim>
<g:year>2023</g:year>
<g:vin>WVWZZZ3CZPE000000</g:vin>
<g:mileage>
<g:value>42500</g:value>
<g:unit>km</g:unit>
</g:mileage>
<g:body_style>sedan</g:body_style>
<g:color>Grey</g:color>
<g:vehicle_fulfillment>
<g:option>in_store</g:option>
<g:store_code>IST-01</g:store_code>
</g:vehicle_fulfillment>
</item>
Co odróżnia feedy pojazdów pod względem operacyjnym:
- Każda pozycja to jedna sztuka. Każdy produkt to pojedyncza jednostka. Gdy zostanie sprzedany, musi natychmiast zniknąć z feedu — a nie przy jutrzejszej synchronizacji. Nieaktualne oferty pojazdów marnują drogie kliknięcia na samochody, których już nie ma, i szkodzą jakości konta.
- Częstotliwość odświeżania to podstawa. Odświeżanie co cztery godziny to w motoryzacji standardowa praktyka, a nie optymalizacja.
- Spójność ze stroną docelową jest egzekwowana. Cena i przebieg w feedzie muszą dokładnie odpowiadać stronie szczegółów pojazdu. Zmiana cen u dealera, która aktualizuje stronę, ale nie feed, w ciągu kilku godzin wywołuje falę odrzuceń.
- Reklamy asortymentu motoryzacyjnego Meta używają osobnego słownika pól —
state_of_vehicle,exterior_color,transmission,drivetrain,dealer_id— więc te same dane źródłowe wymagają innego przekształcenia dla każdego kanału.
8. Feedy turystyczne
Turystyka dzieli się na trzy odrębne typy katalogów, a błędem jest traktowanie ich jak jednego.
Hotele
Feed obiektów jest stosunkowo statyczny: nazwa, opis, adres, współrzędne, liczba gwiazdek, zdjęcia, cena początkowa. Zmieniają się dostępność i stawki, dlatego konfiguracje hotelowe zwykle łączą statyczny feed obiektów z dynamicznymi feedami typów pokoi i cen.
Podstawowe parametry: hotel_id, name, description, brand, url, image, latitude, longitude, address (z city, region, country, postal_code), base_price, currency, star_rating, neighborhood, phone, guest_ratings.
<item>
<g:hotel_id>HTL-BDR-114</g:hotel_id>
<g:name>Blue Bay Resort Bodrum</g:name>
<g:description>Seafront resort with private beach, three restaurants and a spa.</g:description>
<g:url>https://example.com/otel/blue-bay-bodrum</g:url>
<g:image>https://cdn.example.com/htl-114-01.jpg</g:image>
<g:latitude>37.0344</g:latitude>
<g:longitude>27.4305</g:longitude>
<g:address>Yalıkavak Mah. Sahil Cad. 12, Bodrum, Muğla, TR, 48990</g:address>
<g:base_price>4200.00 TRY</g:base_price>
<g:star_rating>5</g:star_rating>
<g:neighborhood>Yalıkavak</g:neighborhood>
</item>
Loty
Produktem jest trasa, a nie miejsce w samolocie. Tożsamość stanowi para miejsce wylotu–miejsce docelowe: origin_airport i destination_airport jako kody IATA, plus price, url, image, description. Ceny to zwykle ceny „od” i stale się zmieniają, co sprawia, że częstotliwość aktualizacji jest decydującym ograniczeniem.
Kierunki podróży
Produktem jest miejsce, do którego sprzedajesz podróże: destination_id, name, address, neighborhood, types, price, url, image. Przydatne w prospectingu w górnej części lejka, gdy podróżny ma intencję, ale nie ma na myśli konkretnego obiektu.
Powracający problem w turystyce polega na tym, że cena i dostępność są obliczane, a nie przechowywane. „Cena” hotelu zależy od dat, liczby osób i długości pobytu; cena lotu — od chwili, w której pytasz. Feedy chcą jednej liczby. Wybór tej liczby — najniższa dostępna w ciągu najbliższych 30 dni, najniższa na najbliższy weekend, średnia — to decyzja biznesowa, która po cichu decyduje o wynikach reklam, i warto ją podjąć świadomie, zamiast zdawać się na to, co wygenerował eksport.
9. Feedy nieruchomości
Pod względem struktury podobne do pojazdów: unikalne aktywa fizyczne, każda pozycja to jedna sztuka, wysoka wartość kliknięcia i oferta, która musi zniknąć w chwili, gdy nieruchomość zostanie sprzedana lub wynajęta.
Podstawowe parametry: home_listing_id, name, description, address, latitude, longitude, url, image, price, currency, property_type (mieszkanie, dom, działka, nieruchomość komercyjna), listing_type (sprzedaż, wynajem, rynek pierwotny), num_beds, num_baths, area_size, area_unit, year_built, availability, agent_name, agent_phone.
<item>
<g:home_listing_id>EMK-2291</g:home_listing_id>
<g:name>3+1 Apartment with Sea View — Kadıköy</g:name>
<g:description>Renovated 3+1 apartment, 4th floor, elevator, closed parking.</g:description>
<g:address>Caferağa Mah., Kadıköy, İstanbul, TR</g:address>
<g:latitude>40.9862</g:latitude>
<g:longitude>29.0299</g:longitude>
<g:url>https://example.com/ilan/2291</g:url>
<g:image>https://cdn.example.com/emk-2291-01.jpg</g:image>
<g:price>12500000.00 TRY</g:price>
<g:property_type>apartment</g:property_type>
<g:listing_type>for_sale</g:listing_type>
<g:num_beds>3</g:num_beds>
<g:num_baths>2</g:num_baths>
<g:area_size>135</g:area_size>
<g:area_unit>sq_m</g:area_unit>
<g:availability>available</g:availability>
</item>
Jedna rzecz, która nie jest problemem feedu, ale zatrzyma twoją kampanię: mieszkalnictwo to w Meta kategoria reklam objęta ograniczeniami. Kampanie promujące oferty nieruchomości muszą być zadeklarowane w specjalnej kategorii reklam dotyczących mieszkalnictwa, co ogranicza opcje targetowania. Katalog może być idealny, a kampania i tak się nie powiedzie, jeśli to nie zostanie ustawione.
10. Feedy ofert pracy
Rekrutacja używa zupełnie innej struktury dokumentu — <source> i <job> zamiast <rss> i <item> — i warto ją zobaczyć, bo pokazuje, że „feed XML” to wzorzec, a nie jeden schemat.
<?xml version="1.0" encoding="UTF-8"?>
<source>
<publisher>Example Company</publisher>
<publisherurl>https://example.com</publisherurl>
<lastBuildDate>Wed, 12 Aug 2026 09:00:00 GMT</lastBuildDate>
<job>
<title><![CDATA[Senior Backend Engineer]]></title>
<date><![CDATA[Mon, 10 Aug 2026 08:00:00 GMT]]></date>
<referencenumber><![CDATA[ENG-4471]]></referencenumber>
<url><![CDATA[https://example.com/careers/eng-4471]]></url>
<company><![CDATA[Example Company]]></company>
<city><![CDATA[İstanbul]]></city>
<state><![CDATA[İstanbul]]></state>
<country><![CDATA[TR]]></country>
<postalcode><![CDATA[34394]]></postalcode>
<description><![CDATA[<p>We are hiring a senior backend engineer to work on our data pipeline...</p>]]></description>
<salary><![CDATA[120000 - 160000 TRY monthly]]></salary>
<jobtype><![CDATA[fulltime]]></jobtype>
<category><![CDATA[Engineering]]></category>
<experience><![CDATA[5+ years]]></experience>
</job>
</source>
Cztery zasady specyficzne dla feedów ofert pracy:
CDATAto norma, a nie wyjątek. Opisy stanowisk zawierają HTML, znaki ampersand i apostrofy. Opakowanie każdego pola w<![CDATA[...]]>pozwala uniknąć całej klasy błędów parsowania.- Lokalizacja wymaga co najmniej miasta, regionu i kraju. Pomiń je, a ogłoszenie domyślnie straci widoczność organiczną w głównych agregatorach.
- Obsadzone stanowiska trzeba usuwać, a nie oznaczać jako zamknięte. Nie ma odpowiednika
availability. Obecność w feedzie jest sygnałem dostępności, a agregatory karzą feedy zawierające nieaktualne ogłoszenia. - Jeden język, jeden wpis oferty. Ogłoszenie opublikowane w dwóch językach wymaga dwóch osobnych wpisów z różnymi numerami referencyjnymi.
Niezależnie od feedu, dane strukturalne JobPosting w JSON-LD na stronie kariery sprawiają, że stanowisko kwalifikuje się do wyświetlania w wynikach wyszukiwania ofert pracy. Oba elementy się uzupełniają: feed odpowiada za dystrybucję do agregatorów, dane strukturalne — za wyszukiwanie organiczne. Większość zespołów rekrutacyjnych robi jedno, a drugiego nie.
11. Asortyment ograniczony w czasie
Najciekawsza kategoria feedów nie ma oficjalnej specyfikacji, bo platformy nigdy jej nie przewidziały: asortyment, którego definiującym atrybutem jest kiedy, a nie co.
Mecze piłki nożnej. Koncerty. Seanse kinowe. Odloty samolotów. Przedmioty na aukcjach. Terminy rezerwacji w restauracjach. Okna dostaw.
Mają one wszystkie właściwości produktów — tożsamość, cenę, zdjęcie, stronę docelową — plus jedną, dla której specyfikacja retail nie ma pola: termin przydatności mierzony w godzinach. Mecz, który już się rozpoczął, nie jest „niedostępny” — jest bez znaczenia.
Sprawdzone podejście polega na modelowaniu ich jako standardowych produktów katalogowych i kodowaniu wymiaru czasu w polach, które platforma już rozumie:
<item>
<g:id>MTC-2026-08-16-GS-FB</g:id>
<g:title>Galatasaray - Fenerbahçe | Super League, Week 2</g:title>
<g:description>Saturday 16 August, 19:00. Live odds and in-play betting.</g:description>
<g:link>https://example.com/mac/2026-08-16-gs-fb</g:link>
<g:image_link>https://cdn.example.com/creatives/mtc-2026-08-16-gs-fb.jpg</g:image_link>
<g:availability>in_stock</g:availability>
<g:price>1.00 TRY</g:price>
<g:product_type>Football > Super League > Week 2</g:product_type>
<g:custom_label_0>2026-08-16</g:custom_label_0>
<g:custom_label_1>derby</g:custom_label_1>
<g:custom_label_2>ms1-2.10</g:custom_label_2>
<g:expiration_date>2026-08-16T19:00+0300</g:expiration_date>
</item>
Trzy rzeczy sprawiają, że to działa:
expiration_datelub równoważna reguła usuwania, aby produkt znikał z katalogu w momencie rozpoczęcia meczu, a nie przy następnej zaplanowanej synchronizacji.- Etykiety niestandardowe niosące wymiar czasu, aby kampanie można było strukturyzować wokół „ten weekend”, „derby” czy „kursy powyżej 2.0”.
- Kreacja dla każdego produktu. Tu zwykle wszystko się zatrzymuje. Terminarz z kilkuset meczami tygodniowo wymaga kilkuset grafik, z których każda zawiera drużyny, datę, godzinę i aktualne kursy. Żaden zespół graficzny tego nie wyprodukuje. Generowanie kreacji z wiersza feedu to jedyna metoda, która nadąża — dokładnie tak Bilyoner po raz pierwszy uruchomił reklamy katalogowe i zwiększył ROAS o 49%.
Jeśli twój asortyment ma godzinę rozpoczęcia, jego miejsce jest w katalogu. Barierą prawie zawsze jest format, a nie koncepcja.
12. Feedy lokalnego asortymentu
Lokalny asortyment plasuje się między retailem a branżami specjalistycznymi: te same produkty, opisane dla każdej fizycznej lokalizacji.
Parametry: id, store_code, quantity, price, sale_price, sale_price_effective_date, availability, pickup_method (zakup, rezerwacja, wysyłka do sklepu, nieobsługiwane), pickup_sla (ten sam dzień, następny dzień, kilka dni).
Kluczowe jest to, że feed lokalny to uzupełnienie, a nie zamiennik. Odwołuje się do produktów w głównym feedzie produktowym przez id i dodaje informacje dla poszczególnych sklepów. Jeden produkt, wiele sklepów, wiele wierszy.
Warto odnotować zmianę z 2026 roku: wersje online i stacjonarne tego samego produktu z różnymi cenami lub dostępnością wymagają teraz osobnych identyfikatorów produktów, zamiast być łączone w jeden. Feedy, które je scaliły, są proszone o ich rozdzielenie.
13. Zasady formatowania
Dotyczą każdego typu feedu omówionego w tym artykule i razem odpowiadają za zdecydowaną większość feedów, które całkowicie zawodzą.
Kodowanie. Zawsze UTF-8, zadeklarowane w deklaracji XML i serwowane z pasującym nagłówkiem Content-Type. Niezgodność między zadeklarowanym a faktycznym kodowaniem uszkadza każdy znak spoza ASCII.
Escapowanie. W treści XML trzeba zakodować pięć znaków: & → &, < → <, > → >, " → ", ' → '. Niezakodowane znaki ampersand w adresach URL z parametrami śledzenia to przyczyna numer jeden feedów, których nie da się sparsować. Alternatywą jest CDATA, standardowa praktyka w feedach ofert pracy, przydatna wszędzie tam, gdzie opisy zawierają znaczniki.
Daty. ISO 8601 z jawnym przesunięciem strefy czasowej. 2026-08-16T19:00+0300, a nie 16.08.2026 19:00. Feedy obsługujące wiele rynków z jednego źródła bez stref czasowych generują produkty, które wygasają o kilka godzin za wcześnie lub za późno.
Ceny. Wartość i waluta ISO 4217, kropka dziesiętna zamiast przecinka, bez separatora tysięcy. 4299.00 TRY. A cena w feedzie musi odpowiadać stronie docelowej — na większości platform jest to egzekwowane przez crawler.
Wartości z list (enum) są wrażliwe na wielkość liter i format, a do tego różnią się między platformami. Google oczekuje in_stock; Meta oczekuje in stock. Ta jedna różnica zepsuła więcej importów katalogów niż jakakolwiek inna. Nigdy nie zakładaj, że wartość enum przeniesie się między miejscami docelowymi.
Dostarczanie pliku. Kompresja gzip dla dużych plików, stały adres URL HTTPS, brak uwierzytelniania, chyba że platforma wyraźnie je obsługuje, i serwer odpowiadający w limicie czasu platformy. Adres URL feedu za ochroną Cloudflare przed botami to adres URL feedu, który nie zostanie pobrany.
Częstotliwość aktualizacji powinna wynikać ze zmienności danych źródłowych, a nie z konwencji: co godzinę lub częściej dla kursów, cen lotów i szybko rotujących zapasów w retailu; co kilka godzin dla pojazdów i nieruchomości; raz dziennie dla stabilnych katalogów.
14. XML vs CSV vs JSON vs API
| Format | Najlepszy do | Na co uważać |
|---|---|---|
| XML | Zagnieżdżonych i powtarzających się struktur — wysyłka według regionu, wiele zdjęć, atrybuty grupowe | Rozwlekły; błędy escapowania psują cały plik |
| CSV | Prostych, płaskich katalogów, szybkich ręcznych edycji | Przecinki w tytułach i opisach; błędy cudzysłowów |
| TSV | Tego samego, ale bezpieczniej | Prawie nic — tabulatory rzadko występują w danych produktowych |
| JSON | Nowoczesnych API, procesów budowanych przez programistów | Nie każde miejsce docelowe go akceptuje |
| API | Aktualizacji w czasie rzeczywistym, bardzo dużych katalogów, częściowych aktualizacji | Koszt prac programistycznych; limity zapytań |
XML pozostaje domyślnym wyborem dla wszystkiego, co ma zagnieżdżenia, dlatego feedy pojazdów, turystyczne i retailowe z rozbudowanymi danymi o wysyłce to zwykle XML, a proste katalogi modowe często TSV. Warto też pamiętać, że kilka dużych miejsc docelowych przechodzi na pobieranie danych przede wszystkim przez API, więc traktowanie pliku jako jedynej ścieżki integracji to ryzyko w średnim terminie.
Jeśli twoje tytuły zawierają przecinki — a tytuły z kolorem i rozmiarem prawie zawsze je zawierają — wybierz TSV zamiast CSV. Znika cała klasa błędów parsowania.
15. Lista kontrolna przed startem
- [ ] Plik przechodzi walidację w walidatorze XML, zanim w ogóle zbliży się do platformy
- [ ]
UTF-8jest zadeklarowane i poprawnie serwowane; znaki spoza ASCII wyświetlają się prawidłowo - [ ] Każdy
&w każdym adresie URL jest zakodowany lub pole jest opakowane wCDATA - [ ] Identyfikatory są unikalne, stałe między synchronizacjami i zgodne ze zdarzeniami piksela lub tagu
- [ ] Obecne są wszystkie wymagane atrybuty dla docelowego kanału — zweryfikowane ze specyfikacją tego kanału, a nie ogólną
- [ ] Wartości enum są przekształcane dla każdego miejsca docelowego, a nie kopiowane
- [ ] Ceny dokładnie odpowiadają stronom docelowym, łącznie z walutą i sposobem uwzględnienia podatków
- [ ] Daty są w formacie ISO 8601 z przesunięciem strefy czasowej
- [ ] Zdjęcia spełniają minimum 500x500 i ładują się przez HTTPS bez przekierowań
- [ ] Sprzedane, obsadzone, wygasłe lub zakończone pozycje znikają z feedu we właściwym czasie
- [ ] Częstotliwość aktualizacji odpowiada temu, jak szybko faktycznie zmieniają się dane źródłowe
- [ ] Adres URL feedu jest publicznie dostępny i nie jest blokowany przez ochronę przed botami
- [ ] Istnieje reguła monitorowania nieoczekiwanych zmian liczby produktów
16. FAQ
Czy XML to nadal właściwy format w 2026 roku?
Dla wszystkiego, co ma zagnieżdżone dane — tak. Dla płaskich katalogów TSV jest prostszy i mniej podatny na błędy. Przy wymaganiach czasu rzeczywistego integracja przez API wygrywa z każdym plikiem. Format powinien wynikać z danych, a nie z przyzwyczajenia.
Czy mogę używać jednego feedu dla każdej platformy?
Jednego źródła — tak. Jednego pliku — nie. Nazwy pól, wartości enum, limity znaków i wymagane atrybuty różnią się w zależności od miejsca docelowego, a różnice nie są kosmetyczne. Działająca architektura to jeden kanoniczny katalog z przekształceniami dla poszczególnych kanałów stosowanymi przy eksporcie.
Co, jeśli mój asortyment to nie produkty?
Wtedy potrzebujesz specyfikacji dla swojej branży, a nie retailowej. Pojazdy, hotele, loty, kierunki podróży, nieruchomości i oferty pracy mają własne. A jeśli twój asortyment to coś, dla czego żadna platforma nie ma specyfikacji — mecze, seanse, terminy, przedmioty aukcyjne — modelujesz go jako produkty i kodujesz brakujący wymiar w istniejących polach.
Jak często należy aktualizować feed?
Tak często, jak istotnie zmieniają się dane źródłowe. Pojazd, który sprzedano dziś rano, a który nadal jest reklamowany po południu, wydaje pieniądze na nic.
Czy potrzebuję GTIN?
W retailu w praktyce tak. GTIN łączy twój produkt z wiedzą platformy o produktach, co coraz częściej decyduje o tym, czy w ogóle pojawisz się w porównaniach i wynikach zakupowych opartych na AI. W przypadku pojazdów, nieruchomości i ofert pracy odpowiednikami pól tożsamości są vin, identyfikator oferty i numer referencyjny.
Gdzie robi się trudno
Żadna z poszczególnych zasad w tym artykule nie jest trudna. Trudność polega na tym, że jest ich kilkaset, różnią się w zależności od miejsca docelowego, zmieniają się bez ostrzeżenia, a ich naruszenie kończy się cichą porażką.
Jeden katalog eksportowany do Google, Meta, TikTok i trzech marketplace’ów to sześć różnych kontraktów spełnianych jednocześnie z jednego źródła prawdy. Robienie tego ręcznie oznacza utrzymywanie sześciu plików i uzgadnianie ich przy każdej zmianie katalogu.
Do tego właśnie zbudowano Feedance — reguły feedu normalizujące atrybuty u źródła, eksporty do kanałów, które stosują właściwe przekształcenie dla każdego z ponad 200 miejsc docelowych bez ingerencji w dane źródłowe, Feed Protection, który wychwytuje brakujące atrybuty i nieoczekiwane zmiany liczby produktów, zanim zrobi to platforma, oraz Creative Suite, który generuje grafikę lub wideo dla każdego wiersza feedu w katalogach, w których ręczna produkcja nigdy nie była realna.
Obsługuje branże inne niż retail jako pełnoprawne, a nie dodane na doczepkę — asortyment turystyczny z cenami na żywo, katalogi bukmacherskie z danymi match time, kanały dystrybucji ofert motoryzacyjnych, nieruchomości i ofert pracy.
Jeśli chcesz wiedzieć, w jakim stanie jest twój obecny feed, zanim cokolwiek zmienisz, nasze bezpłatne narzędzie do audytu feedu bezpłatnie oceni go pod kątem kompletności, jakości danych i kondycji technicznej. Możesz też umówić 15-minutowe demo, a przyjrzymy się mu razem.
Ostatnia aktualizacja: sierpień 2026. Specyfikacje platform często się zmieniają; przed wdrożeniem zweryfikuj aktualne wymagania w oficjalnej dokumentacji każdego miejsca docelowego.

Współzałożyciel Feedance, gdzie wykorzystuje swoje doświadczenie jako inżynier komputerowy i marketer, aby dostarczać analityczne wnioski. Skupia się na przekształcaniu danych w konkretne strategie i pomaga markom osiągać znaczący wzrost w świecie cyfrowym.
LinkedIn
















