Koszt własny sprzedaży w WooCommerce — jak włączyć i uzupełnić koszty
WooCommerce od wersji 10.3 zapisuje koszt własny sprzedaży przy każdym zamówieniu. Funkcja jest domyślnie wyłączona, nic nie uzupełnia się wstecz, a trzy rzeczy w tym mechanizmie naprawdę zaskakują. Tu jest cały obraz na jednej stronie.
Aktualizacja 2026-10-16
Czym jest to pole i dlaczego pojawiło się tak późno
WooCommerce zawsze wiedział, co sprzedałeś. Do końca 2025 nie miał pojęcia, ile ten towar Cię kosztował — i dlatego „ile właściwie zarobiłem” było pytaniem, na które odpowiadał arkusz albo abonament w chmurze.
W WooCommerce 10.3, wydanym 22 października 2025 po dwóch cyklach bety, koszt własny sprzedaży wszedł do rdzenia. Dzieją się z nim dwie rzeczy, a ciekawa jest tylko druga:
- na produkcie możesz zapisać koszt — jedną wartość netto za sztukę;
- na każdej pozycji zamówienia WooCommerce zapisuje koszt taki, jaki był w chwili sprzedaży.
Ta druga część to coś, czego żadna wtyczka nie dorobiłaby uczciwie wstecz. Koszt zapisany na zamówieniu jest faktem historycznym: zamówienie z marca nadal mówi, ile towar kosztował w marcu, także po dwóch podwyżkach u dostawcy. Koszt odczytany z dzisiejszej kartoteki produktu to tylko dzisiejsze przypuszczenie nałożone na zeszłoroczną sprzedaż.
Funkcja jest opcjonalna i do momentu włączenia nie robi nic.
Krok pierwszy — włącz funkcję
WooCommerce → Ustawienia → Zaawansowane → Funkcje → Cost of Goods Sold.
To pole wyboru, samo z siebie nie zmienia żadnych danych i jest ustawieniem WooCommerce, a nie czymkolwiek związanym z wtyczką raportową. Jeśli tej pozycji nie ma na liście, sklep stoi na wersji starszej niż 10.3 — zajrzyj w WooCommerce → Status i najpierw zaktualizuj.
Zostawienie tego wyłączonego ma cenę płaconą po cichu: przy wyłączonej funkcji nowe zamówienia nie zapisują kosztu w ogóle, a tej luki nie da się uzupełnić później. Pół roku zamówień przyjętych z wyłączonym przełącznikiem to pół roku, którego żaden raport zysku nigdy nie wyjaśni.
Krok drugi — wpisz koszt na produkcie
Pole stoi w zakładce Ogólne edycji produktu, zaraz pod polami ceny, i nazywa się Koszt towaru. Trzy szczegóły mają znaczenie:
- jest netto, jak pozostałe pola cenowe — bez podatku;
- jest za jedną sztukę, nie za pozycję zamówienia;
- puste to nie zero. Puste pole znaczy „nie wiemy”, a dobry raport tak to potraktuje, zamiast po cichu założyć, że towar był darmowy.
Wpisz koszt, który realnie płacisz za towar. Czy wliczasz w to transport do siebie, cło albo opakowanie, jest Twoją decyzją — ale podejmij ją raz dla wszystkich produktów. Marża policzona z dwóch różnych definicji kosztu nie jest porównywalna z niczym.
Krok trzeci — poczekaj na zamówienia
Od chwili, gdy koszt jest na produkcie, każde nowe zamówienie go zapisuje. Zamówienia już w bazie trzymają to, co zapisały w swoim czasie, a dla starszych znaczy to: nic.
Nie ma uzupełniania wstecz i jest to decyzja, nie przeoczenie. Znaczy to też, że użytecznym pytaniem po takim uruchomieniu nie jest „dlaczego historia jest pusta”, tylko „za jaki okres mam kompletne dane”.
Uzupełnianie kosztów bez przeklikiwania 500 produktów
Panel rdzenia daje jedno pole kosztu na produkt i żadnej edycji masowej. Dwie rzeczy czynią to wykonalnym.
Pierwsza: nie potrzebujesz wszystkich produktów. Posortuj katalog po przychodzie i zacznij od góry. W większości sklepów pięćdziesiąt produktów robi zdecydowaną większość obrotu, więc jeden wieczór wpisywania podnosi pokrycie z 0% do jakichś 80% — a to pokrycie decyduje, czy resztę raportu warto czytać.
Druga: koszt da się wpisać skryptem. Z WP-CLI, jedno wywołanie na produkt:
wp eval '$p = wc_get_product( 123 ); $p->set_cogs_value( 41.50 ); $p->save();'
Żeby ruszyć to z arkusza, wyeksportuj id,koszt do CSV i przejedź po nim pętlą, wołając te same
dwie metody. REST API nosi tę samą wartość jako obiekt cost_of_goods_sold na products
i variations, jeśli wolisz pracować po HTTP.
Cała droga — szablon arkusza, gotowy skrypt, próba na sucho i lista rzeczy, których to nie naprawi — stoi w masowym uzupełnianiu kosztów.
Wszystko to zapisuje do sklepu, więc najpierw kopia i kopia zapasowa. To Twój skrypt i Twoje dane — żadna wtyczka raportowa nie musi w tym uczestniczyć, a Merchgain świadomie nie zrobi tego za Ciebie.
Produkty z wariantami — dziedziczenie, zastąpienie, dopłata
Wariant dziedziczy koszt produktu nadrzędnego, dopóki nie ma własnego. Jeśli ma, jeden przełącznik decyduje, co to znaczy: koszt wariantu albo zastępuje koszt rodzica, albo jest do niego doliczany.
Tryb doliczany warto zapamiętać, bo jest naprawdę użyteczny i łatwo go przegapić. Koszulka z kosztem 24 i wariant oznaczony jako doliczany z kosztem 3 daje 27 — dokładnie wtedy, gdy wariant jest dopłatą (haft, nadruk XXL), a nie innym towarem.
Idzie z tym jedna pułapka: kolumna pomocnicza WooCommerce trzyma wartość wpisaną, a nie efektywną, więc wariant po prostu dziedziczący koszt rodzica wygląda jak wariant bez kosztu. Każda lista „produkty bez kosztu”, która ignoruje rodzica, będzie pełna fałszywych alarmów. Szczegóły w kosztach w wariantach.
Trzy pułapki, o których nie mówi dokumentacja
Wszystkie trzy odczytane w źródłach WooCommerce i wszystkie trzy zmieniają liczby na ekranie. Pełna wersja, razem z jedną linijką kodu, z której wynikają wszystkie trzy, stoi w trzech pułapkach w danych o koszcie. Warto je znać, zanim zbudujesz na tych danych arkusz.
Koszt zero zapisuje się jako brak kosztu
Gdy koszt pozycji zamówienia ma zostać zapisany jako zero, rdzeń kasuje wartość, zamiast zapisać zero. Darmowa próbka i produkt, któremu nikt nie policzył kosztu, są więc w bazie tym samym brakiem i żadna wtyczka ich nie odróżni. Gratisy zawsze będą na liście braków. Pełne wyjaśnienie.
Zwrot przepisuje zapisany koszt całego zamówienia
Wystawienie zwrotu każe WooCommerce przeliczyć koszt każdej pozycji pierwotnego zamówienia z kosztu produktu takiego, jaki jest dzisiaj. Jeśli cena zakupu zmieniła się w międzyczasie, zapisana historia zmienia się razem z nią — a jeśli koszt został wyczyszczony, przeliczenie daje zero, które kasuje wartość na dobre. Dlaczego historyczny zysk się zmienia.
Wyłączenie funkcji może skasować dane przy najbliższym zapisie
Zmierzone na WooCommerce 10.3.0: samo wyłączenie funkcji nie kasuje niczego. Ryzykiem jest najbliższy zapis — przy wyłączonej funkcji koszt wylicza się jako zero, a zapis zera kasuje wartość, więc edycja starego zamówienia albo zwrot do niego mogą wyczyścić jego historię kosztu. Co robi wyłączenie.
Co raport potrafi z tego zrobić
Rdzeń zapisuje koszt i na tym kończy — WooCommerce 10.3 nie przyniósł żadnych raportów COGS, a post wydania wprost zaprosił deweloperów do ich zbudowania. Analityka WooCommerce też go nie czyta — dlaczego kosztu nie ma w Analityce. Poza sklepem ten sam koszt w pliku produktów chcą rabaty automatyczne Google w reklamach produktowych — czego wymaga ta konfiguracja. Oto, co Merchgain robi z tymi samymi danymi:
Zysk brutto, przychód, koszt towaru i marża za okres — dalej na ekranie te same liczby per produkt i per kategoria — a pod nimi zdanie, które decyduje, czy cokolwiek z tego jest użyteczne:
Koszt jest znany dla 74% przychodu. Zysk i marża powyżej są policzone tylko na tej części; 1 119 760,42 zł przychodu nie ma zapisanego kosztu.
To zdanie jest różnicą między raportem, na którym można działać, a precyzyjnie wyglądającym raportem mylącym się po cichu o jedną czwartą. Cały ekran na danych demo można zobaczyć bez instalowania czegokolwiek.
Gdy funkcja jest jeszcze wyłączona, raport nie ma czego pokazać — i powiedzenie tego wprost jest lepsze niż cztery zera:
Krótka lista kontrolna
- WooCommerce 10.3 lub nowszy — sprawdź w WooCommerce → Status.
- Włącz Ustawienia → Zaawansowane → Funkcje → Cost of Goods Sold.
- Zdecyduj raz, co u Ciebie znaczy „koszt”, i zapisz to gdzieś.
- Wpisuj koszty od góry po przychodzie, nie alfabetycznie.
- Przy wariantach wybierz jedną konwencję na produkt — dziedziczenie, zastąpienie albo dopłatę.
- Nie oczekuj, że historia się uzupełni. Oceniaj raport po okresie od wpisania kosztów.
- Eksportuj CSV na koniec każdego miesiąca. Zwroty i edycje kosztu mogą przepisać zapisane koszty; comiesięczny eksport jest jedynym zapisem, którego nic innego nie zmieni.
Jeśli coś tutaj nie zgadza się z tym, co widzisz we własnym sklepie, warto o tym napisać — każda wiadomość jest czytana, a odpowiedzi na tej stronie są poprawiane, kiedy okazują się błędne.