offdataai
Marketing & AdTech · data model template

AdTech Programmatic Analytics data model

Kimball warehouse for AdTech: high-volume bid, impression, and conversion transaction facts over conformed advertiser/campaign/creative/publisher/placement/audience/device dimensions on BigQuery, carrying cost, revenue, viewability, and multi-touch attribution credit.

Programmatic advertising analytics covering real-time bids, served impressions, and attributed conversions over conformed campaign, creative, advertiser, publisher, placement, audience, and device dimensions for RTB win-rate, delivery, viewability, ROAS, and attribution analytics. 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
11
tables
117
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

deliverybiddingattributionconformed_dimensions

Design decisions

  • Three separate transaction facts at native grains

    Bids, impressions, and conversions occur at vastly different volumes and have distinct measures (bid price, media cost, conversion value); separate facts avoid sparse columns and mismatched additivity.

  • Conformed dimensions across the funnel

    Sharing campaign, creative, advertiser, publisher, audience, and device dimensions lets win-rate, delivery, and ROAS be drilled consistently from bid through conversion.

  • Audience sensitive-category flag and no device-level PII

    GDPR/CCPA restrict targeting on special categories and storing raw identifiers; the audience grain carries a sensitivity flag and device is modelled as a non-identifying profile rather than a user.

  • Fractional attribution credit on the conversion fact

    Multi-touch attribution distributes credit across touchpoints; an attribution_credit measure plus model/window makes ROAS allocation explicit and re-aggregatable.

Tables in the AdTech Programmatic 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 (3)

fct_bid

Grain: one row per real-time bid request response

RTB transaction fact — one row per bid opportunity for win-rate and bid-density analytics.

ColumnTypeKeys
bid_keybigintPK
date_keybigint
campaign_keybigint
creative_keybigint
advertiser_keybigint
publisher_keybigint
placement_keybigint
audience_keybigint
device_keybigint
bid_request_idvarchar
bid_timestamptimestamp
bid_price_cpmdecimal
floor_price_cpmdecimal
bid_countsmallint
is_bid_submittedboolean
is_wonboolean
clearing_price_cpmdecimal
no_bid_reasonvarchar

fct_impression

Grain: one row per served ad impression

Impression transaction fact — the core delivery grain carrying cost, revenue, and viewability.

ColumnTypeKeys
impression_keybigintPK
date_keybigint
campaign_keybigint
creative_keybigint
advertiser_keybigint
publisher_keybigint
placement_keybigint
audience_keybigint
device_keybigint
impression_idvarchar
auction_idvarchar
impression_timestamptimestamp
impression_countsmallint
media_costdecimal
data_costdecimal
total_costdecimal
revenuedecimal
is_viewableboolean
is_clickedboolean
viewable_secondsdecimal
is_fraud_flaggedboolean

fct_conversion

Grain: one row per attributed conversion

Conversion transaction fact for attribution, ROAS, and CPA analytics.

ColumnTypeKeys
conversion_keybigintPK
date_keybigint
campaign_keybigint
creative_keybigint
advertiser_keybigint
publisher_keybigint
audience_keybigint
device_keybigint
conversion_idvarchar
conversion_timestamptimestamp
conversion_typevarchar
attribution_modelvarchar
attribution_window_hoursinteger
conversion_countsmallint
conversion_valuedecimal
attribution_creditdecimal
is_view_throughboolean

Dimension tables (8)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
day_of_weeksmallint
week_numbersmallint
month_numbersmallint
quartersmallint
yearsmallint
is_weekendboolean

dim_advertiser

Grain: one row per advertiser per SCD2 version

SCD type 2

ColumnTypeKeys
advertiser_keybigintPK
advertiser_idvarcharBK
advertiser_namevarchar
industry_verticalvarchar
agency_namevarchar
account_managervarcharPII
billing_countryvarchar
is_activeboolean

dim_campaign

Grain: one row per ad campaign per SCD2 version

SCD type 2

ColumnTypeKeys
campaign_keybigintPK
campaign_idvarcharBK
campaign_namevarchar
campaign_objectivevarchar
buy_typevarchar
pricing_modelvarchar
flight_start_datedate
flight_end_datedate
budget_amountdecimal
campaign_statusvarchar

dim_creative

Grain: one row per ad creative

ColumnTypeKeys
creative_keybigintPK
creative_idvarcharBK
creative_namevarchar
creative_formatvarchar
ad_sizevarchar
duration_secondssmallint
landing_urlvarchar
is_third_party_tagboolean

dim_publisher

Grain: one row per publisher/supply source

ColumnTypeKeys
publisher_keybigintPK
publisher_idvarcharBK
publisher_namevarchar
supply_sourcevarchar
inventory_typevarchar
domainvarchar
is_brand_safeboolean

dim_placement

Grain: one row per ad placement/slot

ColumnTypeKeys
placement_keybigintPK
placement_idvarcharBK
placement_namevarchar
ad_unitvarchar
positionvarchar
environmentvarchar
is_viewable_positionboolean

dim_audience

Grain: one row per audience segment

ColumnTypeKeys
audience_keybigintPK
audience_idvarcharBK
audience_namevarchar
segment_typevarchar
data_providervarchar
targeting_categoryvarchar
is_sensitive_categoryboolean

dim_device

Grain: one row per device profile

ColumnTypeKeys
device_keybigintPK
device_codevarcharBK
device_typevarchar
operating_systemvarchar
browservarchar
connection_typevarchar

Relationships

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

  • fct_bid.date_key → dim_date (many-to-one)
  • fct_bid.campaign_key → dim_campaign (many-to-one)
  • fct_bid.creative_key → dim_creative (many-to-one)
  • fct_bid.advertiser_key → dim_advertiser (many-to-one)
  • fct_bid.publisher_key → dim_publisher (many-to-one)
  • fct_bid.placement_key → dim_placement (many-to-one)
  • fct_bid.audience_key → dim_audience (many-to-one)
  • fct_bid.device_key → dim_device (many-to-one)
  • fct_impression.date_key → dim_date (many-to-one)
  • fct_impression.campaign_key → dim_campaign (many-to-one)
  • fct_impression.creative_key → dim_creative (many-to-one)
  • fct_impression.advertiser_key → dim_advertiser (many-to-one)
  • fct_impression.publisher_key → dim_publisher (many-to-one)
  • fct_impression.placement_key → dim_placement (many-to-one)
  • fct_impression.audience_key → dim_audience (many-to-one)
  • fct_impression.device_key → dim_device (many-to-one)
  • fct_conversion.date_key → dim_date (many-to-one)
  • fct_conversion.campaign_key → dim_campaign (many-to-one)
  • fct_conversion.creative_key → dim_creative (many-to-one)
  • fct_conversion.advertiser_key → dim_advertiser (many-to-one)
  • fct_conversion.publisher_key → dim_publisher (many-to-one)
  • fct_conversion.audience_key → dim_audience (many-to-one)
  • fct_conversion.device_key → dim_device (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