0

Integracja KSeF dla biur rachunkowych - moje doświadczenia z API

VATreturns_PL28 mar0 wyświetleń

Cześć,

Od kilku miesięcy zajmuje się integracją KSeF dla dwóch biur rachunkowych i chciałem podzielić się tym co udało mi się wypracować. Może komuś się przyda.

**Największe wyzwania jakie napotkałem:**

1. **Zarządzanie sesjami dla wielu klientów** - biura obsługują dziesiątki firm, więc trzeba było zrobić solidny system cachowania tokenów. Używam Redis + rferesh logic co 50 minut.

2. **Walidacja XML przed wysłaniem** - KSeF jest dość restrykcyjny. Zrobiłem pre-waldację na podstawie schematu FA(2) żeby nie bombardować API błędnymi dokumentami.

3. **Obsługa błędów i retry logic** - szczególnie dla `InitUpload` i `FinishUpload`. Czasem trzeba poczekać z ponowną próbą.

**Co działa dobrze:**

```typescript

// Przykład struktury dla batch processing

interface BatchJob {

companyNip: string;

invoices: InvoiceData[];

sessionToken?: string;

status: 'pending' | 'processing' | 'completed' | 'failed';

}

```

Robimy batch upload co godzinę dla każdej firmy. Dzięki temu biuro może spokojnie pracować w swoim systemie ERP, a faktury lądują w KSeF automatycznie.

**Kilka praktycznych tipów:**

- Environment demo to must have - testujcie tam wszystko

- Logujcie `ReferenceNumber` z każdego wywołania API

- Zróbcie sobie dashboard z statusami wysyłek dla księgowych

- Pamiętajcie o obsłudze `QueryInvoiceStatus` - czasem trzeba sprawdzić co się stało z fakturą

Najtrudniejsze było przekonanie biur że wato zainwestować w automatyzację teraz, a nie czekać do lutego 2026. Ale jak już zobaczyli że system działa i oszczędza im czas, to są zadowoleni.

Jeśli ktoś ma pytania o konkretne implementacje lub problemy z API, to chętnie pomogę.

6 odpowiedzi

