O que o yapt. faz — e como falar disso

Este mapa existe porque a New Way construiu mais produto do que consegue explicar. Funcionalidade que ninguém sabe que existe não vira venda, não vira conteúdo e não vira argumento.

Cada item traz o que é, o mecanismo real por trás, a dor que resolve, por que importa em negócio e uma frase pronta pra usar em reunião ou proposta.

148 funcionalidades · 137 em produção · 5 parcial · 3 em desenvolvimento · 2 planejado · 1 não implementado · varredura contra origin/main em 31/07/2026

Nada encontrado com esse filtro.

01

Aquisição e Atribuição

Como o cliente chega — e como saber de onde veio.

yaAcquisition Hub

Em produção

tela única que reúne as três portas de entrada de leads do yapt. — Botão do WhatsApp, Widgets de webchat e Formulários — num só lugar.

Como funciona

/src/pages/Acquisition.tsx é um shell de 3 abas (wa_button, widget, form) sobre a mesma tabela widget_configs, discriminada pela coluna acquisition_type. Cada aba lista as instâncias já criadas e oferece criação de uma nova (useCreateAcquisitionInstance), edição (redireciona para o builder dedicado) e exclusão (useDeleteAcquisitionInstance).

Resolve

hoje o gestor não sabe quantas portas de captação tem ativas nem onde configurar cada uma — cada uma vivia espalhada.

Por que importa

reduz o tempo de setup de uma nova campanha de captação porque tudo — botão, widget, formulário — nasce do mesmo modelo de dados e do mesmo fluxo de aprovação.

Como falar disso

"Todo jeito de captar lead — botão do WhatsApp, chat no site, formulário — configurado no mesmo lugar, plugado na mesma IA."

Botão do WhatsApp

Em produção

CTA inteligente para site que captura nome e WhatsApp do visitante e o leva direto para uma conversa com contexto, em vez de um link genérico de wa.me.

Como funciona

builder dedicado (WaButtonBuilder.tsx) grava em widget_configs (com acquisition_type = 'wa_button') o número, a mensagem inicial, o estilo do botão (wa_button_style), os campos capturados (wa_button_capture_fields, padrão ['phone']) e — opcionalmente — um disparo automático via Instant Engage: quando wa_button_auto_engage_enabled está ligado, o clique no botão não apenas abre o WhatsApp, dispara um template aprovado da Meta (wa_button_auto_engage_template_id) pelo canal escolhido, com variáveis mapeadas. Auto-save com debounce de 1.5s a cada edição.

Resolve

botão de WhatsApp comum joga o visitante para uma conversa fria, sem saber de onde ele veio nem o que ele queria.

Por que importa

a IA já entra na conversa sabendo a origem do clique — não precisa perguntar "de onde você me achou" nem repetir o que o visitante já disse no site.

Como falar disso

"O botão de WhatsApp do seu site não é só um link — ele já entrega o contexto pra sua IA antes da primeira mensagem."

Widget de Webchat

Em produção

chat embutido no site do cliente, com a mesma IA que atende WhatsApp e Instagram, capaz de qualificar o visitante antes de puxá-lo para o WhatsApp.

Como funciona

SDK vanilla TS de ~5KB gzip (widget/src/sdk.ts) injetado via <script> IIFE, que carrega um iframe com a UI do chat (widget/src/widget.ts) e fala com o backend por widget-api (config pública, registro de visitante) e webhook-widget (mensagens entram no MESMO pipeline de contato → conversa → ai-orchestrator, resposta devolvida via Supabase Realtime broadcast). Rastreia UTMs, scrollDepth e tempo na página via uma classe PageTracker interna. Progressive profiling é configurável por field_collection_moment: before_chat (formulário antes de conversar), during_chat ou after_resolution. Gatilho proativo (proactive_enabled) dispara uma bolha de mensagem depois de N segundos (proactive_delay_seconds, padrão 30s) filtrando por página (proactive_pages). "Ponte pro WhatsApp" (wa_bridge_enabled) troca o canal sem perder o histórico. Quando o visitante do widget informa e-mail ou telefone que já batem com um contato existente (ex: já é contato de WhatsApp), a RPC widget_identify_and_merge (chamada em webhook-widget/index.ts) funde o contato do widget (cookie_id) com o contato já existente, com confiança 1.0 (telefone) ou 0.9 (e-mail) — sem isso, o mesmo visitante viraria dois contatos separados no CRM.

Resolve

visitante do site que quer tirar uma dúvida rápida não quer baixar WhatsApp nem sair da página — mas se ele quiser continuar por lá depois, a conversa não pode recomeçar do zero.

Por que importa

primeiro contato B2B geralmente começa no site, não no WhatsApp — sem widget, esse lead se perde ou vira e-mail frio.

Como falar disso

"Visitante chega no site, a IA qualifica no chat, e se ele preferir continuar no WhatsApp, a conversa vai junto — sem repetir nada."

Formulários de Captação (Intake)

Em produção

formulários multi-página para onboarding, pesquisa e qualificação de lead, publicados com link próprio.

Como funciona

IntakeTemplateBuilder monta o template (/intake/new, /intake/:id), listado em IntakeTemplates.tsx. Vive na aba "Formulários" do yaAcquisition Hub junto com a conexão ao iLeadway (ILeadwayConnectionCard).

Resolve

qualificação de lead que hoje depende de pergunta manual no WhatsApp — formulário estruturado captura isso antes da IA ou do vendedor entrar em cena.

Por que importa

padroniza os dados de entrada do lead (mesmos campos sempre), o que alimenta scoring e roteamento com informação consistente.

Como falar disso

"Formulário de qualificação que já entra pronto no funil — sem digitar tudo de novo no CRM."

CTWA — Clique-para-WhatsApp com atribuição completa

Em produção

quando o lead clica num anúncio "Enviar mensagem" da Meta e cai direto no WhatsApp, o yapt. reconhece de qual anúncio, campanha e criativo ele veio.

Como funciona

a mensagem que chega pelo WhatsApp oficial (BSP) traz um objeto referral da Meta com ctwa_clid. O webhook protegido webhook-bsp-platform (arquivo sob regra de não-alteração sem autorização expressa) extrai 10 campos: ctwa_clid, source_id, source_type (os 3 clássicos) + source_url, headline, body, media_type, image_url, video_url, thumbnail_url (a cópia e a mídia do anúncio). Cria um registro em contact_attributions com todos os 10 campos e attribution_model = 'last_touch'; em contacts.metadata grava um subconjunto de 7 (fica de fora video_url/thumbnail_url, que só vivem em contact_attributions.metadata). Em seguida faz join com ad_ads/ad_adsets/ad_campaigns pelo source_id (id do anúncio na Meta) para enriquecer o registro com nome da campanha, do conjunto de anúncios e do anúncio — rodando como tarefa de fundo (não bloqueia a resposta do webhook).

Resolve

hoje, sem CTWA, uma conversa de WhatsApp aberta por anúncio não tem como provar que veio daquele anúncio — o CTWA fecha essa lacuna, campo a campo.

Por que importa

é a base para calcular ROI real por campanha e por criativo (não só por canal) — sem isso, "gasto com Meta Ads" e "venda fechada no WhatsApp" são dois números que nunca se encontram.

Como falar disso

"Todo clique em 'Enviar mensagem' no anúncio chega no WhatsApp já etiquetado — sabemos qual campanha, qual anúncio e até qual imagem trouxe aquele lead."

Instant Engage

Em produção

quando um lead preenche um Lead Form da Meta ou do Google Ads, o yapt. dispara automaticamente a primeira mensagem de WhatsApp (ou e-mail) — sem esperar um vendedor puxar a conversa.

Como funciona

ad-lead-webhook (Meta) e google-ads-lead-webhook (Google) recebem o lead, criam o contato e o registro em contact_attributions (utm_source=meta|google, utm_medium=lead_form). Se a campanha tem metadata.instant_engage.enabled = true, resolve as variáveis do template aprovado (mapa de +20 variáveis: {{contact.name}}, {{deal.value}}, {{utm_campaign}} etc., com fallback para o formato legado {{contact_name}}) e chama send-active-message com o template configurado. Suporta canal WhatsApp ou e-mail — se for e-mail, exige contactEmail em vez de contactPhone. Ao concluir, emite o evento lead.instant_engage_sent e marca ad_leads.status = 'engaged'.

Resolve

lead de anúncio esfria em minutos — se ninguém falar com ele rápido, o CPL vira dinheiro jogado fora.

Por que importa

transforma o intervalo entre "preencheu o formulário" e "primeira mensagem" de horas (esperando um humano ver a notificação) para o tempo de resposta do próprio webhook.

Como falar disso

"Lead Form preenchido, mensagem no WhatsApp já chega puxando o contexto da campanha — antes que ele esqueça que clicou no anúncio."

Integração Meta Ads

Em produção

conexão com contas de anúncio da Meta para sincronizar campanhas, conjuntos de anúncio e anúncios, e devolver métricas de performance no yapt.

Como funciona

OAuth simplificado grava a conexão; ad-sync-campaigns puxa da Graph API (v21.0) campanhas, adsets e ads com upsert em lote (3 chamadas ao banco por sincronização, não uma por entidade); ad-sync-insights traz CPC, CTR, impressões e conversões; ad-sync-forms sincroniza os Lead Forms configurados; ad-token-refresh renova o token OAuth. Suporta seleção multi-conta de anúncio.

Resolve

hoje, olhar performance de campanha Meta e olhar performance de venda no yapt. são dois sistemas diferentes — a integração junta os dois numa tela só.

Por que importa

sem sync automático, o time reconstrói manualmente (planilha) o que a campanha gastou vs. o que ela gerou de lead e venda.

Como falar disso

"Sua conta de anúncios Meta conectada de um lado, seu funil de vendas do outro — no mesmo painel."

Integração Google Ads

Em produção

o mesmo pipeline do Meta Ads, mas para campanhas do Google — sincronização de campanhas, Instant Engage e loop de conversão.

Como funciona

google-ads-oauth-init/google-ads-oauth-callback fazem a autenticação; google-ads-sync-campaigns e google-ads-sync-insights trazem campanhas e métricas; google-ads-lead-webhook processa Lead Form Extension do Google (payload com gcl_id, user_column_data) e dispara Instant Engage igual ao fluxo Meta; google-ads-send-conversion fecha o loop enviando conversão de volta para o Google.

Resolve

cliente que investe em Google Ads (não só Meta) ficava sem a mesma inteligência de atribuição que o Meta Ads já tinha.

Por que importa

mesma lógica, mesmo tempo de resposta, para uma segunda fonte de tráfego pago — não é preciso escolher entre atribuir Meta ou Google.

Como falar disso

"Anúncio do Google que também vira WhatsApp em segundos — o mesmo motor do Meta Ads, agora nos dois canais."

Campaign Intelligence

Em produção

ficha de contexto de negócio por campanha — o que ela vende, para quem, e a que preço — para a IA usar na conversa, não só métricas de mídia.

Como funciona

CampaignIntelligenceDialog.tsx grava em ad_campaigns.metadata (JSONB, que o sync automático nunca sobrescreve) os campos intelligence.expected_ticket (ticket médio esperado), intelligence.product_context (qual produto a campanha vende), intelligence.target_audience (perfil do público), além de funnel_stage, urgency_level e sales_approach. Esse mesmo JSONB carrega a config do Instant Engage (instant_engage.*). A função SQL get_conversation_fast_context usa esses dados (via JOIN com ad_campaigns) para montar o contexto que a IA recebe assim que a conversa abre.

Resolve

a IA que responde um lead de campanha não sabe, por padrão, o que aquela campanha específica prometeu ou vendeu — Campaign Intelligence fecha essa lacuna sem exigir configuração por conversa.

Por que importa

evita que a IA repita pergunta que a campanha já respondeu (ex: "qual produto você quer?") quando o anúncio já era específico sobre isso.

Como falar disso

"Cada campanha carrega seu próprio contexto de venda — a IA já sabe o que aquele anúncio prometeu antes de responder."

yapt Tag

Em produção

tag server-side (via Google Tag Manager) que rastreia eventos do site do cliente — principalmente compra — e os liga de volta ao contato e à campanha, mesmo sem cookies de terceiros.

Como funciona

snippet v2 (GTM_SNIPPET, gerado em src/pages/settings/YaptTag.tsx) roda no navegador do visitante: lê variáveis de e-commerce do dataLayer (transaction_id, value, items), hasheia e-mail/telefone em SHA-256 via Web Crypto API no próprio navegador (nunca envia PII em texto claro), captura ctwa_clid, fbclid, gclid e UTMs (com fallback da query string se a variável do GTM vier vazia), e envia tudo com event_id estável (deduplicado por sessionStorage) para a Edge Function yapt-ingest via header X-Yapt-Api-Key. Dali, o evento passa por um pipeline de 3 etapas assíncronas: yapt-ingest grava em tag_events; yapt-enricher (via fila pgmq ou cron de segurança a cada 30s) resolve contato/conversa/pedido; yapt-dispatcher reenvia o evento resolvido para a Meta CAPI (e futuros destinos), com circuit breaker por tenant+destino (abre depois de 5 falhas seguidas, fecha depois de 3 sucessos em half-open, fica aberto por 60s). No painel, o admin liga quais eventos (purchase, lead, deal_won, add_to_cart) disparam para Meta CAPI e quais para Google.

Resolve

cliente que roda Nuvemshop/Shopify e WhatsApp junto não conseguia provar que uma venda no site veio de uma conversa iniciada por anúncio — sem essa ponte, a compra "acontece" sem dono.

Por que importa

recupera atribuição de compra mesmo para visitante anônimo, batendo e-mail/telefone hasheado contra o contato já identificado por outro canal — sem depender de cookie de terceiro, que navegadores e leis de privacidade vêm matando.

Como falar disso

"A venda no seu site também conta a história de qual anúncio trouxe o cliente — mesmo que ele nunca tenha se identificado no checkout."

Motor de atribuição (matching de identidade)

Em produção

o mecanismo que decide, para cada evento capturado, "esse evento é de qual contato" — a peça que junta pixel, clique e conversa numa única linha do tempo.

Como funciona

resolveMatch() (supabase/functions/_shared/yapt-tag-match.ts) tenta resolver o contact_id numa ordem de prioridade fixa, parando no primeiro que bater: (1) user_id explícito → contacts.external_id; (2) anonymous_id do widget → widget_visitors.visitor_id; (3) telefone normalizado → contact_identifiers; (4) e-mail normalizado → contact_identifiers; (5) ctwa_clidcontact_attributions; (6) gclidcontact_attributions; (7) fbclidcontact_attributions. Depois de achar o contato, resolve também a conversa mais recente (janela de 30 dias, priorizando conversa já atribuída a um vendedor) e, para eventos de compra, o pedido correspondente (tenta source_external_id primeiro, depois order_number, porque o GTM manda o número visível ao cliente, não o ID interno da plataforma). Um passo extra "injeta" o ctwa_clid histórico (até 6 meses atrás) num evento de compra que não trouxe click ID — para não perder a atribuição de campanha numa venda que só aconteceu semanas depois do clique.

Resolve

o mesmo lead aparece em canais diferentes com identificadores diferentes (visitante anônimo no site, número de telefone no WhatsApp, e-mail no formulário) — sem esse motor, cada canal vira um "contato" separado.

Por que importa

é o que permite dizer "essa venda de R$X veio daquele clique de campanha há 3 semanas", mesmo que o cliente tenha comprado por um caminho totalmente diferente do clique original.

Como falar disso

"A gente não perde o fio da meada — telefone, e-mail, clique de anúncio, visita anônima ao site: tudo aponta pro mesmo contato."

Loop de conversão (CAPI de volta às plataformas)

Em produção

depois de atribuir a venda ou o lifecycle do lead, o yapt. devolve essa informação para a Meta e o Google — para o algoritmo de anúncio otimizar com base em venda real, não só em clique.

Como funciona

duas rotas complementares. (1) yapt Tag → yapt-dispatcher: eventos do site (purchase, lead, add_to_cart) resolvidos pelo enricher são reenviados à Meta Conversions API. (2) Conversion Destinations → ad-send-conversion: painel de "Destinos de Conversão" (ConversionsTab.tsx, DestinationsList.tsx, DestinationFormDialog.tsx) permite ao admin cadastrar destinos (Meta, e Google via google-ads-send-conversion) e mapear eventos de ciclo de vida do CRM (mudança de estágio, deal_won) para eventos de plataforma (event_mappings). Quando um automation-worker processa a fila capi_conversion, ad-send-conversion resolve o token OAuth (Vault), hasheia PII em SHA-256 e envia o evento à Graph API — com log de cada envio em ad_conversion_events e badge de saúde do destino (DestinationHealthBadge.tsx).

Resolve

campanha otimizada só por "clique" ou "lead" (sinais fracos) tende a trazer mais do mesmo lead ruim — sem devolver a venda de verdade para a plataforma, o algoritmo de anúncio nunca aprende o que é cliente bom.

Por que importa

é a diferença entre pagar por lead e o algoritmo aprender a trazer lead que compra — outra camada de ROI que só existe se a conversão volta pra plataforma de anúncio.

Como falar disso

"A venda que fechou no WhatsApp volta pro Meta e pro Google como conversão real — o anúncio aprende a trazer quem compra, não só quem clica."

Integrações de e-commerce (Shopify, WooCommerce, Nuvemshop)

Em produção

conexão direta com a loja virtual do cliente para trazer pedidos, clientes e produtos para dentro do yapt. — usada para fechar o ciclo de atribuição de compra.

Como funciona

motor de sync agnóstico de plataforma (supabase/functions/_shared/commerce-sync/) com um PlatformAdapter por loja — adapter-shopify.ts, adapter-woocommerce.ts, adapter-nuvemshop.ts — cada um implementando fetchOrders, normalizeOrder, extractCustomer e mapeamento de status de pagamento para o formato comum do yapt. (adapter-registry.ts decide qual adapter usar por platform; order-processor.ts e sanitize-credentials.ts completam o motor compartilhado). commerce-catalog-sync sincroniza produtos, commerce-reconciliation concilia pedidos, shopify-customer-sync traz clientes do Shopify. Desde a última varredura, o pipeline ganhou mais três Edge Functions: commerce-order-sync, commerce-catalog-feed e commerce-knowledge-indexer (indexação do catálogo para a IA usar em conversa). O catálogo de apps nativos de 1 clique (native-apps-config.ts) também cresceu: além de Shopify, WooCommerce, Nuvemshop, Hotmart, Kiwify, Bling e Advbox, agora inclui integrações de logística, provedor e ERP — ou seja, deixou de ser só ads/e-commerce e passou a cobrir logística e ERP também. Cada app mantém mapeamento padrão de campos (ex.: buyer.email → contact.email) e triggers padrão (ex.: criar deal em compra aprovada).

Resolve

a venda que acontece no site (não no WhatsApp) ficava fora do funil do yapt. — sem isso, o time de vendas não vê o histórico completo do cliente nem consegue provar que uma campanha gerou venda direto no e-commerce.

Por que importa

fecha o ciclo "clique → conversa → compra no site" — sem essa integração, metade do funil (a compra em si) fica invisível para quem mede ROI de campanha.

Como falar disso

"Pedido feito direto na loja também entra no funil — e ainda carrega a campanha que trouxe o cliente."

Divergências com o material de marketing
  • Webchat listado como "Planejado" em docs/features/FEATURES.md (seção "MODULOS SECUNDARIOS"), mas o código mostra uma Fase 1 completa e em produção (SDK, UI, widget-api, webhook-widget, progressive profiling, gatilho proativo, ponte WhatsApp, PageTracker) — e agora também a Fase 2 de merge de contato (ver abaixo). Vale sinalizar para não subvender essa funcionalidade como "planejada".
  • Links curtos / rastreio de URL dedicado: reconfirmado no main — não existe nenhuma feature de encurtador de link ou redirecionamento de URL rastreado neste repositório (yapt). A memória do time menciona um projeto "broadcast.yapt.ai links curtos" como iniciativa separada — se o marketing pretende divulgar isso como parte da Aquisição, ainda não está implementado aqui.
  • Instant Engage "<30 segundos" — divergência CONFIRMADA, ainda ativa no main: a narrativa em docs/features/FEATURES.md e CLAUDE.md promete envio "em <30s" e descreve o disparo como "fire-and-forget". No código atual (ad-lead-webhook/index.ts e google-ads-lead-webhook/index.ts), o envio via send-active-message continua aguardado (await) de forma síncrona dentro do próprio handler do webhook, sem waitUntil/tarefa de fundo e sem medição de latência/SLA — o tempo real depende da resposta da Meta/BSP e não há instrumentação que garanta ou meça os "<30s". A promessa de tempo é plausível mas segue não-instrumentada e não-garantida no código.
Falso alarme da varredura anterior
  • Widget de Webchat — "Fase 2 (merge de contato widget→CRM) ainda não implementada": ERA verdade no checkout desatualizado, mas já foi construída — migration supabase/migrations/20260412000000_widget_identity_merge.sql (11/04/2026) e RPC widget_identify_and_merge, chamada em webhook-widget/index.ts, fundem automaticamente o contato do widget com um contato existente por telefone (confiança 1.0) ou e-mail (confiança 0.9). Só o "exit intent" da Fase 2 continua de fato ausente.

> Última varredura: 31/07/2026 (origin/main)

02

Inteligência Artificial

O motor que conversa, entende, lembra e decide.

Orquestrador de IA

Em produção

o cérebro que decide, mensagem a mensagem, o que a IA faz — responder sozinha, sugerir para o humano ou ficar quieta.

Como funciona

pipeline por mensagem (ai-orchestrator): sanitização → checagem de blocklist → rate limit por tenant → debounce/agregação de burst → contexto rápido da conversa (cacheado, com validação de tenant a cada acerto de cache) → decisão de estado via get_handler_context → resolução do modo de operação → carregamento do agente → checagem de guardrails de handoff → execução. O agente tem à disposição 54 ferramentas (criar negócio, mover etapa do pipeline, agendar reunião, enviar template, consultar catálogo, pedir humano etc.), cada uma roteada para o handler real que a executa. Internamente, o pipeline foi reorganizado por estratégia (autônomo, sussurro, zona de IA cada um com seu próprio módulo), mas o comportamento ponta a ponta é o mesmo pipeline auditável de sempre.

Resolve

"a IA responde qualquer coisa e eu não sei por quê" — aqui toda decisão passa por um pipeline auditável, não por um prompt solto conversando livre.

Por que importa

é o que garante que a IA age dentro de regras da operação (não vende fora de estoque, não ignora um pedido de humano, não repete a mesma pergunta) em vez de improvisar.

Como falar disso

"A IA do yapt. não improvisa: cada mensagem passa por um pipeline de decisão antes de qualquer resposta sair." "Você define as regras, o orquestrador garante que elas valem em toda conversa."

Estados de atendimento (bot ativo, humano ativo, transição)

Em produção

o controle de quem está no comando da conversa a cada momento — a IA, o humano, ou uma transição entre os dois.

Como funciona

cada conversa carrega um estado (bot_active, pending_handoff, human_active, pending_return, closed, e mais recentemente human_reviewing — humano revisando antes de a IA voltar a assumir) guardado no próprio registro da conversa. A troca de estado passa por uma rotina de transição dedicada, então nunca existe uma zona cinzenta onde IA e humano respondem ao mesmo tempo sem controle.

Resolve

duas pessoas (uma de carne, uma de IA) respondendo a mesma conversa em cima uma da outra — a fonte clássica de constrangimento no atendimento automatizado.

Por que importa

evita retrabalho e mensagem duplicada/contraditória para o cliente final.

Como falar disso

"A conversa sempre tem um dono claro: IA ou humano, nunca os dois ao mesmo tempo sem controle." "A transição de IA para humano — e de volta — é rastreada, não é um chute."

Habilidades do agente (MAT)

Em produção

o conjunto de ações reais que a IA pode executar dentro do yapt. — não só conversar, mas agir no CRM, no pipeline, no catálogo, na agenda.

Como funciona

um registro central de handlers organizado por domínio: mensagens, conversa, contato, negócio (deal), tag, agendamento, base de conhecimento, procedimentos, qualificação, escalonamento, notificação, comércio/carrinho, frete, imobiliário, fonte de dados, zona conversacional, comandos financeiros, campos customizados, e estágio/triagem de ticket de suporte — 54 habilidades ao todo, cada execução protegida por retry e circuit breaker (se uma ferramenta começa a falhar, o sistema para de tentá-la em vez de insistir cegamente). Algumas contas verticais têm habilidades adicionais específicas do próprio segmento de negócio (ex.: consulta a sistemas externos de billing/plano), plugadas no mesmo registro central.

Resolve

IA que só "bate papo" mas não resolve nada de verdade (não move o negócio de etapa, não agenda, não consulta estoque).

Por que importa

transforma a IA de atendente que conversa em operadora que executa — cada habilidade é uma tarefa que deixa de precisar de um humano.

Como falar disso

"A IA do yapt. não só conversa: ela move o negócio no pipeline, agenda, consulta catálogo, aplica tag — na hora, dentro da própria conversa." "Mais de 50 ações reais que a IA pode tomar sozinha, cada uma com proteção contra falha em cascata."

IA com memória infinita

Em produção

a IA lembra do histórico relevante de cada contato, mesmo entre conversas separadas, sem precisar que o cliente repita tudo de novo.

Como funciona

