Auditoria de linhagem · Time de TI

De onde vem cada número dos dashboards de CS e Vendas

Rastreamento elemento por elemento — card, gráfico, filtro e tabela — até a fonte original do dado. Os dois dashboards leem o mesmo banco, mas por caminhos diferentes: é aí que nascem a duplicação e a defasagem.

Escopo cs-elmisti · sales-elmisti Banco analytics-elmisti-db (D1) Verificado em produção 09/08/2026
12abas mapeadas
21tabelas envolvidas
6fontes originais
5filtros quebrados
3números duplicados
2tabelas órfãs

O diagnóstico em uma frase

Não há um problema de coleta. Há um problema de troca de fonte pela metade.

Em vários pontos alguém trocou a origem de um número — normalmente por um motivo bom, como sair do banco intermediário e ir direto na fonte — mas não trocou junto o que orbita esse número: o filtro que o recorta, o menu que lista as opções, o cálculo auxiliar que aparece na mesma linha da tabela.

O resultado não é um erro que salta aos olhos. É pior: é um número que muda de significado conforme você mexe na tela. Você filtra por propriedade e o total vira zero. Você abre dois dashboards e o mesmo indicador dá 6 e 34. A taxa de cancelamento é 7,7% num caminho e 17,3% no outro. Tudo isso está acontecendo agora, em produção.

A cadeia de abastecimento

Todo dado percorre quatro etapas até virar número na tela. Onde cada etapa roda importa mais do que parece.

1 · Fonte original
GHL (CRM)2 contas: Rio e BA
leads, contatos, tags
Cloudbeds (PMS)5 propriedades
reservas, receita, status
Hotelaria DigitalMySQL de terceiro
chatbot, reviews, check-ins
Fidelimaxprograma de pontos
indicações
Groq · Llama 3.3análise das conversas
(Raio-X)
2 · Quem transporta
powerbi-syncWorker Cloudflare
a cada 5 min · nuvem
webhook-cloudbedsWorker Cloudflare
tempo real · nuvem
sync_cs_dashboardPython no Mac do Pedro
a cada 15 min
sync_sales_dashboardPython no Mac do Pedro
a cada 15 min
sync_dh_messagesPython no Mac do Pedro
a cada 15 min
sync_sales_raioxPython no Mac do Pedro
diário 06h · só se >15 dias
Fidelimax + CSATrodados à mão
sem agendamento
3 · Onde fica guardado
cs_opportunitiesGHL direto · sem hotel_id
csd_* (8 tabelas)via MySQL · com hotel_id
cloudbeds_bookingswebhook · property_id
sd_* (5 tabelas)vendas · property_id
csd_messagesconversas do chatbot
4 · O que você vê
CS Dashboard8 abas · 4 chaves de
propriedade diferentes
Sales Dashboard4 abas · só Brasil
na prática

Leia o risco na coluna 2: cinco dos sete transportadores rodam na sua máquina, via crontab. Mac desligado, dormindo ou sem rede = dashboard congelado sem nenhum aviso na tela — ele continua mostrando o último número que conseguiu buscar, com o carimbo "Atualizado: agora".

Os dez achados, em ordem de dano

Todos verificados chamando a API de produção hoje. Os números abaixo são reais, não estimativas.

CríticoFiltrar por propriedade zera metade do CS

Nas abas Atendimento e Contatos, escolher Brasil, Argentina ou qualquer hotel faz o número virar zero — não "poucos", zero. A causa é estrutural: a tabela cs_opportunities, que virou a fonte desses números, guarda a origem como texto ("Rio"/"BA") e não tem coluna de hotel. O código contorna escrevendo SELECT NULL as hotel_id, e NULL nunca casa com filtro nenhum.

Sem filtro ......... 1.306 atendimentos · 217 pré · 1.038 suporte Filtro Brasil ..... 0 atendimentos · 0 pré · 0 suporte Filtro Argentina .. 0 atendimentos · 0 pré · 0 suporte Filtro Ipanema .... 0 atendimentos · 0 pré · 0 suporte

cs-dashboard/functions/api/cs.js:107 · buildWhere()

CríticoCancelamento tem duas versões e elas discordam em mais que o dobro

Existem dois caminhos vivos para a mesma pergunta. A tela usa o do Cloudbeds; o outro continua sendo calculado a cada chamada e fica disponível na API para quem consumir.

cloudbeds_bookings (na tela) .. 24.403 reservas · 4.213 cancelados · 17,3% csd_bookings (via MySQL) ...... 20.540 reservas · 1.580 cancelados · 7,7% ───────────────────────────────────────── diferença ..................... 3.863 reservas · 2.633 cancelamentos

