[reserve] Conferência de Dados

lweuc1GnINcdFxl4 · FINALIZADO · ativo · 33 nós

Identidade

campovalor
nome[reserve] Conferência de Dados
idlweuc1GnINcdFxl4
estado no n8nativo
empresareserve-temporada
pilarReservas
bossBoss Reservas
workplaceFINALIZADO
IANÃO
triggerCron 0 9 * * 1-5 (America/Sao_Paulo) + execução manual + webhook de teste
frequênciauma vez por dia útil, 9h BRT
nós · conexões33 · 32
tagsaudit:revisado · workplace verificado · boss:reservas · empresa:reserve · pilar:reservas
abrir no n8nhttps://n8n.rbrtecnologia.com.br/workflow/lweuc1GnINcdFxl4

Papel

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.

começa quando

Às 9h BRT de segunda a sexta.

termina quando

Depois de cobrar quem falta, sincronizar as pendências com a Mesa e registrar a telemetria.

o que NÃO faz

posição na jornada

Depois do Voucher I. É o laço que segura a reserva até os dados ficarem completos.

Mapa nó a nó — ordem real de execução

#tiporeceberegra / condiçãoescreve / efeitosaídapróximoem falha
1Cron · 9h BRT seg-sexscheduleTrigger0 9 * * 1-5, fuso America/Sao_PaulodisparoSet · ConfigerrorWorkflow [Tech] Alerta de Erro
2Manual · RunmanualTriggerclique humanosob demandadisparoSet · Config
3Webhook · TEST RunwebhookGET /webhook/conferencia-test-runsob demanda — ATENÇÃO: modo_teste é fixo em false, então este webhook envia WhatsApp de verdadedisparoSet · Config
4Set · Configsetqualquer triggersempredefine base e versão do Notion, data_source, base do Stays, telefone do Rafael, modo_teste=false e ignorar_state_ateconfiguraçãoNotion · Query Hospedes
5Notion · Query HospedeshttpRequestconfigbusca os cards na janela de coletaNotion Hóspedesresults[]Split · HospedesHTTP 500
6Split · HospedessplitOutresultsum item por cardN itensCode · Extract Hospede Fields
7Code · Extract Hospede Fieldscodeum cardnormaliza as propriedades do Notion para campos planos; nascimento vale como date OU texto com data de 2 ou 4 dígitostodas 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
8Stays · GET ReservationhttpRequestid_staysbusca a reserva na API do Staysreserva no Stays (CPF do titular, nº de hóspedes)reservaNotion · Get Imovel
9Notion · Get ImovelhttpRequestPropriedade do cardbusca o imóvelTipo de Resort e DormitórioimóvelHTTP · Assinar Link
10HTTP · Assinar LinkhttpRequestid_stayspede um token assinado para o link do hóspede{ok, t}Code · Junta Token
11Code · Junta Tokencoderesposta da assinaturao HTTP troca o $json e o Validate precisa das propriedades do imóvel — este nó junta os dois de voltaimóvel + tokenimóvel + tCode · Validate + Decidetoken vazio se a assinatura falhar
12Code · Validate + Decidecodeimóvel + token + card + reserva do Stayso 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_statustudo 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
13IF · deve_mandar_waifdecisãodeve_mandar_wa === truejson.deve_mandar_wapassa adianteWAHA Reserve · Check Number
14WAHA Reserve · Check NumberhttpRequesttelefone do titularcheck-exists no WAHAconsulta{numberExists, chatId}IF · Hóspede tem WhatsApp?
15IF · Hóspede tem WhatsApp?ifresposta do checknumberExistsjson.numberExistsdois ramosWAHA Send Cobrança · ou Alerta Boss
16WAHA Reserve · Send CobrançahttpRequestkrolik_bodyhóspede tem WhatsApptexto com o que falta + link assinadoWhatsApp ao hóspede pela sessão Reserve{id da mensagem}IF · WA falhou?
17IF · WA falhou?ifresposta do enviohouve erroresposta do WAHAum ramoHTTP · Alerta Boss (WA falhou)
18HTTP · Alerta Boss (WA falhou)httpRequestfalha de envio ou ausência de WhatsAppsempre que chegou aquiPOST no rt-boss-notifyfim
19IF · deve_escalarifdecisãodeve_escalar === truejson.deve_escalarpassa adianteCode · Mesa Conferência
20IF · has_concierge_msgifdecisãohas_concierge_msg === truejson.has_concierge_msgpassa adianteCode · Mesa Conferência
21Code · Mesa Conferênciacodeitens de escalada e de conciergesó vira pendência o que é material: escalada e sem-fone. Rotina de régua é SILÊNCIOacao, deve_escalar, msg_concierge, faltam{registrar[], resolver[]} com dedupe_key e criticidade vermelhoSupabase · Mesa Sync
22Supabase · Mesa SynchttpRequestregistrar/resolversempreRPC mesa_sync no Supabase Rental{registradas, resolvidas, vermelhos_novos}IF · vermelho novo?
23IF · vermelho novo?ifresposta do Mesa Syncvermelhos_novos > 0json.vermelhos_novospassa adianteHTTP · Digest IMEDIATO
24HTTP · Digest IMEDIATOhttpRequestvermelho novosempre que chegou aquidispara o digest da Mesa de Reservas na horafim
25Code · Telemetriacodesaída do Validate, uma vez por hóspedeagrega TUDO numa linha por execução, em vez de um registro por reserva. try/catch em toda leitura upstreamtodos os itens do Validate{hospedes, com_falta, wa_previsto, sem_telefone, escalados, cpf_divergente, acoes{}, resultado}HTTP · Execution Lognunca derruba
26HTTP · Execution LoghttpRequestsaída da TelemetriasempreRPC cockpit_execution_log, correlation_id conferencia-<execução>confirmaçãofimonError=continueRegularOutput
27Set · Boss Reservas (escalada)setNADA — órfãoÓRFÃO DE PROPÓSITO: caminho anterior a 17/07. A escalada passou a ir pela Mesa + Digestmsg_hqTelegram · Boss HQ (CoS)nunca executa
28Telegram · Boss HQ (CoS)executeWorkflowinalcançávelfimnunca executa
29Set · Boss Reservas (validador)setNADA — órfãoÓRFÃO DE PROPÓSITO: 'conferindo X, tentativa 2/3' é progresso normal, não é materialmsg_conciergeTelegram · Boss Conciergenunca executa
30Telegram · Boss ConciergeexecuteWorkflowinalcançávelfimnunca executa
31Quando chamado (evento imediato)executeWorkflowTrigger{rid} vindo do Voucher Ia cada formulário enviadorid{rid}Set · Config— (Set · Config deriva modo=evento quando rid vem preenchido)
32IF · marcar Dados Incompletos?ifdecisãodeve_marcar_incompleto === truejson.deve_marcar_incompletopassa adianteNotion · Status Dados Incompletos
33Notion · Status Dados IncompletoshttpRequestPATCH /pages/{page_id}há falta, empreendimento conhecido, status em Reserva ou Dados Recebidosjson.page_idStatus Autorização de Reserva = Dados Incompletosconfirmação do NotionneverError + continueRegularOutput: marcar status nunca derruba a régua