antes de responder, o motor busca os fatos mais relevantes já guardados sobre aquele contato (busca por relevância, não histórico bruto); depois de responder, grava novos fatos aprendidos, em segundo plano, sem atrasar a resposta ao cliente. A memória pode ser isolada por agente (cada agente só enxerga o que é dele) ou compartilhada entre agentes do mesmo contato, dependendo da configuração. Todo registro é isolado por conta — nunca vaza entre clientes. Se a busca de memória falhar por qualquer motivo, o motor monta o contexto a partir do histórico recente da própria conversa e do negócio ativo — a resposta nunca trava esperando a memória. O motor de memória hoje pode rodar com o armazenamento local (dentro do próprio banco) ou externo, dependendo da conta e de forma reversível — troca de backend sem mudar o que o cliente final percebe.

Resolve

"toda vez que eu volto a falar com a empresa, tenho que explicar tudo de novo" — a queixa mais comum de atendimento automatizado ruim.

Por que importa

cliente recorrente é atendido como quem já é conhecido, o que reduz atrito e mensagens repetidas — e isso é percebido, não é só bastidor técnico.

Como falar disso

"A IA do yapt. lembra do seu cliente — não só da conversa de hoje, do histórico inteiro." "Memória infinita: o cliente não repete o que já disse, mesmo voltando semanas depois."

Detecção de emoção na conversa

Em produção

a IA lê o tom emocional de cada mensagem do cliente e acumula uma leitura de tendência ao longo da conversa.

Como funciona

duas camadas. Uma rápida e imediata, que olha padrões de texto para decidir na hora se a conversa precisa de atenção humana urgente. Uma profunda, que roda em segundo plano a cada minuto e classifica cada mensagem por sentimento, intensidade e sinais específicos (frustração, urgência, risco de perda do cliente, entusiasmo, prontidão de compra, entre outros, até 3 sinais por mensagem). Essa leitura entra no score comportamental do contato e alimenta um painel de "pulso emocional" com a tendência da conversa, visível em tempo real para quem está atendendo.

Resolve

atendente (ou gestor) que só percebe que o cliente está insatisfeito depois que ele já cancelou ou reclamou publicamente.

Por que importa

dá um alerta antecipado de risco (cliente irritado, prestes a desistir) para o time agir antes de perder a venda ou o cliente.

Como falar disso

"O yapt. sente o clima da conversa antes de você precisar ler tudo — cliente irritado ou pronto para comprar aparece no painel, não só no texto." "Detecção de emoção na conversa: prioriza atenção humana onde ela realmente faz diferença."

Mentor

Em produção

a IA que orienta o atendente humano durante o trabalho — não substitui, treina.

Como funciona

dois formatos. Um embutido: quando um agente configurado como "consultor" está ativo numa conversa conduzida por humano, o motor injeta um prompt de coaching que orienta a condução em tempo real. Outro dedicado: um chat interativo separado, onde o colaborador pode conversar diretamente com o Mentor para tirar dúvidas, revisar abordagem ou pedir sugestão — com histórico e analytics próprios.

Resolve

onboarding lento de vendedor/atendente novo, e falta de padrão de qualidade entre quem já é bom e quem está aprendendo.

Por que importa

acelera curva de aprendizado do time sem depender de um gestor sentado do lado o dia inteiro.

Como falar disso

"O Mentor treina o seu time dentro do próprio atendimento — não é um curso à parte, é orientação no momento em que ela importa." "Todo atendente tem um mentor de IA disponível, no chat e durante a conversa real com o cliente."

Painel de sussurro

Em produção

a IA sugere, em tempo real, o que o atendente humano deveria responder ou fazer — sem enviar nada sozinha.

Como funciona

enquanto a conversa está com um humano, o motor gera passos de sugestão transmitidos ao vivo e grava cada sugestão concreta com seu nível de confiança. Um filtro de relevância suprime sugestões triviais e reforça a sugestão quando detecta objeção do cliente ou sinal de fechamento — ou seja, o sussurro fica mais presente exatamente nos momentos de maior risco/oportunidade da venda.

Resolve

atendente travado sem saber o que responder, ou perdendo o timing de fechar uma venda por não reconhecer o sinal.

Por que importa

reduz a dependência de experiência individual do atendente — a IA nivela a qualidade da resposta no momento certo.

Como falar disso

"A IA sussurra a resposta certa no ouvido do seu time, no momento certo — quem decide enviar continua sendo a pessoa." "O painel de sussurro aparece mais forte exatamente quando o cliente está objetando ou pronto para fechar."

AI Coverage Zones (zona de cobertura de IA em fluxo)

Em produção

dentro de um fluxo automatizado (yaFlows), um trecho pode ser entregue à IA para conduzir livremente, com regras que ela é obrigada a respeitar.

Como funciona

o fluxo tem um tipo de nó dedicado a essa zona; enquanto ela está ativa, a automação determinística do fluxo não dispara por cima — a IA assume aquele trecho. Uma Edge Function separada do orquestrador principal processa essas mensagens. Cada passo da zona pode ter um contrato de guardrail: ferramentas que a IA é obrigada a chamar, tipos de saída permitidos, ou até supressão forçada da resposta — uma validação programática por cima do que o modelo de linguagem gera, configurável por conta.

Resolve

fluxo 100% automatizado que trava quando o cliente sai do roteiro, ou fluxo 100% de IA que perde o controle do que precisa acontecer (ex: sempre capturar um dado obrigatório).

Por que importa

combina o melhor dos dois mundos — trecho determinístico onde precisa ser previsível, IA onde precisa ser flexível — dentro do mesmo fluxo.

Como falar disso

"Dentro do fluxo, você escolhe onde a IA conduz livremente e onde o roteiro é fixo — sem abrir mão do controle." "A zona de IA no fluxo tem regras: mesmo conversando livre, ela é obrigada a capturar o que a operação precisa."

Prompt em camadas

Em produção

o prompt que a IA realmente usa para responder é montado na hora, juntando várias camadas de contexto — não é um texto fixo escrito uma vez.

Como funciona

um montador de prompt reúne seções independentes e condicionais: contexto da campanha que originou a conversa, histórico comercial do contato, histórico da conversa atual, fatos de memória relevantes, controle de anti-repetição de saudação, campos de qualificação já coletados, dados de contato e de formulário preenchido — cada seção só entra se fizer sentido para aquela conversa específica. Suporta também idioma (português, inglês, espanhol).

Resolve

IA genérica que ignora contexto óbvio (já sabe o nome, já sabe o que o cliente quer, mas pergunta de novo).

Por que importa

cada resposta é construída sob medida para aquele momento da conversa, não é um roteiro engessado — isso é o que faz a IA parecer que "está prestando atenção".

Como falar disso

"Cada resposta da IA é montada na hora, com o que importa para aquela conversa — não é um script genérico repetido para todo mundo." "O prompt da sua IA tem camadas: persona, histórico, memória, contexto comercial — tudo junto, na hora certa."

Base de conhecimento consumida pela IA

Em produção

a IA responde com base nos documentos e informações que a própria empresa cadastrou, não só no que ela "sabe" de fábrica.

Como funciona

a pergunta do cliente é transformada em vetor e comparada contra a base de conhecimento cadastrada (busca semântica, com limite de resultados e limiar de relevância, com tempo máximo de espera); se a busca vetorial falhar ou não achar nada relevante o bastante, cai para uma busca textual por palavra-chave, e por fim para um contexto geral — nunca fica sem resposta por falha técnica. Para agentes de vendas/e-commerce, produtos fora de estoque são filtrados da resposta.

Resolve

IA "alucinando" informação errada sobre produto, preço ou política da empresa.

Por que importa

garante que a IA fala o que a empresa realmente oferece e pratica, não uma versão genérica ou desatualizada.

Como falar disso

"A IA do yapt. responde com a sua base de conhecimento, não com achismo — e nunca vende o que já saiu de estoque." "Cadastrou a informação, a IA já sabe usar — com busca inteligente, não decoreba."

Custo e metrificação de IA

Em produção

cada uso de IA é medido e custeado no nível de token, não estimado por cima.

Como funciona

toda chamada de IA grava um evento de uso com custo unitário e total, separando tokens de entrada, saída e os que vieram de cache (mais baratos). Cada interação também fica registrada numa trilha de auditoria com hash do prompt e da resposta e a base legal de tratamento de dado (LGPD). Esses eventos são agregados diariamente.

Resolve

"não sei quanto a IA está me custando" ou "não consigo provar o que a IA disse numa conversa específica".

Por que importa

dá visibilidade financeira real de IA por conversa/cliente/período, e rastreabilidade para auditoria e compliance.

Como falar disso

"Você sabe exatamente quanto cada conversa de IA custou — até o nível de token." "Toda resposta da IA fica auditável: o que foi dito, quando, e sob qual base legal."

Versionamento de agente

Em produção

toda alteração de configuração de um agente de IA fica guardada como uma versão, com histórico e possibilidade de voltar atrás.

Como funciona

cada versão salva um retrato completo da configuração do agente naquele momento, quem (humano, IA ou sistema) fez a mudança, e um resumo do que mudou em relação à anterior. É possível restaurar uma versão anterior. No editor, o histórico mostra o diff calculado entre versões.

Resolve

"mudei a configuração do agente e piorou, e agora não sei voltar para como estava" ou "não sei quem mudou o quê".

Por que importa

dá segurança para testar mudança de agente sem medo de perder uma configuração que funcionava.

Como falar disso

"Toda mudança no seu agente de IA fica salva — voltar para a versão anterior é um clique." "Você sabe exatamente o que mudou, quando e quem mudou, em cada versão do agente."

Sandbox / Testar Rascunho

Em produção

um ambiente para testar o agente de IA de verdade — com base de conhecimento e ferramentas reais — antes de publicá-lo para os clientes.

Como funciona

um chat de teste roda a configuração em rascunho do agente com busca na base de conhecimento real e chamada de ferramentas (até 3 rodadas de uso de ferramenta por interação), simulando o comportamento real sem expor o cliente final.

Resolve

publicar uma mudança de agente sem testar e descobrir o problema já na conversa com o cliente.

Por que importa

reduz risco de colocar no ar uma configuração de IA que não funciona como esperado.

Como falar disso

"Teste o agente de IA de verdade antes de publicar — com a base de conhecimento e as ferramentas reais, sem risco para o cliente." "Testar Rascunho: você vê o agente respondendo antes dele chegar ao seu cliente."

AI Agent Builder

Em produção

a tela onde se configura o agente de IA — persona, comportamento, modo de operação.

Como funciona

interface de configuração do agente dentro do Control Tower, com um seletor de modo de construção (dois modos no código: "Rápido" e "Avançado" — isso é o quanto de detalhe você quer configurar, não como a IA age na conversa). O modo de ação da IA na conversa é um campo separado do agente ("autônoma" ou "sussurro", com possibilidade de forçar autônoma fora do horário comercial configurado). O agente configurado aqui é o que o orquestrador carrega e executa (ver "Orquestrador de IA").

Resolve

depender de time técnico para ajustar como a IA se comporta.

Por que importa

dá autonomia ao time de negócio para configurar e ajustar o agente sem depender de desenvolvimento.

Como falar disso

"Você configura o comportamento da sua IA sem precisar de time técnico." "Do jeito rápido ou no detalhe fino — o construtor de agente se adapta ao quanto você quer configurar."

Execução determinística de comandos

Em produção

para ações estruturadas e de alto risco (ex.: uma transação financeira, uma mudança de plano), a conta pode optar por um caminho de execução sem modelo de linguagem no meio — só código determinístico.

Como funciona

em vez de deixar a IA "decidir" a ação com base em linguagem livre, um roteador de comandos reconhece a intenção, preenche os dados obrigatórios em etapas (slot-filling) e executa a ação por uma rotina fixa e auditável, com validação do resultado antes de confirmar ao cliente. É opt-in por conta — quem não liga, continua no fluxo normal via modelo de linguagem.

Resolve

ação sensível (dinheiro, contrato, mudança de cadastro) que não pode depender de uma interpretação de linguagem que às vezes varia.

Por que importa

dá um caminho "sem chance de alucinação" para as ações onde o risco de erro da IA é inaceitável, sem abrir mão da IA para o resto da conversa.

Como falar disso

"Para as ações mais sensíveis, você pode desligar a interpretação livre da IA e usar um caminho 100% determinístico — mesma conversa, execução sem risco de alucinação." "Fluxo crítico não depende de a IA 'entender direito': é código fixo, auditável, com confirmação antes de executar."

Divergências com o material de marketing
  • Modos do AI Agent Builder: documentação interna do time menciona três modos de interação associados ao agente (autônomo / copiloto / sussurro). No código do construtor de agente (ModeSelector.tsx), o que existe hoje é um seletor com apenas dois modos de configuração ("Rápido" e "Avançado") — isso já era uma divergência de nomenclatura, não de modo de ação. Achado novo desta varredura, mais forte do que o registrado antes: o modo de ação da IA por conversa também não tem mais 3 valores reais. O enum do banco (agent_operation_mode) tem apenas dois valores — whisper e autonomous — e o código do resolvedor de modo trata explicitamente qualquer valor hybrid legado como sinônimo de whisper, para compatibilidade retroativa. Ou seja: o modelo de "3 modos" (autônomo / sussurro / híbrido) não existe mais como opção real em nenhuma camada do produto hoje — nem no builder, nem no banco, nem no resolvedor. Recomendo não publicar comparação de "3 modos" — hoje são 2 (autônoma e sussurro), com o Mentor operando como uma camada à parte (ver seção "Mentor"), não como um terceiro modo de operação do agente.

> Última varredura: 31/07/2026 (origin/main)

03

Atendimento e Operação

Filas, distribuição, carteiras e gestão do time.

Inbox V2

Em produção

a tela onde o time atende, com visão unificada de todas as conversas em andamento.

Como funciona

4 views fixas — Minha Caixa, Fila Inteligente, Abertas, Resolvidas/Aguardando — com 5 opções de ordenação (waiting_longest, next_sla, priority, last_activity, customer_waiting; o padrão em todas as views segue o semáforo vermelho→verde→IA de quem está esperando). A prioridade de exibição usa um score calculado por conversa (tempo de espera, prioridade manual urgente/alta/normal/baixa, lead score do contato, mensagens não lidas, bônus de reabertura, e sinais de emoção da IA — ver seção de roteamento por emoção). O alternador bot↔humano é uma máquina de estados real (bot_active, pending_handoff, human_active, human_reviewing, pending_return, closed), transicionada por uma rotina central — não é um campo booleano solto. Badges de alerta no card avisam handoff, prioridade, estouro de SLA e conversa adiada (snooze). Atualização em tempo real via Supabase Realtime, sem F5.

Resolve

operador perdido entre abas, sem saber qual conversa atender primeiro, ou clicando em atualizar pra ver mensagem nova.

Por que importa

reduz tempo até a primeira resposta e evita que conversa urgente fique atrás de conversa trivial na fila visual do atendente.

Como falar disso

"O Inbox mostra pra cada atendente, em tempo real, qual conversa atender agora — sem refresh, sem adivinhação."

Modal de conversa e timeline

Em produção

o painel de atendimento com todo o contexto do lead/cliente ao lado da conversa.

Como funciona

abas de contexto lado a lado com a conversa — Informações, Histórico/Timeline, Atividades, Negócios (Deals), Reuniões, Notas, Relacionamentos, Mktzap. A aba de histórico mostra a jornada completa do contato (lifecycle, negócios, propostas) e o histórico de reaberturas daquela conversa especificamente.

Resolve

atendente que precisa abrir 4 sistemas diferentes pra entender quem é o cliente antes de responder.

Por que importa

contexto na mão reduz tempo de atendimento e evita pergunta repetida ("já falei isso semana passada").

Como falar disso

"Enquanto atende, o time vê a jornada inteira do cliente do lado — sem trocar de tela."

Quick Replies (Macros)

Em produção

respostas rápidas prontas para o atendente inserir na conversa com um comando.

Como funciona

paleta de macros acionável durante o atendimento. Liberado para todos os planos, sem ser recurso premium.

Resolve

atendente digitando a mesma resposta padrão dezenas de vezes por dia.

Por que importa

reduz tempo médio de resposta e padroniza a linguagem da marca no atendimento humano.

Como falar disso

"Respostas prontas a um comando de distância — o atendente não reescreve o óbvio."

yaFilas / Queue Radar

Em produção

o painel ao vivo de todas as filas de atendimento da operação.

Como funciona

hub com abas de radar, regras, equipe, cliente, escalonamento, auditoria e copiloto. O radar atualiza a cada 10 segundos e também em tempo real via eventos do banco (fila, status de agente, alertas e conversas). Mostra por setor: quantos esperando, quantos em atendimento, tempo médio de espera, tempo do mais antigo na fila, tamanho máximo, modelo de capacidade do setor (total ou inteligente) e status de SLA (ok / alerta / estourado — alerta dispara 30 minutos antes do prazo de primeira resposta). Mostra o mapa de agentes por status (online/ausente/ocupado/pausa/offline) com carga atual sobre carga máxima. Gera alertas classificados por severidade (informativo/alerta/crítico) quando, por exemplo, todos os fallbacks de IA falham ou a fila transborda. Permite reatribuir uma conversa, transferir em lote entre agentes, ou redistribuir a fila inteira de um setor.

Resolve

gestor sem visibilidade de fila estourando até o cliente reclamar, ou sem saber que um setor ficou sem ninguém online.

Por que importa

permite intervenção antes do SLA estourar, não depois — reduz tempo de espera do cliente e evita fila represada.

Como falar disso

"O yaFilas mostra a fila de atendimento ao vivo — quem está esperando, há quanto tempo, e onde o SLA vai estourar antes de estourar."

Notificação de posição na fila

Em produção

mensagem automática ao cliente avisando sua posição na fila de espera e, depois, avisando quando chegou a sua vez.

Como funciona

um worker roda a cada minuto via cron, lê quem está esperando (fila real: estados queued e reserved do motor de roteamento — corrigido em julho/2026 depois de um incidente em que a posição informada ficava errada porque reservas de 30s não entravam na conta) e envia a mensagem de espera pelo canal oficial, com tempo estimado, respeitando janela de 24h do WhatsApp e horário de silêncio configurado. Quando o cliente é de fato atribuído a um atendente, dispara a mensagem de "chegou sua vez". Tem cooldown de 60 minutos entre avisos de espera, deduplicação por "episódio" de fila (uma mesma conversa pode reentrar na fila depois de reaberta e ser notificada de novo, sem duplicar dentro do mesmo episódio) e um kill switch global de emergência que, se falhar a leitura, aborta o envio por segurança (fail-closed) em vez de arriscar mandar errado. Fica desligado por padrão por tenant e nasce em modo dry-run (calcula mas não envia) — precisa ser ligado e tirado do dry-run explicitamente por setor.

Resolve

cliente esperando na fila sem noção de quanto falta, mandando "alguém aí?" ou desistindo por achar que foi ignorado.

Por que importa

reduz ansiedade do cliente em espera e mensagens repetidas de "cadê o atendimento", sem exigir que um humano fique respondendo manualmente.

Como falar disso

"Quem está esperando na fila recebe um aviso automático com a posição e o tempo estimado — e sabe na hora quando chegou a sua vez."

yaRoute — capacidade total e capacidade inteligente

Em produção

o modelo que define quantas conversas cada atendente pode carregar ao mesmo tempo, por setor.

Como funciona

cada setor escolhe entre dois modelos de capacidade. No modelo total, o agente fica disponível enquanto o número de conversas abertas atribuídas a ele estiver abaixo de um limite configurado. No modelo inteligente (yaRoute), o que conta é a "carga ativa" — só as conversas em que o cliente falou por último e ainda está dentro de uma janela de inatividade configurável (padrão 30 minutos, de 5 a 240) contam contra o limite de slots do agente (padrão 8 slots, de 1 a 50), com um teto de segurança à parte para o total de conversas abertas (padrão 150). Na prática, isso significa que conversas "mortas" (cliente sumiu, aguardando) não ocupam vaga de atendimento ativo. Setores no modelo inteligente também recebem auto-resolução automática de conversas ociosas (padrão 72h, configurável) e um job de reconciliação que corrige contadores de carga que desviaram do real.

Resolve

atendente "cheio" no papel mas na prática ocioso, porque metade das conversas atribuídas está parada esperando o cliente responder.

Por que importa

aumenta o número real de atendimentos simultâneos por agente sem sobrecarregar quem está de fato conversando ativamente.

Como falar disso

"O yaRoute enxerga quem está realmente esperando resposta — e libera vaga pra quem está de fato disponível, não pra quem só tem conversa parada no nome."

Roteamento e distribuição por setor

Em produção

as regras que decidem para qual atendente uma conversa vai dentro de um setor.

Como funciona

três modos de distribuição configuráveis — round robin (revezamento), menor carga (least loaded) e manual (sem atribuição automática). Comportamento configurável para quando um operador fica offline: manter atribuído, redistribuir para outro agente, devolver a conversa para a IA, ou transferir para um setor de transbordo — a ação dispara apenas na transição real para offline, nunca em pausa/ausente/ocupado. Existe também um modo sticky de fidelização de cliente ao mesmo atendente (desligado, sempre, por período, ou até resolver), com regra de contingência (esperar o atendente fidelizado ou redistribuir) para quando ele não está disponível. Regra para "ninguém online" configurável por condição (zero online, fora do expediente, feriado) com ação de enviar mensagem automática, devolver para IA ou não fazer nada.

Resolve

conversa travada na fila porque o atendente responsável saiu, ou cliente tendo que reexplicar o problema a cada novo atendente.

Por que importa

garante continuidade de atendimento e evita fila parada por ausência de operador, sem intervenção manual do gestor.

Como falar disso

"Quando o atendente sai do ar, a conversa não fica esperando — o yapt. decide na hora: redistribui, devolve pra IA ou passa pra outro setor, do jeito que a operação configurou."

yaPortfolios / Carteiras

Em produção

agrupamento de contas/contatos sob responsabilidade fixa de um atendente ou time, com metas e roteamento próprio.

Como funciona

três tipos de carteira — carteira de contas (book of business, com dono fixo), território (sempre cai no setor de transbordo, sem dono individual) e pool (dividida entre um time, vai para o membro menos carregado). Quatro modos de distribuição: round robin, menor carga, menor número de contas, menor receita. Papéis por membro: dono (owner), colaborador e visualizador (viewer). Metas configuráveis por período (semanal, mensal, trimestral, anual) sobre métricas como receita, negócios ganhos, conversas resolvidas, tempo médio de resposta, contatos engajados, taxa de conversão, MRR e NPS. Health score calculado a partir de dados reais de engajamento (volume de conversas em 30 dias), saúde dos negócios em aberto/ganhos/perdidos, cumprimento de SLA em 90 dias e recência da última interação — não é um número decorativo.

Resolve

cliente estratégico caindo com atendente aleatório, ou gestor sem visão de meta por carteira/vendedor.

Por que importa

protege relacionamento com conta-chave e dá ao gestor um placar objetivo de saúde por carteira, não só por atendimento individual.

Como falar disso

"Cada carteira tem dono, meta e um health score que mostra a saúde da conta antes que o problema apareça no faturamento."

Fechamento e reabertura de conversa configuráveis

Em produção

a regra, por setor, do que acontece quando uma conversa é finalizada e o cliente escreve de novo depois.

Como funciona

três comportamentos configuráveis por setor — fechar imediatamente (resolvida por 1 hora de segurança, depois encerra e qualquer mensagem nova abre conversa e ticket novos); resolver e fechar depois, com janela de tempo configurável (ex.: 24h) dentro da qual o cliente reabre a mesma conversa; ou apenas resolver, que reabre indefinidamente e nunca cria conversa nova sozinha. O ticket segue o mesmo ciclo de vida da conversa (aberto, em andamento, resolvido, reaberto, fechado). Conversa nova criada após encerramento fica linkada à conversa anterior.

Resolve

cliente que volta depois de dias e cai como "estranho" sem histórico, ou o oposto — filas lotadas de conversas antigas nunca encerradas.

Por que importa

cada operação tem um ritmo diferente de retorno do cliente; a regra fixa evita tanto perda de contexto quanto acúmulo de conversa morta.

Como falar disso

"A regra de reabertura é do jeito que a operação trabalha — fecha na hora, dá uma janela pra reabrir, ou deixa em aberto até resolver de verdade."

yaOperations — presença e disciplina operacional

Em produção

o módulo de gestão de força de trabalho (WFM) que controla presença, pausa e ociosidade do time de atendimento.

Como funciona

presença por heartbeat a cada 45 segundos; se o pulso para por 3 minutos e não há atividade recente, o sistema marca offline automaticamente — se houve atividade recente mas o pulso falhou (ex.: aba suspensa), marca apenas "ausente" em vez de offline, pra não confundir throttle de navegador com saída real. Cinco estados de presença (online, ocupado, ausente, em pausa, offline), com máquina de estados que só permite sair de offline indo para online. Motivos de pausa configuráveis por tenant (padrão: almoço, banheiro, reunião, treinamento, pessoal), cada um com duração de referência que gera alerta se estourada — sem forçar retorno. Detecção de ociosidade em três modos: rígido (marca ausente ao sair da aba), flexível (não marca se o agente tem conversas ativas — pensado para operação com sistemas paralelos) ou desligado. Wrap-up (tempo pós-atendimento) configurável por setor, de 0 a 300 segundos, com expiração automática monitorada.

Resolve

gestor sem saber quem está de fato trabalhando, quanto tempo cada pausa consome, ou detectando ociosidade só no fim do mês.

Por que importa

disciplina operacional em tempo real, sem depender de relatório manual de ponto ou planilha de escala.

