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. Zacznij od tego, że 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%.
Brakujący lub błędny numer podatkowy po cichu zamienia transakcję w B2C, a taka nie trafia do KSeF. Dane zbierane w Stripe decydują więc o rozliczeniu, nie tylko o wyglądzie faktury.
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, bo 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: rozpoznajemy 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. Bez
customer_update 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: "1111111111" } ]
)
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.
Zapytaj księgowego. 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 wylicza link weryfikacyjny KOD I dla faktur eksportowych. Zobacz integrację Stripe + KSeF oraz fakturę eksportową a KSeF.