material da comunidade 8 prompts na ordem o seu app de vendas, com push no celular use Opus 4.8 ou Opus 5
crie o seu trakz
passo a passo
8 prompts, 1 dia

Crie o seu TRAKZ
e veja o que caiu pra você, não o bruto.

O painel do gateway mostra o valor cheio da venda. O seu dinheiro é outro: o que sobra depois da taxa e do coprodutor. Você vai construir o app que puxa toda venda na hora em que ela acontece, guarda no seu banco sem duplicar, mostra o número certo, e apita no seu celular quando entra uma nova. Instalado como aplicativo na tela inicial, com a sua marca.

8 prompts prontos peça Opus 4.8 ou Opus 5 venda cai em tempo real app com push no celular
painel · resumo
Painel de vendas com o líquido em destaque e os cartões de hoje, ticket, pix não pago e conversão
O destino. Print de verdade do app rodando. O número verde não é faturamento: é a sua comissão, já sem taxa e sem coprodutor. Os valores dos prints estão trocados por um fator fixo, as proporções são reais.
01

A ideia: duas portas de entrada, uma chave só

Antes de qualquer prompt, entenda a arquitetura. Ela é curta e resolve o problema inteiro.

Sua venda pode chegar até você por dois caminhos. O webhook é o gateway te avisando no segundo em que a venda acontece. Rápido e frágil: se o seu servidor estiver fora do ar naquele instante, ou se você mexer na URL, aquele aviso se perde pra sempre e ninguém te conta.

O sync é o contrário: de cinco em cinco minutos você pergunta ao gateway o que aconteceu. Lento e teimoso. Nunca perde nada.

Use os dois, e faça os dois caírem no mesmo lugar

Webhook pra ser instantâneo, sync pra não perder nada. Só que agora a mesma venda vai chegar duas, três, dez vezes: uma pelo aviso, outra pela varredura, outra quando o pix é pago, outra se for reembolsada.

A solução é uma só: uma chave que identifica a venda (a plataforma mais o id da transação) e uma gravação que atualiza se já existe e cria se não existe. Chegou dez vezes, virou uma linha só, sempre com a informação mais nova. É esse detalhe que separa um painel confiável de um painel que conta a mesma venda três vezes.

O resto do projeto é: um lugar só por onde toda venda entra, o cálculo do dinheiro certo, e um painel que mostra isso rápido no celular.

Use no mínimo o Opus 4.8. Se tiver Opus 5, use o Opus 5.

Esse projeto tem duas armadilhas em que modelo leve cai sempre: conta de fuso horário (que faz a venda das 22h aparecer no dia seguinte) e gravação que apaga campo (quando o evento de reembolso chega sem os dados do cliente e limpa o que já estava lá). As duas passam despercebidas por semanas.

  • Modelo em Opus e uma conversa só do primeiro ao último prompt.
  • Conta no Supabase com um projeto novo.
  • As credenciais da API da Cakto (id e segredo do cliente), que saem no painel dela.
  • Acesso pra cadastrar um webhook no seu gateway.
Vai usar outro gateway, ou mais de um?

Esse material conecta na Cakto, e a arquitetura já foi desenhada pra isso não te prender. Repare que a chave da venda é plataforma + id da transação: o campo plataforma existe justamente pra você somar uma segunda origem depois sem misturar nada.

Pra plugar outro gateway, você escreve um arquivo: o que traduz o formato dele pro seu. O ingestor, o banco e o painel inteiro não mudam uma linha. É por isso que o prompt 01 exige essa separação desde o começo.

02

O banco: uma tabela só

Toda venda de todas as plataformas vive numa tabela. A linha mais importante do SQL abaixo é a restrição de unicidade: é ela que faz o banco recusar duplicata mesmo que o seu código erre.

SQL · cole no editor do Supabase

-- TODA VENDA, DE QUALQUER PLATAFORMA, MORA AQUI
create table if not exists trakz_vendas (
  id uuid primary key default gen_random_uuid(),

  -- a chave da venda: plataforma + id da transacao dela
  platform text not null,
  transaction text not null,
  status text not null,        -- paid, waiting_payment, refunded, chargedback, refused, started

  -- produto
  offer_type text,             -- principal ou order bump
  produto_id text,
  produto_nome text,
  oferta_nome text,

  -- pessoa
  nome text,
  email text,
  telefone text,
  ddd text,
  uf text,
  pais text,
  genero text,                 -- estimativa pelo primeiro nome

  -- dinheiro
  valor numeric,               -- o bruto que o cliente pagou
  valor_base numeric,
  taxa numeric,
  liquido numeric,             -- O QUE SOBRA PRA VOCE. e esse que vale.
  metodo text,
  parcelas int,

  -- origem
  utm_source text, utm_medium text, utm_campaign text, utm_content text, utm_term text,
  sck text,
  checkout_url text,

  -- tempo
  criado_em timestamptz,       -- quando o pedido nasceu
  pago_em timestamptz,         -- quando o dinheiro entrou
  reembolsado_em timestamptz,
  atualizado_em timestamptz not null default now(),

  raw jsonb                    -- o evento cru, pra quando algum numero nao bater
);

