SSD Nodes Learn 🎉 VPS od $5.50/mies.
Przewodniki Matt ConnorAutor: Matt Connor

Najlepsze oprogramowanie do faktur self-hosted

Porównanie Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai oraz ERPNext. Analiza funkcji, licencji i wymagań serwerowych dla systemów fakturowania instalowanych na VPS.

Które oprogramowanie do fakturowania typu self-hosted wybrać?

Wybór oprogramowania do fakturowania typu self-hosted na jednym VPS sprowadza się do pięciu realnych opcji, które nie są swoimi bezpośrednimi zamiennikami. Invoice Ninja to najbardziej dopracowany produkt: faktury cykliczne, portal klienta, bramki płatności oraz formaty e-faktur działają od pierwszego dnia po instalacji. InvoiceShelf stanowi lżejszą alternatywę w pełni open source. InvoicePlane to prosta aplikacja PHP niewymagająca skomplikowanej orkiestracji. Kimai służy do rozliczania przepracowanych godzin zamiast pozycji na fakturze. ERPNext to kompletny system księgowy, który również generuje faktury.

Dwa problemy powodują niepowodzenie wdrożeń self-hosted znacznie częściej niż brakujące funkcje. Pierwszym jest poczta elektroniczna. Faktura, która trafiła do folderu spam, to faktura nieopłacona, a użytkownik zazwyczaj nie otrzymuje o tym powiadomienia. Drugim są kopie zapasowe. Jest to baza danych typu self-hosted, której utrata staje się problemem podatkowym, a nie tylko niedogodnością.

Przed zapoznaniem się z listą funkcji należy sprawdzić licencję. Trzy z pięciu wymienionych programów korzystają z licencji copyleft, jeden z licencji permisywnej, a jeden jest dostępny w modelu source-available z realnymi ograniczeniami dotyczącymi zakresu użytkowania.

Pięć opcji i dla kogo jest każda z nich

Invoice Ninja

Aplikacja oparta na frameworku Laravel, obecnie w linii v5. Samodzielny hosting jest darmowy i nie posiada ograniczeń: faktury cykliczne, wyceny, projekty, śledzenie czasu pracy, wydatki, portal klienta oraz bramki płatności, w tym Stripe i PayPal. Projekt określa się mianem „aplikacji typu source-available do obsługi faktur, wycen, projektów i śledzenia czasu, zbudowanej w Laravel”. Jedynym płatnym elementem jest branding. Słowami twórców: „Oferujemy licencję white-label w cenie 40 USD rocznie, aby usunąć branding Invoice Ninja z elementów aplikacji widocznych dla klienta”. Cena ta jest aktualna na sierpień 2026.

Wybierz to rozwiązanie, jeśli oczekujesz najbardziej kompletnego produktu i akceptujesz utrzymywanie największego stosu technologicznego.

InvoiceShelf

Fork projektu Crater, udostępniony na licencji GNU Affero General Public License version 3 (AGPL-3.0). Obejmuje faktury, kosztorysy, rozliczenia cykliczne, wydatki, podatki, obsługę wielu walut, portal klienta oraz obsługę wielu firm. Płatności i usuwanie brandingu znajdują się w oddzielnych oficjalnych repozytoriach modułów, oba na licencji AGPL-3.0 i oba darmowe. Płatności kartą obsługiwane są przez Stripe checkout.

Wybierz to rozwiązanie, jeśli potrzebujesz niewielkiej, w pełni otwartoźródłowej aplikacji i nie wymagasz obsługi trzydziestu różnych bramek płatności.

InvoicePlane

Aplikacja PHP oparta na CodeIgniter, wydana na licencji MIT. Jest to jedyna opcja w zestawieniu, którą instaluje się poprzez rozpakowanie plików w katalogu głównym serwera WWW. Brak Docker i brak etapu budowania w Node. Pliki PDF generowane są przez mPDF, więc szablony oparte są na HTML i CSS. Klienci otrzymują link gościa, aby wyświetlić i opłacić fakturę.

