01 lug 2025·7 min di lettura

Da time tracking a fattura: dalle registrazioni ai PDF brandizzati

Crea un'app che cattura le ore di progetto, le trasforma in fatture e genera PDF brandizzati pronti per i clienti.

Da time tracking a fattura: dalle registrazioni ai PDF brandizzati

Cosa stai costruendo e perché è importante

Un'app che passa dal time tracking alla fatturazione risolve un problema comune: le ore finiscono sparse tra calendari, chat e appunti. Poi arriva il giorno della fattura e qualcuno deve ricostruire il mese a mano. È qui che compaiono gli errori: tempo fatturabile dimenticato, tariffe sbagliate, righe duplicate o totali che non tornano.

Questa app è pensata per chi fattura a ore e vuole un processo ripetibile: freelance con più clienti, agenzie dove più persone registrano tempo sullo stesso progetto e team interni che addebitano tempo a clienti o dipartimenti.

L’obiettivo è pratico: catturare le registrazioni del tempo per progetto, aggregarle in un record fattura e generare un PDF brandizzato che il cliente capisca. Quando quel flusso è affidabile, la fatturazione cessa di essere una corsa mensile.

Seguire il principio “semplice prima di tutto” di solito significa:

  • Un solo modo per registrare il tempo (data, progetto, ore, nota)
  • Una sola regola tariffaria (per progetto o per persona)
  • Una fattura per cliente per periodo
  • Un solo layout PDF con il tuo logo e i dati aziendali
  • Stati chiari (Draft, Sent, Paid)

Un piccolo scenario: uno studio di due persone traccia il tempo per “Cliente A - Aggiornamenti Sito”. Ognuno registra voci durante la settimana. Il venerdì si crea una fattura per quel progetto e intervallo di date, l’app trasforma le voci in righe fattura e il PDF è pronto da inviare senza riscrivere nulla.

Se usi una piattaforma no-code come AppMaster, sistema prima i dati e il flusso di lavoro prima di aggiungere extra come ricevute, multi-valuta, sconti o approvazioni. Sono più facili da aggiungere una volta che il flusso core è veloce, accurato e difficile da rompere.