-- A LINHA MAIS IMPORTANTE DO ARQUIVO
-- Sem ela, webhook e varredura gravam a mesma venda duas vezes e o seu
-- faturamento vira ficcao. Com ela, o banco recusa duplicata mesmo se o
-- codigo errar.
create unique index if not exists trakz_vendas_chave
  on trakz_vendas(platform, transaction);

create index if not exists trakz_vendas_criado on trakz_vendas(criado_em desc);
create index if not exists trakz_vendas_pago on trakz_vendas(pago_em desc);
create index if not exists trakz_vendas_status on trakz_vendas(status);

-- TRAVA: ninguem le nem escreve com chave publica.
-- So o servidor (service role) toca nessa tabela. Aqui tem dado de cliente:
-- nome, e-mail e telefone de quem comprou de voce.
alter table trakz_vendas enable row level security;
Aqui tem dado de cliente. Trate como tal.

Diferente dos outros projetos da série, essa tabela guarda nome, e-mail e telefone de quem comprou de você. Nada de política pra chave pública, nada de rota que devolva a lista sem senha, e nada de sair mandando print dessa tela por aí.

03

Prompt 01: o ingestor, a peça central

Esse é o prompt mais importante do material. Ele constrói o único lugar por onde uma venda entra no seu sistema. Webhook e varredura não gravam nada por conta própria: os dois chamam essa peça.

E ele carrega uma regra que só se aprende depois de perder dado: na hora de gravar, só mande os campos que têm valor. Quando o reembolso chega, ele vem magro, sem os dados do cliente. Se você gravar tudo, o nome e o telefone que o evento anterior tinha preenchido viram vazio.

Prompt 01 · o ingestor único

Você é um engenheiro sênior. Vamos construir o meu próprio app de vendas: ele recebe toda venda que acontece no meu gateway, guarda no meu banco e me mostra num painel.

STACK
- Funções serverless em JavaScript puro, sem framework, hospedadas na Vercel. Uma pasta de rotas e uma pasta de biblioteca.
- Banco: Supabase, acessado só pelo servidor com a chave de serviço.
- O painel é um arquivo HTML estático que conversa com essas rotas.
- Sem React, sem build, sem dependência além do cliente do banco.

COMECE PELA PEÇA CENTRAL: o ingestor.
É o ÚNICO lugar do sistema por onde uma venda entra. Nenhuma outra parte do código pode escrever nessa tabela. Webhook e varredura vão os dois chamar essa função.

O QUE ELE FAZ, em ordem

1. ENRIQUECER
Recebe uma venda já traduzida pro meu formato e acrescenta:
- Estado e país a partir do telefone: leia o código do país e o DDD. Monte a tabela de DDD para estado com todos os DDDs do Brasil. Se o código não for do Brasil, marque o país e deixe o estado vazio.
- Uma estimativa de gênero pelo primeiro nome, com uma lista de nomes comuns e as terminações mais frequentes. É ESTIMATIVA: onde isso aparecer na tela, tem que estar escrito que é estimativa.
- O líquido, se ele não vier pronto: o valor menos a taxa.
- A data e hora da última atualização.

2. LIMPAR (não pule essa parte)
Antes de gravar, remova do objeto todo campo que está vazio ou nulo.
POR QUÊ: a mesma venda chega várias vezes. O evento de pix gerado vem completo, com nome e telefone. O evento de reembolso vem magro, quase só com id e status. Se eu gravar o objeto inteiro, o reembolso APAGA o nome e o telefone que eu já tinha. Gravar só o que tem valor resolve isso de vez.

3. GRAVAR SEM DUPLICAR
- Grave com uma operação que atualiza se já existe e cria se não existe, usando como chave a plataforma mais o id da transação.
- Recuse a gravação se faltar plataforma, id da transação ou status, e devolva o motivo em vez de estourar erro.

4. GRAVAR MUITAS DE UMA VEZ
Uma segunda função que recebe uma lista e grava em lotes de 200. Uma gravação gigante de uma vez estoura o limite de tamanho da requisição do banco, e aí você perde tudo em silêncio.

