System kaucyjny w sklepie internetowym na WooCommerce: jak pobierać, pokazywać, rozliczać i zwracać kaucję

Zrzut ekranu: gov.pl, Ministerstwo Klimatu i Środowiska, 31 października 2026

System kaucyjny w sklepie internetowym na WooCommerce: jak pobierać, pokazywać, rozliczać i zwracać kaucję

Ostatnio zweryfikowano: 31 października 2026
21 min czytania
Przewodnik
Ekspert WooCommerce

Jeśli sprzedajesz przez internet napoje w butelkach PET, puszkach albo szklanych butelkach zwrotnych, od 1 października 2025 r. do zamówienia dochodzi kaucja: 50 groszy za butelkę plastikową i puszkę, 1 zł za szklaną butelkę wielokrotnego użytku. Kaucja nie wchodzi do podstawy VAT, nie jest rabatem ani częścią ceny, a klient odzyskuje ją w dowolnym punkcie zbiórki, bez paragonu. WooCommerce sam tego nie obsługuje, więc kaucję trzeba dodać jako osobną pozycję w koszyku.

Poniżej znajdziesz to, co o sprzedaży napojów mówi ustawa o gospodarce opakowaniami i odpadami opakowaniowymi po zmianach, czego w niej nie ma (a dla sklepu internetowego brakuje sporo), jak rozliczyć kaucję w VAT i na fakturze, co zrobić przy zwrocie zamówienia oraz co się zmienia, gdy wysyłasz napoje do Niemiec czy Austrii. Każde twierdzenie o prawie ma link do tekstu aktu w Dzienniku Ustaw, do strony ministerstwa albo do operatora. Stan na 31 października 2026 r. Tam, gdzie czegoś nie udało mi się potwierdzić w źródle urzędowym, piszę to wprost.

#Ile wynosi kaucja i za jakie opakowania?

Stawki ustala rozporządzenie Ministra Klimatu i Środowiska z 8 lipca 2024 r. w sprawie wysokości kaucji (Dz.U. 2024 poz. 1046). Paragraf 1 brzmi tak:

“Wysokość kaucji za jedną sztukę opakowania wynosi dla: 1) butelek jednorazowego użytku z tworzyw sztucznych na napoje o pojemności do trzech litrów, włącznie z ich zakrętkami i wieczkami z tworzyw sztucznych, z wyłączeniem szklanych lub metalowych butelek na napoje, których zakrętki i wieczka są wykonane z tworzyw sztucznych - 0,50 zł; 2) puszek metalowych o pojemności do jednego litra - 0,50 zł; 3) butelek szklanych wielokrotnego użytku o pojemności do półtora litra - 1,00 zł.”

Dz.U. 2024 poz. 1046, § 1

Dla sklepu wynikają z tego trzy reguły do zapisania w danych produktu. Puszka o pojemności 1,5 litra kaucji nie ma, bo puszki obejmuje system tylko do jednego litra. Szklana butelka jednorazowa (wino, część soków) też nie, bo rozporządzenie wymienia wyłącznie szkło wielokrotnego użytku. Zgrzewka sześciu puszek to sześć kaucji, czyli 3 zł do jednej pozycji w koszyku.

Ustawa ogranicza wysokość kaucji do 2 zł (art. 40m ust. 1 tekstu jednolitego ustawy, Dz.U. 2025 poz. 870), więc kolejne rozporządzenie może te kwoty zmienić. Trzymaj je w jednym miejscu w kodzie albo w ustawieniach wtyczki, a nie wpisane w opisy produktów.

#Od kiedy działa system kaucyjny i co z napojami bez znaku kaucji?

System ruszył 1 października 2025 r. Ustawa z 21 listopada 2024 r. (Dz.U. 2024 poz. 1911) w art. 10 każe stosować obowiązki sklepów z art. 44 od tego dnia. Art. 7 pozwolił operatorom z wcześniejszym terminem uruchomienia złożyć wniosek o przesunięcie go na 1 października 2025 r., a w nowych zezwoleniach termin nie mógł być wcześniejszy.

Dla sklepu ważniejsze są przepisy przejściowe z ustawy z 13 lipca 2023 r. (Dz.U. 2023 poz. 1852). Art. 9 ust. 1 i 2 mówią, że opakowania z napojami wprowadzone do obrotu przed przystąpieniem producenta do systemu można sprzedawać do wyczerpania zapasów i nie pobiera się za nie kaucji. Ustawa z 2024 r. dodała ust. 1a: to samo dotyczy opakowań bez oznakowania kaucyjnego wprowadzonych w ciągu 3 miesięcy od przystąpienia do systemu, nie później jednak niż do 31 grudnia 2025 r.

