Samodzielne oprogramowanie do faktur: porównanie systemów
Porównanie Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai oraz ERPNext. Analiza funkcji rozliczeniowych, obsługi bramek płatności oraz ryzyk związanych z własną infrastrukturą VPS.
Jakie oprogramowanie do fakturowania wybrać do hostowania we własnym zakresie?
Oprogramowanie do fakturowania hostowane samodzielnie sprowadza się do pięciu realistycznych wyborów na jednym VPS, a nie są to bliskie zamienniki. Invoice Ninja to najbardziej dopracowany produkt: faktury cykliczne, portal klienta, bramki płatności i formaty e-faktur działają od dnia instalacji. InvoiceShelf to lżejsza opcja w pełni otwartoźródłowa. InvoicePlane to prosta aplikacja PHP niewymagająca orkiestracji. Kimai rozlicza śledzone godziny zamiast pozycji na fakturze. ERPNext to pełny system księgowy, który również generuje faktury.
Dwa problemy niweczą samodzielnie hostowaną konfigurację fakturowania znacznie częściej niż brakująca funkcja. Pierwszym jest poczta elektroniczna. Faktura znajdująca się w folderze spamu to faktura nieopłacona, a nic nie informuje o tym fakcie. Drugim są kopie zapasowe. Jest to jedyna samodzielnie hostowana baza danych, której utrata staje się problemem podatkowym, a nie tylko niedogodnością.
Przed zapoznaniem się z listą funkcji należy przeczytać licencję. Trzy z tych pięciu programów są objęte licencją copyleft, jeden ma licencję permisywną, 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 Laravel, obecnie w linii v5. Samodzielny hosting jest darmowy i w pełni funkcjonalny: obejmuje faktury cykliczne, oferty, projekty, śledzenie czasu pracy, wydatki, portal klienta oraz bramki płatności, w tym Stripe i PayPal. Projekt określa się jako „aplikację typu source-available do obsługi faktur, ofert, projektów i śledzenia czasu pracy, zbudowaną w Laravel”. Jedynym płatnym elementem jest branding. Według słów 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 roku.
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 w wersji 3 (AGPL-3.0). Obejmuje faktury, kosztorysy, cykliczne rozliczenia, wydatki, podatki, obsługę wielu walut, portal klienta oraz obsługę wielu firm. Płatności i usuwanie brandingu (white-labelling) znajdują się w oddzielnych oficjalnych repozytoriach modułów, oba na licencji AGPL-3.0 i oba darmowe. Płatności kartą realizowane 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 głównym katalogu serwera WWW (web root). Brak Docker i brak etapu budowania w Node. Pliki PDF generowane są przez mPDF, więc szablony tworzy się w HTML i CSS. Klienci otrzymują link gościa do przeglądania i opłacania faktur.
Haczyk stanowią płatności. Dokumentacja jasno stwierdza, że InvoicePlane 1.6 obsługuje domyślnie tylko Stripe, a pozostali 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, które pobierasz, ponieważ linia 1.7 jest wciąż w fazie rozwoju.
Wybierz to rozwiązanie, jeśli korzystasz ze współdzielonego hostingu lub VPS z 512 MB pamięci RAM.
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 – dokumentacja potwierdza, że są to jedyne akceptowane formaty – 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 r.), obsługującą profile EN16931, XRechnung, ZUGFeRD, Factur-X oraz Peppol.
Wybierz to rozwiązanie, jeśli faktura jest wynikiem rozliczenia śledzonego czasu pracy.
ERPNext
Oprogramowanie na licencji GPL-3.0, należące do innej kategorii. Faktura sprzedaży jest jednym z typów dokumentów wewnątrz pełnego systemu księgowego z planem kont, wpisami w dzienniku, obsługą magazynu i płac. 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. Wdrożenie tego systemu to osobny projekt, opisany w uruchamianie ERPNext na VPS.
Cykliczne faktury wymagają niewidocznego harmonogramu zadań
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 bezgłośnie. Faktury cykliczne są tworzone przez zadanie harmonogramu, php artisan schedule:run, które musi być wywoływane co minutę przez zewnętrzny proces. Jeśli nikt go nie wywołuje, lista faktur cyklicznych nadal wyświetla datę następnej wysyłki, która po prostu mija. Faktura nie powstaje. Żaden błąd nie jest rejestrowany, ponieważ kod nie został uruchomiony.
Po utworzeniu pierwszej faktury cyklicznej należy ustawić datę następnej wysyłki na kilka minut w przód i poczekać. Jeśli faktura nie dotrze, 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 zamknięta.
docker compose ps
docker compose logs --tail 50Każ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ć.
Wielowalutowość i podatki: co sprawdzić przed wdrożeniem
Listy funkcji często zawierają hasło „wielowalutowość”, 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 zostaną wykryte przez księgowość, a nie przez administratora.
- Czy faktura przechowuje kurs wymiany walut obowiązujący w dniu jej wystawienia? Jest to wymóg konieczny. Jeśli aplikacja przelicza sumy według bieżącego kursu, raporty z poprzedniego kwartału będą zmieniać się przy każdym otwarciu, a księgi przestaną być zgodne z już złożonymi deklaracjami.
- Czy podatek jest naliczany dla każdej pozycji z osobna, dla całej faktury, czy w obu wariantach? Jedna stawka dla całej faktury jest wystarczająca do momentu, w którym jedna z pozycji otrzymuje stawkę 0%.
- Czy istnieje możliwość wprowadzania cen brutto oraz netto? Przeliczanie po fakcie wprowadza różnice zaokrągleń rzędu jednego centa na pozycji, a takie kwoty sumują się w skali roku.
- Co dokument pokazuje w przypadku klienta z innego kraju, który jest zwolniony z VAT? Na fakturze musi znaleźć się adnotacja o zwolnieniu, a nie tylko zero w kolumnie podatku.
Invoice Ninja oraz ERPNext obsługują wszystkie cztery punkty. InvoiceShelf wymienia podatki i wielowalutowość wśród swoich funkcji. InvoicePlane oraz Kimai są prostszymi rozwiązaniami, dlatego należy przetestować je na najbardziej złożonej fakturze, a nie na najprostszym przypadku.
Portal klienta i bramki płatności
Portal klienta to strona, na której klient przegląda faktury, pobiera pliki PDF i dokonuje płatności. Jest to istotniejsze, niż mogłoby się wydawać, ponieważ upominanie się o płatność drogą mailową pochłania więcej czasu niż wystawienie samej faktury.
Invoice Ninja oferuje w tym zakresie najwięcej: posiada pełnoprawny portal, obsługuje wiele bramek płatności, pozwala na zapisywanie metod płatności oraz automatyczne fakturowanie w przypadku faktur cyklicznych. InvoiceShelf udostępnia portal klienta i dodaje obsługę Stripe Checkout poprzez moduł płatności. InvoicePlane generuje dla każdej faktury link gościnny i wspiera Stripe. Kimai nie posiada takiej funkcjonalności, dlatego faktury w formacie PDF są wysyłane jako załączniki.
Jedna kwestia jest często mylnie interpretowana. 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 uzyskuje do nich wglądu. 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 oddzielnej warstwie, takiej jak self-hosted payment orchestration with Hyperswitch.
Jakość PDF i edytowany szablon
Edycja szablonu jest konieczna. Domyślne ustawienia umieszczają adres w miejscu nieodpowiednim dla danego 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. Należy odpowiednio zaplanować zasoby pamięci: przeglądarka bezgłowa jest najbardziej obciążającym procesem w całym stosie, dlatego VPS z 1 GB pamięci RAM może okazać się niewystarczający. InvoicePlane korzysta z mPDF, który jest rozwiązaniem opartym wyłącznie na PHP i lekkim, jednak kosztem obsługi 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 dokumentu przygotowuje się w LibreOffice lub Wordzie, bez konieczności pisania arkuszy stylów.
Jeśli priorytetem jest wygląd faktury, a znajomość CSS nie jest wymagana, podejście Kimai jest korzystniejsze. Jeśli natomiast szablon ma podlegać kontroli wersji i być czytelny w porównaniach (diff), lepszym wyborem jest 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ą dwa zapisy.
Nie wolno udostępniać oprogramowania podmiotom trzecim jako usługi hostowanej lub zarządzanej, w ramach 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 korzystanie z niego na potrzeby własnej działalności jest dozwolone, natomiast uruchamianie instancji dla klientów jako produktu – nie. Drugi zapis wyjaśnia, dlaczego usunięcie brandingu wymaga wykupienia 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. Obowiązek wynika z sekcji 13: jeśli zmodyfikujesz kod i pozwolisz innym osobom korzystać ze zmodyfikowanej wersji przez sieć, musisz udostępnić im źródło 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 hostujących oprogramowanie samodzielnie nigdy nie musi się tym przejmować.
InvoicePlane korzysta z licencji MIT, która nakłada najmniejsze obowiązki 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 tekst stanowi opis treści licencji, a nie poradę prawną.
Czy projekt jest nadal utrzymywany? Sprawdź dziennik commitów
Crater był przez kilka lat 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.
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, nie Crater.
Instalacja poszczególnych usług na VPS
Wszystkie usługi poza InvoicePlane najłatwiej uruchomić za pomocą Docker Compose. Jeśli to rozwiązanie jest nowe, należy zacząć od pierwszego stosu Docker Compose na VPS i wrócić tutaj.
Invoice Ninja udostępnia własne repozytorium compose.
git clone https://github.com/invoiceninja/dockerfiles.git
cd dockerfiles
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --showNależy skopiować ten klucz do pliku env w repozytorium, wraz z właściwym APP_URL. Następnie trzeba ustawić uprawnienia oczekiwane przez obraz i uruchomić usługę.
chmod 755 docker/app/public
sudo chown -R 1500:1500 docker/app
docker compose up -dWłaściciel 1500:1500 musi odpowiadać użytkownikowi wewnątrz obrazu. Pominięcie tego kroku uniemożliwi aplikacji zapisywanie pamięci podręcznej oraz generowanych plików PDF. W kreatorze konfiguracji jako hosta bazy danych należy podać db, 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.ymlPrzed uruchomieniem należy otworzyć ten plik. Każde hasło jest jedynie symbolem zastępczym, o czym informują komentarze wewnątrz pliku. APP_URL, SESSION_DOMAIN oraz SANCTUM_STATEFUL_DOMAINS mają domyślnie ustawione localhost i wszystkie trzy wymagają podania właściwej nazwy hosta przed pierwszym logowaniem. Następnie należy uruchomić usługę.
docker compose up -dUsługa publikuje port 8090 na hoście i obsługuje port 8080 wewnątrz kontenera. Przed skierowaniem jakiegokolwiek ruchu klienckiego należy umieścić przed nią reverse proxy z TLS (transport layer security).
Plik compose dla środowiska produkcyjnego Kimai, na podstawie 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:Należy ustawić APP_SECRET na długi, losowy ciąg znaków, a TRUSTED_HOSTS na domenę, która będzie faktycznie używana. ADMINMAIL oraz ADMINPASS tworzą pierwszego administratora przy pierwszym uruchomieniu, dlatego po zakończeniu instalacji należy zmienić to hasło w interfejsie i usunąć je z pliku.
InvoicePlane nie posiada kontenera. Najpierw należy utworzyć pustą bazę danych.
sudo mysql -e "CREATE DATABASE invoiceplane CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"Należy pobrać archiwum ze strony wydań projektu, rozpakować je w głównym katalogu serwera WWW, skopiować ipconfig.php.example do ipconfig.php i ustawić adres URL zgodnie z komentarzami wewnątrz tego pliku. Następnie należy otworzyć https://your-domain.example/index.php/setup i przejść przez proces instalatora.
Dlaczego faktura trafia do folderu spam
Jest to błąd generujący straty finansowe, a aplikacja błędnie raportuje fakturę jako wysłaną.
Nie wysyłaj 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 hostingowym jako podejrzaną. Wysyłaj pocztę przez przekaźnik SMTP (simple mail transfer protocol) w domenie, którą uwierzytelniłeś. Pełna konfiguracja tego procesu to osobne zagadnienie, a niezawodne wysyłanie poczty z własnej aplikacji opisuje konfigurację przekaźnika, rekordów DNS oraz testowanie.
Adres From to miejsce, w którym najczęściej popełniane są błędy w konfiguracji fakturowania. Musi on należeć do domeny, którą kontrolujesz i którą Twój przekaźnik podpisuje za pomocą DKIM (domainkeys identified mail). Umieszczanie adresu klienta w polu From wydaje się uprzejme, ale 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 niedopasowanie:
550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policyW polu From pozostaw własny adres, a adres klienta umieść w polu Reply-To. Przed wysłaniem jakichkolwiek rzeczywistych dokumentów sprawdź opublikowane rekordy.
dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.comPierwsze polecenie powinno zwrócić rekord SPF (sender policy framework) wskazujący na Twój 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 wyślij rzeczywistą fakturę na konto, które posiadasz u dużego dostawcy, i sprawdź surowe nagłówki wiadomości. Wartości dkim=pass oraz spf=pass w nagłówku Authentication-Results są jedynym wiarygodnym dowodem. Flaga "wysłano" w aplikacji oznacza jedynie, że przekazała ona wiadomość do przekaźnika.
Kopie zapasowe: baza danych, której nie można utracić
Utrata serwera multimediów oznacza konieczność ponownego pobrania plików. Nawet samodzielnie hostowany serwer zdjęć, taki jak PhotoPrism lub Immich, zazwyczaj przechowuje drugą kopię oryginałów, które nadal znajdują się w telefonie, którym zostały wykonane. Utrata bazy danych faktur oznacza brak możliwości wykazania, co zostało zafakturowane, za co otrzymano płatność oraz co nadal pozostaje do zapłaty. Należy traktować to odpowiednio poważnie.
Należy tworzyć kopie zapasowe czterech elementów. Bazy danych. Wolumenu pamięci masowej, który przechowuje logotypy, wygenerowane pliki PDF oraz rachunki za wydatki. 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 ma większe znaczenie, niż się powszechnie uważa. Laravel szyfruje wrażliwe przechowywane wartości, w tym dane uwierzytelniające bramki płatności, używając APP_KEY z tego pliku. Przywrócenie bazy danych obok świeżo wygenerowanego klucza sprawi, że wartości te nie zostaną odszyfrowane. Faktury będą obecne, ale ustawienia bramki staną się nieczytelne.
Zrzut ze stosu InvoiceShelf wygląda następująco. Jego usługa bazy danych uruchamia 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ć żądania podczas trwania zrzutu. -T zapobiega przydzielaniu terminala przez Docker, co w przeciwnym razie uszkodziłoby przekierowane wyjście i doprowadziło do powstania 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 pokryć czas wymagany przez księgowość.
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 można mieć pewności, czy kopia zapasowa działa poprawnie.
O co zapyta księgowy
Nie należy traktować tego poradnika jako porady podatkowej. Poniżej znajduje się lista danych, które może wygenerować oprogramowanie, aby można było ją przekazać 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 konieczności używania klienta bazy danych czy zgłaszania wniosku do wsparcia technicznego. Zrzut SQL jest kopią zapasową, a nie eksportem, ponieważ księgowy nie będzie w stanie go otworzyć.
Niezmienność numeracji. Numery faktur powinny być nadawane sekwencyjnie, bez luk i nigdy nie mogą być użyte ponownie. Usunięcie faktury tworzy lukę, którą trzeba wyjaśnić. Zamiast tego należy stosować anulowanie lub korekty, 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 jest dokumentem, który faktycznie został wysłany, i to on stanowi dowód 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 standard EN16931. Dostarczanie faktur przez sieć Peppol z instancji self-hosted odbywa się za pośrednictwem punktu dostępowego Invoice Ninja: należy zarejestrować podmiot i zakupić kredyty na każdą wysyłkę, co czyni tę usługę płatną od sierpnia 2026 roku. Kimai osiąga te same formaty za pomocą płatnej wtyczki. Pozostałe trzy aplikacje obecnie nie generują ustrukturyzowanych e-faktur, co stanowi najsilniejszy argument za wyborem Invoice Ninja w przypadku fakturowania na terenie UE.
FAQ
Czy powinienem zainstalować Crater czy InvoiceShelf?
InvoiceShelf. Domyślna gałąź projektu Crater nie otrzymała żadnego commita od 741 dni, licząc na dzień 21 sierpnia 2026, a jego własny system śledzenia zgłoszeń 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 to migracja bazy danych, a nie przepisywanie systemu. Każdy poradnik zalecający Crater powstał przed wyciszeniem projektu.
Czy mogę używać Invoice Ninja do własnej działalności bez opłat?
Tak. Samodzielnie hostowana wersja Invoice Ninja jest w pełni funkcjonalna bez opłat na licencji Elastic License 2.0, wliczając w to faktury cykliczne, portal klienta oraz bramki płatności. Dwie rzeczy wymagają opłat. Usunięcie brandingu Invoice Ninja ze stron widocznych dla klienta wymaga licencji white-label, kosztującej według projektu na sierpień 2026 roku "$40 per year". Wysyłanie e-faktur przez sieć Peppol jest rozliczane oddzielnie. Licencja zabrania jedynie uruchamiania oprogramowania jako usługi hostowanej dla innych osób.
Dlaczego moje e-maile z fakturami trafiają do spamu?
Prawie zawsze dlatego, że wiadomość nie jest uwierzytelniona dla domeny 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 domeny oraz dodać rekord DKIM zgodnie z selektorem dostarczonym przez przekaźnik. W polu From należy zachować własny adres, a adres klienta umieścić w Reply-To. Ustawienie adresu klienta jako nadawcy powoduje 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ć, znajdują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 to zarejestrowane czynności. Szablony to pliki DOCX, ODS lub XLSX projektowane w edytorze tekstu, co jest łatwiejsze niż edycja CSS. Ceną za to jest brak portalu klienta oraz 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 należy wybrać to rozwiązanie, jeśli płatności kartą online są ważniejsze niż szczegółowość karty czasu pracy.
Co dokładnie muszę archiwizować?
Bazę danych, wolumen pamięci masowej przechowujący logotypy i wygenerowane pliki PDF, plik środowiskowy oraz wyrenderowane pliki PDF przechowywane jako zwykłe pliki. Plik środowiskowy jest tym, o czym użytkownicy najczęściej 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 będą nieczytelne. Należy 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.