Ramos

Cron 9h / Manual / Webhook TEST → Config → Query Hóspedes → Split
→ Extract → Stays GET → Get Imóvel → Assinar Link → Junta Token
→ Validate + Decide
├─→ IF deve_mandar_wa ──→ Check Number → tem WhatsApp?
│ ├─[sim]→ Send Cobrança → IF WA falhou? → Alerta Boss
│ └─[não]→ Alerta Boss
├─→ IF deve_escalar ──────┐
├─→ IF has_concierge_msg ─┴→ Mesa Conferência → Mesa Sync
│ └→ IF vermelho novo? → Digest IMEDIATO
└─→ Code · Telemetria → HTTP · Execution Log

ÓRFÃOS (4 nós, de propósito — caminho anterior a 17/07):
Set (escalada) → Telegram Boss HQ nunca executa
Set (validador) → Telegram Boss Concierge nunca executa

Dados e autoridade

campoautoridadequem escrevequandoquem NÃO sobrescreve
dados do hóspedepágina / Voucher Ieste workflow NÃO escreve nada no cardnunca
pendências da Mesaeste workflowRPC mesa_syncquando escala ou detecta sem-fonededupe_key por reserva+fonte+motivo
CPF do titularpágina / Voucher Ieste workflow só COMPARA contra o Staysna conferênciadivergência vira sinal, não sobrescrita

