GuiderFöretag och övervakningErsätt FreshBooks/QB

Alternativ till FreshBooks, QuickBooks och Zoho Invoice på egen server: Invoice Ninja och InvoiceShelf jämförda

Invoice Ninja och InvoiceShelf på samma server med Debian 13, med samma svenska företag, tre kunder i Sverige, Tyskland och USA och priser med 25, 12 och 6 % moms, jämförda på offerter, kreditfakturor, påminnelser, omvänd betalningsskyldighet, den svenska PDF:en, momsrapporter, Peppol, minne och kostnad, och varför vi valde bort Akaunting.

Testad på Invoice Ninja 5.13.47 och InvoiceShelf 2.4.6 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 14 oktober 2026

Rekommenderad server för guiden

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy · 2 vCPU · 8 GB Minne · 60 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

100 kr/mån

Beställ nu
På den här sidan

Det korta svaret

Välj Invoice Ninja om fakturering är en del av vardagen i ditt företag: den klarade allt vi bad om, offert till faktura, kreditfakturor, delbetalningar, automatiska påminnelser, återkommande fakturor, en kundportal och en momsrapport per momssats, allt på svenska, och den kan göra e-fakturor för Peppol. Den behöver omkring 380 MB minne, 3,2 GB avbilder och har en licens där koden är tillgänglig men som inte är öppen källkod. Välj InvoiceShelf om du skickar en handfull fakturor i månaden och vill ha något litet med AGPL-licens: den gick på omkring 45 MB, men den saknar kreditfakturor och påminnelser, momsrapporten räknar bara helt betalda fakturor, och den lät oss radera en skickad faktura och använda numret igen.

Ingen av dem är bokföring. Båda gör fakturor som du eller din redovisningskonsult sedan bokför i ett svenskt bokföringsprogram, för hand: ingen av dem exporterar SIE.

Det här testade vi

Vi installerade båda på samma nya Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13, under var sin användare, bakom samma Caddy. Vi har ingen guide för någon av dem, så vi körde appens officiella avbild enligt samma mönster som våra guider: rootless Podman, Quadlet-enheter, lösenord och nycklar som Podman-hemligheter, MariaDB eller PostgreSQL i samma pod och vår Caddy framför. Så körde vi Invoice Ninja och Så körde vi InvoiceShelf visar filerna.

Sedan gav vi båda samma data, mest via deras API:er:

  • vårt eget företag, Exempel AB i Stockholm, med organisationsnummer, momsregistreringsnummer, bankgironummer och svenska kronor;
  • tre kunder: Nordljus AB i Göteborg, Bauer Maschinenbau GmbH i München, ett företag i EU med tyskt momsnummer som faktureras i euro med omvänd betalningsskyldighet, och Northwind Trading Inc. i Seattle, utanför EU;
  • tre artiklar: en konsulttimme för 1 000 kr med 25 % moms, en workshoplunch för 150 kr med 12 % och en tryckt handbok för 450 kr med 6 %;
  • en offert till Nordljus med alla tre, som vi gjorde om till en faktura på 17 660 kr; en faktura till Bauer på 1 080 euro, en till Northwind på 5 000 kr och en förfallen till Nordljus från september;
  • en delbetalning på 10 000 kr, en kreditfaktura för en returnerad handbok, en återkommande faktura varje månad för ett supportavtal och en utgift för kontorsmaterial på 1 250 kr.

Vi skickade alla fakturor och påminnelser till en lokal testserver för e-post, öppnade kundportalen som Nordljus, kontrollerade varje PDF mot det Skatteverket säger att en svensk faktura ska innehålla, körde båda apparnas moms- och resultatrapporter, startade om servern, mätte minnet i vila och under användning, och gjorde en säkerhetskopia av båda som vi sedan återställde.

FreshBooks, QuickBooks Online och Zoho Invoice testade vi inte. Vi skapade inget konto hos någon av dem. Det sidan säger om dem kommer från deras egna pris- och hjälpsidor, som vi länkar till där vi använder dem och läste den 14 oktober 2026.

Varför inte Akaunting

Vi tänkte jämföra Invoice Ninja med Akaunting och installerade den först. Den underhålls, med version 3.2.4 den 17 september 2026 på GitHub, men den 14 oktober 2026 tyckte vi inte att den gick att köra på egen server på ett rimligt sätt:

  • Den kunde inte göra en faktura utan Akauntings servrar. Innan Akaunting sparar en faktura frågar den api.akaunting.com om gränserna för ditt paket. Utan en nyckel från ett konto hos Akaunting svarade den servern "Forbidden", och Akaunting vägrade spara fakturan med "Not able to create a new user." Kontrollen finns i Akauntings egen kod, likadan i 3.1.21, som vi körde, och i 3.2.4. Du behöver alltså ett konto på akaunting.com för att fakturera alls, och appen slutar fakturera om den servern är nere eller säger nej. Vi skapade inget konto.
  • Den officiella avbilden ligger efter. Den nyaste avbilden på Docker Hub, byggd den 19 mars 2026, innehåller 3.1.21 från december 2025, fem versioner efter koden.
  • Gratispaketet är litet. Akauntings licens är Business Source License 1.1, som tillåter gratis användning med högst "two users or one company or one thousand invoices"; dess paket för egen server anger gratispaketet Standard som 1 företag, 1 användare plus 1 redovisningskonsult och 1 000 fakturor, och Premium för 72 amerikanska dollar om året.
  • Offerter och kreditfakturor är betalda appar. Estimates och Credit-Debit Notes kostar 60 dollar om året vardera för en egen server.