W praktyce oznacza to, że w magazynie mogą jeszcze stać napoje tego samego producenta w dwóch wersjach: ze znakiem kaucji i bez niego. Kaucję naliczasz tylko za opakowania oznakowane. Jeśli w sklepie jedna karta produktu obejmuje obie partie, nie da się poprawnie policzyć kaucji. Rozdziel je na osobne produkty albo warianty i ustaw kaucję tylko tam, gdzie jest logo systemu. Opakowania kupione przed startem systemu nie są zresztą przyjmowane w punktach zbiórki, o czym ministerstwo pisze w pytaniach i odpowiedziach.

#Czy sklep internetowy musi pobierać kaucję?

Tak. Art. 40g ust. 16 ustawy nie robi wyjątku dla żadnego kanału sprzedaży:

“Kaucję pobiera się na etapach dystrybucji produktu w opakowaniu, o którym mowa w załączniku nr 1a do ustawy, będącego napojem, poprzedzających sprzedaż tego produktu użytkownikowi końcowemu oraz od użytkownika końcowego nabywającego ten produkt.”

Dz.U. 2025 poz. 870, art. 40g ust. 16

Hurtownia dolicza ci kaucję na fakturze zakupu, ty doliczasz ją klientowi. Kanał sprzedaży nie ma znaczenia.

Inaczej jest z odbieraniem pustych opakowań. Art. 44 dzieli sklepy według powierzchni sprzedaży. Sklep do 200 m² musi co najmniej pobierać kaucję za butelki plastikowe i puszki, a za szklane butelki zwrotne także ją zwracać i zbierać puste opakowania. Sklep powyżej 200 m² musi pobierać i zwracać kaucję oraz zbierać opakowania wszystkich rodzajów. Do tego dochodzi obowiązek zawarcia umowy z operatorem (art. 44 ust. 4 i 6) i prowadzenia ewidencji (art. 44 ust. 10 i 11).

O sprzedaży wysyłkowej ani o sklepie, który nie ma sali sprzedaży, ustawa nie mówi nic. Nie znalazłem też takiej informacji na stronach Ministerstwa Klimatu i Środowiska: strona o systemie kaucyjnym i pytania i odpowiedzi opisują sklepy stacjonarne, automaty i punkty zbiórki. Nie będę tej luki interpretował za ciebie. Jeśli sprzedajesz napoje wyłącznie przez internet, zapytaj operatora, z którym podpisujesz umowę, jak traktuje sklep bez powierzchni sprzedaży i jaką ewidencję od ciebie wymaga. Jeśli masz też sklep stacjonarny, obowiązki z art. 44 dotyczą go według jego metrażu.

#Kto prowadzi system i komu przekazujesz kaucję?

System prowadzi podmiot reprezentujący, czyli spółka akcyjna utworzona przez producentów napojów, z zezwoleniem ministra (art. 40g ust. 2). Może ich działać kilka i muszą się między sobą rozliczać (art. 40g ust. 10). Ministerstwo wymienia na stronie operatorzy systemu kaucyjnego osiem spółek: Zwrotka S.A., Polka S.A., OK Operator Kaucyjny S.A., Reselekt S.A., Kaucja.pl Krajowy System Kaucyjny S.A., Polski System Kaucyjny S.A., Ecokaucja Polska S.A. i Polski Operator Kaucyjny S.A.

Przepływ pieniędzy wygląda tak: producent napoju odprowadza pobraną kaucję do swojego operatora w terminach z art. 40g ust. 17 (do 7. i do 21. dnia miesiąca), a operator, który odebrał opakowania od sklepu lub punktu zbiórki, oddaje mu kaucję wypłaconą klientom (art. 40g ust. 9a). Sklep internetowy w tym łańcuchu pobiera kaucję od klienta i płaci ją hurtowni, która wcześniej doliczyła ją tobie.

Klient nie potrzebuje paragonu. Art. 40g ust. 1 pkt 4 mówi, że system “nie wymaga okazania dowodu zakupu produktu w opakowaniu na napoje objętym systemem kaucyjnym w celu zwrotu pobranej kaucji”. Butelkę kupioną u ciebie klient może więc oddać w markecie obok domu.

#Czy kaucja podlega VAT?

Nie. Ustawa z 21 listopada 2024 r. zmieniła ustawę o VAT od 1 stycznia 2025 r. Nowy art. 29a ust. 11a brzmi:

“Do podstawy opodatkowania nie wlicza się kaucji pobieranej za opakowanie objęte systemem kaucyjnym, jeżeli podatnik dokonał dostawy towaru w tym opakowaniu.”

Dz.U. 2024 poz. 1911, art. 2 pkt 3