Haczyk tkwi w płatnościach. Dokumentacja jasno stwierdza, że InvoicePlane 1.6 domyślnie obsługuje tylko Stripe, a inni dostawcy zostali usunięci w tej wersji. Opublikowane wymagania dla linii 1.6 to PHP 8.0 do 8.1 wraz z MySQL 5.5 lub odpowiadającą wersją MariaDB. Należy zapoznać się z uwagami do konkretnego wydania, ponieważ linia 1.7 jest wciąż w fazie rozwoju.

Wybierz to rozwiązanie, jeśli korzystasz ze współdzielonego hostingu lub VPS o pamięci 512 MB.

Kimai

Narzędzie do śledzenia czasu pracy na licencji AGPL-3.0, które generuje faktury na podstawie kart czasu pracy. Jest to właściwy wybór dla każdego, kto rozlicza się godzinowo. Szablony faktur przesyła się jako pliki DOCX, ODS lub XLSX, co według dokumentacji jest jedynym akceptowanym formatem, a następnie renderuje do PDF lub HTML. Układ faktury projektuje się w edytorze tekstu zamiast pisać kod CSS, co dla większości użytkowników jest łatwiejsze.

Kimai nie posiada portalu klienta ani bramek płatności, więc faktury PDF wysyła się pocztą elektroniczną. Ustrukturyzowane e-fakturowanie jest płatną wtyczką ze sklepu o nazwie E-Invoice Plus, wycenioną na 99 EUR netto rocznie za instalację self-hosted (stan na sierpień 2026), obejmującą profile EN16931, XRechnung, ZUGFeRD, Factur-X oraz Peppol.

Wybierz to rozwiązanie, jeśli faktura jest wynikiem śledzonego czasu pracy.

ERPNext

Licencja GPL-3.0 i inna kategoria oprogramowania. Faktura sprzedaży jest jednym z typów dokumentów w pełnym systemie księgowym z planem kont, zapisami księgowymi, gospodarką magazynową i płacami. Jest to właściwy wybór, gdy fakturowanie przestaje być jedynym zadaniem. Dla jednego freelancera z ośmioma klientami jest to oprogramowanie zbyt rozbudowane. Uruchomienie tego systemu to osobny projekt, opisany w uruchamianie ERPNext na VPS.

Fakturowanie cykliczne zależy od niewidocznego harmonogramu

Invoice Ninja, InvoiceShelf, InvoicePlane oraz ERPNext generują faktury cykliczne. Kimai nie posiada wbudowanej funkcji faktur cyklicznych, ponieważ faktura jest tam tworzona na podstawie wpisów w karcie czasu pracy za dany okres.

Tryb awarii jest identyczny w każdej aplikacji opartej na Laravel i przebiega w sposób cichy. Faktury cykliczne są tworzone przez zadanie harmonogramu, php artisan schedule:run, które musi być wywoływane co minutę przez proces zewnętrzny względem aplikacji. Jeśli nikt go nie wywołuje, lista faktur cyklicznych nadal wyświetla datę kolejnej wysyłki, która po prostu mija. Faktura nie powstaje. Żaden błąd nie jest rejestrowany, ponieważ kod nie został uruchomiony.

Dlatego po utworzeniu pierwszej faktury cyklicznej należy ustawić datę kolejnej wysyłki na kilka minut w przód i poczekać. Jeśli faktura nie dotrze, oznacza to, że harmonogram nie działa. W instalacji Docker zazwyczaj oznacza to, że usługa cron lub scheduler w pliku compose nigdy nie wystartowała lub została zakończona.

docker compose ps
docker compose logs --tail 50

Każda usługa w pliku powinna zgłaszać stan running. Usługa znajdująca się w stanie exited to ta, której dzienniki należy sprawdzić.

Obsługa wielu walut i podatków: co sprawdzić przed wdrożeniem

