type: schema parent: media-planner name: Canonical Media Plan Schema (v1.0.0) slug: canonical-mp-schema status: ready created: 2026-05-05 last_updated: 2026-05-05 sources:
Single-source-of-truth опис структури медіапланів Deltamedical після deep-parse двох еталонних XLSX (Menopace + Affida MP 2026). Призначений для AI-генератора у mp-creation.
┌─────────────────────────────────────────────────────────────────┐
│ HEADER ZONE (rows 1-13) │
│ - Client/Project/Period/Geo (col B+D) │
│ - Tax multipliers (col D): Курс USD, НДС, ЦПХ, ФОП │
│ - Channel rollup table (TOTAL BUDGET + 7 channel rows) │
│ - Month header F-Q ( JAN plan ... DEC plan), R = annual total │
├─────────────────────────────────────────────────────────────────┤
│ KPI SUMMARY BLOCKS (rows 15-57) │
│ ▸ Reach / Views (header row + ~10 rollup rows) │
│ ▸ Clicks (header row + ~13 rollup rows) │
│ ▸ Impressions (header row + ~13 rollup rows) │
├─────────────────────────────────────────────────────────────────┤
│ CHANNEL DETAIL SECTIONS (rows 60-235) │
│ ▸ PAID SEARCH (4 sub-blocks × 7 rows = 28 rows) │
│ ▸ META (6 sub-blocks × 10 rows = 60 rows) │
│ ▸ Google YT (4 sub-blocks: 2×10 + 2×7 = 34 rows) │
│ ▸ GDN (2 sub-blocks × ~10 rows = 20 rows) │
│ ▸ BLOGGERS (2 sub-blocks × 4 rows = 8 rows) │
│ ▸ SERVICES (1 sub-block × 8 rows) │
├─────────────────────────────────────────────────────────────────┤
│ FOOTER NOTES (optional, free-text rows after 230) │
└─────────────────────────────────────────────────────────────────┘
Загальні розміри: 235 рядків × 37 колонок (Menopace), 226 × 37 (Affida).
| Поле | Menopace cell | Affida cell | Обов'язковість | Приклад значення |
|---|---|---|---|---|
| Client | B3 | B1 | required | "Client: Delta Medical" |
| Period | D3 | D1 | required | "Period: 2026" |
| Project (brand) | B5 | B2 | required | "Project: Menopace" / "Project: Affida" |
| Geo | D5 | D2 | required | "UA" |
| Курс USD | D7 | D4 | required | 0 (за замовчуванням, бо все вже у UAH) |
| НДС | D8 | D5 | required | 1.2 |
| Налог ЦПХ | D9 | D6 | required | 1.55 |
| Налог ФОП | D10 | D7 | required | 1.06 |
Critical:
НДС($D$8у Menopace,$D$5у Affida) використовується в кожній формулі бюджету через absolute reference. AI-генератор має зберігати цю $-anchor.
" JAN plan" … " DEC plan" (зі зведеним пробілом на початку — сторонній квирк, треба зберегти)8 фіксованих рядків (одразу після month-header):
| slug | Label | Формула pattern |
|---|---|---|
total_budget |
TOTAL BUDGET | =SUM(F<rollup_rows>,) |
google_search |
Google Search (пошукова) | =SUM(F<budget_rows_PAID_SEARCH>) |
meta_fb_inst |
Meta FB/INST | =SUM(F<budget_rows_META>) |
google_youtube |
Google Youtube | =SUM(F<budget_rows_Google_YT>) |
services |
SERVICES (Viber, Tabletki...) | =F<services_total> |
bloggers |
BLOGGERS | =SUM(F<bloggers_budgets>) |
gdn_kms |
GDN/КМС | =F<gdn_total> |
total_google |
Total Google | =SUM(google_search, google_youtube, gdn_kms) |
Реальний приклад (Menopace, row 6, F стовпчик = JAN):
F6 = =SUM(F7,F8,F9,F10,F11,F12,) → 698 289.6 UAH
Усі 3 блоки мають однакову структуру: label row (col F) → header row (місяці) → data rows (rollup).
TOTAL REACH Не поддается просчету × 12
PAID SEARCH Не поддается просчету × 12
FB|INST 1..6 =SUM(<reach_row_of_META_subblock_N>)
BLOGGERS =SUM(F<bloggers_reach_rows>)
"Не поддается просчету" — дослівний placeholder для випадків де reach не рахується (paid search). AI має підтримати.
TOTAL CLICKS =SUM(F<own_data_rows>)
PAID SEARCH =SUM(<click_rows_of_PAID_SEARCH_subblocks>)
FB|INST 1..6 =F<click_row_of_META_subblock_N>
YT VIDEO a..d =F<click_row_of_Google_YT_subblock_N>
GDN/КМС =SUM(<click_rows_of_GDN_subblocks>)
Те саме що Clicks але з Impressions row кожного під-блоку.
Sub-block назви (col C): Брендовые, Tематические, Конкуренты, Товарная (Медизин).
Структура одного sub-block:
| Δrow | B | C | D | E (KPI) | F (JAN) — приклад/формула |
|---|---|---|---|---|---|
| 0 | Adwords Search | <name> | Impressions | =IFERROR(F<click>/F<ctr>,0) |
|
| 1 | Click | input number (e.g. 7500) | |||
| 2 | CTR, % | input percent (e.g. 0.22) | |||
| 3 | CPC | CPC | input UAH (e.g. 4) | ||
| 4 | CPM | =IFERROR(F<budget>/(F<imp>/1000),0) |
|||
| 5 | Креатив | Коммент | text | ||
| 6 | Бюджет | UAH | =F<cpc>*F<click>*$D$<nds> |
Sub-block назви (col C): Взаємодія, Охватная (×2), Нативка, Специалисты+видео, Ремаркетинг.
Структура одного sub-block:
| Δrow | B | E (KPI) | F (приклад) |
|---|---|---|---|
| 0 | Facebook/Inst | Impressions | input OR =IFERROR(F<click>/F<ctr>,0) OR =F<reach>*F<frequency> |
| 1 | Click | input OR =F<imp>*F<ctr> |
|
| 2 | CTR, % | input percent | |
| 3 | CPC | input OR =IFERROR(F<budget>/F<click>,0) |
|
| 4 | CPM | input OR =IFERROR(F<budget>/(F<imp>/1000)/1.2,0) |
|
| 5 | CPR | =IFERROR(F<budget>/(F<reach>/1000),0) |
|
| 6 | Reach | input OR =IFERROR(F<imp>/F<freq>,0) |
|
| 7 | Frequency | input | |
| 8 | Креатив | Коммент | text |
| 9 | Бюджет | UAH | =F<cpc>*F<click>*$D$<nds> OR =F<imp>/1000*F<cpm>*$D$<nds> |
Variant: sub-block #5 (Специалисты+видео) має 9 рядків — у Menopace CPR row злитий. Треба підтримати обидва варіанти.
In-Stream (10 rows): View → Impressions → Click → CTR → CPV → View Rate → CPC → CPM → Креатив → Бюджет
Bumper (7 rows): Impressions → Click → CTR → CPC → CPM → Креатив → Бюджет
Бюджет формули:
=IFERROR(F<view>*F<cpv>,0)*$D$<nds>=F<cpm>*F<imp>/1000*$D$<nds>Шаблон ідентичний META reach-сompatible підблоку.
| Δrow | B | D | E | значення |
|---|---|---|---|---|
| 0 | Bloggers | Гонорар | Post | input UAH (e.g. 53000 у Affida) |
| 1 | Reach | (порожнє) | ||
| 2 | Коммент | text (e.g. "patch") | ||
| 3 | Бюджет | UAH | =F<post> |
Variable list of free-form services. У обох файлах:
ZAKUPKA Banner UAH 0
SSULOK (commented)
Tabletki Video UAH 0
Production Article UAH 0
Article (commented)
Production Video UAH 0
Viber CRM (commented)
Бюджет UAH = SUM(F220,F222,F224,F226)*$D$<nds>
0 (фактично unused — все одразу у UAH)1.2 (multiplied у кожен Бюджет)1.55 (декларовано, у формули НЕ вшито)1.06 (декларовано, у формули НЕ вшито)#,##0 — цілі (Impressions, Clicks, Reach) — 1700 cells_-* #,##0.00\ [$UAH]_-;... — UAH currency — 900 cells0.00% — percent (CTR/View Rate) — 200 cells0 / 0% — fallbackFFCCECFF (light cyan) — header rows + rollup rows (246 cells)FFFFFFCC (pale yellow) — input cells (140 cells)FFFFFF00 (yellow) — TOTAL BUDGET emphasisFFFFFFFF (white) — formula cellsПростий plain-text grid: SKU × audience × month-budget. Без складних формул, лише =SUM(<col>2:<col>22) у нижньому row "Разом". Виглядає як робочий чорновик який Сергій + команда заповнюють перед мапингом у головний лист.
Recommendation: саме цей формат брати як input UI для AI-генератора — простіший за головну таблицю, achieves top-down логіку.
Meta-only бюджети по аудиторіях × місяць з derived Reach. Working scratchpad для PPC-команди.
| # | Аспект | Menopace | Affida | Чи структурний? |
|---|---|---|---|---|
| 1 | Header rows | 3-13 (вищий блок з курсом і H1/H2 колонками) | 1-10 (compressed) | Структурний (генератор має toggle) |
| 2 | Annual columns | R + S(H1) + T(H2) + U(year-cross) — 4 колонки | Лише R | Структурний (опціональний toggle) |
| 3 | Допоміжні листи | 0 | 2 (Таблиця + Сводка ФБ) | Brand-specific (Affida workflow) |
| 4 | Footer notes | 2 текстові ноти | 0 у головному листі | Косметика |
| 5 | Sub-block назви/SKU | "Менопейс Плюс", "Брюнетка" і т.д. | "Афіда Плюс", "Афіда Макс з аргеніном", "Афіда пластир" | Brand-specific (input variable) |
Структурні invariants: 12 місяців F-Q, 6 секцій каналів у тому самому порядку, 19 під-блоків з тими самими row-count'ами, formula-skeletons byte-identical (з row-offset shift).
| Канал | Sub-blocks у файлах | Відповідник у playbook |
|---|---|---|
| Google Ads Search | 4 (Brand/Тематичний/Конкурент/Shopping) | ✅ Google Ads §1-4 |
| Google Ads YouTube | 4 (TrueView In-Stream ×2 + Bumper ×2) | ✅ DV360 §1 (In-Stream) — але живе у Google Ads (не DV360) — quirk |
| Meta FB/Instagram | 6 (Engagement/Reach×2/CPC/Specialists+Video/Remarketing) | ✅ Meta §1-4 |
| GDN/КМС | 2 (Промо ×2) | ✅ DV360 §3-4 (banner) |
| Bloggers | 2 (Гонорар per Post) | ✅ Bloggers §1 |
| Services (offline-ish) | 1 (Tabletki/Zakupka/Production/Viber CRM) | ✅ Інше §1-3 |
Прогалини (не зустрілися ні в Menopace ні в Affida):
*$D$<nds> anchor)(SKU, channel, audience, format, monthly_budget OR target_metric)/srv/projects/media-planner/parsed/{menopace,affida}_structure.json/srv/projects/media-planner/parsed/canonical_mp_schema.json/srv/projects/media-planner/samples/