VAT pojawia się dopiero przy kaucjach niezwróconych. Wprowadzający napoje (producent lub importer) podwyższa podstawę opodatkowania na koniec roku o różnicę między kaucjami za opakowania wprowadzone a zwrócone (art. 29a ust. 12c), a płatnikiem tego podatku jest podmiot reprezentujący (art. 17b). Sklep, który tylko sprzedaje napoje, tego rozliczenia nie robi. Ministerstwo ujmuje to w pytaniach i odpowiedziach tak:

“Podatek VAT nie będzie naliczany na etapach dystrybucji produktu i nie będą nim obciążani ani klienci końcowi nabywający produkty, ani punkty handlowe dystrybuujące produkty.”

Ministerstwo Klimatu i Środowiska, system kaucyjny: pytania i odpowiedzi

Z tego wynika najważniejsza decyzja techniczna. Gdybyś doliczył 50 groszy do ceny produktu, WooCommerce opodatkowałby je stawką napoju i zawyżyłbyś VAT należny. Kaucja musi być osobną pozycją bez podatku.

#Jak pokazać kaucję na fakturze i w KSeF?

Na fakturze kaucja powinna być osobną pozycją poza podstawą opodatkowania, bo tego wymaga art. 29a ust. 11a. Jak dokładnie oznaczyć ją w ustrukturyzowanej fakturze, tego w źródłach urzędowych nie znalazłem. Broszura Ministerstwa Finansów o strukturze FA(3) z 4 marca 2026 r. nie zawiera słowa “kaucja”. Zanim zaczniesz wystawiać faktury z kaucją, ustal ze swoim księgowym, jak ją oznaczać, i sprawdź, czy program do faktur albo integracja z KSeF przenosi pozycję z kaucją bez doliczania VAT. Szerzej o samym wystawianiu faktur ze sklepu piszę w artykule o KSeF w WooCommerce.

Dla porządku w księgach przyda się też ewidencja, nawet jeśli sklep internetowy nie jest wprost wymieniony w art. 44 ust. 10 i 11. Liczba sprzedanych napojów w opakowaniach kaucyjnych i suma pobranych kaucji wynikają wprost z zamówień, jeśli kaucja jest osobną opłatą: eksport opłat z WooCommerce daje ci te liczby w kilka minut.

#Jak pokazać kaucję na karcie produktu i w koszyku?

Ustawa o gospodarce opakowaniami nie określa, jak sklep ma prezentować kaucję klientowi, a w przepisach, które przeczytałem, nie znalazłem wymogu osobnej linii na paragonie czy w opisie produktu. Rozsądny minimalny standard dla sklepu internetowego wygląda tak:

  • na karcie produktu, pod ceną, informacja ”+ kaucja 0,50 zł” (albo 3 zł przy zgrzewce), żeby klient nie zobaczył innej kwoty dopiero w koszyku,
  • w koszyku i w podsumowaniu zamówienia osobna pozycja “Kaucja”,
  • w mailu z potwierdzeniem i na fakturze ta sama pozycja,
  • w regulaminie albo na stronie dostawy jedno zdanie, gdzie oddać puste opakowania: w dowolnym punkcie zbiórki, bez paragonu.

Koszyk WooCommerce z osobną linią Deposit (kaucja) 4,50 zł pod sumą częściową

Zrzut ekranu: koszyk testowego sklepu z wtyczką Botelix, kaucja jako osobna pozycja w podsumowaniu.

Osobna sprawa to najniższa cena z 30 dni. Kaucja doliczana jako opłata w koszyku nie trafia do ceny produktu, więc nie zmienia historii cen; jeśli liczysz tę historię wtyczką, sprawdź to na jednym produkcie. Zasady samej informacji o obniżce opisałem w tekście o najniższej cenie z 30 dni w WooCommerce.

#Jak dodać kaucję jako opłatę w koszyku WooCommerce?

Najprostsze miejsce to API opłat WooCommerce. Akcja woocommerce_cart_calculate_fees uruchamia się przy każdym przeliczeniu koszyka, a WC_Cart::add_fee() przyjmuje nazwę, kwotę, flagę opodatkowania i klasę podatkową. Opłaty zapisują się w zamówieniu jako osobne pozycje, więc widać je w mailach, w panelu i w zwrotach.

Kod czyta z produktu trzy pola: rodzaj opakowania (_drs_container: pet, can albo glass_refill), pojemność w mililitrach (_drs_ml) i liczbę opakowań w jednej sztuce produktu (_drs_units, zgrzewka sześciu puszek to 6). Warianty bez własnych wartości biorą je z produktu nadrzędnego. Produkty bez znaku kaucji, w tym te z zapasów sprzed systemu, po prostu nie mają wypełnionego _drs_container.

