{"id":1237,"date":"2026-04-12T22:40:43","date_gmt":"2026-04-12T22:40:43","guid":{"rendered":"https:\/\/cms.funnelsheet.com\/?p=1237"},"modified":"2026-04-12T22:40:43","modified_gmt":"2026-04-12T22:40:43","slug":"how-to-build-a-cohort-analysis-in-bigquery-from-ga4-raw-event-data","status":"publish","type":"post","link":"https:\/\/cms.funnelsheet.com\/?p=1237","title":{"rendered":"How to Build a Cohort Analysis in BigQuery From GA4 Raw Event Data"},"content":{"rendered":"<p>Analisar coortes a partir de dados brutos do GA4 no BigQuery \u00e9 um movimento estrat\u00e9gico para quem n\u00e3o quer depender apenas dos relat\u00f3rios padr\u00e3o. O desafio real \u00e9 que a reten\u00e7\u00e3o, a convers\u00e3o e a fideliza\u00e7\u00e3o muitas vezes aparecem com n\u00fameros desalinhados entre GA4 e a exporta\u00e7\u00e3o para BigQuery, especialmente quando h\u00e1 m\u00faltiplos touchpoints, cookies, consentimento e identificadores de usu\u00e1rio. Construir uma Cohort Analysis diretamente a partir dos eventos brutos permite mapear exatamente quando o usu\u00e1rio iniciou a intera\u00e7\u00e3o, como evoluiu ao longo do tempo e qual foi o impacto da campanha em cada dia de aquisi\u00e7\u00e3o, mantendo a vis\u00e3o de dados assim\u00e9trica entre canais, m\u00eddia e CRM. Este artigo entra direto na pr\u00e1tica: como estruturar as tabelas, quais campos priorizar, quais armadilhas evitar e como chegar a m\u00e9tricas acion\u00e1veis sem depender de uma \u00fanica fonte de verdade.<\/p>\n<p>Voc\u00ea vai sair com um modelo replic\u00e1vel, capaz de exibir reten\u00e7\u00e3o, receita e engajamento por coorte ao longo de janelas definidas, integrando dados de GA4 com eventos de compra, convers\u00e3o offline e intera\u00e7\u00f5es via WhatsApp ou telefone. O objetivo \u00e9 que, ao terminar, voc\u00ea tenha uma configura\u00e7\u00e3o pronta para diagnosticar desvios, planejar testes de growth e justificar investimentos com dados que resistem a escrut\u00ednio. A tese central \u00e9 simples: coorte bem definida, identidade est\u00e1vel e valida\u00e7\u00e3o cruzada entre fontes reduzem a incerteza na mensura\u00e7\u00e3o e aceleram decis\u00f5es.<\/p>\n<blockquote>\n<p>O maior desafio \u00e9 reconciliar o que GA4 \u201cmostra\u201d por padr\u00e3o com o que acontece quando voc\u00ea mede reten\u00e7\u00e3o pela primeira intera\u00e7\u00e3o a partir do evento de aquisi\u00e7\u00e3o.<\/p>\n<\/blockquote>\n<blockquote>\n<p>Controles de identidade, timezone e consentimento influenciam a qualidade da coorte; sem levar isso em conta, a an\u00e1lise tende a distorcer a trajet\u00f3ria de reten\u00e7\u00e3o e de receita ao longo do tempo.<\/p>\n<\/blockquote>\n<h2>Por que construir uma Cohort Analysis a partir de GA4 brutos no BigQuery<\/h2>\n<h3>Escopo pr\u00e1tico: o que a coorte resolve que os pain\u00e9is usuais n\u00e3o entregam<\/h3>\n<p>Os dashboards nativos costumam sumarizar dados com base em janelas fixas e m\u00e9tricas agregadas que n\u00e3o espelham a realidade do seu funil completo. Com GA4 exportado para BigQuery, voc\u00ea pode decompor a origem da primeira intera\u00e7\u00e3o (coorte de aquisi\u00e7\u00e3o), acompanhar a evolu\u00e7\u00e3o de cada coorte ao longo de dias ou semanas e cruzar com eventos de venda, telefone, WhatsApp ou CRM. O resultado \u00e9 uma vis\u00e3o de reten\u00e7\u00e3o di\u00e1ria, com a capacidade de separar canais, campanhas e evenuais offline que n\u00e3o aparecem no GA4 por si s\u00f3.<\/p>\n<h3>M\u00e9tricas-chave para decis\u00e3o direta<\/h3>\n<p>Reten\u00e7\u00e3o por dia desde a aquisi\u00e7\u00e3o, taxa de convers\u00e3o por coorte, receita por coorte, tempo m\u00e9dio at\u00e9 a convers\u00e3o, e churn rate quando aplic\u00e1vel. Al\u00e9m disso, \u00e9 poss\u00edvel destrinchar pelo canal de aquisi\u00e7\u00e3o, campanha, pa\u00eds ou dispositivo, o que ajuda a identificar gargalos que n\u00e3o surgem nos relat\u00f3rios agregados. Em termos de governan\u00e7a de dados, esse approach facilita a valida\u00e7\u00e3o cruzada com CRM e ciclos de venda, reduzindo a depend\u00eancia de uma \u00fanica fonte de verdade.<\/p>\n<h2>Entendendo o schema GA4 no BigQuery e o que extrair<\/h2>\n<h3>Tabelas e campos-chave<\/h3>\n<p>O GA4 exporta dados para BigQuery em tabelas como events_YYYYMMDD, contendo campos como event_timestamp (em microssegundos), event_name, user_pseudo_id, user_id (quando dispon\u00edvel), event_params e user_properties. A identidade do usu\u00e1rio nem sempre \u00e9 \u00fanica entre plataformas; por isso \u00e9 crucial entender onde cada informa\u00e7\u00e3o est\u00e1 gravada, como os par\u00e2metros de evento carregam dados de campanha (utm_source, utm_medium, utm_campaign) e onde ficam as propriedades de usu\u00e1rio (pa\u00eds, idioma, dispositivo). Al\u00e9m disso, o GA4 mant\u00e9m os dados com salto de fuso hor\u00e1rio e em milissegundos desde a epoch, o que exige alinhamento temporal cuidadoso na constru\u00e7\u00e3o de cohorte.<\/p>\n<h3>Identidade do usu\u00e1rio e coortes<\/h3>\n<p>Para coortes est\u00e1veis, o ideal \u00e9 definir a coorte pela data de aquisi\u00e7\u00e3o do usu\u00e1rio, que pode ser inferida a partir do primeiro evento de intera\u00e7\u00e3o (ex.: first_visit ou primeiro_event_name) ou do primeiro_value de uma propriedade de aquisi\u00e7\u00e3o. Em BigQuery, isso geralmente envolve calcular, por usu\u00e1rio, a menor data de evento correspondente a uma a\u00e7\u00e3o de aquisi\u00e7\u00e3o e usar esse valor como o \u201ccohort_date\u201d. Caso haja uso de user_id ou de identifiers cruzados com CRM, mantenha um mapeamento claro entre esses identificadores para evitar contagem duplicada de usu\u00e1rios dentro da mesma coorte.<\/p>\n<p>Um cuidado importante \u00e9 a consist\u00eancia de timezone. A janela de reten\u00e7\u00e3o por dia deve ser calculada com base na data local da instala\u00e7\u00e3o\/a\u00e7\u00e3o do usu\u00e1rio ou na data de evento em UTC, dependendo do seu modelo de atribui\u00e7\u00e3o. Se a sua estrat\u00e9gia envolve cruzar com dados offline (vendas por telefone, CRM), alinhe o dia de aquisi\u00e7\u00e3o com o dia de contato correspondente para n\u00e3o distorcer a curva de reten\u00e7\u00e3o.<\/p>\n<h2>Guia pr\u00e1tico: passo a passo para construir a coorte<\/h2>\n<h3>Defini\u00e7\u00e3o da coorte e estrutura de sa\u00edda<\/h3>\n<p>Antes de come\u00e7ar, defina: (a) janela de aquisi\u00e7\u00e3o (ex.: 7 dias, 14 dias, 30 dias) e (b) n\u00edvel de granularidade de reten\u00e7\u00e3o (dia 0, dia 1, dia 7, etc.). A sa\u00edda t\u00edpica \u00e9 uma tabela onde cada linha representa uma coorte de aquisi\u00e7\u00e3o (data) e cada coluna representa o dia de acompanhamento (dia 0, dia 1, etc.), com m\u00e9tricas como usu\u00e1rios ativos e receita acumulada.<\/p>\n<h3>Roteiro de auditoria de dados e valida\u00e7\u00e3o<\/h3>\n<p>Verifique se os dados de aquisi\u00e7\u00e3o aparecem na ordem temporal esperada, confirme se n\u00e3o h\u00e1 saltos de timezone que criem deslocamentos indevidos entre dias, e confirme se os usu\u00e1rios n\u00e3o est\u00e3o sendo contados mais de uma vez por grupo. Valide a correspond\u00eancia entre eventos de aquisi\u00e7\u00e3o e a primeira intera\u00e7\u00e3o de cada usu\u00e1rio para evitar coortes infladas.<\/p>\n<h3>Roteiro de configura\u00e7\u00e3o (passos execut\u00e1veis)<\/h3>\n<ol>\n<li>Determinar a janela de aquisi\u00e7\u00e3o apropriada para o seu ciclo de compra (ex.: 7 dias para apps, 30 dias para e-commerce com alto ciclo de venda).<\/li>\n<li>Identificar a m\u00e9trica de aquisi\u00e7\u00e3o mais confi\u00e1vel (ex.: primeiro_event ou first_visit) e extrair a data de aquisi\u00e7\u00e3o por usu\u00e1rio.<\/li>\n<li>Construir uma tabela base de coortes com cada user_pseudo_id associado a uma cohort_date (data da aquisi\u00e7\u00e3o).<\/li>\n<li>Unir a tabela base com os eventos GA4 (events_YYYYMMDD) para capturar a atividade de cada usu\u00e1rio ao longo das janelas de reten\u00e7\u00e3o desejadas.<\/li>\n<li>Criar uma dimens\u00e3o de dia de reten\u00e7\u00e3o (diff between event_date and cohort_date) para cada evento de usu\u00e1rio relevante (reten\u00e7\u00e3o, convers\u00e3o, venda).<\/li>\n<li>Calcular m\u00e9tricas por coorte: usu\u00e1rios ativos por dia de reten\u00e7\u00e3o, convers\u00f5es por dia, receita por coorte (se houver eventos de compra), e reten\u00e7\u00e3o cumulativa.<\/li>\n<li>Segmentar por canal, campanha ou fonte de tr\u00e1fego usando data de aquisi\u00e7\u00e3o (utm_source\/utm_medium) para entender drivers de reten\u00e7\u00e3o por coorte.<\/li>\n<\/ol>\n<p>Essa abordagem facilita a curva de reten\u00e7\u00e3o por coorte, permitindo comparar coortes com caracter\u00edsticas distintas, por exemplo, aquisi\u00e7\u00e3o via Meta vs. Google cuando h\u00e1 diferen\u00e7as de experi\u00eancia do usu\u00e1rio ou de qualidade de dados. A ideia \u00e9 ter uma estrutura repet\u00edvel, com etapas bem definidas para facilitar auditorias futuras e ajustes conforme o neg\u00f3cio muda.<\/p>\n<h3>Exemplo de sa\u00edda e valida\u00e7\u00e3o r\u00e1pida<\/h3>\n<p>Imagine uma coorte iniciada em 2024-11-01 com 2.000 usu\u00e1rios. Ao dia 1, 1.400 ainda realizaram a\u00e7\u00f5es relevantes; dia 7, 900; dia 14, 700. Voc\u00ea ter\u00e1 uma matriz onde cada linha \u00e9 uma coorte e cada coluna \u00e9 o dia de reten\u00e7\u00e3o, permitindo comparar de forma direta a efici\u00eancia de diferentes canais ao longo do tempo. Em termos pr\u00e1ticos, esse layout facilita a identifica\u00e7\u00e3o de onde a reten\u00e7\u00e3o cai mais r\u00e1pido e onde campanhas espec\u00edficas perdem for\u00e7a, sinalizando onde investir em criativos ou ajustes de landing.<\/p>\n<h2>Erros comuns, armadilhas e decis\u00f5es t\u00e9cnicas<\/h2>\n<h3>Armadiadas t\u00e9cnicas que quebram a an\u00e1lise<\/h3>\n<p>Um problema recorrente \u00e9 confundir aquisi\u00e7\u00e3o com primeira convers\u00e3o. Em muitos cen\u00e1rios, a primeira interac\u0327a\u0303o n\u00e3o \u00e9 igual \u00e0 conclus\u00e3o da jornada\u2014especialmente em ciclos longos ou quando h\u00e1 touchpoints offline. Outra armadilha \u00e9 usar apenas user_pseudo_id sem Mapear para user_id ou CRM, o que pode dificultar a reconcilia\u00e7\u00e3o com dados de vendas fechadas. Al\u00e9m disso, a posi\u00e7\u00e3o do fuso hor\u00e1rio pode deslocar dias de reten\u00e7\u00e3o, fraudando medidas como dia 0 e dia 1.<\/p>\n<h3>Quando a abordagem pode n\u00e3o servir de imediato<\/h3>\n<p>Se a base de dados n\u00e3o tem eventos suficientes por usu\u00e1rio ou se h\u00e1 grandes lacunas de dados de aquisi\u00e7\u00e3o (por exemplo, tracking inconsistente entre plataformas), a coorte pode parecer est\u00e1vel mas n\u00e3o refletir a realidade de convers\u00e3o. Em contextos com alta rotatividade de usu\u00e1rios (ex.: apps com churn r\u00e1pido) ou com dados offline significativos, pode ser necess\u00e1rio incorporar m\u00e9todos de imputa\u00e7\u00e3o ou balanceamento de dados para evitar vi\u00e9s na curva de reten\u00e7\u00e3o.<\/p>\n<blockquote>\n<p>Privacidade e consentimento s\u00e3o baristas finos: pequenos ajustes podem causar grandes varia\u00e7\u00f5es no conjunto de dados se n\u00e3o forem tratados com cuidado.<\/p>\n<\/blockquote>\n<blockquote>\n<p>Considere que a coorte \u00e9 t\u00e3o boa quanto a qualidade de identidade: se alguns usu\u00e1rios aparecem com user_pseudo_id duplicado ou com times de aquisi\u00e7\u00e3o desalinhados, a compara\u00e7\u00e3o entre coortes perde valor.<\/p>\n<\/blockquote>\n<h2>Como validar e entregar insights pr\u00e1ticos<\/h2>\n<h3>Valida\u00e7\u00e3o entre fontes e consist\u00eancia<\/h3>\n<p>Compare a curva de reten\u00e7\u00e3o por coorte com as m\u00e9tricas equivalentes nos relat\u00f3rios GA4 e com dados do CRM. O objetivo n\u00e3o \u00e9 replicar exatamente o que o GA4 mostra, mas ter uma converg\u00eancia de sinais: se a coorte A mostra reten\u00e7\u00e3o muito inferior \u00e0 coorte B, verifique se houve ajustes de consent mode, bloqueio de cookies ou problemas de coleta de dados na campanha correspondente.<\/p>\n<h3>Governan\u00e7a e entrega de resultados<\/h3>\n<p>Documente as regras de identidade, janelas de reten\u00e7\u00e3o e a l\u00f3gica de aquisi\u00e7\u00e3o. Salve consultas-chave, mantenha uma c\u00f3pia da defini\u00e7\u00e3o de cada coorte por trimestre e garanta que dashboards de BI (Looker Studio, por exemplo) fa\u00e7am join com a mesma dimens\u00e3o de aquisi\u00e7\u00e3o. Quando poss\u00edvel, valide com dados de vendas ou CRM para confirmar que o valor de receita por coorte faz sentido \u00e0 luz do ciclo de venda.<\/p>\n<p>O pipeline t\u00edpico envolve exportar eventos do GA4 para BigQuery, construir a coorte com base na data de aquisi\u00e7\u00e3o, agregar atividade ao longo de dias de reten\u00e7\u00e3o e, por fim, exportar para um dashboard que permita cruzar com canais, campanhas e CRM. Embora os passos pare\u00e7am lineares, cada decis\u00e3o\u2014como a escolha entre data de aquisi\u00e7\u00e3o baseada em first_visit ou em uma a\u00e7\u00e3o de aquisi\u00e7\u00e3o espec\u00edfica\u2014pode impactar fortemente a interpreta\u00e7\u00e3o das curvas.<\/p>\n<h2>Consolida\u00e7\u00e3o pr\u00e1tica e considera\u00e7\u00f5es finais<\/h2>\n<p>Construir uma Cohort Analysis a partir de GA4 raw event data no BigQuery exige vis\u00e3o clara de identidade, coer\u00eancia temporal e um modelo de dados que suporte a compara\u00e7\u00e3o entre coortes ao longo do tempo. A partir de um conjunto de regras simples de aquisi\u00e7\u00e3o, voc\u00ea obt\u00e9m reten\u00e7\u00e3o, convers\u00e3o e receita por coorte, com a flexibilidade de segmentar por canal e campanha. O valor est\u00e1 em manter o controle de qualidade dos dados, validar com fontes diversas e manter a auditoria como parte do fluxo de entrega.<\/p>\n<p>Se voc\u00ea quiser discutir como adaptar essa abordagem ao seu stack\u2014GA4, GTM Server-Side, CAPI, BigQuery e Looker Studio\u2014ou precisa de um diagn\u00f3stico t\u00e9cnico para o seu ambiente, fale comigo pela Funnelsheet. Vamos alinhar a infraestrutura para que seus dados sejam \u00fateis na pr\u00e1tica, n\u00e3o apenas no papel.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Analisar coortes a partir de dados brutos do GA4 no BigQuery \u00e9 um movimento estrat\u00e9gico para quem n\u00e3o quer depender apenas dos relat\u00f3rios padr\u00e3o. O desafio real \u00e9 que a reten\u00e7\u00e3o, a convers\u00e3o e a fideliza\u00e7\u00e3o muitas vezes aparecem com n\u00fameros desalinhados entre GA4 e a exporta\u00e7\u00e3o para BigQuery, especialmente quando h\u00e1 m\u00faltiplos touchpoints, cookies,&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[479,20,226,13,480],"content_language":[5],"class_list":["post-1237","post","type-post","status-publish","format-standard","hentry","category-blogen","tag-analise-de-coortes","tag-bigquery","tag-conversao","tag-ga4","tag-retencao","content_language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts\/1237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1237"}],"version-history":[{"count":0,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=\/wp\/v2\/posts\/1237\/revisions"}],"wp:attachment":[{"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1237"},{"taxonomy":"content_language","embeddable":true,"href":"https:\/\/cms.funnelsheet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcontent_language&post=1237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}