me2kReWzbjo30YAv · FINALIZADO · ativo · 33 nós
| campo | valor |
|---|---|
| nome | [reserve] Voucher I |
| id | me2kReWzbjo30YAv |
| estado no n8n | ativo |
| empresa | reserve-temporada |
| pilar | Reservas |
| boss | Boss Reservas |
| workplace | FINALIZADO |
| IA | NÃO |
| trigger | Webhook POST /voucher-parte1-dados-hospede — chamado pelo Form Página Dados |
| frequência | sob demanda — a cada envio de formulário |
| nós · conexões | 33 · 38 |
| tags | audit:revisado · workplace verificado · boss:reservas · audit:revisado-20260707 · tipo:webhook · empresa:reserve · canal:stays · pilar:reservas · audit:revisado-20260705 |
| abrir no n8n | https://n8n.rbrtecnologia.com.br/workflow/me2kReWzbjo30YAv |
Recebe o formulário preenchido pelo hóspede e GRAVA no card do Notion. É a autoridade sobre os dados do hóspede a partir do momento em que ele preenche: o Stays só semeia no created, daqui em diante manda o que veio da página.
Quando o Form Página Dados posta os dados em formato LABELS.
Depois de gravar, avisar o hóspede pelo WhatsApp e registrar a telemetria.
Depois da página, antes da Conferência de Dados. Leva o card para Dados Recebidos.
| # | nó | tipo | recebe | regra / condição | lê | escreve / efeito | saída | próximo | em falha |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Webhook · Form Submit | webhook | POST com as 30 chaves em formato LABELS | sempre | body | — | body | Code · Parse Form | HTTP 500 |
| 2 | Code · Parse Form | code | body do webhook | normaliza os LABELS para o objeto f; monta os 4 corpos de update; aplica KEEP/SET/CLEAR | body inteiro | — | {f, compl_block, acomp_block, qtd_informada, removidos[], notion_update_*} | Set · Config | — |
| 3 | Set · Config | set | saída do Parse | sempre | — | define base do Notion, versão, data_source de Hóspedes, telefone do Rafael e modo_teste | configuração | Notion · Query Hospede by Reserva Stays | — |
| 4 | Notion · Query Hospede by Reserva Stays | httpRequest | config + id_stays | busca TODOS os cards com aquela Reserva Stays | Notion Hóspedes | — | results[] | Code · Branch (route) | HTTP 500 |
| 5 | Code · Branch (route) | code | results da query | 0 cards → B_create · status ≤ Envio ao Proprietario → A_update_dados · adiante → C_update_envio. Também compara 22 campos do form contra o card para decidir regen do Voucher II | results + f do Parse | — | {route, count, page_id, page_ids_extra[], status_atual, data_changed, regen, diffs, boss_tail, qtd_contratada, qtd_informada, adicionais, upsell, dedup_key} | Switch · Route | — |
| 6 | Switch · Route | switch | saída do Branch | route | json.route | — | 3 saídas | A · Notion Update · B · Notion Create Page · C · Notion Update | — |
| 7 | A · Notion Update → Dados Recebidos | httpRequest | rota A | card existe e está ≤ Envio ao Proprietario | notion_update_dados | PATCH no card: identidade, contato, endereço, acompanhantes e status → Dados Recebidos | página atualizada | A · Code · Build Body · Code · Extras · Upsell? | HTTP 500 |
| 8 | B · Notion Create Page | httpRequest | rota B | nenhum card encontrado | notion_create | CRIA o card do zero | página criada | Set · Boss Reservas msg (B - sem card) | HTTP 500 |
| 9 | C · Notion Update → Envio Proprietario | httpRequest | rota C | card já adiante (Pendente Assinatura ou mais) | notion_update_envio | PATCH dos dados SEM regredir o status | página atualizada | Regen Voucher II? · Code · Extras · Upsell? | HTTP 500 |
| 10 | A · Code · Build Body | code | saída da rota A | NUNCA (19/08: desligado do grafo — a Conferência assumiu a mensagem; nó mantido para rollback) | results da query, f do Parse, page_id | PATCH nos cards IRMÃOS da reserva dividida (replica os dados, preserva as datas de cada perna) | {krolik_body, extras_patch} | WAHA Reserve · Check Hosp (A) | try/catch no laço dos irmãos — falha não derruba o envio |
| 11 | Code · Extras (multi-unit) | code | rotas A e C | reserva dividida: prepara o PATCH dos demais cards | page_ids_extra | — | corpo do PATCH | Notion · PATCH Extras | — |
| 12 | Notion · PATCH Extras | httpRequest | saída do Extras | sempre que houver irmãos | — | PATCH nos cards irmãos | — | fim | — |
| 13 | Upsell? (adicionais > 0) | if | rotas A e C | adicionais > 0 — e adicionais só existe se contratada E informada existirem | Branch: adicionais | — | passa adiante | Boss Concierge · msg (hóspedes adicionais) | — |
| 14 | Boss Concierge · msg (hóspedes adicionais) | set | saída do IF | sempre que chegou aqui | contratada, informada, adicionais, dedup_key | monta o evento com notify=true | {boss:concierge, evento, message, dedup_key, ...} | Boss Concierge · envia (v1) | — |
| 15 | Boss Concierge · envia (v1) | executeWorkflow | evento montado | sempre | — | chama o [Workplace] Telegram Outbound | — | fim | continueOnFail |
| 16 | Set · Boss Reservas msg (B - sem card) | set | rota B | sempre | reserva, hóspede | monta o aviso | {boss, evento, message} | Telegram · Boss Reservas (B) | — |
| 17 | Telegram · Boss Reservas (B) | executeWorkflow | aviso montado | sempre | — | chama o Outbound | — | Code · Telemetria | — |
| 18 | Regen Voucher II? | if | rota C | status = Pendente Assinatura E algum dado relevante mudou | regen do Branch | — | dois ramos | Trigger Voucher II (regen) · ou Set (C - alterou) | — |
| 19 | Trigger Voucher II (regen) | httpRequest | ramo regen | sempre que chegou aqui | — | dispara o Voucher II para regerar o PDF | — | Set · Boss Reservas msg (C - alterou) | — |
| 20 | Set · Boss Reservas msg (C - alterou) | set | rota C | sempre | boss_tail e diffs do Branch | monta o aviso do que mudou | {boss, evento, message} | Telegram · Boss Reservas (C) | — |
| 21 | Telegram · Boss Reservas (C) | executeWorkflow | aviso montado | sempre | — | chama o Outbound | — | Code · Telemetria | — |
| 22 | WAHA Reserve · Check Hosp (A) | httpRequest | krolik_body | NUNCA (19/08: desligado do grafo — a Conferência assumiu a mensagem; nó mantido para rollback) | telefone do titular | consulta check-exists no WAHA | {numberExists, chatId} | IF · Hóspede tem WhatsApp? | — |
| 23 | IF · Hóspede tem WhatsApp? | if | resposta do check | NUNCA (19/08: desligado do grafo — a Conferência assumiu a mensagem; nó mantido para rollback) | json.numberExists | — | dois ramos | WAHA Send · ou Alerta Boss | — |
| 24 | WAHA Reserve · Send Hosp (A) | httpRequest | krolik_body | NUNCA (19/08: desligado do grafo — a Conferência assumiu a mensagem; nó mantido para rollback) | template com os dados conferidos | WhatsApp ao hóspede pela sessão Reserve | {id da mensagem} | Kuma · push OK · IF · WA falhou? | — |
| 25 | HTTP · Alerta Boss (hóspede sem WhatsApp) | httpRequest | ramo sem WhatsApp | NUNCA (19/08: desligado do grafo — a Conferência assumiu a mensagem; nó mantido para rollback) | — | POST no rt-boss-notify | — | Code · Telemetria | — |
| 26 | Kuma · push OK | httpRequest | envio feito | sempre | — | push no Kuma | {ok} | Code · Telemetria | — |
| 27 | IF · WA falhou? | if | resposta do envio | NUNCA (19/08: desligado do grafo — a Conferência assumiu a mensagem; nó mantido para rollback) | resposta do WAHA | — | um ramo | HTTP · Alerta Boss (WA falhou) | — |
| 28 | HTTP · Alerta Boss (WA falhou) | httpRequest | ramo de falha | NUNCA (19/08: desligado do grafo — a Conferência assumiu a mensagem; nó mantido para rollback) | — | POST no rt-boss-notify | — | fim | — |
| 29 | Code · Telemetria | code | 4 fins de rota mutuamente exclusivos | try/catch em toda leitura upstream — nó que não rodou lança em n8n | Parse Form, Branch, resposta do WAHA | — | {reserva, rota, cards, contratada, informada, adicionais, removidos, waha, erros, sucesso} | HTTP · Execution Log | nunca derruba |
| 30 | HTTP · Execution Log | httpRequest | saída da Telemetria | sempre | — | RPC cockpit_execution_log, correlation_id voucher1-<reserva> | confirmação | fim | onError=continueRegularOutput |
| 31 | Boss Reservas · msg (Dados Recebidos) | set | NADA — órfão | ÓRFÃO DE PROPÓSITO: 'Dados Recebidos' de rotina não é material (Silent by Default) | — | — | — | Boss Concierge · envia (v1), se fosse ligado | nunca executa |
| 32 | Set · rid p/ Conferência | set | saída do A · Notion Update → Dados Recebidos | rota A, sempre | id_stays do Code · Parse Form | — | {rid} | Conferência · evento (imediato) | — |
| 33 | Conferência · evento (imediato) | executeWorkflow | {rid} | rota A, sempre | — | chama [reserve] Conferência de Dados em modo evento e espera terminar | resultado da Conferência | Kuma · push OK | onError continueRegularOutput — a Conferência falhar não pode derrubar a gravação já feita |
| campo | autoridade | quem escreve | quando | quem NÃO sobrescreve |
|---|---|---|---|---|
| nome · CPF · RG · nascimento · e-mail · telefone · endereço | PÁGINA / este workflow | este workflow | no submit | o Stays no reservation.modified NÃO sobrescreve (regra de 14/08) |
| acompanhantes (14 propriedades) | este workflow | este workflow | no submit | vazio é KEEP — só remove_hospede_N ou remover_hospedes[] geram CLEAR |
| Status Autorização de Reserva | este workflow | rota A leva a Dados Recebidos | no submit | rota C NÃO regride o status |
| Check-in · Check-out | Stays | gqo5d5 | created/modified | saíram do update deste workflow em 14/08 |
| Qtd Hóspedes Contratados | Stays | gqo5d5 | created | este workflow só lê, para calcular adicionais |
| aspecto | detalhe |
|---|---|
| status lidos | Status Autorização de Reserva de todos os cards da reserva |
| status escritos | Dados Recebidos (rota A) · o create da rota B semeia |
| transições bloqueadas | rota C NÃO regride: card já em Pendente Assinatura ou adiante recebe os dados e mantém o estágio |
| regen do Voucher II | só quando status = Pendente Assinatura E algum dos 22 campos comparados mudou. Nunca regenera voucher já assinado |
| público | identidade | canal | nó | condição | dedup | texto validado | conteúdo | materialidade |
|---|---|---|---|---|---|---|---|---|
| hóspede | Reserve | WAHA Reserve · Send Hosp (A) | rota A e o hóspede tem WhatsApp | um envio por submissão | SIM — validada pelo Rafael em 17/08 | confirmação dos dados + links de confirmar e corrigir + ingressos | material | |
| Boss Concierge | — | Telegram via Outbound | Boss Concierge · msg | adicionais > 0 | dedup_key ups-<reserva>-<qtd_informada>, TTL 24h no motor_signal_gate | n/a | oportunidade de hóspedes adicionais, sem cobrança automática | material |
| Boss Reservas | — | Telegram via Outbound | Telegram (B) e (C) | rota B (card faltando) ou rota C (alteração pós-envio) | Signal Gate | n/a | aviso operacional | material |
| Boss Reservas | — | rt-boss-notify | Alerta Boss (sem WhatsApp / WA falhou) | hóspede sem WhatsApp ou falha no envio | n/a | n/a | escalada para contato humano | material |
| WhatsApp ao hóspede (rota A) | — | DESATIVADO em 19/08 | quem fala com o hóspede depois do formulário passou a ser a Conferência de Dados, dona única da mensagem |
| sistema | papel exato |
|---|---|
| Notion | PATCH e POST no banco de Hóspedes, incluindo os cards irmãos da reserva dividida |
| WAHA Reserve | check-exists + envio ao hóspede |
| Voucher II | POST para regerar o PDF quando o dado muda em Pendente Assinatura |
| Workplace | RPC cockpit_execution_log |
| Boss Event | [Workplace] Telegram Outbound e rt-boss-notify |
| Kuma | push após o envio — semântica errada, mede WhatsApp e não saúde |
| Supabase Rental | indireto, via sync a cada 2 min |
| Cloudflare Worker | NÃO SE APLICA — quem fala com o Worker é o Form |
| sub-workflows | [Workplace] Telegram Outbound |
SIM — grava em TODOS os cards da reserva, não só no da URL. O Build Body replica os dados nos irmãos preservando as datas de cada perna, e o Code · Extras faz o mesmo por outro caminho (dívida de desenho conhecida: dois caminhos paralelos, idempotentes). A mensagem ao hóspede mostra o período GLOBAL.
| data | defeito anterior | consequência | correção | evidência | tocou negócio? |
|---|---|---|---|---|---|
| 14/08 | vazio no formulário apagava identidade, contato e endereço já gravados | prefill mascarado + reenvio destruía dado real do hóspede | KEEP/SET/CLEAR: vazio preserva; só sinal explícito remove acompanhante | 26 das 29 propriedades apagavam antes; nenhuma apaga agora | sim |
| 14/08 | Check-in e Check-out saíam do update | a data é autoridade do Stays | removidos das rotas A e C | — | sim |
| 17/08 | rótulo externo dizia 'ID Stays:' | a palavra Stays vazava para o hóspede | virou 'Código da reserva:' por patch de âncora, sem reescrever o Code de 8 KB | texto vivo entregue e validado pelo Rafael | não — só texto |
| 17/08 | nenhum evento de upsell | hóspede informava mais gente que o contratado e ninguém via a oportunidade | adicionais = max(0, informada − contratada), nas rotas A e C | dedup provado ponta a ponta no motor_signal_gate, TTL 24h | sim |
| 17/08 | sem telemetria | execução não registrada | Code · Telemetria → Execution Log, 4 fins de rota exclusivos | — | não |
| 19/08/2026 | Parou de mandar a própria confirmação ao hóspede. A aresta para A · Code · Build Body saiu e entrou a chamada à Conferência de Dados em modo evento. Extras (multi-unit) e Upsell seguem ligados — a replicação nos cards irmãos nunca dependeu do Build Body, era duplicata. O Kuma da rota A pendurava no WAHA desligado e foi rependurado na Conferência, com onError para nunca derrubar a telemetria. |
EXECUÇÃO REAL
| item | valor |
|---|---|
| execução | 876841 · 16/08 20:22 · rota A |
| efeito verificado | PATCH do card confirmado, WhatsApp enviado ao hóspede |
| descoberta nessa execução | a resposta do Notion listou 'Qtd Hóspedes Contratados' entre as propriedades — foi assim que se provou que a property existia, sem usar o token em linha de comando |
| prova do upsell | dedup_key lido no Code · Normaliza Boss Event V2 do Outbound e repassado ao motor_signal_gate |
| telemetria | instalada em 17/08 — sem execução desde então; a gravação viva sai na próxima submissão |
| item | camada | estado |
|---|---|---|
| trusted IP e botão de remover acompanhante | Form Página Dados / Worker | backend daqui já aceita o sinal; o front não emite |
| Kuma medindo WhatsApp em vez de saúde | infraestrutura do Pilar | BLOQUEIO EXTERNO — sem admin |
| token do Notion literal no A · Code · Build Body | hardening transversal | PENDENTE — server-side, não exposto ao browser |
| órfão Boss Reservas · msg (Dados Recebidos) | desenho | INTENCIONAL — não religar |
| dois caminhos paralelos de escrita nos irmãos | dívida de desenho | idempotente — não vira trabalho |
FINALIZADO — Grava o que promete com KEEP/SET/CLEAR provado, não regride status, a comunicação foi validada e o upsell tem dedup real de ponta a ponta.
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.