Modelando dados de marketing
Tabelas limpas e unificadas
Modelando dados de marketing é uma aula grátis de Digital Marketing Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Digital Marketing Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Digital Marketing Academy inclui 4 aulas no total.
Por que modelar?
As tabelas brutas dos conectores são desorganizadas: têm nomes de colunas inconsistentes, moedas misturadas, granularidades diferentes e particularidades específicas de cada plataforma. Consultá-las diretamente produz números incorretos e irreproduzíveis.
A modelagem de dados é a prática de transformar linhas brutas em tabelas limpas, consistentes e prontas para o negócio. É onde ROAS, conversão e receita são definidos uma única vez, corretamente, para que todos os relatórios concordem.
O esquema em estrela
O modelo analítico dominante é o esquema em estrela: uma tabela fato central de eventos mensuráveis cercada por tabelas dimensão que os descrevem. Os fatos contêm números, como gastos, cliques e receita; as dimensões contêm contexto, como campanha, data, canal e cliente.
Esse formato é intuitivo para profissionais de marketing e eficiente para ferramentas de BI, que relacionam um fato a várias dimensões para segmentar métricas por qualquer atributo.
dim_date
|
dim_channel -- fct_ad_spend -- dim_campaign
|
dim_account
fct_ad_spend (facts): impressions, clicks, cost, conversions
dims: who / what / when contextFatos versus dimensões
Uma tabela fato é extensa e aditiva: tem uma linha por evento ou por combinação de dia e campanha, com medidas numéricas que você soma. Uma tabela dimensão é ampla e descritiva: tem uma linha por campanha ou cliente, com atributos pelos quais você filtra e agrupa.
O teste é o seguinte: se você usaria SUM para agregá-lo, ele é um fato; se você usaria GROUP BY para agrupá-lo, ele é uma dimensão. Gasto é um fato; nome da campanha é uma dimensão.
fct_ad_spend dim_campaign
---------------- ----------------
date campaign_id (PK)
campaign_id (FK) campaign_name
cost <-SUM-> channel
clicks <-SUM-> objective
conversions start_dateGranularidade: a primeira decisão
A granularidade é o que uma linha de uma tabela fato representa. Declará-la primeiro é a decisão de modelagem mais importante. Misturar granularidades, como linhas diárias com totais de todo o período, faz com que todos os indicadores posteriores sejam contados em duplicidade e corrompidos.
Declare a granularidade em linguagem simples: uma linha por campanha por dia. Todas as colunas devem então ser verdadeiras nessa granularidade, e todas as cargas devem respeitá-la.
Declared grain: one row per campaign per day
-- enforce uniqueness on the grain
SELECT date, campaign_id, COUNT(*)
FROM fct_ad_spend
GROUP BY 1,2
HAVING COUNT(*) > 1; -- must return 0 rowsModelos de preparação
Antes dos fatos e das dimensões, crie modelos de preparação: um para cada tabela de origem, renomeando as colunas de acordo com um padrão, convertendo os tipos e padronizando as unidades, como centavos para dólares e datas em UTC. Um modelo de preparação corresponde a uma tabela bruta, nada além disso.
A preparação é a camada de limpeza. Ela isola as particularidades da fonte para que seus modelos posteriores nunca precisem saber que a Meta chama isso de gasto e o Google chama isso de custo.
-- stg_google_ads__spend
SELECT
date AS spend_date,
campaign_id,
'google' AS channel,
cost_micros / 1000000 AS cost, -- micros -> dollars
clicks,
conversions
FROM raw.google_ads__campaign_stats;Unificação de canais
Cada plataforma de anúncios gera relatórios de uma maneira diferente, mas depois da preparação todas compartilham um formato comum. O próximo modelo as combina em uma única tabela fato de gastos multicanal, a base dos relatórios combinados.
É essa tabela única que torna possível calcular o ROAS total. Com todos os canais padronizados nas mesmas colunas, uma única consulta soma simultaneamente os gastos do Google, da Meta e do TikTok.
-- fct_ad_spend: union all channels
SELECT * FROM stg_google_ads__spend
UNION ALL
SELECT * FROM stg_meta_ads__spend
UNION ALL
SELECT * FROM stg_tiktok_ads__spend;
-- now: SUM(cost) GROUP BY channel worksDimensões conformadas
Para análises multicanal, as dimensões precisam ser conformadas: uma dim_date e uma dim_channel compartilhadas às quais todos os fatos se relacionem da mesma forma. Assim, “receita por mês por canal” significa a mesma coisa, seja a fonte anúncios, e-mail ou web.
As dimensões conformadas permitem colocar gastos e receita lado a lado em um único gráfico. Sem elas, os relacionamentos ficam desalinhados e os totais silenciosamente divergem.
Conformed dims shared across facts:
dim_date -> joined by every fact on date
dim_channel -> 'google','meta','email','organic'
dim_campaign -> unified campaign keys
-> spend and revenue line up on the same axesAtribuição em SQL
A atribuição distribui o crédito por uma conversão entre os pontos de contato. A atribuição de último clique é a mais simples: a fonte de marketing final antes da conversão recebe todo o crédito. Atribuições de primeiro clique, linear e baseada em posição distribuem o crédito de maneiras diferentes.
Em um armazém, você implementa a atribuição como um modelo, não como uma caixa-preta da plataforma. Com dados detalhados de eventos do GA4, você pode aplicar funções de janela aos pontos de contato de cada usuário e usar qualquer regra, comparando os resultados entre os modelos de forma honesta.
-- last non-direct click per conversion
WITH touches AS (
SELECT user_id, channel, event_time,
ROW_NUMBER() OVER (PARTITION BY user_id
ORDER BY event_time DESC) AS rn
FROM web_touchpoints
WHERE channel <> 'direct'
)
SELECT channel, COUNT(*) FROM touches WHERE rn=1
GROUP BY 1;Dimensões que mudam lentamente
Os atributos das dimensões mudam com o tempo: o responsável pelo orçamento de uma campanha muda, o nível de um cliente aumenta. Uma dimensão que muda lentamente do Tipo 2 mantém o histórico adicionando uma nova linha com datas de validade, em vez de substituir a anterior.
Isso é importante para relatórios precisos em um momento específico. Para saber em qual segmento um cliente estava quando converteu, você precisa da versão da dimensão que era válida naquele momento, não da versão de hoje.
dim_customer (SCD Type 2)
cust_id tier valid_from valid_to is_current
101 free 2026-01-01 2026-04-01 false
101 pro 2026-04-01 9999-12-31 true
-- join on event_date BETWEEN valid_from AND valid_toTestes e documentação
Os modelos são código, portanto devem ser testados. Ferramentas como o dbt permitem verificar se as chaves são únicas e não nulas, se os valores de canal pertencem a um conjunto aceito e se os relacionamentos entre as tabelas são válidos.
Os testes detectam deriva do esquema e relacionamentos incorretos antes que cheguem a um painel. Juntamente com a documentação e a linhagem geradas automaticamente, eles tornam o modelo confiável e facilitam a integração de novos membros, em vez de deixá-lo como uma caixa-preta frágil.
# dbt schema test
models:
- name: fct_ad_spend
columns:
- name: campaign_id
tests: [not_null]
- name: channel
tests:
- accepted_values:
values: ['google','meta','tiktok']Tabelas analíticas: a camada final
A camada superior é formada pelas tabelas analíticas: tabelas prontas para o negócio, estruturadas para públicos específicos, como uma tabela marketing_performance que já combina os gastos com a receita e calcula o ROAS por canal e por dia.
As ferramentas de BI leem apenas as tabelas analíticas. Ao fazer as combinações e agregações previamente nessa camada, os painéis continuam rápidos e econômicos, e todos os analistas passam a usar as mesmas definições corretas.
-- marts.marketing_performance (1 row / day / channel)
SELECT s.spend_date, s.channel,
SUM(s.cost) AS spend,
SUM(r.revenue) AS revenue,
SAFE_DIVIDE(SUM(r.revenue), SUM(s.cost)) AS roas
FROM fct_ad_spend s
LEFT JOIN fct_revenue r USING (spend_date, channel)
GROUP BY 1,2;Verificação rápida
Você está criando uma tabela de fatos para o desempenho de anúncios e precisa evitar a contagem dupla. Qual é a única coisa mais importante que você deve declarar antes de escrever qualquer coluna?
Recapitulação
A modelagem transforma tabelas brutas desorganizadas em dados confiáveis e prontos para o negócio por meio de camadas: a preparação limpa e padroniza cada origem, os fatos e as dimensões conformadas formam um esquema em estrela, e os data marts fazem as junções previamente para o BI.
Declare primeiro a granularidade, una os canais para obter métricas combinadas, implemente a atribuição e o histórico SCD Tipo 2 em SQL e teste cada modelo para que números incorretos gerem erros visíveis, em vez de chegarem a um painel.
Perguntas Frequentes
A aula “Modelando dados de marketing” é grátis?
Sim — o texto completo de “Modelando dados de marketing” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Digital Marketing Academy, atualize para CoddyKit PRO. O curso de Digital Marketing Academy inclui 4 aulas no total.
O que vou aprender em “Modelando dados de marketing”?
Tabelas limpas e unificadas Você pratica Digital Marketing Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Digital Marketing Academy?
Nenhuma experiência prévia é necessária. Digital Marketing Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Modelando dados de marketing”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Digital Marketing Academy?
Sim. Cada aula de Digital Marketing Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que usar um armazém de dados
- ETL e conectores
- Modelando dados de marketing
- Painéis que geram ação