Funzionalità core da includere (e cosa evitare all'inizio)

Una piccola versione iniziale ti porta prima alle “fatture inviabili”. Concentrati su tre cose: catturare il tempo, trasformarlo in righe fattura chiare e produrre un PDF che il cliente possa leggere senza domande di follow-up.

Inizia con pochi record fondamentali (puoi rinominarli dopo, ma la struttura conta): Client, Project, Time Entry, Invoice e Invoice Line.

Mantieni semplice il workflow di fatturazione con un singolo campo stato sul record Invoice. Draft, Sent e Paid coprono la maggior parte dei team per molto tempo.

Le azioni indispensabili devono rispecchiare ciò che succede ogni settimana:

  • Registrare il tempo (l'inserimento manuale è di solito il più veloce da costruire e il più semplice da correggere)
  • Approvare il tempo (anche solo con uno stato “Approved”)
  • Creare la fattura dal tempo approvato
  • Esportare il PDF

“Brandizzato” non significa appariscente. Significa coerente e affidabile: logo, dati aziendali, numero e date della fattura, totali chiari e istruzioni di pagamento.

Cosa escludere all'inizio: tasse, sconti, più valute e allegati. Sono utili, ma introducono casi limite (arrotondamenti, regole giurisdizionali, tassi di cambio, storage di file) che rallentano la prima release.

Modello dati: i record necessari e i campi che contano

Un’app che trasforma il time tracking in fatture vive o muore sul suo modello dati. Mantienilo piccolo e prevedibile così i totali corrispondono sempre a quanto promesso al cliente.

Un set minimale di tabelle solitamente è il seguente:

  • Client: nome, email di fatturazione, indirizzo di fatturazione, valuta di default, termini di pagamento (es. Net 14)
  • Project: client_id, nome progetto, tariffa oraria di default (opzionale), flag attivo
  • Time entry: project_id, persona (nome o user_id), data, durata (ore), descrizione, rate_at_time, billable (sì/no), invoiced_invoice_id (vuoto fino alla fatturazione)
  • Invoice: client_id, project_id (opzionale), numero fattura, data emissione, data scadenza, stato, subtotal, tax, total

Le tariffe sono il punto dove le app diventano complicate. Scegli un approccio e mantienilo: tariffa per progetto, per persona o fissa per attività/servizio.

Anche se memorizzi una tariffa di default sul progetto o sulla persona, copia la tariffa effettiva in ogni registrazione del tempo come rate_at_time quando la voce viene creata (o approvata). Questo evita sorprese quando le tariffe cambiano in seguito. Le fatture devono riflettere ciò che era vero quando il lavoro è stato svolto.

Per le registrazioni del tempo, spesso puoi saltare uno stato separato e appoggiarti al fatto che invoiced_invoice_id sia vuoto o meno. Per le fatture, mantieni stati stringenti: Draft, Ready, Sent, Paid (e aggiungi Void se ti serve uno stato di cancellazione pulito).

In AppMaster, il Data Designer si mappa bene su PostgreSQL e rende più facile mantenere chiare le relazioni senza duplicare campi ovunque.

Catturare le registrazioni del tempo per progetto (UX semplice)

La cattura del tempo è il punto in cui l'app o risulta fluida o viene ignorata. Mantieni la prima versione noiosa e veloce: una schermata, un'azione primaria e il minor numero possibile di scelte.

Scegli un metodo di cattura per iniziare. L'inserimento manuale vince spesso all'inizio perché funziona per tutti ed è facile da rivedere. Un timer può arrivare dopo quando hai capito come le persone tracciano realmente le loro giornate. Se aggiungi un timer, consenti comunque modifiche manuali per le interruzioni mancate.

Rendi obbligatori i campi che proteggono la qualità della fatturazione:

  • Progetto (o cliente + progetto)
  • Data
  • Durata (ore e minuti)
  • Breve descrizione (qualcosa che il cliente riconoscerà)
  • Persona (se più di un collega registra tempo)

Decidi le regole di arrotondamento presto perché influenzano fiducia e totali. Un approccio comune è incrementi di 6 minuti (0,1 ora). Sii chiaro se arrotondi ogni voce o il totale giornaliero. Arrotondare ogni voce è più semplice da spiegare e verificare.

Se più persone partecipano alla fatturazione, aggiungi un passaggio di approvazione leggero. Una regola pratica: una volta approvate, le voci sono bloccate per le modifiche di default. Se qualcosa deve cambiare, richiedi un ruolo manager per riaprire la voce e registra chi ha modificato e perché.

Trasformare il tempo in righe fattura (regole di roll-up)

Fai dell'emissione fatture un'abitudine settimanale
Sostituisci fogli di calcolo manuali con un flusso ripetibile che il tuo team segua davvero.
Inizia ora

Il roll-up è il punto in cui i log grezzi diventano righe fattura comprensibili per il cliente. Mantieni le regole semplici e ripetibili così puoi fidarti di ogni fattura generata.

Inizia con un'azione: scegli un cliente e un intervallo di date, poi estrai solo le registrazioni non fatturate che corrispondono. Quel filtro è la guardia che previene la doppia fatturazione. Se una voce è priva di cliente o progetto, trattala come “non pronta per la fatturazione” e lasciala fuori dal roll-up finché non viene corretta.

Come raggruppare le voci in righe fattura

Il raggruppamento determina quante righe creerai e quanto è facile per il cliente rivederle. Scegli un default e aggiungi un interruttore opzionale se serve flessibilità.

Opzioni comuni di raggruppamento:

  • Per progetto
  • Per persona (utile quando le tariffe differiscono)
  • Per giorno o settimana
  • Per task/categoria (Design vs Sviluppo)

Qualunque sia la scelta, ogni riga dovrebbe mostrare: un'etichetta chiara, ore totali, tariffa e importo riga. Se le tariffe possono cambiare, usa il valore rate_at_time salvato su ogni voce (o una tabella tariffe con date di efficacia), non una singola “tariffa corrente”.

Segnare come fatturato (senza chiuderti le opzioni)

Quando aggiungi le voci a una fattura, salva l'ID della fattura su ogni time entry. Questo crea una traccia audit e impedisce che la stessa voce venga prelevata di nuovo.

Le correzioni capitano. Se rimuovi una riga da una fattura, non cancellare la cronologia. Scollega le voci temporali interessate (pulisci l'ID fattura), ricalcola i totali e salva una breve nota come “Rimossi 2.0h, progetto sbagliato”.

In AppMaster, questo si adatta bene come singolo processo business: query delle voci non fatturate, raggruppamento, creazione delle righe fattura e poi aggiornamento di ogni voce con il riferimento alla fattura.

Record fattura: totali, numerazione e stato

Il record fattura è il contenitore che puoi inviare, tracciare e verificare in seguito. Dovrebbe rimanere stabile anche se qualcuno modifica il nome di un progetto o cambia una tariffa di default.

Un'intestazione fattura pratica include:

  • Numero fattura (unico, leggibile)
  • Data emissione e data di scadenza
  • Dati del destinatario (nome cliente, indirizzo, partita IVA se necessario)
  • Note (istruzioni di pagamento, una breve frase di ringraziamento)
  • Valuta (e opzionalmente un tasso di cambio salvato se fatturi a livello internazionale)

Mantieni i totali prevedibili. Il subtotal è la somma delle righe fattura. Poi applica lo sconto (importo fisso o percentuale), calcola l’imposta (spesso sul subtotal scontato) e memorizza il totale finale. Salva l'esatto valore di imposta e gli sconti usati così puoi riprodurre la fattura in seguito.

La numerazione non deve essere complicata. Scegli uno schema e mantienilo: sequenziale (000123), per anno (2026-00123) o prefisso cliente più sequenza (ACME-014). La coerenza conta più della perfezione.

Lo stato dovrebbe rimanere focalizzato su comunicazione e controllo interno:

  • Draft (modificabile, non inviato)
  • Ready (totali bloccati)
  • Sent (condivisa con il cliente)
  • Paid (pagamento confermato)
  • Overdue (scaduta)
  • Void (annullata, conservata per cronologia)

Generare un PDF brandizzato che il cliente capisca

Deploy su cloud o self-host
Esegui la tua app di fatturazione su AppMaster Cloud o sul tuo cloud quando sei pronto.
Lancia app

Un buon PDF di fattura risponde velocemente a due domande: cosa viene fatturato e come pagare. Genera il PDF dal record fattura (non dalle voci temporali grezze) così il documento corrisponde sempre a numero fattura, totali e stato.

La maggior parte dei clienti si aspetta sempre gli stessi blocchi:

  • Intestazione con il nome della tua attività, numero fattura e data
  • Dati cliente (azienda, nome contatto, indirizzo di fatturazione, partita IVA se necessaria)
  • Voci di linea (descrizione, quantità o ore, tariffa, totale riga)
  • Totali (subtotal, imposta, sconto, totale finale)
  • Termini di pagamento (data di scadenza, metodi accettati, nota su eventuali penali)

Il brand è importante, ma la leggibilità lo è di più. Mantieni un solo colore di accento, usa un font pulito e rendi i totali facili da identificare.

I problemi di impaginazione emergono con dati reali. Testa con descrizioni lunghe e oltre 30 righe. Assicurati che le intestazioni di colonna si ripetano sulle nuove pagine e che il blocco dei totali resti unito.

Se generi PDF in AppMaster, tratta il PDF come un artefatto della fattura: salva il file (o il riferimento allo storage) sul record fattura con timestamp e versione generata. Così è facile reinviare esattamente il documento che il cliente ha visto.

Piano di costruzione passo-passo (workflow no-code)

Costruisci il tuo MVP time-to-invoice
Modella clienti, progetti, registrazioni del tempo e fatture in AppMaster e rilascia una prima versione rapidamente.
Inizia a costruire

Decidi qual è la “fonte di verità”. Le registrazioni del tempo sono fatti grezzi. Le fatture sono uno snapshot che puoi inviare e verificare in seguito.

1) Modella prima i dati

Crea le tabelle e le relazioni, poi aggiungi alcuni campi di qualità quando le basi sono stabili:

  • Clients
  • Projects
  • Time Entries
  • Invoices
  • Invoice Lines

2) Costruisci due schermate semplici

Mantieni l'interfaccia minima:

  • Form per l'inserimento del tempo: progetto, data, durata, note, salva
  • Revisione fattura: cliente, periodo, righe, totali, stato

Un'interfaccia web è di solito sufficiente per amministrazione e review. Aggiungi schermi mobile più tardi se le persone registrano il tempo in movimento.

3) Automatizza la logica di roll-up

