Coleta do Google Meet
Como a Onvox AI coleta reuniões do Google Meet, do app OAuth (global ou próprio do tenant) até a atribuição da análise.
Coleta do Google Meet
Esta página descreve, detalhe por detalhe, como a Onvox AI coleta reuniões do Google Meet: desde o app OAuth até a análise atribuída ao vendedor certo. Para a matriz de quem-pode-o-quê, veja Permissionamento.
Visão geral do modelo
No Google Meet há um app OAuth global, de plataforma, cadastrado apenas pelo super_admin, compartilhado por todos os tenants e usuários. Um tenant pode ter também um app OAuth próprio, cadastrado pelo admin_company (ou pelo super_admin), que substitui o global só para aquele tenant. Cada usuário apenas autentica a própria conta contra o app em vigor (no perfil) para liberar a transcrição. Supervisor e vendedor não cadastram OAuth.
O fluxo tem dois níveis, propositalmente separados:
- App OAuth (o global, pelo super_admin; ou o próprio do tenant, pelo
admin_company). Define o
client_id/client_secretdo Google e o Redirect URI. É o "aplicativo" que o Google reconhece. - Conexão por usuário (self-service). Cada pessoa conecta a própria conta Google contra esse app, liberando a leitura das transcrições das reuniões dela e faz a coleta atribuir as reuniões a ela.
O app OAuth de plataforma
- Global e compartilhado. Existe um app OAuth global para toda a plataforma (o padrão). Ele mora num tenant de sistema fixo com o nome do produto ("Onvox AI"), uma empresa reservada usada só como espaço de configuração. O super_admin autentica o app global selecionando esse tenant na mesma tela de Integrações → Google Meet.
- Quem cadastra: o app global, só o super_admin, pelo menu/UI
(compliance), em "Credenciais (app global)". O app próprio do tenant, o
admin_company da própria empresa (ou o super_admin, com a empresa selecionada),
em "Credenciais (OAuth próprio)"; desse formulário só o
client_id/client_secretsão gravados. A variável de ambienteGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRETfica como fallback opcional. - Precedência de resolução do app: app próprio do tenant → app global (tenant de
produto) →
env. Ou seja, se um tenant tiver um app próprio cadastrado, ele usa o dele; senão, herda o global. - Remover app próprio: o admin_company (ou o super_admin) remove o app do tenant e a empresa volta ao app global. Os tokens emitidos pelo app próprio param de renovar: essas contas caem em "Precisa de ação" e os usuários precisam reconectar a própria conta.
- Redirect URI: o Google exige registrar a URL de callback exata do Onvox AI no
Google Cloud Console. Ela aparece no próprio diálogo de credenciais (botão Copiar)
e muda por ambiente. Sem isso, a conexão falha com
redirect_uri_mismatch.
A configuração do app OAuth global é exclusiva do super_admin. O app próprio do tenant aparece também para o admin_company (botão "Credenciais (OAuth próprio)" e, quando a empresa usa app próprio, "Remover app próprio"). Para supervisor e vendedor, a única superfície é o botão de autoconexão no próprio perfil. A tela global de configuração do Google Meet mostra apenas o Google (o Yeastar não é global, pois é por-PABX/empresa e só aparece ao selecionar uma empresa).
Pré-requisitos do app no Google Cloud (consentimento, publicação, verificação)
Antes de os usuários conseguirem conectar a própria conta, o app OAuth no Google Cloud
Console precisa estar configurado corretamente. É o passo que costuma travar a primeira
conexão (ex.: um usuário externo recebendo 403: access_denied).
- Tela de consentimento = "Externo" (External). O tipo "Interno" só funciona
para contas do mesmo Google Workspace da empresa dona do app. Como os usuários
reais (clientes/parceiros, ex.:
@omniassessoria.com.br) são de fora desse Workspace, o app precisa ser Externo, senão essas contas nem aparecem para autorizar. - App em "Testing" (teste): só os e-mails adicionados como Usuários de teste
(máx. 100) conseguem autorizar; qualquer outro recebe
403: access_denied. Além disso, em Testing com escopo sensível o refresh token expira a cada 7 dias → a coleta em background para toda semana e o usuário precisa reconectar na mão (não há como renovar um refresh vencido, nenhum ajuste no Onvox AI resolve isso). - Para uso real, publique o app "Em produção" e envie-o para verificação. O escopo
do Meet (
meetings.space.readonly) é sensível, então a verificação exige marca/logo, política de privacidade, homepage e o domínio verificado. Em produção o refresh é perene e some o limite de 100 contas. (É possível publicar antes de a verificação concluir; funciona com o aviso "app não verificado", até 100 usuários.)
O Onvox AI renova sozinho o access token (~1 h) usando o refresh token; ele não
conserta o 403 (test users) nem a expiração de 7 dias: isso é 100% configuração no
Google Cloud Console.
Conexão por usuário (self-service)
Cada usuário conecta a própria conta em Configurações → "Conectar meu Google Meet":
- Quem conecta: admin_company e vendedor SIM; supervisor NÃO. (O super_admin não tem reuniões próprias, portanto não se aplica.)
- O que acontece: ao autorizar, o token OAuth é gravado cifrado por usuário
(
user_integration_config). A partir daí as reuniões daquela conta passam a ser coletadas e atribuídas àquele usuário. - Auto-correção (sem depender do suporte): no mesmo card, quem já está conectado pode Desconectar e Conectar de novo a qualquer momento, por exemplo, para corrigir uma conta errada. Ambas as ações são escopadas à sessão do próprio usuário.
- Apagar a conexão de outro usuário (ação de suporte) é exclusiva do super_admin.
Data de corte da coleta (collectSince)
Nada anterior à conexão é coletado. Ao conectar, a Onvox AI grava a data/hora como marco de corte; reuniões anteriores a esse marco não entram.
- Guardado em
integration_config.credentials.collectSince(ISO, cifrado). - Inicializado na conexão (
collectSince = agora, se ainda não houver valor). - Editável depois: campo "Coletar a partir de" no card conectado.
Polling automático (a cada ~5 min)
- A coleta é automática por polling: o sistema busca automaticamente, a cada
~5 minutos, reuniões/transcrições novas desde
collectSince(não incremental desde a última varredura, relista tudo desde o corte a cada ciclo e confia no dedup porexternalCallIdpra não duplicar análise). - Para cada transcrição encontrada: baixa o texto, monta os participantes, cria a análise e a atribui (ver abaixo).
- Como relista desde o corte a cada ciclo, uma parada não perde reunião no modo Total diário: quando a conta volta a coletar, as reuniões do período parado entram no ciclo seguinte. Nos modos Quantidade e Amostragem, só o dia corrente conta. Instabilidade do Google e falha de rede entram em retentativa automática, sem bloquear a conta. O que acontece em cada caso, e como desbloquear, está em Sincronização e recuperação da coleta.
Espaços monitorados (opcional)
- Além do polling automático das conexões, é possível registrar espaços monitorados (salas específicas do Meet), recurso opcional/manual.
- A lista mostra o link
meet.google.com(resolvido viaspaces.get) em vez do idspaces/..., com paginação, e um botão para carregar o endereço e as transcrições. - Só pra espaços monitorados (diferente do polling principal acima): o limite inferior
usado é o maior entre a última varredura daquele espaço e
collectSince; aqui sim é incremental.
Transcrição com locutor por frase
No Google Meet, "quem falou" aparece frase a frase: a diarização é nativa da API
do Meet (transcripts.entries traz o participante de cada trecho). A Onvox AI grava
Locutor: frase por linha.
- Coleta: o transcript é salvo no formato
displayName: frase(nome de exibição do participante viaparticipants.list; id curto quando não há nome). - Exibição correlacionada: na leitura da análise, se houver correlação identificador↔usuário, o rótulo do locutor é trocado pelo nome oficial do usuário do Onvox AI. A troca é só na visão do leitor, pois o texto original permanece intacto.
- O nome do Google é sempre trazido e persistido, mesmo sem correspondência com um usuário cadastrado. A correlação apenas substitui o nome na exibição quando existe.
Contatos reutilizáveis
Para mapear uma vez e valer para todas as reuniões, os participantes vistos nas coletas viram contatos persistentes:
- Tabela
integration_contactpor(company_id, provider, external_id): oexternal_idé o People-id do Meet. Guardadisplay_name, ouser_idmapeado,seen_countefirst/last_seen_at. - A cada coleta, os contatos têm a recorrência incrementada e o nome atualizado, sem sobrescrever o mapeamento já feito.
- Na tela de Integrações há a seção "Contatos do Google Meet": lista com "visto Nx"
- um seletor de usuário por contato (mapear/desmapear).
Atribuição (de quem é a reunião)
Ao registrar a análise, a Onvox AI resolve o dono nesta ordem:
- Mapeamento de vendedor (
salesperson_mapping/ contato mapeado). - Identidade externa do usuário: o e-mail do Google cadastrado no usuário
(
googleMeetEmail). - Supervisor padrão do tenant (mais antigo): quando nada casa, a análise é
auto-correlacionada ao supervisor já no registro (status
auto_supervisor). Sem supervisor no tenant →pending.
Limites da API do Meet
A API do Meet expõe displayName + People-id do participante, mas NÃO o e-mail.
Por isso a correlação automática por e-mail não é garantida no Meet.
- A correlação robusta por e-mail depende do mapeamento manual (campo "E-mail/login
do Meet" no cadastro do usuário) ou do
salesperson_mapping/contato mapeado.