Listy funkcji często zawierają hasło „wiele walut”, jednak znaczenie tego terminu bywa różne. Należy przeprowadzić poniższe cztery testy na instancji demonstracyjnej, używając rzeczywistych danych z własnej działalności. Błędy w tym obszarze są zazwyczaj wykrywane przez księgowość, a nie przez administratora.

  1. Czy faktura przechowuje kurs wymiany walut obowiązujący w dniu jej wystawienia? Jest to wymóg konieczny. Jeśli aplikacja przelicza sumy na podstawie bieżącego kursu, raporty z poprzedniego kwartału będą się zmieniać przy każdym otwarciu, co spowoduje rozbieżności w dokumentacji księgowej.
  2. Czy podatek jest naliczany dla każdej pozycji z osobna, dla całej faktury, czy w obu wariantach? Stawka na poziomie całej faktury jest wystarczająca do momentu, w którym jedna z pozycji otrzymuje stawkę zero procent.
  3. Czy istnieje możliwość wprowadzania cen brutto oraz netto? Przeliczanie cen po fakcie wprowadza różnice wynikające z zaokrągleń o jeden grosz na pozycji, co w skali roku prowadzi do istotnych rozbieżności.
  4. Co dokument zawiera w przypadku klienta z innego kraju, który jest zwolniony z VAT? Na fakturze musi znaleźć się adnotacja o zwolnieniu, a nie tylko wartość zero w kolumnie podatku.

Invoice Ninja oraz ERPNext obsługują wszystkie cztery punkty. InvoiceShelf wymienia podatki i obsługę wielu walut wśród swoich funkcji. InvoicePlane oraz Kimai są prostszymi rozwiązaniami, dlatego należy przetestować je na najbardziej złożonym przykładzie faktury, a nie na najprostszym.

Portal klienta i bramki płatności

Portal klienta to strona, na której klient przegląda swoje faktury, pobiera pliki PDF i dokonuje płatności. Jest to ważniejsze, niż mogłoby się wydawać, ponieważ upominanie się o płatności drogą mailową pochłania więcej czasu niż wystawienie samej faktury.

Invoice Ninja oferuje w tym zakresie najwięcej: posiada pełny portal, obsługuje wiele bramek płatności, umożliwia zapisywanie metod płatności oraz automatyczne fakturowanie w przypadku faktur cyklicznych. InvoiceShelf udostępnia portal klienta i dodaje obsługę Stripe Checkout za pośrednictwem modułu płatności. InvoicePlane generuje dla każdej faktury link gościa i wspiera Stripe. Kimai nie posiada takiej funkcjonalności, dlatego faktury PDF są wysyłane jako załączniki.

Jedna kwestia jest często mylnie rozumiana. Samodzielne hostowanie aplikacji do fakturowania nie oznacza przechowywania numerów kart płatniczych. W przypadku Stripe Checkout klient jest przekierowywany do serwisu Stripe, tam wprowadza dane karty, a Twój VPS nigdy nie ma wglądu w te numery. Zakres zgodności PCI (Payment Card Industry) pozostaje ograniczony właśnie dlatego, że formularz płatności nie został zbudowany przez Ciebie. Jeśli w przyszłości zaistnieje potrzeba korzystania z więcej niż jednego procesora płatności lub kierowania płatności w zależności od kraju, należy to zrealizować w osobnej warstwie, takiej jak samodzielnie hostowana orkiestracja płatności z Hyperswitch.

Jakość PDF oraz szablon, który będziesz edytować

Będziesz edytować szablon. Każde ustawienie domyślne umieszcza adres w miejscu nieodpowiednim dla Twojego kraju.

