O que roda sozinho no seu site
Tem tarefa que ninguém deveria fazer na mão: mandar o lembrete da véspera, resumir os pedidos da semana, registrar o pagamento que caiu de madrugada. Na FlexPage isso se resolve de três formas diferentes — e cada uma serve para um tipo de trabalho. A automação manda uma mensagem para o Harness num horário marcado; a rotina é um programa que o servidor roda sozinho, sem IA; o webhook é um endereço do site que outro sistema chama para avisar que algo aconteceu.
Confundir os três é o erro mais comum
O material da própria plataforma faz questão de separá-los: a automação trabalha com IA e gasta tokens; a rotina é código que roda sem IA; o webhook não trabalha — ele recebe o aviso de outro sistema.
⏰ Automação de horário
Você deixa um bilhete para o Harness: uma mensagem que é enviada para uma sessão automaticamente, num horário marcado. “Toda segunda às 8h, faça isto.” Quem lê e executa é a IA — por isso cada disparo gasta tokens.
⏰ Automações · dentro do painel⏱️ Rotina
Um programa que o servidor roda sozinho, mais ou menos a cada minuto, sem IA. O Harness escreve uma vez; depois disso ninguém precisa pedir nada. Serve para tarefa repetitiva e simples: lembrete, relatório, cobrança, fila.
pasta thread/ · ex.: thread/agendamento-whatsapp.js🔗 Webhook
Um endereço do site que outro sistema chama para avisar algo — “o pagamento caiu”, “o pedido foi pago”, “chegou resposta de formulário”. O arquivo em script/ é o endereço; quem bate na porta é o sistema de fora.
| Mecanismo | Para que serve | Quem dispara | Usa IA? | Onde fica |
|---|---|---|---|---|
| ⏰ Automação | Mandar uma mensagem para uma sessão do Harness em horário marcado: resumo, conferência, lembrete de tarefa interna. | O relógio do painel, no horário e na repetição que você configurou. | Sim — cada execução gasta tokens. | Marcada em ⏰ Automações, apontando para uma sessão. Não é arquivo. |
| ⏱️ Rotina | Trabalho repetitivo e simples, sem julgamento de IA: lembrete no WhatsApp, confirmação, relatório, backup, cobrança, processar fila, sincronizar. | O servidor, a cada ciclo (mais ou menos a cada minuto). O próprio programa decide se já é hora. | Não — roda código, sem IA. | Pasta thread/. Ex.: thread/agendamento-whatsapp.js envia confirmação, lembretes de 24h e 1h e mensagem pós-atendimento. |
| 🔗 Webhook | Receber o aviso de um sistema de fora e fazer algo com ele: gateway de pagamento, loja virtual, formulário, CRM. | O outro sistema, quando o fato acontece. Pode repetir a entrega. | Não — o script recebe, valida, guarda e responde. | Pasta script/. O nome do arquivo vira o caminho: script/api.js → /api. |
Automação com hora marcada
A tela chama isso de automação: uma mensagem enviada a uma sessão automaticamente. O exemplo do guia é uma barbearia que quer o resumo das reclamações da semana toda segunda às 8h.
“Leia as mensagens de suporte da semana em sandbox/support e me resuma as reclamações mais comuns.”
O campo Horários aceita um ou vários no mesmo dia — 08:00, 12:00 e 17:30 no exemplo do guia.
As opções são: uma vez, todo dia, dias úteis, toda semana ou a cada N horas.
Depois dessa data, a automação para sozinha.
| Campo | O que aceita |
|---|---|
| Sessão | A conversa que vai receber a mensagem (ex.: “Relatórios da barbearia”). |
| Mensagem | O texto que o Harness recebe, como se você tivesse digitado na caixa de mensagem. |
| Repetição | Uma vez, todo dia, dias úteis, toda semana ou a cada N horas. |
| Horários | Um ou vários no mesmo dia: 08:00, 12:00, 17:30. |
| Até (data final) | 31/12 — depois disso, ela para. |
| Avisos | E-mail e/ou Telegram, sempre (com a resposta) ou só se der problema. |
[FlexPage] com “Nunca enviar para spam”.
Rotina: o programa que roda sem IA
Uma rotina é um programa guardado na pasta thread/. O servidor o executa sozinho, mais ou menos a cada minuto, mesmo com o painel fechado — não há cron para configurar, não há botão para apertar. O Harness escreve uma vez, numa sessão do tipo ⏱️ Rotina, e depois ela trabalha sozinha.
thread/agendamento-whatsapp.js, que envia a confirmação, os lembretes de 24h e 1h antes do corte e a mensagem pós-atendimento. Na tela de tipos de sessão, o exemplo é “lembrete no WhatsApp 1h antes do corte”.query, body nem visitante para ela usar. O estado entre execuções fica em arquivo no sandbox/ ou no banco.setTimeout, async ou await dentro de uma rotina; a pausa, quando precisa, é feita com sleep().// fm = new FileManager(); dm = new DirectoryManager();
function devoRodarNoHorario(chave, hora, minuto) {
var agora = new Date();
if (agora.getHours() < hora) return false;
if (agora.getHours() === hora && agora.getMinutes() < minuto) return false;
var hoje = agora.getFullYear() + '-' + (agora.getMonth() + 1) + '-' + agora.getDate();
var arquivo = '_estado/' + chave + '.json';
if (fm.fileExists(arquivo)) {
var st = JSON.parse(fm.readFile(arquivo));
if (st.dia === hoje) return false; // já rodou hoje
}
fm.writeFile(arquivo, JSON.stringify({ dia: hoje, em: agora.toISOString() }));
return true;
}
if (devoRodarNoHorario('lembrete-do-dia', 8, 0)) { // 1ª passada após as 08:00
enviarLembretes();
}
new Date() usa o fuso dele, não o do seu cliente. E sem a checagem acima, uma rotina “diária” roda 1.440 vezes por dia.
logger/thread/<domínio>/<script>/ e aparece na tela de Scripts. No painel, peça ⏱️ run_thread_once (“rode a rotina uma vez agora e me mostre o log”, ferramenta da lição 45) ou leia com 🪵 read_app_logs. Se um erro acontecer, ele vira uma linha no log — ninguém é avisado na hora. O campo Avisos (e-mail e/ou Telegram, “sempre” ou “só se der problema”) existe na automação, não na rotina.
Webhook: o endereço que outro sistema chama
Nos exemplos do guia, o webhook serve para o caso “o pagamento caiu” ou “pagamento do sinal aprovado”. Aqui não existe registro especial nem rota mágica: o arquivo em script/ é o endereço. O servidor tira o .js da URL — script/api.js responde em /api, e script/webhook-pagamento.js responde em /webhook-pagamento.
| As quatro leis do webhook | O que isso significa na prática |
|---|---|
| 1. Responda rápido, e responda 200 | O provedor tem prazo curto — a documentação da plataforma cita cerca de 15s no Asaas, 10s no Pagar.me e 60s no Telegram. Se você demorar ou responder erro, ele reenvia, às vezes por dias. Receba, valide, guarde e responda: {"received": true}. Processamento pesado não entra aqui. |
| 2. Toda entrega pode ser repetida | Reentrega é rotina: prazo estourado, repetição de rede, dois eventos para o mesmo fato. Guarde o id do evento e ignore o que já viu. Sem id no payload, o script compõe um — por exemplo PAYMENT_CONFIRMED|pay_123|RECEIVED. O que não pode é cobrar, avisar ou baixar estoque duas vezes pelo mesmo fato. |
| 3. O payload é dica, não verdade | Qualquer um pode fazer um POST no seu endereço. Quando o efeito é dinheiro, estoque ou permissão, reconfira na API do provedor antes de agir: chegou “pagamento confirmado”, pergunte ao provedor qual é o status real. Se não bater, registre no log e não faça nada. |
| 4. Trabalho pesado vai para a rotina | Enviar 300 e-mails, gerar PDF, chamar IA — nada disso cabe na janela do provedor. O webhook grava a tarefa numa fila no sandbox/ e responde na hora; a rotina em thread/ consome a fila no próximo ciclo. |
O que responder em cada situação
| Situação | Resposta | Por quê |
|---|---|---|
| Evento processado | 200 | Fim da linha. |
| Evento repetido (já visto) | 200 | É reentrega normal; não há nada a fazer. |
| Payload malformado ou token inválido | 200 (e log) | Reenviar não vai consertar — o log serve para você investigar. |
| Falha temporária sua (banco fora do ar) | 500 | Aqui você quer a reentrega do evento. |
// 1) autenticação: token combinado com o provedor, comparado com o valor guardado no sandbox
// 2) idempotência: id do evento registrado antes de qualquer efeito
// 3) o fato é reconferido na API do provedor
// 4) o que é pesado vai para a fila:
fm.writeFile('webhook/fila/' + Date.now() + '_' + id + '.json', JSON.stringify(tarefa));
__PARAM.output = JSON.stringify({ received: true });
__PARAM.contentType = 'application/json';
sandbox/. Token na query (?token=) também funciona, mas aparece em log de proxy — prefira o cabeçalho. O Telegram tem o segredo próprio (X-Telegram-Bot-Api-Secret-Token) e há validação pronta para Pix/QQPag.sandbox/ com carimbo de data, é o que salva a depuração três semanas depois. Payload em www/ seria dado de cliente exposto na internet — nunca.Pagamento aprovado: webhook grava, rotina avisa
O caminho que a plataforma recomenda quando o efeito é dinheiro: o webhook faz o mínimo e responde rápido; quem trabalha de verdade é a rotina.
script/webhook-pagamento.js, ou seja, em /webhook-pagamento.sandbox/ e o status reconferido na API do provedor.sandbox/ e o script responde {"received": true} em 200.thread/ pega a fila, manda a mensagem (WhatsApp ou e-mail), marca o item como processado e escreve no log.Perguntas frequentes
A automação de horário gasta tokens?
Sim. O campo Mensagem é enviado para a sessão escolhida e o Harness processa como se você tivesse digitado: cada disparo gasta tokens. Rotina e webhook rodam código, sem IA. O gasto aparece em 📊 Consumo de Tokens e o administrador pode definir um limite mensal por usuário em Usuários.
Dá para ser avisado quando a execução falha?
A automação tem o campo Avisos, com e-mail e/ou Telegram, no modo sempre (com a resposta) ou só se der problema — configure os canais antes em 🔔 Canais de aviso e confira com 📨 Enviar teste.
A rotina não tem esse campo: o registro dela é o log, em logger/thread/<domínio>/<script>/, que aparece na tela de Scripts e que o Harness lê com 🪵 read_app_logs ou mostra com ⏱️ run_thread_once.
Um webhook pode ser chamado duas vezes pelo mesmo fato?
Pode, e reentrega é rotina: prazo curto do provedor, repetição de rede ou dois eventos para o mesmo fato. O script guarda o id do evento e ignora o que já viu; sem id no payload, ele compõe um, como PAYMENT_CONFIRMED|pay_123|RECEIVED. E o valor que importa é sempre reconferido na API do provedor antes de qualquer efeito.
Preciso deixar o painel ou o navegador aberto?
Não. A rotina é um programa que o servidor roda sozinho, mais ou menos a cada minuto, e o webhook é um endereço do site que outro sistema chama. A automação fica marcada no painel e o Harness recebe a mensagem no horário configurado.
Posso validar a assinatura HMAC do provedor?
Não há HMAC nativo para o script. As saídas são: tratar o caminho do webhook como segredo, reconferir o fato na API do provedor antes de agir, ou usar um cabeçalho de token adicional quando o provedor permitir. SHA-256 puro não é HMAC e nunca bate com a assinatura.
Automatizar é uma parte do app inteiro
Se o seu caso é ler dado de um sistema que já existe, ou colocar um agente de IA para atender os seus clientes, o caminho começa nas outras duas páginas.
fp-agent-run e conversa por usuário.
Guia do HarnessAs lições 13 (automações e avisos) e 45 (testar o que foi construído), com o exemplo completo da barbearia.