offdataai
Marketing & AdTech · data model template

Marketing & Web Analytics data model

Source-agnostic Kimball starter for marketing analytics: session and pageview clickstream, conversions with attribution, daily ad-spend snapshots, and email engagement over conformed visitor, campaign, channel, page, device, and geo dimensions. For platform-specific depth use the GA4, Cross-Channel Paid-Media, Email Marketing, HubSpot, or Unified Marketing templates.

Digital marketing and web analytics: clickstream sessions and pageviews, multi-touch conversions, paid-ad spend, and email engagement — a Kimball star schema with conformed visitor, campaign, channel, and page dimensions supporting attribution, funnel, ROAS, and CAC analysis. It is a Kimball dimensional model: fact tables at a declared grain surrounded by conformed dimensions, ready for BI tools and a semantic layer.

KimballMarketing & AdTechGDPRCCPA
13
tables
101
columns
23
relationships
1
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: BigQuery). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

behavioracquisitionlifecycleconformed_dimensions

Design decisions

  • Session and pageview as separate fact grains

    Sessions support attribution and bounce analysis; pageviews support content and scroll-depth analysis — different grains, different facts.

  • Daily ad-spend snapshot

    Spend, impressions, and clicks are reported per campaign/creative per day; a snapshot fact powers ROAS and CAC without event explosion.

  • Visitor email hashed until identified

    Anonymous visitors are tracked by cookie; email is captured only on identification and is hashed for privacy compliance.

Tables in the Marketing & Web Analytics model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Fact tables (5)

fct_sessions

Grain: one row per web/app session

Session-grain fact for engagement + attribution.

ColumnTypeKeys
session_keybigintPK
date_keybigint
visitor_keybigint
channel_keybigint
campaign_keybigint
device_keybigint
geo_keybigint
session_idvarchar
session_start_timestamptimestamp
duration_secondsinteger
pageview_countinteger
is_bounceboolean
is_convertedboolean
landing_page_keybigint

fct_pageviews

Grain: one row per page view

ColumnTypeKeys
pageview_keybigintPK
date_keybigint
visitor_keybigint
page_keybigint
device_keybigint
session_idvarchar
view_timestamptimestamp
time_on_page_secondsinteger
scroll_depth_pctsmallint
is_entranceboolean
is_exitboolean

fct_conversions

Grain: one row per conversion event

ColumnTypeKeys
conversion_keybigintPK
date_keybigint
visitor_keybigint
channel_keybigint
campaign_keybigint
session_idvarchar
conversion_typevarchar
conversion_valuedecimal
order_idvarchar
attribution_modelvarchar

fct_ad_spend

Grain: one row per campaign per creative per day (snapshot)

Daily ad-spend snapshot for ROAS / CAC.

ColumnTypeKeys
date_keybigint
campaign_keybigint
channel_keybigint
ad_creative_keybigint
impressionsbigint
clicksinteger
spenddecimal
conversionsinteger
conversion_valuedecimal

fct_email_events

Grain: one row per email engagement event

ColumnTypeKeys
email_event_keybigintPK
date_keybigint
visitor_keybigint
campaign_keybigint
email_idvarchar
event_typevarchar
event_timestamptimestamp
link_urlvarchar

Dimension tables (7)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
day_of_weeksmallint
week_of_yearsmallint
month_numbersmallint
quartersmallint
yearsmallint
is_weekendboolean

dim_visitor

Grain: one row per visitor per SCD2 version

SCD type 2

ColumnTypeKeys
visitor_keybigintPK
visitor_idvarcharBK
anonymous_idvarchar
emailvarcharPII
is_identifiedboolean
first_seen_datedate
countryvarchar
lifecycle_stagevarchar

dim_campaign

Grain: one row per marketing campaign

ColumnTypeKeys
campaign_keybigintPK
campaign_idvarcharBK
campaign_namevarchar
sourcevarchar
mediumvarchar
campaign_typevarchar
start_datedate
end_datedate
budgetdecimal

dim_page

Grain: one row per page

ColumnTypeKeys
page_keybigintPK
page_pathvarcharBK
page_titlevarchar
page_typevarchar
site_sectionvarchar

dim_device

Grain: one row per device profile

ColumnTypeKeys
device_keybigintPK
device_typevarchar
operating_systemvarchar
browservarchar
form_factorvarchar

dim_geo

Grain: one row per geography

ColumnTypeKeys
geo_keybigintPK
countryvarcharBK
regionvarchar
cityvarchar
metro_areavarchar

dim_ad_creative

Grain: one row per ad creative

ColumnTypeKeys
ad_creative_keybigintPK
creative_idvarcharBK
creative_namevarchar
ad_formatvarchar
campaign_keybigint

Lookup tables (1)

dim_channel

Grain: one row per acquisition channel

ColumnTypeKeys
channel_keybigintPK
channel_codevarcharBK
channel_namevarchar
channel_groupvarchar

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • dim_ad_creative.campaign_key → dim_campaign (many-to-one)
  • fct_sessions.date_key → dim_date (many-to-one)
  • fct_sessions.visitor_key → dim_visitor (many-to-one)
  • fct_sessions.channel_key → dim_channel (many-to-one)
  • fct_sessions.campaign_key → dim_campaign (many-to-one)
  • fct_sessions.device_key → dim_device (many-to-one)
  • fct_sessions.geo_key → dim_geo (many-to-one)
  • fct_sessions.landing_page_key → dim_page (many-to-one)
  • fct_pageviews.date_key → dim_date (many-to-one)
  • fct_pageviews.visitor_key → dim_visitor (many-to-one)
  • fct_pageviews.page_key → dim_page (many-to-one)
  • fct_pageviews.device_key → dim_device (many-to-one)
  • fct_conversions.date_key → dim_date (many-to-one)
  • fct_conversions.visitor_key → dim_visitor (many-to-one)
  • fct_conversions.channel_key → dim_channel (many-to-one)
  • fct_conversions.campaign_key → dim_campaign (many-to-one)
  • fct_ad_spend.date_key → dim_date (many-to-one)
  • fct_ad_spend.campaign_key → dim_campaign (many-to-one)
  • fct_ad_spend.channel_key → dim_channel (many-to-one)
  • fct_ad_spend.ad_creative_key → dim_ad_creative (many-to-one)
  • fct_email_events.date_key → dim_date (many-to-one)
  • fct_email_events.visitor_key → dim_visitor (many-to-one)
  • fct_email_events.campaign_key → dim_campaign (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time