Como falar disso

"O yaOperations sabe quem está online, em pausa ou ocioso — em tempo real, sem depender de planilha."

yaOperations — previsão de staffing

Em desenvolvimento

projeção de quantos atendentes a operação vai precisar, por dia, com base em histórico.

Como funciona

calcula a necessidade de equipe a partir de 4 semanas de histórico do mesmo dia da semana, com média ponderada (semana mais recente pesa mais), e apresenta três cenários — pessimista (30% acima da base), base (a média ponderada) e otimista (30% abaixo). Roda automaticamente todo dia de madrugada. Exige um mínimo de 28 dias de dados históricos; antes disso, avisa explicitamente que ainda está "aquecendo" em vez de mostrar um número não confiável.

Resolve

escala montada no feeling do gestor, sem dado histórico — sobra gente num dia fraco, falta gente num dia de pico.

Por que importa

permite planejar escala com antecedência baseada em padrão real de demanda, não em intuição.

Como falar disso

"O yaOperations projeta quantos atendentes cada dia vai exigir, com base no histórico real de volume — não no feeling do gestor."

yaOperations — detecção de anomalias e sinais de burnout

Em produção

alerta automático quando o desempenho de um atendente foge do padrão dele mesmo, ou quando aparecem sinais de esgotamento.

Como funciona

compara métricas do agente (tempo médio de atendimento, tempo de primeira resposta, tempo em pausa) contra a própria linha de base dos últimos 14 dias para detectar anomalia; compara a semana atual contra a anterior em múltiplos fatores para classificar risco de burnout em três níveis.

Resolve

queda de performance ou sinal de esgotamento de um atendente passando despercebido até virar problema maior.

Por que importa

dá ao gestor um alerta precoce individual, em vez de só um número agregado de time.

Como falar disso

"O sistema avisa quando um atendente foge do próprio padrão — antes que vire desligamento ou queda de qualidade."

yaOperations — relatórios de ocupação e produtividade

Em produção

os painéis de análise de desempenho da operação.

Como funciona

quatro visões — produtividade (tempo médio de atendimento, tempo de primeira resposta, conversas por hora, ocupação percentual), tempo não produtivo/shrinkage (detalhamento de pausas), mapa de calor de volume por hora e dia da semana (média de 4 semanas), e quadrante de performance cruzando produtividade × qualidade em quatro zonas. A métrica de ocupação soma os intervalos de trabalho do agente sem duplicar sobreposição, para nunca ultrapassar 100%.

Resolve

gestor sem visão consolidada de quem produz mais, quando a operação tem pico de volume, e quem está sobrecarregado versus ocioso.

Por que importa

direciona escala e coaching com dado, não com achismo.

Como falar disso

"Relatórios que mostram, por atendente e por hora do dia, onde a operação está gastando tempo — e onde está perdendo."

Window Guardian

Em produção

o vigia da janela de 24 horas de conversação gratuita do WhatsApp oficial.

Como funciona

monitora o prazo de expiração de cada conversa e, antes de fechar, dispara um lembrete (nudge) para reengajar o cliente ainda dentro da janela — com nível de antecedência configurável (2h, 4h, 6h ou 8h antes de expirar). O lembrete pode ser automático ou exigir aprovação do atendente antes de enviar. Respeita horário de silêncio configurável por fuso horário, com modo de antecipar o envio antes do silêncio começar (para não deixar a janela expirar durante a noite sem aviso). Não reabre uma janela já fechada — só antecipa o aviso antes dela fechar.

Resolve

janela de atendimento gratuito expirando sem o cliente saber, obrigando a operação a pagar por modelo de mensagem para retomar contato.

Por que importa

reduz custo de mensageria e evita perda de contato por simples esquecimento de prazo.

Como falar disso

"O Window Guardian avisa antes da janela de 24h fechar — evita pagar de novo por um contato que só precisava de um lembrete a tempo."

Multicanal na mesma tela

Em produção

atendimento de WhatsApp oficial, Instagram e webchat na mesma caixa de entrada.

Como funciona

cada conversa carrega um canal de origem e o Inbox filtra e exibe por canal — WhatsApp, Instagram, webchat — sem exigir telas separadas por canal.

Resolve

time pulando entre ferramentas diferentes para cada canal de contato do cliente.

Por que importa

um único fluxo de trabalho, uma única fila, independente de onde o cliente escreveu.

Como falar disso

"WhatsApp oficial, Instagram e webchat — tudo na mesma caixa de entrada, sem trocar de ferramenta."

Transferência de conversa

Em produção

repassar uma conversa em andamento para outro atendente ou para outro setor.

Como funciona

transferência para agente específico, para setor, ou para os dois ao mesmo tempo, com checagem de permissão tanto na origem quanto no destino. Preserva o estado do atendimento: se a IA estava conduzindo, continua conduzindo após o forward; se vai para um atendente específico, passa a atendimento humano; se vai só para um setor sem atendente definido, volta para a fila. Toda transferência fica registrada com motivo, atendente de origem e destino, setor de origem e destino. Também é possível transferir em lote — esvaziar a fila de um setor, aliviar um agente sobrecarregado ou mover todas as conversas de um agente de uma vez.

Resolve

conversa que precisa mudar de mãos (escalonamento, especialista, mudança de assunto) sem perder contexto ou rastro de quem mexeu.

Por que importa

rastreabilidade de quem atendeu o quê, e continuidade do atendimento sem o cliente perceber a troca.

Como falar disso

"Transferir uma conversa não apaga o histórico — fica registrado quem passou pra quem, e por quê."

Control Tower — auditoria de roteamento

Em produção

o centro de comando que mostra, decisão a decisão, como o motor de roteamento distribuiu cada conversa.

Como funciona

painel com visão ao vivo, saúde do motor, capacidade de equipe, fluxo de distribuição, histórico de decisões recentes e regras ativas. Cada decisão de roteamento fica registrada em log de auditoria com a regra que venceu, a ação tomada, o contexto avaliado no momento e o tempo de execução em milissegundos — inclusive quando a decisão veio do roteamento por carteira.

Resolve

"por que essa conversa caiu com esse atendente?" sem resposta, ou suspeita de fila injusta sem prova.

Por que importa

dá transparência total e auditável sobre como o motor de distribuição decide, essencial pra confiança do time e para investigar qualquer reclamação de distribuição desigual.

Como falar disso

"Toda decisão de roteamento fica auditada — qual regra decidiu, por quê, e em quanto tempo."

Priorização por sinais de emoção na fila

Parcial

destaque visual, na fila do atendente, para conversas com sinais de frustração, ameaça ou risco de perda do cliente.

Como funciona

o score que ordena as conversas na tela do Inbox (aba "prioridade") recebe pontos extras quando a IA detecta sinal de ameaça, risco de churn ou sentimento negativo na conversa — isso muda a posição da conversa na lista que o atendente vê. Este sinal não decide para qual agente ou setor a conversa é despachada — o motor de despacho que atribui a conversa a um atendente específico não usa nenhum fator de emoção em seu cálculo.

Resolve

cliente irritado ou em risco de cancelar ficando "escondido" no meio da fila comum.

Por que importa

o atendente vê primeiro quem está mais perto de desistir, sem precisar ler conversa por conversa pra descobrir.

Como falar disso

"A IA identifica sinais de frustração e risco de churn e sobe essas conversas na fila — o atendente vê primeiro quem está mais perto de sair."

Histórico de Conversas (gestão)

Em produção

tela gerencial com todas as conversas da operação — passadas e presentes —, separada do Inbox onde o atendente trabalha.

Como funciona

listagem com KPIs clicáveis (que funcionam como filtro), filtros avançados (canal, setor, atendente, status, handler state, motivo de encerramento, tags, período), exportação, e a possibilidade de criar uma audiência de disparo diretamente a partir do resultado filtrado. Abre o mesmo modal de conversa (com toda a timeline) usado no Inbox.

Resolve

gestor que precisa investigar um padrão de atendimento (ex.: todas as conversas de um setor fechadas por um motivo específico numa janela de tempo) sem depender de exportar dado bruto do banco.

Por que importa

dá ao gestor uma visão de conjunto e acionável do histórico de conversas, incluindo a ponte direta para reaproveitar o filtro como público de campanha.

Como falar disso

"O gestor enxerga o histórico completo de conversas com filtro avançado — e pode transformar qualquer recorte em público de campanha, sem exportar planilha."

Relatório de Atendimento

Em produção

o painel analítico da operação de atendimento, separado dos relatórios de campanha/marketing.

Como funciona

abas de Visão Geral, Agentes, IA, SLA e Motivos de encerramento (a aba "Qualidade" existe na navegação como espaço reservado — placeholder — e uma aba de Canais foi removida nesta rodada de revisão do relatório). Cobre volume de mensagens, contenção por IA, cumprimento de SLA, performance detalhada por agente e distribuição de motivos de fechamento, com filtros de período/canal/setor.

Resolve

gestor sem visão consolidada de como a operação de atendimento performou num período, precisando cruzar várias telas separadas.

Por que importa

central única de números de atendimento para decisão de gestão, cobrindo tanto a operação humana quanto a IA.

Divergências com o material de marketing
  • Roteamento condicionado a emoção: o marketing pode ter sugerido que a IA decide para qual agente ou setor a conversa vai com base na emoção detectada. Isso não acontece no código hoje. O que existe: (1) a emoção afeta a ordem de exibição na fila do atendente (documentado acima); (2) a função que de fato monta a fila de despacho e escolhe o agente não usa nenhum fator de emoção; (3) o processo que atribui o agente busca o contexto emocional mas descarta o resultado sem usá-lo na decisão; (4) o motor de regras de roteamento tem estrutura pronta para condicionar regras por sinais de emoção, mas o campo que essas regras leem nunca é preenchido — uma regra desse tipo nunca dispararia na prática hoje. Recomendação: falar apenas em "priorização visual da fila", nunca em "roteamento por emoção". Sem mudança nesta varredura — reconfirmado no código atual.
  • Previsão de staffing: não é divergência — o manual do produto estava certo. A funcionalidade está implementada de ponta a ponta (cálculo, agendamento automático, tela dedicada), ao contrário do que material de marketing possa ter marcado como "em desenvolvimento". Sem mudança nesta varredura — reconfirmado no código atual.
  • Feriado no roteamento (atualizado nesta varredura): a condição "fora do expediente" saiu do papel — hoje tem efeito real no backend (Edge Function dedicada envia o aviso automático). Só a condição "feriado" continua sem efeito nenhum; a própria UI do produto já rotula isso como "calendário em breve". Não anunciar feriado como ativo; pode anunciar fora do expediente.
  • Ação em pausa (break_action) (mais confirmado nesta varredura, para pior): o campo de configuração existe (manter atribuído ou redistribuir quando o atendente entra em pausa), mas a função de banco que executa a redistribuição filtra explicitamente por status offline — pausa não aciona redistribuição, mesmo com break_action = 'redistribute' configurado. Isso é reforçado por uma decisão de produto documentada no próprio código, a partir de medição de 14 dias numa operação grande em produção: parte relevante dos envios da operadora acontece em "pré-pausa", e bloquear/redistribuir nesse estado geraria mais atrito do que resolveria. Recomendação: tratar break_action como campo não funcional hoje — não anunciar.
  • CSAT/NPS: confirmado que não existe nota automática de satisfação gerada por análise de sentimento — apenas pesquisa respondida manualmente pelo cliente via WhatsApp Flow. O módulo de pesquisas (CSAT/NPS) ainda está em desenvolvimento, não integrado à versão principal do produto.
  • Notificação de posição na fila (atualizado nesta varredura): deixou de ser "spec não confirmada" — está implementada e em produção (worker com cron, régua de fila real, deduplicação por episódio, kill switch), com correção pós-incidente em cliente real registrada em julho/2026. Nasce desligada e em dry-run por tenant — pode ser anunciada como disponível, mas cada operação precisa ativá-la.
  • yaPortfolios — configuração pelo gestor (atualizado nesta varredura): deixou de ser "em evolução" — o gestor cria, configura roteamento, gerencia membros/papéis e define metas de carteira via tela própria, sem depender de suporte técnico. Pode ser anunciado como autosserviço completo.

> Última varredura: 31/07/2026 (origin/main)

04

Vendas e CRM

Do pipeline à proposta aceita.

Deals / Pipeline (kanban)

Em produção

kanban de negócios com múltiplos funis simultâneos, ligado direto às conversas de WhatsApp.

Como funciona

/src/pages/Deals.tsx com /src/components/deals/kanban/ (KanbanBoard, KanbanColumn, KanbanDealCard), drag-and-drop nativo (HTML5 draggable, sem lib externa). Cada tenant pode ter mais de um pipeline ao mesmo tempo (abas em PipelineTabs.tsx, criação em PipelineCreateDialog.tsx) — tabela pipelines (is_default, settings) e pipeline_stages (position, probability 0-100, sla_days, is_won, is_lost, color), com deals.pipeline_id/deals.stage_id como FK. A RPC ensure_default_pipeline() cria automaticamente 6 estágios padrão para tenant novo.

Resolve

vendedor não sabe em qual estágio real cada negócio está porque a informação está espalhada entre a conversa do WhatsApp, uma proposta enviada por e-mail e uma planilha à parte.

Por que importa

dá ao gestor visão de funil em tempo real por segmento de negócio (um funil por linha de produto, por exemplo), sem depender de atualização manual de planilha.

Como falar disso

"Seu funil de vendas não vive numa planilha separada da conversa — cada negócio nasce, anda de estágio e fecha dentro do mesmo lugar onde você fala com o cliente."

Valor ponderado do negócio (weighted value)

Em produção

o valor do negócio multiplicado pela probabilidade de fechamento do estágio em que ele está — uma leitura de "quanto disso realmente vira receita".

Como funciona

cada estágio (pipeline_stages) carrega um probability (0-100) configurável — por exemplo, "Proposta enviada" pode valer 50% de chance de ganho. Isso mudou desde a última varredura: hoje existe um projection-worker que calcula weighted_value (valor × probabilidade efetiva do estágio / 100) e grava numa camada de projeção (_projections.deals), e tanto o Kanban (src/pages/Deals.tsx) quanto o cabeçalho de resumo (src/components/deals/DealsSummaryHeader.tsx) leem esse valor pré-calculado — o segundo, inclusive, soma tcv × (probability / 100) usando a probabilidade real de cada estágio (stage.probability ?? 50). O fallback de 50% só entra em cena se a projeção ainda não tiver populado o campo (linha de segurança, não o comportamento normal).

Resolve

diretor comercial que projeta receita olhando só a soma bruta do funil superestima o resultado — negócio recém-aberto pesa igual a negócio quase fechado.

Por que importa

projeção de receita mais realista evita meta estourada no papel e furada no caixa.

Como falar disso

"O funil mostra quanto de fato deve virar receita — cada negócio pesa pela chance real de fechar naquele estágio, não pelo valor bruto."

Motivo de perda (loss reason)

Em produção

captura obrigatória do motivo quando um negócio é marcado como perdido, com lista configurável por área de atendimento.

Como funciona

tabela unificada closure_reasons (entity_type cobre deal_won e deal_lost), configurável por inbox_id — ou seja, um setor pode ter motivos de perda diferentes de outro. Captura via LostReasonModal.tsx e hook useClosureReasons('deal_lost', ...); a RPC lose_deal() grava lost_reason, lost_reason_code, lost_reason_note e closure_reason_id no negócio.

Resolve

vendedor marca "perdido" e segue em frente sem registrar por quê — gestor nunca sabe se está perdendo por preço, por prazo ou por concorrente.

Por que importa

motivo de perda estruturado por setor vira insumo direto para ajuste de discurso, de preço ou de produto — sem isso, decisão comercial é chute.

Como falar disso

"Todo negócio perdido fica marcado com o motivo real — configurado por área — pra você enxergar o padrão, não só a estatística."

Stakeholders do negócio

Em produção

mapa de quem decide, influencia ou bloqueia um negócio, ligado ao deal.

Como funciona

tabela deal_contacts (N:N entre deals e contacts) com papel (role: champion, decision_maker, influencer, blocker, end_user, economic_buyer, technical_buyer) e is_primary. Componente DealStakeholdersSection.tsx. Regra de negócio ativa: a RPC win_deal() exige que exista pelo menos um stakeholder com papel decision_maker para o negócio poder ser marcado como ganho.

Resolve

venda B2B trava porque o vendedor negocia com quem não decide — sem mapear quem realmente assina, o funil mente sobre a real chance de fechar.

Por que importa

trava estrutural (não fecha sem decisor mapeado) força disciplina de qualificação antes de declarar vitória.

Como falar disso

"O sistema não deixa fechar um negócio sem saber quem realmente decide — mapear o comitê de compra vira parte do processo, não um checklist esquecido."

Produtos no negócio

Em produção

itens do catálogo anexados a um negócio, formando o valor total da proposta comercial.

Como funciona

tabela deal_products ligando deals a products, com quantity, unit_price, discount_percent e total_value — este último é coluna gerada pelo próprio Postgres (quantity × unit_price × (1 - discount/100)). O valor agregado do negócio (Setup, MRR, ARR, TCV) é recalculado no front a cada leitura, tanto no Kanban quanto no drawer 360.

Resolve

vendedor monta a proposta de cabeça ou numa planilha à parte, e o valor do negócio no funil não bate com o que foi realmente oferecido.

Por que importa

valor do funil reflete o que está de fato sendo vendido — produto por produto — não uma estimativa solta.

Como falar disso

"O valor do negócio no funil é a soma real dos produtos anexados — não um número digitado à mão que ninguém confere depois."

Deal Drawer 360

Em produção

painel lateral com a visão completa de um negócio — tudo em um lugar, sem abrir tela nova.

Como funciona

src/components/deals/DealDrawer360.tsx abre em cima do kanban (não é navegação por URL — é estado local) e organiza em seções colapsáveis: Resumo, Detalhes do Negócio, Categoria, Stakeholders, Produtos e Serviços, Propostas vinculadas, Atividades, Notas Internas, Carteira (quando aplicável), Conversas do WhatsApp ligadas ao negócio, e Timeline de eventos. Botões de Ganhar/Perder ficam fixos no cabeçalho.

Resolve

vendedor perde tempo abrindo cinco telas diferentes (CRM, conversa, proposta, catálogo, notas) para entender o histórico de um único negócio.

Por que importa

reduz o tempo de preparação antes de uma call ou de um follow-up — a história inteira do negócio está num clique.

Como falar disso

"Abre um negócio e vê tudo — conversa, proposta, produtos, quem decide, o que já foi combinado. Sem trocar de tela."

Contas (Accounts) — empresa separada de contato

Em produção

entidade de empresa (pessoa jurídica) separada da pessoa física, agrupando todos os contatos e negócios de um mesmo CNPJ.

Como funciona

tabela accounts (type: company ou person, cnpj, industry, total_revenue, total_deals, lifetime_value) e account_contacts (N:N com role/is_decision_maker). deals.account_id e conversations.account_id referenciam a conta diretamente. Página /accounts (AccountsPage.tsx) e drawer AccountDrawer360.tsx cruzam negócios, contatos, conversas e portfólios de uma mesma empresa.

Resolve

em venda B2B, cinco pessoas da mesma empresa conversam no WhatsApp e o vendedor não enxerga que são todos a mesma conta — cada um vira um "cliente" isolado.

Por que importa

visão consolidada por empresa (não por pessoa) é o que permite calcular carteira, LTV real e priorizar conta estratégica, não só contato individual.

Como falar disso

"Cinco pessoas da mesma empresa falando com você no WhatsApp aparecem como uma conta só — com histórico, negócios e receita consolidados."

Contacts 360

Em produção

ficha completa do contato — tudo que ele disse, comprou, preencheu e de onde veio — num único painel.

Como funciona

src/components/contacts/ContactDrawer360.tsx reúne Lead Intelligence (score), Qualificação, Formulários preenchidos, Dados pessoais, Canais de contato, Origem & Atribuição, Widget Web (se veio de visitante anônimo), Jornada do lead, Empresas vinculadas, Portfólio, Conversas, Negócios, Compras, Atividades, Insights de IA, Campos personalizados e Histórico de eventos.

Resolve

vendedor entra numa conversa sem saber se aquele número já comprou antes, já teve proposta enviada ou já conversou com outro atendente semana passada.

Por que importa

contexto completo antes de responder evita repetir pergunta que o cliente já respondeu e evita perder venda por falta de histórico.

Como falar disso

"Cada contato é um banco de dados vivo — tudo que ele fez, comprou e disse, num painel só. A memória que o vendedor nunca teve."

Ciclo de vida do contato (lifecycle)

Em produção

estágio do contato dentro da jornada comercial, do primeiro cadastro até virar cliente ou sair da base.

Como funciona

campo contacts.lifecycle_stage, com 9 estados possíveis e transições controladas: subscriber → lead → mql → sal → sql → opportunity → customer → churned (com disqualified como saída em qualquer ponto). Transições inválidas são bloqueadas pela regra VALID_TRANSITIONS. Cada mudança de estágio grava data (became_lead_at, became_mql_at, became_sql_at, became_opportunity_at, became_customer_at) e fica registrada em lifecycle_history (histórico com origem, destino, quem mudou e o motivo), visível na linha do tempo do drawer.

Resolve

time comercial não sabe distinguir quem é só curioso, quem já foi qualificado e quem já é cliente — trata todo mundo do mesmo jeito.

Por que importa

permite medir taxa de conversão real entre cada etapa da jornada (lead → qualificado → oportunidade → cliente), não só "quantos entraram e quantos compraram".

Como falar disso

"Cada contato tem um estágio claro na jornada — de curioso a cliente — e você vê exatamente onde ele travou."

Campos personalizados

Em produção

campos extras no contato, definidos pelo próprio cliente do yapt. para guardar dado específico do negócio dele.

Como funciona

existe hoje uma coexistência de dois mecanismos. O que efetivamente aparece no drawer do contato é um campo contacts.custom_fields em formato livre (chave-valor solto, tudo texto). Em paralelo, existe um sistema mais estruturado — tabelas custom_fields (com tipo: texto, número, data, booleano, seleção, seleção múltipla, URL, e-mail, telefone) e custom_field_values. O banco já foi ampliado: o enum custom_field_entity_type cobre contact, deal e conversation — ou seja, o schema já prevê campo personalizado tipado em negócio e em conversa, não só em contato. Na prática, porém, o consumo em tela (CustomFieldsBlock.tsx, usado no ContactDrawer360.tsx e no painel do inbox) hoje só cobre contatos — Deals ainda não tem tela que leia esse sistema tipado, mesmo o banco permitindo.

Resolve

todo negócio tem um dado específico que o CRM genérico não tem campo pronto pra guardar (código de cliente no ERP, plano contratado, data de renovação).

Por que importa

permite personalizar o CRM sem depender de desenvolvimento — mas hoje sem validação de tipo no fluxo principal de contato (tudo vira texto livre), e sem tela nenhuma ainda para negócios.

Como falar disso

"Adiciona o campo que faz sentido pro seu negócio — sem precisar de programador." (falar apenas do campo de contato; campo personalizado de negócio ainda não tem tela)

Tags de contato

Em produção

etiquetas coloridas configuráveis por tenant para classificar e segmentar contatos.

Como funciona

tabela tags (nome, cor, descrição, tipo de entidade) por tenant, ligada ao contato via contact_tags. Gerenciamento em TagsManager.tsx. Suporta marcação em massa (RPC bulk_tag_contacts) direto da Central de Leads.

Resolve

segmentar base de contatos para campanha ou follow-up manual é trabalho de planilha quando não tem etiqueta no próprio CRM.

Por que importa

filtro rápido para campanha, relatório ou ação em massa sem precisar exportar dado pra fora do sistema.

Como falar disso

"Marca, filtra, dispara — tudo dentro do mesmo lugar onde a conversa acontece."

Atividades do contato

Em produção

registro de tarefas, ligações, reuniões e notas ligadas a um contato ou negócio, com data de conclusão.

Como funciona

aba ActivitiesTab.tsx dentro do drawer do contato, usando ActivityTimeline, ActivityModal e ActivityQuickActions (src/components/activities/), com hooks useContactActivities/useCompleteActivity.

Resolve

vendedor combina um follow-up e esquece — não tem registro de compromisso dentro do próprio CRM, só na cabeça ou no calendário pessoal.

Por que importa

dá visibilidade ao gestor sobre o que cada vendedor tem agendado e cumprido, sem depender de relato verbal.

Como falar disso

"Cada compromisso com o cliente — ligação, reunião, tarefa — fica registrado junto com o histórico da conversa."

Identidade e merge de contatos

Em produção

deduplicação automática e assistida de contatos duplicados — o mesmo cliente com dois cadastros vira um só.

Como funciona

deduplicação automática por telefone (reconhece variante com e sem o 9º dígito) já acontece na entrada da conversa, via função find_or_create_contact_v2(). Para casos não óbvios, existe merge assistido: tabela contact_merge_candidates com confidence_score calculado, RPC find_merge_candidates() para sugerir duplicatas e execute_contact_merge() para unificar (com opção de desfazer via unmerge_contact). Contato mesclado fica marcado (is_merged, merged_at, canonical_contact_id).

Resolve

o mesmo cliente aparece três vezes na base porque escreveu de números diferentes ou porque o telefone foi salvo com e sem o nono dígito — histórico fica fragmentado.

Por que importa

sem isso, relatório de contatos e de receita por cliente vem inflado e o vendedor não vê o histórico completo de quem já falou antes.

Como falar disso