Vale investigar qual está certa antes de aposentar a outra: a diferença de 3.863 reservas sugere que o MySQL não recebe tudo, mas pode também ser recorte de período ou de propriedade.

Crítico"Tempo de resposta" quer dizer coisas diferentes nos dois dashboards

No Sales, o cálculo é honesto: percorre hora a hora, respeitando o turno individual de cada vendedor (Fred 8h–16h, Clara 14h–22h, e assim por diante) e conta só o tempo dentro do expediente.

No CS, não existe cálculo de horário útil. Pega-se a média corrida e multiplica-se por uma regra de três — 5 dias em 7, 6 horas em 24. É uma estimativa de fator fixo, não tempo útil medido.

CS · média corrida 32,5 min → × (5/7) × (6/24) → mostra "6 min" Sales · cálculo hora a hora dentro do turno → mostra "34,4 min"

Os dois números medem populações diferentes (CS e vendedores), então não deveriam ser iguais — mas hoje eles também não são comparáveis, e o card do CS promete "útil" no rótulo sem entregar.

CríticoO Sales cobre só o Rio, mas o filtro oferece a Argentina

A tabela de vendas é montada filtrando por booking_source nos códigos Central 1, 2, 9, 10 e 13 — que são os vendedores do Rio. Nenhuma reserva de Buenos Aires entra. O menu de propriedade, porém, lista BA Centro, BA Obelisco e Suites BA.

Propriedades com dado .. Ipanema (1.091) · Suites Copa (22) Filtro Argentina ....... 0 reservas · 0 propriedades

CríticoDois filtros do Sales nunca podem retornar nada

O menu "Status Reserva" oferece Cancelada e No Show. Mas a carga que monta a tabela exclui esses dois status na origem — eles nunca chegam a ser gravados. Escolher qualquer um dos dois devolve zero para sempre.

canceled → 0 · no_show → 0 · all → 1.113 · checked_out → 845

sales-dashboard/functions/api/sales.js:643 · WHERE status NOT IN ('canceled','no_show')

AltoO menu "Membro" vem de uma fonte, os números vêm de outra

O dropdown de membro é montado a partir de csd_opportunities (caminho antigo, via MySQL, 15 min). Os números que ele filtra vêm de cs_opportunities (caminho novo, GHL direto, 5 min). São dois espelhos diferentes do mesmo CRM, com atrasos diferentes.

Na prática: o menu pode listar alguém que sumiu dos números, ou omitir alguém que está lá.

AltoA rota principal carrega peso morto — e é ela que mantém a fonte duplicada viva

Sete campos são calculados toda vez que uma aba abre e nenhum deles aparece na tela: os contadores de IA e Humano, o total de reservas e os dois campos de cancelamento do caminho antigo.

Isso custa duas varreduras nas 184 mil linhas de mensagens e uma na tabela de reservas, a cada carregamento, para dado que é descartado no caminho. E é justamente esse cálculo que mantém csd_bookings — a versão duplicada do achado 2 — viva no fluxo principal.

Sobra um risco de fora: quem consumir a API diretamente (Power BI, n8n, planilha) vai ler atendimentos_ia = 36.902 como atendimento, quando são linhas de mensagem — 28× o número real de 1.306.

Calculados e descartados: atendimentos_ia · atendimentos_humano · total_bookings total_cancelamentos · taxa_cancelamento · by_mode · by_mode_month

AltoToda mensagem humana identificada é de Ipanema

Filtrar por Ipanema não muda o contador de mensagens humanas: 6.745 com filtro e sem filtro. Ou seja, 100% das mensagens que conseguimos atribuir a uma pessoa estão em Ipanema — as outras quatro propriedades aparecem com zero.

O motivo é o método de atribuição: o nome do atendente só é preenchido quando o telefone da conversa casa com um contato no MySQL, comparando os últimos 8 dígitos. Onde o cadastro de telefone é ruim, o nome não resolve — e isso bate com o que já sabemos sobre os números quebrados em BA.

AltoDuas tabelas órfãs: ninguém escreve nelas

csd_session_types — nenhum script a alimenta. Os dados param em junho/2026, dois meses atrás. Ainda responde pela rota interacoes_mensal, hoje não usada pela tela.

sd_seller_activity — completamente vazia. Alimentava a aba "Atividade" do Sales, que foi removida da interface mas continua respondendo pela API com campos nulos.