Så vi testade InvoiceShelf i stället, den app som underhålls i samma nisch: en Laravel-app med AGPL-licens och version 2.4.6 den 25 september 2026. Crater, det andra namnet folk föreslår, kom med sin senaste version, 6.0.6, i mars 2022, och dess kodförråd har inte ändrats sedan februari 2023.

Siffrorna

Invoice Ninja 5.13.47InvoiceShelf 2.4.6
Containrar3: Invoice Ninja med PHP-FPM, nginx, MariaDB 11.82: InvoiceShelf med nginx och PHP-FPM, PostgreSQL 18
Minne i vila efter omstartomkring 380 MB (appen 242, MariaDB 137, nginx 3)omkring 43 MB (appen 35, PostgreSQL 8)
Minne, som mest under användningomkring 610 MBomkring 75 MB
Avbilder på disken3,25 GB, mest en Chrome för PDF:er0,81 GB
Data efter testet435 MB, varav 249 MB en kopia av webbfilerna67 MB
Från useradd tills appen svarade2 minuter och 40 sekunder1 minut och 11 sekunder, sedan en guide i 9 steg i webbläsaren
Offert till fakturajaja
Kreditfakturorjanej
Automatiska betalningspåminnelserjanej
Återkommande fakturorjaja
Momsrapport per momssatsja, efter fakturadatum och efter betalningbara helt betalda fakturor
Kundportalja, på svenskaja, på engelska
E-faktura via Peppolgör XML-filen; att skicka kräver betald licens och krediternej
SIE-exportnejnej
Svenskt gränssnittjaja
LicensElastic License 2.0, källkoden tillgängligAGPL 3.0

Minnet är summan av appens containrar, utan vår testserver för e-post, mätt med podman stats fem och sju minuter efter en omstart; de två mätningarna var lika. Toppen är det högsta värdet medan ett skript använde appens API i tre minuter, omkring ett anrop i sekunden, vart femte en PDF. Tiderna är hur lång tid det tog att ladda ner avbilderna och starta, inte tiden det tar för dig att läsa och skriva kommandona. Båda apparna svarade när vi kontrollerade första gången, 104 sekunder efter kommandot att starta om.

Installation

Invoice Ninjas officiella avbild, invoiceninja/invoiceninja-debian, kör PHP-FPM med en köhanterare och schemaläggaren under supervisord; den behöver en webbserver framför, så nginx körs bredvid i podden och visar webbfilerna från en delad volym. Första gången den startar skapar avbilden databasens tabeller och det första kontot från två inställningar, en e-postadress och ett lösenord, som vi gav den som en Podman-hemlighet. Sedan loggar du in på din adress, och ett kort formulär frågar efter företagets namn. Vi tog bort Redis: med cachen på disken och kön i databasen gick alla mejl och schemalagda jobb som de skulle.

InvoiceShelfs avbild, invoiceshelf/invoiceshelf, har nginx och PHP-FPM i samma container och kör schemaläggaren själv. Den svarade efter 71 sekunder, och resten sker i webbläsaren: en guide i 9 steg, från språket (Svenska finns i listan) genom kontroller, databasen, domänen, e-post, administratörskontot och företaget till valuta och tidszon. Den frågar efter databasens lösenord igen, fast containern redan har det. Den varnar för att företagets valuta inte går att ändra senare.

Offerter, fakturor och kreditfakturor

Båda gjorde om vår offert till en faktura med en åtgärd, och båda räknade fram samma 17 660 kr: 14 800 kr före moms, och 2 500, 144 och 216 kr i moms med 25, 12 och 6 %. Båda låter dig välja momssats per rad, vilket en svensk faktura med flera momssatser behöver. I Invoice Ninja är det Item tax rates under Tax Settings ("Momsinställningar" på svenska); i InvoiceShelf Moms per artikel under Momssatser.

  • Invoice Ninja numrerar fakturor 0001, 0002 och så vidare, med egna serier för offerter, kreditfakturor och betalningar, vilket Skatteverket tillåter ("baserat på en eller flera serier"). Vår kreditfaktura för den returnerade handboken, 477 kr med 6 % moms, blev kreditfaktura 0001 med en egen PDF på svenska, "Kredit". Den hänvisar till faktura 0001 bara för att vi skrev det i anteckningen; åtgärden Credit Note på en faktura, som Invoice Ninjas guide beskriver, fyller i hänvisningen åt dig.
  • InvoiceShelf numrerar fakturor från INV-000001, vilket du kan ändra. Den har inga kreditfakturor. För att backa en del av en faktura får du göra ett nytt dokument för hand.