<?php
/**
 * Plugin Name: Kaucja za opakowania napojów jako opłata w koszyku
 * Description: Dolicza kaucję systemu kraju dostawy jako osobną opłatę w koszyku.
 */

defined( 'ABSPATH' ) || exit;

/**
 * Systemy według kraju dostawy. Każdy przedział: [ min ml, max ml, kaucja za sztukę ].
 * 'taxable' => true: kwota ustawowa zawiera już VAT (Niemcy).
 */
function wpp_drs_schemes(): array {
	$eu_25 = [ [ 100, 3000, 0.25 ] ];

	return [
		'PL' => [ 'currency' => 'PLN', 'taxable' => false, 'label' => 'Kaucja', 'rates' => [
			'pet'          => [ [ 1, 3000, 0.50 ] ],
			'can'          => [ [ 1, 1000, 0.50 ] ],
			'glass_refill' => [ [ 1, 1500, 1.00 ] ],
		] ],
		'DE' => [ 'currency' => 'EUR', 'taxable' => true, 'label' => 'Pfand', 'rates' => [
			'pet' => $eu_25,
			'can' => $eu_25,
		] ],
		'AT' => [ 'currency' => 'EUR', 'taxable' => false, 'label' => 'Pfand', 'rates' => [
			'pet' => $eu_25,
			'can' => $eu_25,
		] ],
		'IE' => [ 'currency' => 'EUR', 'taxable' => false, 'label' => 'Re-turn deposit (refundable)', 'rates' => [
			'pet' => [ [ 150, 500, 0.15 ], [ 501, 3000, 0.25 ] ],
			'can' => [ [ 150, 500, 0.15 ], [ 501, 3000, 0.25 ] ],
		] ],
		'PT' => [ 'currency' => 'EUR', 'taxable' => false, 'label' => 'Depósito Volta', 'rates' => [
			'pet' => [ [ 1, 3000, 0.10 ] ],
			'can' => [ [ 1, 3000, 0.10 ] ],
		] ],
	];
}

/** Meta produktu; wariant bez własnych danych bierze je z produktu nadrzędnego. */
function wpp_drs_meta( WC_Product $product, string $key ): string {
	$value = (string) $product->get_meta( $key );
	if ( '' === $value && $product->get_parent_id() ) {
		$value = (string) get_post_meta( $product->get_parent_id(), $key, true );
	}
	return $value;
}

/** Kaucja za jedną sztukę produktu (zgrzewka sześciu puszek to sześć opakowań) albo 0. */
function wpp_drs_unit_deposit( WC_Product $product, array $scheme ): float {
	$container = wpp_drs_meta( $product, '_drs_container' ); // pet, can, glass_refill
	$ml        = (int) wpp_drs_meta( $product, '_drs_ml' );
	$units     = max( 1, (int) wpp_drs_meta( $product, '_drs_units' ) );

	foreach ( $scheme['rates'][ $container ] ?? [] as [ $min, $max, $amount ] ) {
		if ( $ml >= $min && $ml <= $max ) {
			return $amount * $units;
		}
	}
	return 0.0;
}

/** System kraju dostawy, o ile sklep może go naliczyć. */
function wpp_drs_current_scheme(): ?array {
	$country = '';
	if ( WC()->customer ) {
		$country = WC()->customer->get_shipping_country() ?: WC()->customer->get_billing_country();
	}
	$country = $country ?: WC()->countries->get_base_country();
	$scheme  = wpp_drs_schemes()[ $country ] ?? null;

// Sklep w PLN nie pobierze kaucji w EUR: pomijam, zamiast przeliczać.
	if ( ! $scheme || get_woocommerce_currency() !== $scheme['currency'] ) {
		return null;
	}
	return $scheme;
}

add_action( 'woocommerce_cart_calculate_fees', function ( WC_Cart $cart ) {
	$scheme = wpp_drs_current_scheme();
	if ( ! $scheme ) {
		return;
	}

	// Suma kaucji per klasa podatkowa, żeby każda opłata szła stawką swoich napojów.
	$by_class = [];
	foreach ( $cart->get_cart() as $item ) {
		$deposit = wpp_drs_unit_deposit( $item['data'], $scheme ) * $item['quantity'];
		if ( $deposit > 0 ) {
			$class              = $item['data']->get_tax_class();
			$by_class[ $class ] = ( $by_class[ $class ] ?? 0 ) + $deposit;
		}
	}

	// Poza VAT (PL, AT, IE, PT): jedna opłata bez podatku.
	if ( ! $scheme['taxable'] ) {
		if ( $by_class ) {
			$cart->add_fee( $scheme['label'], round( array_sum( $by_class ), 2 ), false );
		}
		return;
	}

foreach ( $by_class as $class => $gross ) { // Kwota ustawowa zawiera VAT: wyliczam netto, WooCommerce doliczy podatek z powrotem.
		$rates = WC_Tax::get_rates( $class );
		$tax   = array_sum( WC_Tax::calc_inclusive_tax( $gross, $rates ) );
		$rate  = $rates ? (float) reset( $rates )['rate'] : 0.0;
		$cart->add_fee( sprintf( '%s (%s %%)', $scheme['label'], wc_format_localized_decimal( $rate ) ), $gross - $tax, true, $class );
	}
} );