interacoes_mensal → último mês com dado: 2026-06 (hoje: 2026-08) atividade → by_day: 0 linhas · avg_hours: null para os 5 vendedores

AltoDois cards do Fidelimax ignoram o período escolhido

"Ativos" e "Ociosos" são calculados com date('now') — sempre os últimos 6 meses a partir de hoje, independente das datas que você selecionou na barra. Os outros cards da mesma aba respeitam o filtro. Some-se a isso que a tabela csd_fidelimax é carregada à mão, sem agendamento.

CS Dashboard — linhagem por aba

cs-elmisti.pages.dev · 8 abas. A coluna "Estado" marca o que precisa de decisão.

Barra de filtros global

O mesmo menu "Propriedade" usa quatro chaves diferentes conforme a aba — e uma delas não funciona.

FiltroDe onde saem as opçõesO que ele manda pra APIVale em quais abasEstado
Propriedade (modo região)Lista fixa no códigohotel_ids=1,4 (BR) ou 307,310,317 (AR)Atendimento · Interações · FAQ · ContatosZera Atendimento e Contatos
Propriedade (modo hotel)Lista fixa no códigohotel_id = 1, 4, 307, 310, 317Reviews · FidelidadeFunciona
Propriedade (modo Cloudbeds)Lista fixa no códigoproperty_id = 186910, 186883…CancelamentosFunciona
De / AtéEntrada manualstart / endTodasCada aba aplica numa coluna diferente: criação, avaliação, check-in, resposta ou cadastro
Membrocsd_opportunities (MySQL)memberAtendimento · ContatosFonte diferente da dos números (cs_opportunities)
StatusFixo: won / openstatusAtendimento · ContatosFunciona
EstágioFixo: pré / pós / in-house / suportestageAtendimento · ContatosNomes de etapa escritos à mão no código, com e sem acento
InteraçãoFixo: IA→Humano / DiretomodeInteraçõesTambém troca a fonte do gráfico da aba Atendimento
FAQ15 tags fixas no códigofaq_tagAtendimento · FAQ · ContatosTag nova no GHL não aparece até alguém editar o código
OTAFixo: 4 OTAsotaReviewsFunciona
Origemcloudbeds_bookings.booking_sourcesourceCancelamentosÚnico filtro montado a partir do dado real

Aba 1 — Atendimento 4 cards · 3 gráficos · 2 tabelas

O que você vêTabela que alimentaFonte originalAtualizaObservação
Total Atendimentoscs_opportunitiesGHL Rio + BA (API direta)5 min · nuvemZera com qualquer filtro de propriedade
Tempo Resposta (útil)csd_response_timesMySQL HD · sessões e mensagens do chatbot15 min · MacMédia corrida × 5/7 × 6/24 no navegador — não é horário útil medido
Tempo Atendimentocs_opportunitiesGHL · criação → última alteração dos "ganhos"5 min · nuvem"Última alteração" não é "momento do ganho": qualquer edição posterior infla o tempo
CSAT CScsd_contacts.tagsGHL · tags csat-cs-1..5manualDepende de um script rodado à mão; hoje 7 avaliações no total
Gráfico · Atendimentos por Mêscs_opportunities ou csd_sessionsGHL ou MySQL HD5 ou 15 minTroca de fonte quando o filtro "Interação" está ativo — mesmo gráfico, universo diferente
Tabela · colunas Total / Abertos / Ganhoscs_opportunitiesGHL5 min · nuvem—
Tabela · colunas Pré / In-House / Pós / Suportecs_opportunitiesGHL · nome da etapa5 min · nuvemDepende de a etapa estar escrita exatamente como no código
Tabela · coluna T. Respostacsd_response_timesMySQL HD15 min · MacMostra a média da região do membro, não a dele — Micaela e Tayla exibem sempre o mesmo valor
Tabela · coluna T. Atendimentocs_opportunitiesGHL5 min · nuvemEsta sim é individual
Tabela · coluna CSATcsd_contacts.tagsGHLmanual—
Gráficos + tabela CSATcsd_contacts.tagsGHLmanual—