Invoice Ninja renderuje szablony HTML i CSS do formatu PDF przy użyciu bezgłowego (headless) Chromium dołączonego do obrazu, co tłumaczy duży rozmiar kontenera. Zaplanuj odpowiednią ilość pamięci: przeglądarka bezgłowa jest najbardziej zasobożernym procesem w stosie, więc VPS z 1 GB pamięci RAM to rozwiązanie na granicy wydajności. InvoicePlane korzysta z mPDF, który jest rozwiązaniem czysto opartym na PHP i lekkim, kosztem ignorowania niektórych nowoczesnych właściwości CSS. Kimai przyjmuje odmienne podejście, wymagając przesłania pliku DOCX lub ODS, dzięki czemu układ strony jest przygotowywany w LibreOffice lub Wordzie przez osobę, która nie musi znać arkuszy stylów.

Jeśli zależy Ci na wyglądzie faktury, a nie na CSS, podejście Kimai jest lepsze. Jeśli wolisz, aby szablon znajdował się w systemie kontroli wersji i był czytelny w porównaniach (diff), wygrywa HTML.

Czy licencja pozwala na komercyjne wykorzystanie?

Wszystkie pięć rozwiązań pozwala na wystawianie faktur własnym klientom. Różnice pojawiają się w przypadku działań wykraczających poza ten zakres.

Invoice Ninja podlega licencji Elastic License 2.0. Istotne są dwie klauzule.

Nie wolno udostępniać oprogramowania podmiotom trzecim jako usługi hostowanej lub zarządzanej, w której usługa zapewnia użytkownikom dostęp do znacznego zestawu funkcji lub funkcjonalności oprogramowania.
Nie wolno usuwać, zmieniać, wyłączać ani obchodzić funkcjonalności klucza licencyjnego w oprogramowaniu.

Zatem uruchamianie go na potrzeby własnej działalności jest dozwolone, natomiast uruchamianie instancji dla klientów jako produktu – nie. Druga klauzula wyjaśnia, dlaczego usunięcie brandingu wymaga zakupu licencji za 40 USD, a nie jest kwestią modyfikacji kodu źródłowego.

InvoiceShelf, Kimai oraz Crater korzystają z licencji AGPL-3.0. Wykorzystanie komercyjne jest bezpłatne i nie istnieją wyższe poziomy licencyjne. Zobowiązanie wynika z sekcji 13: jeśli zmodyfikujesz kod i pozwolisz innym osobom korzystać ze zmodyfikowanej wersji przez sieć, musisz udostępnić im kod źródłowy swoich zmian. Niezmodyfikowana instancja jest już objęta publicznym kodem źródłowym dostarczonym przez twórców, więc większość użytkowników self-hosted nigdy nie musi się tym przejmować.

InvoicePlane korzysta z licencji MIT, która nakłada najmniejsze zobowiązania w tej grupie, choć plik README zaznacza, że nazwa i logo pozostają własnością projektu.

ERPNext korzysta z licencji GPL-3.0. Modyfikacje, które rozpowszechniasz, muszą zostać udostępnione, natomiast prywatne korzystanie z oprogramowania nie wiąże się z żadnymi obowiązkami.

Powyższy opis dotyczy treści licencji i nie stanowi porady prawnej.

Czy projekt jest nadal utrzymywany? Sprawdź dziennik commitów

Crater przez kilka lat był popularną aplikacją open source do fakturowania i wiele poradników nadal go poleca. W jego domyślnej gałęzi nie odnotowano żadnego commita od 741 dni.

ChartGap since the last commit on the default branch, in days, checked 21 August 2026
The data behind this chart
[
  {
    "label": "ERPNext",
    "commit_gap": 0
  },
  {
    "label": "Invoice Ninja",
    "commit_gap": 1
  },
  {
    "label": "Kimai",
    "commit_gap": 1
  },
  {
    "label": "InvoicePlane",
    "commit_gap": 3
  },
  {
    "label": "InvoiceShelf",
    "commit_gap": 4
  },
  {
    "label": "Crater",
    "commit_gap": 741
  }
]