A TRADUÇÃO DO GATEWAY FICA SEPARADA
Crie um arquivo só pra Cakto, que exporta duas coisas: uma função que percorre os pedidos da API dela (com paginação) e uma função que traduz um pedido do formato dela pro MEU formato. Nenhum outro arquivo pode conhecer o formato da Cakto.
Meu formato tem exatamente estes campos: platform, transaction, status, offer_type, produto_id, produto_nome, oferta_nome, nome, email, telefone, valor, valor_base, taxa, liquido, metodo, parcelas, os cinco utm, sck, checkout_url, criado_em, pago_em, reembolsado_em e raw (o evento cru).
Padronize os status para: paid, waiting_payment, refused, refunded, chargedback e started. Se o gateway usar outros nomes, traduza dentro do arquivo dele.

ENTREGA
- Os arquivos completos, sem TODO e sem função vazia.
- Me mostre como testar o ingestor sozinho, mandando a mesma venda três vezes e conferindo que virou uma linha só.
04

Prompt 02: o webhook, e a mentira do corpo

Agora a porta rápida. O gateway te avisa e você grava na hora. Mas tem uma pegadinha que custa caro e quase ninguém sabe.

O status verdadeiro está no nome do evento, não dentro do pedido

O aviso chega com duas informações: o nome do evento (pix gerado, compra aprovada, reembolso) e o pedido completo. Acontece que o pedido dentro do aviso às vezes vem com o status errado: em teste, chega marcado como pago até num evento de pix apenas gerado.

Se você confiar no que está dentro do pedido, o seu painel conta como faturamento um pix que ninguém pagou. Leia o status do nome do evento e use o pedido só pro resto dos dados.

Prompt 02 · o webhook

Agora a rota que recebe o aviso do gateway em tempo real.

O QUE ELA FAZ
1. Aceita apenas POST. Qualquer outro método devolve erro.
2. Confere um segredo (na URL ou no cabeçalho) que só eu e o gateway conhecemos. Sem ele, 401. Essa rota fica aberta na internet: sem segredo, qualquer pessoa inventa venda no meu painel.
3. Traduz o aviso pro meu formato usando o mesmo arquivo do gateway que já existe.
4. DEFINE O STATUS PELO NOME DO EVENTO, não pelo status que veio dentro do pedido:
   - eventos de cobrança gerada (pix, boleto e afins) viram aguardando pagamento
   - eventos de aprovação, assinatura criada e renovação viram pago
   - eventos de reembolso viram reembolsado, de chargeback viram chargeback, de recusa viram recusado
   Isso é obrigatório: o pedido dentro do aviso chega com status errado em alguns eventos, inclusive marcando como pago um pix que só foi gerado.
5. Guarda o aviso cru inteiro num campo, pra eu conseguir investigar depois quando algum número não bater.
6. Chama o ingestor. Não escreve no banco por conta própria.
7. Responde 200 rápido, mesmo se der erro no meio. Gateway que recebe erro fica reenviando o mesmo aviso, e alguns desligam o webhook depois de várias falhas. Registre o problema do seu lado e devolva 200.

REGRAS
- Nunca confie em nada que veio de fora sem validar.
- Se o mesmo aviso chegar duas vezes, o resultado tem que ser idêntico. Isso já vem de graça se o ingestor estiver certo, mas teste.
- Me diga exatamente onde eu colo a URL desse webhook no painel do gateway e quais eventos eu marco.
- Me entregue os arquivos e um exemplo de como simular um aviso pra testar sem esperar venda real.
05

Prompt 03: a varredura de 5 em 5 minutos

A rede de segurança. Uma rotina que roda sozinha, pergunta ao gateway o que aconteceu e joga tudo no mesmo ingestor. Ela existe de propósito junto com o webhook: aviso se perde, URL muda, plataforma sai do ar. A varredura garante que nenhuma venda some, mesmo que demore cinco minutos em vez de ser instantânea.

Prompt 03 · a varredura automática

Agora a varredura que roda sozinha e garante que nenhuma venda se perca.

COMO ELA FUNCIONA
1. Autentica na API do gateway trocando as minhas credenciais por um token, e guarda o token em memória até pouco antes de expirar.
2. Percorre os pedidos com paginação, com um teto de páginas pra nunca entrar em laço infinito.
3. Traduz cada pedido pro meu formato e manda tudo pro ingestor, em lotes.
4. Roda a cada 5 minutos, agendada pela própria hospedagem.
5. Aceita também ser chamada na mão, com um parâmetro de quantos dias buscar, pra quando eu quiser reimportar o histórico.

PROTEÇÃO
A rota precisa recusar quem não for o agendador: aceite se vier o cabeçalho que a hospedagem coloca nas execuções agendadas, ou se vier um segredo meu no cabeçalho ou na URL. Caso contrário, 401. Sem isso, qualquer pessoa fica disparando a sua varredura e estourando a cota da API do gateway.

