Especificação visual com capturas reais

Feedback de Clientes

Funcionalidade que reúne, num só lugar, os feedbacks que os clientes deixam nos canais do negócio (avaliações, comentários e mensagens), organiza por status e ajuda a responder com sugestões da MIA.

Feature (código): src/features/feedback
Rota base: /feedback (o projeto usa trailingSlash: true, então as URLs reais terminam com /)
Status atual: protótipo navegável com dados 100% mockados. As integrações reais por canal estão estimadas na seção 14.
Capturas: screenshots reais geradas a partir do app rodando (viewport desktop), em 18/06/2026.

1Visão geral da jornada

A funcionalidade tem três fases na rota raiz /feedback, controladas por um único estado (phase):

  1. Conectar canais (phase: "connect"): onboarding. O usuário escolhe de quais canais quer ouvir os clientes.
  2. Varredura (phase: "scanning"): a Plataforma sincroniza os feedbacks dos últimos 7 dias dos canais conectados.
  3. Painel / Recentes (phase: "dashboard"): o usuário trabalha a fila de feedbacks em formato de baralho (deck) e navega para as telas satélite.

A partir do painel existem as telas satélite: Todos os Feedbacks, Feedbacks Ocultos, Detalhe do Feedback e Gerenciar canais.

1.1 Fluxograma da jornada

Dois recortes da mesma jornada: o caminho feliz (tudo sincroniza e a fila é zerada) e o caminho triste (varredura lenta, resultado parcial, falha total ou perda de conexão).

Caminho feliz

Início: nenhum canal empty state "Nenhum canal conectado" Conectar canal onboarding / Gerenciar canais "Analisar agora" Varredura (loading) canais sincronizam, progresso 100% Painel / Recentes deck de cards Marcar como Respondido ação direta no card Detalhe do Feedback MIA sugere resposta; Copiar / Ir para o feedback; marcar Respondido Ocultar remove o card da fila Fila em aberto chegou a zero? Celebração (confetti) "Tudo em dia por aqui!" arrastar à direita tocar no card arrastar à esquerda não: próximo card sim

Caminho triste

Varredura iniciada Passou do limiar (~8s)? Segue o caminho feliz painel normal "Ainda processando" auto-retry / backoff por canal Algum canal retornou? Falha total "Não foi possível concluir" Tentar de novo / Voltar a canais Todos os canais retornaram? Resultado parcial entra no painel mesmo assim; alerta "conexão perdida" + Reconectar Painel completo todos sincronizados Sem feedbacks no período empty state "Nenhum feedback" Perda de conexão com canal já conectado alerta no topo da Recentes + Reconectar; feedbacks já sincronizados continuam visíveis não sim não sim não sim

2Modelo de dados e conceitos

2.1 Feedback (FeedbackItem)

CampoTipoObservação
idstringIdentificador único
channelIdgoogle-business | instagram | facebook | whatsappCanal de origem
themeIdtema (atendimento, entrega, produto, qualidade, etc.)Classificação do assunto
authorNamestringNome do cliente
textstringConteúdo do feedback
sentimentpositive | negative | neutralSentimento classificado
interactionTypeavaliacao | comentario | mensagemTipo da interação
ratingnumber | nullNota (só faz sentido em avaliações, ex.: Google)
relativeTimestringTempo relativo exibido (ver ponto 9)
postUrlstringLink para o post/origem
suggestedRepliesSuggestedReply[]Sugestões de resposta da MIA

2.2 Status do feedback (flags independentes)

Cada feedback carrega duas flags independentes:

As combinações são todas válidas: um feedback pode estar respondido E oculto ao mesmo tempo. As flags ficam num mapa Record<feedbackId, { responded, hidden }>. Quando as duas voltam a false, a entrada é removida do mapa (estado limpo).

2.3 Seletores (onde cada feedback aparece)

ListaCritério
Deck / Feedbacks Recentes!responded && !hidden
Todos os Feedbacks!hidden (visíveis)
Feedbacks Ocultoshidden