// Karta produktu: kaucja przy cenie, a nie dopiero w koszyku.
add_action( 'woocommerce_single_product_summary', function () {
	global $product;
	$scheme = wpp_drs_current_scheme();
	if ( ! $scheme || ! $product instanceof WC_Product ) {
		return;
	}
	$deposit = wpp_drs_unit_deposit( $product, $scheme );
	if ( $deposit > 0 ) {
		printf(
			'<p class="drs-deposit">%s</p>',
			esc_html( sprintf( '+ %s: %s', $scheme['label'], wp_strip_all_tags( wc_price( $deposit ) ) ) )
		);
	}
}, 11 );

Plik przechodzi php -l na PHP 8.4, a logikę przedziałów sprawdziłem krótkim skryptem z asercjami na atrapach produktów: puszka 1,5 litra nie ma kaucji w Polsce (puszki tylko do litra), szklana butelka zwrotna ma 1 zł w Polsce i nic w Niemczech, zgrzewka sześciu puszek w Niemczech to 1,50 EUR, butelka 500 ml w Irlandii to 0,15 EUR, a 501 ml to 0,25 EUR, wariant bez danych dziedziczy je po rodzicu.

<?php
// drs-fee-test.php: php -d zend.assertions=1 -d assert.exception=1 drs-fee-test.php
define( 'ABSPATH', '/' );
function add_action() {}
function get_post_meta( $id, $key, $single ) { return $GLOBALS['parent_meta'][ $key ] ?? ''; }
class WC_Product {
	public function __construct( public array $meta, public int $parent = 0 ) {}
	public function get_meta( $k ) { return $this->meta[ $k ] ?? ''; }
	public function get_parent_id() { return $this->parent; }
}
require __DIR__ . '/drs-fee.php';
$s = wpp_drs_schemes();
$p = fn( $c, $ml, $u = 1 ) => new WC_Product( [ '_drs_container' => $c, '_drs_ml' => $ml, '_drs_units' => $u ] );
assert( wpp_drs_unit_deposit( $p( 'pet', 500 ), $s['IE'] ) === 0.15 );
assert( wpp_drs_unit_deposit( $p( 'pet', 501 ), $s['IE'] ) === 0.25 );
assert( wpp_drs_unit_deposit( $p( 'can', 100 ), $s['IE'] ) === 0.0 );   // under 150 ml
assert( wpp_drs_unit_deposit( $p( 'can', 330, 6 ), $s['DE'] ) === 1.5 ); // six-pack
assert( wpp_drs_unit_deposit( $p( 'can', 1500 ), $s['PL'] ) === 0.0 );  // PL cans only up to 1 l
assert( wpp_drs_unit_deposit( $p( 'glass_refill', 500 ), $s['PL'] ) === 1.0 );
assert( wpp_drs_unit_deposit( $p( 'glass_refill', 500 ), $s['DE'] ) === 0.0 ); // no statutory Mehrweg amount
$GLOBALS['parent_meta'] = [ '_drs_container' => 'pet', '_drs_ml' => 1500 ];
assert( wpp_drs_unit_deposit( new WC_Product( [], 99 ), $s['AT'] ) === 0.25 ); // variation inherits
echo "ok\n";

Trzy rzeczy w tym kodzie są celowe. Kaucja polska jest jedną opłatą bez podatku, niezależnie od tego, w jakich stawkach VAT są napoje w koszyku. System wybierany jest według kraju dostawy, a jeśli klient go jeszcze nie podał, według kraju sklepu. Jeśli waluta sklepu nie zgadza się z walutą systemu, kaucja nie jest naliczana: sklep w złotówkach nie policzy austriackiej kaucji w euro, a przeliczona kwota i tak nie byłaby kwotą z rozporządzenia.

#Dlaczego niemiecki Pfand psuje prostą opłatę w WooCommerce?