Costruisci un flusso tipo: seleziona cliente + intervallo date, recupera le voci non fatturate, raggruppale, crea le righe fattura. Segna le voci come fatturate solo dopo che la fattura è approvata o spostata in Ready.

4) Genera e salva il PDF

Aggiungi un'azione “Genera PDF” che prenda intestazione fattura, dettagli cliente e righe in un template, poi salvi l'output sul record fattura.

Esempio: dai log settimanali alla fattura pronta per il cliente

Un'agenzia di 3 persone ha un cliente, Northstar Co, e fattura per due progetti su due settimane: Website Refresh e Monthly Support. Il team è Alex (design), Priya (dev) e Sam (PM). Tutti registrano tempo quotidianamente scegliendo cliente, progetto, data e una breve nota.

Ogni giorno, le voci sono salvate come Draft. Il venerdì pomeriggio Sam apre una schermata di revisione filtrata su “Questa settimana, Northstar Co”. Corregge due note (“Homepage hero” invece di “Hero”), conferma billable vs non-billable e blocca la settimana.

Ecco un esempio di voci della settimana:

DatePersonProjectHoursNote
MonPriyaWebsite Refresh2.5Header layout fixes
TueAlexWebsite Refresh3.0New homepage mock
TueSamMonthly Support1.0Client call
WedPriyaWebsite Refresh4.0Contact form logic
ThuAlexMonthly Support1.5Banner update
ThuPriyaMonthly Support2.0Email template tweak
FriSamWebsite Refresh1.0QA and handoff

