Do rastreamento de tempo à fatura: das entradas aos PDFs com a sua marca
Crie um app que rastreia horas de projetos, transforma-as em faturas e gera PDFs com a sua marca para clientes.

O que você está construindo e por que isso importa
Um app que vai do rastreamento de tempo à fatura resolve uma confusão comum: horas espalhadas por calendários, chats e notas. Quando chega o dia de faturar, alguém precisa reconstruir o mês manualmente. É aí que aparecem erros: tempo faturável perdido, tarifas erradas, linhas duplicadas ou totais que não batem.
Este app é para quem cobra por hora e quer um processo repetível: freelancers com vários clientes, agências com várias pessoas registrando tempo no mesmo projeto e equipes internas que repassam horas a clientes ou departamentos.
O objetivo é prático: capturar entradas de tempo por projeto, agregá-las em um registro de fatura e gerar um PDF com a sua marca que o cliente entenda. Quando esse fluxo é confiável, faturar para de ser uma correria mensal.
Manter o “simples primeiro” geralmente significa:
- Uma forma de registrar tempo (data, projeto, horas, nota)
- Uma regra de tarifa (por projeto ou por pessoa)
- Uma fatura por cliente por período
- Um layout de PDF com seu logo e dados da empresa
- Status claros (Draft, Sent, Paid)
Um cenário pequeno: um estúdio de duas pessoas registra tempo para “Cliente A - Atualizações de Site.” Cada pessoa lança entradas durante a semana. Na sexta, você cria a fatura para aquele projeto e intervalo de datas, o app transforma as entradas em linhas de fatura e o PDF fica pronto para enviar sem reescrever nada.
Se você está usando uma plataforma no-code como AppMaster, acerte os dados e o fluxo antes de adicionar extras como recibos, multi-moeda, descontos ou aprovações. Esses itens são mais fáceis de incluir depois que o fluxo principal for rápido, preciso e resistente a erros.
Recursos principais para incluir (e o que deixar de fora no começo)
Uma primeira versão pequena faz com que você envie faturas mais cedo. Foque em três coisas: capturar tempo, transformar tempo em linhas de fatura claras e produzir um PDF que o cliente leia sem perguntas de acompanhamento.
Comece com alguns registros essenciais (você pode renomear depois, mas a estrutura importa): Client, Project, Time Entry, Invoice e Invoice Line.
Mantenha o fluxo de fatura simples com um único campo de status no registro Invoice. Draft, Sent e Paid cobrem a maior parte das equipes por muito tempo.
Suas ações essenciais devem refletir o que acontece toda semana:
- Registrar tempo (entrada manual costuma ser o mais rápido de construir e o mais fácil de corrigir)
- Aprovar tempo (mesmo que seja apenas um status “Approved”)
- Criar fatura a partir do tempo aprovado
- Exportar PDF
“Com marca” não significa algo extravagante. Significa consistente e confiável: logo, dados da empresa, número e datas da fatura, totais claros e instruções de pagamento.
O que deixar fora no início: impostos, descontos, múltiplas moedas e anexos. São úteis, mas introduzem casos de borda (arredondamento, regras de jurisdição, taxas de câmbio, armazenamento de arquivos) que atrasam o primeiro lançamento.
Modelo de dados: os registros que você precisa e os campos que importam
Um app de rastreamento de tempo para faturas vive ou morre pelo seu modelo de dados. Mantenha-o pequeno e previsível para que os totais sempre batam com o que você prometeu ao cliente.
Um conjunto mínimo de tabelas geralmente fica assim:
- Client: name, billing email, billing address, default currency, payment terms (como Net 14)
- Project: client_id, project name, default hourly rate (opcional), active flag
- Time entry: project_id, person (name or user_id), date, duration (hours), description, rate_at_time, billable (yes/no), invoiced_invoice_id (vazio até ser faturado)
- Invoice: client_id, project_id (opcional), invoice number, issue date, due date, status, subtotal, tax, total
As tarifas são onde apps ficam complicados. Escolha uma abordagem e mantenha-a: tarifa por projeto, por pessoa ou fixa por tarefa/serviço.
Mesmo se você armazenar uma tarifa padrão no projeto ou na pessoa, copie a tarifa real para cada entrada de tempo como rate_at_time quando a entrada for criada (ou aprovada). Isso evita surpresas quando as tarifas mudarem depois. As faturas devem refletir o que era verdade quando o trabalho aconteceu.
Para entradas de tempo, você pode frequentemente pular um status separado e confiar em invoiced_invoice_id estar vazio ou não. Para faturas, mantenha os status enxutos: Draft, Ready, Sent, Paid (e adicione Void se precisar de um estado claro de cancelamento).
No AppMaster, o Data Designer mapeia bem para PostgreSQL e facilita manter relacionamentos claros sem duplicar campos por toda parte.
Capturando entradas de tempo por projeto (UX simples)
A captura de tempo é onde o app ou fica agradável de usar ou é ignorado. Mantenha a primeira versão simples e rápida: uma tela, uma ação primária e o mínimo de escolhas possível.
Escolha um método de captura para começar. Entrada manual costuma vencer no início porque funciona para todos e é fácil de revisar. Um timer pode vir depois, quando você souber como as pessoas realmente acompanham o dia. Se adicionar um timer, permita edições manuais para paradas perdidas.
Faça os campos que protegem a qualidade do faturamento como obrigatórios:
- Projeto (ou cliente + projeto)
- Data
- Duração (horas e minutos)
- Descrição curta (algo que o cliente reconhecerá)
- Pessoa (se mais de uma pessoa registrar tempo)
Decida regras de arredondamento cedo porque elas afetam confiança e totais. Uma abordagem comum é incrementos de 6 minutos (0,1 hora). Seja claro sobre arredondar cada entrada ou o total diário. Arredondar cada entrada é mais simples de explicar e auditar.
Se mais de uma pessoa mexer no faturamento, adicione uma etapa leve de aprovação. Uma regra prática: uma vez aprovado, entradas ficam bloqueadas por padrão. Se algo precisar mudar, exija um papel de gerente para reabrir e registre quem alterou e por quê.
Transformando tempo em linhas de fatura (regras de agregação)
O roll-up é onde logs brutos viram linhas de fatura que o cliente consegue entender. Mantenha as regras simples e repetíveis para confiar em cada fatura que você gerar.
Comece com uma ação: escolha um cliente e um intervalo de datas, e puxe apenas as entradas não faturadas que correspondam. Esse filtro é a trava que evita faturar duas vezes. Se uma entrada não tiver cliente ou projeto, trate-a como “não pronta para faturar” e mantenha fora do roll-up até corrigir.
Como agrupar entradas em linhas de fatura
O agrupamento determina quantas linhas você cria e quão fácil é para o cliente revisar. Escolha um padrão e adicione uma opção extra se precisar de flexibilidade.
Opções comuns de agrupamento:
- Por projeto
- Por pessoa (útil quando tarifas diferem)
- Por dia ou semana
- Por tarefa/categoria (Design vs Development)
Seja qual for sua escolha, cada linha deve mostrar: um rótulo claro, horas totais, tarifa e valor da linha. Se tarifas podem mudar, use rate_at_time salvo em cada entrada (ou uma tabela de tarifas com datas de vigência), não uma “tarifa atual” única.
Marcar como faturado (sem se apertar)
Quando você adiciona entradas a uma fatura, armazene o ID da fatura em cada entrada de tempo. Isso cria um rastro de auditoria e impede que a mesma entrada seja puxada novamente.
Correções acontecem. Se você remover uma linha de uma fatura, não apague o histórico. Desvincule as entradas afetadas (limpe o ID da fatura), recalcule os totais e grave uma nota curta como “Removed 2.0h, wrong project”.
No AppMaster, isso se encaixa bem como um único processo de negócio: consultar entradas não faturadas, agrupá-las, criar linhas de fatura e então atualizar cada entrada com a referência da fatura.
Registros de fatura: totais, numeração e status
O registro de fatura é o contêiner que você pode enviar, acompanhar e auditar depois. Ele deve permanecer estável mesmo se alguém editar o nome do projeto ou mudar uma tarifa padrão.
Um cabeçalho prático de fatura inclui:
- Número da fatura (único, fácil de ler)
- Data de emissão e data de vencimento
- Dados do bill-to (nome do cliente, endereço de cobrança, ID fiscal se necessário)
- Notas (instruções de pagamento, uma linha curta de agradecimento)
- Moeda (e opcionalmente uma taxa de câmbio salva se você faturar internacionalmente)
Mantenha os totais previsíveis. Subtotal é a soma das linhas da fatura. Aplique desconto (valor fixo ou percentual), calcule imposto (frequentemente sobre o subtotal com desconto) e armazene o total final. Salve a taxa exata de imposto e os valores de desconto usados para reproduzir a fatura depois.
A numeração de faturas não precisa ser sofisticada. Escolha um padrão e mantenha-o: sequencial (000123), por ano (2026-00123) ou prefixo do cliente mais sequência (ACME-014). Consistência importa mais do que perfeição.
Status deve ficar focado em comunicação e controle interno:
- Draft (editável, não enviado)
- Ready (totais bloqueados)
- Sent (compartilhado com o cliente)
- Paid (pagamento confirmado)
- Overdue (vencido)
- Void (cancelado, mantido para histórico)
Gerando um PDF com a sua marca que o cliente entenda
Um bom PDF de fatura responde rapidamente a duas perguntas: o que está sendo cobrado e como pagar. Gere o PDF a partir do registro da fatura (não das entradas brutas) para que o documento sempre bata com o número, totais e status da fatura.
A maioria dos clientes espera os mesmos blocos toda vez:
- Cabeçalho com nome da empresa, número da fatura e data
- Dados do cliente (empresa, contato, endereço de cobrança, ID fiscal se necessário)
- Itens de linha (descrição, quantidade ou horas, tarifa, total da linha)
- Totais (subtotal, imposto, desconto, total geral)
- Termos de pagamento (data de vencimento, métodos aceitos, nota de multa por atraso se usar)
Marca importa, mas legibilidade importa mais. Use uma cor de destaque, fonte limpa e torne os totais fáceis de visualizar.
Problemas de layout aparecem com dados reais. Teste com descrições longas e 30+ linhas. Garanta que cabeçalhos de coluna se repitam em novas páginas e que o bloco de totais fique junto.
Se você gera PDFs no AppMaster, trate o PDF como um artefato da fatura: salve o arquivo (ou referência de armazenamento) no registro da fatura com timestamp e versão gerada. Isso facilita reenviar exatamente o documento que o cliente recebeu.
Plano passo a passo (fluxo no-code)
Decida qual é a “fonte da verdade.” Entradas de tempo são fatos brutos. Faturas são snapshots que você pode enviar e auditar depois.
1) Modele os dados primeiro
Crie tabelas e relacionamentos, depois adicione alguns campos de qualidade quando o básico estiver estável:
- Clients
- Projects
- Time Entries
- Invoices
- Invoice Lines
2) Construa duas telas simples
Mantenha a UI mínima:
- Formulário de entrada de tempo: projeto, data, duração, notas, salvar
- Revisão de fatura: cliente, período, linhas, totais, status
Uma interface web geralmente basta para administração e revisão. Adicione telas mobile depois se as pessoas registrarem tempo em movimento.
3) Automatize a lógica de roll-up
Construa um fluxo como: selecionar cliente + intervalo, buscar entradas não faturadas, agrupá-las, criar linhas de fatura. Marque entradas como faturadas apenas depois que a fatura for aprovada ou movida para Ready.
4) Gere e armazene o PDF
Adicione uma ação “Generate PDF” que puxe cabeçalho da fatura, dados do cliente e linhas para um template, então salve o resultado no registro da fatura.
Exemplo: de registros semanais a uma fatura pronta para o cliente
Uma agência de 3 pessoas tem um cliente, Northstar Co, e fatura por dois projetos ao longo de duas semanas: Website Refresh e Monthly Support. A equipe é Alex (design), Priya (dev) e Sam (PM). Todos registram tempo diariamente, escolhendo cliente, projeto, data e uma nota curta.
Cada dia, as entradas são salvas como Draft. Na sexta à tarde, Sam abre uma tela de revisão filtrada para “Esta semana, Northstar Co”. Ele corrige duas notas (“Homepage hero” em vez de “Hero”), confirma billable vs non-billable e bloqueia a semana.
Aqui está uma amostra de entradas da semana:
| Date | Person | Project | Hours | Note |
|---|---|---|---|---|
| Mon | Priya | Website Refresh | 2.5 | Header layout fixes |
| Tue | Alex | Website Refresh | 3.0 | New homepage mock |
| Tue | Sam | Monthly Support | 1.0 | Client call |
| Wed | Priya | Website Refresh | 4.0 | Contact form logic |
| Thu | Alex | Monthly Support | 1.5 | Banner update |
| Thu | Priya | Monthly Support | 2.0 | Email template tweak |
| Fri | Sam | Website Refresh | 1.0 | QA and handoff |
Quando Sam clica em “Create invoice”, o app agrega as entradas em linhas de fatura usando regras simples: agrupar por projeto e tarifa, somar horas e trazer uma descrição curta. A fatura termina com 3 linhas:
| Line | Description | Qty | Rate | Amount |
|---|---|---|---|---|
| 1 | Website Refresh (Design) | 3.0 hrs | $120 | $360 |
| 2 | Website Refresh (Development/PM) | 7.5 hrs | $140 | $1,050 |
| 3 | Monthly Support | 4.5 hrs | $110 | $495 |
O sistema atribui um número de fatura (como NS-2026-014), calcula subtotal e imposto e define o status como Ready. Mais um clique gera um PDF com marca (logo, endereço do cliente, detalhes das linhas, totais, instruções de pagamento). Após o envio, o status muda para Sent e as entradas de tempo subjacentes são marcadas como faturadas para que não possam ser cobradas duas vezes.
Erros comuns e como evitá-los
A maioria dos problemas não é matemática. São problemas de fluxo.
Não bloquear entradas já faturadas. Se as pessoas puderem editar ou selecionar de novo as mesmas entradas para uma nova fatura, o faturamento duplicado eventualmente acontece. Resolva com uma referência de fatura em cada entrada e oculte entradas faturadas da visão “pronto para faturar”.
Reescrever o histórico quando tarifas mudam. Se você calcular usando apenas a tarifa “atual” do projeto ou usuário, mudar essa tarifa alterará faturas antigas. Copie a tarifa efetiva em rate_at_time em cada entrada.
Editar tempo aprovado sem rastro de auditoria. Adicione “Approved by”, “Approved at” e uma nota curta de alteração para edições após aprovação.
PDFs que quebram com dados reais. Descrições longas, muitas linhas e números grandes vão estressar seu template.
Correções rápidas que evitam a maioria dos problemas de layout:
- Defina um comprimento máximo para descrições e mova o excesso para uma seção de notas
- Permita quebra de linha e teste com 30+ linhas
- Mantenha o cabeçalho compacto para que a tabela tenha espaço
- Use formatos de número consistentes (moeda, decimais)
Um fluxo de status ruim. Sem regras claras, faturas são enviadas duas vezes ou nunca enviadas.
Um fluxo simples e seguro é: Draft -> Ready -> Sent -> Paid. Permita roll-ups apenas em Draft e geração de PDF apenas quando os totais estiverem bloqueados.
Uma checklist curta e próximos passos práticos
Antes de enviar uma fatura, faça uma revisão rápida. Isso previne os problemas mais comuns: totais errados, detalhes faltando e PDFs que parecem corretos na tela, mas quebram ao imprimir.
Checklist pré-envio:
- Dados do cliente completos (nome legal, endereço de cobrança, contato certo)
- Período da fatura correto (datas de início e fim batem com o trabalho)
- Totais consistentes (subtotal, imposto e total batem com entradas, tarifas e arredondamento)
- Nenhum tempo está faltando ou duplicado (nada deixado sem faturar, nada incluído duas vezes)
- Campos operacionais limpos (número de fatura único, status correto, PDF salvo na fatura)
Depois, visualize o PDF com “olhos de impressão”. Verifique posicionamento do logo, endereços longos, quebra de tabela e quebras de página. Teste tanto uma fatura curta (1–2 linhas) quanto uma longa (20+ linhas).
Próximos passos, quando o básico estiver estável:
- Envie faturas por e-mail com um template consistente
- Integre pagamentos com Stripe e marque faturas como Paid automaticamente
- Adicione permissões para que somente papéis certos possam editar tarifas, aprovar tempo ou mudar status
Se quiser construir e iterar rapidamente sem escrever tudo do zero, AppMaster (appmaster.io) é uma opção prática para criar um app de faturamento no-code com um banco de dados real, lógica de negócio e geração de PDF, e depois regenerar código-fonte limpo conforme os requisitos mudam.
Se melhorar apenas uma coisa esta semana, torne impossível deixar tempo não faturado passar despercebido. Isso já economiza horas e protege receita.
FAQ
Comece garantindo que cada lançamento de tempo tenha projeto, data, duração e uma descrição curta. Depois, crie a fatura selecionando cliente e período, extraia apenas as entradas não faturadas, agrupe-as em linhas de fatura e gere o PDF a partir do snapshot da fatura.
Use cinco registros: Client, Project, Time Entry, Invoice e Invoice Line. Mantenha os campos mínimos, mas inclua rate_at_time em cada entrada de tempo e uma referência invoiced_invoice_id para que o histórico de faturamento permaneça consistente e evite faturamento duplo.
Armazene a tarifa usada no momento do trabalho em cada entrada de tempo (por exemplo, rate_at_time). Padrões podem ficar no projeto ou pessoa, mas as faturas devem calcular sempre a partir da tarifa salva para que faturas antigas não mudem quando as tarifas forem atualizadas.
Escolha uma regra de arredondamento e mantenha-a, depois deixe isso visível no processo. Uma abordagem comum é arredondar cada lançamento para incrementos de 6 minutos (0,1 hora), pois é fácil de auditar e mantém os totais previsíveis.
Use um único campo de status nas faturas e mantenha-o enxuto: Draft, Ready, Sent, Paid (adicione Void apenas se precisar de cancelamentos). Defina regras claras como “roll-up só em Draft” e “bloquear totais em Ready” para evitar que as pessoas mudem o que já foi enviado.
Filtre a criação da fatura para puxar apenas entradas onde invoiced_invoice_id está vazio, e defina esse campo assim que as entradas forem anexadas a uma fatura. Também oculte entradas faturadas da visão “pronto para faturar” para que o mesmo tempo não possa ser selecionado novamente.
Gere o PDF a partir do registro da fatura, não das entradas brutas, para que ele sempre bata com número, totais e status. Inclua cabeçalho claro, dados do cliente, itens de linha, totais e instruções de pagamento. Teste com descrições longas e 30+ linhas para pegar quebras de layout.
Não apague o histórico. Desvincule as entradas de tempo afetadas da fatura (limpe a referência de fatura), regenere as linhas e totais da fatura, e registre uma nota curta de correção para explicar o que mudou sem perder o rastro de auditoria.
Comece com entrada manual porque é rápido de construir e fácil de corrigir. Um timer adiciona casos de borda (paradas perdidas, edições, problemas de dispositivo), por isso é melhor adicioná-lo depois que o fluxo principal produzir faturas precisas de forma confiável.
Construa primeiro o fluxo principal: captura de tempo, aprovação/bloqueio, criação de fatura a partir do tempo não faturado e geração de PDF. Deixe impostos, multi-moeda, descontos e anexos para depois, pois eles introduzem casos de borda que atrasam o desenvolvimento e complicam os cálculos.