Jeśli wysyłasz napoje do Niemiec ze sklepu w euro, trafisz na odwrotną sytuację niż w Polsce. § 46 ust. 1 VerpackDG, niemieckiej ustawy, która od 12 sierpnia 2026 r. zastąpiła Verpackungsgesetz, wymaga kaucji co najmniej 0,25 EUR za opakowanie jednorazowe, i to kwoty zawierającej podatek VAT (§ 46 VerpackDG). Niemieckie wytyczne do VAT (UStAE, pkt 10.1 ust. 8) traktują kaucję doliczaną przy każdej dostawie jako część wynagrodzenia za tę dostawę, a jej zwrot przy oddaniu opakowania jako obniżenie podstawy. Pfand jest więc opodatkowany stawką napoju.

WooCommerce traktuje kwotę opłaty jako netto. add_fee( 'Pfand', 0.25, true ) doliczy do 0,25 EUR jeszcze 19%, więc klient zapłaci 0,2975 EUR zamiast 0,25. Kod powyżej najpierw wylicza z kwoty brutto podatek (WC_Tax::calc_inclusive_tax()), przekazuje netto i dzięki temu suma wraca do 0,25. Napoje w różnych stawkach dostają osobne opłaty, po jednej na klasę podatkową.

Ten błąd znam z własnych wtyczek. W historii zmian Botelix wersja 1.1.0 poprawia właśnie to: niemiecki Pfand był obciążany VAT-em od góry i klient płacił więcej, niż wynika z ustawy. W historii zmian Shoplex wersja 1.6.0 zmieniła Pfand z opłaty bez podatku na opodatkowaną stawką produktu, jedną opłatą na stawkę.

Austria działa jeszcze inaczej. Rozporządzenie o kaucji (Pfandverordnung w RIS) każe pobierać 0,25 EUR od 1 stycznia 2025 r. w imieniu i na rachunek centralnego operatora, a operator EWP w informacji o rozliczeniach wyjaśnia, że kaucja nie podlega VAT, bo nie jest wynagrodzeniem za świadczenie, więc pod tym samym słowem “Pfand” kryją się dwa różne rozliczenia.

#Jak wygląda zwrot: anulowane zamówienie a oddana butelka?

To dwa różne zdarzenia i tylko pierwsze dotyczy zamówienia w sklepie.

Zwrot lub anulowanie zamówienia. Klient odstępuje od umowy w ciągu 14 dni i odsyła pełne butelki, albo anulujesz zamówienie przed wysyłką. Wtedy oddajesz cenę i kaucję. W WooCommerce zwracasz pozycje produktów i pozycję opłaty “Kaucja” razem. Dzięki temu, że kaucja jest osobną opłatą, zwrot jest dokładnie równy temu, co klient zapłacił, a w raportach sprzedaży nie miesza się z ceną towaru. O tym, jak klient ma składać oświadczenie o odstąpieniu w sklepie internetowym, piszę w tekście o przycisku odstąpienia od umowy.

Oddanie pustego opakowania. To dzieje się poza sklepem. Klient wypija napój i oddaje butelkę w punkcie zbiórki, gdzie dostaje kaucję. W WooCommerce nic nie zwracasz. Jeśli jednak sam odbierasz puste opakowania od klientów, na przykład przy dostawie własnym transportem, wypłata kaucji za nie nie jest zwrotem zamówienia. Księguj ją jako zwrot kaucji, osobno od zwrotów sprzedaży, inaczej przychód w raportach będzie spadał przy każdej oddanej zgrzewce. O zasady rozliczenia takich opakowań z operatorem zapytaj operatora, z którym masz umowę.

Warto też pamiętać o odwrotności: za opakowania bez znaku kaucji, nawet jeśli klient przyniesie je kurierowi, kaucji nie oddajesz, bo jej nie pobrałeś.

#Którą kaucję pobierać przy wysyłce za granicę?

Systemy są krajowe, a opakowanie jest oznakowane dla jednego systemu. Polska butelka ze znakiem kaucji nie stanie się niemiecką butelką kaucyjną dlatego, że pojechała paczką do Berlina. Z przepisów, które przeczytałem, wynikają dwie konkretne wskazówki.

Austria obejmuje sprzedawców zagranicznych. § 2 ust. 2 rozporządzenia dotyczy sprzedawców na odległość bez siedziby w Austrii, którzy dostarczają napoje austriackim konsumentom. Sklep wysyłający napoje paczką płaci przy tym centralnemu operatorowi opłatę wyrównawczą za każde opakowanie (§ 5 ust. 7) i musi się u niego zarejestrować (§ 10 ust. 4). Jeśli dowozi własnym transportem, musi zapewnić odbiór opakowań i zwrot kaucji przy dostawie (§ 5 ust. 6).