Spośród 6 projektów w tym bloku, pięć otrzymało commit w ciągu ostatniego tygodnia. InvoiceShelf to fork, który kontynuuje prace nad Craterem, na tej samej licencji AGPL-3.0 i z tym samym modelem danych, więc przejście na niego jest migracją danych, a nie przepisywaniem systemu. Zainstaluj InvoiceShelf, a nie Crater.

Instalacja poszczególnych elementów na VPS

Wszystko poza InvoicePlane najłatwiej uruchomić za pomocą Docker Compose. Jeśli jest to nowe zagadnienie, warto zacząć od pierwszego stosu Docker Compose na VPS i wrócić tutaj.

Invoice Ninja dostarcza własne repozytorium compose.

git clone https://github.com/invoiceninja/dockerfiles.git
cd dockerfiles
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --show

Skopiuj ten klucz do pliku env w repozytorium, wraz z właściwym APP_URL. Następnie ustaw uprawnienia właściciela zgodnie z wymaganiami obrazu i uruchom go.

chmod 755 docker/app/public
sudo chown -R 1500:1500 docker/app
docker compose up -d

Właściciel 1500:1500 odpowiada użytkownikowi wewnątrz obrazu. Pomiń ten krok, a aplikacja nie będzie mogła zapisać pamięci podręcznej ani wygenerowanych plików PDF. W kreatorze konfiguracji podaj db jako hosta bazy danych, ponieważ jest to nazwa usługi w sieci compose. localhost wskazuje tam na sam kontener aplikacji.

InvoiceShelf publikuje gotowe pliki compose, po jednym dla każdego silnika bazy danych.

curl -fLO https://raw.githubusercontent.com/InvoiceShelf/docker/master/docker-compose.mysql.yml
mv docker-compose.mysql.yml docker-compose.yml

Otwórz ten plik przed uruchomieniem. Każde hasło w nim jest symbolem zastępczym, o czym informują komentarze w pliku. APP_URL, SESSION_DOMAIN oraz SANCTUM_STATEFUL_DOMAINS domyślnie przyjmują wartość localhost i wszystkie trzy wymagają ustawienia właściwej nazwy hosta przed pierwszym logowaniem. Następnie uruchom usługę.

docker compose up -d

Publikuje ona port 8090 na hoście i obsługuje 8080 wewnątrz kontenera. Umieść przed nią reverse proxy z TLS (transport layer security), zanim skierujesz do niej jakiegokolwiek klienta.

Produkcyjny plik compose dla Kimai, z dokumentacji projektu
services:

  sqldb:
    image: mysql:8.3
    volumes:
      - mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=kimai
      - MYSQL_USER=kimaiuser
      - MYSQL_PASSWORD=kimaipassword
      - MYSQL_ROOT_PASSWORD=changemeplease
    command: --default-storage-engine innodb
    restart: unless-stopped
    healthcheck:
      test: mysqladmin -uroot -p$$MYSQL_ROOT_PASSWORD ping -h 127.0.0.1 --silent
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 30s

  kimai:
    image: kimai/kimai2:stable
    depends_on:
      sqldb:
        condition: service_healthy
        restart: true
    volumes:
      - data:/opt/kimai/var/data
      - plugins:/opt/kimai/var/plugins
    ports:
      - 8001:8001
    environment:
      - APP_SECRET=your-fantastic-long-random-and-ultra-secure-secret
      - TRUSTED_HOSTS=kimai.example.com
      - ADMINMAIL=admin@example.com
      - ADMINPASS=changemeplease
      - DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai?charset=utf8mb4&serverVersion=8.3.0
    restart: unless-stopped

volumes:
  data:
  mysql:
  plugins:

Ustaw APP_SECRET na długi, losowy ciąg znaków, a TRUSTED_HOSTS na domenę, której faktycznie będziesz używać. ADMINMAIL oraz ADMINPASS tworzą pierwszego administratora przy pierwszym uruchomieniu, więc po zalogowaniu zmień hasło w interfejsie i usuń je z pliku.

InvoicePlane nie posiada kontenera. Najpierw utwórz pustą bazę danych.