Aba 2 — Interações 3 cards · 1 gráfico · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
Total Sessões CScsd_messagesMySQL HD · guest_messages15 min · MacAqui sim é sessão: as mensagens são agrupadas por conversa antes de contar
IA → Humano CScsd_messagesMySQL HD15 min · MacConversa que o bot iniciou e uma pessoa assumiu
Direto Humano CScsd_messagesMySQL HD15 min · Mac—
Gráfico · IA vs Humano por Mêscsd_messagesMySQL HD15 min · Mac—
Tabela · Interações por Membrocsd_messages.member_nameMySQL HD · casamento por telefone15 min · MacSó resolve quando o telefone casa nos últimos 8 dígitos — na prática só Ipanema
— (rota interacoes_mensal, fora do ar)csd_session_typesninguém escreveparado em jun/26Tabela órfã: não aparece na tela, mas responde pela API com dado velho

Aba 3 — FAQ 1 card · 1 gráfico

O que você vêTabela que alimentaFonte originalAtualizaObservação
Consultas FAQ (tags)csd_contacts.tagsMySQL HD · contacts (espelho do GHL)15 min · MacConta contato que tem a tag, não consulta feita. Tag não expira, então o número só sobe
Gráfico · Consultas por Tagcsd_contacts.tagsMySQL HD15 min · MacSó conta as 15 tags escritas no código; tag nova no GHL fica invisível

Aba 4 — Cancelamentos 6 cards · 1 gráfico · 2 tabelas

O que você vêTabela que alimentaFonte originalAtualizaObservação
Cancelamentos · Taxa · Total Reservascloudbeds_bookingsCloudbeds · webhooktempo real · nuvemA aba inteira usa Cloudbeds — é o caminho mais confiável dos dois dashboards
Booking.com · Reserva Direta · Outras OTAscloudbeds_bookings.booking_sourceCloudbedstempo real · nuvem—
Gráfico por Mês · Tabelas por Hotel e Origemcloudbeds_bookingsCloudbedstempo real · nuvemRecorta por data de check-in, não de reserva
— (rota cancelamentos, fora da tela)csd_bookingsMySQL HD · bookings15 min · MacCaminho paralelo: dá 7,7% contra 17,3%. Continua sendo calculado e servido pela API

Aba 5 — Reviews 6 cards · 1 gráfico · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
Total Reviews · Nota Médiacsd_reviewsMySQL HD · reviews15 min · MacQuem coleta das OTAs é a Hotelaria Digital — não temos controle nem visibilidade dessa etapa
Booking · Google · HostelWorld · TripAdvisorcsd_reviews por otaMySQL HD15 min · Mac—
Gráfico e tabela por OTAcsd_reviewsMySQL HD15 min · MacDado presente e contínuo de jan a ago/2026

Aba 6 — Contatos 4 cards · 1 gráfico · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
Pré · In-House · Pós · Suportecs_opportunitiesGHL · nome da etapa5 min · nuvemZera com filtro de propriedade, igual à aba Atendimento
Gráfico e tabela por membrocs_opportunitiesGHL5 min · nuvemA classificação depende de 12 nomes de etapa escritos no código; renomear uma etapa no GHL some com o dado sem erro

Aba 7 — Fidelidade 3 cards · 2 gráficos · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
% Recorrentes · Total Check-inscsd_checkinsMySQL HD · checkins (check-in online)15 min · MacRecorrente = times_stayed ≥ 1, campo que a Hotelaria Digital calcula — não conferimos o critério dela
Nota Avaliaçãocsd_checkin_reviewsMySQL HD · checkin_reviews15 min · MacAvaliação do check-in, diferente do review de OTA e diferente do CSAT
Gráficos e tabela por hotelcsd_checkins · csd_checkin_reviewsMySQL HD15 min · MacSó conta quem fez check-in online — não é o total de hóspedes

Aba 8 — Fidelimax 5 cards · 3 gráficos · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
Clientes · Taxa de Retenção · Com Saldocsd_fidelimaxFidelimax · carga manualsem agendamentoNenhum cron alimenta esta tabela — envelhece até alguém rodar o script à mão
Ociososcsd_fidelimaxFidelimaxsem agendamentoUsa "hoje menos 6 meses", ignorando o período que você escolheu na barra
(cálculo de Ativos, usado na Retenção)csd_fidelimaxFidelimaxsem agendamentoMesmo problema: contamina a Taxa de Retenção, que aparenta respeitar o filtro
Indicações · gráfico · Top Indicadorescsd_indicacoesFidelimax · webhooktempo real · nuvemEste caminho é sólido: chega direto na nuvem, sem intermediário

Sales Dashboard — linhagem por aba

sales-elmisti.pages.dev · 4 abas. Cobertura real: Rio apenas.

Barra de filtros global

