# M365Marketing — Schema

> Synthetic multi-channel marketing campaign performance dataset. Four tables joined on `campaign_id`, `channel_id`, and `segment_id`. 78 weeks (18 months) ending 2026-05-31.

## Tables

### `channels.csv` (5 rows)

| Column | Type | Notes |
| --- | --- | --- |
| `channel_id` | string | Primary key. |
| `channel_name` | string | Display name. |
| `attribution_window` | string | **Known imperfection**: different channels use different attribution windows. Reconciling conversions across them is a chapter exercise (Ch 11). |

### `segments.csv` (10 rows)

| Column | Type | Notes |
| --- | --- | --- |
| `segment_id` | string | Primary key. |
| `segment_name` | string | Display name. |
| `industry` | string | One of 8 industries. |
| `size_band` | string | `Enterprise+` or `Mid-Market`. |
| `tam_estimate_accounts` | integer | Total addressable market size for the segment. |

### `campaigns.csv` (24 rows)

| Column | Type | Notes |
| --- | --- | --- |
| `campaign_id` | string | Primary key. Format `CMP-NNNN`. |
| `campaign_name` | string | Synthetic name. |
| `channel_id` | string | FK → `channels.channel_id`. |
| `segment_id` | string | FK → `segments.segment_id`. |
| `attribution_window` | string | Denormalized from the channel (reflects real warehouse design). |
| `weekly_budget_usd` | integer | Planned weekly spend; actual varies in `performance.csv`. |
| `status` | string | `active`, `paused`, or `ended`. Ended campaigns have no performance rows. |

### `performance.csv` (~1,800 rows)

| Column | Type | Notes |
| --- | --- | --- |
| `week_starting` | date (ISO) | First day of the ISO week (Monday). |
| `campaign_id` | string | FK → `campaigns.campaign_id`. |
| `impressions` | integer | 0 for paused weeks. |
| `clicks` | integer | 0 for paused weeks. |
| `conversions` | integer | 0 for paused weeks. |
| `spend_usd` | integer | 0 for paused weeks. |
| `note` | string | `paused`, `platform-outage`, or empty. **Diagnostic**: 3 campaigns have a `platform-outage` week — useful for anomaly-detection exercises. |

## Suggested chapter exercises

- **Chapter 3 (story)**: Build the Monday-morning reallocation narrative — which campaigns should grow, hold, or shrink? Pair with the [M365Marketing starter BRD](../../appendix-e/m365marketing-starter.md).
- **Chapter 5 (focus and decluttering)**: Strip the cross-channel performance dashboard to a single answer per channel.
- **Chapter 10 (AI visuals — anomaly detection)**: Find the three platform-outage weeks. Compare anomaly-detection sensitivity at different thresholds.
- **Chapter 11 (prep for AI)**: Reconcile the attribution-window differences across channels. This is the canonical exercise for "AI data schemas" — the conversion metric is the same name across channels but means different things.
- **Chapter 12 (dashboard design)**: Compose the weekly portfolio dashboard for the Director of Product Marketing.

## Reproducibility

Generated by `scripts/datasets/generate-m365marketing.js` using a seeded PRNG. Source seed: `0x4D6B7400`.