sudo mysql -e "CREATE DATABASE invoiceplane CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

Pobierz archiwum ze strony wydań projektu, rozpakuj je w głównym katalogu WWW, skopiuj ipconfig.php.example do ipconfig.php i ustaw swój adres URL wewnątrz, postępując zgodnie z komentarzami w tym pliku. Następnie otwórz https://your-domain.example/index.php/setup i przejdź przez instalator.

Dlaczego faktura trafia do folderu spam

Jest to błąd, który generuje straty finansowe, a aplikacja błędnie raportuje fakturę jako wysłaną.

Nie należy wysyłać poczty z fakturami bezpośrednio z adresu IP serwera VPS. Nowy adres IP VPS nie posiada historii wysyłkowej, a duzi dostawcy poczty domyślnie traktują pierwszą wiadomość z nieznanego adresu w zakresie adresacji hostingowej jako podejrzaną. Należy korzystać z przekaźnika SMTP (simple mail transfer protocol) w domenie, która została uwierzytelniona. Pełna konfiguracja tego procesu to osobne zagadnienie, a niezawodne wysyłanie poczty z aplikacji self-hosted zawiera informacje o przekaźniku, rekordach DNS oraz testowaniu.

Pole From jest miejscem, w którym najczęściej dochodzi do błędów w konfiguracji fakturowania. Musi ono wskazywać na domenę, którą użytkownik kontroluje i którą przekaźnik podpisuje za pomocą DKIM (domainkeys identified mail). Umieszczanie adresu klienta w polu From jest nieprawidłowe i uniemożliwia dostarczenie wiadomości, ponieważ serwer odbiorczy sprawdza, czy domena w polu From jest zgodna z domeną, która uwierzytelniła wiadomość. Gmail odrzuca takie wiadomości z powodu niezgodności:

550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy

W polu From należy pozostawić własny adres, a adres klienta umieścić w polu Reply-To. Przed wysłaniem jakichkolwiek rzeczywistych dokumentów należy sprawdzić opublikowane rekordy.

dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.com

Pierwsze polecenie powinno zwrócić rekord SPF (sender policy framework) wskazujący na używany przekaźnik. Drugie powinno zwrócić politykę DMARC (domain-based message authentication, reporting and conformance). Trzecie zależy od selektora dostarczonego przez przekaźnik; brak odpowiedzi oznacza, że rekord DKIM nie istnieje lub został opublikowany pod błędną nazwą, co spowoduje, że każda wysłana wiadomość nie przejdzie weryfikacji podpisu.

Następnie należy wysłać rzeczywistą fakturę na konto posiadane u dużego dostawcy i przeanalizować surowe nagłówki wiadomości. Wartości dkim=pass oraz spf=pass w nagłówku Authentication-Results są jedynym wiarygodnym dowodem poprawności. Flaga "wysłano" w aplikacji oznacza jedynie, że wiadomość została przekazana do przekaźnika.

Kopie zapasowe: baza danych, której nie można utracić

Utrata serwera multimediów oznacza konieczność ponownego pobrania plików. Utrata bazy danych z fakturami oznacza brak możliwości wykazania wystawionych rachunków, otrzymanych płatności oraz kwot pozostających do zapłaty. Należy traktować to odpowiednio poważnie.

Należy tworzyć kopie zapasowe czterech elementów. Bazy danych. Wolumenu danych, który przechowuje logotypy, wygenerowane pliki PDF oraz skany faktur kosztowych. Pliku środowiskowego aplikacji. Oraz wygenerowanych plików PDF przechowywanych jako zwykłe pliki, ponieważ plik PDF otworzy się za dziesięć lat nawet bez aplikacji, która go utworzyła.

Plik środowiskowy jest ważniejszy, niż się powszechnie uważa. Laravel szyfruje wrażliwe przechowywane wartości, w tym dane uwierzytelniające bramek płatności, przy użyciu APP_KEY znajdującego się w tym pliku. Przywrócenie bazy danych wraz z nowo wygenerowanym kluczem spowoduje, że te wartości nie zostaną odszyfrowane. Faktury będą obecne, ale ustawienia bramki płatności staną się nieczytelne.

