Faktury walutowe z KSeF — automatyczne przeliczanie EUR/USD na PLN wg kursu NBP
Opublikowano: 18 kwietnia 2026 · Autor: KSeF Import · Czas czytania: 8 min
TL;DR — co musisz wiedzieć w 30 sekund
- Obowiązek prawny: Art. 31a ust. 1 ustawy o VAT — faktura w walucie obcej przeliczona kursem średnim NBP z ostatniego dnia roboczego poprzedzającego datę wystawienia (lub obowiązku podatkowego).
- Co daje KSeF Import: Pobiera faktury z KSeF razem z polami Waluta, Kwota netto i Data sprzedaży — eksportuje do Sheets/Excela.
- Co dołożysz: Jedna formuła
IMPORTXML(Sheets) lubWEBSERVICE(Excel) z publicznego API NBP — kurs pobiera się automatycznie. - Efekt: Rejestr VAT zakupów w PLN, zgodny z ustawą, aktualizujący się sam. Księgowa nie szuka kursów w tabelach NBP.
- Dla kogo: Firmy IT z kontraktami zagranicznymi, e-commerce importujące z UE, agencje kupujące Google Ads / AWS / Meta, spedycja, startupy SaaS.
Faktura od Google Ireland wpada do Twojego KSeF w EUR. Faktura od AWS — w USD. Faktura od niemieckiego dostawcy — znowu EUR. I jeszcze jedna od subkontraktora w Londynie — w GBP. Koniec miesiąca, rejestr VAT zakupów musi być w złotówkach, a każda z tych faktur wymaga przeliczenia kursem z innego dnia — tego poprzedzającego datę sprzedaży.
Księgowa otwiera stronę NBP, wpisuje daty, kopiuje kursy, mnoży w kalkulatorze, przepisuje do Excela. Przy 20 fakturach w miesiącu to 40 minut. Przy 100 fakturach — pół dnia. I wystarczy jedna pomyłka o dzień, żeby kurs był inny i rozliczenie VAT-u się posypało.
Problem: kurs z dnia poprzedzającego — ustawowa pułapka
Art. 31a ust. 1 ustawy o VAT mówi jasno: jeżeli kwoty na fakturze są wyrażone w walucie obcej, przelicza się je na złote według kursu średniego NBP ogłoszonego na ostatni dzień roboczy poprzedzający dzień powstania obowiązku podatkowego. Alternatywnie można stosować kurs EBC z analogicznego dnia — ale większość firm zostaje przy NBP.
Co to oznacza w praktyce:
- Faktura wystawiona w poniedziałek → kurs z piątku (ostatni dzień roboczy przed poniedziałkiem).
- Faktura wystawiona po święcie → kurs z ostatniego dnia roboczego przed świętem.
- Dla każdej pojedynczej faktury może być inny kurs — nie możesz użyć kursu z końca miesiąca dla całej paczki.
W KSeF faktury od polskich kontrahentów przychodzą w PLN, ale faktury od zagranicznych podmiotów zarejestrowanych w Polsce (VAT-UE), a także faktury z oddziałów globalnych korporacji rozliczających się na polski NIP (Meta Platforms Ireland, Google Ireland, Microsoft Ireland) — będą w EUR lub USD. KSeF przenosi wszystkie pola ze schematu FA(3): KodWaluty, CenaJedn, WartoscNetto, P_1 (data wystawienia), P_6 (data dostawy).
Wartość: API NBP jest publiczne, darmowe i jednolinijkowe
Narodowy Bank Polski udostępnia REST API pod adresem api.nbp.pl — bez klucza, bez limitów do rozsądnego ruchu, z odpowiedzią XML lub JSON. To znaczy, że jedna formuła w Google Sheets może pobrać kurs dowolnej waluty z dowolnego dnia roboczego, wprost do komórki.
Endpoint do zapamiętania:
https://api.nbp.pl/api/exchangerates/rates/a/EUR/2026-04-13/?format=xml
Zwraca kurs średni EUR z tabeli A (tabela kursów średnich) na dzień 13.04.2026. Jeśli podasz dzień nieroboczy — API zwróci 404. Dlatego formuła musi uwzględniać „dzień poprzedzający, roboczy".
Gotowa formuła w Google Sheets
Zakładamy, że KSeF Import wyeksportował faktury do arkusza z kolumnami: A — Numer KSeF, B — Kontrahent, C — Data sprzedaży, D — Waluta, E — Netto (waluta), F — VAT (waluta). Dodajemy kolumny:
| Kolumna | Formuła | Co robi |
|---|---|---|
| G2 — Kurs NBP | =IFERROR(IMPORTXML("https://api.nbp.pl/api/exchangerates/rates/a/"&D2&"/"&TEXT(WORKDAY(C2,-1),"yyyy-mm-dd")&"/?format=xml","//Mid"),"—") |
Pobiera kurs średni z dnia poprzedzającego |
| H2 — Netto PLN | =E2*G2 |
Przelicza netto na PLN |
| I2 — VAT PLN | =F2*G2 |
Przelicza VAT na PLN |
| J2 — Brutto PLN | =H2+I2 |
Suma |
Kluczowy fragment: WORKDAY(C2,-1) — cofnij się o jeden dzień roboczy. To funkcja wbudowana w Sheets/Excel, która automatycznie omija weekendy. Święta państwowe trzeba dodać jako trzeci argument (zakres z listą świąt), jeśli chcesz być w 100% precyzyjny.
Jeśli faktury są w walucie, dla której API NBP zwraca błąd (np. egzotyczne waluty spoza tabeli A), formuła zwraca „—" dzięki IFERROR. Widzisz od razu, że tę fakturę trzeba przeliczyć ręcznie.
Wersja dla Excel (Office 365)
W Excelu zamiast IMPORTXML używasz WEBSERVICE + FILTERXML:
=FILTERXML(WEBSERVICE("https://api.nbp.pl/api/exchangerates/rates/a/"&D2&"/"&TEXT(WORKDAY(C2,-1),"yyyy-mm-dd")&"/?format=xml"),"//Mid")
Działa identycznie. Jedyna różnica: Excel odświeża WEBSERVICE tylko przy otwarciu pliku lub na żądanie (F9). W Sheets IMPORTXML odświeża się raz na kilka godzin automatycznie — wygodniej.
Przykład: faktura od Google Ireland
Zwróć uwagę na różne kursy dla faktur z tym samym dniem sprzedaży — to poprawne. Meta Platforms ma sprzedaż z 11 kwietnia (sobota), więc kurs pobiera się z 10 kwietnia. Google i AWS mają sprzedaż 14 kwietnia, kurs z 13 kwietnia.
Pułapki, które warto ominąć
-
Data sprzedaży vs. data wystawienia
Ustawa mówi o dniu powstania obowiązku podatkowego, który zwykle równa się dacie sprzedaży (dostawy towaru / wykonania usługi), a nie dacie wystawienia faktury. W polu FA(3) używaj P_6 (data sprzedaży), nie P_1 (data wystawienia). Przy imporcie usług z UE obowiązek podatkowy powstaje w dniu wykonania usługi.
-
Faktura zaliczkowa i końcowa — różne kursy
Zaliczka ma obowiązek podatkowy w dniu zapłaty, faktura końcowa — w dniu sprzedaży. Przeliczasz osobno, każdą swoim kursem. Jeśli masz w KSeF oba dokumenty, formuła robi to automatycznie.
-
Import usług (reverse charge)
Faktury od Google Ireland, Meta, AWS to import usług — VAT rozliczasz Ty, jako nabywca. Przeliczasz kursem z dnia poprzedzającego datę wykonania usługi. KSeF Import eksportuje pole RodzajFaktury i KodKrajuKontrahenta — po tym filtrujesz faktury reverse charge.
-
Weekend + święto
Sprzedaż 26 grudnia (drugi dzień świąt) — kurs z 23 grudnia (piątek). Funkcja
WORKDAYdomyślnie omija tylko weekendy, święta trzeba dodać jako zakres. W praktyce: podpinasz listę świąt 2025-2027 gdzieś w arkuszu i referujesz w trzecim argumencie WORKDAY.
Alternatywa: archiwum kursów NBP zamiast zapytań na żywo
Jeśli masz setki faktur miesięcznie i chcesz uniknąć 200 zapytań do API przy każdym otwarciu arkusza, zrób tak: raz dziennie automatyzacja (np. Apps Script lub Make.com) pobiera całą dzisiejszą tabelę A z NBP i wrzuca do osobnej zakładki „Kursy". Wszystkie formuły robią wtedy VLOOKUP po parze (waluta, data) — szybko, offline, bez limitów API.
Do budowania takiego cyklu świetnie pasuje stos opisany w artykule o n8n jako open-source automatyzacji KSeF — ten sam workflow obsłuży Ci pobranie kursów.
Efekt: rejestr VAT zakupów w złotówkach, sam się pisze
Po wdrożeniu masz arkusz, w którym każda faktura walutowa z KSeF:
- Ma pobrany kurs z właściwego dnia (niezaleznie czy to poniedziałek, czy po świętach).
- Ma przeliczone netto, VAT i brutto w PLN — zgodne z art. 31a ustawy.
- Jest gotowa do eksportu do JPK_V7 lub do systemu księgowego (jak opisaliśmy w artykule o uzgodnieniu z JPK_V7).
- Nie wymaga ręcznego klikania w stronie NBP — raz skonfigurowane, działa dla każdej kolejnej.
Dla firmy z 20-100 fakturami walutowymi miesięcznie to oszczędność 3-8 godzin pracy księgowej i zerowe ryzyko pomyłki w kursie. A urząd skarbowy w razie kontroli dostaje rejestr, w którym każda pozycja ma transparentny dowód źródła kursu (adres API NBP).
Artykuł przygotowany przez zespół KSeF Import
Twoje faktury walutowe — przeliczone zanim dotkniesz klawiatury
KSeF Import pobiera faktury EUR/USD z KSeF i wrzuca je do Twojego arkusza. Kurs NBP dokłada jedna formuła. Księgowa ma rejestr w PLN bez pracy.
Wypróbuj za darmo przez 7 dni