Jakie dane klienta zebrać w Stripe, żeby złożyć fakturę do KSeF
Stripe zbiera dane klienta i liczy podatek (Stripe Tax), a KSeF Kit buduje z nich FA(3) i składa ją do KSeF. O sposobie rozliczenia VAT decydują dwa pola: customer_address.country i numer podatkowy nabywcy. Od każdego klienta zbierz: czy to firma (rozstrzyga prawidłowy numer podatkowy), nazwę, kraj (najważniejsze), pełny adres oraz VAT/NIP. Brakujący lub błędny numer po cichu zamienia fakturę B2B w B2C — a ta do KSeF już nie trafia.
Sprzedajesz przez Stripe na cały świat — w tym do UE — i chcesz, żeby faktury trafiały do KSeF z poprawnym VAT. Sprawa jest prosta: Stripe sam do KSeF nie składa. Stripe zbiera dane, liczy podatek (Stripe Tax) i sprawdza format numeru podatkowego. To KSeF Kit buduje FA(3), ustala sposób rozliczenia VAT, dodaje adnotację o odwrotnym obciążeniu i składa dokument. Liczy się więc jedno: czy w Stripe znalazły się właściwe dane.
Co naprawdę decyduje o rozliczeniu VAT
KSeF Kit ustala sposób rozliczenia (VatTreatment) na podstawie customer_address.country oraz numerów
podatkowych nabywcy (customer_tax_ids):
- Krajowe B2B (PL) — kraj
PLipl_nip(alboeu_vatw postaciPL+ 10 cyfr): faktura ze stawką 23/8/5%, w FA(3) pola P_13_1/2/3. - B2B w UE — inny kraj UE i ważny
eu_vatnabywcy: odwrotne obciążenie, samo netto, P_18=1, w FA(3) pole P_13_9. - Eksport poza UE — kraj spoza UE i zagraniczny numer firmowy (np.
us_ein,gb_vat) oraz zerowy VAT: samo netto, w FA(3) pole P_13_8. - Odmowa złożenia (błąd) — B2C albo brak użytecznego numeru, eksport z polskim VAT, krajowa stawka 0%/zwolniona, faktura wielostawkowa. System głośno odmawia, zamiast po cichu złożyć błędną fakturę 23%.
Najważniejszy wniosek praktyczny: brakujący lub błędny numer podatkowy po cichu zamienia transakcję w B2C i nie trafia ona do KSeF. Dane zbierane w Stripe to więc nie formalność, lecz warunek poprawnego rozliczenia.
Macierz decyzji: klient × lokalizacja → rozliczenie → dane
| Klient + lokalizacja | Rozliczenie | Co zebrać |
|---|---|---|
| Firma + PL | 23% krajowe, do KSeF | nazwa, adres, NIP |
| Firma + inny kraj UE | odwrotne obciążenie (0%/np.), do KSeF | nazwa, adres, VAT-UE z prefiksem kraju, kraj; faktura z adnotacją „odwrotne obciążenie / reverse charge" |
| Firma + spoza UE | nie podlega VAT-UE (np. art. 28b), do KSeF | nazwa, adres, kraj, numer lokalny; uwaga na obowiązek rejestracji GST/VAT za granicą |
| Konsument + PL | 23% | nazwa, adres |
| Konsument + inny kraj UE | VAT kraju klienta przez OSS | adres + 2 niesprzeczne dowody lokalizacji; próg 10 000 €; poza KSeF |
| Konsument + spoza UE | nie podlega VAT-UE / 0% | adres, kraj; poza KSeF |
Dwa wiersze konsumenckie (OSS oraz sprzedaż poza UE) nie idą do KSeF — KSeF Kit składa faktury B2B. Umieściliśmy je dla pełni obrazu, nie dlatego, że KSeF Kit je obsługuje.
Minimalny zestaw danych od każdego klienta
- Czy to firma — rozpoznawane po obecności prawidłowego numeru podatkowego.
- Nazwa (prawna).
- Kraj — najważniejsze pole; to ono uruchamia całą logikę.
- Pełny adres rozliczeniowy —
line1,city,postal_code,country. - Numer VAT/NIP — wraz z zapisanym wynikiem i datą weryfikacji w VIES.
- Przy B2C za granicę — dwa dowody lokalizacji oraz przyjęta decyzja o VAT (ślad audytowy).
Jak zebrać te dane w Stripe Checkout
W Stripe Checkout włącz zbieranie adresu, numeru podatkowego i automatyczny podatek. Kluczowy jest tu
customer_update — bez niego dane z Checkout nie zapiszą się na obiekcie Customer:
Stripe::Checkout::Session.create(
mode: "payment",
line_items: [ { price: price_id, quantity: 1 } ],
billing_address_collection: "required",
tax_id_collection: { enabled: true, required: "if_supported" },
automatic_tax: { enabled: true },
customer_update: { name: "auto", address: "auto" } # bez tego dane nie trafią na Customer
)
Tworzenie klienta „ręcznie"
Gdy zakładasz klienta poza Checkout, od razu przekaż nazwę, adres i numer podatkowy:
Stripe::Customer.create(
name: "Kontrahent sp. z o.o.",
address: { line1: "ul. Przykładowa 1", city: "Warszawa", postal_code: "00-001", country: "PL" },
tax_id_data: [ { type: "pl_nip", value: "1234563218" } ]
)
pl_nipzależy od wersji. Wymaga wersji API2026-01-28.clover+ oraz stripe-ruby ≥ 18.2.0. Na starszych wersjach zapisuj polskie firmy jakoeu_vat(PL…) i usuwaj prefiksPLprzy budowie FA(3).
Stripe przez gem Pay
Gem Pay przekazuje nazwę i adres przez stripe_attributes (metoda lub lambda zwracająca {name:, address:}).
Parametr automatic_tax i ustawienia Checkout Pay przyjmuje w payment_processor.checkout(...) /
.subscribe(...). Sam numer podatkowy nie ma w Pay osobnego wrappera — przekaż tax_id_data przez
stripe_attributes albo sięgnij po payment_processor.api_record i natywne API Stripe:
class User < ApplicationRecord
pay_customer stripe_attributes: :stripe_attributes
def stripe_attributes(_pay_customer)
{
name: company_name,
address: { line1: address_line1, city: city, postal_code: postal_code, country: country },
tax_id_data: [ { type: "eu_vat", value: vat_number } ] # Pay sam nie owinie tax-id
}
end
end
Walidacja: Stripe sprawdza format, KSeF wymaga więcej
Stripe sprawdza tylko format numeru, a nie jego ważność prawną. Dla KSeF to za mało. KSeF Kit dodatkowo:
- liczy sumę kontrolną polskiego NIP,
- po stronie sprzedawcy sprawdza białą listę Ministerstwa Finansów,
- przy odwrotnym obciążeniu opiera się na numerze VAT-UE potwierdzonym w VIES.
Warto skonsultować się z księgowym. Część przypadków jest niuansowa: odwrotne obciążenie bez potwierdzonego numeru VAT, próg 10 000 € dla OSS oraz obowiązek rejestracji VAT/GST za granicą przy sprzedaży poza UE. To decyzje podatkowe, nie tylko techniczne.
Sprzedajesz globalnie przez Stripe?
Kiedy dane w Stripe są kompletne, KSeF Kit rozpoznaje typ transakcji i składa poprawną fakturę ustrukturyzowaną — z przeliczeniem VAT na złote i kodem QR na wizualizacji. Zobacz integrację Stripe + KSeF oraz fakturę eksportową a KSeF.