När man raderar skiljer de sig mest. När vi raderade tre testfakturor i Invoice Ninja behöll den dem med sina nummer, döpta om till "0005_Ta bort" och så vidare, och nästa faktura blev 0008: en lucka, men en som går att förklara. InvoiceShelf lät oss skicka faktura INV-000006, radera den och sedan föreslå INV-000006 igen till nästa. Skatteverket kräver "ett unikt löpnummer för varje faktura", så i båda apparna ska du makulera eller kreditera en skickad faktura i stället för att radera den.

Moms, omvänd betalningsskyldighet och export

Ingen av apparna kan de svenska momsreglerna; du skapar momssatserna och väljer dem per rad. Vi gjorde fem: 25 %, 12 %, 6 %, "Omvänd skattskyldighet" med 0 % och "Export" med 0 %.

  • Omvänd betalningsskyldighet. För Bauer, ett företag i EU, använde vi 0 % och skrev "Reverse charge" och "Omvänd betalningsskyldighet" i fakturans anteckning, vilket Skatteverket säger att fakturan ska ange. Ingen av apparna lägger till den texten själv eller kontrollerar att kunden har ett momsnummer.
  • Invoice Ninjas automatiska moms. Invoice Ninja har en momsmotor för EU, USA och några andra regioner som ska välja momssats efter var kunden finns. Vi slog på den med Sverige som säljare, och den satte ingen moms alls på fakturor till våra tre kunder, så vi gick tillbaka till momssats per rad.
  • Export. För Northwind, utanför EU, använde vi exportsatsen och en anteckning. Invoice Ninja har också en ruta för momsfri kund, Tax exempt.

Den svenska PDF:en

Båda gjorde en PDF på svenska, "Faktura" med "Fakturadatum", "Förfallodatum" och momsen per momssats. Vi kontrollerade båda mot listan på Skatteverkets sida om fakturering, läst den 14 oktober 2026:

Krav på en fullständig fakturaInvoice NinjaInvoiceShelf
Datum för utfärdandetjaja
Unikt löpnummer i en eller flera serierja; raderade fakturor behåller sitt nummerja, men ett raderat nummer används igen
Säljarens momsregistreringsnummerja, utan rubrik; vi lade till en rad med rubrik i sidfoteninte från början; tillagt med en platshållare i adressformatet
Köparens momsregistreringsnummer, vid omvänd betalningsskyldighetja, utan rubrikinte från början; med platshållaren får det rubriken "Org.Nr:"
Säljarens och köparens namn och adressja, med "Sverige" och "Tyskland"ja, med ländernas namn på engelska
Mängd och art av varor eller tjänsterjaja
Datum för leveransen, om det inte är fakturadatuminget fält; vi skrev det i beskrivningeninget fält; samma
Beskattningsunderlag per momssats, enhetspris utan momsenhetspris och belopp per rad; underlaget per momssats summeras intesamma
Momssats och momsbeloppja, per momssatsja, per momssats
"Omvänd betalningsskyldighet" när köparen betalar momsenbara från vår anteckningbara från vår anteckning

Det här lade vi till själva, i Invoice Ninjas sidfot och i InvoiceShelfs anteckningar: organisationsnumret, "Godkänd för F-skatt", bankgironumret och betalningsvillkoren. Invoice Ninja skriver belopp som "17.660,00 kr", med punkt mellan tusental där vi skriver mellanslag; InvoiceShelf som "17.660,00kr". InvoiceShelf lämnade "Amount Paid" på engelska på en delbetald faktura. Invoice Ninjas kreditfaktura saknade sidfot tills vi fyllde i den separata sidfoten för kreditfakturor. När du fakturerar moms i en annan valuta vill Skatteverket också se momsen i kronor; vår faktura i euro hade omvänd betalningsskyldighet, så det fanns ingen moms att visa.

Betalningar, påminnelser och återkommande fakturor

Båda tog emot vår delbetalning på 10 000 kr och visade 7 660 kr kvar, på skärmen och på PDF:en.

  • Invoice Ninja skickar påminnelser själv: vi satte den första en dag efter förfallodatum och den andra efter 14 dagar. I stället för att vänta en dag körde vi jobbet för påminnelser för hand, och den förfallna fakturan fick "Påminnelse: Faktura 0004 från Exempel AB" med en länk till fakturan; Anna fick ett mejl om att den var skickad. Förseningsavgift per påminnelse går att lägga till. Den månatliga fakturan för supportavtalet skapades som faktura 0008 och mejlades när vi flyttade dess datum till i dag och körde jobbet för återkommande fakturor.
  • InvoiceShelf har inga betalningspåminnelser. Den markerar fakturor som förfallna en gång om dagen, och påminnelsen skickar du själv. Dess återkommande faktura skapades och mejlades inom en minut från sitt schema, av schemaläggaren i containern.