2.4 Reputação (ReputationScore): fora do MVP

A reputação não faz parte do MVP e não é exibida em nenhuma tela. O redesign multi-tela removeu a UI de score (e o filtro "Temas da semana"). O tipo ReputationScore e o cálculo (computeReputation) permanecem na camada de dados apenas para não quebrar o reducer/serviço/testes, mas o valor é ignorado pela interface. Tratar como legado/futuro, não como funcionalidade do MVP.

Quando houver UI de reputação no futuro, o cálculo atual é: total, positivos, negativos, neutros e taxa de positividade; sem feedbacks polarizados, valor neutro (50); faixas crítico (<50), atenção (50 a 69), bom (70 a 84), excelente (>=85).

2.5 Canais suportados (mock atual)

Google Meu Negócio (avaliações com nota), Instagram, Facebook e WhatsApp Business. Apenas Google Meu Negócio usa nota em estrelas; os demais usam comentário ou mensagem.

3Regras de negócio

  1. Ao conectar um canal, o sistema sincroniza os feedbacks dos últimos 7 dias.
  2. Se o usuário desconectar um canal, todos os feedbacks dele são excluídos da análise (com confirmação por diálogo). As flags dos feedbacks daquele canal também são descartadas.
  3. O usuário pode marcar um feedback como respondido ou oculto.
  4. A tela inicial apresenta os feedbacks não respondidos e não ocultos, do mais recente para o mais antigo (ordem cronológica).
  5. Se não houver feedback não respondido, a tela inicial mostra um empty state (ver tipos no item 6).
  6. Os feedbacks ocultos podem ser vistos em Todos os Feedbacks > Feedbacks Ocultos.
  7. O usuário pode tornar um feedback oculto visível novamente (no detalhe).
  8. O usuário não pode excluir um feedback. O máximo que pode fazer é desconectar o canal de origem.
  9. Um feedback tem status respondido ou não respondido e pode estar visível ou oculto (flags independentes, ver 2.2).
  10. O usuário pode filtrar por Canal, por Status (respondido ou não respondido) e por Sentimento (positivo, negativo ou neutro) na tela Todos os Feedbacks.
  11. Ordem cronológica. No deck (Recentes) a apresentação é sempre do mais recente para o mais antigo. Em Todos os Feedbacks o padrão é o mesmo, mas o usuário pode inverter a ordem por um controle na tela. (No mock, a ordem deriva do relativeTime; na integração real usar um postedAt/timestamp.)
  12. No primeiro acesso, se existirem cards a apresentar, o usuário vê uma dica (tutorial) de como funciona o arrastar de cards. O tutorial só aparece na primeira vez em que houver cards. Se na primeira vez já for empty state, mostra o empty state direto e o tutorial fica para quando houver cards.
  13. Ao conectar um canal, a conexão deve ser OAuth e ocorrer em aba separada (ver item 11).
  14. Quando o usuário clicar em Atualizar (em Recentes ou em Todos), passa pela tela de varredura (loading azul, igual ao onboarding) e, ao voltar ao painel, vê o toast "Feedbacks atualizados.". Os estados atuais (respondido, oculto) persistem: a atualização sincroniza novos feedbacks sem apagar o que já foi tratado. Em Todos, o Atualizar leva o usuário de volta ao painel (Recentes) após a varredura.
  15. Perda de conexão com um canal. Se o sistema perde a conexão com um canal conectado (token expirado, revogação de acesso, instabilidade da API), o canal entra em estado de erro (continua na lista de conectados, mas marcado). A plataforma não desconecta sozinha: ela sinaliza e pede reconexão.
    • Tela inicial (Recentes): um alerta no topo informa que a conexão com o(s) canal(is) foi perdida, com atalho para Gerenciar canais.
    • Gerenciar canais: o canal aparece com indicador de erro ("Conexão perdida") e a ação "Reconectar" no lugar de "Desconectar".
    • Os feedbacks já sincronizados desse canal continuam visíveis; só param de receber novidades até reconectar.
    • Reconectar limpa o erro (no produto real, refaz o OAuth do canal em aba separada). Desconectar também limpa o erro e remove os feedbacks do canal.
  16. Varredura lenta e tolerância a APIs lentas. A varredura distingue "lento, mas vivo" de "falhou", e não trava a sincronização inteira por causa de um canal lento:
    • Limiar de espera. Até o limiar esperado (configurável, default sugerido ~8s), a varredura mostra o progresso normal (teto 92%) com mensagens rotativas.
    • "Ainda processando". Passado o limiar sem falha, exibe uma mensagem persistente de que ainda está processando, sem fingir 100% e sem tela de erro, mantendo "Voltar para canais" acessível.
    • Backoff automático. Cada canal lento ou instável é re-tentado automaticamente com backoff exponencial e jitter (default: base 1s, fator 2, teto ~10s, até 3 tentativas) antes de ser marcado com erro.
    • Resultado parcial. Se ao menos um canal retornar, o usuário entra no painel com os feedbacks disponíveis e um alerta não bloqueante para os canais que falharam. Só vira tela de erro cheia quando nenhum canal retorna após o backoff.
    • Limiar de espera, número de tentativas e tempo limite por canal são parâmetros configuráveis; os defaults são provisórios e devem ser calibrados com dados reais de latência (ver seção 14).

