lweuc1GnINcdFxl4 · FINALIZADO · ativo · 33 nós
| campo | valor |
|---|---|
| nome | [reserve] Conferência de Dados |
| id | lweuc1GnINcdFxl4 |
| estado no n8n | ativo |
| empresa | reserve-temporada |
| pilar | Reservas |
| boss | Boss Reservas |
| workplace | FINALIZADO |
| IA | NÃO |
| trigger | Cron 0 9 * * 1-5 (America/Sao_Paulo) + execução manual + webhook de teste |
| frequência | uma vez por dia útil, 9h BRT |
| nós · conexões | 33 · 32 |
| tags | audit:revisado · workplace verificado · boss:reservas · empresa:reserve · pilar:reservas |
| abrir no n8n | https://n8n.rbrtecnologia.com.br/workflow/lweuc1GnINcdFxl4 |
A RÉGUA DE COBRANÇA. Todo dia útil varre os cards que ainda devem dados, confere cada um contra a régua canônica, cobra o hóspede pelo WhatsApp em até 3 tentativas e transforma silêncio prolongado em pendência vermelha na Mesa.
Às 9h BRT de segunda a sexta.
Depois de cobrar quem falta, sincronizar as pendências com a Mesa e registrar a telemetria.
Depois do Voucher I. É o laço que segura a reserva até os dados ficarem completos.
| # | nó | tipo | recebe | regra / condição | lê | escreve / efeito | saída | próximo | em falha |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Cron · 9h BRT seg-sex | scheduleTrigger | — | 0 9 * * 1-5, fuso America/Sao_Paulo | — | — | disparo | Set · Config | errorWorkflow [Tech] Alerta de Erro |
| 2 | Manual · Run | manualTrigger | clique humano | sob demanda | — | — | disparo | Set · Config | — |
| 3 | Webhook · TEST Run | webhook | GET /webhook/conferencia-test-run | sob demanda — ATENÇÃO: modo_teste é fixo em false, então este webhook envia WhatsApp de verdade | — | — | disparo | Set · Config | — |
| 4 | Set · Config | set | qualquer trigger | sempre | — | define base e versão do Notion, data_source, base do Stays, telefone do Rafael, modo_teste=false e ignorar_state_ate | configuração | Notion · Query Hospedes | — |
| 5 | Notion · Query Hospedes | httpRequest | config | busca os cards na janela de coleta | Notion Hóspedes | — | results[] | Split · Hospedes | HTTP 500 |
| 6 | Split · Hospedes | splitOut | results | um item por card | — | — | N itens | Code · Extract Hospede Fields | — |
| 7 | Code · Extract Hospede Fields | code | um card | normaliza as propriedades do Notion para campos planos; nascimento vale como date OU texto com data de 2 ou 4 dígitos | todas as propriedades do card, incluindo Hospede 2–8 com nome, CPF e as 3 variantes de nascimento | — | {page_id, status_atual, id_stays, titular completo, endereço, datas, hospedes_extras[]} | Stays · GET Reservation | — |
| 8 | Stays · GET Reservation | httpRequest | id_stays | busca a reserva na API do Stays | reserva no Stays (CPF do titular, nº de hóspedes) | — | reserva | Notion · Get Imovel | — |
| 9 | Notion · Get Imovel | httpRequest | Propriedade do card | busca o imóvel | Tipo de Resort e Dormitório | — | imóvel | HTTP · Assinar Link | — |
| 10 | HTTP · Assinar Link | httpRequest | id_stays | pede um token assinado para o link do hóspede | — | — | {ok, t} | Code · Junta Token | — |
| 11 | Code · Junta Token | code | resposta da assinatura | o HTTP troca o $json e o Validate precisa das propriedades do imóvel — este nó junta os dois de volta | imóvel + token | — | imóvel + t | Code · Validate + Decide | token vazio se a assinatura falhar |
| 12 | Code · Validate + Decide | code | imóvel + token + card + reserva do Stays | o cérebro, 13 KB. Aplica a régua, calcula a tentativa (1/3, 2/3, 3/3), decide se cobra, se escala e se há divergência de CPF contra o Stays. Fora da janela de coleta → skip_status | tudo do card, do imóvel e da reserva do Stays | — | {acao, faltam[], detalhes{}, deve_mandar_wa, deve_escalar, has_concierge_msg, msg_concierge, msg_hq, krolik_body, tentativa_atual, cap_max, cpf_divergente} | IF deve_mandar_wa · IF deve_escalar · IF has_concierge_msg · Code · Telemetria | — |
| 13 | IF · deve_mandar_wa | if | decisão | deve_mandar_wa === true | json.deve_mandar_wa | — | passa adiante | WAHA Reserve · Check Number | — |
| 14 | WAHA Reserve · Check Number | httpRequest | telefone do titular | check-exists no WAHA | — | consulta | {numberExists, chatId} | IF · Hóspede tem WhatsApp? | — |
| 15 | IF · Hóspede tem WhatsApp? | if | resposta do check | numberExists | json.numberExists | — | dois ramos | WAHA Send Cobrança · ou Alerta Boss | — |
| 16 | WAHA Reserve · Send Cobrança | httpRequest | krolik_body | hóspede tem WhatsApp | texto com o que falta + link assinado | WhatsApp ao hóspede pela sessão Reserve | {id da mensagem} | IF · WA falhou? | — |
| 17 | IF · WA falhou? | if | resposta do envio | houve erro | resposta do WAHA | — | um ramo | HTTP · Alerta Boss (WA falhou) | — |
| 18 | HTTP · Alerta Boss (WA falhou) | httpRequest | falha de envio ou ausência de WhatsApp | sempre que chegou aqui | — | POST no rt-boss-notify | — | fim | — |
| 19 | IF · deve_escalar | if | decisão | deve_escalar === true | json.deve_escalar | — | passa adiante | Code · Mesa Conferência | — |
| 20 | IF · has_concierge_msg | if | decisão | has_concierge_msg === true | json.has_concierge_msg | — | passa adiante | Code · Mesa Conferência | — |
| 21 | Code · Mesa Conferência | code | itens de escalada e de concierge | só vira pendência o que é material: escalada e sem-fone. Rotina de régua é SILÊNCIO | acao, deve_escalar, msg_concierge, faltam | — | {registrar[], resolver[]} com dedupe_key e criticidade vermelho | Supabase · Mesa Sync | — |
| 22 | Supabase · Mesa Sync | httpRequest | registrar/resolver | sempre | — | RPC mesa_sync no Supabase Rental | {registradas, resolvidas, vermelhos_novos} | IF · vermelho novo? | — |
| 23 | IF · vermelho novo? | if | resposta do Mesa Sync | vermelhos_novos > 0 | json.vermelhos_novos | — | passa adiante | HTTP · Digest IMEDIATO | — |
| 24 | HTTP · Digest IMEDIATO | httpRequest | vermelho novo | sempre que chegou aqui | — | dispara o digest da Mesa de Reservas na hora | — | fim | — |
| 25 | Code · Telemetria | code | saída do Validate, uma vez por hóspede | agrega TUDO numa linha por execução, em vez de um registro por reserva. try/catch em toda leitura upstream | todos os itens do Validate | — | {hospedes, com_falta, wa_previsto, sem_telefone, escalados, cpf_divergente, acoes{}, resultado} | HTTP · Execution Log | nunca derruba |
| 26 | HTTP · Execution Log | httpRequest | saída da Telemetria | sempre | — | RPC cockpit_execution_log, correlation_id conferencia-<execução> | confirmação | fim | onError=continueRegularOutput |
| 27 | Set · Boss Reservas (escalada) | set | NADA — órfão | ÓRFÃO DE PROPÓSITO: caminho anterior a 17/07. A escalada passou a ir pela Mesa + Digest | msg_hq | — | — | Telegram · Boss HQ (CoS) | nunca executa |
| 28 | Telegram · Boss HQ (CoS) | executeWorkflow | — | inalcançável | — | — | — | fim | nunca executa |
| 29 | Set · Boss Reservas (validador) | set | NADA — órfão | ÓRFÃO DE PROPÓSITO: 'conferindo X, tentativa 2/3' é progresso normal, não é material | msg_concierge | — | — | Telegram · Boss Concierge | nunca executa |
| 30 | Telegram · Boss Concierge | executeWorkflow | — | inalcançável | — | — | — | fim | nunca executa |
| 31 | Quando chamado (evento imediato) | executeWorkflowTrigger | {rid} vindo do Voucher I | a cada formulário enviado | rid | — | {rid} | Set · Config | — (Set · Config deriva modo=evento quando rid vem preenchido) |
| 32 | IF · marcar Dados Incompletos? | if | decisão | deve_marcar_incompleto === true | json.deve_marcar_incompleto | — | passa adiante | Notion · Status Dados Incompletos | — |
| 33 | Notion · Status Dados Incompletos | httpRequest | PATCH /pages/{page_id} | há falta, empreendimento conhecido, status em Reserva ou Dados Recebidos | json.page_id | Status Autorização de Reserva = Dados Incompletos | confirmação do Notion | — | neverError + continueRegularOutput: marcar status nunca derruba a régua |
| campo | autoridade | quem escreve | quando | quem NÃO sobrescreve |
|---|---|---|---|---|
| dados do hóspede | página / Voucher I | este workflow NÃO escreve nada no card | nunca | — |
| pendências da Mesa | este workflow | RPC mesa_sync | quando escala ou detecta sem-fone | dedupe_key por reserva+fonte+motivo |
| CPF do titular | página / Voucher I | este workflow só COMPARA contra o Stays | na conferência | divergência vira sinal, não sobrescrita |
| aspecto | detalhe |
|---|---|
| status lidos | Status Autorização de Reserva — define a janela de coleta |
| status escritos | NENHUM — a régua cobra, não movimenta |
| fora da janela | acao = skip_status_<status>: card já adiante não é cobrado |
| Pendente Assinatura | cobrança pausada em 13/08 — a régua não distinguia quem não assinou de quem já mandou ao resort |
| público | identidade | canal | nó | condição | dedup | texto validado | conteúdo | materialidade |
|---|---|---|---|---|---|---|---|---|
| hóspede | Reserve | WAHA Reserve · Send Cobrança | deve_mandar_wa e tem WhatsApp | tentativa registrada por hóspede: 1/3, 2/3, 3/3 | NÃO — texto entregue ao Rafael em 18/08, aguardando | o que falta, item a item, + link assinado da página | material | |
| Rafael / Mesa | — | digest da Mesa de Reservas | HTTP · Digest IMEDIATO | vermelhos_novos > 0 | dedupe_key reserva|conferencia|escalada | n/a | pendência vermelha: DECIDIR <reserva>: hóspede não responde há 3 dias | material |
| Boss Reservas | — | rt-boss-notify | Alerta Boss (WA falhou) | sem WhatsApp ou falha no envio | n/a | n/a | escalada para contato humano | material |
| sistema | papel exato |
|---|---|
| Notion | leitura dos cards e do imóvel — NÃO escreve |
| Stays | GET da reserva para cruzar CPF e nº de hóspedes |
| WAHA Reserve | check-exists + cobrança ao hóspede |
| Supabase Rental | RPC mesa_sync — registra e resolve pendências |
| Mesa de Reservas | digest imediato quando nasce vermelho |
| Workplace | RPC cockpit_execution_log |
| Cloudflare Worker | indireto — o link assinado aponta para a página |
| Kuma | NÃO SE APLICA |
| sub-workflows | nenhum — a Régua Única foi arquivada em 18/08 |
PARCIAL — processa card a card, então cada perna é conferida e cobrada por si. Não consolida o período global nem deduplica cobrança entre pernas da mesma reserva. Não foi tratado como defeito: não houve caso observado.
| data | defeito anterior | consequência | correção | evidência | tocou negócio? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 18/08 | sem telemetria | execução não registrada no Workplace | Code · Telemetria agrega numa linha por execução → Execution Log | JS extraído do PROD rodado contra os itens reais da execução 886124 | não | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 18/08 | a exceção do Hot Beach não existia aqui | o RULEBOOK exige CPF válido de TODOS no Hot Beach; aqui 'Hot Beach' só aparecia na matriz de capacidade. Acompanhante sem CPF é barrado na portaria do resort | 4 linhas: se Hot Beach, confere CPF de cada acompanhante | offline com o JS do PROD nos 4 cenários; a exceção não vaza para Solar | sim | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 19/08/2026 | Virou a dona única da comunicação pós-formulário. Com dados completos em modo evento, acao passa a envia_confirma e sai a confirmação — o contrato transferido do WAHA 1/1 validado do Voucher I: espelho dos dados mais dois links distintos, Confirmar e Corrigir. No cron nada muda: a régua nunca confirmou, só cobra. Junto entrou a guarda de cardinalidade — antes a régua perguntava se os dados de quem está no card estão completos, nunca se está todo mundo ali. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 1 | 9 | / | 0 | 8 | : | p | a | s | s | a | a | m | a | r | c | a | r | o | c | a | r | d | e | m | D | a | d | o | s | I | n | c | o | m | p | l | e | t | o | s | ( | s | t | a | t | u | s | e | x | i | s | t | i | a | n | o | D | B | e | n | i | n | g | u | e | m | e | s | c | r | e | v | i | a | ) | e | n | u | n | c | a | e | n | v | i | a | c | h | a | v | e | i | n | t | e | r | n | a | a | o | h | o | s | p | e | d | e | — | o | t | e | x | t | o | v | e | m | d | e | d | e | t | a | l | h | e | s | q | u | a | n | d | o | f | a | l | t | a | e | n | t | r | a | d | a | n | o | L | A | B | E | L | S | . |
EXECUÇÃO REAL
| item | valor |
|---|---|
| execução | 886124 · 18/08 12:00Z (09:00 BRT) · sucesso em 15s |
| caso | OQ11J · check-in 13/09 · Solar das Águas 2D |
| decisão | acao=conferir_2_de_3 · faltam cpf, endereco, nascimento, qtd_hospedes |
| efeito verificado | WhatsApp ENVIADO com id confirmado pelo WAHA · link assinado (?t=) |
| escalada | deve_escalar=false — nada foi para a Mesa, corretamente |
| telemetria | instalada depois dessa execução; validada offline com os itens reais dela |
| item | camada | estado |
|---|---|---|
| texto da cobrança | GATE humano | PENDENTE — entregue ao Rafael em 18/08 |
| token do Notion literal no Set · Config | hardening transversal | PENDENTE |
| 4 nós do caminho anterior a 17/07 | desenho | INTENCIONAL — o comentário datado no código impede que alguém religue |
| consolidação de cobrança em reserva dividida | desenho | NÃO MAPEADO — sem caso observado |
| modo_teste fixo em false | desenho | o Webhook TEST envia WhatsApp de verdade — testar exige cuidado |
FINALIZADO — Cobra o hóspede todo dia útil com régua e tentativa registradas, escala silêncio prolongado pela Mesa, e o único gap real encontrado — a exceção do Hot Beach — foi fechado e testado.
Fonte: estrutura-workflows.json (definição viva do n8n PROD, sanitizada) + fichas-detalhe.json · gerado por scripts/gerar-fichas.py. Nenhum token, senha ou PII nesta página.