Wiadomość została wysłana.

Jak przekazać feed produktowy do ChatGPT Shopping?

ChatGPT Shopping nie czyta znacznika na karcie produktu. Katalog wysyła się plikiem do OpenAI przez SFTP. Do discovery każdy wiersz potrzebuje item_id, title, description, url, brand, seller_name, image_url, availability i price.

Czym jest ten plik

ChatGPT Shopping to produkty w odpowiedziach ChatGPT. W dokumentacji commerce OpenAI katalog jest product feedem: plikiem, który wgrywasz, a nie przejściem po stronie kategorii.

Przewodnik get started ma cztery kroki. Przeczytaj schemat pliku. Sprawdź wymagane pola w każdym rekordzie. Wgraj katalog przez SFTP. Nadpisz ten sam plik nowym zrzutem. OpenAI zaleca pełny zrzut co najmniej raz dziennie. Discovery, ads i checkout to osobne ustawienia. Lista pól: https://developers.openai.com/commerce/specs/file-upload/products. Dostarczenie pliku: https://developers.openai.com/commerce/specs/file-upload/overview.

Jaki plik przyjmuje OpenAI

W opisie file upload feed idzie przez SFTP. Preferowany format to parquet. Obsługiwane są też jsonl.gz, csv.gz i tsv.gz. Kodowanie to UTF-8.

Nazwa pliku zostaje stała i nadpisujesz ją. Jeśli katalog jest pocięty na części, nazwy części też zostają. W opisie jest do 500 000 pozycji na część i pliki około 500 MB. URL mają być publiczne, bezwzględne i najlepiej HTTPS. W CSV komórkę z przecinkiem bierze się w cudzysłów.

Hosta SFTP się nie zgaduje. Opis uploadu pliku go nie podaje. Przewodnik Ads zwraca host, port i nazwę użytkownika z sftp_access dla tego feedu. Nie ma tam zdania, że feed discovery używa tego samego hosta.

Przewodnik get-started mówi, że onboarding feedu jest teraz dla approved partners: https://developers.openai.com/commerce/guides/get-started. Na https://chatgpt.com/merchants/ osoby, które już złożyły wniosek, są na liście oczekujących. Katalogi Shopify i Etsy są już podłączone. Shopping w ChatGPT działa dla użytkowników w US.

Dziewięć wymaganych pól

Dla użytecznego wiersza discovery OpenAI oznacza dziewięć pól jako wymagane. Wymagane pole musi mieć wartość. Pusta komórka nie znaczy zera ani false. Nie wysyłaj słów null, unknown ani n/a. Wyjątek to availability: tam unknown jest dozwolony.

item_id to stabilny ciąg, unikalny dla towaru albo wariantu. Nie używaj go ponownie dla innego towaru. Aliasy id i sku są przyjmowane, ale gdy obok jest item_id, wygrywa on. Trzymaj wartość jako tekst, żeby nie zniknęło zero z przodu.

title to nazwa, z wariantem, gdy to ma znaczenie. Cel to najwyżej 150 znaków. description to zwykły tekst. Cel to najwyżej 5 000 znaków. url to karta produktu, w miarę możliwości już z wybranym wariantem.

brand to marka jak na stronie. seller_name to sprzedawca tej oferty. image_url to bezpośredni plik obrazu tego wariantu, nie strona HTML.

availability to jedno z in_stock, out_of_stock, pre_order, backorder, unknown. Pusta albo nierozpoznana wartość odrzuca wiersz. unknown nie znaczy, że towar jest dostępny. Stawiasz je tylko wtedy, gdy statusu naprawdę nie ma.

price to zwykła cena w jednostkach głównych: kwota, spacja i kod ISO 4217 wielkimi literami, jak 79.99 USD. Kropka, bez separatora tysięcy i bez symbolu waluty. Dla USD dwa miejsca po kropce. Nie zaokrąglaj ceny do innej kwoty do zapłaty.

Warianty, identyfikatory i cena promocyjna

Jeden wiersz to jeden wariant, który da się kupić. Wiersze mają wspólne group_id i własne item_id. listing_has_variations ustaw na true, a variant_dict to pary w rodzaju color i size. group_id nie jest równe item_id. Każdy wiersz ma własne price, availability, url i obraz.

gtin jest opcjonalny: 8, 12, 13 albo 14 cyfr z cyfrą kontrolną, bez spacji. Nie wymyślaj go. mpn to numer producenta i idzie razem z brand.

sale_price jest opcjonalny. Jest większy od zera, mniejszy od price i w tej samej walucie. Promocja zaczyna się i kończy, gdy aktualizujesz plik. Według schematu daty w pliku same ceny nie przełączają.

Tam też jest napisane, że standardowy upload celuje teraz w US. Kolumna target_countries sama tego nie zmienia. Inny rynek trzeba potwierdzić w integracji.