Zrzut stosu InvoiceShelf wygląda następująco. Usługa bazy danych działa w mariadb:10, więc narzędziem wewnątrz kontenera jest mariadb-dump.

docker compose exec -T database mariadb-dump \
  --user=root --password=YOUR_ROOT_PASSWORD \
  --single-transaction --databases invoiceshelf > invoiceshelf.sql

--single-transaction wykonuje spójną migawkę tabel InnoDB bez ich blokowania, dzięki czemu aplikacja może nadal obsługiwać ruch podczas tworzenia zrzutu. -T zapobiega przydzielaniu terminala przez Docker, co w przeciwnym razie uszkodziłoby przekierowane wyjście i spowodowałoby powstanie pliku zrzutu, którego nie da się zaimportować.

Należy wysyłać kopie poza serwer zgodnie z harmonogramem, korzystając z szyfrowanych kopii zapasowych restic do pamięci zewnętrznej, oraz ustawić retencję na okres wystarczająco długi, aby spełnić wymagania księgowości.

Następnie należy przetestować przywracanie. Należy wczytać zrzut w tymczasowym kontenerze, zalogować się i otworzyć fakturę z zeszłego miesiąca. Dopóki nie zostanie to wykonane przynajmniej raz, nie ma pewności, czy kopia zapasowa działa poprawnie.

O co zapyta księgowy

Nie należy traktować tego poradnika jako porady podatkowej. Poniżej przedstawiono zestawienie danych, które może wygenerować oprogramowanie, aby można było przekazać je osobie prowadzącej księgowość.

Eksport danych. Użytkownik powinien mieć możliwość eksportu faktur i płatności do formatu CSV bezpośrednio z interfejsu, bez użycia klienta bazy danych i bez konieczności otwierania zgłoszenia do wsparcia technicznego. Zrzut SQL to kopia zapasowa, a nie eksport, ponieważ księgowy nie będzie w stanie go otworzyć.

Niezmienność numeracji. Numery faktur powinny być nadawane sekwencyjnie, bez luk i nigdy nie powinny być używane ponownie. Usunięcie faktury tworzy lukę, którą należy wyjaśnić. Zamiast tego należy stosować korekty lub anulowanie, co wspiera każda z omawianych aplikacji. To, czy wymagana jest ciągłość numeracji, zależy od miejsca rejestracji działalności; warto zapytać o to odpowiednio wcześnie.

Przechowywanie danych. Zrzuty baz danych oraz wygenerowane pliki PDF należy przechowywać tak długo, jak wymagają tego przepisy. Plik PDF to dokument, który faktycznie został wysłany; jest to artefakt, który ma znaczenie w przypadku sporu dotyczącego faktury.

Historia zmian. Możliwość sprawdzenia, kto i kiedy edytował fakturę, jest przydatna, choć funkcjonalność ta różni się w zależności od aplikacji. Invoice Ninja prowadzi dziennik aktywności dla każdego rekordu.

Ustrukturyzowane e-fakturowanie stało się w niektórych częściach UE realnym wymogiem, a nie tylko dodatkową funkcją. Invoice Ninja generuje popularne formaty, w tym ZUGFeRD, XRechnung, Facturae, FatturaPA oraz standardowe EN16931. Dostarczanie faktur przez sieć Peppol z instancji self-hosted odbywa się za pośrednictwem punktu dostępowego Invoice Ninja: podmiot należy zarejestrować w ich systemie i wykupić kredyty na każdą wysyłkę, co oznacza, że na sierpień 2026 jest to usługa płatna. Kimai obsługuje te same formaty za pośrednictwem płatnej wtyczki. Pozostałe trzy aplikacje nie generują obecnie żadnych ustrukturyzowanych e-faktur, co stanowi najsilniejszy argument za wyborem Invoice Ninja w przypadku wystawiania faktur na terenie UE.