Flera valutor

Båda fakturerade Bauer i euro, 1 080 € med "€" på PDF:en, och båda behöver att du anger växelkursen. Invoice Ninja hämtar kurser bara med en nyckel från Open Exchange Rates; utan en var kursen 1, och rapporterna räknade 1 080 euro som 1 080 kronor, tills vi satte kursen på fakturan för hand. InvoiceShelf frågar efter kursen när kundens valuta skiljer sig och kan hämta den från en av fyra kurstjänster med en egen nyckel. Med 10,9 kr per euro räknade den fakturan som 11 772 kr.

Utgifter och rapporter

  • Invoice Ninja har utgifter med leverantörer, kategorier och moms: våra 1 250 kr innehöll 250 kr moms. Rapporten Tax summary visar momsen per momssats både efter fakturadatum och efter betalning, och faktura för faktura; vår visade 3 500 kr med 25 %, 144 kr med 12 % och 216 kr med 6 %. Den drog inte av kreditfakturans 27 kr, och den visade inte momsen på utgifterna, som bara syns i resultatrapporten. Rapporterna kommer som CSV.
  • InvoiceShelf har utgifter med kategorier men inget fält för moms, så de 250 kr i ingående moms du kan dra av blir bara text i anteckningen. Rapporten Tax summary räknar bara fakturor som är helt betalda: med fakturan på 17 660 kr delbetald visade den 0 kr, och när vi hade betalat septemberfakturan helt, 1 000 kr med 25 %. Det stämmer varken med faktureringsmetoden eller bokslutsmetoden som svenska företag redovisar moms efter. Rapporterna kommer som PDF: försäljning per kund eller artikel, utgifter, resultat och moms.

Kundportalen

Invoice Ninjas mejl har en personlig länk: Lena på Nordljus öppnade den och såg sina fakturor, offerter, betalningar och kreditfakturor på svenska, med Visa PDF. Det går att kräva ett lösenord. Både mejlen och portalen säger "Skapad av Invoice Ninja" tills du köper licensen för egen profil. InvoiceShelfs mejl länkar till fakturan, och med ett lösenord för kunden loggade Lena in på /exempel-ab/customer/login och såg vad hon var skyldig, på engelska.

Betaltjänster

Ingen av dem kopplades till ett riktigt konto i vårt test. Invoice Ninja har Stripe, PayPal, Mollie, GoCardless och många andra inbyggda under Settings > Online payments: med Stripe kopplat visar kundportalen en knapp för att betala med kort och andra sätt Stripe erbjuder, och fakturor kan dras automatiskt. InvoiceShelf behöver sin gratis Payments-modul för Stripe, PayPal eller Razorpay, som du laddar ner från GitHub och installerar med ett kommando; den fungerar bara med InvoiceShelf 2. I Sverige betalar många kunder helt enkelt till bankgiro, så numret på fakturan väger tyngre.

E-faktura och Peppol

Enligt lagen om elektroniska fakturor (2018:1277) ska svenska offentliga köpare ta emot e-fakturor i Peppol BIS Billing 3, och EU-kommissionens sida om Sverige säger "There is no business-to-business (B2B) eInvoicing mandate." EU:s paket om moms i den digitala tidsåldern, antaget den 11 mars 2025, inför digital rapportering byggd på e-fakturor för gränsöverskridande försäljning mellan företag från den 1 juli 2030.

  • Invoice Ninja gjorde e-fakturor av vår faktura, inställt under Settings > E-Invoice: en Peppol-fil i UBL, och i de andra formaten CII-filer för EN 16931 och XInvoice. Att skicka över Peppol-nätverket går via Invoice Ninjas egen accesspunkt, med Sverige bland länderna som stöds. En egen server behöver licensen för egen profil för det, och förbetalda krediter, som Invoice Ninjas meddelande satte till 50 dollar för 500 dokument i december 2024. Vi skickade inga.
  • InvoiceShelf har ingen e-faktura. För att fakturera en kommun eller myndighet behöver du något annat sätt.

Fakturering är inte bokföring

Ett svenskt företag ska bokföra enligt bokföringslagen (1999:1078): varje affärshändelse ska ha en verifikation, händelserna bokförs i registreringsordning och i systematisk ordning, systemet ska vara dokumenterat, och räkenskapsinformationen ska sparas "fram till och med det sjunde året" efter räkenskapsårets slut. Bokföringsnämndens vägledning till BFNAR 2013:2 går igenom detaljerna. Det här är inte juridisk rådgivning; fråga din redovisningskonsult.

