Lançar Boleto e Comprovante no Caixa com IA
Lançamento manual sempre acaba quebrando porque ninguém quer parar pra digitar 12 boletos por dia. Tirar foto e a IA cuidar do resto é o caminho mais curto pra um fluxo de caixa que de fato existe.
Por que entrada manual sempre acaba quebrando
- Digitar lançamento é fricção pura, depois de 2 dias todo mundo abandona
- Lançamento atrasado vira fim de mês surpresa
- Categorização errada quebra o relatório por categoria
- Múltiplos sócios usando o mesmo sistema = padrão diferente, dado sujo
- Anexar comprovante exige outro fluxo manual, fica perdido
Stack
- Next.js 16 com App Router
- Drizzle ORM + Neon Postgres
- shadcn/ui + Tailwind CSS v4
- Anthropic Claude API com Vision (claude-3-5-sonnet)
- UploadThing ou Vercel Blob pra armazenar a imagem
- Stack Auth pra login
- Deploy Vercel
Prompt completo para Claude Code
Cole no Claude Code dentro de uma pasta vazia:
Crie um sistema de lançamento financeiro com OCR por IA em Next.js 16.
Schema (Drizzle + Neon):
transactions (
id text primary key,
user_id text not null,
type text not null, // entrada | saida
amount integer not null, // em centavos
due_date date not null,
paid_at date,
vendor text,
category text,
description text,
attachment_url text, // url do comprovante salvo
status text default 'pendente', // pendente | pago | atrasado
created_at timestamp default now()
)
attachments (
id text primary key,
user_id text not null,
transaction_id text references transactions(id),
file_url text not null,
file_type text not null, // image | pdf
ocr_result jsonb, // o JSON cru retornado pela IA
created_at timestamp default now()
)
Fluxo principal:
1. Tela /novo: input file que aceita foto (câmera ou galeria) ou PDF
2. Upload via UploadThing pra storage seguro
3. Server Action processUpload(fileUrl):
a) baixa o arquivo no servidor
b) se for PDF, converte primeira página em imagem (sharp ou pdf-to-png)
c) chama Claude com Vision:
const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages: [{
role: 'user',
content: [
{ type: 'image', source: { type: 'base64', media_type: 'image/png', data: base64 } },
{
type: 'text',
text: `Você lê boletos, notas fiscais e comprovantes.
Extraia em JSON:
{
'type': 'saida' (boleto a pagar) ou 'entrada' (recebimento),
'amount_brl': valor em reais (float),
'due_date': 'YYYY-MM-DD' (data de vencimento),
'paid_at': 'YYYY-MM-DD' ou null (data de pagamento se for comprovante),
'vendor': nome do fornecedor/cliente,
'category': uma de [aluguel, energia, agua, internet, salarios, fornecedor, impostos, marketing, outros],
'description': em 1 linha o que é,
'confidence': 0 a 1 (quão certo você está)
}
Se não conseguir ler, retorne { error: 'motivo' }. Não invente valor.`
}
]
}})
d) se confidence < 0.7 OU response contém error: voltar pra tela de fallback
onde o usuário digita manualmente
e) se confidence >= 0.7: mostrar preview em modal com os campos preenchidos
e botão "Confirmar lançamento"
f) usuário confirma: insert no transactions + insert no attachments com ocr_result cru
4. Tela /transactions lista todos os lançamentos com filtro por status, categoria e data.
5. Tela /dashboard mostra entrada do mês, saídas do mês, fluxo dos próximos 30 dias
(cruza transactions com due_date dentro da janela).
Categorias padrão (editáveis em /config):
aluguel, energia, agua, internet, salarios, fornecedor,
impostos, marketing, manutencao, software, outros
Fallback se OCR falhar:
Tela /novo/manual com formulário shadcn (form, input, select, calendar).
Mesmo Server Action createTransaction com validação Zod.
Sempre disponível, mesmo quando OCR funcionar bem.
Server Actions com validação Zod:
- uploadFile
- processUpload
- createTransaction
- updateTransaction
- deleteTransaction
- markAsPaid
Auth:
Stack Auth, todas as queries filtram por user_id.
Componentes shadcn necessários:
button, input, card, dialog, form, select, calendar,
badge, table, alert, label, separator, sonner
Variáveis de ambiente:
DATABASE_URL
ANTHROPIC_API_KEY
UPLOADTHING_TOKEN
STACK_PROJECT_ID + STACK_SECRET_SERVER_KEY + STACK_PUBLISHABLE_CLIENT_KEY
Deploy: Vercel com integração Neon e UploadThing.Como conectar ao seu sistema financeiro
- Se você já tem o gerenciador financeiro do guia FINANCEIRO, esse módulo entra como rota /novo dentro do mesmo app
- Compartilha o mesmo schema de transactions, só adiciona a tabela attachments e o campo attachment_url
- Pra integrar com outro sistema (Conta Azul, Bling, Tiny), o resultado do OCR fica num webhook que dispara para a API deles
- A maior parte das integrações exige só 30 linhas extras com axios + token do sistema externo
- O fluxo da foto continua o mesmo, muda só o destino final
OCR + classificação por IA
- Claude Vision lê boleto, nota fiscal e comprovante bancário com taxa de acerto acima de 90% pra valor e data
- Categoria é sugerida pela IA e o usuário aprova ou troca no preview
- Comprovantes (PIX, débito) são reconhecidos como type = entrada ou saida pelo contexto
- PDF com várias páginas: converte só a primeira (a maioria dos boletos cabe nela)
- Confidence < 0.7 cai pro fallback manual com os campos pré-preenchidos pelo que deu pra ler
Categorias padrão
- aluguel: contrato de imóvel comercial ou residencial
- energia, agua, internet: contas de utilidade pública
- salarios: folha de pagamento de funcionários ou pró-labore
- fornecedor: NF de fornecedor de produto ou serviço
- impostos: DAS, DARF, IPTU, IPVA, INSS
- marketing: tráfego pago, ferramenta de marketing, agência
- manutencao: conserto de equipamento, reforma
- software: assinatura de SaaS recorrente
- outros: pra tudo que não bate em categoria acima
Perguntas frequentes
O Claude Vision lê boleto manuscrito?
Lê, mas com taxa de acerto bem menor (60 a 70%). Pra manuscrito vale o fallback manual com os campos já pré-preenchidos pelo que a IA conseguiu identificar. Pra boleto impresso e nota fiscal eletrônica, a taxa fica acima de 90%.
Preciso de servidor com GPU pra rodar OCR?
Não. O Claude roda na nuvem da Anthropic, você só envia a imagem em base64 pela API. Custo é cerca de R$ 0,03 por imagem processada. Pra 200 boletos por mês, fica em torno de R$ 6.
E se o boleto tiver código de barras só?
Pra extrair valor a partir de código de barras puro, melhor usar uma lib específica de leitura de boleto bancário (FEBRABAN) em Node, como bankslip-validator. A IA cobre o caso onde o boleto vem com layout visual completo (a grande maioria).
Onde fica salva a foto?
No UploadThing ou Vercel Blob, conforme o que você configurar. Por padrão fica privada, só acessível pelo usuário autenticado. O link no attachment_url é assinado e expira após 24h se você quiser uma camada extra de segurança.
Funciona com nota fiscal de serviço?
Funciona. NFS-e (serviços) e NF-e (produtos) seguem layouts padronizados que o Claude lê bem. Em prefeituras com layout muito custom, vale validar o OCR nas primeiras 10 notas e ajustar o prompt se necessário.
Quer implementar isso?
Me chama no WhatsApp. Ajudo você a configurar ou implemento pra você.
Quero ajuda no WhatsAppGastão Matos
@gastaomatos