O PULO DO GATO: SABER O QUE É NOVIDADE
Antes de gravar, leia do banco quais transações daquele período você já tem e com qual status.
Depois de traduzir, compare: é novidade quando a venda não existia e já está paga, ou quando ela existia como aguardando pagamento e agora está paga.
Essa lista de novidades é o que vai virar aviso no meu celular no passo do app. Sem essa comparação, ou você não avisa nada, ou avisa a mesma venda a cada cinco minutos pra sempre.

CUIDADOS
- Se a API do gateway falhar, registre e saia sem quebrar. A próxima execução resolve.
- Nunca devolva credencial nem token na resposta.
- Devolva um resumo curto: quantos pedidos vieram, quantos foram gravados e quantos eram novidade.

Me entregue os arquivos, o arquivo de configuração do agendamento e como eu testo a rota na mão antes de confiar nela.
06

Prompt 04: o dinheiro certo e o dia certo

Esses são os dois erros que fazem um painel bonito mentir. Estão juntos num prompt só porque os dois são conta, e conta errada aqui você só descobre quando toma decisão errada.

O dinheiro: o valor da venda não é o seu dinheiro. Dele saem a taxa da plataforma e a parte do coprodutor ou afiliado. O gateway manda essa divisão detalhada, e a sua parte tem um nome específico dentro dela. É esse número que vai grande na tela.

O dia: o servidor roda com o relógio de outro fuso. Se você contar o dia por ele, toda venda das 21h à meia-noite pula pro dia seguinte. A venda de ontem às 22h36 aparece como venda de hoje, e você fica olhando um número que não existe.

Prompt 04 · as contas que não podem errar

Agora as contas do painel. Elas rodam no servidor, não no navegador: já são milhares de linhas e mandar tudo pro celular seria burrice.

1. O DINHEIRO QUE É MEU
- O valor da venda inclui a taxa da plataforma e a parte de coprodutor e afiliado. Esse é o BRUTO, e ele não é meu.
- O gateway manda a divisão detalhada da venda, com uma linha por participante. A minha parte é a do tipo produtor. É ESSE número que eu quero grande na tela.
- Se por algum motivo essa divisão não vier, calcule valor menos taxa e siga.
- Na tela, deixe escrito embaixo do número: "sua comissão, já sem taxa e sem coprodutor". Sem essa frase eu vou achar que o painel está errado quando comparar com o do gateway.
- Mostre também, num cartão separado, quanto foi embora em taxa e divisão no período. Dói e é informação.

2. O DIA É O DIA DE BRASÍLIA, NUNCA O DO SERVIDOR
- O servidor roda em outro fuso. Contando o dia por ele, toda venda das 21h até a meia-noite cai no dia seguinte. Isso não é detalhe: é a diferença entre "vendi hoje" e "não vendi nada hoje".
- Crie três ajudantes e faça TODO corte de dia passar por eles: o dia de calendário em que um instante caiu no fuso de São Paulo, o instante exato da meia-noite de um dia daqui, e recuar N dias de calendário.
- Use uma formatação de data com fuso explícito pra isso, não conta de subtrair horas na mão, porque horário de verão de outros países quebra a conta.
- "Hoje" começa na meia-noite de verdade, não é uma janela de 24 horas pra trás. Janela móvel traz metade de ontem e é o erro clássico.
- "7 dias" quer dizer hoje mais os 6 anteriores, em dias de calendário. "Ontem" é o único período que não termina hoje, então preveja início E fim.

3. QUAL DATA USAR EM CADA MÉTRICA (isso confunde todo mundo)
- Faturamento filtra pela data do PAGAMENTO. Um pix gerado semana passada e pago hoje é faturamento de hoje.
- Quantidade de pedidos e taxa de conversão filtram pela data de CRIAÇÃO do pedido.
- Como as duas datas são diferentes, a busca no banco precisa alcançar as duas, senão a venda que nasceu antes da janela e foi paga dentro dela some do painel.
- Escreva isso como comentário no código, porque daqui a três meses nem eu vou lembrar por quê.

4. O QUE MAIS CALCULAR NO SERVIDOR
Total líquido do período, de hoje, e a comparação com ontem em porcentagem. Ticket médio. Dinheiro parado em pix e boleto gerados e não pagos. Reembolsos e chargebacks. Conversão (pagos sobre pedidos gerados). Ranking de produtos. E a série do gráfico: quando o período for de um dia só, devolva por HORA; acima disso, por dia, preenchendo com zero os dias sem venda pra o gráfico não mentir com buraco.

Me entregue os arquivos e me mostre os números batendo com o painel do meu gateway, explicando cada diferença que sobrar.
07

