Marketing Campaign and Sales Impact (ASIA)
Overview
A decade of marketing and sales at weekly grain, where the product is the lift mechanism itself. Twelve invented consumer-goods brands sell through ten invented Asian retailers; 472 campaigns buy television, digital, social, retailer media networks and print across 548 weeks; and every week's actual units are built as baseline plus seasonality plus per-channel lift plus residual. The decomposition ships as its own table and the build asserts it sums exactly, row by row, except one documented brand-quarter whose attribution window is double counted: the digital and social columns both claim an overlapping conversion window, the rows sum above actuals by the recorded excess, and finding the quarter is the exercise. Lift carries diminishing returns, asserted on the shipped rows: lift per dollar falls as spend rises. The channel mix moves the way the Asian markets moved, asserted: social becomes the biggest line on the plan while print collapses and retailer media networks double, the seasonal peak sits in the early-year festival quarter, and the 2020 commerce shift lifts an online channel that was already big and keeps growing. Retailer sales split the brand-week actual exactly; one retailer reports weeks starting Sunday while everyone else starts Monday, so a date join silently drops it, and one campaign's tracking failed in flight, spending money against zero measured impressions. Built for media-mix modelling, attribution teaching, incrementality analytics, retail analytics, ETL pipelines and BI logic, with ground truth included. The licence and disclosure sections state the provenance of the data.
Row Counts by Table
Counted from the files that ship, not estimated.
| Table | Rows |
|---|---|
| mka_brands | 12 |
| mka_retailers | 10 |
| mka_channels | 5 |
| mka_weeks | 548 |
| mka_campaigns | 472 |
| mka_media_weekly | 22,995 |
| mka_weekly_sales | 65,760 |
| mka_lift_decomposition | 6,576 |
Table Relationships
One parent record and seven child tables, each joined back on the same key.
Schema
Every table ships with typed columns, referential integrity, and documentation.
| Column | Type | Description |
|---|---|---|
| brand_id | varchar(8) | Brand key. Primary key. |
| brand_name | varchar(16) | Generated brand name. Collisions with real manufacturers and famous brands are a build failure. |
| category | varchar(24) | beverages, snacks, home_care, personal_care, packaged_food or pet_care. |
| base_weekly_units | integer | The brand base weekly volume the lift mechanism builds on. |
| launch_price_usd | numeric(6,2) | Unit price at the start of the decade, in dollars. |
| demand_pattern | varchar(24) | seasonal_peaked or steady. |
| Column | Type | Description |
|---|---|---|
| retailer_id | varchar(8) | Retailer key. Primary key. |
| retailer_name | varchar(24) | Generated retailer name. Collisions with real retailers are a build failure. |
| retailer_format | varchar(24) | The retailer format the split weights follow. |
| week_convention | varchar(16) | monday_start, or sunday_start for the one documented defect retailer whose week dates sit one day early. |
| Column | Type | Description |
|---|---|---|
| channel_code | varchar(16) | Channel key. Primary key: TV, DIGITAL, SOCIAL, RETAIL_MEDIA or PRINT. |
| channel_name | varchar(32) | The channel in words. |
| typical_cpm_usd | integer | Typical cost per thousand impressions in dollars, the invented planning figure. |
| saturation_lift_pct | numeric(5,1) | The lift ceiling of the channel as percent of brand base volume, the diminishing-returns asymptote. |
| Column | Type | Description |
|---|---|---|
| week_id | varchar(8) | Week row key. Primary key. |
| week_index | integer | The week number every table joins on, 1 to 548. |
| week_start_date | date | The Monday the week starts, the spine convention. |
| year | integer | Calendar year of the week start. |
| quarter | varchar(16) | Calendar quarter of the week start. |
| Column | Type | Description |
|---|---|---|
| campaign_id | varchar(8) | Campaign key. Primary key. |
| brand_id | varchar(8) | The brand the campaign belongs to. |
| campaign_name | varchar(40) | Generated campaign name. |
| objective | varchar(24) | always_on, awareness, conversion, seasonal_push or launch_support. |
| start_week_index | integer | First week of the campaign. |
| end_week_index | integer | Last week of the campaign. |
| channel_list | varchar(48) | The channels the campaign buys, pipe separated. |
+1 more columns in mka_campaigns. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| media_id | varchar(16) | Media row key. Primary key. |
| campaign_id | varchar(8) | The campaign the row belongs to. |
| brand_id | varchar(8) | The brand, denormalised. |
| channel_code | varchar(16) | The channel bought. |
| week_index | integer | The week of the activity. |
| spend_usd | integer | Spend in dollars for the campaign-channel-week. |
| impressions | integer | Measured impressions. Zero only in the one documented tracking-failure campaign. |
+2 more columns in mka_media_weekly. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| sale_id | varchar(16) | Sales row key. Primary key. |
| brand_id | varchar(8) | The brand. |
| retailer_id | varchar(8) | The retailer. |
| week_index | integer | The week. Join on this, not on the date. |
| week_start_date | date | The week start in the RETAILER own convention: one documented retailer reports Sunday-start dates one day before the spine. |
| units_sold | integer | Units sold. Retailer units sum exactly to the brand-week actual in the decomposition. |
| avg_unit_price_usd | numeric(6,2) | Average unit price in dollars that week. |
+2 more columns in mka_weekly_sales. The full schema ships with the download.
| Column | Type | Description |
|---|---|---|
| decomposition_id | varchar(8) | Decomposition row key. Primary key. |
| brand_id | varchar(8) | The brand. |
| week_index | integer | The week. |
| baseline_units | integer | Unpromoted base demand, including the documented 2020 pantry effects. |
| seasonality_units | integer | Seasonal swing around the baseline, signed. |
| tv_lift_units | integer | Units attributed to television that week. |
| digital_lift_units | integer | Units attributed to digital. In the documented double-counted brand-quarter this column claims part of an overlapping conversion window. |
+6 more columns in mka_lift_decomposition. The full schema ships with the download.
Sample Data
A snapshot of real rows from the dataset (values are fully synthetic).
| decomposition_id | brand_id | week_index | baseline_units | seasonality_units | tv_lift_units | digital_lift_units | social_lift_units | retail_media_lift_units | print_lift_units | actual_units |
|---|---|---|---|---|---|---|---|---|---|---|
| DC0001 | BR01 | 1 | 224970 | 56213 | 5274 | 4400 | 0 | 0 | 967 | 292181 |
| DC0002 | BR01 | 2 | 225093 | 65397 | 5539 | 5253 | 0 | 0 | 896 | 299675 |
| DC0003 | BR01 | 3 | 225314 | 74429 | 5954 | 4351 | 0 | 0 | 970 | 308270 |
Version History
| v1.0.0 | 2026-08-11 | First release. 12 brands, 10 Asian retailers, 472 campaigns, five channels, 548 weeks, with the exact lift decomposition shipped as the answer key, 2016-01-04 to 2026-06-29. |
Related Datasets
Marketing Campaign and Sales Impact (EU)
Marketing & AdvertisingA marketing measurement dataset with the answer key built in: 12 invented consumer-goods brands, 10 invented European retailers, 472 campaigns buying five channels across 548 weeks from 2016 to mid 2026, and weekly sales built as baseline plus seasonality plus channel lift plus residual, with the exact decomposition shipped as its own table.
Marketing Campaign and Sales Impact (US)
Marketing & AdvertisingA marketing measurement dataset with the answer key built in: 12 invented consumer-goods brands, 10 invented retailers, 472 campaigns buying five channels across 548 weeks from 2016 to mid 2026, and weekly sales built as baseline plus seasonality plus channel lift plus residual, with the exact decomposition shipped as its own table.