3.1 Ações sobre o card (deck)

4Mapa de telas e modais

4.1 Telas (com rota)

As três fases da raiz (connect, scanning, dashboard) compartilham a mesma URL /feedback/. A fase vem do estado persistido, não da URL. No desktop, as telas satélite aparecem com a navegação lateral; no mobile, comportam-se como modais com header fixo cobrindo a tela.

4.2 Modais, overlays e estados (sem URL própria)

5Fluxos detalhados

5.1 Conectar canais (onboarding)

  1. Tela com os canais disponíveis. Cada canal é um chip clicável.
  2. Ao clicar em "Conectar", o chip mostra estado "Conectando..." e então fica conectado (no produto final, abre fluxo OAuth em aba separada).
  3. Ao conectar, a Plataforma sincroniza os feedbacks dos últimos 7 dias do canal.
  4. Com pelo menos 1 canal conectado, o botão "Analisar agora" fica habilitado e leva à varredura.
Tela de conectar canais (onboarding)
5.1 Conectar canais (onboarding)

5.2 Varredura (scanning)

  1. Barra de progresso animada com mensagens rotativas. O progresso sobe até um teto (92%) enquanto a sincronização não termina, e completa 100% quando os dados chegam.
  2. Sincronização por canal. Cada canal conectado sincroniza de forma independente; a varredura acompanha quantos canais já retornaram (X de Y canais).
  3. Espera longa ("ainda processando"). Se a sincronização ultrapassa o limiar de espera (~8s) sem ter falhado, a tela troca as mensagens rotativas por uma mensagem persistente e tranquilizadora e mantém o progresso no teto de 92%. "Voltar para canais" continua disponível.
  4. Auto-retry com backoff. Lentidão ou falha transitória de um canal dispara novas tentativas automáticas com backoff exponencial e jitter (base 1s, fator 2, teto ~10s, até 3 tentativas) antes de declarar o canal com erro.
  5. Conclusão:
    • Sucesso total (todos os canais retornaram): completa 100% e vai para o painel com os feedbacks.
    • Parcial (pelo menos 1 canal retornou e os demais esgotaram tentativas/tempo limite, default 60s): entra no painel mesmo assim, com um alerta não bloqueante para os canais que falharam, reaproveitando o padrão de canal em erro da regra 15.
    • Falha total (nenhum canal retornou após o backoff): mostra o estado de erro de varredura com "Tentar de novo" e "Voltar para canais".
  6. Ver a regra de negócio 16 para os parâmetros e a política completa.
Tela de varredura (scanning)
5.2 Varredura (scanning)