Status

aspectodetalhe
status lidosStatus Autorização de Reserva — define a janela de coleta
status escritosNENHUM — a régua cobra, não movimenta
fora da janelaacao = skip_status_<status>: card já adiante não é cobrado
Pendente Assinaturacobrança pausada em 13/08 — a régua não distinguia quem não assinou de quem já mandou ao resort

Comunicações

públicoidentidadecanalcondiçãodeduptexto validadoconteúdomaterialidade
hóspedeReserveWhatsAppWAHA Reserve · Send Cobrançadeve_mandar_wa e tem WhatsApptentativa registrada por hóspede: 1/3, 2/3, 3/3NÃO — texto entregue ao Rafael em 18/08, aguardandoo que falta, item a item, + link assinado da páginamaterial
Rafael / Mesadigest da Mesa de ReservasHTTP · Digest IMEDIATOvermelhos_novos > 0dedupe_key reserva|conferencia|escaladan/apendência vermelha: DECIDIR <reserva>: hóspede não responde há 3 diasmaterial
Boss Reservasrt-boss-notifyAlerta Boss (WA falhou)sem WhatsApp ou falha no envion/an/aescalada para contato humanomaterial

Integrações

sistemapapel exato
Notionleitura dos cards e do imóvel — NÃO escreve
StaysGET da reserva para cruzar CPF e nº de hóspedes
WAHA Reservecheck-exists + cobrança ao hóspede
Supabase RentalRPC mesa_sync — registra e resolve pendências
Mesa de Reservasdigest imediato quando nasce vermelho
WorkplaceRPC cockpit_execution_log
Cloudflare Workerindireto — o link assinado aponta para a página
KumaNÃO SE APLICA
sub-workflowsnenhum — a Régua Única foi arquivada em 18/08

Reserva dividida

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.

Idempotência e deduplicação

Tratamento de falhas

Alterações feitas na auditoria

datadefeito anteriorconsequênciacorreçãoevidênciatocou negócio?
18/08sem telemetriaexecução não registrada no WorkplaceCode · Telemetria agrega numa linha por execução → Execution LogJS extraído do PROD rodado contra os itens reais da execução 886124não
18/08a exceção do Hot Beach não existia aquio 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 resort4 linhas: se Hot Beach, confere CPF de cada acompanhanteoffline com o JS do PROD nos 4 cenários; a exceção não vaza para Solarsim
19/08/2026Virou 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.
19/08: passa a marcar o card em Dados Incompletos (status existia no DB e ninguem escrevia) e nunca envia chave interna ao hospede o texto vem de detalhes quando falta entrada no LABELS.

Prova

EXECUÇÃO REAL

itemvalor
execução886124 · 18/08 12:00Z (09:00 BRT) · sucesso em 15s
casoOQ11J · check-in 13/09 · Solar das Águas 2D
decisãoacao=conferir_2_de_3 · faltam cpf, endereco, nascimento, qtd_hospedes
efeito verificadoWhatsApp ENVIADO com id confirmado pelo WAHA · link assinado (?t=)
escaladadeve_escalar=false — nada foi para a Mesa, corretamente
telemetriainstalada depois dessa execução; validada offline com os itens reais dela

Limites — o que NÃO é defeito deste workflow

itemcamadaestado
texto da cobrançaGATE humanoPENDENTE — entregue ao Rafael em 18/08
token do Notion literal no Set · Confighardening transversalPENDENTE
4 nós do caminho anterior a 17/07desenhoINTENCIONAL — o comentário datado no código impede que alguém religue
consolidação de cobrança em reserva divididadesenhoNÃO MAPEADO — sem caso observado
modo_teste fixo em falsedesenhoo Webhook TEST envia WhatsApp de verdade — testar exige cuidado

Veredito

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.