Software di fatturazione self-hosted: confronto su VPS
Confronto tra Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai ed ERPNext su un VPS: ricorrenze, tasse, portale clienti, pagamenti, licenze e backup.
Quale software di fatturazione self-hosted scegliere?
Il software di fatturazione self-hosted si riduce a cinque opzioni realistiche su un VPS, ma non sono alternative equivalenti. Invoice Ninja è il prodotto più completo: fatture ricorrenti, portale clienti, gateway di pagamento e formati di fatturazione elettronica funzionano dal giorno dell'installazione. InvoiceShelf è l'opzione completamente open source più leggera. InvoicePlane è una semplice applicazione PHP che non richiede alcuna orchestrazione. Kimai fattura le ore registrate invece delle singole voci. ERPNext è un sistema contabile completo che consente anche di stampare le fatture.
Due problemi compromettono un'installazione di fatturazione self-hosted molto più spesso di una funzionalità mancante. Il primo è l'email. Una fattura che finisce nella cartella spam è una fattura non pagata, e non c'è nulla che segnali l'accaduto. Il secondo sono i backup. Questo è l'unico database self-hosted la cui perdita diventa un problema fiscale, non un semplice inconveniente.
Leggi la licenza prima dell'elenco delle funzionalità. Tre di queste cinque soluzioni sono copyleft, una è permissiva e una rende disponibile il codice sorgente, ma impone limiti effettivi su ciò che puoi farne.
Le cinque opzioni e a chi sono destinate
Invoice Ninja
Un’applicazione Laravel, attualmente sul ramo v5. Il self-hosting è gratuito e tutte le funzioni sono disponibili: fatture ricorrenti, preventivi, progetti, rilevazione del tempo, spese, portale clienti e gateway di pagamento, inclusi Stripe e PayPal. Il progetto si definisce «un’applicazione per fatture, preventivi, progetti e rilevazione del tempo, con codice sorgente disponibile e sviluppata con Laravel». L’unico elemento a pagamento è il branding. Nelle parole del progetto: «Offriamo una licenza white-label da $40 all’anno per rimuovere il branding di Invoice Ninja dalle sezioni dell’app visibili ai clienti». Il prezzo è aggiornato ad agosto 2026.
Sceglila se vuoi il prodotto più completo e accetti di eseguire lo stack più grande.
InvoiceShelf
Un fork di Crater, distribuito con la GNU Affero General Public License version 3 (AGPL-3.0). Gestisce fatture, preventivi, fatturazione ricorrente, spese, imposte, più valute, portale clienti e più aziende. I pagamenti e la personalizzazione white-label sono disponibili in repository ufficiali di moduli separati, entrambi con licenza AGPL-3.0 ed entrambi gratuiti. I pagamenti con carta passano dal checkout di Stripe.
Sceglila se vuoi un’applicazione piccola e completamente open source e non ti servono trenta gateway.
InvoicePlane
Un’applicazione PHP basata su CodeIgniter, distribuita con licenza MIT e unica opzione di questo elenco che si installa decomprimendo i file nella web root. Non usa Docker né una fase di build con Node. I PDF vengono generati da mPDF, quindi i template sono scritti in HTML e CSS. I clienti ricevono un link pubblico per visualizzare e pagare una fattura.
Il limite riguarda i pagamenti. La documentazione dichiara chiaramente che InvoicePlane 1.6 supporta per impostazione predefinita soltanto Stripe e che gli altri provider sono stati rimossi in quella versione. I requisiti pubblicati per il ramo 1.6 sono PHP 8.0–8.1 con MySQL 5.5 o la versione corrispondente di MariaDB. Leggi le note della release che scarichi, perché il ramo 1.7 è ancora in evoluzione.
Sceglila se usi un hosting condiviso o un VPS con 512 MB di RAM.
Kimai
Un sistema per la rilevazione del tempo con licenza AGPL-3.0, che genera fatture dai timesheet. È la scelta corretta per chi fattura le ore lavorate. I template delle fatture vengono caricati come file DOCX, ODS o XLSX; la documentazione conferma che questi sono gli unici formati accettati, poi li converte in PDF o HTML. Puoi impaginare la fattura con un programma di videoscrittura invece di scrivere CSS, una soluzione che la maggior parte delle persone trova più semplice.
Kimai non offre un portale clienti né un gateway di pagamento, quindi il PDF deve essere inviato via email. La fatturazione elettronica strutturata è disponibile tramite un plugin a pagamento dello store, E-Invoice Plus, indicato a 99 EUR all’anno, IVA esclusa, per un’installazione self-hosted ad agosto 2026. Il plugin supporta i profili EN16931, XRechnung, ZUGFeRD, Factur-X e Peppol.
Sceglilo se la fattura è il risultato della rilevazione del tempo.
ERPNext
GPL-3.0 e appartenente a una categoria diversa di software. La fattura di vendita è un tipo di documento all’interno di un sistema contabile completo, con piano dei conti, registrazioni contabili, gestione del magazzino e paghe. È la scelta corretta quando la fatturazione non è più l’unica attività da gestire. Per un freelance con otto clienti è un software eccessivo. La sua installazione è un progetto a sé, descritto in eseguire ERPNext su un VPS.
Le fatture ricorrenti dipendono da uno scheduler che non è visibile
Invoice Ninja, InvoiceShelf, InvoicePlane ed ERPNext generano tutti fatture ricorrenti. Kimai non offre una funzione per le fatture ricorrenti nel core, perché in questo caso la fattura viene generata dalle registrazioni del timesheet relative a un periodo.
La modalità di errore è la stessa in tutte le applicazioni basate su Laravel ed è silenziosa. Le fatture ricorrenti vengono create da un'attività pianificata, php artisan schedule:run, che deve essere richiamata ogni minuto da un componente esterno all'applicazione. Se nessun componente la richiama, l'elenco delle fatture ricorrenti continua a mostrare una data del prossimo invio, ma la data passa senza produrre effetti. Non viene visualizzata alcuna fattura. Non viene registrato alcun errore, perché non è stato eseguito alcun codice.
Dopo aver creato la prima fattura ricorrente, imposta quindi la data del prossimo invio a pochi minuti nel futuro e attendi. Se non arriva nulla, lo scheduler non è in esecuzione. In un'installazione Docker, di solito significa che il servizio cron o scheduler nel file compose non è mai stato avviato oppure è terminato.
docker compose ps
docker compose logs --tail 50Ogni servizio nel file dovrebbe riportare running. Il servizio che si trova nello stato exited è quello di cui devi leggere i log.
Valute multiple e imposte: cosa verificare prima di impegnarsi
Gli elenchi delle funzionalità indicano la "gestione di più valute", ma con questa espressione possono intendere cose molto diverse. Eseguite queste quattro verifiche su un'istanza demo, usando importi reali della vostra attività, perché un errore in questo ambito viene individuato dal commercialista, non da voi.
- La fattura memorizza il tasso di cambio applicato alla data di emissione? Deve farlo. Se l'applicazione ricalcola i totali usando un tasso aggiornato, i report dell'ultimo trimestre cambiano ogni volta che li aprite e la contabilità non corrisponde più a quanto avete già dichiarato.
- L'imposta viene applicata a ogni riga, all'intera fattura o a entrambi i livelli? Un'unica aliquota a livello di fattura va bene finché una riga non è soggetta ad aliquota zero.
- Potete inserire i prezzi comprensivi di imposta oltre che al netto dell'imposta? La conversione successiva introduce differenze di arrotondamento di un centesimo per riga, e questi centesimi si accumulano nell'arco di un anno.
- Cosa mostra il documento per un cliente di un altro Paese che non deve pagare l'IVA? Sulla fattura deve essere stampata la nota di esenzione, non soltanto uno zero nella colonna dell'imposta.
Invoice Ninja ed ERPNext gestiscono tutti e quattro gli aspetti. InvoiceShelf include imposte e valute multiple tra le proprie funzionalità. InvoicePlane e Kimai sono più semplici, quindi verificateli usando la fattura più problematica della vostra attività, non quella più semplice.
Portale clienti e gateway di pagamento
Un portale clienti è una pagina in cui il cliente visualizza le fatture, scarica il PDF ed effettua il pagamento. È più importante di quanto sembri, perché sollecitare un pagamento via email richiede più tempo di quanto ne abbia richiesto la produzione della fattura.
Invoice Ninja è la soluzione più completa in questo ambito, con un portale completo, numerosi gateway, metodi di pagamento salvati e fatturazione automatica per le fatture ricorrenti. InvoiceShelf offre un portale clienti e aggiunge il checkout di Stripe tramite il proprio modulo per i pagamenti. InvoicePlane assegna a ogni fattura un guest link e supporta Stripe. Kimai non offre nessuna di queste funzioni, quindi il PDF viene inviato come allegato.
Un aspetto viene spesso frainteso. Il self-hosting dell'applicazione di fatturazione non significa conservare i numeri delle carte. Con il checkout di Stripe, il cliente viene reindirizzato a Stripe e inserisce lì i dati della carta; il tuo VPS non vede mai il numero. Il tuo ambito PCI (payment card industry) rimane limitato proprio perché non hai creato il modulo di pagamento. Se in seguito ti serve più di un processore o vuoi instradare i pagamenti in base al paese, questa esigenza va gestita in un livello separato, ad esempio con l'orchestrazione dei pagamenti self-hosted con Hyperswitch.
Qualità dei PDF e modello da modificare
Modificherai il modello. Ogni impostazione predefinita inserisce il tuo indirizzo in una posizione errata per il tuo Paese.
Invoice Ninja esegue il rendering dei modelli HTML e CSS in PDF usando Chromium headless incluso nell'immagine, per questo il container è di grandi dimensioni. Riserva memoria sufficiente: un browser headless è il processo più pesante dello stack, quindi un VPS da 1 GB è al limite. InvoicePlane usa mPDF, che è scritto esclusivamente in PHP ed è leggero, ma ignora parte delle funzionalità CSS moderne. Kimai adotta l'approccio opposto e richiede di caricare un file DOCX o ODS; il layout viene quindi realizzato in LibreOffice o Word da chi non ha mai scritto un foglio di stile.
Se per te è importante avere una fattura con un layout curato e il CSS non è una priorità, l'approccio di Kimai è preferibile. Se vuoi mantenere il modello sotto controllo versione e poter confrontare le differenze, è preferibile HTML.
La licenza consente l'uso commerciale?
Tutte e cinque le soluzioni consentono di fatturare i propri clienti. Le differenze emergono quando si svolgono attività ulteriori.
Invoice Ninja è distribuito con Elastic License 2.0. Due clausole sono rilevanti.
Non è possibile fornire il software a terze parti come servizio in hosting o gestito, quando il servizio offre agli utenti l'accesso a una parte sostanziale delle funzionalità del software.
Non è possibile spostare, modificare, disabilitare o aggirare la funzionalità relativa alla chiave di licenza del software.
È quindi possibile eseguirlo per la propria attività, ma non eseguire istanze per i clienti come prodotto. La seconda clausola spiega perché la rimozione del branding richiede una licenza da $40 e non una modifica al codice sorgente.
InvoiceShelf, Kimai e Crater sono distribuiti con AGPL-3.0. L'uso commerciale è gratuito e non esiste un livello superiore a quello disponibile. L'obbligo è previsto dalla sezione 13: se si modifica il codice e si consente ad altre persone di usare la versione modificata tramite una rete, è necessario offrire loro il codice sorgente delle modifiche. Un'istanza non modificata è già coperta dal codice sorgente pubblico del progetto upstream, quindi la maggior parte degli utenti che gestiscono autonomamente questi servizi non deve intervenire.
InvoicePlane usa MIT, la licenza con gli obblighi più ridotti del gruppo, anche se il README specifica che il nome e il logo restano di proprietà del progetto.
ERPNext usa GPL-3.0. Le modifiche distribuite devono essere condivise, mentre l'esecuzione privata non comporta obblighi.
Questa è una descrizione del testo delle licenze e non costituisce consulenza legale.
Il progetto è ancora gestito? Controlla il registro dei commit
Crater è stata per diversi anni una popolare applicazione open source per la fatturazione e molte guide continuano a consigliarla. Il suo branch predefinito non registra commit da 741 giorni.
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
}
]Dei 6 progetti presenti in quel blocco, cinque hanno ricevuto un commit nell'ultima settimana. InvoiceShelf è il fork che ha portato avanti il lavoro di Crater, con la stessa licenza AGPL-3.0 e lo stesso modello di dati. Il passaggio consiste quindi in una migrazione dei dati, non in una riscrittura. Installa InvoiceShelf, non Crater.
Installazione di ciascuna applicazione su un VPS
Tutte le applicazioni, tranne InvoicePlane, funzionano più facilmente con Docker Compose. Se non lo hai mai usato, inizia da un primo stack Docker Compose su un VPS e poi torna qui.
Invoice Ninja distribuisce un proprio repository Compose.
git clone https://github.com/invoiceninja/dockerfiles.git
cd dockerfiles
docker run --rm -it invoiceninja/invoiceninja php artisan key:generate --showCopia la chiave nel file env del repository e inserisci anche il tuo APP_URL effettivo. Imposta quindi la proprietà attesa dall'immagine e avvia il servizio.
chmod 755 docker/app/public
sudo chown -R 1500:1500 docker/app
docker compose up -dLa proprietà 1500:1500 corrisponde all'utente presente nell'immagine. Se la ometti, l'applicazione non può scrivere nella cache né nei PDF generati. Nella procedura guidata di configurazione, indica db come host del database, perché è il nome del servizio sulla rete Compose. localhost punta al container dell'applicazione.
InvoiceShelf pubblica file Compose pronti, uno per ogni motore di database.
curl -fLO https://raw.githubusercontent.com/InvoiceShelf/docker/master/docker-compose.mysql.yml
mv docker-compose.mysql.yml docker-compose.ymlApri il file prima di avviarlo. Tutte le password contenute sono segnaposto e il file lo specifica nei commenti. APP_URL, SESSION_DOMAIN e SANCTUM_STATEFUL_DOMAINS hanno tutti localhost come valore predefinito; prima del primo accesso, imposta il tuo hostname effettivo in tutti e tre. Avvia quindi lo stack.
docker compose up -dPubblica la porta 8090 sull'host e offre il servizio sulla porta 8080 del container. Configura davanti un reverse proxy con TLS (Transport Layer Security) prima di indirizzarvi anche un solo client.
File Compose di produzione di Kimai, dalla documentazione del progetto
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:Imposta APP_SECRET su una stringa casuale lunga scelta da te e TRUSTED_HOSTS sul dominio che utilizzerai effettivamente. ADMINMAIL e ADMINPASS creano il primo amministratore al primo avvio; cambia quindi la password dall'interfaccia e rimuovi nuovamente le credenziali dal file.
InvoicePlane non dispone di un container. Crea prima un database vuoto.
sudo mysql -e "CREATE DATABASE invoiceplane CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"Scarica l'archivio dalla pagina delle release del progetto, estrailo nella document root, copia ipconfig.php.example in ipconfig.php e imposta l'URL al suo interno seguendo i commenti presenti nel file. Apri quindi https://your-domain.example/index.php/setup e completa la procedura guidata di installazione.
Perché la fattura finisce nella cartella spam
Questo è il problema che può costare denaro, mentre l'applicazione continuerà a indicare correttamente la fattura come inviata.
Non inviare le fatture dall'indirizzo IP del VPS. Un nuovo indirizzo IP del VPS non ha una cronologia di invio, e i grandi provider considerano sospetto per impostazione predefinita il primo messaggio proveniente da un indirizzo sconosciuto appartenente a un intervallo di hosting. Invia i messaggi tramite un relay SMTP (simple mail transfer protocol) associato a un dominio per cui hai completato l'autenticazione. Configurare questo flusso end-to-end richiede una guida dedicata; l'invio affidabile della posta da un'applicazione self-hosted descrive il relay, i record DNS e i test.
L'indirizzo From è il punto in cui la maggior parte delle configurazioni per l'invio delle fatture presenta errori. Deve appartenere a un dominio sotto il tuo controllo e deve essere un dominio con cui il relay firma i messaggi tramite DKIM (domainkeys identified mail). Inserire l'indirizzo del cliente nel campo From può sembrare più cortese, ma compromette la consegna, perché il server ricevente verifica che il dominio di From corrisponda al dominio che ha autenticato il messaggio. Gmail rifiuta immediatamente questa mancata corrispondenza:
550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policyMantieni il tuo indirizzo nel campo From e inserisci quello del cliente nel campo Reply-To. Controlla i record pubblicati prima di inviare messaggi reali.
dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.comIl primo comando dovrebbe restituire un record SPF (sender policy framework) che indichi il relay. Il secondo dovrebbe restituire un criterio DMARC (domain-based message authentication, reporting and conformance). Il terzo dipende dal selettore fornito dal relay. Una risposta vuota indica che il record DKIM manca oppure è stato pubblicato con il nome errato; di conseguenza, il controllo della firma fallirà per ogni messaggio inviato.
Invia quindi una fattura reale a un account che controlli presso un grande provider e leggi gli header grezzi. dkim=pass e spf=pass nell'header Authentication-Results sono l'unica prova rilevante. Il flag "sent" dell'applicazione indica soltanto che il messaggio è stato consegnato al relay.
Backup: l'unico database che non puoi perdere
Perdere un media server significa dover scaricare di nuovo i file. Perdere il database della fatturazione significa non poter dimostrare che cosa hai fatturato, che cosa hai incassato o che cosa devi ancora ricevere. Trattalo di conseguenza.
Esegui il backup di quattro elementi. Il database. Il volume di storage, che contiene loghi, PDF generati e ricevute delle spese. Il file dell'ambiente dell'applicazione. E i PDF generati conservati come file ordinari, perché un PDF si apre anche tra dieci anni senza l'applicazione che lo ha prodotto.
Il file dell'ambiente è più importante di quanto molti pensino. Laravel cifra i valori sensibili memorizzati, incluse le credenziali del gateway di pagamento, usando il APP_KEY contenuto in quel file. Se ripristini il database accanto a una chiave appena generata, quei valori non vengono decifrati. Le fatture sono tutte presenti, ma le impostazioni del gateway risultano illeggibili.
Un dump dello stack InvoiceShelf è simile al seguente. Il servizio del database viene eseguito su mariadb:10, quindi lo strumento disponibile nel container è mariadb-dump.
docker compose exec -T database mariadb-dump \
--user=root --password=YOUR_ROOT_PASSWORD \
--single-transaction --databases invoiceshelf > invoiceshelf.sql--single-transaction crea uno snapshot coerente delle tabelle InnoDB senza bloccarle, quindi l'applicazione continua a rispondere durante l'esecuzione del dump. -T impedisce a Docker di allocare un terminale, che altrimenti potrebbe corrompere l'output reindirizzato e produrre un file di dump non importabile.
Invia il backup fuori dal server secondo una pianificazione, usando backup restic cifrati su storage remoto, e imposta una retention sufficientemente lunga da coprire il periodo indicato dal tuo commercialista.
Poi ripristinalo. Avvia il dump in un container temporaneo, accedi e apri la fattura del mese scorso. Finché non lo avrai fatto almeno una volta, non saprai se il backup funziona.
Cosa chiederà il commercialista
Non basarti su un tutorial per ottenere consulenza fiscale. Quanto segue descrive ciò che questo software può produrre, così puoi portare l’elenco al professionista che ti segue.
Dati esportabili. Dovresti poter esportare fatture e pagamenti in formato CSV dall’interfaccia, senza usare un client per il database e senza aprire un ticket di supporto. Un dump SQL è un backup, non un’esportazione, perché il commercialista non può aprirlo.
Numerazione immutabile. I numeri delle fatture dovrebbero essere progressivi e non essere mai riutilizzati, senza interruzioni nella sequenza. L’eliminazione di una fattura crea un numero mancante che dovrà poi essere spiegato. Usa invece l’annullamento o una nota di credito, funzionalità supportate da tutte le applicazioni qui esaminate. L’obbligo di una numerazione senza interruzioni dipende dal Paese in cui sei registrato; conviene verificarlo subito.
Conservazione. Conserva i dump del database e i PDF generati per il periodo previsto dalla normativa applicabile. Il PDF è il documento effettivamente inviato ed è l’elemento rilevante se una fattura viene contestata.
Cronologia delle modifiche. È utile poter mostrare chi ha modificato una fattura e quando. Questo aspetto varia soprattutto tra queste applicazioni. Invoice Ninja mantiene un registro delle attività per ogni record.
La fatturazione elettronica strutturata è diventata un requisito concreto, e non più una semplice funzionalità aggiuntiva, in alcune aree dell’UE. Invoice Ninja genera i formati più comuni, tra cui ZUGFeRD e XRechnung, Facturae, FatturaPA e il formato generico EN16931. La consegna tramite la rete Peppol da un’istanza self-hosted passa dal proprio access point di Invoice Ninja: devi registrare la tua entità presso il servizio e acquistare crediti per ogni invio. Ad agosto 2026 il servizio è a pagamento. Kimai supporta gli stessi formati tramite il proprio plugin a pagamento. Attualmente le altre tre applicazioni non producono alcuna fattura elettronica strutturata. Questo è il motivo principale per scegliere Invoice Ninja se emetti fatture all’interno dell’UE.
FAQ
Devo installare Crater o InvoiceShelf?
InvoiceShelf. Il branch predefinito di Crater non riceve commit da 741 giorni al 21 agosto 2026 e il relativo issue tracker indirizza gli utenti verso il fork. InvoiceShelf utilizza la stessa licenza AGPL-3.0 e lo stesso modello dati, quindi il passaggio dall'uno all'altro richiede una migrazione del database, non una riscrittura. Le guide che consigliano ancora Crater sono state scritte prima che il progetto smettesse di essere aggiornato.
Posso usare Invoice Ninja per la mia attività senza pagare?
Sì. Invoice Ninja self-hosted è completamente funzionale senza costi con la licenza Elastic License 2.0, incluse le fatture ricorrenti, il portale clienti e i gateway di pagamento. Due aspetti sono a pagamento. Per rimuovere il branding di Invoice Ninja dalle pagine visibili ai clienti serve la licenza white-label, al costo di "$40 per year", secondo quanto indicato dal progetto ad agosto 2026. L'invio di fatture elettroniche sulla rete Peppol viene tariffato separatamente. La licenza vieta di eseguire il software come servizio hosted per conto di altre persone.
Perché le email delle fatture finiscono nella cartella spam?
Quasi sempre perché il messaggio non è autenticato per il dominio indicato nell'indirizzo From. Invia i messaggi tramite un relay SMTP invece che direttamente dal VPS, poi pubblica i record SPF e DMARC per il tuo dominio e aggiungi il record DKIM usando il selector fornito dal relay. Mantieni il tuo indirizzo in From e inserisci quello del cliente in Reply-To. Impostare l'indirizzo del cliente come mittente fa sì che Gmail rifiuti il messaggio con 550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. Verifica la correzione cercando dkim=pass e spf=pass nell'header Authentication-Results di un messaggio di test.
Quale dovrei scegliere se fatturo a ore?
Kimai. È prima di tutto uno strumento per il rilevamento del tempo, quindi la fattura viene generata dalle voci approvate del timesheet e le righe descrivono il lavoro registrato. I modelli sono file DOCX, ODS o XLSX che progetti con un elaboratore di testi; è più semplice che modificare il CSS. Il compromesso è che Kimai non offre un portale clienti né un gateway di pagamento, quindi devi inviare il PDF via email e ricevere il pagamento tramite bonifico. Anche Invoice Ninja rileva il tempo e offre un portale, quindi scegli quest'ultimo se il pagamento online con carta è più importante per te del dettaglio del timesheet.
Che cosa devo includere esattamente nel backup?
Il database, il volume di storage che contiene i loghi e i PDF generati, il file dell'ambiente e i PDF renderizzati conservati come file normali. Il file dell'ambiente è quello che spesso viene dimenticato: le applicazioni Laravel come Invoice Ninja e InvoiceShelf cifrano le credenziali memorizzate con APP_KEY, quindi il ripristino di un database accanto a una chiave appena generata rende illeggibili le impostazioni del gateway di pagamento. Ripristina tutto in un'istanza temporanea e apri una vecchia fattura, perché è l'unico modo per verificare che il backup funzioni.