Quando Sam clicca “Create invoice”, l'app raggruppa le voci in righe fattura usando regole semplici: raggruppa per progetto e tariffa fatturabile, somma le ore e riporta una breve descrizione. La fattura risulta con 3 righe:

LineDescriptionQtyRateAmount
1Website Refresh (Design)3.0 hrs$120$360
2Website Refresh (Development/PM)7.5 hrs$140$1,050
3Monthly Support4.5 hrs$110$495

Il sistema assegna un numero fattura (es. NS-2026-014), calcola subtotal e tasse e pone lo stato su Ready. Un altro clic genera un PDF brandizzato (logo, indirizzo cliente, dettagli righe, totali, note di pagamento). Dopo l'invio, lo stato diventa Sent e le registrazioni temporali sottostanti vengono marcate come invoiced così non possono essere fatturate due volte.

Errori comuni e come evitarli

Itera velocemente con codice rigenerato
Rigenera codice sorgente pulito quando i requisiti cambiano, senza riscrivere tutto da zero.
Provalo

La maggior parte dei problemi non è di matematica. È di processo.

Non bloccare le voci fatturate. Se le persone possono modificare o rieseguire la selezione delle stesse voci per una nuova fattura, la doppia fatturazione prima o poi accade. Risolvilo con un riferimento fattura su ogni time entry e nascondi le voci fatturate dalla vista “pronte per la fatturazione”.

Riscrivere la storia quando le tariffe cambiano. Se calcoli usando solo la tariffa “corrente” del progetto o dell'utente, la modifica di quella tariffa cambierà le vecchie fatture. Copia la tariffa effettiva in rate_at_time su ogni voce.

Modificare il tempo approvato senza traccia. Aggiungi “Approved by”, “Approved at” e una breve nota di modifica per le modifiche dopo l'approvazione.

PDF che si spezzano con dati reali. Descrizioni lunghe, molte righe e numeri grandi mettono alla prova il template.

Rimedi rapidi che prevengono la maggior parte dei problemi di layout:

  • Imposta una lunghezza massima della descrizione e sposta l’eccesso in una sezione note
  • Consenti il wrapping e testa con oltre 30 righe
  • Mantieni l'intestazione compatta così la tabella ha spazio
  • Usa formati numerici coerenti (valuta, decimali)

Un flusso di stato confuso. Senza regole chiare, le fatture vengono inviate due volte o mai.

Un flusso semplice e sicuro è: Draft -> Ready -> Sent -> Paid. Consenti i roll-up solo in Draft e la generazione PDF solo quando i totali sono bloccati.

Breve checklist e prossimi passi pratici

Prima di inviare una fattura, fai una rapida revisione. Previene gli errori più comuni: totali sbagliati, dettagli mancanti e PDF che sembrano OK a schermo ma si rompono in stampa.

Checklist pre-invio:

  • I dati cliente sono completi (ragione sociale, indirizzo di fatturazione, contatto giusto)
  • Il periodo fattura è corretto (date di inizio e fine corrispondono al lavoro)
  • I totali sono coerenti (subtotal, imposta, totale finale corrispondono a voci, tariffe e arrotondamenti)
  • Nessun tempo è dimenticato o duplicato (nulla non fatturato che dovrebbe esserlo, nulla incluso due volte)
  • I campi operativi sono a posto (numero fattura unico, stato corretto, PDF salvato sulla fattura)

Poi visualizza il PDF con occhio da stampa. Controlla posizione del logo, indirizzi lunghi, wrapping della tabella e interruzioni di pagina. Testa sia una fattura breve (1-2 righe) sia una lunga (20+ righe).