"O sistema reconhece quando é o mesmo cliente escrevendo de formas diferentes e junta o histórico — sem duplicar sua base."

Lead Scoring

Em produção

pontuação de 0 a 100 que mede o quão qualificado um lead está, combinando comportamento na conversa com critério de perfil ideal de cliente.

Como funciona

Edge Function scoring-processor roda em quatro modos configuráveis por tenant — behavioral (comportamento observado), questions (respostas a perguntas de qualificação), icp_description (avaliação semântica por IA contra uma descrição textual do cliente ideal) e hybrid (combina os dois: pega o maior entre a nota de IA e a nota comportamental). O modo comportamental é 100% SQL, sem IA — soma 7 fatores com peso fixo (engajamento 25, recência 20, perfil 15, emoção 15, canal 10, negócio 10, ciclo de vida 5) e recalcula em lote a cada 10 minutos via cron. O modo por IA roda via fila assíncrona quando um evento relevante acontece na conversa. Aparece no drawer do contato como badge (LeadScoreBadge.tsx) com detalhamento por fator (LeadScoreBreakdown.tsx).

Resolve

time comercial trata lead frio e lead quente do mesmo jeito porque não tem critério objetivo pra priorizar quem atender primeiro.

Por que importa

prioriza o esforço de vendas em quem tem mais chance real de fechar, em vez de atender por ordem de chegada.

Como falar disso

"Cada lead chega com uma nota — calculada pelo comportamento na conversa e pelo seu perfil de cliente ideal — pra você saber quem atender primeiro."

Central de Leads

Em produção

tela de gestão em massa da base de leads — filtrar, segmentar, marcar e exportar sem abrir contato por contato.

Como funciona

duas telas: LeadsCentral.tsx (KPIs, filtros avançados, segmentos salvos, tabela paginada, ações em massa — marcar tag, mudar estágio de ciclo de vida, exportar CSV, criar audiência de campanha a partir do filtro) e LeadsPage.tsx (visão unificada de leads vindos de todas as origens — Meta, Widget, Connect, orgânico — com indicador de etapa da jornada). O filtro (_leads_filtered_contacts) suporta cerca de 30 parâmetros: score, ciclo de vida, tags, faturamento, pedidos, canal, dono (derivado da conversa mais recente), portfólio, datas, opt-out. Módulo habilitado por tenant via feature flag (module.leads_central).

Resolve

gestor comercial precisa exportar a base pra planilha toda vez que quer segmentar um grupo de leads pra campanha ou ação manual.

Por que importa

segmentação e ação em massa direto na base — sem depender de exportação, sem perder sincronismo com o que está acontecendo nas conversas.

Como falar disso

"Filtra sua base inteira por qualquer critério — score, origem, etapa, tag — e age em massa, sem sair do sistema."

Dono do lead (via distribuição de conversas)

Em produção

cada lead tem um "dono" — o vendedor responsável — mas isso não é um campo próprio de vendas, é herdado de qual atendente está com a conversa mais recente dele.

Como funciona

não existe um motor de "distribuição de leads" dedicado a vendas. O que existe é o motor de distribuição de conversas do inbox (fila de roteamento, considerando status e capacidade do atendente). A Central de Leads deriva o "dono" do lead lendo o assigned_to da conversa mais recente do contato — é uma leitura, não uma atribuição própria de CRM.

Resolve

saber quem, no time, é o responsável atual por cada lead sem precisar atribuir isso manualmente numa tela separada de CRM.

Por que importa

evita dois times de atribuição divergentes (um pro inbox, outro pro CRM) — o dono do lead é sempre o mesmo dado, visto de dois lugares.

Como falar disso

não recomendado tratar como feature própria de vendas em material de marketing — é reaproveitamento do motor de distribuição de atendimento, vale mencionar como consequência, não como funcionalidade isolada de CRM.

Propostas — builder e envio

Em produção

proposta comercial estruturada em seções (não PDF), enviada e visualizada dentro da própria conversa de WhatsApp.

Como funciona

modelo de template com seções fixas — capa, contexto, solução, escopo, investimento, cronograma, termos, próximos passos e assinatura (src/components/proposals/editor/ProposalContentEditSheet.tsx, editor de texto rico via TipTap). A lista de preços vem dos itens de proposta (ProposalItem[]), que podem ser pré-populados a partir dos produtos já anexados ao negócio. Layouts disponíveis: landing, executivo, moderno, clássico, minimal, bold. Suporta versionamento (version, parent_version_id, version_notes).

Resolve

proposta em PDF anexado no e-mail chega fria, sem controle de quando (ou se) o cliente abriu.

Por que importa

proposta profissional sem sair do fluxo de conversa — reduz o atrito entre "mandei a proposta" e "cliente respondeu".

Como falar disso

"Proposta que nasce estruturada — não um PDF solto — e chega pro cliente sem sair da conversa do WhatsApp."

Landing page pública da proposta

Em produção

página exclusiva e rastreável onde o cliente visualiza a proposta, aberta a partir de um link enviado no WhatsApp.

Como funciona

rota pública /p/:hash (ProposalPublicView), resolvida pela Edge Function get-public-proposal (com limite de 30 requisições/minuto por IP contra abuso). Registra first_viewed_at, last_viewed_at, view_count, tempo total de visualização e — por sessão — dispositivo, seções vistas e profundidade de rolagem. Cada carregamento emite um evento proposal.viewed.

Resolve

vendedor manda proposta e fica sem saber se o cliente sequer abriu, quanto tempo leu, ou se parou na página de preço.

Por que importa

transforma "mandei e fiquei esperando" em dado — dá sinal de quando fazer o follow-up certo (cliente abriu e não respondeu, ou nem abriu ainda).

Como falar disso

"Você sabe o momento exato em que o cliente abriu a proposta — e até em qual parte ele parou pra ler."

Aceite online de proposta

Em produção

cliente aceita a proposta direto na página pública, sem precisar assinar PDF ou trocar e-mail.

Como funciona

cliente preenche nome, e-mail e aceite dos termos; recebe um código de verificação por e-mail (via Resend) antes de confirmar. Ao confirmar, a Edge Function accept-proposal grava status = accepted, com nome, e-mail, IP e user agent de quem aceitou, além dos itens aceitos. Re-checado no main: o gap é mais sério do que "conferido só no navegador" — o código é gerado no próprio navegador do cliente (ProposalAcceptDialog.tsx), guardado em localStorage, e a comparação de "código confere" é feita inteiramente no front (localStorage vs. o que o cliente digitou). A Edge Function send-proposal-verification só recebe o código já pronto do front e o reenvia por e-mail — não grava esse código em nenhuma tabela do servidor. E a Edge Function accept-proposal aceita verification_code como campo opcional no schema e nunca chega a lê-lo: o UPDATE proposals SET status = 'accepted' roda sem checar código nenhum. Ou seja, dá pra chamar accept-proposal direto, pulando toda a etapa de código, e a proposta é aceita do mesmo jeito.

Resolve

fechamento formal de proposta hoje depende de assinatura física ou de plataforma externa de assinatura digital.

Por que importa

reduz o tempo entre "cliente concordou" e "negócio fechado no sistema" — sem etapa manual de transcrever aceite pra dentro do CRM.

Como falar disso

"O cliente aceita a proposta com um clique, dentro da própria página — sem precisar imprimir, assinar e escanear nada."

Catálogo de produtos

Em produção

cadastro central de produtos e serviços vendidos pelo cliente, usado por Deals, Propostas, Commerce e pela IA.

Como funciona

src/pages/ProductsCatalog.tsx — CRUD completo com preço unitário, faixa de preço aberta (mínimo/máximo, para negociação), categoria, marca, imagem, disponibilidade e SKU. Sincroniza com plataformas externas (source_platform, sync_status) e com o catálogo de produtos da Meta/WhatsApp (meta_catalog_id, meta_product_id). Marca se o produto está indexado para a IA usar em conversa (ai_indexed). Não há controle de variantes nem de estoque quantitativo no catálogo interno — só disponibilidade textual.

Resolve

vendedor cita preço de cabeça ou de planilha desatualizada, e cada canal (site, WhatsApp, catálogo Meta) tem uma versão diferente do mesmo produto.

Por que importa

fonte única de produto e preço, consumida tanto por quem vende quanto pela IA que atende — sem risco de divergência entre canais.

Como falar disso

"Um catálogo só — preço, produto, disponibilidade — que alimenta a proposta, o negócio e a própria IA na conversa."

Commerce B2C — carrinho e pedido

Em produção

venda direta dentro da conversa de WhatsApp, do carrinho ao pedido pago.

Como funciona

carrinho (Cart/CartItem) com status (ativo, convertido, abandonado, expirado), origem (WhatsApp, web, manual, catálogo do WhatsApp), cupom de desconto e totais recalculados automaticamente. Ao fechar, vira um pedido (orders) — tratado como "fato de receita" separado do pipeline de negócios: status (pendente, confirmado, reembolsado, parcialmente reembolsado, cancelado), origem (Shopify, Bling, Hotmart, Kiwify, Nuvemshop, proposta, negócio, manual, API, Connect), com campos de MRR/ARR para receita recorrente. Métodos de pagamento suportados: Pix, cartão de crédito, cartão de débito, boleto, dinheiro, transferência, link de pagamento e débito em conta. Não há cálculo de frete próprio — quando o pedido vem de loja integrada, o status de envio é apenas espelhado da origem.

Resolve

cliente quer comprar direto na conversa e o vendedor precisa mandá-lo pra outro sistema (site, link externo) pra fechar o pagamento.

Por que importa

menos etapas entre "quero comprar" e "pagou" reduz abandono de carrinho — a compra acontece onde a conversa já está acontecendo.

Como falar disso

"O cliente compra sem sair da conversa — carrinho, pagamento e pedido, tudo dentro do WhatsApp."

Integração com lojas externas

Em produção

sincronização de produtos e pedidos entre o yapt. e a loja virtual já usada pelo cliente.

Como funciona

adaptadores dedicados para WooCommerce, Shopify e Nuvemshop (supabase/functions/_shared/commerce-sync/), cada um implementando a mesma interface de sincronização — busca e normaliza produtos, clientes e pedidos. Edge Functions commerce-catalog-sync e commerce-order-sync rodam a sincronização periódica. Desde a última varredura, o conjunto de funções cresceu: commerce-catalog-feed (feed de catálogo), commerce-reconciliation (concilia divergência entre o pedido na loja de origem e o pedido espelhado no yapt.) e commerce-knowledge-indexer (indexa catálogo/pedido pra uso da IA).

Resolve

cliente que já vende numa plataforma de e-commerce não quer cadastrar produto duas vezes nem perder o controle de estoque/pedido que já tem lá.

Por que importa

o WhatsApp vira mais um canal de venda da loja que já existe, sem duplicar operação.

Como falar disso

"Já vende pelo site? O catálogo e os pedidos sincronizam automaticamente — o WhatsApp vira mais um canal, não um sistema separado."

Agendamento com Google Calendar

Em produção

sincronização de compromissos comerciais (reuniões, calls) com o Google Calendar do vendedor.

Como funciona

OAuth real com o Google (supabase/functions/_shared/google-calendar.ts), tokens de acesso e de renovação armazenados de forma criptografada (user_oauth_tokens), com renovação automática. Edge Function calendar-sync mantém a sincronização.

Resolve

vendedor agenda dentro do CRM e depois esquece de replicar no calendário pessoal — ou o contrário, perde reunião marcada por fora.

Por que importa

compromisso comercial marcado uma vez só, visível tanto pro vendedor quanto pro time, sem duplicar agenda.

Como falar disso

"Agenda a reunião no negócio e ela já cai no seu Google Calendar — sem duplicar, sem esquecer."

Playbooks de metodologia de vendas

Em produção

roteiro de vendas configurável — o que vender, como qualificar, o que fazer em cada estágio e como reagir a objeção — que a IA usa de fato na conversa.

Como funciona

src/types/sales-playbook.ts define quatro blocos: Produto (o que vende, diferenciais, casos de sucesso), Qualificação (perguntas por categoria — dor, volume, autoridade, orçamento, tempo), Pipeline (ação recomendada por estágio) e Situações (tratamento de objeção, sinal de compra, script de recuperação). Wizard de criação em 5 passos (usePlaybookBuilder.ts), salvo na tabela sales_playbooks. Quando um agente de IA tem um playbook vinculado, o orquestrador injeta esse conteúdo direto no prompt do Mentor durante a conversa — não é um documento estático, é consultado em tempo real pela IA que está atendendo.

Resolve

metodologia de vendas vive na cabeça do gerente comercial ou num documento que ninguém consulta — cada vendedor (e cada IA) responde do seu jeito.

Por que importa

padroniza como a IA — e o time — qualifica e conduz a venda, com base no que já funciona pra aquele negócio específico.

Como falar disso

"O playbook de vendas não fica engavetado — a IA usa ele de verdade, na hora de qualificar e responder objeção."

Metodologia de qualificação do agente (BANT, SPIN, MEDDIC, Challenger)

Em produção

escolha da metodologia de qualificação de vendas (BANT, SPIN, MEDDIC, GPCT, Challenger ou personalizada) usada na configuração do agente de IA.

Como funciona

campo SalesMethodology no builder do agente de IA (src/types/sales-agent-config.ts), consumido pelo gerador de prompt (src/lib/prompt-generator.ts) — cada metodologia molda como a IA conduz a qualificação na conversa. É um mecanismo diferente do módulo de Playbooks (acima), embora complementar: a metodologia define o "como perguntar", o playbook define "o que perguntar e o que fazer depois".

Resolve

empresa que já usa uma metodologia de vendas consolidada (SPIN, Challenger) não quer que a IA converse fora desse padrão.

Por que importa

alinha a condução da conversa por IA ao método de vendas que o time comercial já foi treinado a usar.

Como falar disso

"Configura a metodologia de vendas que seu time já usa — SPIN, Challenger, BANT — e a IA qualifica seguindo o mesmo roteiro."

Relatório de Vendas e Atribuição comercial

Em produção

relatório com visão geral de vendas, negócios, vendas B2C, ranking de vendedores e atribuição da venda até a campanha de origem.

Como funciona

src/pages/AnalyticsSales.tsx, em RPCs SQL diretas (não Edge Functions dedicadas): visão geral (get_vendas_overview_v1), negócios (get_negocios_detail_v1), vendas B2C (get_vendas_b2c_detail_v1), ranking de vendedores (get_vendedores_ranking_v2) e atribuição (get_atribuicao_funnel_v1) — esta última com navegação em drilldown: Campanha → Conjunto de anúncios → Anúncio, mostrando ROAS e CAC em cada nível, além de contagem de vendas sem atribuição identificada. O motor de atribuição foi reescrito desde a última varredura: mudou de cálculo linha-a-linha para uma abordagem set-based (20260609065906_atribuicao_set_based_rewrite.sql) e passou a ler de uma camada de snapshot pré-calculada em vez de recalcular a cada requisição (20260613212041_attribution_reports_read_snapshot.sql) — melhora de performance, sem mudar o conceito exposto na tela.

Resolve

diretor de marketing/vendas sabe quanto vendeu no total, mas não sabe quanto cada campanha de anúncio efetivamente gerou em venda fechada.

Por que importa

liga investimento em anúncio a receita real (não só a lead gerado), permitindo decidir onde realocar verba de mídia.

Como falar disso

"Você não vê só quanto vendeu — vê de qual campanha, de qual anúncio, veio cada venda."

Histórico de transição de estágio do negócio (gap ainda aberto)

Não implementado

registro estruturado de por quais estágios um negócio passou, quando e quem moveu — hoje isso não existe para Deals.

Como funciona

mudar o estágio de um negócio passa pela RPC move_deal_stage, que só emite um evento genérico (emit_event('deal.stage_changed', ...)) — não há uma tabela relacional dedicada tipo deal_stage_transitions para consultar o caminho percorrido pelo negócio. Isso é diferente do que já existe em outras partes do produto: conversas têm sua própria tabela de histórico de transição (conversation_state_transitions), tickets de suporte também (support_ticket_stage_transitions) — mas Deals ainda não. Já existe, porém, sinal de que está no radar: a tabela required_fields_rules (que hoje só cobre closure_reason na prática) já reserva deal_stage_transition como tipo de alvo para uma Fase 2 futura — a tabela em si (deal_stage_transitions) ainda não foi criada.

Resolve

gestor comercial quer entender quanto tempo um negócio ficou parado em cada estágio, ou se ele voltou de estágio — hoje só dá pra inferir isso lendo o log de eventos genérico, não consultando um histórico dedicado.

Por que importa

sem histórico de transição, não dá pra medir tempo médio por estágio nem identificar em que ponto do funil o negócio trava — métrica básica de gestão de pipeline.

Como falar disso

não recomendado divulgar "histórico de transição de estágio" como funcionalidade do CRM de vendas — é gap real, não recurso disponível hoje.

Sales (yaRevenue) — visão unificada de receita

Em produção

tela nova, separada do kanban de Deals e do relatório de atribuição, que junta em um só lugar toda a receita do tenant — pedido de e-commerce, negócio ganho e proposta aceita — filtrável e pronta pra virar público de campanha.

Como funciona

src/pages/Sales.tsx (identificado no próprio código como "yaRevenue"). Reúne receita de origens diferentes (comércio eletrônico, deals ganhos, propostas aceitas) numa tabela única, com filtro e seleção de linhas, exportação em CSV e criação de audiência de campanha a partir dos pedidos selecionados (useCreateAudienceFromOrders). Também traz uma aba de faturas ligadas a contrato (SalesInvoicesTab, do módulo de Contratos — ver seção seguinte).

Resolve

gestor comercial que quer ver "quanto entrou de receita este mês" precisa hoje somar três telas diferentes (kanban de deals, relatório de vendas B2C, propostas aceitas) — aqui é uma visão só.

Por que importa

dá ao gestor uma visão financeira consolidada, pronta pra virar ação (exportar, montar público de campanha de reativação ou upsell) sem depender de planilha.

Como falar disso

"Toda a receita do seu negócio — venda no WhatsApp, negócio fechado, proposta aceita — numa tabela só, pronta pra filtrar e virar próxima ação."

Contratos (módulo yaSpaces, grupo Vendas)

Em produção

gestão de contratos comerciais — partes, itens, faturamento, benefícios/direitos de uso — hoje ligada ao módulo yaSpaces (locação de espaço/coworking), mas posicionada dentro do grupo de navegação "Vendas" do produto.

Como funciona

página ContractsPage.tsx (carteira de contratos do gestor) e uma tela de configuração dedicada em /settings (SalesContracts.tsx, dentro de Configurações → Vendas → Contratos). Modelo de dados: contracts, contract_parties (as partes do contrato), contract_items, contract_types (tipos configuráveis), contract_invoices (faturas ligadas ao contrato) e, específico do vertical de espaços, contract_space_entitlements/contract_dedicated_spaces. Mudança de estado do contrato é registrada em contract_events. No drawer de Contas (AccountDrawer360), o contrato ativo da conta aparece via hook useAccountActiveContract.

Resolve

negócio que vende por contrato recorrente (não só pedido avulso) precisa controlar vigência, partes envolvidas, itens contratados e faturamento vinculado — hoje isso ficava fora do CRM, em documento solto ou planilha.

Por que importa

fecha o ciclo entre "negócio fechado" e "contrato ativo com faturamento recorrente e regras de uso" dentro do mesmo sistema onde a venda aconteceu.

Como falar disso

cuidado ao divulgar como recurso genérico de "gestão de contratos B2B" — o modelo de dados hoje carrega conceitos específicos do vertical de locação de espaço (yaSpaces); confirmar com o time de produto se já existe uso fora desse vertical antes de generalizar em material de marketing.

Divergências com o material de marketing
  • Valor ponderado do funil: era uma divergência real na varredura anterior (tela mostrava 50% fixo), mas foi corrigida no código — hoje um projection-worker calcula o valor ponderado real a partir da probabilidade de cada estágio, e o front consome esse dado pronto. Já pode ser divulgado como "projeção de receita ponderada por estágio" sem ressalva.
  • Variáveis dinâmicas na proposta ({{contact_name}}, {{cliente.nome}}): re-checado no main — continua sem motor de interpolação. Aparecem citadas como dica de uso na tela de configuração de template de proposta, mas o texto {{...}} não é substituído automaticamente em nenhum lugar do fluxo hoje. Não anunciar personalização automática de proposta por variável.
  • Verificação por código no aceite de proposta: re-checado e o gap é mais grave do que descrito antes — o código de confirmação é gerado e conferido inteiramente no navegador do cliente (via localStorage); o endpoint que grava o aceite (accept-proposal) recebe o campo de código como opcional e nunca chega a validá-lo. É bypassável chamando o endpoint direto. Não descrever essa etapa como "verificação segura" ou "autenticação" em material voltado a segurança/compliance, sob nenhuma hipótese, até isso ser corrigido no backend.
  • Histórico de transição de estágio de Deals: re-checado — continua não existindo tabela dedicada para negócios (existe para conversas e para tickets de suporte, mas não para deals). Não anunciar "histórico de transição de estágio" como recurso do pipeline comercial.
  • Central de Leads: material de planejamento interno trata esse módulo como algo a construir; o código mostra implementação completa e em produção, incluindo filtro avançado, segmentos salvos e ações em massa — vale atualizar o material interno para refletir isso.
  • "Distribuição de leads": re-checado — continua não existindo como motor comercial dedicado; o "dono do lead" é derivado do motor de distribuição de conversas do inbox. Não anunciar como funcionalidade própria de CRM/vendas.
  • Playbooks "em estágio inicial": o código mostra CRUD completo e consumo real em tempo de execução pela IA (injetado no prompt do Mentor durante a conversa) — a maturidade real é maior do que a classificação usada em material de planejamento interno sugere; a ressalva cabível é sobre adoção pelos clientes, não sobre a implementação.
  • Contratos e Sales (yaRevenue): módulos que existem em produção e não estavam em nenhuma versão anterior deste mapa — vale alinhar com produto se e como divulgar, já que Contratos carrega hoje conceitos específicos do vertical yaSpaces.
  • Nota de escopo — não confundir: existe uma página DealLanding.tsx (rota pública /deal/:token) e telas PlatformDeals.tsx/BillingDeals.tsx — são deals da New Way vendendo yapt. (billing da própria plataforma), não o Deals/Pipeline que o tenant usa para vender seus próprios produtos. Não confundir os dois sistemas em material de marketing.

> Última varredura: 31/07/2026 (origin/main)

05

Disparos e Infra Meta

Falar com a base inteira sem tomar bloqueio.

Wizard de campanha com 5 modos de audiência

Em produção

o fluxo guiado para criar um disparo — do público ao conteúdo, com revisão final antes de enviar.

Como funciona

o wizard foi reconstruído (v2) em 5 passos — Básico, Público, Como & quando, Conteúdo, Revisar — em CampaignWizardV2.tsx (BasicStep, AudienceStep, HowWhenStep, ContentStepV2, ReviewStepV2). A audiência aceita 5 modos definidos no tipo AudienceMode (src/types/campaign.ts): smart_picks (audiências prontas com contagem ao vivo, em SmartPicks.tsx), manual (seleção contato a contato via ContactPicker), filter (filtro dinâmico via SegmentBuilder), import (upload de CSV processado por campaign-import-worker, 928 linhas) e saved (audiência salva via SavedAudiencePicker) — todos ainda montados por AudienceBuilder.tsx, reaproveitado dentro do AudienceStep do wizard v2. O backend materializa os destinatários em campaign_sends via campaign-scheduler, em chunks de 100 com auto-continuação se a Edge Function estourar o timeout.

Resolve

montar uma lista de disparo hoje é planilha solta, WhatsApp Business App manual ou ferramenta de terceiro desconectada do CRM — cada campanha vira um projeto de exportação/importação.

Por que importa

reduz o tempo entre "quero falar com esse grupo" e "está enviando" — a audiência nasce dentro da mesma base de contatos que já tem histórico, scoring e atribuição.

Como falar disso

"Você escolhe o público na mesma tela onde já vê o histórico do cliente — sem exportar planilha, sem ferramenta separada."

Filter builder para segmentação dinâmica

Em produção

montador de regras para criar audiências que se recalculam sozinhas, sem depender de listas fixas.

Como funciona

SegmentBuilder.tsx e SimpleFilterBuilder.tsx constroem uma árvore FilterRules (grupos AND/OR de FilterCondition) sobre 6 entidades — contact, conversation, deal, campaign_history, ad_campaign, tag — com 13 operadores (eq, gt, contains, in, is_empty, etc., em src/types/campaign.ts). O catálogo FILTER_ENTITY_FIELDS expõe campos prontos: estágio do ciclo de vida, lead score, status do deal, origem do contato (Meta Lead Ads, CTWA, orgânico), status de conversa anterior, UTMs de campanha. Segmentos podem ser static (snapshot fixo) ou dynamic (recalcula a cada uso), com contagem cacheada (cached_count, cached_count_at).

Resolve

"quero falar só com quem abriu mas não respondeu nos últimos 30 dias" ou "só com lead score acima de 70 vindo de anúncio" — sem pedir consulta SQL para o time técnico.

Por que importa

disparo sem segmentação vira spam para quem não devia receber — filtro fino é o que separa engajamento de bloqueio pela Meta.

Como falar disso

"Monta o público com filtros visuais — estágio, score, origem, histórico de campanha — sem escrever uma linha de código."

Modo broadcast — dilui envios entre múltiplos números de WhatsApp

Em produção