Niemcy zwalniają z kaucji opakowania, o których wykazano, że nie są przeznaczone dla odbiorców końcowych w Niemczech (§ 46 ust. 4 pkt 1 VerpackDG). Z tego przepisu korzysta producent eksportujący. Oznakowanie opakowania i udział w ogólnokrajowym systemie DPG to obowiązki tego, kto pierwszy wprowadza napój do obrotu w Niemczech (§ 46 ust. 1), a sklep wysyłający napoje niemieckim konsumentom może być tym podmiotem. Zanim zaczniesz wysyłać napoje do Niemiec, zapytaj Zentrale Stelle Verpackungsregister albo DPG, jak klasyfikują twój przypadek. W sprzedaży na odległość ustawa wymaga też zapewnienia “odpowiednich możliwości zwrotu w rozsądnej odległości” od klienta (§ 46 ust. 2, tłumaczenie własne).

Jeśli sklep sprzedaje w złotówkach, kod z tego artykułu zastosuje polską kaucję tylko do adresów w Polsce i nie naliczy niczego przy wysyłce za granicę. Zrobiłem to celowo: zagraniczną kaucję pobiera się według tamtejszych przepisów i w tamtejszej walucie, więc przeliczanie polskiej nic by nie dało.

#Czy wtyczka zrobi to za mnie?

Może, i jest ich kilka. Kod z tego artykułu ma sens, gdy chcesz mieć reguły pod pełną kontrolą. Dwie z wtyczek, które sam rozwijam, obsługują kaucję. Opisuję tylko to, co stoi w ich historii zmian i na ich stronach.

Pola systemu kaucyjnego w edytorze produktu WooCommerce: schemat, rodzaj opakowania, liczba sztuk

Zrzut ekranu: pola kaucji w edytorze produktu (Botelix), rodzaj opakowania i liczba sztuk w zgrzewce.

Botelix to darmowa wtyczka do kaucji w WooCommerce. Wersja 1.1.0 wprowadziła cztery kategorie opakowań (jednorazowa butelka plastikowa, puszka metalowa, jednorazowa butelka szklana, butelka szklana wielokrotnego użytku), stawkę dla każdej kategorii w ramach systemu oraz dopasowanie systemu do kraju wysyłki. Ma gotowe systemy dla Polski, Rumunii, Austrii, Niemiec, Słowacji i Węgier oraz system własny. Zgodnie ze stroną wtyczki system jest naliczany tylko wtedy, gdy jego waluta zgadza się z walutą sklepu. Ta sama strona mówi, że wtyczka nie obsługuje zwrotów kaucji ani odbioru opakowań. Aktualizacja, . Botelix pokazuje teraz kaucję obok ceny na listach sklepu, kategorii, wyszukiwania i produktów powiązanych, w klasycznym i blokowym szablonie. W koszyku i w kasie kaucja jest osobną pozycją przy każdej linii, zapisaną w pozycji zamówienia i widoczną na stronie zamówienia, w panelu i w e-mailach. Przy produkcie i wariancie wpiszesz własną kaucję za opakowanie, która zastępuje stawkę z ustawień schematu, więc produkty z jednej kategorii opakowań mogą mieć różne kaucje. Doszło dziesięć krajowych systemów, każdy z aktem prawnym, stawkami dla kategorii opakowań i traktowaniem VAT, dopasowywany po kraju wysyłki: Dania, Szwecja, Finlandia, Estonia, Łotwa, Holandia, Irlandia, Chorwacja, Malta i Portugalia. Gdy kwota zależy od pojemności opakowania, ustawienia zawierają najczęstszy rozmiar, a etykieta stawki wymienia pozostałe kwoty do wpisania przy produkcie. Wtyczka jest w katalogu WordPress.org.

Shoplex to moja wtyczka do zgodności sklepu z przepisami UE, przydatna przy sprzedaży do Niemiec. Od wersji 1.4.0 ma kaucję (Pfand) jako opłatę w koszyku i informację na karcie produktu, a od 1.6.0 Pfand jest opodatkowany stawką VAT produktu, do którego należy, jedną opłatą na stawkę. Filtr shoplex_deposit_taxable przywraca opłatę bez podatku.

Niezależnie od wyboru sprawdź wtyczkę na testowym zamówieniu: kaucja jako osobna pozycja bez VAT w Polsce, właściwa kwota przy zgrzewkach, brak kaucji za puszki powyżej litra i za szkło jednorazowe, poprawny zwrot całego zamówienia.