Prompt 05: o painel

Agora a tela. Um arquivo HTML que faz uma chamada e desenha tudo. A regra de ouro: o primeiro número que você vê é o que caiu pra você, não o bruto. Painel de vendas que mostra faturamento cheio é vaidade e faz você achar que ganha mais do que ganha.

Prompt 05 · o resumo

Agora o painel. Um arquivo HTML estático, protegido por uma senha minha que fica em variável de ambiente do servidor.

ENTRADA
- Tela de senha simples. A senha vai num cabeçalho em toda chamada e fica lembrada no navegador. Um botão de sair esquece.
- Não é login de usuário, é cadeado de dono.

VISUAL
- Fundo quase preto, cartões um tom acima, texto claro, uma cor de destaque laranja. Verde só pro dinheiro que entrou, vermelho pro que saiu, amarelo pro que está parado.
- Nada de biblioteca de gráfico e nada de framework. Barras em elementos simples.
- No topo: a marca, quantas operações existem no banco, e um indicador "ao vivo" com a hora da última atualização.

FILTROS
- Período: hoje, ontem, 7 dias, 30 dias, 90 dias, este mês, mês passado e tudo.
- Produto: todos ou um específico.
- Os dois filtros valem pra tela inteira, em todas as abas.

ABA RESUMO, nesta ordem
1. O número grande, em verde: O QUE CAIU PRA VOCÊ no período, com a quantidade de vendas pagas embaixo e a frase explicando que é a sua comissão já sem taxa e sem coprodutor.
2. Uma fileira de cartões menores: hoje (com a variação em porcentagem contra ontem), ticket médio, pix e boleto gerados e não pagos, reembolsos e chargebacks, conversão, e quanto foi embora em taxa e divisão.
3. Faturamento no período, em barras, com uma linha em cima dizendo o total e qual foi o melhor dia. Em período de um dia só, as barras são por hora.
4. Produtos: o que mais faturou, em barras proporcionais.

REGRAS
- Uma chamada só pro servidor traz tudo. Nada de cinco chamadas.
- Formato brasileiro em tudo: R$ 1.234,56 e datas dd/mm.
- Enquanto carrega, esqueleto cinza. Nunca a palavra carregando.
- Se a chamada falhar, mostre o erro em português com um botão de tentar de novo.
- Precisa ser bom no celular ANTES de ser bom no computador. É de lá que eu vou olhar.
Me entregue o arquivo completo e o que testar.
08

Prompt 06: as outras quatro abas

O resumo diz quanto. Essas dizem quem, de onde e o que fazer agora. A de público é a que mais surpreende: ela mostra de qual estado vem o seu dinheiro sem você ter perguntado nada pra ninguém, só pelo DDD do telefone digitado no checkout.

Prompt 06 · vendas, público, origem e entregas

Agora as outras abas do painel. Todas respeitam os mesmos filtros de período e produto.

ABA VENDAS
Lista das últimas operações: quando, produto (com etiqueta quando for order bump), quem comprou, forma de pagamento, status com cor e o valor líquido. Filtro rápido por status: todas, pagas, aguardando, reembolsadas.

ABA PÚBLICO
- Estados, calculados pelo DDD do telefone de quem comprou, em barras, com quantidade e receita.
- Países, pelo código internacional do telefone.
- Gênero estimado pelo primeiro nome, com a palavra ESTIMATIVA escrita na tela, sem enfeite.
- Formas de pagamento e parcelamento.
Essa aba responde de onde vem o meu dinheiro sem eu ter pesquisado nada com ninguém.

ABA ORIGEM
Receita paga agrupada por utm_source e por utm_campaign, em barras. Deixe claro na tela que o que aparece aqui é o que veio carimbado no pedido: o que chegar sem parâmetro fica como "sem origem", e isso é informação, não erro.

ABA ENTREGAS
Uma lista das vendas pagas com o status da entrega do acesso, e um jeito de eu marcar como entregue. Se um dia eu automatizar a entrega, essa aba é onde ela aparece.
Junto, um bloco de recuperação de pix: quem gerou e não pagou, com o contato à mão pra eu cobrar.

REGRAS
- Toda tabela e todo bloco precisam de estado vazio com uma frase curta.
- Nada de mostrar dado de cliente além do necessário, e nada de deixar essa tela aberta sem senha.
- Me entregue os arquivos e o que testar em cada aba.
painel · público
Aba de público com estados pelo DDD e gênero estimado
painel · origem
Aba de origem com receita por utm_source e por campanha
painel · vendas
Lista das últimas vendas com status e valor
painel · entregas
Aba de entregas de acesso e recuperação de pix
09