Ingen av apparna är ett bokföringssystem i den meningen. De har inga konton, ingen grundbok eller huvudbok, ingen momsdeklaration och inget bokslut. Ingen av dem exporterar SIE, filformatet som svenska bokföringsprogram utbyter; vi sökte i båda apparnas kod och hittade inget. Det du får är fakturor, betalningar och utgifter som du bokför någon annanstans: Invoice Ninja exporterar dem som CSV och rapporter, InvoiceShelf som PDF-rapporter. Båda fungerar som platsen där du gör och skickar fakturor, inte som din bokföring, och de sju åren gäller också fakturorna du skickar, så spara PDF:erna eller dina säkerhetskopior.

API

Båda har ett REST-API, och vi skapade all vår data genom det. Invoice Ninjas API på /api/v1 täcker allt appen gör, med en token per användare och dokumentation. InvoiceShelfs API på /api/v1 är det som dess webbsidor använder, med token från ett inloggningsanrop; det finns API-dokumentation på GitHub.

Svenska

Båda finns på svenska. Invoice Ninja tog företagets språk, svenska, för administrationen, PDF:erna, mejlen och kundportalen; varje kund kan ha ett eget språk. Några ord är udda, "Försäljare" för leverantörer och "Beställning" för inköpsorder. InvoiceShelf är på svenska när du väljer Svenska i guiden, och det är PDF:en också, men kundportalen var kvar på engelska i vårt test, PDF:en skrev "Sweden" och "Germany", och rubrikerna för momsnummer är förväxlade: företagsformuläret frågar efter "Momsnummer" i fältet som PDF:en kallar skatte-ID och efter "Organisationsnummer" i det den kallar moms-ID.

Resurser

Invoice Ninja har PHP-FPM, två köhanterare och schemaläggaren igång hela tiden, omkring 240 MB, plus MariaDB. Avbilden är 2,8 GB eftersom den har med sig en Chrome för att göra PDF:er, och när den gjorde dem gick den upp till omkring 610 MB. InvoiceShelf använde omkring 43 MB i vila och 75 MB som mest, den minsta app vi har testat. Tillsammans använde de omkring 425 MB i vila, så vilken som helst passar en liten server.

Uppdateringar och säkerhetskopior

Invoice Ninja släpper ofta, fyra gånger veckan före vårt test. Våra filer låser versionen, 5.13.47; du uppdaterar genom att byta taggen, och avbilden uppdaterar databasen och kopierar de nya webbfilerna till sin volym när den startar. InvoiceShelf låser 2.4.6, och dess Docker-guide säger att du uppdaterar via avbildens tagg; uppdateringen inne i appen är avstängd i Docker. Den stabila version 2 får säkerhetsrättningar bara till den 1 september 2027, enligt dess README, och version 3 var en alfaversion på vår testdag. Vi testade ingen uppdatering av någon av dem.

Varje säkerhetskopia är en dump av databasen och en export av en volym: 0,55 MB och 4,2 MB för Invoice Ninja, 0,15 MB och 0,9 MB för InvoiceShelf. Vi återställde båda till tomma volymer, på omkring 40 sekunder vardera, och alla fakturor, betalningar och inställningar kom tillbaka.

Så körde vi Invoice Ninja

Invoice Ninjas Docker-filer använder Docker Compose med appen, nginx, MySQL och Redis. Vi gjorde om det till en pod med MariaDB 11.8 och utan Redis. Det här lärde vi oss:

  • Avbilden kör PHP-FPM på port 9000 och visar inga webbsidor själv; det gör nginx i podden, från volymen invoiceninja-public som appen fyller varje gång den startar.
  • Första gången den startar skapar avbilden det första kontot från IN_USER_EMAIL och IN_PASSWORD, och stannar om de saknas.
  • TRUSTED_PROXIES är serverns egen IPv4-adress, som i Podman-guiden. Med den visade aktivitetsloggen varje besökares riktiga adress.
  • APP_KEY krypterar data i databasen. Spara den: utan den går en återställning inte att läsa.

Som användaren invoiceninja, skapad som kimai i steg 1 i Kimai-guiden, skapar du hemligheterna:

printf %s "base64:$(openssl rand -base64 32)" | podman secret create invoiceninja-app-key -
openssl rand -hex 24 | tr -d '\n' | podman secret create invoiceninja-db-password -
printf %s 'your-admin-password' | podman secret create invoiceninja-admin-password -
printf %s 'your-smtp-password' | podman secret create invoiceninja-smtp-password -

I ~/.config/containers/systemd, invoiceninja.pod:

[Pod]
PodName=invoiceninja
PublishPort=127.0.0.1:8148:8080

[Install]
WantedBy=default.target

invoiceninja-db.container:

[Container]
ContainerName=invoiceninja-db
Image=docker.io/library/mariadb:11.8
Pod=invoiceninja.pod
Volume=invoiceninja-db:/var/lib/mysql
Environment=MARIADB_DATABASE=ninja MARIADB_USER=ninja MARIADB_RANDOM_ROOT_PASSWORD=1 MARIADB_AUTO_UPGRADE=1
Secret=invoiceninja-db-password,type=env,target=MARIADB_PASSWORD
HealthCmd=healthcheck.sh --connect --innodb_initialized
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