#Co sprawdzić, zanim zaczniesz pobierać kaucję?

  • Podpisz umowę z operatorem i ustal z nim, jakie obowiązki ma sklep internetowy bez powierzchni sprzedaży.
  • W każdym napoju wpisz rodzaj opakowania, pojemność i liczbę sztuk w opakowaniu zbiorczym; sprawdź warianty.
  • Rozdziel partie ze znakiem kaucji i bez niego na osobne produkty lub warianty.
  • Kaucja jako osobna opłata bez VAT, nie w cenie produktu.
  • Na karcie produktu kwota kaucji przy cenie.
  • Testowe zamówienie: zgrzewka puszek, butelka szklana zwrotna, puszka 1,5 l; sprawdź sumy, maila i fakturę.
  • Z księgowym: oznaczenie kaucji na fakturze i w KSeF.
  • Testowy zwrot całego zamówienia: czy opłata wraca razem z produktami.
  • Przy sprzedaży za granicę: system, waluta i rejestracja w kraju dostawy.

#Kiedy warto zlecić to programiście?

Sam kod opłaty to kilkadziesiąt linii. Pracochłonne są dane produktów, podział partii, faktury z integracją KSeF, zwroty i sprzedaż zagraniczna, bo każdy z tych elementów musi liczyć kaucję tak samo. Rozliczenie podatkowe potwierdź z doradcą podatkowym, bo strony ministerstw opisują przypadek ogólny, a nie twój łańcuch dostaw. Jeśli wolisz, żeby kaucję wdrożyć i przetestować na kopii sklepu, łącznie ze zwrotami i fakturami, robię to jako programista WooCommerce.

Następny krok

Przekuj artykuł w realne wdrożenie

Pod tym wpisem dokładam linki, które domykają intencję użytkownika i prowadzą dalej w strukturze serwisu.

Sprawdź inne usługi WordPress i bazę wiedzy

Wzmocnij swój biznes dzięki profesjonalnemu wsparciu technicznemu w kluczowych obszarach ekosystemu WordPress.

Często zadawane pytania

Najważniejsze odpowiedzi, które pomagają wdrożyć temat w praktyce.

Ile wynosi kaucja za butelkę i puszkę w Polsce?#
Rozporządzenie Ministra Klimatu i Środowiska z 8 lipca 2024 r. (Dz.U. 2024 poz. 1046) ustala 0,50 zł za jednorazową butelkę z tworzywa sztucznego do 3 litrów, 0,50 zł za puszkę metalową do 1 litra i 1,00 zł za szklaną butelkę wielokrotnego użytku do 1,5 litra.
Czy sklep internetowy musi pobierać kaucję?#
Tak. Art. 40g ust. 16 ustawy o gospodarce opakowaniami każe pobierać kaucję na każdym etapie dystrybucji oraz od użytkownika końcowego, który kupuje napój, bez wyjątku dla sprzedaży przez internet. Ustawa nie ma za to osobnego przepisu o przyjmowaniu pustych opakowań przez sklep wysyłkowy: obowiązki zbierania wiąże z powierzchnią sprzedaży.
Czy od kaucji nalicza się VAT?#
Nie. Od 1 stycznia 2025 r. art. 29a ust. 11a ustawy o VAT mówi, że do podstawy opodatkowania nie wlicza się kaucji pobieranej za opakowanie objęte systemem kaucyjnym, jeżeli podatnik dostarczył towar w tym opakowaniu. VAT od kaucji niezwróconych rozlicza wprowadzający, a płatnikiem jest podmiot reprezentujący.
Czy klient może oddać pustą butelkę do sklepu internetowego?#
Klient oddaje opakowanie w dowolnym punkcie zbiórki, bez paragonu, i tam odzyskuje kaucję. Obowiązki odbioru w ustawie zależą od powierzchni sklepu stacjonarnego, a o sklepach wyłącznie internetowych ustawa milczy; w praktyce sklep oddaje kaucję w swoim systemie tylko przy zwrocie lub anulowaniu całego zamówienia.
Czy przy wysyłce do Niemiec pobieram polską kaucję?#
Nie, polski system dotyczy rynku krajowego. W Niemczech obowiązuje Pfand z § 46 VerpackDG: co najmniej 0,25 EUR z VAT za opakowanie, opodatkowany stawką napoju, a niemieckie opakowania muszą być oznakowane i należeć do systemu DPG. Przed wysyłką napojów do Niemiec ustal z Zentrale Stelle Verpackungsregister, jak klasyfikowany jest twój sklep.

Potrzebujesz FAQ dopasowanego do branży i rynku? Przygotuję wersję pod Twoje cele biznesowe.

Porozmawiajmy

Polecane artykuły

Omnibus w WooCommerce: najniższa cena z 30 dni

Art. 4 ust. 2 ustawy o informowaniu o cenach każe przy każdej obniżce pokazać najniższą cenę z 30 dni przed nią. WooCommerce nie przechowuje historii cen, więc robi to wtyczka albo własny kod. Jak działa poprawna historia, co psuje się w praktyce i jak to przetestować we własnym sklepie.