enviar uma mesma campanha a partir de 2 ou mais números conectados, dividindo o público entre eles em vez de sobrecarregar um único número — com envio também parcelável em ondas ao longo do tempo.

Como funciona

no passo "Como & quando" do wizard v2 (HowWhenStep.tsx), o operador escolhe entre "Envio único" (1 número) e "Broadcast" (2+ números), com um cartão por canal mostrando qualidade e templates aprovados (ChannelCard.tsx). Em modo broadcast, a divisão do público entre os números é configurável em DistributionEditor.tsx — igualitária (split automático) ou personalizada (percentual por número, com "rebalancear o resto"). Independente do modo, o envio pode ser "agora", agendado para uma data, ou em ondas (2 a 5 lotes, cada uma com seu próprio percentual e horário, WavesEditor.tsx). No submit (useCampaignWizardV2Submit.ts), o público é particionado primeiro por número (partitionWeighted) e depois por onda dentro de cada número — resultando em N números × M ondas = até N×M campanhas-filhas agrupadas sob um broadcastGroup, cada uma rodando com o throttle e a proteção de tier do seu próprio número (ver seções de ritmo/pausa por tier abaixo). Um envio que resolve para um único filho (1 número, 1 onda) não é agrupado — segue como campanha simples. O modo broadcast está atrás de uma feature flag por tenant (tenants.settings.broadcast_fleet, useBroadcastFleet.ts) — só aparece na tela quando ligado para o tenant.

Resolve

carga de disparo concentrada em um único número, que sobe de risco de bloqueio e esbarra no teto diário do tier mais cedo — hoje a alternativa manual seria criar campanhas separadas e dividir a lista na mão.

Por que importa

distribuir o mesmo disparo entre vários números é o que permite escalar volume sem depender de um único número aguentar tudo — e ainda dá controle de ritmo por onda.

Como falar disso

"Uma campanha grande pode sair de vários números ao mesmo tempo, dividindo o público entre eles automaticamente — e dá para escalonar o envio em ondas, não só de uma vez."

Template reserva e rotação automática (proteção contra template pausado pela Meta)

Em produção

dois mecanismos que evitam que uma campanha pare de vez quando a Meta pausa ou rejeita o template em uso — um define templates reserva por número, o outro revezia entre vários templates desde o início do envio.

Como funciona

no passo "Conteúdo" do wizard v2 (ContentStepV2.tsx), cada número pode ter, além do template principal, uma lista ordenada de templates "reserva" (fallback) com variáveis próprias. Alternativamente, o operador pode escolher o modo "rotação" (WizardV2ContentMode = 'rotation', RotationTemplateGrid.tsx): um pool de N templates marcados que revezam entre si desde o primeiro envio, diluindo volume por template (campaign.metadata = { template_rotation: true, template_pool: [...] }, parseado por _shared/campaign-rotation.ts). No backend, campaign-scheduler lê esse pool e distribui os destinatários entre os templates (pickPoolEntry); campaign-drain monitora falhas de envio — se detecta indício de template pausado/rejeitado pela Meta, chama rotateOutBlockedTemplate para trocar automaticamente para a próxima entrada ativa do pool (reserva ou próximo da rotação) e registra o evento campaign.template_switched na timeline da campanha; se o pool se esgota, a campanha é pausada com motivo explícito.

Resolve

template pausado no meio do envio hoje derruba a campanha inteira até alguém perceber e trocar manualmente.

Por que importa

troca automática mantém a campanha rodando sem intervenção manual — e a rotação desde o início já reduz a chance de um único template acumular volume suficiente para ser sinalizado.

Como falar disso

"Se um template for pausado no meio do envio, o sistema troca sozinho para a reserva — e dá para já começar revezando entre vários templates, sem depender de um só."

Ritmo de envio e orçamento

Parcial

controle de velocidade e teto de gasto para um disparo.

Como funciona

cada campanha (ou cada número, em modo broadcast) define sends_per_minute e budget_limit opcional no passo "Como & quando" (HowWhenStep.tsx). Durante o envio, campaign-drain respeita o menor entre o ritmo configurado pelo tenant e o teto por tier Meta (TIER_SENDS_PER_MINUTE: 400/min no tier 1K, 600 no 10K, 800 no 100K, 1000 no ilimitado). O custo real (actual_cost) é atualizado por envio via calculateSendCost, que busca a tabela de preço (get_template_rate RPC) e cai para valores fixos de fallback (Marketing R$0,4485, Utility R$0,0575, Authentication R$0,0403) se a rate card não responder. Ao atingir budget_limit, a campanha pausa sozinha (pauseCampaignIfNeeded) e emite campaign.budget_reached.

Resolve

campanha que estoura o orçamento do mês sem ninguém perceber até a fatura da Meta chegar.

Por que importa

limite de gasto automático é a diferença entre "campanha grande, mas controlada" e "descobri o custo depois que já foi tudo".

Como falar disso

"Você define o teto de gasto antes de apertar enviar — a campanha para sozinha se chegar lá."

Métricas ao vivo da campanha

Em produção

painel que mostra em tempo real quantos foram enviados, entregues, lidos, respondidos, falharam ou saíram por opt-out.

Como funciona

CampaignDetailPage.tsx usa useCampaignRealtime, que assina mudanças via Supabase Realtime (postgres_changes) nas tabelas campaigns_outbound e campaign_sends, com invalidação de cache throttled em 1s e fallback de polling a cada 30s caso o Realtime caia. Os contadores (total_sent, total_delivered, total_read, total_replied, total_bounced, total_failed, total_opted_out) são atualizados de duas formas: incremento atômico no envio (increment_campaign_counter RPC dentro de campaign-drain) e atualização de status de entrega/leitura via campaign-events-processor, alimentado pelos webhooks de status da Meta (webhook-bsp-platform).

Resolve

não saber se a campanha está funcionando até o dia seguinte, quando já é tarde para ajustar.

Por que importa

ver a taxa de leitura caindo no meio do envio permite pausar antes de queimar toda a base.

Como falar disso

"O funil da campanha atualiza na tela enquanto os envios acontecem — sem precisar dar F5."

Blocklist e opt-out

Em produção

lista de números que nunca recebem disparo, mais desqualificação automática por estágio de ciclo de vida.

Como funciona

dois mecanismos, os dois checados em toda tentativa de envio dentro de campaign-drain. (1) campaign_blocklist — tabela por tenant com telefone normalizado, gerida em /settings via BlocklistPage.tsx (adicionar manual, motivo, importação e exportação em massa via blocklist-import/blocklist-export); todo envio WhatsApp checa o telefone do contato contra o Set pré-carregado em memória para o lote inteiro (evita N+1). (2) Opt-out por ciclo de vida — se contacts.lifecycle_stage = 'disqualified', o envio é marcado opted_out e conta separado (total_opted_out), sem consumir tentativa. Ambos bloqueiam o envio antes de qualquer chamada à Meta.

Resolve

reclamação de cliente que pediu para não receber mais e continuou recebendo — motivo clássico de bloqueio de número pela Meta.

Por que importa

respeitar opt-out não é só boa prática — é o que mantém a qualidade do número e evita que a Meta rebaixe o tier de mensageria.

Como falar disso

"Quem pediu para sair, sai — a blocklist é checada em todo envio, antes de qualquer coisa ir para a Meta."

Horário de silêncio e limite de frequência no motor de disparos

Em produção

trava que impede envio de campanha fora do horário permitido do tenant e limite de quantos disparos um mesmo contato pode receber em um período.

Como funciona

dentro do próprio campaign-drain (não é feature exclusiva de follow-up) — antes de processar o lote, a função chama a RPC is_quiet_hours(p_tenant_id) uma única vez por ciclo; se verdadeiro, todo envio pendente daquele tenant é reagendado como pending em vez de disparado (error: "quiet_hours"). Em paralelo, batch_check_frequency_cap(p_contact_ids, p_tenant_id) retorna, para cada contato, se ele já recebeu o número máximo de mensagens permitido no período — se não, o envio é marcado skipped com last_error: "frequency_cap".

Resolve

disparo automático mandando mensagem às 23h ou o mesmo contato recebendo 3 campanhas diferentes no mesmo dia.

Por que importa

horário de silêncio e limite de frequência são proteção direta contra reclamação e queda de qualidade do número — sem eles, escala vira risco.

Como falar disso

"O motor de disparos respeita o horário de silêncio e o limite de frequência do seu negócio — automaticamente, sem depender de alguém lembrar de configurar isso campanha por campanha."

Pausa automática por qualidade e limite de tier Meta

Em produção

proteção que impede a campanha de continuar enviando quando o número está com qualidade ruim ou perto do limite diário da Meta.

Como funciona

channel_meta_tiers guarda, por número, current_tier (tier_1k/tier_10k/tier_100k/tier_unlimited), tier_limit, messages_sent_today e quality_rating (GREEN/YELLOW/RED). Em cada envio, campaign-drain verifica: se quality_rating === 'RED', a campanha é pausada (pauseCampaignIfNeeded, motivo "Meta quality rating RED") e o envio reagendado; se messages_sent_today atinge 90% do tier_limit (Math.floor(tier.tier_limit * 0.9)), a campanha pausa por "Meta tier limit reached (90% threshold)". Todo canal WhatsApp novo ganha automaticamente um registro tier_1k (limite 1.000/dia) via trigger auto_create_channel_meta_tier na criação do channel_instance. Rate limit devolvido pela própria Meta também aciona cooldown por canal com backoff exponencial (até 300s) e contagem de tentativas (MAX_RATE_LIMIT_RETRIES = 10).

Resolve

continuar mandando mensagem depois que o número já está sinalizado como problemático pela Meta — isso é o que leva ao bloqueio.

Por que importa

pausa automática em 90% do limite e em qualidade RED é a diferença entre "o número ficou marcado amarelo" e "o número foi banido".

Como falar disso

"A campanha se protege sozinha — se o número esfriar de qualidade ou chegar perto do limite da Meta, o envio pausa antes de virar problema."

Concorrência e throttle por tier Meta

Em produção

ajuste automático de quantos envios simultâneos e por minuto o sistema faz, de acordo com o tier de mensageria de cada número.

Como funciona

campaign-drain calcula uma concorrência efetiva por lote com base no tier mais restritivo presente no batch (TIER_CONCURRENCY: 5 simultâneos no tier 1K, 8 no 10K, 12 no 100K, 15 no ilimitado) — isso existe para não estourar limites de infraestrutura da própria Supabase, separado do limite da Meta. O ritmo por minuto (TIER_SENDS_PER_MINUTE) também limita o sends_per_minute configurado na campanha ao teto do tier. Entre chunks de envio, há um delay calculado ((60000/sends_per_min) * concorrência, capado em 10s) para não passar do ritmo-alvo.

Resolve

campanha configurada para "enviar rápido" que na prática atropela o limite da Meta e trava o número.

Por que importa

throttling automático por tier evita que o operador precise saber de cor os limites da Meta — o sistema já sabe.

Como falar disso

"Você não precisa saber os limites da Meta de cor — o sistema ajusta a velocidade do disparo sozinho, conforme o tier do seu número."

Sequências multi-passo (réguas de disparo)

Em produção

régua de mensagens automáticas com espera, decisão condicional e ramificação, disparada por um cron dedicado.

Como funciona

CampaignSequence tem passos (CampaignSequenceStep) de 4 tipos (SequenceStepType): send (envia template), wait (aguarda N horas — wait_duration_hours), condition (avalia regra e desvia para true_next_step/false_next_step) e split (weighted branch, definido no tipo e configurável na UI, mas não implementado no runner, ver Divergências). O campaign-sequence-runner roda a cada 2 minutos via pg_cron, processa até 20 inscrições (campaign_sequence_enrollments) por ciclo cujo next_action_at já passou, e só trata step_type igual a send, condition ou wait. Para passo send, chama send-active-message e avança; para condition, hoje a única condição avaliada é replied (o contato respondeu desde a inscrição) — se exit_on_reply estiver ligado na sequência, a inscrição sai automaticamente ao detectar resposta inbound.

Resolve

régua de nutrição manual — "manda mensagem 1 hoje, espera 3 dias, manda mensagem 2 se não respondeu" — hoje feito em planilha ou na memória do vendedor.

Por que importa

régua automática mantém contato com o lead sem depender de alguém lembrar de voltar a falar com ele.

Como falar disso

"Monta a régua uma vez — enviar, esperar, checar se respondeu, ramificar — e ela roda sozinha para cada contato." Não mencionar ramificação por peso (split) até estar implementada.

Teste A/B de campanha

Planejado

a promessa da UI é enviar duas variantes de template para frações do público e comparar taxa de leitura/resposta, elegendo um vencedor automático. Como funciona (e por que não usar em vendas): o schema (campaigns_outbound.ab_variants, ab_winner, ab_decision_pct) e a tela de resultados (CampaignABResultsTab.tsx, comparação por ab_variant com "Vencedor" quando ab_winner está preenchido) ainda existem no código. Mas a tela que configurava o teste A/B ao criar a campanha foi removida do wizard atual — o wizard v2 (BasicStep.tsx) documenta explicitamente no próprio código-fonte que "warm-up banner, or A/B toggle" são "conceito só do v1", ou seja, hoje não existe nenhum lugar na interface de criação de campanha onde configurar variante A/B. E mesmo que existisse: campaign-scheduler — a função que cria os envios — continua usando apenas campaign.template_id para todos os destinatários e nunca lê ab_variants nem grava ab_variant por envio; nenhuma função no repositório escreve em ab_winner. Ou seja, o recurso está mais regredido do que na varredura anterior: além do mecanismo de decisão nunca ter existido no backend, agora não há sequer como configurar um teste A/B pela tela — só resta código morto (tipo, migration e uma aba de resultados que nunca recebe dado).

Como funciona

Resolve

hoje, nenhuma — não é possível configurar pela tela.

Por que importa

decisão automática por vencedor economiza tempo de análise — mas hoje não existe ponta de configuração nem de execução real.

Como falar disso

não usar em material de vendas — nem como "em produção", nem como "em breve" sem confirmar antes se voltará a ser priorizado.

Aquecimento de número novo (warm-up)

Em produção

proteção de ritmo para número novo subir de tier de mensageria com segurança.

Como funciona

o wizard v1 chegou a exibir um banner prometendo "distribuição em 7 dias" — esse banner não existe mais: o wizard v1 inteiro (CampaignWizard.tsx, CampaignSetupStep.tsx) foi removido do código e substituído pelo wizard v2, cujo BasicStep.tsx registra em comentário que "warm-up banner" é conceito exclusivo do v1, descontinuado. Hoje não há, em lugar nenhum da tela de campanhas, nenhuma promessa de agendamento de envios ao longo de dias. O que existe de fato, e continua em produção, é o throttle por tier já descrito acima (400 envios/min no tier 1K, concorrência 5, pausa em 90% do limite diário de 1.000 mensagens) — proteção real, mas reativa (limita o ritmo), não uma rotina que planeja/distribui envios ao longo de uma janela de dias. A subida de tier em si continua sendo controlada pela própria Meta, não pelo yapt.

Resolve

número novo que leva bloqueio por mandar volume alto de uma vez, sem histórico de reputação.

Por que importa

a proteção real (throttle + pausa por tier/qualidade) já existe e funciona sozinha, sem precisar prometer uma janela específica de dias que não existe.

Como falar disso

falar apenas do throttle automático por tier ("o sistema já limita o ritmo de um número novo sozinho, sem digitar nada") — não mencionar "7 dias" nem "warm-up" como um recurso nomeado, porque a UI que usava esse nome não existe mais.

Heatmap de melhor horário (agregado, descritivo)

Em produção

mapa de calor mostrando em que dia da semana e hora do dia as campanhas anteriores tiveram melhor taxa de leitura.

Como funciona

SendTimeHeatmap.tsx busca até 10.000 envios recentes do tenant (campaign_sends, sent_at/read_at/status), agrupa por dia da semana (segunda a domingo) × hora (7h–20h) e calcula a taxa de leitura por célula. É puramente descritivo — mostra o histórico agregado de todas as campanhas do tenant, não recomenda nem agenda nada automaticamente, e não é por contato individual: é uma média de toda a base.

Resolve

decidir "que horário eu costumo ter mais leitura" sem abrir uma planilha de análise.

Por que importa

dá um indício visual de janela de horário, mas não substitui uma decisão de agendamento — é leitura, não automação.

Como falar disso

"Você vê visualmente em que horário suas campanhas costumam ser mais lidas — não é uma sugestão por contato, é o histórico agregado da sua base."

Templates de WhatsApp — builder e categorias Meta

Em produção

criação de templates com variáveis, mídia e botões, nas 3 categorias oficiais da Meta.

Como funciona

TemplateBuilder.tsx monta os componentes do template (header, body com variáveis {{1}}/nomeadas, footer, botões) e valida antes de enviar para a Meta (validateTemplate). As 3 categorias Meta são de fato as usadas no código ('AUTHENTICATION' | 'MARKETING' | 'UTILITY', em template-sync/index.ts), com preço por categoria vindo da rate card (get_template_rate) ou do fallback fixo. template-sync envia o template tanto pela credencial WAENT quanto pela BSP Platform e grava resultado; template-status-sync mantém o status (approved/rejected/pending) sincronizado com a Meta.

Resolve

criar e aprovar um template de WhatsApp hoje exige ir ao Business Manager da Meta — aqui fica dentro do mesmo produto.

Por que importa

categoria errada = preço errado e risco de rejeição; sincronização automática evita usar template desatualizado ou pausado sem saber.

Como falar disso

"Você cria o template aqui, escolhe a categoria certa, e a gente sincroniza direto com a Meta — sem abrir o Business Manager."

Versionamento de templates

Em produção

histórico de mudanças de um template, preservando cada versão anterior.

Como funciona

tabela dedicada template_versions (template_id, version_number, components, status, waent_response, change_reason, changed_by), populada a cada edição relevante do template, com isolamento por tenant via RLS.

Resolve

template que foi editado e "quebrou" sem saber o que mudou desde a última aprovação.

Por que importa

rastreabilidade de mudança é o que permite reverter ou entender por que um template deixou de converter.

Como falar disso

"Toda alteração de template fica registrada — dá para ver exatamente o que mudou e quando."

Analytics de template

Em produção

métricas de performance por template — enviados, entregues, lidos, falharam, cliques, respostas, conversão e receita atribuída.

Como funciona

TemplateAnalytics.tsx + hook useTemplateAnalytics.ts agregam template_analytics/template_send_logs por período, calculando taxa de conversão e custo por conversão (totalCost / totalConversions).

Resolve

saber qual template realmente traz retorno, não só qual "parece bonito".

Por que importa

decide investimento — qual template merece ser reusado em escala e qual deve ser descartado.

Como falar disso

"Cada template mostra o retorno real — não só quantos enviaram, mas quantos viraram conversa e negócio."

WhatsApp Flows nativos

Em produção

formulários interativos que abrem dentro da própria conversa de WhatsApp, usando a API oficial de Flows da Meta — recurso próprio do yapt., distinto do Flow Builder de automação de atendimento.

Como funciona

WAFlowBuilder.tsx monta as telas do Flow (WAFlowScreenCard, WAFlowComponentEditor, WAFlowComponentPalette) com preview simulando o celular (WAFlowPhonePreview.tsx) e mapeamento de resposta (WAFlowResponseMapping.tsx). A Edge Function wa-flow-manager tem uma ação dedicada publish que envia o Flow para a API da Meta. Existe galeria de templates prontos de Flow (WAFlowTemplateGallery.tsx, hook useWAFlowTemplates) para começar de um modelo em vez do zero, e teste do Flow antes de publicar (WAFlowTestDialog.tsx).

Resolve

coletar dados estruturados (agendamento, cadastro, pesquisa) sem tirar o cliente da conversa para um link externo.

Por que importa

formulário nativo tem taxa de conclusão maior que link externo — o cliente não sai do WhatsApp.

Como falar disso

"O formulário abre dentro da própria conversa de WhatsApp — o cliente preenche sem sair do app."

Gestão de canais e números Meta

Em produção

tela para conectar e administrar contas de WhatsApp Business, Meta App oficial e Instagram.

Como funciona

MetaConnections.tsx cuida do OAuth com a Meta e vínculo da WhatsApp Business Account; Channels.tsx lista canais, permite ativar/desativar e definir prioridade entre eles; MetaWebhooks.tsx cuida da configuração de webhook. Cada canal WhatsApp criado ganha automaticamente um registro de tier (channel_meta_tiers, tier inicial tier_1k), que é a base para todo o throttle e pausa automática descritos acima. O indicador de qualidade do número (quality_rating) aparece tanto no wizard de campanha quanto no painel yapt. Play (YaHomeWhatsAppWorld.tsx).

Resolve

conectar e monitorar múltiplos números de WhatsApp Business sem depender de configuração manual espalhada.

Por que importa

é a infraestrutura sobre a qual todo o resto do disparo funciona — sem canal saudável, não tem campanha que se sustente.

Como falar disso

"Você conecta seu número Meta uma vez — a gente cuida do tier, da qualidade e do limite diário automaticamente."

AI Optimizer de campanhas

Planejado

página que apresenta a visão de inteligência artificial futura para campanhas — melhor horário, otimização de conteúdo, segmentação inteligente, predição de performance, auto-throttle, lookalike audiences.

Como funciona

AIOptimizerPage.tsx renderiza 6 cards, todos marcados explicitamente no código como status: 'planned' — inclusive "Melhor Horário de Envio" ("IA analisa quando seus contatos estão mais ativos e sugere o horário ideal para cada segmento"). Não há nenhuma lógica de IA rodando por trás — é uma tela de visão de produto ("Como vai funcionar"), sem coleta, sem modelo, sem sugestão real aplicada a uma campanha. Inalterado desde a última varredura.

Resolve

hoje, nenhuma — é comunicação de roadmap, não uma funcionalidade em uso.

Por que importa

importante deixar claro para marketing/comercial que esta tela não deve ser vendida como recurso disponível.

Como falar disso

não usar em material comercial como funcionalidade existente — é roadmap declarado, não produto em produção.

Divergências com o material de marketing

1. "Disparos dilui/distribui envios entre múltiplos números de WhatsApp"Confirmado, revertendo a conclusão da varredura anterior. Existe agora um modo broadcast completo no wizard v2 (HowWhenStep.tsx, DistributionEditor.tsx) que divide o público entre 2+ números conectados, igualitária ou percentual, gerando campanhas-filhas agrupadas por número (e por onda, se configurado). Ressalva importante para uso comercial: o recurso está atrás de uma feature flag por tenant (tenants.settings.broadcast_fleet) — não é padrão em todo cliente hoje. Falar dele apenas com confirmação prévia de que a flag está ligada para o tenant em questão.

2. "Divide/gera copy de template com IA"Não encontrado, refutar. Nenhuma função de geração de texto de template via LLM existe na área de disparos/templates (buscado em TemplateBuilder.tsx, template-sync, template-status-sync e em todo supabase/functions). IA no yapt. aparece em outros domínios (orquestrador, detecção de emoção na conversa, painel de sussurro), não na criação de copy de template de disparo.

3. "Melhor horário de envio por contato"Placeholder confirmado, inalterado. No AIOptimizerPage.tsx, o card "Melhor Horário de Envio" está literalmente marcado status: 'planned' no código-fonte — sem lógica por trás. O que existe e está em produção é o SendTimeHeatmap.tsx: um mapa de calor agregado por tenant (não por contato) mostrando taxa de leitura histórica por dia/hora, puramente descritivo, sem sugestão automática nem agendamento. Não confundir os dois ao comunicar — o heatmap existe e pode ser citado como está descrito acima; a otimização por contato, não.

4. Horário de silêncio e limite de frequência no motor de DisparosConfirmado, existem no próprio motor de campanhas, inalterado. campaign-drain/index.ts chama is_quiet_hours(p_tenant_id) e batch_check_frequency_cap(p_contact_ids, p_tenant_id) antes de qualquer envio de campanha.

5. Teste A/B com "vencedor automático"Ainda refutado, e mais regredido do que na varredura anterior. Não só campaign-scheduler continua sem ler ab_variants nem gravar ab_variant/ab_winner — a própria tela de configuração do teste A/B (que existia no wizard v1, ABVariantBSection.tsx) foi removida do wizard atual (v2); o próprio código do BasicStep.tsx documenta que "A/B toggle" é conceito exclusivo do v1, descontinuado. Hoje o recurso não tem ponta de configuração nem de execução — não usar em nenhuma comunicação como disponível ou "em breve" sem confirmação de prioridade.

6. Sequências — passo "split" (ramificação por peso)Inalterado. O tipo SequenceStepType inclui 'split' e a UI (SequenceBuilder.tsx) permite configurá-lo, mas campaign-sequence-runner/index.ts só implementa os tipos send, wait e condition — não há tratamento de split no runner.

7. Rotação de templates dentro de uma campanhaConfirmado, revertendo a conclusão da varredura anterior. Existe hoje um modo de rotação (revezamento) entre múltiplos templates dentro de uma mesma campanha, configurável no wizard v2 (RotationTemplateGrid.tsx, modo 'rotation' em ContentStepV2.tsx) e efetivamente lido/aplicado por campaign-scheduler via _shared/campaign-rotation.ts. Separadamente, existe também um mecanismo de template "reserva" (fallback ordenado por número) que campaign-drain troca automaticamente quando detecta que o template ativo foi pausado/rejeitado pela Meta (rotateOutBlockedTemplate). Nenhum dos dois é o antigo "teste A/B por performance" (item 5) — são mecanismos de diluição de volume e continuidade de envio, não de decisão por taxa de leitura/resposta.