invoiceninja.env, utan hemligheter:

APP_URL=https://invoice.example.com
APP_ENV=production
APP_DEBUG=false
REQUIRE_HTTPS=true
TRUSTED_PROXIES=203.0.113.10
PDF_GENERATOR=snappdf
FILESYSTEM_DISK=debian_docker
IS_DOCKER=true
SCOUT_DRIVER=null
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_CONNECTION=database
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ninja
DB_USERNAME=ninja
IN_USER_EMAIL=anna@example.com
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=invoices@example.com
MAIL_FROM_ADDRESS=invoices@example.com
MAIL_FROM_NAME="Exempel AB"

invoiceninja-app.container:

[Unit]
Requires=invoiceninja-db.service
After=invoiceninja-db.service

[Container]
ContainerName=invoiceninja-app
Image=docker.io/invoiceninja/invoiceninja-debian:5.13.47
Pod=invoiceninja.pod
Volume=invoiceninja-public:/var/www/html/public
Volume=invoiceninja-storage:/var/www/html/storage
EnvironmentFile=%h/.config/containers/systemd/invoiceninja.env
Secret=invoiceninja-app-key,type=env,target=APP_KEY
Secret=invoiceninja-db-password,type=env,target=DB_PASSWORD
Secret=invoiceninja-admin-password,type=env,target=IN_PASSWORD
Secret=invoiceninja-smtp-password,type=env,target=MAIL_PASSWORD

[Service]
Restart=always
TimeoutStartSec=900

invoiceninja-web.container:

[Unit]
Requires=invoiceninja-app.service
After=invoiceninja-app.service

[Container]
ContainerName=invoiceninja-web
Image=docker.io/library/nginx:alpine
Pod=invoiceninja.pod
Volume=%h/.config/containers/systemd/invoiceninja-nginx.conf:/etc/nginx/conf.d/default.conf:ro
Volume=invoiceninja-public:/var/www/html/public:ro
Volume=invoiceninja-storage:/var/www/html/storage:ro
AutoUpdate=registry

[Service]
Restart=always

Och invoiceninja-nginx.conf:

server {
    listen 8080;
    root /var/www/html/public;
    index index.php;
    charset utf-8;
    client_max_body_size 10M;
    server_tokens off;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known) {
        deny all;
    }
}

Kör systemctl --user daemon-reload och systemctl --user start invoiceninja-pod. Första starten laddar ner 3,2 GB och tar några minuter; den är klar när curl -s http://127.0.0.1:8148/health skriver ut {"status":"ok","message":"API is healthy"}. Blocket i Caddys ~/Caddyfile:

invoice.example.com {
    reverse_proxy 127.0.0.1:8148
}

Logga in med anna@example.com och administratörslösenordet. Under Settings fyller du sedan i namn, adress, momsnummer och organisationsnummer (ID Number) under Company Details, väljer Swedish, Swedish Krona, Europe/Stockholm och datumformatet yyyy-MM-dd under Localization, skapar momssatserna och slår på Item tax rates under Tax Settings, och ställer in påminnelser under Templates & Reminders. När språket är svenska heter menyerna "Inställningar", "Företagsinformation", "Språkanpassning", "Momsinställningar" och "Mallar och påminnelser".

För en säkerhetskopia kör du podman exec invoiceninja-db sh -c 'mariadb-dump -u ninja -p"$MARIADB_PASSWORD" --single-transaction ninja' > ninja-db.sql och podman volume export invoiceninja-storage > ninja-storage.tar, och sparar hemligheten med appens nyckel. För att återställa stoppar du podden, tar bort de tre volymerna, skapar och importerar invoiceninja-storage, startar invoiceninja-db, läser in dumpen med podman exec -i invoiceninja-db sh -c 'mariadb -u ninja -p"$MARIADB_PASSWORD" ninja' < ninja-db.sql och startar podden; appen fyller på webbfilernas volym själv.

Att skicka via en riktig e-postleverantör testade vi inte; vårt test skickade till en lokal testserver i stället.

Så körde vi InvoiceShelf

InvoiceShelfs Docker-guide har Compose-filer för SQLite, MySQL och PostgreSQL. Vi körde den för PostgreSQL som en pod med PostgreSQL 18. Det här lärde vi oss:

  • Guiden i webbläsaren frågar efter databasens lösenord, fast containern har det. Läs det med podman secret inspect --showsecret --format '{{.SecretData}}' invoiceshelf-db-password.
  • InvoiceShelf sparar sina inställningar för e-post, lösenordet också, i databasen: du fyller i dem i guiden eller under Inställningar > Epostinställningar, inte som en hemlighet.
  • Containern skriver sin .env-fil från miljön varje gång den startar. Vi startade om servern och återställde, och inställningar, användare och inloggningar kom tillbaka varje gång.
  • För att momsnumren ska synas på PDF:en lägger du till {COMPANY_TAX} och {CONTACT_TAX_ID} i adressformaten under Inställningar > Anpassning > Fakturor.

