[reserve] Reservas (Stays webhook)

gqo5d5DfH242Q5hd · FINALIZADO · ativo · 12 nós

Identidade

campovalor
nome[reserve] Reservas (Stays webhook)
idgqo5d5DfH242Q5hd
estado no n8nativo
empresareserve-temporada
pilarReservas
bossBoss Reservas
workplaceFINALIZADO
IANÃO
triggerWebhook do Stays (POST) — reservation.created / modified / canceled / deleted
frequênciaa cada evento de reserva no Stays
nós · conexões12 · 12
tagsaudit:revisado · workplace verificado · boss:reservas · tipo:webhook · empresa:reserve · canal:stays · pilar:reservas
abrir no n8nhttps://n8n.rbrtecnologia.com.br/workflow/gqo5d5DfH242Q5hd

Papel

O dono da RESERVA. Recebe o evento do Stays e mantém o card do hóspede, a disponibilidade do imóvel e os avisos de nascimento e cancelamento. É quem cria o card; todo o resto da esteira trabalha em cima do que ele criou.

começa quando

Quando o Stays dispara o webhook.

termina quando

Ao devolver o resumo da operação (ok, reserva, titular, datas, financeiro, stats) — ou ao lançar IMOVEL_NAO_ENCONTRADO se uma reserva ATIVA tem listing que não resolve.

o que NÃO faz

posição na jornada

Primeiro nó da esteira. Tudo começa aqui.

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

#tiporeceberegra / condiçãoescreve / efeitosaídapróximoem falha
1WebhookwebhookPOST do Stays com action e payloadsempre — sem Basic Auth (só x-stays-signature HMAC); a checagem foi removida em 01/07 após LW01J/LW03J caírem em auth_failedbody.action · body.payloadpayload cruConfigHTTP 500 ao Stays
2Configsetgatilho do webhooksempredefine token do Notion, ids dos 4 bancos, bases e chaves do WAHA, os 4 templates de mensagem e as flags send_wa_* e modo_validacaoobjeto de configuraçãoMain
3Maincodepayload + configo coração, ~15 KB. Guardas em ordem: payload sem _id → shape_invalid · action=deleted → skip · type≠booked e não-cancel → skip · modified <120s após created → race_guardNotion: Imóveis (por Id Stays), Hóspedes (por ID Stays interno), Disponibilidade, Pricing Intelligence; payload do Stays inteiroCRIA/ATUALIZA cards de hóspede · marca disponibilidade Reservado/Disponível · arquiva duplicatas · incrementa Reservas Captadas no PI · envia WhatsApp ao hóspede (created) e ao proprietário · POST no Boss Tech em divergência de contagem{ok, reserva, titular, datas, financeiro, stats} — ou throwReserva válida? · IF · Main OK? · Cancelamento hóspede?lança IMOVEL_NAO_ENCONTRADO só se a reserva estiver ATIVA; em cancelamento registra e segue (fix 17/08)
4Reserva válida?ifsaída do Mainboss_notify === truejson.boss_notifypassa adianteBoss Reservas · msg (nova reserva)
5Boss Reservas · msg (nova reserva)setsaída do IFsempre que chegou aquireserva, hóspede, empreendimento, cota, datasmonta o evento do Boss{boss, evento, message}Boss Reservas · envia (nova reserva)
6Boss Reservas · envia (nova reserva)executeWorkflowevento montadosemprechama o [Workplace] Telegram OutboundfimcontinueOnFail — o aviso não derruba a reserva
7IF · Main OK?ifsaída do Mainok===true OU skip===truejson.ok · json.skipdois ramosKuma · push OK + Execution Log · ou Alerta Boss Tech + Execution Log
8Kuma · push OKhttpRequestramo de sucessosemprepush no monitor Kumafim
9HTTP · Execution LoghttpRequestsucesso OU falhasempre — os dois ramos alimentamstats do MainRPC cockpit_execution_log no Workplace, correlation_id stays-<reserva>confirmação com boss e pilar resolvidosfimonError=continueRegularOutput
10HTTP · Alerta Boss Tech (Main falhou)httpRequestramo de falhaMain devolveu ok:false sem skip intencionalerror/reason/reserva_idPOST no rt-boss-notify como boss=techfimneverError + onError=continueRegularOutput
11Cancelamento hóspede?ifsaída do Mainé cancelamento e o hóspede tem telefonestats/is_cancel/titular.telpassa adianteWAHA Reserve · Cancelamento Hóspede
12WAHA Reserve · Cancelamento HóspedehttpRequestsaída do IFsempre que chegou aquitemplate_hospede_cancel + dados da reservaWhatsApp ao hóspede pela sessão Reservefim