FAQ

Czy powinienem zainstalować Crater czy InvoiceShelf?

InvoiceShelf. Domyślna gałąź projektu Crater nie otrzymała żadnego commita od 741 dni, stan na 21 sierpnia 2026, a system śledzenia błędów tego projektu odsyła użytkowników do forka. InvoiceShelf korzysta z tej samej licencji AGPL-3.0 oraz tego samego modelu danych, więc przejście między nimi wymaga jedynie migracji bazy danych, a nie przepisywania aplikacji. Każdy poradnik zalecający Crater powstał przed wyciszeniem projektu.

Czy mogę używać Invoice Ninja we własnej firmie bez opłat?

Tak. Samodzielnie hostowana wersja Invoice Ninja jest w pełni funkcjonalna i darmowa na licencji Elastic License 2.0, co obejmuje faktury cykliczne, portal klienta oraz bramki płatności. Płatne są dwie rzeczy. Usunięcie brandingu Invoice Ninja ze stron widocznych dla klienta wymaga licencji white-label, kosztującej według stanu na sierpień 2026 roku „40 USD rocznie”. Wysyłanie e-faktur przez sieć Peppol jest rozliczane oddzielnie. Licencja zabrania jedynie uruchamiania oprogramowania jako usługi hostingowej dla osób trzecich.

Dlaczego moje e-maile z fakturami trafiają do spamu?

Prawie zawsze dlatego, że wiadomość nie jest uwierzytelniona dla domeny znajdującej się w adresie From. Należy wysyłać pocztę przez przekaźnik SMTP, zamiast bezpośrednio z VPS, a następnie opublikować rekordy SPF i DMARC dla swojej domeny oraz dodać rekord DKIM zgodnie z selektorem dostarczonym przez przekaźnik. W polu From należy pozostawić własny adres, a adres klienta umieścić w polu Reply-To. Ustawienie adresu klienta jako nadawcy spowoduje odrzucenie wiadomości przez Gmail z błędem 550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. Poprawność konfiguracji można potwierdzić, odnajdując dkim=pass oraz spf=pass w nagłówku Authentication-Results wiadomości testowej.

Co wybrać, jeśli rozliczam się godzinowo?

Kimai. Jest to przede wszystkim narzędzie do śledzenia czasu pracy, więc faktura jest generowana na podstawie zatwierdzonych wpisów w karcie czasu pracy, a pozycje na fakturze odpowiadają zarejestrowanym zadaniom. Szablony to pliki DOCX, ODS lub XLSX projektowane w edytorze tekstu, co jest łatwiejsze niż edycja CSS. Ceną za to jest brak portalu klienta i bramki płatności w Kimai, więc fakturę PDF wysyła się e-mailem, a płatność otrzymuje przelewem. Invoice Ninja również śledzi czas i posiada portal, więc wybierz to rozwiązanie, jeśli płatności kartą online są dla Ciebie ważniejsze niż szczegółowość kart czasu pracy.

Co dokładnie muszę archiwizować?

Bazę danych, wolumen pamięci masowej przechowujący logotypy i wygenerowane pliki PDF, plik środowiskowy oraz wygenerowane pliki PDF przechowywane jako zwykłe pliki. Plik środowiskowy jest tym, o czym użytkownicy często zapominają: aplikacje Laravel, takie jak Invoice Ninja i InvoiceShelf, szyfrują przechowywane dane uwierzytelniające za pomocą APP_KEY, więc baza danych przywrócona z nowo wygenerowanym kluczem sprawi, że ustawienia bramki płatności staną się nieczytelne. Należy raz przywrócić całość na instancję testową i otworzyć starą fakturę, ponieważ jest to jedyny sposób, aby upewnić się, że kopia zapasowa działa.

#invoicing#self-hosting#small-business#docker#accounting