Som användaren invoiceshelf skapar du hemligheterna:

openssl rand -hex 24 | tr -d '\n' | podman secret create invoiceshelf-db-password -
printf %s "base64:$(openssl rand -base64 32)" | podman secret create invoiceshelf-app-key -

I ~/.config/containers/systemd, invoiceshelf.pod:

[Pod]
PodName=invoiceshelf
PublishPort=127.0.0.1:8149:8080

[Install]
WantedBy=default.target

invoiceshelf-db.container:

[Container]
ContainerName=invoiceshelf-db
Image=docker.io/library/postgres:18-alpine
Pod=invoiceshelf.pod
Volume=invoiceshelf-db:/var/lib/postgresql
Environment=POSTGRES_USER=invoiceshelf POSTGRES_DB=invoiceshelf
Secret=invoiceshelf-db-password,type=env,target=POSTGRES_PASSWORD
HealthCmd=pg_isready -U invoiceshelf
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

invoiceshelf.env:

APP_NAME=InvoiceShelf
APP_ENV=production
APP_DEBUG=false
APP_URL=https://books.example.com
SESSION_DOMAIN=books.example.com
SANCTUM_STATEFUL_DOMAINS=books.example.com
TRUSTED_PROXIES=203.0.113.10
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=invoiceshelf
DB_USERNAME=invoiceshelf
CACHE_STORE=file
SESSION_DRIVER=file
SESSION_LIFETIME=240
AUTORUN_ENABLED=true
AUTORUN_LARAVEL_MIGRATION=false
AUTORUN_LARAVEL_OPTIMIZE=false
PHP_OPCACHE_ENABLE=1

invoiceshelf-app.container:

[Unit]
Requires=invoiceshelf-db.service
After=invoiceshelf-db.service

[Container]
ContainerName=invoiceshelf-app
Image=docker.io/invoiceshelf/invoiceshelf:2.4.6
Pod=invoiceshelf.pod
Volume=invoiceshelf-storage:/var/www/html/storage
Volume=invoiceshelf-modules:/var/www/html/Modules
EnvironmentFile=%h/.config/containers/systemd/invoiceshelf.env
Secret=invoiceshelf-app-key,type=env,target=APP_KEY
Secret=invoiceshelf-db-password,type=env,target=DB_PASSWORD

[Service]
Restart=always
TimeoutStartSec=600

Kör systemctl --user daemon-reload och systemctl --user start invoiceshelf-pod, lägg till det här blocket i Caddys ~/Caddyfile och öppna https://books.example.com för guiden. Välj smtp för e-post, med din leverantörs värdadress, port 587 och tls.

books.example.com {
    reverse_proxy 127.0.0.1:8149
}

För en säkerhetskopia kör du podman exec invoiceshelf-db pg_dump -U invoiceshelf invoiceshelf > invoiceshelf-db.sql och podman volume export för invoiceshelf-storage och invoiceshelf-modules. För att återställa stoppar du podden, tar bort de tre volymerna, skapar och importerar de två, startar invoiceshelf-db, läser in dumpen med podman exec -i invoiceshelf-db psql -U invoiceshelf invoiceshelf < invoiceshelf-db.sql och startar podden.

Licens och kostnad

Vi läste licenstexterna och prissidorna den 14 oktober 2026.

  • Invoice Ninja görs av Invoice Ninja LLC. Version 5 har Elastic License 2.0, som låter dig använda, ändra och köra den, men inte "provide the software to third parties as a hosted or managed service", inte kringgå licensnyckeln och inte ta bort dess upphovsmärkningar. Dess README kallar koden "source-available": det är inte en licens för öppen källkod. Invoice Ninjas egen tolkning är att det är gratis att fakturera dina egna kunder med den, och att ett webbhotell får installera den åt kunder, men att sälja den vidare som din egen faktureringstjänst kräver en kommersiell licens. Allt på den här sidan finns i den kostnadsfria versionen för egen server; README erbjuder en licens för egen profil, white label, för 40 amerikanska dollar om året, som tar bort Invoice Ninjas namn från kundportalen, mejlen och PDF:erna och krävs för Peppol. Den molnbaserade tjänsten är enligt prissidan gratis för upp till 5 kunder, Pro kostar 14 dollar i månaden (140 om året), och Enterprise, med Peppol och 250 Peppol-krediter, från 18 dollar i månaden.
  • InvoiceShelf är öppen källkod under AGPL 3.0, och webbplatsen, som drivs av Ideologix Media DOOEL, visar inget betalt paket. Modulerna, som Payments och White Label, är gratis på GitHub under AGPL.

För ett företag som fakturerar sina egna kunder kostar båda ingenting utöver servern.

FreshBooks, QuickBooks Online och Zoho Invoice i dag

Det som följer kommer från tjänsternas egna sidor, lästa den 14 oktober 2026, inte från våra tester. Priserna är i amerikanska dollar per månad, så som sidorna visade dem för oss.