5.3 Painel / Feedbacks Recentes (deck)

  1. Deck no estilo baralho. O card do topo é o ativo.
  2. Ações: arrastar à direita (responder), à esquerda (ocultar), tocar (abrir detalhe).
  3. Botão de atualizar no topo: sincroniza novos feedbacks preservando os estados já marcados.
  4. Ao esvaziar a fila de feedbacks em aberto, dispara a celebração (confetti) e o estado "Tudo em dia".
  5. Atalhos para "Todos os feedbacks" e "Gerenciar canais".
Painel / Feedbacks Recentes (deck)
5.3 Painel / Feedbacks Recentes (deck)

5.4 Detalhe do Feedback

Ordem vertical da tela: card do feedback, ações, resposta da MIA, navegação.

  1. Mostra o card completo do feedback.
  2. Ações: dois botões lado a lado, Ocultar/Mostrar à esquerda e Marcar como Respondido/Desmarcar à direita.
  3. Resposta da MIA: a MIA "pensa" por um instante e revela a sugestão (avatar + badge, texto, "Copiar resposta" e "Ir para o feedback").
  4. Navegação: botões Anterior e Próximo (ghost com setas) para percorrer os feedbacks sem voltar à lista, em ordem cronológica. "Anterior" desabilita no primeiro e "Próximo" no último.
  5. Origem da navegação. O detalhe sabe de onde foi aberto (via ?from=): Voltar retorna à origem; Anterior/Próximo navega pelo conjunto de Todos (quando origem deck/todos) ou pelos ocultos (quando origem ocultos). A lista é congelada (snapshot) durante a navegação para permitir voltar e corrigir.
  6. "Copiar resposta" usa a Clipboard API com fallback. "Ir para o feedback" aparece após copiar.
  7. "Ir para o feedback" por canal: para Google, Instagram e Facebook abre a origem (postUrl) em nova aba. Para WhatsApp, leva o usuário para o chat dentro da plataforma já com a resposta gerada pela MIA no input, restando clicar em enviar.
Detalhe do Feedback
5.4 Detalhe do Feedback

5.5 Todos os Feedbacks

  1. Lista os feedbacks visíveis (não ocultos), em ordem cronológica.
  2. Filtros: Canal, Status (respondido/não respondido) e Sentimento.
  3. Taxa de resposta: bloco com "X de Y respondidos" e barra de progresso, calculada sobre os visíveis.
  4. Atalho "Feedbacks Ocultos".
Todos os Feedbacks
5.5 Todos os Feedbacks

5.6 Feedbacks Ocultos

  1. Lista os feedbacks com hidden = true.
  2. Ao abrir o detalhe, o usuário pode torná-los visíveis de novo ("Mostrar").
Feedbacks Ocultos
5.6 Feedbacks Ocultos

5.7 Gerenciar canais

  1. Reaproveita a tela de conexão em modo "manage".
  2. Conectar/desconectar reflete na hora (resync ao vivo, preservando flags dos canais que continuam conectados).
  3. Botão "Analisar agora" confirma as ações e volta ao painel. O "X" do header fecha a gestão de canais. Desconectar pede confirmação no DisconnectChannelDialog.
Gerenciar canais
5.7 Gerenciar canais

6Estados vazios e de erro (catálogo)

Catálogo dos estados de vazio e erro, com a condição que os dispara e a mensagem exibida. As capturas reaproveitam as imagens da galeria 4.2.

7Persistência e sincronização

8Tutorial do deck

Overlay com 3 passos, exibido na primeira vez que houver cards no deck:

  1. Responder: "Puxe o card para a direita para marcar um card como respondido."
  2. Ocultar: "Não quer mais ver um feedback? É só puxar para a esquerda. Ele sai da listagem de feedbacks. Você ainda poderá encontrá-lo nos Feedbacks Ocultos."
  3. Gerar resposta: "Se quiser gerar uma resposta, toque no card para visualizá-lo. A MIA cria uma sugestão pronta para você ajustar e enviar."