8. Links curtos de campanha (ex. broadcast.yapt.ai) — não encontrado nenhum mecanismo de encurtamento de link específico para campanhas de Disparos no código investigado.

9. Estimativa de custo pré-envio no wizard — divergência adicional encontrada nesta varredura: o componente que calculava e mostrava "destinatários × custo unitário", com aviso visual acima de R$500 ou 10.000 destinatários (CostEstimateCard.tsx), não está mais conectado a nenhuma tela do wizard v2 — ficou órfão no código. A revisão final do wizard atual mostra apenas o teto de orçamento configurado pelo operador, não uma estimativa de custo total calculada. Não comunicar "estimativa de custo antes de enviar" como recurso ativo até isso ser reconectado.

> Última varredura: 31/07/2026 (origin/main)

06

Suporte e Conhecimento

Tickets com SLA e a base que alimenta a IA.

Pipeline de suporte configurável (yaTickets)

Em produção

o motor que organiza todo atendimento de suporte em pipelines com estágios definidos pela própria empresa, cada estágio com seu próprio comportamento.

Como funciona

cada tenant configura um ou mais support_pipelines, com estágios (support_pipeline_stages) tipados como novo, em andamento, aguardando cliente, monitoramento, resolvido, encerrado ou automático. Cada estágio pode ter SLA em horas, opção de pausar a contagem do SLA (por exemplo enquanto espera resposta do cliente), exigir nota obrigatória para avançar, e ser marcado como estágio terminal. Um trigger de banco cria o ticket automaticamente a partir do inbound — o atendimento não nasce "solto" numa caixa de entrada, nasce já dentro de um pipeline.

Resolve

suporte que roda em caixa de entrada única, sem etapa, sem dono, sem prazo — onde ninguém sabe quantos chamados estão parados nem há quanto tempo.

Por que importa

dá visibilidade e previsibilidade ao processo de suporte, condição básica para medir e melhorar tempo de resposta e retenção do cliente atendido.

Como falar disso

"O suporte do yapt. roda em pipeline configurável, do jeito que sua operação já pensa — com prazo e regra em cada etapa, não numa fila cega." "Você desenha o processo de atendimento; o yapt. garante que ele é seguido."

Ticket com protocolo, prioridade, SLA e semáforo

Em produção

o registro individual de cada atendimento de suporte, com identificação, prioridade, prazo e um indicador visual de risco.

Como funciona

cada ticket recebe um número de protocolo sequencial por empresa (ticket_number), prioridade (crítica, alta, normal, baixa), status (aberto, resolvido, encerrado, reaberto), marca de primeira resposta (first_response_at) e cálculo de SLA estourado (sla_breached) com tempo decorrido e pausas registradas. Um semáforo visual (verde / amarelo a partir de 75% do prazo / vermelho) mostra o risco de estouro de cabeça, sem precisar abrir o ticket. O motivo de encerramento é obrigatório desde que essa regra entrou em vigor — o atendente não fecha um ticket sem categorizar por quê.

Resolve

"não sei quantos chamados estão prestes a estourar o prazo" e "fechamos o ticket mas ninguém sabe por que motivo".

Por que importa

SLA visível em tempo real é o que permite agir antes do atraso virar reclamação — e motivo de encerramento obrigatório é o dado que alimenta qualquer análise de causa-raiz depois.

Como falar disso

"Todo ticket tem protocolo, prazo e semáforo — dá para saber o que está prestes a estourar sem abrir um por um." "Fechar sem dizer o motivo não é permitido: todo encerramento vira dado."

Ticket por caso e triagem

Em produção

um modo de criação de ticket configurável por setor, com uma tela dedicada de triagem para conversas que ainda não têm ticket vinculado.

Como funciona

cada setor (inbox) escolhe seu modo de criação de ticket; conversas sem ticket entram numa fila de triagem, com sugestões de vínculo; a reabertura de conversa também passa a considerar o modo de triagem configurado, com janela de regras própria (v2). A IA tem ferramentas dedicadas de triagem de ticket para uso interno.

Resolve

conversa entra pelo WhatsApp e "se perde" sem virar chamado formal, ou vira chamado errado por setor.

Por que importa

garante que nada passa despercebido — toda conversa relevante é triada e vinculada ao processo certo, por setor.

Como falar disso

"Nenhuma conversa fica órfã: o que entra sem ticket cai numa triagem, não numa lacuna." "Cada setor decide como o próprio ticket nasce."

Ticket avulso

Em produção

a criação manual de um ticket de suporte sem passar pela IA nem por uma conversa de WhatsApp já existente.

Como funciona

o atendente busca a empresa por CNPJ (ou cria contato novo), escolhe canal, etapa, nota e categoria, e o sistema cria uma conversa vazia junto com o ticket, já nascendo em fluxo humano. Serve para registrar atendimento que começou por telefone, e-mail ou presencialmente, mas precisa entrar no mesmo pipeline de suporte.

Resolve

atendimento que não nasceu no WhatsApp mas precisa do mesmo controle de SLA e pipeline dos que nasceram lá.

Por que importa

unifica toda a operação de suporte num único lugar, independente do canal de entrada original.

Como falar disso

"Nem todo chamado começa no WhatsApp — o yapt. registra também o que veio por telefone ou e-mail, no mesmo pipeline." "Um único lugar para todo o suporte, não importa por onde ele entrou."

Sub-tickets em árvore

Em produção

a possibilidade de abrir tickets filhos dentro de um ticket principal, formando uma hierarquia.

Como funciona

cada ticket guarda parent_ticket_id e profundidade (depth); a árvore é exibida de forma recursiva num painel dedicado, permitindo criar sub-ticket a partir de qualquer nó.

Resolve

um chamado complexo que na prática se desdobra em vários problemas menores, cada um precisando de dono e SLA próprio, sem perder o vínculo com o chamado original.

Por que importa

evita que um ticket "guarda-chuva" mascare o andamento real de várias frentes distintas dentro dele.

Como falar disso

"Chamado complexo, várias frentes: cada uma vira sub-ticket, sem perder o fio da meada com o chamado principal." "Hierarquia de tickets para quem lida com casos que se desdobram."

Múltiplas conversas no mesmo ticket

Em produção

a capacidade de vincular mais de uma conversa (por exemplo, do mesmo cliente em canais ou momentos diferentes) a um único ticket.

Como funciona

tabela dedicada (ticket_conversations) marca cada conversa vinculada com um papel — principal ou vinculada — e a busca de conversa para vincular usa uma função de busca real no lugar de colar identificador manualmente.

Resolve

o mesmo assunto sendo tratado em conversas separadas sem que o histórico completo apareça num único lugar.

Por que importa

dá visão consolidada de tudo que aconteceu em torno de um mesmo caso, mesmo quando o cliente escreveu em mais de uma conversa.

Como falar disso

"Um ticket, todas as conversas relacionadas — nada fica espalhado." "O histórico do caso é um só, mesmo que o cliente tenha escrito em mais de uma conversa."

Escalação com modo espelho e modo transferência

Em produção

o mecanismo de subir um ticket para um nível de atendimento superior (N2), com dois jeitos diferentes de fazer isso.

Como funciona

o modo espelho mantém o atendente original visível/presente enquanto o nível superior atua junto; o modo transferência passa o ticket adiante. Cada escalação tem status (pendente, aceita, resolvida, devolvida, cancelada), nível, e pode ser disparada automaticamente por regra de SLA (escalation_rules). Existe SLA dedicado para o segundo nível (n2_sla_minutes, n2_sla_breached) e uma timeline visual da escalação.

Resolve

chamado que precisa de um especialista ou de um nível hierárquico acima, sem que o cliente perca o atendente que já conhecia o caso (no modo espelho) ou sem perder rastro de quem é o responsável atual (no modo transferência).

Por que importa

dá controle sobre como e quando um caso sobe de nível, com prazo próprio para essa segunda camada de atendimento.

Como falar disso

"Escalar não é perder o dono do caso: no modo espelho, quem começou o atendimento continua por perto." "Dois jeitos de escalar — espelhado ou por transferência — e cada um com prazo próprio."

Reabertura de ticket com auditoria

Em produção

o registro de todo evento de reabertura de um atendimento encerrado, com rastro de quem, quando e por quê.

Como funciona

cada reabertura grava a origem (lista da caixa de entrada, modal da conversa, histórico do contato, quadro de tickets, busca, API ou reabertura automática pelo próprio inbound), o motivo, quem reabriu, o status anterior e o estado de atendimento anterior.

Resolve

"esse chamado já tinha sido fechado, quem reabriu e por quê?" — pergunta comum em auditoria de qualidade de suporte.

Por que importa

transforma reabertura em dado auditável, útil tanto para medir qualidade do fechamento quanto para investigar reclamação recorrente.

Como falar disso

"Toda reabertura fica registrada — quem reabriu, de onde e por quê, sempre." "Fechamento de chamado não é ponto cego: reabrir também vira histórico."

Motivos de atendimento

Em produção

a categorização/tipificação de cada atendimento de suporte por motivo, configurável por setor.

Como funciona

motivos de encerramento (closure_reasons) são definidos por setor/caixa de entrada; a IA também classifica automaticamente o motivo, e há uma aba de relatório que cruza a classificação da IA com o motivo escolhido pelo humano para medir a acurácia dessa classificação automática.

Resolve

"não sabemos do que as pessoas mais reclamam ou pedem" — falta de tipificação que impede qualquer análise de causa-raiz em volume.

Por que importa

é o dado que permite identificar os principais motivos de contato e agir sobre a causa, não só sobre o sintoma.

Como falar disso

"Cada atendimento fechado carrega um motivo — dá para saber, em volume, do que o seu cliente mais precisa." "A IA sugere o motivo, o humano confirma: a tipificação sai praticamente pronta."

Aviso de encerramento ao cliente

Em produção

uma mensagem automática que avisa o cliente antes de a IA encerrar a conversa, para evitar a sensação de "sumiço".

Como funciona

é uma configuração de comportamento do agente de IA (behaviors.closing), com mensagem de confirmação customizável, opção de confirmar depois de usar ferramentas e encerramento automático na resolução. Nasce desligada por padrão — cada agente precisa ativar explicitamente.

Resolve

conversa que simplesmente para de responder sem avisar, deixando o cliente sem saber se foi resolvido ou esquecido.

Por que importa

um encerramento comunicado explicitamente reduz a sensação de abandono e a chance do cliente reabrir por engano achando que não foi atendido.

Como falar disso

"A IA avisa antes de encerrar — o cliente sabe que o atendimento terminou, não fica adivinhando." "Cada agente decide como se despede; o yapt. garante que a despedida acontece."

Relatórios de suporte

Em produção

o painel de métricas do suporte, separado por visão geral, operação, pipeline, escalações e motivos.

Como funciona

cinco abas dedicadas — Visão Geral, Operações, Pipeline (reaproveita o componente de pipeline usado em outros relatórios do produto), Escalações e Motivos — cada uma consultando as tabelas de tickets, SLA e escalação diretamente.

Resolve

falta de visibilidade gerencial sobre volume, prazo e qualidade do suporte sem depender de planilha manual.

Por que importa

dá ao gestor de suporte o painel para medir a própria operação e decidir onde investir (mais gente, mais SLA, revisão de processo).

Como falar disso

"O relatório de suporte mostra volume, prazo, escalação e motivo — tudo num só lugar, sem exportar nada." "Gestão de suporte com dado, não com achismo."

Tools de IA para suporte

Em produção

o conjunto de ações que a própria IA pode executar dentro do fluxo de suporte, sem intervenção humana.

Como funciona

a IA tem ferramentas específicas para mover o ticket de estágio no pipeline, encerrar a conversa com motivo de resolução (resolvido, não qualificado, sem resposta, spam), pedir humano com motivo e prioridade, transferir para outra fila, e disparar formulários de WhatsApp (inclusive de pesquisa de satisfação).

Resolve

IA que identifica que precisa de humano ou que o caso está resolvido, mas não consegue agir sozinha sobre o próprio ticket.

Por que importa

fecha o ciclo entre "a IA entendeu" e "o ticket refletiu isso" — sem esse elo, todo entendimento da IA vira trabalho manual do atendente.

Como falar disso

"A IA não só entende que o caso terminou — ela move o ticket, registra o motivo e fecha o laço sozinha." "Escalar para humano não depende de a IA 'lembrar' de avisar: é uma ação garantida no fluxo."

yaBrain — documentos, procedimentos e coleções

Em produção

a base de conhecimento estruturada que alimenta a IA de suporte, com documentos, procedimentos passo a passo e organização por coleção.

Como funciona

os documentos e trechos indexados (knowledge_documents, knowledge_chunks) ficam organizados por fonte (knowledge_sources) e coleção (knowledge_collections), permitindo escopar conteúdo por persona ou contexto. Procedimentos (knowledge_procedures) modelam passo a passo com pré-requisito e caminho alternativo (fallback) em caso de exceção. Já existe volume real de conteúdo em produção, em dezenas de contas de cliente diferentes.

Resolve

IA de suporte respondendo "no chute" ou baseada só no que está no prompt, sem uma fonte de verdade documentada e atualizável.

Por que importa

é o que permite trocar a base de conhecimento sem reescrever a IA — atualiza o documento, a resposta muda.

Como falar disso

"A IA do yapt. não decora resposta no prompt — ela consulta uma base de conhecimento viva, documento por documento." "Procedimento com pré-requisito e alternativa: a IA sabe não só o que fazer, mas o que fazer quando o caminho padrão não serve."

Busca semântica e RAG

Em produção

o motor que permite à IA encontrar o trecho certo da base de conhecimento por significado, não por palavra-chave exata.

Como funciona

os documentos são divididos em trechos e transformados em vetor (embedding OpenAI text-embedding-3-small), armazenados com pgvector; no momento da conversa, a IA busca os trechos mais relevantes semanticamente para montar a resposta (pipeline de RAG dedicado no orquestrador).

Resolve

cliente pergunta com as próprias palavras, diferentes do título exato do artigo — busca por palavra-chave falha, busca semântica encontra.

Por que importa

aumenta a taxa de resposta correta da IA sem exigir que quem escreve a base de conhecimento adivinhe todo sinônimo possível.

Como falar disso

"O cliente não precisa acertar o termo exato — a IA entende o significado da pergunta e busca na base por sentido." "Busca semântica: a base de conhecimento responde ao que o cliente quis dizer, não só ao que ele digitou."

KB Health Score

Em produção

um indicador de saúde da base de conhecimento, calculado sobre o conteúdo real.

Como funciona

o painel calcula, entre outros fatores, a "frescor" do conteúdo olhando a data de atualização dos documentos nos últimos 90 dias, além de cobertura, precisão e desempenho — cálculo feito em tempo real sobre a própria tabela de documentos, não um número fixo.

Resolve

base de conhecimento que vira "cemitério de artigo" — ninguém sabe o que está desatualizado até o cliente receber resposta errada.

Por que importa

dá ao time de conteúdo um alvo objetivo para saber onde revisar primeiro, em vez de reler tudo por amostragem.

Como falar disso

"A base de conhecimento tem um placar de saúde — dá para saber o que está velho antes que o cliente descubra." "Não é 'confiar' que o conteúdo está em dia: o yapt. mede."

yaLearner — auto-enriquecimento da base de conhecimento

Em desenvolvimento

o mecanismo que detecta, nas próprias conversas, onde a base de conhecimento tem lacuna, agrupa esses sinais e sugere rascunho de artigo novo.

Como funciona

tem três camadas. A primeira — detecção de lacuna — é um trigger de banco (yalearner_detect_gap()) que escuta eventos de handoff/escalação, emoção negativa, baixa confiança da IA e resposta humana longa (proxy de lacuna), e grava um sinal (kb_gap_signals) a cada ocorrência; essa camada está de fato rodando em produção, com 215.803 sinais acumulados desde abril de 2026, em ritmo contínuo até a data desta varredura, em múltiplas contas de cliente. A segunda camada (yalearner_clusterer, agrupar sinais em kb_gap_clusters) e a terceira (yalearner_draft_generator, gerar rascunho em kb_drafts a partir do cluster) rodam via pg_cron (03h e 04h, diariamente) — mas, conferido diretamente no histórico de execução do cron em produção nos dias 29, 30 e 31/07, todas as execuções recentes falharam com o mesmo erro: unrecognized configuration parameter "app.settings.service_url". Só existem 2 rascunhos no banco até hoje, ambos de abril/maio (antes desse erro se instalar) — nenhum novo desde então. Ou seja: o funil está com a torneira de entrada aberta e o cano de saída entupido por um erro de configuração pontual, não por falta de sinal ou de demanda.

Resolve

base de conhecimento que só cresce quando alguém do time senta e escreve — o yaLearner promete que ela cresce sozinha, a partir do que a IA já não sabe responder.

Por que importa

se funcionar de ponta a ponta, é a diferença entre uma base de conhecimento estática e uma que se atualiza pelo próprio uso — reduz o trabalho manual de manutenção de conteúdo. O volume de sinal já acumulado (215 mil) mostra que a demanda para isso existe e está represada, não que falta o dado.

Como falar disso

evitar afirmar hoje, em material de venda, que "a base se atualiza sozinha" de ponta a ponta — a captação de sinal é real e em volume alto, mas o fechamento do ciclo (cluster → rascunho de artigo) está tecnicamente pronto e já produziu 2 rascunhos no passado, porém está parado por um bug de configuração no cron desde antes desta varredura.

Prompt Lab e Coaching

Em produção

duas ferramentas dentro do yaBrain — um changelog cruzado de versões de prompt/configuração de agente, e um painel de avaliação de qualidade das respostas da IA por conversa.

Como funciona

o Prompt Lab é um changelog: lista as últimas versões de prompt de qualquer agente, com autor identificado (humano, yaCreator ou sistema), diff entre versões e filtro por autor — reaproveita o mesmo dado de versionamento (agent_prompt_versions) usado no builder de agentes, não é uma tela nova de teste de prompt isolada. O Coaching é um painel de feedback de qualidade: lista conversas avaliadas, com filtro, estatísticas agregadas e um painel de detalhe por conversa; tem 513 registros reais de feedback de coaching já gravados em produção (agent_coaching_feedback).

Resolve

ajuste de prompt e avaliação de qualidade de atendimento feitos fora da ferramenta, sem ligação direta com o conteúdo real da base ou com o histórico de mudança do agente.

Por que importa

aproxima quem escreve/ajusta a resposta da IA de quem mantém a base de conhecimento e de quem avalia qualidade — o histórico de prompt e o feedback de coaching moram no mesmo lugar onde o conteúdo é mantido.

Como falar disso

"Toda mudança de prompt fica registrada, com autor e diff — inclusive quando quem mudou foi a própria IA." "Avaliação de qualidade de atendimento não é planilha à parte: já são centenas de conversas avaliadas dentro do próprio yaBrain."

Pesquisa de satisfação (CSAT/NPS) — disparo automático e interceptação sem reabertura

Em produção

o módulo de Pesquisas — dispara uma pesquisa de satisfação para o cliente logo depois que o atendimento é encerrado, respondida dentro do próprio WhatsApp, sem reabrir o card da conversa já fechada.

Como funciona

cada pesquisa (surveys) pode ser configurada para disparar automaticamente ao finalizar o ticket/conversa (trigger_on_finalize), com atraso de envio configurável em minutos, cooldown configurável em dias (por contato, vale para qualquer pesquisa — evita cansar o mesmo cliente), janela de resposta configurável em horas, kill switch em dois níveis (global e por tenant) e um serviço único de despacho que garante, por constraint de banco, no máximo um envio por conversa fechada — mesmo se o gatilho nativo e um nó do yaFlows disparassem ao mesmo tempo. O envio usa a infraestrutura de WhatsApp Flow já existente (formulário nativo da Meta): se a janela de 24h está aberta, manda o Flow direto; se está fechada, manda um template de utilidade com botão para abrir o Flow. A parte mais delicada do mecanismo é a interceptação da resposta: uma função isolada (checkSurveyInterception) decide, antes de qualquer outra coisa, se a mensagem recebida é a resposta de um Flow de pesquisa válido (token, prazo, tenant e identidade do respondente todos batendo); se for, ela grava a nota na timeline sem reabrir o card — só texto livre (um desabafo do cliente, por exemplo) reabre a conversa normalmente. Qualquer falha na checagem cai para o comportamento padrão (abre o card), nunca perde mensagem. Há também um worker de análise de sentimento sobre o comentário livre da pesquisa, e um nó dedicado ("Enviar pesquisa") para disparar pesquisa também a partir do yaFlows, além da própria régua nativa pós-atendimento. Em produção, o volume acumulado de envios já passa de 9.600 (a maior fatia expirada, seguida de falha de envio, depois respondida, cancelada e pulada por cooldown).

Resolve

medir satisfação do cliente sem depender de ligação, e-mail à parte ou pesquisa que ninguém responde por sair do canal onde a conversa aconteceu — e sem o efeito colateral de reabrir um atendimento que já foi resolvido só porque o cliente respondeu a uma nota.

Por que importa

pesquisa disparada no mesmo canal do atendimento, no momento certo, tem taxa de resposta maior do que pesquisa por e-mail ou formulário externo — e o fato de não reabrir o card evita que a métrica de qualidade vire ruído operacional (chamado reaberto por engano).

Como falar disso

"A pesquisa de satisfação dispara sozinha quando o atendimento termina — o cliente responde ali, no WhatsApp, sem sair da conversa e sem reabrir o chamado." "CSAT automático, com regra de intervalo mínimo entre pesquisas para não cansar o cliente, e um cuidado que poucos players documentam: responder a pesquisa nunca reabre o atendimento por engano."

Relatório de pesquisas (CSAT/NPS)

Em produção

a leitura consolidada dos resultados de todas as pesquisas disparadas, separada por visão geral, por caixa de entrada, por agente e por resposta individual.

Como funciona

quatro abas dedicadas de analytics (AnalyticsSurveys.tsx) — Visão Geral (score e tendência), Por Caixa, Por Agente e Respostas — cruzando o resultado (nota/comentário) com quem atendeu (agent_id), o setor (inbox_id) e se a resolução foi por IA, humano ou híbrida, tirado de um retrato do estado do atendimento no momento do fechamento. Também alimenta contact.metadata.csat_score no perfil do contato, para consulta rápida sem abrir relatório.

Resolve

saber a nota de satisfação em volume — não só ticket a ticket — e conseguir cortar por agente, equipe ou canal sem depender de planilha.

Por que importa

transforma uma pesquisa isolada em gestão de qualidade: dá para saber se a nota cai com um agente específico, um canal específico, ou quando quem resolveu foi a IA em vez de humano.

Como falar disso

"A nota de satisfação não fica presa no ticket — vira relatório, cortado por agente, por canal e por quem resolveu (IA ou humano)." "Você não precisa perguntar quem está com a nota mais baixa: o relatório mostra."

Follow-up aplicado ao suporte

Em desenvolvimento

a capacidade de reengajar automaticamente um ticket ou conversa de suporte parada por inatividade — o mesmo motor de régua de reengajamento usado em vendas, aplicado ao contexto de suporte.

Como funciona

o motor de follow-up roda em ciclo curto e permite regras com contexto support, filtráveis por pipeline, estágio e tempo de inatividade — a capacidade técnica existe e está pronta para uso, mas, até o momento desta varredura, nenhuma regra configurada na base de clientes usava o contexto de suporte.

Resolve

ticket que fica parado esperando resposta do cliente e ninguém retoma o contato proativamente.

Por que importa

reduz ticket abandonado por esquecimento em vez de resolução — mas hoje é uma capacidade disponível, ainda não adotada por nenhum cliente.

Como falar disso

evitar apresentar como diferencial já em uso — tratar como capacidade disponível a ser ativada, não como funcionalidade validada em campo.

Espelho de suporte com JournWay

Em produção

a sincronização de dados de suporte do yapt. com o JournWay (CRM central da New Way), mantendo cada sistema dono da própria informação.

Como funciona

o JournWay é dono do dado de empresa/conta; o yapt. é dono do dado de atendimento (conversa, ticket, IA). A sincronização acontece via fila de saída (outbox) com upsert idempotente por identificador externo e uma regra de estado que nunca reabre no destino algo que já foi fechado por um evento mais recente. Hoje o escopo está restrito à própria operação interna da New Way, habilitado por uma configuração específica de tenant.

Resolve

duplicar cadastro de empresa entre CRM e ferramenta de atendimento, ou perder rastro de qual sistema é a fonte de verdade de cada dado.

Por que importa

para a própria New Way, elimina retrabalho de manter dois cadastros de cliente sincronizados manualmente — hoje é uso interno, não uma capacidade oferecida a clientes do yapt.

Como falar disso

(uso interno da New Way — não recomendado como funcionalidade de venda para clientes neste momento, salvo se houver decisão de oferecer integração similar como produto.)

Por que este é um dos pilares mais fortes do produto

O que a varredura confirma no código e no banco de produção — desta vez a partir do origin/main real, não de um checkout desatualizado — sustenta boa parte da tese de que o yapt. é forte em suporte, e um capítulo inteiro fica mais forte do que a rodada anterior tinha registrado. Existe um pipeline de suporte configurável de verdade (não uma caixa de entrada única disfarçada), com SLA por estágio, semáforo, motivo de encerramento obrigatório, reabertura auditada, sub-ticket em árvore, múltiplas conversas por ticket e dois modos distintos de escalação — mais de 115 mil tickets já passaram por esse pipeline. A base de conhecimento (yaBrain) tem volume real de conteúdo (mais de 125 mil documentos, 42 procedimentos), busca semântica funcionando com embeddings e um placar de saúde calculado sobre dado vivo. A IA tem ferramentas reais para agir sobre o próprio ticket, fechando o ciclo entre entendimento e ação.