FiltroDe onde saem as opçõesO que ele manda pra APIVale em quais abasEstado
PropriedadeLista fixa no HTMLproperty_id / property_idsTodasAs 3 opções da Argentina retornam zero — não há dado de BA
De / AtéEntrada manualstart / endTodasA aba CRM vs Vendas sobrescreve a data inicial (ver abaixo)
Vendedor5 nomes fixos no códigosellerTodasVendedor novo exige mexer no código em 3 lugares
StatusFixo: won / lost / openopp_statusCRMFunciona
Status Reserva8 opções fixascb_statusVendas"Cancelada" e "No Show" sempre retornam zero — excluídos na carga
Estágio6 stages fixosstageCRMNomes com grafia própria do GHL ("Em Negociaçao") copiados à mão

Aba 1 — CRM (GHL) 7 cards · 3 gráficos · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
Total Leads · Ganhos · Perdidos · Em Aberto · Taxa Conversãosd_opportunitiesMySQL HD · opportunities (espelho do GHL)15 min · MacRecorta pelo pipeline "Central de Vendas - El Misti" e pelos 5 vendedores
T. Resposta Médiosd_response_timesMySQL HD · sessões e mensagens15 min · MacCálculo hora a hora respeitando o turno individual — o método bom
T. Atendimento Médiosd_response_timesMySQL HD15 min · MacPrimeira mensagem até última resposta da sessão; descarta o que passa de 24h úteis, o que corta atendimentos longos
Leads por Vendedor · por Mêssd_opportunitiesMySQL HD15 min · Mac—
Funil de Stagessd_opportunities.stage_nameMySQL HD15 min · MacA ordem do funil é uma lista fixa no código; stage que não estiver nela some do gráfico sem aviso
Tabela · Detalhamentosd_opportunities + sd_response_timesMySQL HD15 min · MacAqui os tempos são individuais de verdade

Aba 2 — Vendas (Cloudbeds) 4 cards · 1 toggle · 2 gráficos · 1 tabela

Esta aba lê sd_reservations, que não vem do Cloudbeds direto: é uma cópia filtrada de cloudbeds_bookings, feita dentro do próprio banco pelo script que roda no seu Mac.

O que você vêTabela que alimentaFonte originalAtualizaObservação
Revenue Totalsd_reservations.revenueCloudbeds → cloudbeds_bookings → cópia filtrada15 min · MacSoma sem separar moeda. Hoje não morde porque só há Brasil — se BA entrar, vira BRL + USD no mesmo total
Reservas Criadas · Noitessd_reservationsCloudbeds15 min · MacExclui os quartos fictícios Voluntarios e VIRTUAL CARNAVAL
ADR Médiosd_reservationsCloudbeds15 min · MacReceita ÷ noites, calculado na hora
Toggle Criação / Partida———Troca a coluna de data entre created_at e checkout_date; muda bastante o desenho mensal
Revenue por Vendedor + tabelasd_reservations.seller_nameCloudbeds · booking_source15 min · Mac"Vendedor" é o canal Central 1/2/9/10/13 traduzido por uma tabela fixa — não é o usuário real do Cloudbeds
(rota alternativa sync_cloudbeds)sd_reservationsmesma cópia, acionada por URLmanualSegundo caminho de escrita na mesma tabela, exposto na API pública

Aba 3 — CRM vs Vendas 3 cards · 2 gráficos · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
Won no CRM (GHL)sd_opportunitiesMySQL HD15 min · Mac118 no período
Reservas (Cloudbeds)sd_reservationsCloudbeds15 min · Mac440 no mesmo período
Divergênciacálculo entre as duas——272,9% no total; Gustavo 1.016%. A aba cumpre o papel de denunciar — o problema está no registro, não no cálculo
Período efetivoMIN(created_at) do GHLMySQL HD15 min · MacIgnora sua data inicial e começa em 21/05/2026 — quando o GHL de vendas passou a existir. Só aparece numa nota discreta

Aba 4 — Raio-X 4 cards · 2 gráficos · 1 tabela

O que você vêTabela que alimentaFonte originalAtualizaObservação
Tom · Abordagem · Reação · Geralsd_raioxGroq · Llama 3.3 70B lendo conversas do MySQL HDdiário 06h, mas só re-executa se a última análise tiver +15 diasNota gerada por IA sobre no máximo 30 conversas por vendedor — é amostra, não censo
Radar · Barras · Tabela · Pontos fortes e a melhorarsd_raioxGroqquinzenal na práticaA tela mostra sempre a análise mais recente de cada vendedor, que pode ser de períodos diferentes entre si
— (aba "Atividade", removida)sd_seller_activityninguém escrevevaziaTabela órfã; a rota continua respondendo com campos nulos