Ramos

Webhook → Config → Main
├─→ Reserva válida? ─(boss_notify)→ Boss msg → Boss envia
├─→ IF · Main OK?
│ ├─[ok ou skip]→ Kuma · push OK
│ │ └→ HTTP · Execution Log
│ └─[falhou]───→ HTTP · Alerta Boss Tech
│ └→ HTTP · Execution Log
└─→ Cancelamento hóspede? ─→ WAHA Cancelamento Hóspede

Dentro do Main, por evento:
├─ created → cria card por perna · marca estoque Reservado · WhatsApp ao hóspede
│ e ao proprietário · grava Qtd Hóspedes Contratados · PI +1
├─ modified → atualiza SÓ o operacional (imóvel, proprietário, financeiro, datas)
│ NUNCA toca nome, e-mail ou telefone · libera estoque antigo se trocou
│ de apartamento · NUNCA cria card
├─ canceled → cards para Cancelado · libera estoque a partir dos CARDS (fix 17/08)
│ · WhatsApp de cancelamento ao hóspede e ao proprietário
└─ deleted → skip explícito

Dados e autoridade

campoautoridadequem escrevequandoquem NÃO sobrescreve
nome · e-mail · telefone do hóspedeStays no created; PÁGINA/Voucher I depois dissogqo5 só no createdna criação do cardo modified NÃO sobrescreve — regra selada em 14/08, caso NM03J
Qtd Hóspedes ContratadosStaysgqo5, ramo createdna criaçãoo modified não toca — a gravação vive em _hospedePropsBase, que só o create usa
Propriedade · ProprietárioStays (_idlisting)gqo5created e modified
Check-in · Check-outStaysgqo5created e modifiedo formulário não altera
financeiro (valor, comissão, taxas)Staysgqo5created e modified, fatiado por diárias em reserva dividida
disponibilidadegqo5gqo5created marca Reservado · canceled marca Disponível

Status

aspectodetalhe
status escritosReserva (no create) · Cancelado (no cancel)
transições bloqueadasmodified NUNCA cria card — criar é responsabilidade do created; reserva sem card é a Sentinela que pega (fix 31/07, casos MY01J e MY07J)
cancelamentotodos os cards do ID Stays interno vão para Cancelado, independente de imóvel resolver
pós-checkoutNÃO SE APLICA — o Stays manda o evento, o workflow não julga data

Comunicações

públicoidentidadecanalcondiçãodeduptexto validadoconteúdomaterialidade
hóspedeReserveWhatsAppdentro do Main (bloco 9)action=created E card recém-criado E tem telefoneidempotência: só se hospedes_create_okSIM — 4/4 validadasboas-vindas + link do formulário + dica de ingressosmaterial
proprietárioRentalWhatsAppdentro do Main (bloco 10)created: todos os donos · modified: só donos NOVOS · canceled: todosdedup por proprietário únicoSIMnova reserva com empreendimento, cota, datas e código da reservamaterial
hóspedeReserveWhatsAppWAHA Reserve · Cancelamento Hóspedeé cancelamento e tem telefoneuma vez por eventoSIMaviso de cancelamento com período e titularmaterial — mas a POLÍTICA de manter ainda depende do Rafael
Boss ReservasTelegram via OutboundBoss Reservas · enviaboss_notify=trueSignal Gate no Outboundn/anova reservamaterial
Boss TechTelegram via rt-boss-notifyAlerta Boss Tech · e dentro do MainMain falhou · ou divergência na contagem de hóspedesn/aanomaliamaterial