E o CSAT/NPS deixou de ser "em breve": é um módulo de Pesquisas completo, com disparo automático pós-atendimento, mais de 9.600 envios acumulados, um mecanismo de interceptação que responde sem reabrir o card (ponto raro no mercado, segundo a própria spec do módulo), sentimento sobre o comentário livre, integração com yaFlows e relatório cortado por agente, canal e IA×humano. É uma vantagem concreta e comprovada em dado real — o material de marketing pode (e deve) usar sem hedge, com o cuidado de não prometer taxa de falha zero (há uma fatia relevante de envios com falha a investigar).

Prompt Lab e Coaching também saem desta varredura mais fortes do que a leitura anterior sugeria: não são telas soltas — reaproveitam dado real de versionamento de agente e já têm 513 registros de feedback de qualidade gravados em produção.

Ao mesmo tempo, dois pontos seguem merecendo cautela em qualquer material que trate o suporte do yapt. como "completo": o yaLearner — a promessa mais ambiciosa do conjunto, a base que se atualiza sozinha a partir das próprias conversas — tem a primeira etapa (detecção de lacuna) rodando de verdade e em volume alto e crescente (mais de 215 mil sinais), mas a etapa que fecha o ciclo (agrupar e gerar rascunho de artigo) está hoje quebrada em produção por um erro de configuração no cron, não por limitação de arquitetura — os dois rascunhos já gerados no passado provam que o desenho funciona, mas a esteira está parada até o bug ser corrigido. E o follow-up aplicado a suporte segue como capacidade pronta no motor, mas ainda sem nenhum cliente usando — vale tratar como algo a oferecer, não como algo já provado em campo.

Divergências com o material de marketing
  • CSAT/NPS "só manual" ou "em breve": a premissa recebida para esta varredura era de que a pesquisa de satisfação era um formulário manual ou um placeholder da interface, sem disparo automático. O código e o banco mostram o contrário, e de forma ainda mais robusta do que a rodada anterior já havia identificado: existe um módulo de Pesquisas completo, com disparo automático (trigger_on_finalize), interceptação de resposta sem reabrir o card, análise de sentimento do comentário, integração com yaFlows e relatório dedicado — mais de 9.600 envios acumulados em produção. Qualquer material que descreva a pesquisa como "manual" ou "em breve" deve ser corrigido.
  • yaLearner como "base que se atualiza sozinha": se algum material de marketing já afirma isso como funcionalidade entregue de ponta a ponta, é uma afirmação a rever — e o veredicto ficou mais preciso nesta varredura: a captação de sinal é real e em volume alto (215.803 sinais), mas o fechamento do ciclo (cluster → rascunho de artigo) está atualmente quebrado em produção, com os dois crons responsáveis falhando todos os dias por um erro de configuração (app.settings.service_url ausente), confirmado no log de execução até 31/07/2026. Não é uma funcionalidade "não construída" — é uma funcionalidade construída, já usada no passado (2 rascunhos gerados), e parada por um bug corrigível.
  • Sessão de procedimento passo a passo em produção: documentação de projeto interna (PLAN-YABRAIN-V1.md) afirma que a execução de procedimento em conversa está "implementada e em produção"; a tabela correspondente (procedure_sessions) segue com zero registros no banco de produção, confirmado nesta varredura. Tratar como capacidade parcial, não confirmada em uso real, até nova verificação.
  • Prompt Lab e Coaching como "telas sem profundidade confirmada": a rodada anterior não conseguia confirmar a profundidade real do backend dessas duas telas (varredura feita sobre checkout desatualizado). No origin/main, ambas se confirmam como funcionalidades reais: o Prompt Lab reaproveita o histórico real de versionamento de agente, e o Coaching já tem 513 registros de feedback gravados em produção. Qualquer material que tratasse essas telas como "não confirmadas" pode passar a tratá-las como entregues.

> Última varredura: 31/07/2026 (origin/main)

07

Automação e Expansão

Réguas, fluxos e a base que volta a comprar.

yaFollowUp Engine

Em produção

motor multi-tenant que detecta conversas e contatos que pararam de responder e retoma o contato sozinho, seguindo uma régua configurável — e que agora também sabe desistir sozinho assim que o motivo de continuar deixa de existir.

Como funciona

roda em dois processos separados por cron. O detector (yafollowup-engine, a cada 2 minutos) varre as réguas ativas por tenant, chama get_idle_conversations para achar conversas paradas e agenda o passo 1. O disparador (yafollowup-sender, a cada 1 minuto) reivindica execuções agendadas (FOR UPDATE SKIP LOCKED, sem risco de dois ciclos disparando a mesma), gera a mensagem, envia e agenda o próximo passo.

Detecção de inatividade: o relógio de inatividade agora é resetado tanto por mensagem do cliente quanto por mensagem manual de um atendente humano (direction = 'outbound' AND sender_type = 'user') — antes só contava a última mensagem do cliente, o que fazia a régua disparar em cima de uma conversa que um humano acabara de responder. O filtro pode ser restrito por setor, canal (WhatsApp, Instagram ou Messenger — ver "Multi-canal" abaixo), funil, estágio do pipeline, se a conversa está com IA/humano/ambos, e por tags do contato (incluir ou excluir).

Sequência e prioridade: cada régua tem uma sequência de passos com atraso próprio (delay_minutes) e modo de mensagem — fixa, sorteio entre variações, template aprovado de WhatsApp (janela de 24h fechada) ou instrução para a IA gerar o texto lendo o histórico real. Quando duas ou mais réguas ativas poderiam capturar a mesma conversa no mesmo ciclo, vale prioridade explícita (slider 1-10 configurável por régua, editor FollowUpPriorityField) e, em empate, a régua mais específica (com filtro de estágio) vence; a conversa fica "reivindicada" pela régua de prioridade mais alta no ciclo mesmo que essa régua não chegue a agendar (por rate limit ou cooldown), então uma régua de prioridade menor não pega a sobra.

Travas antes do disparo: limite de envios por contato/mês (padrão 5, configurável de 1 a 30) e horário de silêncio — ver seção dedicada abaixo. No instante do disparo há um novo gate consolidado (should_send_followup, chamado antes de qualquer geração de mensagem) que revalida: conversa ainda aberta, conversa não "adiada" (snooze), régua ainda ativa, o responsável atual (IA/humano) ainda bate com o filtro da régua, e — quando o tenant tem tabela de consentimento — o contato não optou por sair. Qualquer falha nesse gate é tratada como decisão definitiva (cancela); erro de rede/banco é tratado como transitório (tenta de novo, nunca cancela por instabilidade).

Cancelamento automático — não é só supressão pontual. Existe uma camada de 4 gatilhos independentes no banco que cancelam TODOS os passos futuros ainda agendados de uma régua, não apenas o disparo do instante:

1. Cliente responde (trigger em messages, qualquer mensagem inbound do contato) — cancela tudo que estava scheduled/retry para aquela conversa, e ainda marca as execuções já enviadas como "respondida", registrando a latência da resposta.

2. Negócio é ganho ou perdido (trigger em deals.stage_id) — cancela a régua daquele deal, condicionado ao toggle stop_conditions.on_deal_won (ligado por padrão).

3. Conversa é transferida (trigger em conversations.inbox_id) — cancela, condicionado a stop_conditions.on_transfer (ligado por padrão).

4. Um passo falha (cascata) — se um passo intermediário falha definitivamente, os passos seguintes da mesma régua/conversa são cancelados em vez de continuar tentando uma sequência quebrada.

Além disso, no instante exato do disparo ainda existe a checagem pontual: se a resposta chegou entre o agendamento e o envio efetivo, o envio é suprimido e registrado como "suprimido — lead respondeu durante o disparo".

Réguas com filtro de pipeline/estágio também têm uma trava própria: se o negócio muda de estágio, muda de funil, é fechado ou é apagado, a sequência para (o cancelamento por deal won/lost acima cobre só ganho/perdido; este cobre qualquer saída do escopo configurado).

O ciclo da régua só reabre depois que a conversa é marcada como resolvida; sem essa resolução, o mesmo ciclo não reaciona a régua. Ao final da sequência sem resposta, a régua pode executar uma ação com atraso configurável (padrão 24h): nada, encerrar a conversa (pelo caminho oficial de encerramento, com motivo registrado), marcar deal como perdido (só em vendas), tag "frio" ou transferir para uma fila/operador específico (com cooldown próprio para não repetir a transferência).

Falhas e novas tentativas: execuções que falham (erro transiente, LLM incompleto, canal indisponível) entram em retentativa com backoff (1min, 5min, 15min) até 3 tentativas antes de ir para "falhou" definitivamente, e cada tentativa fica registrada. Um checador de saúde roda a cada ciclo do detector e alerta a equipe internamente quando a taxa de terminações anormais (falha, canal não entregável, template só-WhatsApp) de um canal passa de 20 casos e mais de 50% do volume na última hora — pensado para nunca mais deixar um travamento de régua passar despercebido por dias.

Multi-canal: a régua não é mais exclusiva de WhatsApp. O escopo de canais é configurável na tela (WhatsApp, Instagram, Messenger — pelo menos um precisa ficar marcado) e o disparo resolve o destino certo (WhatsApp via telefone, Instagram via ID do Instagram, Messenger via PSID) e o identificador correto do contato para cada canal. Quando a régua inclui um canal sem janela de 24h/template (Instagram, Messenger), a tela avisa se algum passo da sequência ultrapassa a janela de resposta gratuita.

Resolve

lead ou cliente parado de responder e ninguém no time vai lembrar de retomar na hora certa, todo dia, para cada conversa — e, tão importante quanto, parar de incomodar quem já respondeu, já fechou negócio ou já foi transferido para atendimento humano.

Por que importa

é a diferença entre lead esfriar e lead ser retomado no momento certo, com o contexto certo, sem depender de disciplina humana — e sem o risco reputacional de continuar mandando mensagem para quem já resolveu o assunto.

Como falar disso

"O yapt. sente quando um lead parou de responder e volta a falar com ele sozinho, no tom certo, sem deixar esfriar." / "No instante em que o cliente responde, todos os passos futuros da régua são cancelados sozinhos — o yapt. não continua insistindo com quem já voltou a falar." / "A régua desiste na hora certa: se o negócio fecha, se a conversa é transferida ou se o cliente responde, ela para — sem intervenção manual."

Horário de silêncio (quiet hours) — divergência anterior corrigida

Em produção

a versão anterior deste mapa apontava uma inconsistência entre a tela (texto fixo "20h às 7h") e o padrão real do motor (21h às 8h). No main atual essa divergência não existe mais — a tela deixou de mostrar um texto solto e passou a ler e gravar o valor real do tenant, através das RPCs get_tenant_quiet_hours/set_tenant_quiet_hours (guardadas por permissão do tenant sendo editado, não do tenant padrão do perfil — a mesma armadilha de RLS já documentada em outro domínio foi evitada aqui de propósito). O padrão de fábrica, quando o tenant nunca configurou nada, é 21h-8h tanto na tela quanto no motor — os dois lados citam explicitamente no código que precisam ficar sincronizados se algum dia mudar. Horário é sempre hora cheia (0-23), configurável por tenant, não por régua individual — a régua só liga/desliga o respeito ao silêncio do tenant.

Como funciona

quando uma régua respeita o silêncio e o horário calculado do próximo passo cai dentro da janela, a execução não é descartada — é reagendada para o instante em que o silêncio abre (mais um espalhamento aleatório de até 15 minutos, para não sincronizar todas as execuções represadas no mesmo segundo). Isso vale tanto para o passo 1 (checado pelo detector) quanto para os passos seguintes (checado pelo disparador antes de gerar/enviar cada passo) — a régua não perde o passo por ele ter caído na madrugada.

Resolve

Por que importa

Flow Builder (yaFlows)

Em produção

editor visual de automações que executam ações e decisões dentro de uma jornada de conversa — muito além de follow-up, cobre qualquer sequência de passos automatizada.

Como funciona

editor com dezenas de tipos de nó disponíveis no código (mensagem, template, espera, espera por resposta, condição/branch, IA, tag, webhook, saída, inscrever/remover de outro fluxo, ação de CRM, WhatsApp Flow, botões e listas interativas, e-mail, notificação, Instagram, envio de pesquisa, espera por evento, agendar em data, espera por horário comercial, switch, teste A/B, decisão por IA, checagem de meta, conectar/desconectar IA, qualificar por IA, enriquecer por IA, zona de cobertura de IA, atualizar contato, criar atividade, mover estágio de deal, requisição HTTP, gatilho Zapier, ir para nó, sub-fluxo, execução paralela) — a paleta simplificada oferecida ao usuário no momento de montar o fluxo é um subconjunto mais enxuto desses. Os gatilhos confirmados são: conversa aberta (primeira mensagem sem conversa ativa), mensagem recebida (qualquer inbound) e correspondência de palavra-chave (com modo "qualquer" ou "exato"). Cada fluxo tem um modo de reentrada configurável — nunca mais, uma vez por conversa, com cooldown (em horas) ou sempre — e pode ser configurado para pausar automaticamente quando um humano assume a conversa. Existe uma tela de dry run para simular a execução do fluxo antes de ativá-lo. Handoff para humano é modelado como saída de nó dedicada (tipo ai_handoff), com condições configuráveis de quando disparar a passagem.

Resolve

montar uma jornada automatizada de várias etapas sem depender de desenvolvimento, e testá-la antes de ligar para clientes reais.

Por que importa

reduz o trabalho manual repetitivo de qualquer sequência de contato — não só follow-up de lead frio, mas onboarding, campanhas de produto, jornadas pós-compra.

Como falar disso

"Monta a jornada visualmente, testa sem enviar nada de verdade, e só depois liga para os contatos reais." / "O fluxo sabe quando parar: se um humano assume a conversa, a automação pausa sozinha."

Automation Trigger Engine

Em produção

motor que decide, para cada mensagem que chega, se ela deve acionar algum fluxo automatizado — construído para processar alto volume sem sobrecarregar o sistema.

Como funciona

arquitetura em 3 camadas, toda a lógica de correspondência de gatilho roda dentro do banco (sem função externa no caminho crítico). Na chegada da mensagem, uma função no banco decide em menos de 1 milissegundo: se a mensagem veio da própria automação, ignora; se o contato está numa etapa "esperando resposta" de um fluxo, absorve a mensagem ali e não deixa disparar outro gatilho; se a conversa está com atendimento humano, não aciona automação; só então, se nada bateu, registra a mensagem numa fila leve para processamento em lote a cada 5 a 10 segundos. Esse processamento em lote casa a mensagem com o gatilho certo por ordem de prioridade (palavra-chave > conversa aberta > mensagem recebida), aplicando trava de inscrição única (o contato não entra duas vezes no mesmo fluxo sem querer), cooldown e limite de reentradas por período. Gatilhos suportados: conversa aberta, mensagem recebida, palavra-chave, resposta a botão de template, lead vindo de anúncio Meta, evento de integração (yapt. Connect), contato criado, mudança de estágio de deal, tag adicionada a contato.

Resolve

disparar automação certa, no momento certo, sem duplicar envio e sem brigar com o atendimento humano em andamento.

Por que importa

é a fundação técnica que permite ligar automação em qualquer volume de mensagens sem degradar a experiência nem gerar automação duplicada/fora de hora.

Como falar disso

"A automação sabe a hora de ficar quieta: se um humano está atendendo, ela não entra no meio." / "Cada contato entra uma vez no fluxo certo — sem duplicar disparo, sem reiniciar do zero à toa."

AI Coverage Zones em fluxo

Em produção

trecho de um fluxo onde a IA assume a conversa com um objetivo específico, dentro de regras de saída definidas — não é a IA geral do agente, é uma cobertura delimitada dentro da jornada.

Como funciona

um nó de zona de cobertura de IA pode ser inserido em qualquer ponto do fluxo, com saídas mapeadas para sucesso, tempo esgotado, resultado negativo ou passagem para humano — cada uma dessas saídas direciona o contato para um próximo passo diferente do fluxo.

Resolve

deixar a IA conduzir um pedaço específico da conversa (por exemplo, qualificar ou tirar uma dúvida) sem perder o controle de para onde o contato vai depois, dependendo do resultado.

Por que importa

combina automação estruturada com IA generativa no mesmo fluxo, sem abrir mão de previsibilidade sobre o desfecho.

Como falar disso

"Você desenha até onde a IA cobre sozinha e o que acontece em cada desfecho — sucesso, silêncio, recusa ou passagem para humano."

Window Guardian

Em produção

vigia automático da janela de 24 horas do WhatsApp, que avisa o contato antes dela fechar para não perder a chance de resposta gratuita.

Como funciona

monitora conversas com janela prestes a expirar e envia (ou sugere, dependendo da configuração) um lembrete ("nudge") antes do fechamento. Tem 4 níveis de proteção, cada um definindo com quantas horas de antecedência agir antes da janela fechar: conservador (2h), equilibrado (4h, padrão), agressivo (6h) e ultra (8h). O tipo de mensagem do lembrete segue a mesma lógica do yaFollowUp: template fixo, gerado por IA a partir do contexto, ou lista de variações. O modo de envio pode ser automático ou exigir aprovação humana antes de sair (padrão: exige aprovação). Respeita horário de silêncio do tenant (padrão próprio deste motor: 20h-7h) e tem lógica de antecipação: se a janela vai expirar durante o período de silêncio, o sistema antecipa o aviso para antes do silêncio começar, em vez de deixar a janela fechar sem aviso.

Resolve

perder a chance de responder um cliente porque a janela gratuita de 24h do WhatsApp fechou sem ninguém perceber.

Por que importa

evita reabrir conversa via template pago (ou pior, perder o contato) só por falta de aviso a tempo.

Como falar disso

"O yapt. avisa antes da janela de resposta fechar — e antecipa o aviso se o fechamento cair durante a madrugada."

Commerce Intelligence no Contato 360

Em produção

painel dentro da ficha do contato que consolida histórico de compras, pagamentos e assinaturas, calculado a partir dos eventos comerciais do contato.

Como funciona

uma função no banco recalcula, por contato, um resumo comercial completo a partir da tabela de eventos de compra: LTV (soma de tudo que já foi comprado), total de compras, reembolsos e chargebacks, receita líquida (compras menos reembolsos e chargebacks), ticket médio e ticket máximo, velocidade de compra (média de dias entre uma compra e outra, só calculada a partir da segunda compra), método de pagamento preferido e detalhamento por método (pix, cartão de crédito, boleto, débito), boletos gerados e não pagos, média de parcelas, assinaturas ativas e canceladas com status geral de assinatura (ativo/cancelado/nenhum), MRR corrente (soma do valor mais recente de cada assinatura ativa), produtos comprados e plataformas de origem. O risco de churn exibido na tela é uma regra simples calculada na tela, não um score estatístico: chargeback registrado ou assinatura cancelada = risco alto; mais de um reembolso = risco médio; um reembolso com mais de 3 compras = risco baixo. Esses mesmos dados (LTV, total de compras, ticket médio, última compra, método preferido, produtos) também alimentam o contexto que a IA lê ao conversar com o contato, então o agente de IA "sabe" o histórico de compra na hora de atender.

Resolve

atender ou vender para um contato sem saber quanto ele já comprou, se tem reembolso recente, ou se a assinatura dele está ativa.

Por que importa

transforma cada conversa em uma decisão informada — de reter, de fazer upsell ou de tratar com cuidado um cliente com sinal de risco.

Como falar disso

"A IA já sabe, antes de responder, quanto aquele contato já comprou, se tem alguma assinatura ativa e se há sinal de risco." / "O histórico de compra do cliente aparece na ficha e alimenta a própria IA na hora de conversar."

Eventos de compra no contexto da IA

Em produção

injeção do resumo comercial do contato no contexto que a IA usa para responder, sem passar pela timeline geral de eventos da conversa.

Como funciona

o resumo comercial (LTV, total de compras, ticket médio, última compra, método de pagamento preferido, produtos e quantidade) é incluído no contexto rápido da conversa que alimenta o modelo de IA. Isso é distinto da timeline visual do contato — compras não aparecem hoje como eventos na timeline geral do contato, aparecem exclusivamente na aba comercial dedicada.

Resolve

a IA responder um cliente que já é comprador como se fosse um desconhecido.

Por que importa

conversa mais relevante e mais rápida, sem o atendente (humano ou IA) precisar ir buscar o histórico em outro lugar.

Como falar disso

"A IA entra na conversa já sabendo o histórico de compra do contato."

Lifecycle automático do contato

Parcial

classificação do contato por estágio de relacionamento — de assinante de lista até cliente ou cliente perdido — com histórico registrado a cada mudança.

Como funciona

o contato passa por estágios definidos (assinante, lead, desqualificado, MQL, SAL, SQL, oportunidade, cliente, perdido). Quando um estágio muda diretamente (por exemplo, de lead para cliente, pulando etapas intermediárias), o sistema registra automaticamente no histórico as etapas intermediárias que teoricamente foram percorridas, mantendo o rastro completo sem exigir que cada etapa seja marcada manualmente uma a uma.

Resolve

não saber em que ponto da jornada cada contato está, e perder o histórico de como ele chegou até ali.

Por que importa

dá base para segmentar, medir conversão por etapa e decidir quem entra em qual régua de automação.

Como falar disso

"Cada contato carrega o estágio da relação com a empresa, e o histórico de como chegou lá fica registrado sozinho."

Metas por carteira

Em produção

definição de metas para uma carteira (portfólio) de contatos, com período e métrica configuráveis.

Como funciona

cada carteira pode ter metas definidas por métrica — receita, deals ganhos, conversas resolvidas, tempo médio de resposta, contatos engajados, taxa de conversão, MRR ou NPS — com período semanal, mensal, trimestral ou anual.

Resolve

gestor de carteira sem visibilidade clara do que precisa bater, ou de como a carteira está performando frente à meta.

Por que importa

dá ao gestor de carteira (e ao operador) um alvo claro e mensurável, ligado diretamente aos dados que o yapt. já processa.

Como falar disso

"Cada carteira tem meta própria — receita, conversão, tempo de resposta — e o yapt. mede sozinho contra os dados reais da operação."

Respostas Rápidas (Quick Replies / Macros)

Em produção

biblioteca de mensagens prontas que o operador humano insere na conversa com um clique, organizadas em grupos e favoritos.

Como funciona

o operador cadastra mensagens reutilizáveis, agrupadas em pastas, com busca e marcação de favoritos, e pode importar várias de uma vez em lote em vez de cadastrar uma a uma.

Resolve

operador reescrever a mesma resposta repetidamente para perguntas frequentes.

Por que importa

ganho de produtividade direto no atendimento humano, reduzindo tempo de resposta sem depender de IA para toda interação.

Como falar disso

"Resposta pronta em um clique, organizada por grupo e favoritos — sem digitar a mesma coisa duas vezes."

Integrações e webhooks que sustentam automação

Em produção

conjunto de conectores que alimentam o motor de automação e a Commerce Intelligence com eventos de fora do yapt. — compra, pagamento, catálogo.

Como funciona

um webhook genérico de integração ("yapt. Connect") identifica automaticamente a plataforma de origem pelo cabeçalho da requisição ou pelo formato do corpo — reconhece Shopify, Bling, Hotmart e Kiwify sem configuração manual de cada evento. Um sincronizador de pedidos multi-plataforma, construído em padrão de adaptador, atende hoje Nuvemshop e Shopify de forma oficial, com execução incremental agendada em lote. Funções complementares tratam catálogo de produtos, reconciliação de dados comerciais e indexação de conhecimento comercial para uso da IA.

Resolve

ter que integrar manualmente cada plataforma de e-commerce/pagamento para que a automação e a IA saibam o que o cliente comprou.

Por que importa

é o que torna possível que a IA e as réguas de automação enxerguem compra, reembolso e assinatura sem trabalho manual de integração por cliente.

Como falar disso

"O yapt. já reconhece Shopify, Nuvemshop, Hotmart, Kiwify e Bling automaticamente — a IA sabe o que o cliente comprou sem integração manual caso a caso."