Prompt 07: o app no celular, com push

Esse é o passo que muda a sua relação com o negócio. O painel deixa de ser um site que você lembra de abrir e vira um ícone na tela inicial do seu celular que apita quando entra venda. Sem loja de aplicativo, sem aprovação de ninguém.

Quem dispara o aviso é a varredura do passo 05, usando aquela comparação de novidade. Por isso ela vem antes: sem saber o que é novo, ou o app não avisa nada, ou avisa a mesma venda a cada cinco minutos.

Prompt 07 · aplicativo e notificação

Agora transforme o painel num aplicativo instalável no celular, que me avisa quando entra venda.

1. APLICATIVO INSTALÁVEL
- Adicione o arquivo de manifesto com nome, cores e ícones nos tamanhos certos, e um service worker simples.
- No celular, eu quero poder adicionar na tela inicial e abrir em tela cheia, sem barra de navegador, com o meu ícone.
- Me diga o passo a passo pra instalar no iPhone e no Android.

2. NOTIFICAÇÃO DE VENDA
- Um botão no topo do painel pra ativar os avisos, que pede a permissão do navegador e guarda a inscrição desse aparelho no banco. Um mesmo dono pode ter vários aparelhos.
- Quando a varredura encontrar venda nova paga, dispare um aviso pra todos os aparelhos inscritos, com o produto e o valor líquido no texto.
- Nada de avisar de novo a mesma venda: use a comparação de novidade que a varredura já faz.
- Inscrição que o navegador recusar (aparelho desinstalado, permissão revogada) tem que ser apagada do banco, senão o erro se repete pra sempre.
- Um botão de teste que dispara um aviso na hora, pra eu confirmar que funciona sem esperar venda.

3. SOM (opcional e delicioso)
Um botão pra ligar um som curto quando o painel estiver aberto e chegar venda nova. Deixe desligado por padrão e lembre da escolha.

REGRAS
- As chaves da notificação ficam em variáveis de ambiente do servidor. A chave pública pode ir pro navegador, a privada nunca.
- Se o aparelho não suportar notificação, esconda o botão em vez de mostrar erro.
- Me entregue os arquivos e me guie no teste, do zero até o celular apitar.
390px
O painel aberto como aplicativo no celular
É essa tela que fica no seu bolso.
10

Prompt 08: no ar e o teste real

O teste desse projeto tem uma vantagem: dá pra fazer com dinheiro de verdade sem gastar dinheiro. Você gera um pix do seu próprio produto e não paga. Ele tem que aparecer como parado, nunca como faturamento. Depois cancela e confere que saiu do número certo.

Prompt 08 · deploy, agendamento e conferência

Meu app funciona local. Quero ele no ar hoje.

Me guie clicado, assumindo que eu não sei o que é terminal:
1. Como subir o projeto.
2. Onde cadastrar as variáveis de ambiente: endereço e chave de serviço do banco, credenciais do gateway, senha do painel, segredo do webhook, segredo da varredura e as chaves da notificação. E por que nenhuma delas pode estar no código.
3. Como ligar o agendamento da varredura a cada 5 minutos e como confirmar que ele está mesmo rodando.
4. Onde eu colo a URL do webhook no painel do gateway e quais eventos eu marco.
5. Como ligar um domínio próprio.

IMPORTAÇÃO DO HISTÓRICO
Depois de tudo no ar, me mostre como chamar a varredura uma vez pedindo um período longo, pra trazer todo o meu histórico de vendas de uma vez. Confira comigo quantas vieram.

CONFERÊNCIA FINAL, em ordem:
- Abrir o painel sem senha: tem que barrar.
- Comparar o faturamento do período com o painel do meu gateway. Se der diferença, me explique cada uma (bruto contra líquido, reembolso, fuso) até bater.
- Gerar um pix de um produto meu e NÃO pagar: em segundos ele tem que aparecer como parado, nunca como faturamento.
- Cancelar esse pedido e conferir que ele sai do número.
- Desligar o webhook de propósito, criar outro pedido e esperar a varredura: ele tem que aparecer sozinho em até 5 minutos. É esse teste que prova que a rede de segurança funciona.
- Instalar no celular, ativar o aviso e disparar o teste de notificação.
- Conferir que nenhuma credencial aparece no que chega no navegador.
- Conferir o fuso: uma venda feita depois das 21h aparece no dia certo?
com o app de pé você sabe o que caiu de verdade quanto foi de taxa quanto está parado em pix de qual estado vem o dinheiro
11

Os 3 loops, mirando onde painel de venda mente

Painel de vendas errado é pior que planilha, porque você confia nele. Esses três loops existem pra o número ser confiável.

Loop 01 · caça-problema