FreshBooks kostar 23 dollar för Lite med 5 kunder att fakturera, 43 för Plus med 50 och 70 för Premium utan gräns, med rabatter i början, och 11 dollar i månaden för varje extra teammedlem; Select har inget publicerat pris. Alla paket har återkommande fakturor, automatiska betalningspåminnelser, offerter och bankkopplingar. Åtkomst för redovisningskonsult och rapporter med dubbel bokföring börjar vid Plus. Sidan säger inte var data lagras.

QuickBooks Online visade oss ett gratispaket med 2 fakturor i månaden och en bankkoppling, Simple Start för 38 dollar för en användare, Essentials för 85 för tre, Plus för 140 för fem och Advanced för 340 för 25, med 50 % rabatt i tre månader. De betalda paketen har plats för 2 redovisningskonsulter, Advanced 3. Det är Intuits amerikanska paket; vi hittade ingen svensk utgåva på deras webbplats.

Zoho Invoice är gratis: upp till två användare, 500 fakturor om året, återkommande fakturor, automatiska betalningspåminnelser, en kundportal och betalning online. Sidan säger inte var data lagras.

Ingen av de tre sidorna nämner svensk bokföring eller SIE.

Det här ger du upp jämfört med FreshBooks och QuickBooks

På din egen server stannar kunderna, priserna och fakturorna i Sverige, kostnaden är servern i stället för ett pris per kund eller användare, och ingen ändrar paketen för dig. Men var ärlig mot dig själv om vad du lämnar:

  • Bokföringen. QuickBooks är ett bokföringsprogram, och FreshBooks har rapporter med dubbel bokföring från Plus. Invoice Ninja och InvoiceShelf fakturerar bara: du behöver fortfarande ett bokföringsprogram och någon som bokför fakturorna, och ingen av dem skickar dem dit åt dig.
  • Bankkopplingar. FreshBooks kopplar banker i alla paket och QuickBooks från gratispaketet. Invoice Ninja kan hämta transaktioner från banker i EU via GoCardless, men en egen server behöver egna nycklar från GoCardless, och GoCardless slutade ta emot nya konton för Bank Account Data i juli 2025, enligt Actual Budgets dokumentation; en CSV-fil från banken fungerar i stället. InvoiceShelf har ingen bankimport.
  • Din redovisningskonsults åtkomst. FreshBooks och QuickBooks har en roll för redovisningskonsulten. I våra ger du konsulten ett användarkonto, vilket vi inte testade, eller skickar exporter: CSV från Invoice Ninja, PDF-rapporter från InvoiceShelf.
  • Svenska detaljer du fixar själv. Ingen av apparna lägger till texten om omvänd betalningsskyldighet, summerar beskattningsunderlaget per momssats eller har ett fält för leveransdatum, och InvoiceShelf döljer momsnumren tills du ändrar layouten.
  • Driften. Uppdateringar, säkerhetskopior och servern är ditt ansvar, och du behöver ett e-postkonto för att skicka fakturor och påminnelser.

Vilken ska du välja

En konsultfirma eller ett litet företag som fakturerar varje vecka: Invoice Ninja. Den har offerter, kreditfakturor, delbetalningar, påminnelser, återkommande fakturor, en kundportal på svenska, en momsrapport per momssats, utgifter med moms, ett komplett API och en väg till Peppol. Svagheterna är minnet, omkring 380 MB i vila och 610 MB när den gör PDF:er, 3,2 GB avbilder, en licens som inte är öppen källkod, Invoice Ninjas namn i kundmejlen utan licensen för egen profil, växelkurser du anger själv, och en momsrapport som utelämnade vår kreditfaktura. Vi har ingen guide för den än: filerna i Så körde vi Invoice Ninja är det vi körde, ovanpå Podman-guiden. En VC-P Alloy kör den med gott om utrymme över.

En frilansare med några fakturor i månaden: InvoiceShelf. Den är liten, omkring 43 MB, har AGPL-licens utan något att köpa, finns på svenska och gör offerter, fakturor, återkommande fakturor, delbetalningar och PDF-rapporter. Svagheterna är inga kreditfakturor, inga påminnelser, ingen e-faktura, en momsrapport som bara räknar helt betalda fakturor, utgifter utan moms, en kundportal på engelska, momsnummer du måste lägga till i layouten, fakturanummer som kan användas två gånger om du raderar, och säkerhetsrättningar för version 2 bara till september 2027. Filerna finns i Så körde vi InvoiceShelf; en VC-P Alloy passar den, bredvid andra appar.

Vilken du än väljer, para ihop den med ett svenskt bokföringsprogram, och om du fakturerar per timme, se Kimai och Solidtime för tidrapportering. Tillsammans använde våra två appar omkring 425 MB i vila, så en VC-P Alloy kör båda, som vår gjorde.

Kör det på din egen server

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy

100 kr/mån

vCPU
2
Minne
8 GB
Lagring
60 GB
Trafik
10 TB
Performance
SSD · RAID 1
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider