SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-08-22

Confronto software di fatturazione self-hosted su VPS

Confronto tra Invoice Ninja, InvoiceShelf, InvoicePlane, Kimai ed ERPNext su un VPS: ricorrenza, tasse, portale clienti, pagamenti e licenze.

Quale software di fatturazione self-hosted scegliere?

Il software di fatturazione self-hosted si riduce a cinque opzioni realistiche su un unico 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 già al termine dell'installazione. InvoiceShelf è l'opzione completamente open source più leggera. InvoicePlane è una semplice applicazione PHP che non richiede componenti da orchestrare. 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'è alcun avviso che lo segnali. Il secondo sono i backup. È l'unico database self-hosted la cui perdita diventa un problema fiscale, non solo un inconveniente.

Leggete 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 concreti su ciò che è possibile farne.

Le cinque opzioni e a chi è destinata ciascuna

Invoice Ninja

Un'applicazione Laravel, attualmente nella linea v5. L'hosting autonomo è gratuito e senza limitazioni: fatture ricorrenti, preventivi, progetti, rilevazione delle ore, spese, portale clienti e gateway di pagamento tra cui Stripe e PayPal. Il progetto si definisce "un'applicazione per fatture, preventivi, progetti e rilevazione delle ore, disponibile nel codice sorgente e realizzata 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 parti dell'applicazione visibili ai clienti". Questo prezzo è aggiornato ad agosto 2026.

Sceglila se vuoi il prodotto più completo e accetti di eseguire lo stack più articolato.

InvoiceShelf

Un fork di Crater, distribuito con la GNU Affero General Public License versione 3 (AGPL-3.0). Gestisce fatture, preventivi, fatturazione ricorrente, spese, imposte, più valute, un portale clienti e più aziende. I pagamenti e il white-labeling sono disponibili in repository ufficiali separati, entrambi con licenza AGPL-3.0 e gratuiti. I pagamenti con carta passano dal checkout di Stripe.

Sceglilo 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 l'unica opzione qui presente che si installa decomprimendo i file nella web root. Non richiede Docker né un passaggio di build con Node. I PDF sono generati da mPDF, quindi i template usano HTML e CSS. I clienti ricevono un guest link 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 la linea 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é la linea 1.7 è ancora in sviluppo.

Sceglilo se usi un hosting condiviso o un VPS da 512 MB.

Kimai

Un sistema per la rilevazione delle ore 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, e poi vengono convertiti in PDF o HTML. Puoi impaginare la fattura in un elaboratore di testi invece di scrivere CSS, una modalità che la maggior parte degli utenti trova più semplice.

Kimai non dispone di un portale clienti né di un gateway di pagamento, quindi il PDF viene inviato tramite email. La fatturazione elettronica strutturata è disponibile tramite un plugin commerciale dello store chiamato E-Invoice Plus, indicato a 99 EUR all'anno, IVA esclusa, per un'installazione self-hosted ad agosto 2026. Sono inclusi i profili EN16931, XRechnung, ZUGFeRD, Factur-X e Peppol.

Sceglilo se la fattura è il risultato della rilevazione delle ore.

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à. 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 una fattura viene creata a partire dalle registrazioni del timesheet relative a un periodo.

La modalità di errore è identica in tutte le applicazioni basate su Laravel e non produce segnali evidenti. 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 di invio successiva, ma la data trascorre. Non viene creata alcuna fattura. Non viene registrato alcun errore, perché non è stato eseguito alcun codice.

Dopo aver creato la prima fattura ricorrente, imposta quindi la relativa data di invio successiva a pochi minuti nel futuro e attendi. Se non arriva nulla, lo scheduler non è in esecuzione. In un'installazione Docker, in genere significa che il servizio cron o scheduler definito nel file compose non è mai stato avviato oppure è terminato.

docker compose ps
docker compose logs --tail 50

Ogni 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à riportano spesso “valute multiple”, ma il significato può variare molto. Esegui queste quattro verifiche su un’istanza demo, usando importi reali della tua attività. Un errore in quest’area viene rilevato dal commercialista, non da te.

  1. 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 apri e la contabilità non corrisponde più a quanto hai già dichiarato.
  2. 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.
  3. Puoi inserire i prezzi sia comprensivi sia esclusi dall’imposta? La conversione successiva introduce differenze di arrotondamento di un centesimo per riga, che si accumulano nell’arco dell’anno.
  4. 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 indica imposte e valute multiple tra le proprie funzionalità. InvoicePlane e Kimai sono più semplici, quindi provali usando la fattura più complessa della tua 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 i pagamenti via email richiede più tempo della creazione della fattura.

Invoice Ninja è la soluzione più completa in questo ambito: offre un portale completo, numerosi gateway, metodi di pagamento salvati e la fatturazione automatica per le fatture ricorrenti. InvoiceShelf dispone di un portale clienti e aggiunge il checkout Stripe tramite il relativo modulo per i pagamenti. InvoicePlane assegna a ogni fattura un link per gli ospiti 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 Stripe, il cliente viene reindirizzato a Stripe e inserisce lì i dati della carta; il tuo VPS non vede mai il numero. Il perimetro PCI (payment card industry) resta limitato proprio perché non hai sviluppato il modulo di pagamento. Se in seguito ti serve più di un processore o vuoi instradare i pagamenti in base al paese, questa funzione appartiene a un livello separato, come l'orchestrazione dei pagamenti self-hosted con Hyperswitch.

Qualità del PDF e modello che modificherai

Modificherai il modello. Ogni impostazione predefinita qui inserita posiziona il tuo indirizzo nel posto sbagliato 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. Considera il consumo di memoria: un browser headless è il processo più pesante dello stack, quindi un VPS con 1 GB di RAM è al limite. InvoicePlane usa mPDF, che è scritto interamente in PHP ed è leggero, ma ignora parte delle funzionalità CSS moderne. Kimai adotta l'approccio opposto e richiede il caricamento di un file DOCX o ODS; in questo caso il layout viene 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 è un requisito, l'approccio di Kimai è preferibile. Se vuoi mantenere il modello nel controllo versione e poterlo confrontare con un diff, è preferibile l'HTML.

La licenza consente l'uso commerciale?

Tutte e cinque consentono di fatturare i propri clienti. Le differenze emergono quando si fa qualcosa di più.

Invoice Ninja è distribuito con la 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 eludere la funzionalità delle chiavi di licenza del software.

Quindi eseguirlo per la propria azienda è consentito, mentre non è consentito eseguire istanze per i clienti come prodotto. La seconda clausola spiega perché la rimozione del branding richiede una licenza da $40, invece di una modifica al codice sorgente.

InvoiceShelf, Kimai e Crater sono distribuiti con la AGPL-3.0. L'uso commerciale è gratuito e non esiste un livello superiore a cui passare. L'obbligo è definito nella sezione 13: se si modifica il codice e si consente ad altre persone di usare la versione modificata attraverso 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 occuparsene.

InvoicePlane usa la licenza MIT, che impone gli obblighi minori del gruppo, anche se il relativo README specifica che il nome e il logo restano del progetto.

ERPNext usa la 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 mantenuto? Controlla il registro dei commit

Crater è stata l'applicazione open source per la fatturazione più diffusa per diversi anni e molte guide continuano a consigliarla. Il suo ramo predefinito non registra commit da 741 giorni.

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
  }
]

Tra i 6 progetti di 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 hai ancora utilizzato Docker Compose, inizia da una prima configurazione Docker Compose su un VPS e poi torna qui.

Invoice Ninja include un proprio repository Compose.

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

Copia quella chiave nel file env del repository, insieme al tuo valore reale di APP_URL. Quindi imposta la proprietà prevista dall'immagine e avvia il servizio.

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

La proprietà 1500:1500 corrisponde all'utente interno all'immagine. Se la ometti, l'applicazione non può scrivere la cache né i PDF generati. Nella procedura guidata di configurazione, usa db come host del database, perché è il nome del servizio sulla rete Compose. localhost indica il container dell'applicazione stessa.

InvoiceShelf pubblica file Compose pronti all'uso, 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.yml

Apri il file prima di avviarlo. Tutte le password contenute sono segnaposto e i commenti del file lo specificano. APP_URL, SESSION_DOMAIN e SANCTUM_STATEFUL_DOMAINS hanno tutti localhost come valore predefinito; prima del primo accesso, imposta per tutti e tre il nome host reale. Quindi avvia lo stack.

docker compose up -d

Pubblica la porta 8090 sull'host e usa la porta 8080 all'interno del container. Configura un reverse proxy con TLS (transport layer security) davanti all'applicazione 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, generata da te, e TRUSTED_HOSTS sul dominio che utilizzerai realmente. ADMINMAIL e ADMINPASS creano il primo amministratore al primo avvio; modifica quindi la password dall'interfaccia e rimuovi nuovamente questi valori 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 root web, copia ipconfig.php.example in ipconfig.php e imposta al suo interno il tuo URL seguendo i commenti presenti nel file. Quindi apri 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ò costarti denaro, mentre l'applicazione segnalerà comunque la fattura come inviata.

Non inviare le email delle 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 indirizzi di hosting. Invia i messaggi tramite un relay SMTP (simple mail transfer protocol) associato a un dominio che hai autenticato. Configurare correttamente questo flusso richiede una guida dedicata; invio affidabile delle email 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 la fatturazione presenta problemi. Deve appartenere a un dominio che controlli e che il relay firmi con DKIM (domainkeys identified mail). Inserire nel campo From l'indirizzo del cliente può sembrare una scelta cortese, ma compromette la consegna: il server destinatario verifica che il dominio del campo From corrisponda al dominio che ha autenticato il messaggio. Gmail rifiuta subito questa mancata corrispondenza:

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

Mantieni il tuo indirizzo nel campo From e inserisci quello del cliente nel campo Reply-To. Verifica 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.com

Il primo comando dovrebbe restituire un record SPF (sender policy framework) che identifica il relay. Il secondo dovrebbe restituire una policy DMARC (domain-based message authentication, reporting and conformance). Il terzo dipende dal selector fornito dal relay. Una risposta vuota significa 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 possiedi presso un grande provider e leggi gli header originali. dkim=pass e spf=pass nell'header Authentication-Results sono l'unica prova valida. Il flag "sent" dell'applicazione indica soltanto che il messaggio è stato passato al relay.

Backup: l'unico database che non puoi perdere

Perdere un media server significa dover scaricare di nuovo i file. Anche un server fotografico self-hosted come PhotoPrism o Immich di solito conserva una seconda copia degli originali, che esistono ancora sul telefono che li ha acquisiti. Perdere il database della fatturazione significa non poter dimostrare quanto hai fatturato, quanto ti è stato pagato e quanto devi ancora incassare. Gestiscilo 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 normali file, 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 si aspettino. Laravel cifra i valori sensibili memorizzati, comprese le credenziali del gateway di pagamento, usando il APP_KEY contenuto in quel file. Se ripristini il database insieme a una chiave appena generata, quei valori non vengono decifrati. Tutte le fatture sono presenti, ma le impostazioni del gateway risultano illeggibili.

Un dump dello stack InvoiceShelf ha questo aspetto. Il relativo servizio database viene eseguito mariadb:10, quindi lo strumento all'interno del 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 mentre il dump è in esecuzione. -T impedisce a Docker di allocare un terminale, che altrimenti corromperebbe l'output reindirizzato e produrrebbe un file di dump non importabile.

Trasferisci il backup fuori dal server secondo una pianificazione usando backup restic cifrati su storage off-site e imposta una conservazione 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 hai fatto almeno una volta, non sai se il backup funziona.

Cosa chiederà il commercialista

Non affidarti a un tutorial per ottenere consulenza fiscale. Di seguito trovi ciò che questo software è in grado di produrre, così puoi portare l’elenco al professionista che ti assiste.

Dati esportabili. Dovresti poter esportare fatture e pagamenti in formato CSV dall’interfaccia, senza usare un client per 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 seguire una sequenza e non essere mai riutilizzati, senza interruzioni. L’eliminazione di una fattura lascia un numero mancante che dovrà essere giustificato. Annulla invece la fattura o emetti una nota di credito: tutte le applicazioni qui descritte supportano queste operazioni. L’obbligo di usare 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’artefatto 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 conserva un registro delle attività per ogni record.

La fatturazione elettronica strutturata è diventata un requisito effettivo, e non più solo una funzione aggiuntiva, in alcune parti dell’UE. Invoice Ninja genera i formati più comuni, tra cui ZUGFeRD e XRechnung, Facturae, FatturaPA e il formato generico EN16931. L’invio tramite la rete Peppol da un’istanza self-hosted passa dal relativo access point di Invoice Ninja: devi registrare la tua entità presso il servizio e acquistare crediti per ogni invio. Ad agosto 2026 si tratta quindi di un servizio a pagamento. Kimai supporta gli stessi formati tramite il suo plugin a pagamento. Le altre tre applicazioni oggi non producono alcuna fattura elettronica strutturata. Questo è il motivo principale per scegliere Invoice Ninja se emetti fatture nell’UE.

FAQ

Devo installare Crater o InvoiceShelf?

InvoiceShelf. Il ramo predefinito di Crater non contiene commit da 741 giorni al 21 agosto 2026 e il relativo issue tracker indirizza gli utenti al fork. InvoiceShelf utilizza la stessa licenza AGPL-3.0 e lo stesso modello dati, quindi il passaggio da uno all'altro richiede una migrazione del database, non una riscrittura. Le guide che raccomandano ancora Crater sono state scritte prima che il progetto interrompesse lo sviluppo.

Posso usare Invoice Ninja per la mia attività senza pagare?

Sì. Invoice Ninja self-hosted è completamente operativo 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, "$40 per year" secondo le parole del 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 terzi.

Perché le email con le 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, quindi 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. Se imposti l'indirizzo del cliente come mittente, Gmail rifiuta il messaggio con 550 5.7.1 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. Verifica la correzione trovando dkim=pass e spf=pass nell'header Authentication-Results di un messaggio di test.

Quale dovrei scegliere se fatturo a ore?

Kimai. È innanzitutto un sistema di rilevazione del tempo, quindi la fattura viene generata dalle registrazioni approvate del timesheet e le righe riportano il lavoro registrato. I template sono file DOCX, ODS o XLSX che progetti in un elaboratore di testi, una soluzione più semplice rispetto alla modifica del CSS. Il compromesso è che Kimai non offre un portale clienti né un gateway di pagamento, quindi devi inviare il PDF tramite email e ricevere il pagamento con bonifico. Anche Invoice Ninja registra il tempo e dispone di un portale, quindi scegli quest'ultimo se per te i pagamenti con carta online sono più importanti del dettaglio del timesheet.

Che cosa devo includere esattamente nei 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: applicazioni Laravel come Invoice Ninja e InvoiceShelf cifrano le credenziali memorizzate con APP_KEY, quindi il ripristino del database accanto a una chiave appena generata rende illeggibili le impostazioni del gateway di pagamento. Ripristina tutto una volta in un'istanza temporanea e apri una vecchia fattura, perché è l'unico modo per verificare che il backup funzioni.