Pare de construir. Agora ataque o próprio trabalho procurando os jeitos de o meu painel MENTIR.

Investigue especificamente:
- A mesma venda chegando pelo webhook e pela varredura ao mesmo tempo: vira uma linha ou duas?
- O evento de reembolso, que vem sem os dados do cliente: ele apaga nome, e-mail e telefone que já estavam gravados?
- Pix gerado ontem e pago hoje: aparece no faturamento de qual dia? E na contagem de pedidos?
- Venda feita às 22h30: cai no dia certo? Teste também 23h59 e 00h01.
- Order bump: está contando como venda separada, como parte da principal, ou os dois?
- Assinatura renovada: cria linha nova ou atualiza a antiga? Qual dos dois eu quero?
- Reembolso parcial: o líquido é corrigido?
- Venda com coprodutor ou afiliado: o número grande mostra a MINHA parte ou o bolo inteiro?
- Cliente sem telefone: a aba de público quebra ou ignora?
- DDD que não existe, telefone de outro país, telefone com nove dígitos e com oito.
- Nome com uma letra só, nome vazio: a estimativa de gênero quebra?
- Período sem nenhuma venda: os cartões mostram zero ou mostram erro? A divisão por zero da conversão foi tratada?
- Filtro de produto mais período curto: os totais continuam batendo?
- A varredura rodando duas vezes ao mesmo tempo: dá problema?
- Milhares de vendas no período: a tela trava?

Escreva a lista numerada, do mais grave pro mais bobo, com o que acontece na prática. Não conserte ainda.
Depois conserte um por um e me diga o que mudou.
No fim, rode tudo de novo. Repita até uma passagem não achar nada novo.

Loop 02 · bater com o gateway

Agora vamos conferir o meu painel contra a fonte, que é o painel do próprio gateway. Esse loop é o que me faz confiar no número.

Escolha um período fechado, por exemplo o mês passado inteiro, e compare item por item:
- Quantidade de vendas pagas.
- Valor bruto vendido.
- Valor líquido recebido.
- Quantidade de reembolsos.
- Quantidade de pix gerados e não pagos.

Para CADA diferença encontrada, me diga:
1. Qual é o número no meu painel e qual é no gateway.
2. A causa provável, na ordem: bruto contra líquido, fuso horário, order bump contado duas vezes, reembolso ainda contando, assinatura renovada, venda de teste, ou pedido com status que eu não mapeei.
3. Como confirmar essa causa olhando uma venda específica.
4. A correção.

Depois corrija e refaça a comparação. Repita até bater, ou até sobrar só diferença que você consiga EXPLICAR com clareza.
No fim, escreva num arquivo as diferenças que são esperadas e por quê, pra eu não reabrir essa investigação daqui a dois meses.

Loop 03 · o invasor

Esqueça que você construiu isso. Você é uma pessoa mal intencionada que descobriu o endereço do meu app de vendas. Seus objetivos: ver o meu faturamento, roubar a lista de clientes ou sujar os meus números.

Liste tudo que tentaria e o resultado real, considerando o meu código:
- Abrir o painel sem senha, e com senha errada.
- Chamar direto a rota que devolve os dados, sem senha.
- Chamar a rota do webhook inventando uma venda de R$ 50.000. O segredo está sendo conferido de verdade?
- Chamar a rota do webhook com um corpo enorme, ou com campos malformados.
- Disparar a varredura mil vezes pra estourar a cota da minha API do gateway.
- Achar a chave de serviço do banco ou as credenciais do gateway no que chega no navegador.
- Ler a tabela de vendas usando a chave pública do banco. Deve dar zero. Me prove.
- Se inscrever nas notificações sem senha, pra receber aviso das minhas vendas.
- Injetar HTML ou script no nome do cliente e ver se executa quando eu abrir o painel. O nome vem de fora, então esse é o mais provável.
- Descobrir e-mails dos meus clientes por alguma rota que não exige senha.

Para cada item: o que tentei, o que aconteceu, e se é um buraco.
Se algo passar, me entregue a correção pronta e a explicação em português.
No fim, diga em uma frase o risco real que sobra mesmo com tudo certo. Lembre que aqui tem dado pessoal de cliente, então trate esse ponto com seriedade.
12

Quando travar

Aqui o travamento quase nunca é tela quebrada: é número que não bate. A tabela cobre a maioria dos casos.

SOS · destravar sem piorar

Alguma coisa não bate. Antes de mexer em qualquer linha, investigue.

O que eu esperava ver: DESCREVA AQUI
O que apareceu: DESCREVA AQUI
Em qual ponto da corrente: o webhook chegou? a varredura rodou? gravou no banco? o painel calculou?
Console do navegador (F12): COLE O ERRO OU ESCREVA "nada"
Registro do servidor: COLE O ERRO OU ESCREVA "nao olhei"
Uma venda específica que está errada (id, ou nome do produto e hora): DESCREVA