Integrações

sistemapapel exato
Notion4 bancos: Hóspedes (cria/atualiza/arquiva), Imóveis (resolve listing), Disponibilidade (Reservado/Disponível), Pricing Intelligence (Reservas Captadas)
Staysorigem do evento; nunca é chamado de volta
WAHA Reservehóspede
WAHA Rentalproprietário
WorkplaceRPC cockpit_execution_log
Boss Eventrt-boss-notify e [Workplace] Telegram Outbound
Kumapush no sucesso
Supabase Rentalindireto — via o sync a cada 2 min, não por este workflow
Cloudflare WorkerNÃO SE APLICA
sub-workflows[Workplace] Telegram Outbound

Reserva dividida

SIM — é o workflow que a implementa. childs[] no payload viram N cards, um por cota. O financeiro é fatiado por diárias de cada perna (fix 08/07). O hóspede vê o período GLOBAL; o proprietário, o da sua perna. Pareamento determinístico no modified evita que dois filhos casem com o mesmo card (fix MH01J). Cancelamento arquiva por ID Stays interno + Propriedade, nunca só por ID (fix MA03J).

Idempotência e deduplicação

Tratamento de falhas

Alterações feitas na auditoria

datadefeito anteriorconsequênciacorreçãoevidênciatocou negócio?
13/08Template 4 de cancelamento ao hóspede existia e nunca disparavahóspede não era avisado do cancelamento2 nós novos alimentados pela saída do Main — o Code de 15 KB não foi tocadoexecuções de cancelamento passaram a dispararsim
13/08sem telemetria; tag status:wip rodando em PROD há 2 mesesexecução não registradaExecution Log nos dois ramos + tag removidanão
14/08E-mail e Telefone no updateProps do modifiedo Stays sobrescrevia com o alias da OTA e apagava o telefone gravado pelo formulário (caso NM03J)os dois campos saíram do updateProps; stats registra contato_hospede_no_modifiedexec 867626 em diante trazem 'nao_tocado'sim
17/08Qtd Hóspedes Contratados não era gravadasem ela não há base para calcular hóspedes adicionaissoma adults+children+infants no created, dentro de _hospedePropsBase (que só o create usa)cadeia provada até o Supabase com a NM03Jsim
17/08cancelamento de reserva multi-unit não liberava estoqueo cancel chega SEM childs, o listing raiz é o PAI/FAKE e o código o lia como single-unit. HA336I ficou Reservado 17–19/09 por reserva canceladano cancelamento o imóvel vem dos CARDS, não do payload; PAI não resolvido em cancel não lançacaso OU06J, execuções 866151 e 881348sim

Prova

EXECUÇÃO REAL

itemvalor
execução881346 · 17/08 16:17
reservaOQ11J · reservation.modified · childs=1
resultadosucesso · card atualizado · contato do hóspede não tocado
efeito verificadocockpit_execution_log id=476 · boss='Boss Reservas' · pilar='Reservas' · uses_ai=false
prova do guard de contatoexecuções 867626 (15/08) e 870021 registram contato_hospede_no_modified='nao_tocado'
prova da contagemNM03J: Notion 6 → Shape qtd_hospedes 6 → RPC hospedes_upserted 1

Limites — o que NÃO é defeito deste workflow

itemcamadaestado
Kuma sem acesso admininfraestrutura do PilarBLOQUEIO EXTERNO
3 segredos literais no Confighardening transversalPENDENTE
3 linhas de estoque da OU06J ainda Reservadosaneamento de dadosPENDENTE — dano legado, o fluxo já não produz mais
cards com contato destruído antes de 14/08saneamento de dadosNÃO MAPEADO — sem varredura retroativa
política da mensagem de cancelamento ao hóspededecisão do RafaelPENDENTE — foi restauração de template existente, não regra canônica

Veredito

FINALIZADO — Faz o que promete, com guardas datadas para cada caso real que quebrou, e os dois P1 encontrados na auditoria foram corrigidos e provados.

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.