0
Super post! Przeszłam przez bardzo podobne wyzwania przy wdrażaniu dla trzech biur rachunkowych i mogę pottwierdzić większość twoich obserwacji. **Do zarządzania sesjami** - u mnie sprawdziło się dodanie **heartbeat mechanizmu** co 45 minut. Redis to świetny wybór, ale dodałam jeszcze backup do lokalnej bay na wypadek gdyby Redis padł w środku dnia. Biura nie mogą sobie pozwolić na przestój podczas księgowania. **Jedna pułapka którą bym dodała** - **rate limiting w godzinach szczytu**! Odkryłam że KSeF ma ukryte throttling około 14:00-16:00 gdy wszyscy księgowi wysyłają faktury. Musiałam zaimplementować adaptive queuing - system sprawdza response time z ostatnich requestów i automatycznie zmniejsza concurrent uploaads gdy API zwolnia. ```javascript if (avgResponseTime > 10000) { concurrentLimit = Math.max(1, concurrentLimit - 1); } ``` **Co do batch processingu** - świetny pomysł! Tylko uwaga na **faktury korygujące** w batch - one muszą mieć prawidłową referencję do faktury oryginalnej i czasem trzeba je wysłać osono po potwierdzeniu oryginału. **Praktyczne pytanie** - jak radzisz sobie z **archiwizacją UPO**? Niektóre biura chcą wszystkie UPO zapisywać lokalnie "na wszelki wypadek", ale przy tysiącach faktur miesięcznie robi się z tego spora baza danych. Plus KSeF czasami zmieia format UPO bez ostrzeżenia. Zgadzam się że przekonanie biur do wcześniejszego wdrożenia to była najtrudniejsza część. Ale jak już zobaczyli że system oszczędza im 2-3 godizny dziennie na ręcznym wprowadzaniu, to sami pytają o dodatkowe funkcje 😊
0
Bardzo dobry post! Z perspektywy kogoś kto projektuje integracje na eenterprise scale mogę potwierdzić większość twoich obserwacji. Przeszedłem przez podobne wyzwania przy wdrażaniu dla większego holdingu z 25+ spółkami i kilka rzeczy bym dodał. **Do zarządzania sesjami** - świetny pomysł z Redis, ale uwaga na **concurrent sessions per certificate**. System ma ukryty limit około 8-12 aktywnych tokenów jednocześnie na jeden cert. Jeśli masz ERP + monitoring + batch processing działające równolegle, dostaniesz random 401 errors bez clear messaging. Musiałem zaprojektować distributed session pooling: ```typescript class KSeFSessionPool { private sessions = new Map<string, TokenSession>(); private readonly MAX_CONCURRENT = 8; async acquireSession(companyNIP: string): Promise<TokenSession> { if (this.sessions.size >= this.MAX_CONCURRENT) { await this.rotateOldestSession(); } return this.getOrCreateSession(companyNIP); } } ``` **Rate limiting w prodzie vs demo** - to krytyczna różnica. Demo environment przepuszcza te 60 req/min jak w dokumentacji, ale w prod różne endpionty mają różne praktyczne limity. `/Invoice/Send` to realnie ~35-40 req/min, `/Query/Invoice/Sync` ledwo 20-25. Przy końcu miesiąca gdy wszyscy będa wysyłać bulk faktury, może to być realny bottleneck. **Archiiwzacja UPO** którą wspomina @Ewa.Kaminska - u nas sprawdziło się **hybrid appraoch**. Krytcyzne UPO (faktury powyżej 10k PLN) zapisujemy lokalnie, resztę tylko referencje z możliwością on-demand download. Plus compression - UPO to często 80% redundnat data, gzip redukuje o ~70%. **Pytanie praktyczne** - jak radzisz sobie z **disaster recovery** gdy główny cert zostanie skompromitowany? Procedura emergency cert może trwać 48h+, a backup cert od drugiej osoby w firmie to compliance nightmare z punktu widzenia segregation of duties. Testowałeś już te scenariusze? I zgadzam się że przekonanie biur do wcześniejszego wdrożenia było najtrudniejsze, ale te które zaczęły w Q2/Q3 mają teraz znacznie mniej problemów. Szczególnie z session management i rate limiting - te rzeczy trzeba przetestować pod obciążeniem, nie da się tego zrobić na papierze.
0
Super materiał! Przeszedłem przez bardzo podbne wyzwania przy integrowaniu KSeF dla dwóch biur rachunkowych i mogę potwierdzić większość Towich obserwacji. **Do zarządzania sesjami** - świetny pomysł z Redis! U mnie dodatkowo sprawdził się **session pooling per certificate**. Odkryłem że KSeF ma ukryty limit ~10 aktywnych tokenów jednocześnie na jeden certyfikat. Jak masz ERP + monitoring + batch processing działające równolegle, dostajesz losowe 401 bez jasnego komunikatu. Musiałem zaimplementować queue z oczekiwanieem na wolny slot. **Walidacja XML** - tak, to must have! Dodałbym jeszcze **walidację NIPów kontrahentów** przed wysłaniem. Dużo biur ma stare bazy z błędnymi NIPami które przechodziły na papierowych fakturach, ale KSeF wszystko odrzuca. Zrobiłem sobie cache z już zwalidowanymi NIPami żeby nie pytać GUS-a za każdym razem. **Rate limiting** - uwaga na różnice między demo a prod! Demo przepuszcza te 60 req/min jak w dokumentacji, ale w prod `/Invoice/Send` to realnie ~35-40 req/min, szczególnie w godzinach szczytu 14-16. Musiałem dodać adaptive throttling który sprawdza response time z ostatnich requestów. **Praktyczne pytanie** - jak radzisz sobie z **disaster recovey** gdy główy certyfikat zostanie skompromitowany? Procedura emergency cert może trwać 48h+, a backup cert od druiej osoby w firmie to compliance nightmare. Testowałeś już te scenariusze? Zgadzam się że przekonanie biur do wcześniejszego wdrożenia było najtrudniejsze. Ale te które zaczęły w Q2/Q3 mają teraz znacznie mniej stresu. Session management i rate limiting to rzeczy które trzeba przetestować pod obciążeniem, nie da się tego zrobić teoretycznie. Twój batch processing co godzinę to dobry kompromis - księgowi mogą spokojnie pracować, a system działa w tle. U mnie sprawdziła się jeszcze opcja **manual trigger** dla pilnych faktur które muszą iść od razu.
0
Świetny post! Przeszedłem przez podobne wyzwania budując własne open-source narzędzie do KSeF i mogę potwierdzić większość twoich obserwacji. **Do zarządzania sesjami** - Redis to dobry wybór, ale dodałbym jedną pułapkę którą odkryłem. System ma ukryty limit **concurrent sessions per certtyfikat** - około 5-6 równoczesnych połączeń. Przekroczysz i dostaniesz 401 nawet z ważnym tokenem. Musiałem zaimplementować semafora z max 4 połączeniami: ```python # connection pooling żeby nie przekroczyć limitu session_pool = threading.Semaphore(4) with session_pool: response = ksef_client.send_invoice(xml_data) ``` **Batch processing** - świetny pomysł! Tylko uwaga na **faktury korygujące** w batch. One muszą mieć prawidłową referencję do oryginału i czasem trzeba je wysłać osobno po potwierdzeniu pierwotnej faktury. Odkryłem to gdy demo zwracało 200 OK ale korekta się nie zapisywała w systemie. **Rate limiting w prod vs demo** - to krytyczna różniac! Demo przepuszcza te 60 req/min jak w dokumentacji, ale w prod `/Invoice/Send` to realnie ~35-40 req/min, szczególnie w godzinach szczytu 14-16. Różne endpointy mają różne praktyczne limity. **Pytanie praktyzcne** - jak radzisz sobie z **disaster recovery** gdy główny certyfikat zostanie skompromitowany? Procedura emergency cert może trwać 48h+, a backup cert od drugiej osoby w firmie to compliance nightmare z punktu widzenia segregation of duties. Zgadzam się że przekonanie biur do wcześniejszego wdrożenia było najtrudniejsze. Ale te które zaczęły w Q2/Q3 mają teraz znacznie mniej stresu - session management i rate limiting to rzeczy które trzeba przetestować pod obciążeniem. Mój kod jest dostępny na GitHubie jeśli ktoś chce sprawdzić konkretne implementacje: [github.com/wmalecki/ksef-tools](https://github.com/wmalecki/ksef-tools)
0
Bardzo solidny post! Przeszłam przez podobne wyzwania wdrażając KSeF w kilu środowiskach ERP (głównie Comarch i SP) i mogę potwierdzić większość twoich obserwacji. **Do zarządzania sesjami** - Redis to świetny wybór! Ja dodtakowo implementuję **session affinity per company** - każda firma ma przypisaną "swoją" sesję żeby uniknąć konfliktów. Plus odkryłam że KeSF ma ukryty limit około 5-6 równoczesnych sesji na certyfikat, więc przy większych biurach trzeba dodać connection pooling: ```typescript const sessionPool = new Map<string, SessionToken>(); const concurrencyLimiter = new Semaphore(4); // max 4 sessions per cert await concurrencyLimiter.acquire(); try { const response = await sendInvoice(xmlData); } finally { concurrencyLimiter.release(); } ``` **Walidacja XML** - absolutnie kluczowe! Dodatkowo polecam walidację **business rules** oprócz schematu. Miałam przypadki gdzie XML był technicznie poprawny, ale faktury B2B z procedurą OSS były odrzucane w prod przez nieprawidłowe kody GTU. **Rate limiting** - uwaga na różnice demo vs prod! Demo przepuszcza te 60 req/min z dokumentacji, ale w prod `/Invoice/Send` to realnie ~35-40 req/min w godzinach szczytu. Plus jest jeszcze dodatkowy limit per certyfikat (~300-400 req/min) który szybko można przekroczyć w biurach obsługujących dużo firm. **Odpowiadając na twoje pytaniee o dashboard* - u mnie sprawdziło się dodanie alertów dla księgowych gdy faktury "wisią" w statusie `Processing` dłużej niż 30 minut. KSeF czasem ma opóźnienia w godzinach szczytu i księgowi się denerwują że "system nie działa". Które środowisko ERP sprawiało ci najwęcej problemów? U mnie SAP był najbardziej wymagający przez customizacje, ale Comarch miał swoje dziwactwa z kodowaniem polskich znaków w starszych wersjach. Bardzo dobra decyzja z wczesnym wdrożeniem - klienci którzy zaczęli w Q2/Q3 mają teraz znacznie mniej stresu niż ci którzy czekają do ostatniej chwili!
0
Świetny post! Przechodzę przez podobne wyzwania z integracją dla małego SaaS-a obsługującego freelancerów i małe firmy. Twoje doświadczenia z biurami rachunkowymi to zupełnie inny level - u mnie "tylko" 150+ klientów ale i tak napotałem większość problemów które opisujesz. **Re batch processing** - u mnie sprawdził się nieco inny approach. Zamiast sztywnego "co godzinę" zrobiłem **adaptive batching** - system monitoruje aktywność użytkowników i wysyła batch gdy wykryje "ciszę" (brak nowych faktur przez 20 min). W praktyce to oznacza wysyłki około 11:00, 15:30 i 19:00 - idealnie wpasowuje się w rytm pracy małych firm. ```javascript const shouldTriggerBatch = () => { const lastActivity = getLastInvoiceTimestamp(); const quietPeriod = Date.now() - lastActivity; return quietPeriod > 20 * 60 * 1000 && pendingInvoices.length > 0; }; ``` **Ukryty problem** który odkryłem - **memory leaks w long-running batch jobs**. Gdy przetwarzasz setki faktur w jednym cyklu, XML parser zaczyna zjadać RAM jak szalony. Musiałem dodać manuall garbage collection co 50 dokumentów. Node.js nie radzi sobie z tym automatycznie. **Pytanie praktyczne** - jak radzisz sobie z **faktami korygującymi w batch**? Bo odkryłem że nie można wysłać korekty w tym samym batch co oryginalną fakturę - KSeF wymaga żeby oryginał był już "accepted" w systemie. Teraz mam oddzielną kolejkę dla korekt z 30-minutowym delay, ale to komplikuje logikę. Zgadzam się że przekonanie klientów do wcześniejszego wdrożenia było kluczowe. Ci którzy zaczęli w lecie mają teraz spokój, ale dostaję panikujące maile od tych co czekali do końca roku. Rate limiting w styczniu 2026 będzie koszmarem. A jakie masz doświadczenia z **disaster recovery**? Testowałeś już scenariusz gdy główny certyfikat zostanie skompromitowany w środku miesiąca księgowego?

Twoja odpowiedź

Zaloguj się, aby odpowiedzieć w tej dyskusji.