Botões "Próximo" / "Entendi" e "Pular tutorial". Respeita prefers-reduced-motion.

9Conexão de canais: comportamento de produto vs. mock

10Edge cases

Status possíveis: Tratado Intencional Conhecido (não tratado) Fora de escopo
#Edge caseComo visitarTratamento / status
1Ação perdida durante a animação de swipe/carimboDeslizar um card e tocar imediatamente na navegação antes da animação terminarConhecido Os timers são limpos no unmount; o card volta como não tratado. Mitigar comprometendo a flag antes da animação.
2Dessincronização entre abas (last-write-wins)Abrir /feedback/ em duas abas, agir numa e observar a outraConhecido Não há listener de storage; a última escrita sobrescreve. Resolver ao escopar a sessão no backend.
3Sessão não escopada por empresaTrocar de empresa no dropdown do topoConhecido A sessão é global no mock. No produto, escopar por company_id.
4Não existia atualização após o onboardingPainel: usar o botão de atualizar no topo de RecentesTratado Botão de atualizar inline que re-sincroniza preservando flags.
5Re-sincronizar apagava as flagsMarcar respondido/oculto e atualizarTratado A atualização preserva as flags; só a 1a varredura do onboarding zera.
6Desconectar e reconectar zera o estado daquele canalGerenciar canais: desconectar e reconectarIntencional Desconectar exclui feedbacks e flags do canal; reconectar traz tudo novo.
7Celebração (confetti) inconsistente conforme o caminhoTratar o último feedback pelo Detalhe e voltar ao painelTratado A celebração dispara sempre que a fila em aberto chega a zero por ação do usuário.
8Contador de trial estático e sem gateObservar "15 dias" no topo (mobile)Fora de escopo Valor fixo; expiração não definida nessa funcionalidade.
9relativeTime é texto fixo e não envelheceDeixar a sessão por dias e reabrirConhecido O mock guarda string, não timestamp. Adicionar postedAt para tempo real.
10Feedbacks persistidos podem ficar velhosCarregar uma sessão antiga após mudança no shapeConhecido Só a migração de flags legadas é defensiva; versionar o payload.
11Recarregar no meio da varredura volta para "conectar"Iniciar varredura e recarregar a páginaIntencional Sem feedbacks ainda, a hidratação retorna ao estado de conexão.
12Erro de varredura, retry e progresso em 92%Erro total ?scanError=1; lenta ?scanSlow=1; backoff que recupera ?scanFlaky=instagram; parcial ?scanPartial=instagramTratado (mock) Contador "X de Y canais", "ainda processando", backoff/auto-retry e resultado parcial. Tela de erro cheia só quando nenhum canal retorna. Pendente: telemetria.
13Perda de conexão com um canal conectado?channelError=instagram (canal precisa estar conectado)Tratado Alerta na Recentes + estado de erro e "Reconectar" no Gerenciar canais. Feedbacks já sincronizados continuam visíveis.

10.1 Gatilhos de teste úteis (dev)

11Status de implementação (mock vs. real)

ItemSandbox (hoje)Produto (esperado)
Conexão de canalToggle simuladoOAuth em aba separada
Origem dos feedbacksDataset mockadoAdapters por canal (services/)
Classificação de sentimento e temaPré-definidos no seedServiço de NLP/LLM
Sugestões de resposta (MIA)Pré-definidas no seedGeração por modelo
Tempo relativoString fixaDerivado de postedAt
Escopo por empresaGlobalPor empresa (company_id)
PersistêncialocalStorageBackend
Varredura lenta / tolerânciaContador "X de Y canais", "ainda processando" (~8s, ?scanSlow), backoff/auto-retry (?scanFlaky) e resultado parcial (?scanPartial); resta a telemetriaBackoff/auto-retry e resultado parcial reais por canal
Métricas/telemetriaNão instrumentadoVer seção 12

12Dados a monitorar (para o Analista de Dados)