Inventário das tabelas

Vinte e uma tabelas no mesmo banco, três prefixos, três gerações de decisão. O prefixo conta a história: csd_ e sd_ nasceram para os dashboards; cs_ veio do projeto de Power BI; cloudbeds_ é o webhook.

TabelaQuem escreveOnde rodaFrequênciaQuem lêEstado
cs_opportunitiespowerbi-syncCloudflare5 minCS: Atendimento, Contatossem hotel_id
csd_opportunitiessync_cs_dashboardMac15 minCS: só o menu Membroquase aposentada
csd_messagessync_dh_messagesMac15 minCS: Interações, cards IA/Humanoativa
csd_contactssync_cs_dashboard + script CSATMac15 min + manualCS: FAQ, CSAT2 produtores
csd_response_timessync_cs_dashboardMac15 minCS: tempo de respostaativa
csd_sessionssync_cs_dashboardMac15 minCS: gráfico, só com filtro Interaçãouso condicional
csd_bookingssync_cs_dashboardMac15 minAPI kpis, fora da teladuplica Cloudbeds
csd_reviewssync_cs_dashboardMac15 minCS: Reviewsativa
csd_checkinssync_cs_dashboardMac15 minCS: Fidelidadeativa
csd_checkin_reviewssync_cs_dashboardMac15 minCS: Fidelidadeativa
csd_fidelimaxscript rodado à mãoMacnenhumaCS: Fidelimaxsem agendamento
csd_indicacoeswebhook FidelimaxCloudflaretempo realCS: Fidelimaxativa
csd_session_types——parada jun/26rota fora da telaórfã
cloudbeds_bookingswebhook + backfillCloudflaretempo realCS: Cancelamentos · origem de sd_reservationsfonte confiável
sd_opportunitiessync_sales_dashboardMac15 minSales: CRM, CRM vs Vendasativa
sd_reservationssync_sales_dashboard + rota na APIMac15 min + manualSales: Vendas, CRM vs Vendas2 produtores · só Rio
sd_response_timessync_sales_dashboardMac15 minSales: CRMativa
sd_raioxsync_sales_raiox (Groq)MacquinzenalSales: Raio-Xativa
sd_seller_activity——vaziarota fora da telaórfã
sd_sync_logscripts de syncMac15 minninguémlog, não exibido
cs_stage_historypowerbi-syncCloudflare5 minPower BIfora destes 2 painéis

O que precisa da sua decisão

Os consertos técnicos o time resolve. Estes cinco pontos são escolha de negócio — envolvem trocar o significado de um número que alguém já usa.

  1. Cancelamento: 7,7% ou 17,3%?
    Antes de apagar o caminho duplicado, alguém precisa dizer qual é a verdade. A diferença de 3.863 reservas entre o Cloudbeds e o MySQL pode ser furo de sincronia — ou critério diferente do que conta como reserva. Sugestão: adotar Cloudbeds como fonte única e investigar o furo do MySQL em separado.
  2. Filtro de propriedade no CS: consertar ou remover?
    Para funcionar, é preciso traduzir "Rio/BA" do GHL para hotel, ou trazer a propriedade junto na sincronia. Enquanto isso não acontece, o filtro entrega zero — o que é pior do que não existir. Sugestão: esconder o filtro nessas duas abas até o conserto sair.
  3. "Tempo de resposta" do CS: padronizar pelo método do Sales?
    O Sales já calcula certo, hora a hora por turno. Migrar o CS para o mesmo método vai aumentar o número exibido de ~6 min para algo na casa dos 30 — e alguém vai perguntar por que "piorou". Não piorou: passou a ser medido. Precisa da sua decisão porque muda uma meta que a equipe já enxerga.
  4. Vendas de Buenos Aires: entram no Sales?
    Hoje o dashboard é do Rio com uma fachada de multi-propriedade. Ou mapeamos os canais de venda de BA e trazemos o dado — e aí precisamos resolver a mistura de real com dólar — ou assumimos o escopo e tiramos a Argentina do menu. As duas saídas são legítimas; a atual não é.
  5. Os pipelines saem do seu Mac?
    Cinco dos sete transportadores dependem da sua máquina estar ligada. Não há aviso quando param: o dashboard segue exibindo o último dado com carimbo de atualizado. Migrar para a nuvem, como já é o powerbi-sync, é trabalho de dias, não de horas. A decisão é de prioridade, não de viabilidade.