Divergências com o material de marketing
  • Número de tipos de nó do Flow Builder: documentação interna cita "13 tipos de nó" no editor visual. No main atual existem 40 arquivos de nó implementados no código (mensagem, template, espera, espera por resposta, condição, IA, tag, webhook, saída, inscrição/remoção, ação de CRM, WhatsApp Flow, botões e listas interativas, e-mail, notificação, Instagram, envio de pesquisa, espera por evento, agendamento, horário comercial, switch, teste A/B, decisão por IA, checagem de meta, conectar/desconectar IA, qualificar/enriquecer por IA, zona de cobertura de IA, atualizar contato, criar atividade, mover estágio de deal, requisição HTTP, gatilho Zapier, ir para nó, sub-fluxo, execução paralela). O número "13" segue desatualizado frente ao código — recomenda-se não usar essa contagem específica em material público sem confirmar com o time de produto qual é o conjunto oficialmente suportado na paleta do usuário final (que é mais enxuta que o total de nós existentes no código).
  • Horário de silêncio (quiet hours) do yaFollowUp — RESOLVIDA nesta varredura: a divergência anterior (tela mostrando "20h às 7h" fixo enquanto o motor usava 21h-8h) não existe mais no main. A tela hoje lê e grava o valor real do tenant via RPC, com o mesmo padrão de fábrica (21h-8h) documentado nos dois lados do código como precisando ficar sincronizado. O Window Guardian continua com padrão próprio (20h-7h) — são motores diferentes por desenho, não uma inconsistência a corrigir.
  • Segmentação de campanha de reativação por comportamento de compra: re-confirmado nesta varredura — não há, no motor de campanhas outbound (src/types/campaign.ts, lista FILTER_ENTITY_FIELDS do Segment Builder), nenhum campo de LTV, histórico de compras ou dado de Commerce Intelligence como critério de segmentação de primeira classe. Os campos disponíveis hoje são de contato (nome, email, telefone, estágio, lead score, datas, opt-out), deal, tag, histórico de campanha anterior, origem do contato, dados da conversa e UTM de anúncio. A infraestrutura de dados comerciais existe e é rica (ver Commerce Intelligence), mas o elo direto "criar campanha de reativação filtrando por quem não compra há X dias ou por faixa de LTV" continua não existindo no campaign builder. Não anunciar essa combinação como pronta.
  • Cancelamento automático de passos futuros de follow-up ao receber resposta — RESOLVIDA nesta varredura, resposta é SIM: a varredura anterior deixava essa pergunta em aberto ("não confirmado nem descartado"). Confirmado agora no código: existe um trigger em messages (trg_cancel_followups_on_reply) que roda a cada mensagem inbound do contato e cancela todos os passos ainda scheduled/retry daquela conversa — não é só a supressão pontual no instante do disparo. Essa mesma camada de "parar quando..." também cancela a régua inteira quando o negócio é ganho/perdido, quando a conversa é transferida manualmente ou quando um passo intermediário falha em cascata — cada uma dessas 4 condições é configurável por régua na aba "Configurações" do editor (stop_conditions). Pode ser anunciado publicamente: "a régua para sozinha quando o motivo de continuar deixa de existir."
  • Lifecycle automático "roda sozinho": re-confirmado nesta varredura — o registro em cascata do histórico de estágios é automático, mas a mudança de estágio em si continua sendo disparada por ação humana ou por ferramenta de IA durante o atendimento. Não há gatilho autônomo (por tempo de inatividade, por exemplo) que mova o contato de estágio sozinho. Evitar a frase "o yapt. move o cliente de estágio sozinho" sem qualificar que isso acontece durante ou como resultado do atendimento.

> Última varredura: 31/07/2026 (origin/main)

08

Plataforma e Integrações

O alicerce: canais, integrações e governança.

Isolamento multi-tenant

Em produção

cada cliente do yapt. enxerga só os próprios dados, mesmo compartilhando a mesma infraestrutura de banco com todos os outros.

Como funciona

toda tabela do banco carrega uma coluna tenant_id e uma política de Row Level Security que resolve o tenant do usuário autenticado antes de liberar qualquer leitura ou escrita — não é um filtro aplicado na tela, é uma trava no próprio banco, que vale mesmo se alguém tentar consultar por fora da aplicação. A plataforma tem centenas de tabelas e centenas de políticas RLS ativas, cobrindo do histórico de conversa ao billing. Tenants podem ter hierarquia (parent_tenant_id), o que permite um parceiro enxergar os clientes que administra sem misturar dados entre eles.

Resolve

o medo de TI de "meus dados de conversa e cliente ficarem visíveis ou vazarem para outra empresa" numa plataforma que atende múltiplos clientes na mesma infraestrutura.

Por que importa

isolamento no nível do banco é mais difícil de furar por erro de código do que isolamento feito só na aplicação — reduz a superfície de um vazamento acidental entre clientes.

Como falar disso

"Seus dados de conversa e cliente ficam isolados no nível do banco, não só na tela — nenhuma consulta escapa do seu tenant, mesmo por engano."

BSP Meta oficial

Em produção

o yapt. roda sobre uma parceria oficial com a Meta como Business Solution Provider — não é um cliente comum da API do WhatsApp, é quem provisiona o acesso.

Como funciona

a conexão do número de WhatsApp do cliente é provisionada pela edge function de provisionamento de BSP, que recebe e armazena diretamente da Meta o quality_rating (classificação de qualidade do número) e o messaging_limit_tier (teto de mensagens que aquele número pode enviar em 24h) — esses dados não são digitados manualmente, vêm da própria Meta e ficam disponíveis para a operação acompanhar. A sincronização de templates de mensagem também roda por conta própria (sincronização e status de aprovação).

Resolve

empresa que depende de terceiro para conseguir número verificado, template aprovado ou entender por que a "qualidade" do número caiu — com BSP próprio, esse ciclo fica dentro da mesma plataforma que já usa no dia a dia.

Por que importa

ser BSP oficial é o que permite números verificados, templates aprovados pela Meta e visibilidade real de tier/qualidade — sem isso, a empresa depende de um intermediário a mais para qualquer mudança de número ou template.

Como falar disso

"O yapt. não terceiriza sua conexão com o WhatsApp — somos parceiros oficiais da Meta, então número, template e qualidade do canal são geridos direto na mesma plataforma."

yapt. Connect — API e webhooks para integração

Em produção

a porta de entrada e saída de dados entre o yapt. e os sistemas que o cliente já usa (ERP, CRM próprio, e-commerce, ferramenta interna).

Como funciona

dois caminhos. Um, API pública de leitura autenticada por chave, que expõe contatos, conversas, negócios, mensagens, eventos e atribuição de campanha em formato paginado. Outro, o yapt. Connect propriamente dito: webhooks de entrada e saída com uma camada de mapeamento de campos configurável por evento — a plataforma resolve o mapeamento em cadeia (regra específica do evento → configuração da ação → padrão), com retentativa automática com backoff, log de cada chamada e limite de taxa. Sobre essa base, existe um catálogo de integrações prontas que já passa de dez plataformas de e-commerce, pagamento e gestão (a exemplo de Shopify, Nuvem Shop, WooCommerce, Bling e plataformas de venda de infoproduto), cada uma já configurada com ações padrão como criar contato ou criar negócio.

Resolve

TI que precisa "conversar" o WhatsApp com o sistema que a empresa já usa sem contratar um desenvolvedor para escrever um conector do zero para cada plataforma.

Por que importa

integração pronta encurta o tempo de implantação de semanas de desenvolvimento sob medida para configuração; e quando não existe integração pronta, o webhook com mapeamento configurável evita depender de código customizado.

Como falar disso

"O yapt. já fala com o Shopify, a Nuvem Shop, o Bling e outras ferramentas que sua empresa já usa — e quando não tem integração pronta, o Connect mapeia os campos sem precisar programar."

Integrações de e-commerce

Em produção

sincronização de catálogo, pedido e estoque entre o yapt. e a loja online do cliente.

Como funciona

funções dedicadas cuidam do feed de catálogo (commerce-catalog-feed, commerce-catalog-sync), da sincronização de pedidos (commerce-order-sync) e da reconciliação de dados entre as duas pontas (commerce-reconciliation), com conectores específicos para Shopify e Nuvem Shop já publicados.

Resolve

vendedor que atende pelo WhatsApp mas precisa checar em outra tela se o produto está em estoque ou qual o status do pedido.

Por que importa

catálogo e pedido sincronizados dentro da conversa evitam que o vendedor prometa algo que não existe em estoque, ou perca tempo indo e voltando entre sistemas.

Como falar disso

"Seu catálogo e seus pedidos ficam sincronizados com a conversa — o vendedor não sai do WhatsApp pra checar estoque."

Pesquisas via WhatsApp Flows

Em produção

pesquisa de satisfação (CSAT/NPS) e formulários interativos entregues como tela nativa dentro do próprio WhatsApp, usando o recurso oficial de Flows da Meta.

Como funciona

o gerenciador de Flows da plataforma classifica automaticamente um template como pesquisa quando a categoria declarada é de satisfação, e a galeria de templates já entrega modelos prontos de pesquisa de satisfação, de NPS e de pesquisa de onboarding para o cliente publicar sem montar do zero.

Resolve

pesquisa de satisfação por link externo tem taxa de resposta baixa — o cliente final não quer sair do WhatsApp para responder em outra tela.

Por que importa

pesquisa respondida dentro da própria conversa tende a converter mais do que link externo, e o resultado já cai automaticamente vinculado ao histórico daquele contato.

Como falar disso

"A pesquisa de satisfação acontece dentro do próprio WhatsApp — o cliente responde sem sair da conversa, e o resultado já entra no histórico dele."

Papéis e permissões granulares

Em produção

controle fino de quem, dentro da equipe do cliente, pode ver e fazer o quê — não é um interruptor de "admin ou não admin".

Como funciona

além dos papéis básicos (dono, administrador, agente, membro), a plataforma tem perfis operacionais customizáveis por tenant, com cerca de setenta permissões booleanas independentes — coisas como ver todas as conversas, supervisionar, treinar a IA ou gerenciar cobrança podem ser ligadas ou desligadas uma a uma por perfil. Cada tenant pode clonar um perfil padrão do sistema e ajustar as permissões para a própria estrutura de equipe, em vez de ficar preso a um papel genérico.

Resolve

empresa que tem funções internas específicas (supervisor que só acompanha, agente que só atende, gestor que só vê relatório) e não quer dar acesso total só porque não existe um papel sob medida.

Por que importa

permissão granular reduz o risco de dado sensível (custo, configuração de IA, cobrança) ficar visível para quem só precisa atender conversa.

Como falar disso

"Cada papel na sua equipe vê só o que precisa ver — supervisor, vendedor, gestor de cobrança, cada um com o próprio recorte, sem dar acesso total por padrão."

Partner Hub e acesso administrativo da New Way

Em produção

camada de acesso que permite ao time da New Way (e a parceiros que revendem o yapt.) administrar e dar suporte aos tenants de cliente sem sair da plataforma.

Como funciona

existe uma função de verificação que reconhece a equipe da própria plataforma e libera acesso administrativo aos tenants; parceiros com tenants-filho herdam acesso aos clientes que administram através da mesma hierarquia usada no isolamento multi-tenant. A interface dedicada de parceiro reúne painel, lista de clientes, detalhe de cada cliente, gestão de equipe e configurações — tudo dentro da mesma aplicação, sem precisar de acesso direto ao banco.

Resolve

suporte e onboarding que hoje dependeriam de acesso técnico ao banco de dados para investigar um problema ou configurar algo no ambiente do cliente.

Por que importa

acesso administrativo mediado pela própria aplicação (em vez de acesso direto a infraestrutura) deixa rastro de quem fez o quê e reduz o risco de mudança feita por engano em produção.

Como falar disso

"O suporte da New Way acompanha e configura sua conta dentro da própria plataforma — sem precisar de acesso técnico ao seu banco de dados."

Configuração por setor e roteamento

Em produção

cada área da empresa (comercial, suporte, cobrança etc.) opera com as próprias regras de fila, SLA e distribuição de conversa, dentro do mesmo tenant.

Como funciona

setores são configurados com fila FIFO ou round-robin, capacidade por operador, distribuição por habilidade e um motor de regras condicionais que decide para onde a conversa vai, processado por funções dedicadas de roteamento e automação.

Resolve

empresa com times diferentes atendendo pelo mesmo número de WhatsApp, cada um com prioridade e capacidade diferentes, sem uma forma de segmentar isso automaticamente.

Por que importa

roteamento automático por setor evita que uma conversa de suporte urgente espere atrás de uma fila comercial, ou que um operador sobrecarregado continue recebendo conversa nova.

Como falar disso

"Cada setor da sua empresa tem a própria fila e a própria regra de distribuição — a conversa certa chega no time certo, sem triagem manual."

Controle de funcionalidades por plano (entitlements)

Em produção

o mecanismo que decide, para cada tenant, quais funcionalidades e módulos estão liberados — de acordo com o plano contratado e com exceções pontuais.

Como funciona

cada funcionalidade é um item cadastrado que pode ser vinculado a um plano, a um complemento avulso (addon) contratado à parte, ou receber uma liberação/bloqueio específico para um único tenant, independente do plano — com log de auditoria de cada mudança de liberação.

Resolve

negociação comercial que precisa liberar uma funcionalidade específica para um cliente sem mudar o plano dele inteiro, ou testar um módulo novo com um cliente antes de colocar no catálogo geral.

Por que importa

dá ao comercial flexibilidade para negociar por funcionalidade, não só por pacote fechado, sem depender de mudança de código para cada exceção.

Como falar disso

"Seu plano define o que vem de série, mas dá pra ligar ou desligar funcionalidades específicas para um cliente, sem trocar o plano inteiro dele."

Planos e catálogo de preços

Em produção

a estrutura comercial que define o que cada plano do yapt. inclui e quanto custa.

Como funciona

os planos vivem em uma tabela dedicada de billing, montados por um construtor de planos interno de várias etapas usado pela equipe da New Way; o tenant enxerga o próprio plano e cobrança na área de configurações de billing.

Resolve

cliente que precisa entender claramente o que está pagando e o que muda se subir ou trocar de plano, sem depender de planilha paralela.

Por que importa

catálogo estruturado no próprio produto (em vez de contrato solto) permite consistência de preço e cobrança auditável.

Como falar disso

"Seu plano e o que ele inclui ficam visíveis dentro da própria plataforma — sem letra miúda em planilha à parte."

Metrificação de custo (mensagem e IA)

Em produção

rastreamento granular de quanto cada conversa custa — tanto o custo de mensagem cobrado pela Meta quanto o custo do uso de inteligência artificial.

Como funciona

cada evento de uso relevante (mensagem de IA, envio de template, execução de Flow, uso de skill, proposta gerada, enriquecimento de dado) é registrado num módulo de metrificação compartilhado, de forma assíncrona, sem atrasar a resposta ao cliente final. O custo de mensagem cobrado pela Meta é reconciliado contra o consumo real através de funções dedicadas de reconciliação. Esses eventos alimentam o cálculo de custo por tenant.

Resolve

empresa que usa IA em volume e não sabe quanto isso está custando até a fatura da Meta ou do provedor chegar — sem visibilidade de onde o custo está concentrado.

Por que importa

metrificação por evento (não só por fatura mensal) permite identificar onde o custo está subindo — em qual setor, qual tipo de mensagem, qual funcionalidade — antes que vire surpresa no fechamento.

Como falar disso

"Você enxerga o custo de cada conversa — mensagem e IA — antes da fatura fechar, não depois."

Cobrança integrada (cartão e faturado)

Em produção

o fechamento financeiro do consumo metrificado, com dois caminhos de cobrança conforme o perfil do cliente.

Como funciona

clientes no modelo de cartão são cobrados via integração de pagamento com checkout, portal de autoatendimento e webhook de confirmação; clientes no modelo faturado (boleto/nota fiscal) têm o fluxo automatizado ponta a ponta com o sistema de gestão financeira da New Way — a fatura gera a ordem de serviço, fatura a ordem e já sai com boleto e nota fiscal de serviço (NFS-e) emitidos automaticamente, com retentativa, baixa de pagamento e conciliação dedicadas. Existe também modalidade de cortesia, em que o uso é rastreado normalmente mas não gera cobrança.

Resolve

empresa que precisa de nota fiscal e boleto (não cartão) para fechar a compra dentro do próprio processo de compras.

Por que importa

dois modelos de cobrança dentro da mesma plataforma evitam que o formato de pagamento vire barreira de fechamento comercial.

Como falar disso

"Cobrança por cartão ou faturada com nota — o modelo de pagamento se adapta ao seu processo de compras, não o contrário."

Analytics e relatórios

Parcial

camada de análise de dados de conversa, campanha e operação, separada do banco transacional para não competir por desempenho com o atendimento ao vivo.

Como funciona

os dados de conversa são replicados para um banco analítico especializado (arquitetura orientada a colunas), com funções dedicadas de ingestão, backfill histórico e captura contínua de mudança de dado (CDC). Um recorte de dados analíticos também permanece no banco principal, organizado em modelo de fatos e dimensões (mensagens, contatos, agentes, canais, campanhas, tempo). Sobre essa base já existe uma família ampla de relatórios publicados — painel geral, disparos, escalonamento, pesquisas, uso de IA, follow-up, desempenho de agente, exportação de dado, campanhas, conversas, vendas e operação — cada um como tela própria dentro do produto.

Resolve

relatório que demora para carregar ou que compete por desempenho com o atendimento em horário de pico.

Por que importa

separar a camada analítica da camada transacional permite consultas históricas pesadas sem impactar a velocidade de resposta da conversa ao vivo.

Como falar disso

"Seus relatórios rodam numa camada separada da conversa ao vivo — analisar dado histórico não deixa o atendimento mais lento."

Auditoria e rastreabilidade

Em produção

registro de quem fez o quê, quando e com qual mudança, para toda ação relevante da plataforma.

Como funciona

um módulo de auditoria compartilhado grava, para conformidade, cada ação relevante com identificação de quem agiu, tipo de recurso afetado, o que mudou, endereço de origem e aplicativo usado — de forma assíncrona, sem atrasar a ação em si. Módulos específicos têm o próprio rastro dedicado: distribuição de conversa entre operadores e mudança de liberação de funcionalidade por tenant, por exemplo, cada um com a própria tabela de auditoria.

Resolve

disputa interna sobre "quem mudou essa configuração" ou "por que essa conversa foi parar com esse operador", sem um histórico confiável para consultar.

Por que importa

rastro de auditoria é o que sustenta uma investigação de incidente ou uma auditoria de conformidade sem depender de memória de quem estava de plantão naquele dia.

Como falar disso

"Toda ação relevante fica registrada — quem fez, quando e o que mudou. Se precisar investigar depois, o rastro está lá."

Arquitetura para escala

Em produção

o desenho técnico que permite ao yapt. sustentar 40M+ mensagens/mês sem depender de infraestrutura própria de fila e workers.

Como funciona

processamento roda sobre funções de borda (edge functions) acionadas por evento, com o próprio banco de dados funcionando como fila de trabalho — bloqueio seletivo de linha garante que cada tarefa seja pega por um único processo, sem duplicar trabalho. Automações disparadas por mensagem recebida rodam como gatilho dentro do próprio banco, com uma fila de retentativa processada em lote a cada poucos segundos por tarefas agendadas (cron interno do banco), desenhada para não travar o caminho de resposta em tempo real. Tabelas de alto volume (mensagens, eventos brutos, eventos de billing) são particionadas por período, com tempo de retenção definido e limpeza automática.

Resolve

medo de que a plataforma "engasgue" em pico de volume — campanha grande, horário de pico, crescimento de base — porque depende de fila externa ou servidor dedicado que pode saturar.

Por que importa

arquitetura orientada a evento e sem servidor dedicado escala horizontalmente por natureza — não existe um único processo que vira gargalo quando o volume sobe.

Como falar disso

"A arquitetura do yapt. já sustenta mais de 40 milhões de mensagens por mês — pico de campanha não é motivo pra travar."

Conformidade e proteção de dado pessoal

Em produção

mecanismos dedicados para atender pedido de exclusão e exportação de dado pessoal, e para bloquear contato de forma auditável.

Como funciona

funções dedicadas processam exclusão e exportação de dado de contato sob demanda; um sistema de lista de bloqueio permite importar, exportar e aplicar bloqueio de contato de forma rastreável.

Resolve

pedido de titular de dado pessoal (exclusão, exportação) que hoje exigiria intervenção manual direta no banco.

Por que importa

ter um fluxo dedicado para exclusão e exportação de dado pessoal reduz o risco de descumprir prazo de atendimento a um pedido desse tipo.

Como falar disso

"Pedido de exclusão ou exportação de dado pessoal tem fluxo próprio na plataforma — não depende de intervenção manual no banco."

yaSpaces — gestão de espaço físico e locação

Parcial

um módulo periférico do yapt. para negócios que administram e alugam espaço físico — sala de reunião, mesa, quadra, consultório, salão de evento, equipamento — com agenda, reserva e cobrança dentro da mesma plataforma usada para atender o cliente.

Como funciona

cadastro de locais e espaços com regras próprias de reserva, um funil de status de reserva (negociando → pré-reserva → aprovação, quando o espaço exige → confirmada → encerrada/no-show/cancelada), agenda e mapa visual dos espaços, painel do dia para check-in manual, e um módulo de contrato e cobrança integrado: tipos de contrato configuráveis, carteira/saldo por conta (franquia de uso), consumo lançado como venda, faturas geradas e sincronizadas com o sistema de gestão financeira da New Way (Omie) — incluindo emissão automática de nota fiscal e boleto. Tudo isolado por tenant e com permissões dedicadas (quem pode aprovar reserva, quem gerencia contrato).

Resolve

negócio que aluga espaço físico e hoje usa planilha ou agenda separada para reserva, contrato e cobrança, sem ligação com a conversa de WhatsApp que originou a negociação.

Por que importa

reserva, contrato e cobrança de espaço físico ficam dentro da mesma plataforma que já concentra a conversa com o cliente — sem alternar entre sistema de agenda, sistema financeiro e WhatsApp para fechar uma locação.

Como falar disso

"Reserva, contrato e cobrança do seu espaço físico ficam na mesma plataforma da conversa — do primeiro contato no WhatsApp até a nota fiscal da locação."

Status da plataforma e comunicação de incidente

Em produção

um sistema de aviso global para informar todos os tenants sobre um incidente ou degradação em curso na plataforma, administrado pela equipe da New Way.

Como funciona

a equipe da New Way abre um incidente com severidade (informativo, atenção, crítico) e status (investigando, identificado, monitorando, resolvido), publica atualizações de linha do tempo à medida que a situação evolui, e o incidente ativo fica visível para todo usuário autenticado até ser marcado como resolvido.

Resolve

cliente que abre chamado de suporte perguntando "está fora do ar?" durante um incidente que a New Way já sabe que está acontecendo, sem canal de aviso proativo dentro do próprio produto.

Por que importa

aviso proativo dentro do produto reduz o volume de chamado duplicado durante incidente e passa transparência sobre o que está sendo feito.

Como falar disso

"Se algo sai do ar, você fica sabendo dentro da própria plataforma — não precisa abrir chamado para descobrir se é um problema conhecido."

Divergências com o material de marketing
  • Correção importante desta varredura: a rodada anterior deste mapa foi feita sobre um checkout local desatualizado (centenas de commits atrás do origin/main). Vários veredictos de "não existe código" estavam errados — o principal é yaSpaces, abaixo. Sempre que possível, valide contra origin/main, não contra um checkout local parado.
  • yaSpaces / Coworkup: a varredura anterior dizia "nenhum código encontrado, tratar como plano". Isso estava incorreto — existe um módulo funcional (agenda, funil de reserva, contrato, carteira e faturamento via Omie com nota fiscal e boleto automáticos), em evolução ativa, com item próprio no menu do produto. Correto falar dele como módulo em evolução (Parcial), nunca mais como "não existe" nem como catálogo fechado e completo.
  • E-mail como canal de atendimento: a varredura anterior dizia que só existia integração de caixa de entrada interna, sem canal de atendimento ao cliente final. Isso também estava incorreto — já existe conexão OAuth, recebimento em tempo real, criação de conversa e acionamento da IA para e-mail como canal, embutidos no assistente de canal e na tela de atendimento. Ainda não é uso geral em produção; correto falar como "em desenvolvimento", não mais como "planejado, sem código".
  • Cobrança faturada (boleto/NFS-e): o fluxo com o Omie amadureceu — nota fiscal e boleto saem automaticamente ao faturar, com retentativa e baixa de pagamento dedicadas. Deixou de ser "reconciliação em evolução" e passa a "em produção" nos dois modelos de cobrança.
  • Webchat/widget: confirmado novamente em produção (Fase 1) — SDK, UI, rastreamento, gatilho proativo e ponte para WhatsApp. Qualquer material que ainda trate o widget como "em breve" está desatualizado.
  • Pesquisas via WhatsApp Flows: segue à frente do código quando material o apresenta como plataforma de Flows completa — hoje há templates de pesquisa funcionais (CSAT, NPS, onboarding) na galeria, mas o módulo geral de Flows ainda está em evolução. Falar pelo que já existe (templates de pesquisa prontos), não como plataforma de Flows genérica e completa.
  • Analytics/relatórios: o conjunto de relatórios publicados é bem mais amplo do que a varredura anterior registrava (mais de dez telas de relatório/analytics já em produção). A infraestrutura de captura e um conjunto amplo de relatórios já estão em produção; o que segue em expansão são novos recortes e painéis, não o alicerce.
Módulos encontrados fora do domínio deste documento

Durante esta varredura do origin/main apareceram módulos com código real que não pertencem ao domínio de plataforma/integrações deste documento — sinalizados aqui para o mapa correspondente cobrir:

  • yaAcademy (src/pages/academy/, src/pages/AcademyBridge.tsx) — trilha de treinamento/educação do cliente.
  • Creator (src/pages/creator/CreatorPage.tsx) — ferramenta de geração/criação de conteúdo.
  • Marketing Hub (src/pages/MarketingHub.tsx) — hub de marketing.
  • Changelog (src/pages/Changelog.tsx) — novidades de produto para o cliente.
  • yapt. Signals / Informativos — a memória registrava "spec v3, código não iniciado"; isso está desatualizado. Existe módulo funcional de avisos in-product e NPS, com compositor no Platform Admin (src/pages/platform/PlatformSignals.tsx) e tela de "Comunicação Interna" no tenant (src/pages/ComunicacaoInterna.tsx), com permissão dedicada e RLS. É módulo de comunicação/engajamento com o cliente, não de plataforma/integração — recomendado documentar no mapa de produto/engajamento, não aqui.

> Última varredura: 31/07/2026 (origin/main)