Hoje a feature não está instrumentada; o que segue é a especificação do que deve ser enviado quando a telemetria for ligada. Toda métrica deve ser cortável pelas dimensões de negócio (porte, segmento, localização).

12.1 Dimensões (cortes de análise)

DimensãoExemplos / valoresOrigem
company_ididentificador da empresasessão/empresa atual
porteMEI, ME, EPP, demaiscadastro da empresa
segmentoCNAE / setor (ex.: alimentação, varejo, serviços)cadastro
localizacaoUF, município, regiãocadastro
plano / trialem teste, pago, expirado, free; dias restantes de trialbilling
canais_conectadoslista e contagem de canaisestado da feature
dispositivomobile, desktopclient

12.2 Eventos (taxonomia proposta)

EventoQuando disparaPropriedadesMétrica
feedback_channel_connect_startedClique em conectar canalchannelInício de conexão por canal
feedback_channel_connect_succeededOAuth concluído com sucessochannel, duration_msTaxa de sucesso de conexão
feedback_channel_connect_failedFalha/cancelamento do OAuthchannel, reasonAtrito de conexão
feedback_channel_disconnectedConfirmação de desconexãochannel, feedbacks_removidosChurn de canal
feedback_scan_startedInício da varredurachannels, channels_countFunil de ativação
feedback_scan_completedVarredura concluídaduration_ms, feedbacks_count, por_canal, reputation_valueVolume e reputação inicial
feedback_scan_failedErro na varredurareasonConfiabilidade
feedback_scan_retriedClique em "Tentar de novo"-Recuperação de erro
feedback_scan_slowVarredura cruza o limiar de esperaelapsed_ms, channels_pendingLatência de sincronização
feedback_scan_channel_retriedAuto-retry de um canal com backoffchannel, attemptResiliência
feedback_scan_partialEntra no painel com resultado parcialchannels_ok, channels_failedTolerância a falhas
feedback_refresh_triggeredBotão atualizar no painelnovos_feedbacks, totalRecorrência de uso
feedback_detail_openedAbrir o detalhefeedback_id, channel, sentiment, origemProfundidade de uso
feedback_reply_generatedMIA revela sugestãofeedback_id, toneUso da MIA
feedback_reply_copiedClique em "Copiar resposta"feedback_id, channel, toneIntenção de responder
feedback_go_to_feedback_clickedClique em "Ir para o feedback"feedback_id, channel, is_placeholderConversão para o canal
feedback_marked_respondedMarcar respondidofeedback_id, channel, sentiment, interaction_type, viaTaxa de resposta
feedback_unmarked_respondedDesmarcar respondidofeedback_idCorreções
feedback_hiddenOcultarfeedback_id, channel, sentimentTaxa de ocultação
feedback_unhiddenTornar visívelfeedback_idReversões
feedback_deck_clearedFila em aberto chega a zerototal_tratados, tempo_sessao_msConclusão da fila
feedback_filter_appliedAplicar filtro em Todoscanal, status, sentimentoNecessidade de filtragem
feedback_tutorial_shownTutorial exibido-Alcance do onboarding
feedback_tutorial_stepAvançar passo do tutorialstepEngajamento no tutorial
feedback_tutorial_completedConcluir tutorial-Conclusão do tutorial
feedback_tutorial_skippedPular tutorialstepAbandono do tutorial

12.3 Métricas e KPIs sugeridos

12.4 Observações de captura

13Pendências e melhorias conhecidas

14Panorama de integração real por canal

Estimativa de esforço para trocar o mock por integrações reais. Baseado em conhecimento público até início de 2026. Políticas e endpoints mudam com frequência: sempre confirme na documentação oficial antes de planejar a engenharia.

14.1 Resumo (do mais simples ao mais complexo)