Zapis 79.99 PLN pasuje do formatu ceny: liczba dziesiętna, spacja i kod ISO 4217. Nie wybiera Polski.

{"item_id":"MUG-350-BLUE","title":"Ceramic mug, 350 ml, blue","description":"Glazed ceramic mug with a handle. Dishwasher safe.","url":"https://example.com/products/mug-blue","brand":"Northline","seller_name":"Northline Home","image_url":"https://example.com/images/mug-blue.jpg","price":"18.00 USD","availability":"in_stock"}

Shopify, WooCommerce i własny katalog

W schemacie nie ma kolumny nazwanej od platformy. Przekładasz swój katalog na te pola.

W Shopify bierz stabilne id wariantu jako item_id i nie używaj go drugi raz. title, tekst bez HTML, URL wariantu, vendor i nazwa sklepu wchodzą w title, description, url, brand i seller_name. Obraz to bezpośredni URL pliku. Ilość powyżej zera to in_stock. Cena to jednostki główne plus waluta, nie centy. Eksport to Admin API albo CSV produktów, a jego wiersz nagłówków nie jest schematem OpenAI.

W WooCommerce unikalny SKU to item_id. Gdy SKU się powtarzają, bierz id wariacji. permalink to url. Cena regularna to price. instock przechodzi w in_stock, outofstock w out_of_stock, onbackorder w backorder. OpenAI pisze przedsprzedaż jako pre_order. Google Merchant pisze preorder. Kopia feedu Google bez tej zmiany odrzuci te wiersze.

Własny sklep eksportuje te kolumny z bazy, która karmi kartę. Plik składaj na serwerze. Cena w pliku i cena w HTML to ta sama liczba i ta sama waluta.

Jak poznać, że wiersz został przyjęty

Zacznij od 100 towarów ze wszystkimi wymaganymi polami, potem sprawdź pierwszy zrzut i nadpisz tę samą nazwę pliku.

Zakończony transfer SFTP nie jest jeszcze przyjętym wierszem.

Dla feedów Ads OpenAI opisuje statusy: scanning, received, processing, completed, completed_with_errors, skipped i failed. Kody obejmują missing_required_column, invalid_value, unsupported_file_type i invalid_sftp_directory_layout. Pliki leżą w katalogu głównym SFTP. Strona: https://developers.openai.com/ads/product-feeds.

Przewodnik uploadu pliku nie nazywa ekranu wierszy przyjętych i odrzuconych. Produkty czytasz przez commerce API: https://developers.openai.com/commerce/specs/api/overview. To nie jest Ads. Status Ads nie jest wynikiem discovery.

Przez co wiersz odpada

Cena zapisana jako 79,99, 79.99PLN albo $79.99 nie ma udokumentowanej postaci. availability jako preorder, in stock albo pusta komórka nie jest na liście. image_url wskazujący stronę HTML nie jest bezpośrednim obrazem. URL, który nie jest publiczny, nie przechodzi reguły dostępu.

Ponowne użycie item_id dla nowego towaru łamie regułę identyfikatora. Wiersze wariantów z jednym item_id albo z group_id równym item_id nie tworzą grupy. HTML w description łamie regułę zwykłego tekstu.

  • Jeden wiersz na wariant, ze stabilnym item_id, którego nie używasz ponownie.
  • W każdym wierszu są title, description, url, brand, seller_name i bezpośredni image_url.
  • availability to in_stock, out_of_stock, pre_order, backorder albo unknown.
  • price wygląda jak 18.00 USD: kropka, spacja i kod waluty ISO.
  • Plik to parquet albo jsonl.gz, csv.gz lub tsv.gz, w UTF-8, i nadpisuje tę samą nazwę.
  • Cena w pliku jest taka sama jak cena w HTML strony.
Czy mogę wysłać feed Google Merchant bez zmian?

Nie jako ślepą kopię. Część nazw jest inna. Google używa id, link i image_link. OpenAI używa item_id, url i image_url, a do tego wymaga seller_name. Google pisze preorder, OpenAI pre_order. Dla części starych nazw są aliasy, ale item_id i tak wygrywa z id.

Czy JSON-LD na karcie zastępuje ten plik?

Nie. Plik jest tym, co OpenAI przyjmuje do ChatGPT Shopping. schema.org Product i Offer opisują te same fakty na stronie. Mają się zgadzać. Jedno nie uzupełnia drugiego.

Jak często podmieniać plik?

Get started zaleca pełny zrzut co najmniej raz dziennie, na tę samą nazwę. price i availability aktualizuj, gdy się zmieniają. Według schematu daty we wgranym pliku same tego nie planują.

Co zrobić, gdy wariantu nie ma w magazynie?

Zostaw wiersz z availability out_of_stock i aktualną ceną. Usunięcie wiersza chowa wariant. unknown jest tylko wtedy, gdy statusu nie masz, i nie znaczy, że towar jest dostępny.