Siga exatamente esta ordem:
1. Pegue ESSA venda específica e siga o caminho dela: ela existe no banco? com qual status e quais datas? o que o gateway diz sobre ela?
2. Diga em qual dos quatro pontos da corrente o problema está.
3. Só então proponha a causa, com o trecho do código, e mais duas hipóteses.
4. Diga o teste mais rápido pra confirmar.
5. Faça a correção mínima. Não reescreva o projeto, não mude o visual.
6. Depois da correção, confira essa mesma venda de novo e me mostre certa.

Se não tiver certeza, diga que não tem certeza e me peça o que falta. Chutar correção é proibido.
o sintoma
o que é, na real
A mesma venda aparece duas vezes
Falta a restrição de unicidade no banco, ou a gravação não está usando plataforma mais transação como chave.
O nome do cliente sumiu depois do reembolso
Você gravou o objeto inteiro. O evento de reembolso vem magro e apagou o que já existia. Mande só campo com valor.
Pix não pago contando como faturamento
Você usou o status que veio dentro do pedido em vez do nome do evento. O corpo mente em alguns eventos.
A venda de ontem à noite aparece hoje
Fuso. O servidor conta o dia em UTC e o Brasil está três horas atrás. Todo corte de dia tem que passar pelos ajudantes de fuso.
Hoje mostra vendas de ontem
"Hoje" está sendo calculado como as últimas 24 horas. Tem que começar na meia-noite de verdade.
Uma venda paga sumiu do período
Pix gerado antes da janela e pago dentro dela. A busca precisa alcançar as duas datas, criação e pagamento.
O total é maior que o do gateway
Quase sempre bruto no lugar do líquido, ou order bump somado duas vezes.
A varredura não roda sozinha
Agendamento não configurado, ou a rota está recusando o agendador porque a checagem de segredo não aceita o cabeçalho dele.
O webhook parou de chegar
Muitas respostas de erro seguidas fazem o gateway desligar o envio. Responda sempre 200 e registre o problema do seu lado.
O celular não recebe aviso
Ou a permissão não foi dada, ou a inscrição do aparelho expirou. Inscrição recusada tem que ser apagada do banco.

As oito regras que fazem esse caminho funcionar

Nenhuma é sobre código. São sobre como você comanda. E aqui elas valem mais que nos outros materiais, porque é esse número que você vai usar pra decidir onde colocar dinheiro.

Opus, sempre

No mínimo Opus 4.8, de preferência Opus 5. Fuso horário e gravação que apaga campo são erros silenciosos, e é neles que modelo leve tropeça.

Uma conversa só

Do prompt 01 ao 08 no mesmo chat. O formato da venda precisa ser o mesmo do começo ao fim, e chat novo reinventa formato.

Uma porta só de entrada

Webhook e varredura não gravam nada sozinhos. Os dois chamam o mesmo ingestor, e é ele que decide como grava.

Chave única no banco

Plataforma mais id da transação, com unicidade no próprio banco. É a rede que segura quando o código erra.

O número grande é o líquido

Bruto é vaidade e faz você achar que ganha o que não ganha. Mostre o que sobra, e a frase explicando isso do lado.

Dia é dia de Brasília

Nunca o dia do servidor. Se essa conta estiver errada, todo o resto do painel está errado junto e você nem desconfia.

Bata com o gateway antes de confiar

Compare um mês fechado, item por item, e explique cada diferença. Só depois disso o painel vira fonte de decisão.

Proibido TODO

Repita em todo prompt: nada de função vazia, nada de "aqui você implementa". Sem isso, você recebe meia entrega bonita.

o que fazer com isso

Você acabou de virar dono do seu próprio dado de vendas.

Enquanto o número mora só no painel do gateway, você aluga a informação junto com o serviço. Com a base no seu banco, ela é sua: dá pra cruzar, automatizar e plugar no resto. E é aqui que essa série se junta.

  • Cobrar o pix parado: a lista já está na aba de entregas, é só disparar a mensagem
  • Entregar o acesso sozinho: a venda aprovada já entra no seu banco, então o gatilho está pronto
  • Somar um segundo gateway: um arquivo novo de tradução e pronto, o painel soma tudo
  • Carimbar os seus links pra aba de origem parar de dizer "sem origem" na maioria das vendas

Copia o primeiro e vai.

Oito prompts. Uma conversa. No fim do dia o seu celular apita, você olha, e o número que aparece é o que caiu pra você de verdade.

Começar pelo prompt 01