CanalLê via API?Responde via API?AuthGate de aprovaçãoHistórico retroativoComplexidadePrioridade
Google PlaySimSimService accountBaixo~7 dias na API; histórico via relatóriosMédia-baixaBaixa
App StoreSimSimJWT keyBaixoAmploMédia-baixaBaixa
Google Meu NegócioSimSimOAuth 2.0MédioSimMédiaAlta
Mercado LivreParcialParcialOAuth 2.0BaixoParcialMédiaBaixa
iFoodSimSimOAuth client credentialsMédio-altoSim (recentes)Média-altaMédia
Facebook (Página)SimSimOAuth MetaAltoSimAltaAlta
InstagramSimSimOAuth MetaAltoLimitadoAltaAlta
WhatsApp BusinessSó fluxo novoSim (janela 24h)Meta WABAAltoNãoAltaAlta
Reclame AquiContratualContratualParceria/B2BComercialDependeMuito altaBaixa

14.2 Notas por canal

14.3 Rollout faseado sugerido

  1. Fase 1 (alto valor): Google Meu Negócio + Facebook + Instagram + WhatsApp.
  2. Fase 2 (alto valor): iFood (dependem de programa/homologação).
  3. Fase 3 (médio valor): Google Play + App Store + Mercado Livre.
  4. Fase 4 (médio valor): Reclame Aqui (só com parceria comercial).
A classificação de sentimento e a geração de respostas (hoje pré-definidas no seed) são os próximos blocos a trocar por um serviço real (NLP/LLM).

15Classificação de sentimento pela MIA (treinamento inicial)

Recomendações de como a MIA deve julgar cada feedback como positivo, negativo ou neutro. No mock o sentimento já vem no seed; quando entrar um modelo real (NLP/LLM), usar estas diretrizes como base do prompt/treinamento. O sentimento define a cor do card e a separação "elogios vs oportunidades de melhoria".

15.1 Definições

15.2 Sinais a observar

15.3 Regras de desempate e casos difíceis

15.4 Por que importa

Erros de classificação têm custo assimétrico: marcar um negativo como positivo faz uma reclamação parecer elogio e atrasa a resposta ao cliente insatisfeito. Na dúvida entre positivo e negativo, prefira sinalizar como negativo/atenção para não perder uma oportunidade de recuperação. O tema (themeId) é classificação complementar e não altera o sentimento.

16Automações e notificações (proposta)

Proposta de como avisar o lojista sobre novos feedbacks fora do app. Ainda não implementado (o MVP é só a tela). O princípio para o público (MPEs/SMBs) é avisar o que exige ação, sem virar ruído: o negativo chega na hora; o resto vira resumo.

16.1 Canais de notificação

16.2 Gatilhos e cadência (recomendado)

EventoCadênciaCanais sugeridos (default)
Feedback negativo novoInstantâneoPush (on); WhatsApp (opt-in); e-mail no digest
Feedback positivo novoAgrupado (não instantâneo)Entra no digest; sem push individual
Avaliação com nota baixa (1 a 2) no GoogleInstantâneoPush; WhatsApp (opt-in); e-mail no digest
Resumo periódico (digest)SemanalE-mail
Fila acumulando (ex.: 10+ em aberto)No máximo 1x/diaPush ("você tem N feedbacks para responder")
Canal com conexão perdida (regra 15)Instantâneo (1x, sem repetir)Push + e-mail

Por que assim: o negativo tem custo de não responder rápido, então vai instantâneo. O positivo não precisa interromper, então é agrupado. O digest semanal dá a visão geral sem pressão diária.

16.3 Conteúdo das mensagens

16.4 Anti-ruído e preferências

16.5 Defaults recomendados para o MVP de automação

  1. Push instantâneo apenas para feedback negativo e nota 1 a 2.
  2. E-mail digest semanal (resumo + taxa de resposta + destaques).
  3. WhatsApp para negativos e nota 1 a 2.
  4. Push de fila (no máximo 1x/dia) quando houver feedbacks em aberto acumulando.
Métricas para acompanhar (ligam à seção 12): notificações enviadas/abertas por canal e tipo, tempo até a primeira resposta após a notificação, opt-out por tipo, e impacto na taxa de resposta. Cortar por porte, segmento e localização.