20 nejčastějších chyb v produktových feedech – a jak je opravit
Produktové feedy jsou cesta, jak se váš katalog dostane do Google Shopping, na Metu a do desítek marketplaců – a téměř všechny jsou v XML. Zrádná je na tom to, že jediný špatný znak nebo chybná hodnota pole se málokdy projeví hlasitě. Místo toho se jednotlivé produkty potichu zamítnou nebo se celý feed označí za neplatný a vy přicházíte o tržby bez zjevné příčiny. Níže najdete 20 chyb, na které narážíme nejčastěji – u každé je špatná verze, oprava a krátká poznámka, proč na ní záleží.
1. Špatná XML deklarace
XML deklarace musí být úplně první věcí v souboru – žádný prázdný řádek, žádný komentář, žádné BOM před ní. Měla by také uvádět kódování. Pokud jí cokoli předchází, většina parserů dokument rovnou odmítne.
❌ Špatně
<!-- generated by export tool -->
<?xml version="1.0"?>
<products>...</products>
✅ Opraveno
<?xml version="1.0" encoding="UTF-8"?>
<products>...</products>
2. Neuzavřené nebo nespárované tagy
Každý element, který otevřete, musíte uzavřít, a uzavírací tag musí odpovídat tomu otevíracímu. Jediný chybějící </address> zneplatní celý feed, takže se nenaimportuje nic – ne jen ten jeden produkt.
❌ Špatně
<item>
<title>Stolní lampa</title>
<address>
<city>Praha</city>
</item>
✅ Opraveno
<item>
<title>Stolní lampa</title>
<address>
<city>Praha</city>
</address>
</item>
3. Neescapované vyhrazené znaky
Znaky &, < a > mají v XML zvláštní význam. Holý ampersand v názvu nebo popisu je vůbec nejčastější důvod, proč se feed nedá naparsovat. Escapujte ho jako & nebo text zabalte do CDATA.
❌ Špatně
<title>Sůl & pepř mlýnek</title>
✅ Opraveno
<title>Sůl & pepř mlýnek</title>
4. Nedeklarovaný namespace
Feedy pro Google Shopping používají prefix g: (g:price, g:availability, …). Ten funguje jen tehdy, když jeho namespace deklarujete na kořenovém elementu. Bez deklarace není dokument well-formed a všechna pole g: jsou nerozpoznaná.
❌ Špatně
<rss version="2.0">
<channel>
<item><g:price>99.99 USD</g:price></item>
</channel>
</rss>
✅ Opraveno
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<item><g:price>99.99 USD</g:price></item>
</channel>
</rss>
5. Křížení / překrývání tagů
Elementy se musí čistě vnořovat: potomek otevřený uvnitř rodiče se musí uzavřít dřív než rodič. Překrývající se tagy jako <a><b></a></b> nejsou nikdy platné XML, i když vypadají neškodně.
❌ Špatně
<title><b>Výprodej</title></b>
✅ Opraveno
<title><b>Výprodej</b></title>
6. Více kořenových elementů
XML dokument musí mít právě jeden kořenový element. Dva elementy <item> na nejvyšší úrovni bez ničeho, co by je obalovalo, jsou neplatné – obalte je jediným kontejnerem, třeba <channel> nebo <products>.
❌ Špatně
<item><id>1</id></item>
<item><id>2</id></item>
✅ Opraveno
<products>
<item><id>1</id></item>
<item><id>2</id></item>
</products>
7. Špatný datový typ v hodnotě
Pole, které očekává číslo, musí číslo obsahovat. Cena jako invalid nebo volejte nám se nedá naparsovat, takže produkt vypadne. Kde je vyžadovaná měna, uveďte ji v hodnotě nebo ve vyhrazeném poli.
❌ Špatně
<price>invalid</price>
✅ Opraveno
<price>99.99 USD</price>
8. Chybná CDATA
CDATA umožňuje vložit do pole HTML bez escapování, ale musí se otevřít <![CDATA[ a uzavřít ]]> – a sekvence ]]> se nesmí objevit uvnitř obsahu. Neuzavřená CDATA sekce spolkne zbytek dokumentu.
❌ Špatně
<description><![CDATA[Měkké <b>bavlněné</b> tričko</description>
✅ Opraveno
<description><![CDATA[Měkké <b>bavlněné</b> tričko]]></description>
9. Nesoulad kódování
Deklarace může uvádět UTF-8, ale pokud je soubor reálně uložený jako Windows-1250, přijdou znaky s diakritikou (ř, ž, ä) jako mojibake – nebo parser selže na prvním bajtu, který nedokáže dekódovat. Soubor musí být uložený ve stejném kódování, jaké deklaruje.
❌ Špatně
<?xml version="1.0" encoding="UTF-8"?>
<title>PĹ™ĂborovĂ˝ set</title> <!-- soubor uložený jako Windows-1250 -->
✅ Opraveno
<?xml version="1.0" encoding="UTF-8"?>
<title>Příborový set</title> <!-- soubor uložený jako UTF-8 -->
10. Duplicitní ID produktů
Každá položka potřebuje unikátní id. Když dva produkty (nebo dvě varianty) sdílejí stejné id, kanál je považuje za jeden a ponechá jen ten poslední – nabídky tak z vašeho účtu potichu mizí.
❌ Špatně
<item><id>SHIRT-01</id><title>Modré tričko</title></item>
<item><id>SHIRT-01</id><title>Červené tričko</title></item>
✅ Opraveno
<item><id>SHIRT-01-BLUE</id><title>Modré tričko</title></item>
<item><id>SHIRT-01-RED</id><title>Červené tričko</title></item>
11. Nekonzistentní nebo překlepem zkomolené názvy tagů
XML rozlišuje velikost písmen a importéry hledají názvy polí přesně. Překlep jako <prodcut> nebo míchání <price> a <Price> znamená, že se pole prostě ignoruje a jakákoli data, která neslo, se ztratí.
❌ Špatně
<prodcut>
<Price>19.99 USD</Price>
</prodcut>
✅ Opraveno
<product>
<price>19.99 USD</price>
</product>
12. Holé HTML v polích bez CDATA/escapování
Pole title má být prostý text – holé značky v něm rozbijí XML a v nabídkách stejně vypadají špatně. Názvy nechte prosté a formátované HTML dávejte jen do polí, která ho povolují (např. description), zabalené do CDATA.
❌ Špatně
<title>Velký <b>výprodej</b></title>
✅ Opraveno
<title>Velký výprodej</title>
<description><![CDATA[Velký <b>výprodej</b> tento víkend]]></description>
13. Nekonzistentní uvozovky u atributů
Hodnoty atributů musí být v uvozovkách a v dokumentu byste neměli míchat jednoduché a dvojité. Nekonzistentní uvozovky dělají problém přísnějším parserům a feed se hůř udržuje. Držte se dvojitých uvozovek.
❌ Špatně
<product id='123' name="Lampa"></product>
✅ Opraveno
<product id="123" name="Lampa"></product>
14. Chybějící povinná pole
Každý kanál zveřejňuje seznam povinných atributů – obvykle id, title, price a availability. Když jeden vynecháte, položka se zamítne, ať jsou ostatní data jakkoli dobrá.
❌ Špatně
<item>
<title>Běžecké boty</title>
</item>
✅ Opraveno
<item>
<g:id>RUN-42</g:id>
<title>Běžecké boty</title>
<g:price>79.00 USD</g:price>
<g:availability>in_stock</g:availability>
</item>
15. Neplatná enum hodnota
Některá pole přijímají jen pevně danou sadu hodnot definovanou kanálem. availability je klasický příklad: yes neplatí – Google očekává in_stock, out_of_stock nebo preorder. Hodnota mimo specifikaci znamená zamítnutí položky.
❌ Špatně
<g:availability>yes</g:availability>
✅ Opraveno
<g:availability>in_stock</g:availability>
16. Nestandardní / nedefinované entity
XML definuje jen pět entit (&, <, >, ", '). Vymyšlené entity jako &customEntity; – nebo ty z HTML, třeba ™ – nejsou rozpoznané a rozbijí parsování. Použijte místo nich číselnou znakovou referenci.
❌ Špatně
<title>BrandName™ reproduktor</title>
✅ Opraveno
<title>BrandName™ reproduktor</title>
17. Neplatné identifikátory produktu (GTIN/EAN)
Pokud posíláte GTIN, musí být skutečný – 8, 12, 13 nebo 14 číslic s platnou kontrolní číslicí. Krátký nebo vymyšlený kód je horší než žádný: označí se za chybný. Když GTIN nemáte, dodejte místo něj brand + mpn.
❌ Špatně
<g:gtin>12345</g:gtin>
✅ Opraveno
<g:gtin>0036000291452</g:gtin>
<!-- nebo, pokud GTIN neexistuje: -->
<g:brand>Acme</g:brand>
<g:mpn>AC-1099</g:mpn>
18. Testovací data / komentáře ponechané ve feedu
Ladicí komentáře a zástupné „test" produkty mají tendenci se protáhnout až do produkce. V lepším případě feed jen zaplevelí; v horším se „test" položka s cenou 0,01 schválí a ukáže reálným zákazníkům. Posílejte jen čistá produkční data.
❌ Špatně
<!-- TODO: odstranit před spuštěním -->
<item><id>test-1</id><title>TEST PRODUKT</title></item>
✅ Opraveno
<item><id>LAMP-01</id><title>Stolní lampa</title></item>
19. Špatný formát čísel / cen
Ceny potřebují strojově čitelný formát: tečku jako desetinný oddělovač, žádný oddělovač tisíců, žádný měnový symbol přilepený k číslu. 1.299,00 Kč je v pořádku pro člověka, ale pro importér nečitelné – očekává 1299.00 CZK.
❌ Špatně
<g:price>1.299,00 Kč</g:price>
✅ Opraveno
<g:price>1299.00 CZK</g:price>
20. Ignorování chyb při validaci feedu
Nejdražší chyba je nasadit feed, o kterém už víte, že má varování. Ta varování jsou produkty, které se neukážou. Prožeňte feed XML validátorem a diagnostikou kanálu (třeba Google Merchant Center) a chyby opravte dřív, než publikujete.
❌ Špatně
<!-- „zamítnuto 47 položek" – přesto publikováno -->
✅ Opraveno
<!-- validovat, opravit všechny chyby, pak publikovat: 0 zamítnutých -->
Napříč všemi 20 chybami platí totéž: validujte dřív, než publikujete. Rychlý průchod XML validátorem a diagnostikou vašeho kanálu odchytí téměř vše výše ještě předtím, než vás to připraví o prodej. Přesně tohle za vás řeší produktové feedy od Feedyio – generuje správně naformátované a zvalidované feedy se správnými povinnými poli pro každý kanál včetně hotového feedu pro Google Merchant Center a synchronizuje ceny i sklad každou hodinu. Vyzkoušejte Feedyio zdarma na Shopify App Store.