Prossimi passi una volta che le basi sono stabili:

  • Invia le fatture via email con un template coerente
  • Aggiungi pagamenti Stripe e marca le fatture come Paid automaticamente
  • Aggiungi permessi in modo che solo i ruoli giusti possano modificare tariffe, approvare tempo o cambiare stati

Se vuoi costruire e iterare velocemente senza riscrivere tutto da zero, AppMaster (appmaster.io) è un'opzione pratica per creare un'app di fatturazione no-code con un database reale, logica business e generazione PDF, poi rigenerare codice sorgente pulito man mano che i requisiti cambiano.

Se puoi migliorare una sola cosa questa settimana, rendi impossibile perdere il “tempo non fatturato”. Quello da solo salva ore e protegge il fatturato.

FAQ

Qual è il flusso più semplice per trasformare le registrazioni del tempo in una fattura?

Inizia assicurandoti che ogni registrazione abbia progetto, data, durata e una breve descrizione. Poi crea una fattura selezionando un cliente e un intervallo di date, estraendo solo le voci non fatturate, raggruppandole in linee fattura e generando il PDF dallo snapshot della fattura.

Di quali tabelle dati ho bisogno per una semplice app time-to-invoice?

Usa cinque record: Client, Project, Time Entry, Invoice e Invoice Line. Mantieni i campi minimi ma includi rate_at_time su ogni registrazione e un riferimento invoiced_invoice_id così la cronologia di fatturazione resta coerente ed eviti la doppia fatturazione.

Come gestisco le tariffe orarie senza riscrivere la storia quando le tariffe cambiano?

Memorizza la tariffa usata al momento del lavoro su ogni registrazione (ad esempio, rate_at_time). I valori di default possono stare sul progetto o sulla persona, ma le fatture devono sempre calcolare dalla tariffa salvata così le vecchie fatture non cambiano se le tariffe vengono aggiornate.

Come dovrei arrotondare il tempo per evitare controversie sui totali delle fatture?

Scegli una regola di arrotondamento e mantienila, poi rendila visibile nel processo. Un approccio comune è arrotondare ogni voce a incrementi di 6 minuti (0,1 ora) perché è facile da verificare e mantiene i totali prevedibili.

Quali stati di fattura devo usare nella prima versione?

Usa un singolo campo stato sulle fatture e tienilo semplice: Draft, Ready, Sent, Paid (aggiungi Void solo se servono cancellazioni). Definisci regole chiare come “roll-up solo in Draft” e “blocca i totali in Ready” così le persone non cambiano accidentalmente ciò che è già stato inviato.

Come evito di fatturare due volte le stesse registrazioni?

Filtra la creazione della fattura per prendere solo le registrazioni con invoiced_invoice_id vuoto, e imposta quel campo non appena le voci sono associate a una fattura. Nascondi poi le voci già fatturate dalla vista “pronte per la fatturazione” così lo stesso tempo non può essere selezionato di nuovo.

Cosa deve includere un PDF di fattura brandizzato e amichevole per il cliente?

Genera il PDF dalla scheda fattura, non dalle voci temporali grezze, così corrisponderà sempre a numero fattura, totali e stato. Includi un’intestazione chiara, dettagli del cliente, voci di linea, totali e istruzioni di pagamento. Testa con descrizioni lunghe e oltre 30 righe per intercettare problemi di layout.

Qual è il modo più sicuro per correggere errori dopo che una fattura è stata creata?

Non eliminare la cronologia. Scollega le registrazioni interessate dalla fattura (cancella il riferimento), rigenera le linee e i totali, e registra una breve nota di correzione così puoi spiegare cosa è cambiato senza perdere la traccia audit.

Devo costruire un timer o iniziare con l’inserimento manuale?

Parti con l’inserimento manuale perché è veloce da costruire e facile da correggere. Un timer aggiunge casi limite (stop mancati, modifiche, problemi di dispositivo), quindi è meglio aggiungerlo dopo che il flusso principale produce fatture accurate.

Quali funzionalità dovrei escludere dalla versione 1 per rilasciare prima?

Costruisci prima il flusso principale: rilevazione tempo, approvazione/blocco, creazione fattura da tempo non fatturato e generazione PDF. Salta inizialmente tasse, multi-valuta, sconti e allegati perché introducono casi limite che rallentano e complicano i calcoli.

Facile da avviare
Creare qualcosa di straordinario

Sperimenta con AppMaster con un piano gratuito.
Quando sarai pronto potrai scegliere l'abbonamento appropriato.

Iniziare