Google Analytics 2027 · Capítulo 30 de 35 · 10 min
Responder às perguntas do negócio em SQL sobre os dados brutos
Consultas que desaninham parâmetros, reconstroem sessões, cruzam o GA4 com o HubSpot e a Shopify e leem só os bytes necessários.
Este capítulo faz parte do curso gratuito Google Analytics 2027. Para marcar como concluído e salvar o progresso, abra este capítulo na página do curso.
Com a exportação ligada, a primeira consulta de quase todo mundo é um SELECT de tudo na tabela de ontem, e ela devolve colunas que se abrem em listas dentro de listas. O parâmetro que interessa está lá, mas dentro de um par chave e valor, e o valor pode estar em qualquer uma de quatro colunas.
O custo de não dominar essa estrutura é duplo. A consulta que junta eventos com o CRM na granularidade errada multiplica linhas e infla a receita. A consulta que lê a tabela inteira todo dia gasta orçamento do projeto com bytes que ninguém precisava ler. O BigQuery cobra por volume lido, e a fatura chega antes da resposta.
O capítulo monta o conjunto de consultas da Verde Vivo em ordem: desaninhar, reconstruir a sessão, responder às perguntas comerciais, cruzar com HubSpot e Shopify, e só então tornar tudo barato e agendado.
A unidade é a tabela do dia. Para ler um período, a consulta usa o curinga events_* com filtro pelo sufixo do nome da tabela, e esse filtro é o que impede o BigQuery de varrer o histórico inteiro. Cada linha traz o nome do evento, a data, o carimbo de tempo em microssegundos, o user_pseudo_id (o identificador do navegador ou do aparelho), o user_id quando existe, a origem da sessão e as colunas aninhadas.
UNNEST (a operação que abre uma coluna de lista em linhas) é a ferramenta central. O parâmetro page_location, por exemplo, mora na lista event_params, com chave page_location e valor na coluna string_value. Um número inteiro, como ga_session_id, mora em int_value. A consulta abre a lista, filtra a chave e escolhe a coluna do tipo certo.
-- Página e sessão de cada evento, num dia, sem ler o histórico inteiro
SELECT
event_date,
event_name,
user_pseudo_id,
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'page_location') AS page_location,
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = 'ga_session_id') AS ga_session_id,
traffic_source.source,
traffic_source.medium
FROM `projeto.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260907'
AND event_name IN ('page_view', 'purchase', 'generate_lead');A subconsulta dentro do SELECT é o padrão para extrair um parâmetro por vez. Quando a análise precisa de dez parâmetros, o mesmo padrão se repete dez vezes, e é por isso que a tabela intermediária, mais adiante, vale tanto: ela faz a extração uma vez por dia e deixa colunas planas para todo mundo.
Sessão não existe como linha na exportação; ela é reconstruída. A chave é a combinação de user_pseudo_id com ga_session_id, porque o mesmo número de sessão pode se repetir entre pessoas diferentes. Com essa chave, a consulta agrupa eventos, encontra o primeiro carimbo de tempo, marca se houve purchase e lê a origem que a sessão recebeu.
-- Sessões com compra, por origem e mídia, numa semana
WITH eventos AS (
SELECT
CONCAT(user_pseudo_id, '-', (SELECT value.int_value
FROM UNNEST(event_params) WHERE key = 'ga_session_id')) AS sessao,
event_name,
ecommerce.transaction_id,
ecommerce.purchase_revenue,
traffic_source.source, traffic_source.medium
FROM `projeto.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260907'
)
SELECT
source, medium,
COUNT(DISTINCT sessao) AS sessoes,
COUNT(DISTINCT IF(event_name = 'purchase', transaction_id, NULL)) AS pedidos,
SUM(IF(event_name = 'purchase', purchase_revenue, 0)) AS receita
FROM eventos
GROUP BY source, medium
ORDER BY receita DESC;O COUNT DISTINCT sobre transaction_id é a proteção contra pedido contado duas vezes: se a página de confirmação recarregou e o purchase disparou de novo, a consulta conta um pedido. A receita, no entanto, seria somada duas vezes. Quando há suspeita de duplicidade, a consulta primeiro escolhe uma linha por transaction_id e só depois soma.
As perguntas comerciais seguem a mesma mecânica. Aquisição: sessões e pedidos por origem, mídia e campanha, como acima. Funil: pessoas que dispararam begin_checkout e, na mesma sessão, add_payment_info e purchase, contadas por etapa. Produto: a lista items aberta com UNNEST, agrupada por item_id, com quantidade e receita. Recompra: pedidos por user_id ao longo de doze meses, separando quem comprou uma vez de quem voltou.
As perguntas da Verde Vivo e o que cada consulta precisa abrir
| Pergunta | Eventos e colunas | Granularidade | Cuidado |
|---|---|---|---|
| De onde vêm os pedidos? | purchase, traffic_source, ga_session_id | Sessão | Origem da sessão, não do usuário; a atribuição é último toque |
| Onde o checkout perde gente? | begin_checkout, add_payment_info, purchase | Sessão | Etapas na mesma sessão; Pix confirmado depois não aparece aqui |
| Qual produto puxa a receita? | items abertos com UNNEST, item_id, price, quantity | Item | Um pedido com três itens vira três linhas; some por item, conte por pedido |
| Quem volta a comprar? | purchase por user_id em 12 meses | Usuário | Só quem fez login tem user_id; o resto é user_pseudo_id |
| Qual coorte vale mais? | Mês da primeira compra, receita nos meses seguintes | Usuário | Retenção da exportação não expira; a da interface, sim |
| Lead virou contrato? | generate_lead com lead_id, tabela do HubSpot | Lead | Agregar o GA4 por lead antes de juntar |
Coorte é a consulta que a exportação faz melhor que a interface, porque não há retenção de 14 meses no BigQuery. A mecânica: uma subconsulta encontra o mês do primeiro purchase de cada user_id; a consulta principal junta cada pedido posterior a esse mês de origem e soma a receita por mês desde a entrada. O resultado é uma grade em que cada linha é uma coorte e cada coluna é o mês de vida.
Cruzar com o CRM começa pela chave. A Verde Vivo passa o identificador do negócio do HubSpot como parâmetro de generate_lead, e o HubSpot exporta uma tabela com esse identificador, a etapa e a data de fechamento. A cardinalidade é o risco: um lead gera dezenas de eventos no GA4, e juntar na granularidade do evento multiplica cada contrato por dezenas. A consulta agrega o GA4 por lead antes do JOIN, e só depois junta uma linha com uma linha.
Com a Shopify, a chave é o número do pedido, que a Verde Vivo envia como transaction_id. A conciliação junta os purchase do GA4 com os pedidos pagos da loja pelo número e classifica cada pedido em três grupos: está nos dois, só na Shopify, só no GA4. O grupo "só na Shopify" é a medição que falhou; o grupo "só no GA4" é pedido não pago ou duplicado.
Eficiência tem quatro regras. Filtrar pelo sufixo da tabela, sempre, porque é o que limita os bytes lidos. Selecionar colunas em vez de tudo, porque o BigQuery cobra pelas colunas que lê. Criar uma tabela intermediária plana, com os parâmetros já extraídos e uma linha por evento, para que ninguém repita o UNNEST. Agendar a consulta que alimenta essa tabela para rodar uma vez ao dia, depois do lote.
- Etapa 1 de 5: events_AAAAMMDD
Tabela bruta que o Google grava; nunca editada
- Etapa 2 de 5: eventos_planos
Consulta agendada extrai 12 parâmetros e grava colunas planas, uma vez ao dia
- Etapa 3 de 5: sessoes
Uma linha por sessão, com origem, primeira página e se houve compra
- Etapa 4 de 5: pedidos_conciliados
purchase do GA4 junto com pedidos pagos da Shopify pelo número
- Etapa 5 de 5: Data Studio
Lê só as tabelas pequenas; a bruta fica fora do painel
Armadilha comum: juntar a tabela de eventos com a tabela de contratos do HubSpot pela chave do lead sem agregar antes, e apresentar uma receita B2B dez vezes maior que a real. O erro passa despercebido porque a consulta roda sem aviso e o número parece bom. A defesa é contar linhas antes e depois de cada JOIN: se o total de contratos mudou, a junção multiplicou.
Na Verde Vivo, Marina escreveu 14 consultas em três semanas e guardou cada uma num repositório com o nome da pergunta. A conciliação de agosto encontrou 1.590 purchase no GA4 contra 1.650 pedidos pagos na Shopify: 96 por cento de cobertura. Dos 60 pedidos sem par, 41 eram Pix confirmado depois da sessão, e esse número foi direto para o capítulo seguinte.
A consulta de coorte mostrou que 31 por cento de quem comprou pela primeira vez em setembro de 2025 voltou a comprar nos doze meses seguintes, e que a coorte vinda de busca orgânica valia 18 por cento mais em receita acumulada do que a vinda de mídia paga. A tabela plana diária reduziu o volume lido por consulta do painel de cerca de 38 GB para 2 GB, e o custo mensal do projeto caiu junto.
O que mudou foi a velocidade entre pergunta e resposta: uma pergunta nova de gestão passou a levar uma tarde, e a conciliação com a Shopify virou rotina diária em vez de auditoria trimestral.
Escreva hoje a consulta de conciliação entre os purchase da sua exportação e os pedidos pagos da sua plataforma, no mês passado, e anote a cobertura; abaixo de 95 por cento, liste os pedidos sem par por meio de pagamento antes de seguir. O próximo capítulo resolve o caso mais comum dessa lista: o pagamento que o navegador nunca viu.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Voltar ao capítulo anterior: Ligar a exportação para o BigQuery e entender o que ela não reproduz
Todos os capítulos de Google Analytics 2027
- 01Entender o que o GA4 de 2026 mede antes de instalar a tag
- 02Transformar a pergunta do negócio num plano de mensuração
- 03Ler usuários, sessões e engajamento sem somar o que não soma
- 04Desenhar conta, propriedade e fluxo para o negócio que existe
- 05Instalar a Google tag uma vez só e validar a coleta
- 06Organizar o Tag Manager para que a tag certa dispare uma vez
- 07Escrever o contrato de dados que o desenvolvedor consegue implementar
- 08Registrar dimensões personalizadas sem estourar a cardinalidade
- 09Pedir consentimento, ligar o Consent Mode e saber o que a modelagem devolve
- 10Manter a mesma pessoa no relatório entre login, domínios e dispositivos
- 11Provar que o evento chegou certo antes de confiar no relatório
- 12Ler os relatórios nativos com denominador certo e comparação justa
- 13Marcar campanhas com UTM e ler canais sem cair em Direct e Unassigned
- 14Medir busca orgânica e tráfego de assistentes de IA sem superestimar nenhum
- 15Descobrir por que a página cheia de tráfego não produz resultado
- 16Achar onde a jornada perde gente com exploração, segmento e funil
- 17Medir retenção, ativação e valor por coorte em vez de por mês
- 18Construir públicos que a mídia usa e saber quando o preditivo não existe
- 19Instrumentar a loja do view_item ao refund e conciliar com o financeiro
- 20Ligar o clique ao contrato assinado com eventos de lead e CRM
- 21Medir o aplicativo e a assinatura com Firebase sem perder a pessoa entre plataformas
- 22Escolher quais eventos-chave viram conversão no Google Ads e quais só analisam
- 23Explicar por que duas plataformas reivindicam a mesma venda
- 24Importar custo de mídia e comparar plataformas com o mesmo indicador
- 25Planejar orçamento entre canais e separar crédito de causa
- 26Montar o painel executivo dentro do próprio Analytics
- 27Contar o resultado do mês no Data Studio sem multiplicar linhas
- 28Usar Ask Advisor e insights automáticos sem aceitar resposta sem conferir
- 29Ligar a exportação para o BigQuery e entender o que ela não reproduz
- 30Responder às perguntas do negócio em SQL sobre os dados brutos
- 31Enviar do servidor o evento que o navegador não vê, sem duplicar
- 32Automatizar relatório, auditoria e alerta com as APIs do Analytics
- 33Decidir entre Standard e 360 e governar a propriedade como ativo da empresa
- 34Diagnosticar os onze problemas clássicos do GA4 com método
- 35Entregar o projeto de mensuração e manter a rotina que o conserva