adserver-dashboard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/.ci/staging.yml +191 -0
  2. package/.dockerignore +117 -0
  3. package/.env +40 -0
  4. package/.env.staging +38 -0
  5. package/.gitlab-ci.yml +16 -0
  6. package/DEMO_STATUS.md +579 -0
  7. package/Dockerfile +61 -0
  8. package/Influence-MW-AdServer-12-02-2026/client/index.html +17 -0
  9. package/Influence-MW-AdServer-12-02-2026/client/public/favicon.png +0 -0
  10. package/Influence-MW-AdServer-12-02-2026/client/src/App.tsx +91 -0
  11. package/Influence-MW-AdServer-12-02-2026/client/src/components/advanced-map-drawer.tsx +1131 -0
  12. package/Influence-MW-AdServer-12-02-2026/client/src/components/ai-recommendation-panel.tsx +379 -0
  13. package/Influence-MW-AdServer-12-02-2026/client/src/components/app-sidebar.tsx +183 -0
  14. package/Influence-MW-AdServer-12-02-2026/client/src/components/auto-optimize-button.tsx +184 -0
  15. package/Influence-MW-AdServer-12-02-2026/client/src/components/availability-drawer.tsx +385 -0
  16. package/Influence-MW-AdServer-12-02-2026/client/src/components/brand-insights-panel.tsx +87 -0
  17. package/Influence-MW-AdServer-12-02-2026/client/src/components/create-agency-drawer.tsx +198 -0
  18. package/Influence-MW-AdServer-12-02-2026/client/src/components/create-brand-drawer.tsx +275 -0
  19. package/Influence-MW-AdServer-12-02-2026/client/src/components/creative-assignment.tsx +526 -0
  20. package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table-toolbar.tsx +148 -0
  21. package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table.tsx +158 -0
  22. package/Influence-MW-AdServer-12-02-2026/client/src/components/filter-drawer.tsx +356 -0
  23. package/Influence-MW-AdServer-12-02-2026/client/src/components/form-insights-panel.tsx +82 -0
  24. package/Influence-MW-AdServer-12-02-2026/client/src/components/geography-selector.tsx +699 -0
  25. package/Influence-MW-AdServer-12-02-2026/client/src/components/header-user-menu.tsx +178 -0
  26. package/Influence-MW-AdServer-12-02-2026/client/src/components/history-drawer.tsx +313 -0
  27. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-availability-section.tsx +176 -0
  28. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-format-drawer.tsx +173 -0
  29. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-selector.tsx +401 -0
  30. package/Influence-MW-AdServer-12-02-2026/client/src/components/manual-inventory-drawer.tsx +368 -0
  31. package/Influence-MW-AdServer-12-02-2026/client/src/components/mapbox-map.tsx +368 -0
  32. package/Influence-MW-AdServer-12-02-2026/client/src/components/market-insights-panel.tsx +202 -0
  33. package/Influence-MW-AdServer-12-02-2026/client/src/components/media-owner-drawer.tsx +217 -0
  34. package/Influence-MW-AdServer-12-02-2026/client/src/components/metric-card.tsx +58 -0
  35. package/Influence-MW-AdServer-12-02-2026/client/src/components/page-header.tsx +27 -0
  36. package/Influence-MW-AdServer-12-02-2026/client/src/components/player-status-indicator.tsx +137 -0
  37. package/Influence-MW-AdServer-12-02-2026/client/src/components/poi-targeting-drawer.tsx +298 -0
  38. package/Influence-MW-AdServer-12-02-2026/client/src/components/recommendation-score-badge.tsx +102 -0
  39. package/Influence-MW-AdServer-12-02-2026/client/src/components/recommended-inventories-panel.tsx +248 -0
  40. package/Influence-MW-AdServer-12-02-2026/client/src/components/searchable-combobox.tsx +134 -0
  41. package/Influence-MW-AdServer-12-02-2026/client/src/components/signal-visualizations.tsx +407 -0
  42. package/Influence-MW-AdServer-12-02-2026/client/src/components/status-badge.tsx +35 -0
  43. package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-provider.tsx +73 -0
  44. package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-toggle.tsx +37 -0
  45. package/Influence-MW-AdServer-12-02-2026/client/src/components/traffic-slider.tsx +75 -0
  46. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/accordion.tsx +56 -0
  47. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert-dialog.tsx +139 -0
  48. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert.tsx +59 -0
  49. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/aspect-ratio.tsx +5 -0
  50. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/avatar.tsx +51 -0
  51. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/badge.tsx +38 -0
  52. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/breadcrumb.tsx +115 -0
  53. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/button.tsx +62 -0
  54. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/calendar.tsx +68 -0
  55. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/card.tsx +85 -0
  56. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/carousel.tsx +260 -0
  57. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/chart.tsx +365 -0
  58. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/checkbox.tsx +28 -0
  59. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/collapsible.tsx +11 -0
  60. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/command.tsx +151 -0
  61. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/context-menu.tsx +198 -0
  62. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dialog.tsx +122 -0
  63. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/drawer.tsx +118 -0
  64. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dropdown-menu.tsx +198 -0
  65. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/form.tsx +178 -0
  66. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/hover-card.tsx +29 -0
  67. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input-otp.tsx +69 -0
  68. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input.tsx +23 -0
  69. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/label.tsx +24 -0
  70. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/menubar.tsx +256 -0
  71. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/navigation-menu.tsx +128 -0
  72. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/pagination.tsx +117 -0
  73. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/popover.tsx +29 -0
  74. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/progress.tsx +28 -0
  75. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/radio-group.tsx +42 -0
  76. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/resizable.tsx +45 -0
  77. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/scroll-area.tsx +46 -0
  78. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/select.tsx +160 -0
  79. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/separator.tsx +29 -0
  80. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sheet.tsx +140 -0
  81. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sidebar.tsx +727 -0
  82. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/skeleton.tsx +15 -0
  83. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/slider.tsx +26 -0
  84. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/switch.tsx +27 -0
  85. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/table.tsx +117 -0
  86. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tabs.tsx +53 -0
  87. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/textarea.tsx +22 -0
  88. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toast.tsx +127 -0
  89. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toaster.tsx +33 -0
  90. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle-group.tsx +61 -0
  91. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle.tsx +43 -0
  92. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tooltip.tsx +30 -0
  93. package/Influence-MW-AdServer-12-02-2026/client/src/components/vendor-stores-modal.tsx +336 -0
  94. package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-drawer.tsx +359 -0
  95. package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-selector.tsx +436 -0
  96. package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-mobile.tsx +19 -0
  97. package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-toast.ts +191 -0
  98. package/Influence-MW-AdServer-12-02-2026/client/src/index.css +244 -0
  99. package/Influence-MW-AdServer-12-02-2026/client/src/lib/queryClient.ts +57 -0
  100. package/Influence-MW-AdServer-12-02-2026/client/src/lib/utils.ts +39 -0
  101. package/Influence-MW-AdServer-12-02-2026/client/src/lib/venue-taxonomy.ts +532 -0
  102. package/Influence-MW-AdServer-12-02-2026/client/src/main.tsx +5 -0
  103. package/Influence-MW-AdServer-12-02-2026/client/src/pages/assign-creative.tsx +781 -0
  104. package/Influence-MW-AdServer-12-02-2026/client/src/pages/content-hub.tsx +995 -0
  105. package/Influence-MW-AdServer-12-02-2026/client/src/pages/custom-pois.tsx +431 -0
  106. package/Influence-MW-AdServer-12-02-2026/client/src/pages/dashboard.tsx +620 -0
  107. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-detail.tsx +1062 -0
  108. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-form.tsx +1570 -0
  109. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deals.tsx +716 -0
  110. package/Influence-MW-AdServer-12-02-2026/client/src/pages/edit-creative-assignment.tsx +1051 -0
  111. package/Influence-MW-AdServer-12-02-2026/client/src/pages/geotargeting.tsx +675 -0
  112. package/Influence-MW-AdServer-12-02-2026/client/src/pages/integrations.tsx +425 -0
  113. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-creatives.tsx +622 -0
  114. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-form.tsx +3132 -0
  115. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-items.tsx +530 -0
  116. package/Influence-MW-AdServer-12-02-2026/client/src/pages/not-found.tsx +21 -0
  117. package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play-upload.tsx +479 -0
  118. package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play.tsx +880 -0
  119. package/Influence-MW-AdServer-12-02-2026/client/src/pages/reports.tsx +235 -0
  120. package/Influence-MW-AdServer-12-02-2026/client/src/pages/settings.tsx +652 -0
  121. package/Influence-MW-AdServer-12-02-2026/client/src/pages/signal-form.tsx +1117 -0
  122. package/Influence-MW-AdServer-12-02-2026/client/src/pages/signals.tsx +366 -0
  123. package/Influence-MW-AdServer-12-02-2026/client/src/pages/tags.tsx +332 -0
  124. package/Influence-MW-AdServer-12-02-2026/client/src/pages/venues.tsx +381 -0
  125. package/Influence-MW-AdServer-12-02-2026/client/src/types/mapbox-gl-draw.d.ts +37 -0
  126. package/Influence-MW-AdServer-12-02-2026/client/src/types/react-simple-maps.d.ts +57 -0
  127. package/Influence-MW-AdServer-12-02-2026/components.json +20 -0
  128. package/Influence-MW-AdServer-12-02-2026/docs/PRD.md +3373 -0
  129. package/Influence-MW-AdServer-12-02-2026/docs/influence-feature-mapping.csv +498 -0
  130. package/Influence-MW-AdServer-12-02-2026/drizzle.config.ts +14 -0
  131. package/Influence-MW-AdServer-12-02-2026/package-lock.json +9672 -0
  132. package/Influence-MW-AdServer-12-02-2026/package.json +118 -0
  133. package/Influence-MW-AdServer-12-02-2026/postcss.config.js +6 -0
  134. package/Influence-MW-AdServer-12-02-2026/replit.md +91 -0
  135. package/Influence-MW-AdServer-12-02-2026/script/build.ts +67 -0
  136. package/Influence-MW-AdServer-12-02-2026/scripts/create-miro-diagrams.cjs +318 -0
  137. package/Influence-MW-AdServer-12-02-2026/scripts/create-remaining-diagrams.cjs +270 -0
  138. package/Influence-MW-AdServer-12-02-2026/server/index.ts +103 -0
  139. package/Influence-MW-AdServer-12-02-2026/server/recommendation-service.ts +319 -0
  140. package/Influence-MW-AdServer-12-02-2026/server/routes.ts +1890 -0
  141. package/Influence-MW-AdServer-12-02-2026/server/static.ts +19 -0
  142. package/Influence-MW-AdServer-12-02-2026/server/storage.ts +2058 -0
  143. package/Influence-MW-AdServer-12-02-2026/server/vite.ts +58 -0
  144. package/Influence-MW-AdServer-12-02-2026/shared/schema.ts +1595 -0
  145. package/Influence-MW-AdServer-12-02-2026/tailwind.config.ts +107 -0
  146. package/Influence-MW-AdServer-12-02-2026/tsconfig.json +23 -0
  147. package/Influence-MW-AdServer-12-02-2026/vite.config.ts +40 -0
  148. package/LINE_ITEM_BUDGET_FIELD_MAPPING.md +178 -0
  149. package/PCM/.env.example +92 -0
  150. package/PCM/README.md +558 -0
  151. package/PCM/docs/TEST_CASES.md +422 -0
  152. package/PCM/index.js +106 -0
  153. package/PCM/package-lock.json +3282 -0
  154. package/PCM/package.json +32 -0
  155. package/PCM/replit.md +64 -0
  156. package/PCM/schema.sql +495 -0
  157. package/PCM/scripts/export-schema.js +183 -0
  158. package/PCM/scripts/seed-comprehensive.js +631 -0
  159. package/PCM/scripts/seed-production.js +477 -0
  160. package/PCM/src/config/db.js +56 -0
  161. package/PCM/src/config/swagger.js +5975 -0
  162. package/PCM/src/dto/EmailRequestDTO.js +166 -0
  163. package/PCM/src/middleware/errorHandler.js +52 -0
  164. package/PCM/src/middleware/logger.js +26 -0
  165. package/PCM/src/migrations/001_add_campaign_mode_fields.sql +36 -0
  166. package/PCM/src/migrations/002_create_deal_id_counters.sql +22 -0
  167. package/PCM/src/migrations/003_update_publishers_column.sql +15 -0
  168. package/PCM/src/migrations/004_add_direct_dealtype_and_advertiser.sql +5 -0
  169. package/PCM/src/migrations/005_add_programmatic_fields_and_update_enums.sql +31 -0
  170. package/PCM/src/migrations/006_add_line_item_programmatic_fields.sql +12 -0
  171. package/PCM/src/migrations/007_add_line_item_direct_fields.sql +15 -0
  172. package/PCM/src/migrations/008_add_inventory_fields.sql +45 -0
  173. package/PCM/src/migrations/009_move_inventory_fields_to_metadata.sql +32 -0
  174. package/PCM/src/migrations/010_add_draft_status_and_line_items_count.sql +23 -0
  175. package/PCM/src/migrations/011_add_planning_field.sql +21 -0
  176. package/PCM/src/migrations/012_fix_inventory_composite_pk.sql +17 -0
  177. package/PCM/src/migrations/013_make_external_id_optional.sql +3 -0
  178. package/PCM/src/migrations/014_create_change_history.sql +38 -0
  179. package/PCM/src/migrations/016_create_publisher_insertion_orders.sql +33 -0
  180. package/PCM/src/migrations/017_fix_line_item_id_fk_reference.sql +86 -0
  181. package/PCM/src/migrations/018_create_approval_tables.sql +44 -0
  182. package/PCM/src/migrations/019_add_encrypted_token_column.sql +2 -0
  183. package/PCM/src/migrations/020_add_rejection_reason_to_deals.sql +10 -0
  184. package/PCM/src/migrations/021_add_publisher_external_id_to_inventories.sql +12 -0
  185. package/PCM/src/migrations/022_add_line_item_extended_fields.sql +24 -0
  186. package/PCM/src/migrations/023_add_base_price_fields.sql +8 -0
  187. package/PCM/src/migrations/run-migrations.js +46 -0
  188. package/PCM/src/models/ApprovalOTP.js +51 -0
  189. package/PCM/src/models/ApprovalToken.js +79 -0
  190. package/PCM/src/models/ChangeHistory.js +107 -0
  191. package/PCM/src/models/Deal.js +186 -0
  192. package/PCM/src/models/DealIdCounter.js +28 -0
  193. package/PCM/src/models/LineItem.js +227 -0
  194. package/PCM/src/models/LineItemCreative.js +89 -0
  195. package/PCM/src/models/LineItemInventory.js +115 -0
  196. package/PCM/src/models/PublisherInsertionOrder.js +93 -0
  197. package/PCM/src/models/TransactionHistory.js +34 -0
  198. package/PCM/src/models/associations.js +81 -0
  199. package/PCM/src/routes/approval.js +321 -0
  200. package/PCM/src/routes/creatives.js +437 -0
  201. package/PCM/src/routes/deals.js +1638 -0
  202. package/PCM/src/routes/digitalSignage.js +242 -0
  203. package/PCM/src/routes/insertionOrders.js +380 -0
  204. package/PCM/src/routes/lineItems.js +926 -0
  205. package/PCM/src/routes/system.js +384 -0
  206. package/PCM/src/services/ApprovalService.js +885 -0
  207. package/PCM/src/services/CampaignImportConverter.js +631 -0
  208. package/PCM/src/services/CampaignModeService.js +273 -0
  209. package/PCM/src/services/CampaignStatusService.js +395 -0
  210. package/PCM/src/services/ChangeHistoryService.js +316 -0
  211. package/PCM/src/services/DealIdService.js +94 -0
  212. package/PCM/src/services/DealResponseFormatter.js +90 -0
  213. package/PCM/src/services/EmailNotificationService.js +315 -0
  214. package/PCM/src/services/LineItemResponseFormatter.js +122 -0
  215. package/PCM/src/services/LineItemStatusService.js +380 -0
  216. package/PCM/src/tests/comprehensiveTestRunner.js +360 -0
  217. package/PCM/src/tests/comprehensiveTests.js +1277 -0
  218. package/PCM/src/tests/dealTypeUnitTests.js +1058 -0
  219. package/PCM/src/tests/testRunner.js +248 -0
  220. package/PCM/src/utils/caseConverter.js +92 -0
  221. package/PCM/src/utils/dealCalculations.js +206 -0
  222. package/PCM/src/utils/lineItemPayloadNormalizer.js +41 -0
  223. package/PCM/src/utils/payloadNormalizer.js +34 -0
  224. package/PCM/src/utils/sourceNormalizer.js +56 -0
  225. package/PCM/src/validators/creativeValidator.js +27 -0
  226. package/PCM/src/validators/dealValidator.js +203 -0
  227. package/PCM/src/validators/lineItemValidator.js +489 -0
  228. package/PCM/tests/approval-flows.test.js +238 -0
  229. package/PCM/tests/approval-workflow.test.js +291 -0
  230. package/PCM/tests/campaign-import-converter.test.js +543 -0
  231. package/PCM/tests/campaign-import-e2e.test.js +520 -0
  232. package/PCM/tests/campaign-status.test.js +539 -0
  233. package/PCM/tests/direct-publisher-split-reimport.test.js +460 -0
  234. package/PCM/tests/e2e/digital-signage.test.js +145 -0
  235. package/PCM/tests/e2e/search-filter-pagination.test.js +399 -0
  236. package/PCM/tests/e2e-comprehensive.test.js +3446 -0
  237. package/PCM/tests/edge-cases.test.js +340 -0
  238. package/PCM/tests/line-item-status.test.js +340 -0
  239. package/PCM/tests/seller-account-external-ids.test.js +877 -0
  240. package/PCM/tests/source-validation.test.js +324 -0
  241. package/PRD.md +3373 -0
  242. package/README.md +186 -0
  243. package/client/index.html +35 -0
  244. package/client/public/DEMO_STATUS.md +579 -0
  245. package/client/public/img/MW-logo-trans_1754045676555.png +0 -0
  246. package/client/public/locales/ar/approval.json +144 -0
  247. package/client/public/locales/ar/buyer.json +61 -0
  248. package/client/public/locales/ar/campaigns.json +1 -0
  249. package/client/public/locales/ar/common.json +218 -0
  250. package/client/public/locales/ar/contentHub.json +266 -0
  251. package/client/public/locales/ar/creatives.json +79 -0
  252. package/client/public/locales/ar/dashboard.json +57 -0
  253. package/client/public/locales/ar/deals.json +886 -0
  254. package/client/public/locales/ar/dsp.json +131 -0
  255. package/client/public/locales/ar/inventory.json +201 -0
  256. package/client/public/locales/ar/lineItems.json +553 -0
  257. package/client/public/locales/ar/navigation.json +48 -0
  258. package/client/public/locales/ar/wizard.json +1 -0
  259. package/client/public/locales/en/approval.json +144 -0
  260. package/client/public/locales/en/buyer.json +65 -0
  261. package/client/public/locales/en/campaigns.json +1 -0
  262. package/client/public/locales/en/common.json +218 -0
  263. package/client/public/locales/en/contentHub.json +266 -0
  264. package/client/public/locales/en/creatives.json +79 -0
  265. package/client/public/locales/en/dashboard.json +57 -0
  266. package/client/public/locales/en/deals.json +886 -0
  267. package/client/public/locales/en/dsp.json +131 -0
  268. package/client/public/locales/en/inventory.json +201 -0
  269. package/client/public/locales/en/lineItems.json +659 -0
  270. package/client/public/locales/en/navigation.json +48 -0
  271. package/client/public/locales/en/wizard.json +1 -0
  272. package/client/public/locales/ja/approval.json +144 -0
  273. package/client/public/locales/ja/buyer.json +61 -0
  274. package/client/public/locales/ja/campaigns.json +1 -0
  275. package/client/public/locales/ja/common.json +218 -0
  276. package/client/public/locales/ja/contentHub.json +266 -0
  277. package/client/public/locales/ja/creatives.json +79 -0
  278. package/client/public/locales/ja/dashboard.json +57 -0
  279. package/client/public/locales/ja/deals.json +886 -0
  280. package/client/public/locales/ja/dsp.json +131 -0
  281. package/client/public/locales/ja/inventory.json +201 -0
  282. package/client/public/locales/ja/lineItems.json +553 -0
  283. package/client/public/locales/ja/navigation.json +48 -0
  284. package/client/public/locales/ja/wizard.json +1 -0
  285. package/client/public/locales/zh/approval.json +144 -0
  286. package/client/public/locales/zh/buyer.json +61 -0
  287. package/client/public/locales/zh/campaigns.json +1 -0
  288. package/client/public/locales/zh/common.json +218 -0
  289. package/client/public/locales/zh/contentHub.json +266 -0
  290. package/client/public/locales/zh/creatives.json +79 -0
  291. package/client/public/locales/zh/dashboard.json +57 -0
  292. package/client/public/locales/zh/deals.json +886 -0
  293. package/client/public/locales/zh/dsp.json +131 -0
  294. package/client/public/locales/zh/inventory.json +201 -0
  295. package/client/public/locales/zh/lineItems.json +553 -0
  296. package/client/public/locales/zh/navigation.json +48 -0
  297. package/client/public/locales/zh/wizard.json +1 -0
  298. package/client/public/manifest.json +36 -0
  299. package/client/src/App.tsx +464 -0
  300. package/client/src/components/app-sidebar.tsx +312 -0
  301. package/client/src/components/approval/approval-decision-form.test.tsx +294 -0
  302. package/client/src/components/approval/approval-decision-form.tsx +326 -0
  303. package/client/src/components/approval/approval-sheet.tsx +631 -0
  304. package/client/src/components/approval/line-item-details-sheet.tsx +371 -0
  305. package/client/src/components/approval/otp-verification.test.tsx +337 -0
  306. package/client/src/components/approval/otp-verification.tsx +180 -0
  307. package/client/src/components/content-hub/bulk-transcode-dialog.tsx +379 -0
  308. package/client/src/components/content-hub/content-hub-manager-v2.tsx +574 -0
  309. package/client/src/components/content-hub/content-hub-manager.tsx +330 -0
  310. package/client/src/components/content-hub/creative-card.tsx +456 -0
  311. package/client/src/components/content-hub/creative-detail-sheet.tsx +685 -0
  312. package/client/src/components/content-hub/creative-filters.tsx +457 -0
  313. package/client/src/components/content-hub/creative-grid.tsx +329 -0
  314. package/client/src/components/content-hub/creative-selector.tsx +415 -0
  315. package/client/src/components/content-hub/creative-upload.tsx +547 -0
  316. package/client/src/components/content-hub/folder-dialogs.tsx +445 -0
  317. package/client/src/components/content-hub/folder-list.tsx +280 -0
  318. package/client/src/components/content-hub/review-dialogs.tsx +268 -0
  319. package/client/src/components/content-hub/transcode-dialog.tsx +226 -0
  320. package/client/src/components/creative-library/creative-details-view.tsx +446 -0
  321. package/client/src/components/creative-library/creative-filters-panel.tsx +203 -0
  322. package/client/src/components/creative-library/creative-list.tsx +360 -0
  323. package/client/src/components/creative-library/creative-status-badge.tsx +71 -0
  324. package/client/src/components/creative-library/folder-card.tsx +78 -0
  325. package/client/src/components/creative-library/index.ts +27 -0
  326. package/client/src/components/creative-library/new-creative-card.tsx +211 -0
  327. package/client/src/components/creative-library/upload-creative-dialog.tsx +261 -0
  328. package/client/src/components/dashboard-overview.tsx +109 -0
  329. package/client/src/components/deals/approval-history-panel.test.tsx +240 -0
  330. package/client/src/components/deals/approval-history-panel.tsx +156 -0
  331. package/client/src/components/deals/deal-status-badge.tsx +92 -0
  332. package/client/src/components/deals/import-from-planner-dialog.tsx +399 -0
  333. package/client/src/components/deals/market-insights-panel.tsx +237 -0
  334. package/client/src/components/deals/reopen-deal-sheet.tsx +191 -0
  335. package/client/src/components/deals/request-approval-sheet.test.tsx +323 -0
  336. package/client/src/components/deals/request-approval-sheet.tsx +136 -0
  337. package/client/src/components/deals/resend-approval-sheet.tsx +201 -0
  338. package/client/src/components/direct-campaigns/campaign-card.tsx +283 -0
  339. package/client/src/components/direct-campaigns/deal-filter-panel.tsx +325 -0
  340. package/client/src/components/inventory/advanced-filters-panel.tsx +273 -0
  341. package/client/src/components/inventory/csv-upload-modal.tsx +639 -0
  342. package/client/src/components/inventory/inventory-availability-view.tsx +486 -0
  343. package/client/src/components/inventory/inventory-details-sheet.tsx +376 -0
  344. package/client/src/components/inventory/inventory-map-view.tsx +596 -0
  345. package/client/src/components/inventory/inventory-settings-menu.tsx +52 -0
  346. package/client/src/components/language-switcher.tsx +53 -0
  347. package/client/src/components/line-items/campaign-forecast-panel.tsx +138 -0
  348. package/client/src/components/line-items/form-insights.tsx +89 -0
  349. package/client/src/components/line-items/geofencing/LocationCsvUploadDrawer.tsx +100 -0
  350. package/client/src/components/line-items/geofencing/POIDropdown.tsx +379 -0
  351. package/client/src/components/line-items/geofencing/SelectedLocationsSidebar.tsx +436 -0
  352. package/client/src/components/line-items/geofencing/ViewFileLocationDrawer.tsx +199 -0
  353. package/client/src/components/line-items/geofencing/components/ExistingFilesTab.tsx +268 -0
  354. package/client/src/components/line-items/geofencing/components/TemplateDownloadSection.tsx +59 -0
  355. package/client/src/components/line-items/geofencing/components/UploadTab.tsx +215 -0
  356. package/client/src/components/line-items/geofencing-map.tsx +1270 -0
  357. package/client/src/components/line-items/inventory-availability-section.tsx +178 -0
  358. package/client/src/components/line-items/line-item-schedule-manager.tsx +313 -0
  359. package/client/src/components/line-items/manual-inventory-drawer.tsx +346 -0
  360. package/client/src/components/line-items/planner-inventory-card.tsx +495 -0
  361. package/client/src/components/line-items/planner-schedule-grid.tsx +495 -0
  362. package/client/src/components/line-items/schedule-rule-editor.tsx +649 -0
  363. package/client/src/components/line-items/schedule-rule-types.ts +122 -0
  364. package/client/src/components/line-items/steps/creatives-step.tsx +681 -0
  365. package/client/src/components/line-items/steps/inventory-schedule-step.tsx +1596 -0
  366. package/client/src/components/line-items/steps/inventory-step.tsx +1533 -0
  367. package/client/src/components/line-items/steps/line-item-details-step.tsx +916 -0
  368. package/client/src/components/line-items/steps/schedule-step.tsx +273 -0
  369. package/client/src/components/line-items/steps/summary-step.tsx +680 -0
  370. package/client/src/components/line-items/steps/targeting-step.tsx +1708 -0
  371. package/client/src/components/product-switcher.tsx +105 -0
  372. package/client/src/components/protected-route.tsx +49 -0
  373. package/client/src/components/skip-link.tsx +22 -0
  374. package/client/src/components/stat-card.tsx +53 -0
  375. package/client/src/components/status-badge.tsx +96 -0
  376. package/client/src/components/ui/hierarchical-venue-selector.tsx +389 -0
  377. package/client/src/components/ui/toaster.tsx +111 -0
  378. package/client/src/contexts/auth-context.tsx +181 -0
  379. package/client/src/contexts/sidebar-state.tsx +50 -0
  380. package/client/src/contexts/theme-context.tsx +66 -0
  381. package/client/src/data/campaign-data.json +107 -0
  382. package/client/src/data/countries.json +22 -0
  383. package/client/src/hooks/use-approval.ts +366 -0
  384. package/client/src/hooks/use-keyboard-shortcuts.ts +74 -0
  385. package/client/src/hooks/use-media-query.ts +46 -0
  386. package/client/src/hooks/use-mobile.tsx +19 -0
  387. package/client/src/hooks/use-page-title.ts +21 -0
  388. package/client/src/hooks/use-toast.ts +195 -0
  389. package/client/src/index.css +694 -0
  390. package/client/src/lib/__tests__/accessibility.test.ts +104 -0
  391. package/client/src/lib/__tests__/date-utils.test.ts +199 -0
  392. package/client/src/lib/__tests__/dsp-buyer-api.test.ts +127 -0
  393. package/client/src/lib/__tests__/dsp-buyer-integration.test.ts +247 -0
  394. package/client/src/lib/__tests__/storage-utils.test.ts +167 -0
  395. package/client/src/lib/__tests__/utils.test.ts +57 -0
  396. package/client/src/lib/accessibility.ts +141 -0
  397. package/client/src/lib/api-config.ts +9 -0
  398. package/client/src/lib/auth-service.ts +209 -0
  399. package/client/src/lib/campaign-creative-api.ts +82 -0
  400. package/client/src/lib/company-api.ts +61 -0
  401. package/client/src/lib/content-hub-api.ts +407 -0
  402. package/client/src/lib/creative-mapper.ts +61 -0
  403. package/client/src/lib/date-utils.ts +119 -0
  404. package/client/src/lib/deal-helpers.ts +220 -0
  405. package/client/src/lib/dsp-buyer-api.ts +196 -0
  406. package/client/src/lib/geo-import-api.ts +151 -0
  407. package/client/src/lib/google-poi-api.ts +305 -0
  408. package/client/src/lib/i18n/__tests__/formatting.test.ts +202 -0
  409. package/client/src/lib/i18n/formatting.ts +130 -0
  410. package/client/src/lib/i18n/index.ts +8 -0
  411. package/client/src/lib/i18n-compat.ts +76 -0
  412. package/client/src/lib/influence-deals-api.ts +896 -0
  413. package/client/src/lib/inventory-api.ts +399 -0
  414. package/client/src/lib/oauth-service.ts +678 -0
  415. package/client/src/lib/poi-types.ts +75 -0
  416. package/client/src/lib/queryClient.ts +144 -0
  417. package/client/src/lib/recommendation-api.ts +380 -0
  418. package/client/src/lib/storage-utils.ts +104 -0
  419. package/client/src/lib/tolgee.ts +85 -0
  420. package/client/src/lib/utils.ts +0 -0
  421. package/client/src/main.tsx +67 -0
  422. package/client/src/mapbox-draw-modes.d.ts +32 -0
  423. package/client/src/pages/all-folders.tsx +203 -0
  424. package/client/src/pages/auth-callback.tsx +115 -0
  425. package/client/src/pages/buyer-form.tsx +339 -0
  426. package/client/src/pages/buyer-list.tsx +622 -0
  427. package/client/src/pages/content-hub.tsx +1358 -0
  428. package/client/src/pages/create-deal.tsx +2093 -0
  429. package/client/src/pages/creative-assignment-page.tsx +548 -0
  430. package/client/src/pages/creatives.tsx +5 -0
  431. package/client/src/pages/custom-pois.tsx +425 -0
  432. package/client/src/pages/dashboard.tsx +615 -0
  433. package/client/src/pages/deal-history.tsx +434 -0
  434. package/client/src/pages/deal-line-items.tsx +1703 -0
  435. package/client/src/pages/demo-status.tsx +113 -0
  436. package/client/src/pages/direct-campaign-details.tsx +361 -0
  437. package/client/src/pages/direct-campaigns-new.tsx +824 -0
  438. package/client/src/pages/dsp-form.tsx +803 -0
  439. package/client/src/pages/dsp-list.tsx +239 -0
  440. package/client/src/pages/folder-content.tsx +336 -0
  441. package/client/src/pages/integrations.tsx +429 -0
  442. package/client/src/pages/line-item-creatives.tsx +789 -0
  443. package/client/src/pages/line-item-detail-page.tsx +684 -0
  444. package/client/src/pages/line-item-form-page.tsx +3261 -0
  445. package/client/src/pages/line-item-wizard.tsx +1207 -0
  446. package/client/src/pages/login.tsx +154 -0
  447. package/client/src/pages/not-found.tsx +23 -0
  448. package/client/src/pages/proof-of-play.tsx +397 -0
  449. package/client/src/pages/public-approval.tsx +551 -0
  450. package/client/src/pages/reports.tsx +231 -0
  451. package/client/src/pages/settings.tsx +760 -0
  452. package/client/src/pages/signals.tsx +389 -0
  453. package/client/src/pages/tags.tsx +318 -0
  454. package/client/src/pages/test-results.tsx +328 -0
  455. package/client/src/store/hooks.ts +5 -0
  456. package/client/src/store/index.ts +15 -0
  457. package/client/src/store/mapMarkerLocationsSlice.ts +241 -0
  458. package/client/src/styles/design-tokens.css +324 -0
  459. package/client/src/test/setup.ts +261 -0
  460. package/client/src/test/test-utils.tsx +40 -0
  461. package/client/src/types/approval.ts +221 -0
  462. package/client/src/types/content-hub.ts +209 -0
  463. package/client/src/types/geofencing.ts +67 -0
  464. package/client/src/types/transcoding.ts +140 -0
  465. package/client/src/vite-env.d.ts +18 -0
  466. package/components.json +20 -0
  467. package/creative-api.json +1 -0
  468. package/docs/AI_REFERENCE.md +459 -0
  469. package/docs/MWDesign-Prompt.md +132 -0
  470. package/docs/MWDesign-System.md +344 -0
  471. package/docs/test-plan.md +277 -0
  472. package/e2e/AUTONOMOUS-TESTING.md +406 -0
  473. package/e2e/README.md +219 -0
  474. package/e2e/autonomous-flow.spec.ts +308 -0
  475. package/e2e/debug-sso.spec.ts +163 -0
  476. package/e2e/direct-campaigns.spec.ts +219 -0
  477. package/e2e/explore-sso.spec.ts +149 -0
  478. package/e2e/fixtures/auth.ts +26 -0
  479. package/e2e/fixtures/enhanced-test.ts +331 -0
  480. package/e2e/pagination.spec.ts +280 -0
  481. package/e2e/view-toggle.spec.ts +312 -0
  482. package/generated-icon.png +0 -0
  483. package/i18next-scanner.config.cjs +46 -0
  484. package/package.json +141 -0
  485. package/playwright.config.ts +93 -0
  486. package/postcss.config.js +6 -0
  487. package/replit.md +196 -0
  488. package/screenshot-after-login.png +0 -0
  489. package/screenshot-contenthub-grid.png +0 -0
  490. package/screenshot-contenthub-list-fixed.png +0 -0
  491. package/screenshot-contenthub-list.png +0 -0
  492. package/screenshot-create-deal.png +0 -0
  493. package/screenshot-dashboard.png +0 -0
  494. package/screenshot-deals.png +0 -0
  495. package/screenshot-login-filled.png +0 -0
  496. package/screenshot-login.png +0 -0
  497. package/screenshot.mjs +24 -0
  498. package/scripts/deploy-stg.sh +185 -0
  499. package/shared/direct-io-schema.ts +383 -0
  500. package/shared/schema.ts +439 -0
  501. package/shared/screen-types.ts +149 -0
  502. package/springdocDefault.json +1 -0
  503. package/swagger-ui-bundle.js +2 -0
  504. package/swagger-ui-init.js +10316 -0
  505. package/tailwind.config.ts +282 -0
  506. package/terraform/README.md +306 -0
  507. package/terraform/cloudfront.tf +289 -0
  508. package/terraform/ecs.tf +727 -0
  509. package/terraform/environments/dev.tfvars +59 -0
  510. package/terraform/environments/production.tfvars +60 -0
  511. package/terraform/main.tf +47 -0
  512. package/terraform/outputs.tf +145 -0
  513. package/terraform/s3.tf +192 -0
  514. package/terraform/variables.tf +226 -0
  515. package/terraform/waf.tf +165 -0
  516. package/terraform-frontend/.terraform.lock.hcl +25 -0
  517. package/terraform-frontend/README.md +85 -0
  518. package/terraform-frontend/cloudfront.tf +125 -0
  519. package/terraform-frontend/main.tf +31 -0
  520. package/terraform-frontend/outputs.tf +24 -0
  521. package/terraform-frontend/terraform.tfvars +12 -0
  522. package/terraform-frontend/variables.tf +53 -0
  523. package/tsconfig.json +23 -0
  524. package/vite.config.ts +226 -0
  525. package/vitest.config.ts +56 -0
package/PRD.md ADDED
@@ -0,0 +1,3373 @@
1
+ # Influence - DOOH Adserver Platform
2
+ ## Product Requirements Document
3
+
4
+ **Version**: 2.1
5
+ **Last Updated**: February 2026
6
+ **Created by**: Product Team
7
+
8
+ ---
9
+
10
+ ## Table of Contents
11
+
12
+ 1. [Glossary](#1-glossary)
13
+ 2. [The Advertising Hierarchy](#2-the-advertising-hierarchy)
14
+ 3. [Dashboard](#3-dashboard)
15
+ - 3.1 [Time Period Selector](#31-time-period-selector)
16
+ - 3.2 [Active Deals Card](#32-active-deals-card)
17
+ - 3.3 [Total Impressions Card](#33-total-impressions-card)
18
+ - 3.4 [Revenue Card](#34-revenue-card)
19
+ - 3.5 [Fill Rate Card](#35-fill-rate-card)
20
+ - 3.6 [Active Line Items Card](#36-active-line-items-card)
21
+ - 3.7 [Total Creatives Card](#37-total-creatives-card)
22
+ - 3.8 [Pending Approvals Card](#38-pending-approvals-card)
23
+ - 3.9 [Impression Delivery Card](#39-impression-delivery-card)
24
+ - 3.10 [Inventory Availability Card](#310-inventory-availability-card)
25
+ - 3.11 [Recent Deals Card](#311-recent-deals-card)
26
+ - 3.12 [Line Item Delivery Status Card](#312-line-item-delivery-status-card)
27
+ - 3.13 [Creative Status Card](#313-creative-status-card)
28
+ 4. [Deals](#4-deals)
29
+ - 4.1 [Deal Types](#41-deal-types)
30
+ - 4.2 [Deals Page Layout](#42-deals-page-layout)
31
+ - 4.3 [Creating a Deal](#43-creating-a-deal)
32
+ - 4.4 [Deal Form Fields](#44-deal-form-fields)
33
+ - 4.5 [Deal Status Lifecycle](#45-deal-status-lifecycle)
34
+ - 4.6 [Editing and Deleting Deals](#46-editing-and-deleting-deals)
35
+ - 4.7 [Deal Detail Page](#47-deal-detail-page)
36
+ - 4.8 [Mandatory Fields](#48-mandatory-fields)
37
+ - 4.9 [Deal Form Insights and Quick Tips](#49-deal-form-insights-and-quick-tips)
38
+ - 4.10 [VAST Tag Distribution](#410-vast-tag-distribution)
39
+ - 4.10.1 [Overview](#4101-overview)
40
+ - 4.10.2 [VAST Endpoint URL Structure](#4102-vast-endpoint-url-structure)
41
+ - 4.10.3 [Distribution Tab on Deal Detail Page](#4103-distribution-tab-on-deal-detail-page)
42
+ - 4.10.4 [CMS Compatibility Options](#4104-cms-compatibility-options)
43
+ - 4.10.5 [HTML File Generation](#4105-html-file-generation)
44
+ - 4.10.6 [ZIP Package Generation](#4106-zip-package-generation)
45
+ - 4.10.7 [Distribution Workflow by Deal Type](#4107-distribution-workflow-by-deal-type)
46
+ - 4.10.8 [API Endpoints](#4108-api-endpoints)
47
+ 5. [Line Items](#5-line-items)
48
+ - 5.1 [What Line Items Control](#51-what-line-items-control)
49
+ - 5.2 [Creating a Line Item](#52-creating-a-line-item)
50
+ - 5.3 [Line Item Forecasting Panel](#53-line-item-forecasting-panel)
51
+ - 5.4 [Delivery Tracking](#54-delivery-tracking)
52
+ - 5.5 [Pausing and Resuming](#55-pausing-and-resuming)
53
+ - 5.6 [Form Insights and Quick Tips](#56-form-insights-and-quick-tips)
54
+ 6. [Traffic Allocation](#6-traffic-allocation)
55
+ - 6.1 [Basic Concept](#61-basic-concept)
56
+ - 6.2 [Normalization Logic](#62-normalization-logic)
57
+ - 6.3 [Priority as Tiebreaker](#63-priority-as-tiebreaker)
58
+ - 6.4 [Worked Examples](#64-worked-examples)
59
+ 7. [Content Hub](#7-content-hub)
60
+ - 7.1 [Overview](#71-content-hub-overview)
61
+ - 7.2 [Creative Types](#72-creative-types)
62
+ - 7.3 [Status Workflow](#73-status-workflow)
63
+ - 7.4 [Folder Organization](#74-folder-organization)
64
+ - 7.5 [Preview and Approval](#75-preview-and-approval)
65
+ - 7.6 [Creative Assignment](#76-creative-assignment)
66
+ - 7.6.1 [Line Item Creatives Page](#761-line-item-creatives-page)
67
+ - 7.6.2 [Edit Creative Assignment Page](#762-edit-creative-assignment-page)
68
+ - 7.6.3 [Assign Creative Page](#763-assign-creative-page)
69
+ - 7.7 [Tier 2 Approval Workflow](#77-tier-2-approval-workflow)
70
+ 8. [Signals](#8-signals-conditional-automation)
71
+ - 8.1 [Overview](#81-signals-overview)
72
+ - 8.2 [Signal Types](#82-signal-types)
73
+ - 8.3 [Signal Rules](#83-signal-rules)
74
+ - 8.4 [Forecasting Visualizations](#84-forecasting-visualizations)
75
+ - 8.5 [Signal-Line Item Integration](#85-signal-line-item-integration)
76
+ - 8.6 [UI/UX](#86-signals-ui-ux)
77
+ - 8.7 [Quick Tips Panel](#87-quick-tips-panel)
78
+ 9. [Ad Serving Process](#9-ad-serving-process)
79
+ - 9.1 [The Two Delivery Channels](#91-the-two-delivery-channels)
80
+ - 9.2 [Channel A — Decision Engine](#92-channel-a--decision-engine)
81
+ - 9.2.1 [Why the Decision Engine Exists](#921-why-the-decision-engine-exists)
82
+ - 9.2.2 [How the Decision Engine Works](#922-how-the-decision-engine-works)
83
+ - 9.2.3 [The Hybrid Manifest Approach](#923-the-hybrid-manifest-approach)
84
+ - 9.2.4 [Decision Engine Scenarios](#924-decision-engine-scenarios)
85
+ - 9.2.5 [Decision Engine API](#925-decision-engine-api)
86
+ - 9.2.6 [Decision Engine Example](#926-decision-engine-example-a-day-in-the-life-of-screen-scr-4421)
87
+ - 9.3 [Channel B — VAST Tag Distribution](#93-channel-b--vast-tag-distribution)
88
+ - 9.3.1 [VAST Distribution Example](#931-vast-distribution-example-campaign-on-a-partner-network)
89
+ - 9.4 [Channel Comparison](#94-channel-comparison-when-ads-reach-screens)
90
+ - 9.5 [Legacy Ad Serving Decision Flow](#95-legacy-ad-serving-decision-flow)
91
+ 10. [External System Integrations](#10-external-system-integrations)
92
+ - 10.1 [Integration Overview](#101-integration-overview)
93
+ - 10.2 [Planner Integration](#102-planner-integration)
94
+ - 10.3 [Activate Integration](#103-activate-integration)
95
+ - 10.4 [Booking Engine Integration](#104-booking-engine-integration)
96
+ - 10.5 [Admin Console Integration](#105-admin-console-integration)
97
+ - 10.6 [Decision Engine Integration](#106-decision-engine-integration)
98
+ 11. [Inventory Integration](#11-inventory-integration)
99
+ - 11.1 [External Product Overview](#111-external-product-overview)
100
+ - 11.2 [Accessing Inventory Management](#112-accessing-inventory-management)
101
+ 12. [Integrations](#12-integrations)
102
+ - 12.1 [Built-in SSP](#121-built-in-ssp)
103
+ - 12.2 [External SSP Partners](#122-external-ssp-partners)
104
+ - 12.3 [DSP Partners](#123-dsp-partners)
105
+ 13. [User Interface Navigation](#13-user-interface-navigation)
106
+ - 13.1 [Application Layout](#131-application-layout)
107
+ - 13.2 [Sidebar Navigation](#132-sidebar-navigation)
108
+ - 13.3 [Navigation Flow](#133-navigation-flow)
109
+ - 13.4 [Header Controls](#134-header-controls)
110
+ - 13.5 [User Menu](#135-user-menu)
111
+ - 13.6 [Theme Settings](#136-theme-settings)
112
+ - 13.7 [Form Pages](#137-form-pages)
113
+ - 13.8 [Filter Drawer](#138-filter-drawer)
114
+ - 13.9 [Inline Filtering and Sorting](#139-inline-filtering-and-sorting)
115
+ - 13.10 [Dialog Usage](#1310-dialog-usage)
116
+ 14. [History Logs and Audit Trail](#14-history-logs-and-audit-trail)
117
+ - 14.1 [Overview](#141-overview)
118
+ - 14.2 [What Gets Tracked](#142-what-gets-tracked)
119
+ - 14.3 [Created By Attribution](#143-created-by-attribution)
120
+ - 14.4 [View History Button](#144-view-history-button)
121
+ - 14.5 [API Endpoints](#145-api-endpoints)
122
+ 15. [Recommendation Engine Integration](#15-recommendation-engine-integration)
123
+ - 15.1 [Overview](#151-overview)
124
+ - 15.2 [Campaign Goals](#152-campaign-goals)
125
+ - 15.3 [Scoring System (8 Factors)](#153-scoring-system-8-factors)
126
+ - 15.4 [Recommendation Panel](#154-recommendation-panel-line-item-form)
127
+ - 15.5 [Score Breakdown Tooltip](#155-score-breakdown-tooltip)
128
+ - 15.6 [Auto-Optimize Feature](#156-auto-optimize-feature)
129
+ - 15.7 [API Endpoints](#157-api-endpoints)
130
+ 16. [Proof of Play (PoP) System](#16-proof-of-play-pop-system)
131
+ - 16.1 [Overview](#161-overview)
132
+ - 16.2 [PoP Record Sources](#162-pop-record-sources)
133
+ - 16.3 [PoP Record Display](#163-pop-record-display)
134
+ - 16.4 [Status Workflow](#164-status-workflow)
135
+ 17. [Playlog Upload System](#17-playlog-upload-system)
136
+ - 17.1 [Upload Interface](#171-upload-interface)
137
+ - 17.2 [CSV Template](#172-csv-template)
138
+ - 17.3 [File Processing](#173-file-processing)
139
+ 18. [Configuration Menu](#18-configuration-menu)
140
+ - 18.1 [Menu Items](#181-menu-items)
141
+ - 18.2 [Signals](#182-signals)
142
+ - 18.3 [Custom POIs](#183-custom-pois)
143
+ - 18.4 [Tags](#184-tags)
144
+ 19. [Settings Module](#19-settings-module)
145
+ - 19.1 [General Settings](#191-general-settings)
146
+ - 19.2 [Notifications](#192-notifications)
147
+ - 19.3 [Traffic Control](#193-traffic-control)
148
+ - 19.4 [Forecasting Defaults](#194-forecasting-defaults)
149
+ - 19.5 [Optimization Preferences](#195-optimization-preferences)
150
+ - 19.6 [Recommendation Weights](#196-recommendation-weights)
151
+ - 19.7 [Workflow Settings](#197-workflow-settings)
152
+ - 19.8 [Terminology](#198-terminology)
153
+ - 19.9 [Themes & Branding](#199-themes--branding)
154
+ - 19.10 [Inventory Whitelisting](#1910-inventory-whitelisting)
155
+ - 19.11 [API Settings](#1911-api-settings)
156
+
157
+ ---
158
+
159
+ ## 1. Glossary
160
+
161
+ | Term | Definition |
162
+ |------|------------|
163
+ | CPM | Cost Per Mille. The price an advertiser pays for one thousand impressions. If CPM is $10, the advertiser pays $10 for every 1,000 times their ad is shown. |
164
+ | CPS | Cost Per Second. The price based on ad duration. Used for video creatives where pricing is calculated per second of airtime. |
165
+ | DOOH | Digital Out-of-Home. Advertising displayed on digital screens in public locations like malls, airports, bus stops, and billboards. |
166
+ | DSP | Demand-Side Platform. A system that advertisers use to buy advertising inventory through automated auctions. |
167
+ | Fill Rate | The percentage of available advertising slots that were actually sold. If a screen could show 1000 ads but only 800 were sold, the fill rate is 80%. |
168
+ | Impression | One instance of an advertisement being displayed on a screen. If an ad plays 500 times across all screens, that is 500 impressions. |
169
+ | Line Item | The execution unit that specifies which ad to show, where to show it, how much to pay, and tracks delivery progress. |
170
+ | SSP | Supply-Side Platform. A system that screen owners use to sell their advertising inventory to advertisers. |
171
+ | Traffic Allocation | A percentage that controls how much of the available advertising opportunity a particular line item should receive. |
172
+ | Booking Engine | A separate service that manages inventory reservations and campaign scheduling across the Influence ecosystem. |
173
+ | Planner | An external platform for campaign planning that sends Traditional deals to Influence for execution. |
174
+ | Activate | An external platform for programmatic RFP workflows that sends Programmatic deals to Influence for execution. |
175
+ | Decision Engine (DE) | A real-time microservice that sits between the player and the ad server. It decides which ad should play on a given screen at a given moment, based on pacing, priority, CPM, and other factors. Replaces static round-robin rotation with intelligent ad selection. |
176
+ | Manifest | A pre-computed sequence of ads that the Decision Engine sends to a player for a specific time window (typically 15-30 minutes). The player follows the manifest order and fires tracking heartbeats after each play. |
177
+ | Heartbeat | A lightweight tracking signal sent by the player to the Decision Engine after each ad plays. Updates real-time counters (impressions, spend) in Redis so the next manifest is based on accurate delivery data. |
178
+ | Pacing | The rate at which a campaign delivers impressions relative to its goal and remaining flight time. A campaign "behind on pacing" has delivered fewer impressions than expected at this point in its schedule. |
179
+ | SOV | Share of Voice. The percentage of total ad slots on a screen (or set of screens) allocated to a specific deal. A 20% SOV guarantee means the deal must occupy at least 20% of all available slots. |
180
+ | VAST | Video Ad Serving Template. An industry-standard XML-based protocol that enables ad servers to communicate with video players. A VAST endpoint is a URL that players call to receive ad instructions (which creative to show, tracking pixels, etc.). |
181
+ | VAST Tag | A URL pointing to a VAST endpoint. Media owners schedule VAST tags on their CMS/players so the player can request and display ads from the ad server. |
182
+
183
+ ---
184
+
185
+ ## 2. The Advertising Hierarchy
186
+
187
+ Understanding the data hierarchy is essential before using any feature in Influence. The system organizes advertising into four levels, where each level contains one or more items from the level below it.
188
+
189
+ ### Hierarchy Diagram
190
+
191
+ The diagram below shows the four-level hierarchy from Advertiser down to Creative Assignment.
192
+
193
+ **[View Interactive Diagram in Miro](https://miro.com/app/board/uXjVGH3XGbs=?moveToWidget=3458764657790198310)**
194
+
195
+ <p align="center"><em>Figure 1: Advertising Hierarchy</em></p>
196
+
197
+ **Color Legend:**
198
+
199
+ | Level | Color | Entity |
200
+ |:-----:|:-----:|:-------|
201
+ | 1 | Gray | Advertiser |
202
+ | 2 | Light Blue | Deal |
203
+ | 3 | Orange | Line Item |
204
+ | 4 | Purple | Creative Assignment |
205
+
206
+ **Level 1: Advertiser**
207
+
208
+ An advertiser is the company or brand paying for the advertising. For example, "Coca-Cola" or "Nike" would be advertisers. One advertiser can have multiple deals running at the same time. The advertiser record stores contact information and is used for billing and reporting purposes.
209
+
210
+ **Level 2: Deal**
211
+
212
+ A deal represents one advertising initiative with a specific goal, containing all the commercial and operational configuration needed for execution. For example, Coca-Cola might run a "Summer Refresh" deal and a "Holiday Season" deal simultaneously.
213
+
214
+ The deal is where you define:
215
+ - The type of buying: Traditional (guaranteed delivery at fixed prices) or Programmatic (real-time bidding through auctions)
216
+ - SSP and Media Owner configurations
217
+ - Budget, goals, and flight dates
218
+ - DSP configuration for programmatic deals
219
+ - Geographic targeting (countries)
220
+
221
+ **Level 3: Line Item**
222
+
223
+ The line item is where advertising execution configuration happens. While the deal level provides commercial and operational structure, the line item specifies targeting criteria, pricing, delivery goals, and tracks how many impressions have been delivered.
224
+
225
+ A single deal might have multiple line items for different targeting requirements. For example:
226
+ - Line Item 1: "15-second brand video" targeting mall entrance screens
227
+ - Line Item 2: "10-second product promo" targeting food court screens
228
+
229
+ Line items inherit geographic constraints from their parent deal (they can only target locations within the deal's selected countries).
230
+
231
+ **Level 4: Creative Assignment**
232
+
233
+ The creative assignment is the junction between line items and creatives. This level exists because the same creative may be used across multiple line items with different scheduling, rules, and approval status. Creative assignments control when and how each creative is delivered within a line item.
234
+
235
+ Each creative assignment record contains:
236
+ - The linked creative from the Content Hub
237
+ - Start and end times for the assignment
238
+ - A schedule matrix defining which hours and days the creative should play
239
+ - A rule defining the rotation behavior (default, exclusive, etc.)
240
+ - Ad play count tracking
241
+ - Tier 2 approval status (pending, approved, rejected, changes requested)
242
+
243
+ This separation allows fine-grained control over creative delivery. For example, a line item might have:
244
+ - Creative Assignment 1: "Hero Video" playing all day on weekdays
245
+ - Creative Assignment 2: "Promo Video" playing mornings only on weekends
246
+
247
+ ---
248
+
249
+ ## 3. Dashboard
250
+
251
+ The Dashboard is the first screen users see when they log in. Its purpose is to answer the question: "How is my advertising business doing right now?" The page is organized into distinct rows that present information at progressively deeper levels of detail, with a time period selector in the page header for controlling the date range of displayed metrics.
252
+
253
+ The page header contains the title and description on the left, with a time period selector on the right side allowing users to customize the date range for metrics. The first row contains four metric cards that provide high-level key performance indicators related to deals, impressions, revenue, and fill rate. The second row contains four additional metric cards focused on operational metrics: total screens, active line items, total creatives, and pending approvals. The third row displays two cards side by side: an Impression Delivery card occupying four-sevenths of the width, and an Inventory Availability card occupying the remaining three-sevenths. The fourth row contains three equal-width cards showing Recent Deals, Line Item Delivery Status, and Creative Status.
254
+
255
+ ### 3.1 Time Period Selector
256
+
257
+ The time period selector appears in the page header, positioned on the right side opposite the page title. This control determines the date range used for calculating time-dependent metrics such as impressions, revenue, and trend comparisons. The selector affects the subtitle text displayed on metric cards, dynamically updating to reflect the chosen period.
258
+
259
+ **The selector provides four options via a dropdown menu:**
260
+
261
+ **Last 30 days:** The default selection. Metrics are calculated from the current date going back 30 calendar days. The metric card subtitles display "Last 30 days" to indicate this range.
262
+
263
+ **Last 60 days:** Extends the calculation window to 60 calendar days prior to the current date. The metric card subtitles update to display "Last 60 days".
264
+
265
+ **Last 90 days:** Provides a quarterly view by calculating metrics over the previous 90 calendar days. The metric card subtitles display "Last 90 days".
266
+
267
+ **Custom dates:** When selected, a secondary control appears—a date range picker button showing the currently selected date range (for example, "Jan 01 - Jan 25"). Clicking this button opens a calendar popup.
268
+
269
+ **Custom Date Range Picker Behavior:**
270
+
271
+ When the user selects "Custom dates" from the dropdown, a popover button appears to the right of the dropdown. This button displays a calendar icon followed by the selected date range in abbreviated format (for example, "Jan 01 - Jan 25"). If no dates have been selected yet, the button displays "Pick dates".
272
+
273
+ Clicking the date range button opens a calendar popup anchored to the right side of the button. The calendar displays two months side by side, allowing users to view and select dates spanning adjacent months without navigation. Users select a date range by clicking the start date, then clicking the end date. Selected dates are highlighted, and the range between them is indicated with a visual connection. Once both a start and end date are selected, the calendar popup automatically closes, and the metrics recalculate based on the custom range.
274
+
275
+ **Implementation details:** The dropdown uses the data-testid attribute `select-time-period` for automated testing. The custom date range button uses `button-custom-dates`. The calendar component supports keyboard navigation and follows accessibility best practices for date selection.
276
+
277
+ ### 3.2 Active Deals Card
278
+
279
+ This card displays two numbers arranged vertically. The large, prominent number shows the count of deals that are currently running. A deal is counted as active if today's date falls between its start and end dates, and the deal has not been paused or cancelled.
280
+
281
+ The smaller subtitle text below reads "of X total" where X represents the total count of all deals in the system, regardless of status. This provides essential context for interpretation. Seeing "8" with "of 12 total" tells the operator that they have 4 deals that are either scheduled for the future, completed, or paused.
282
+
283
+ **Visual elements:** The card displays a megaphone icon in the top right corner to visually represent deals. A trend arrow appears next to the main value, indicating whether the active deal count has increased or decreased compared to the previous period. The arrow points upward with a positive percentage when deals have increased, or downward with a negative percentage when deals have decreased.
284
+
285
+ **Where the data comes from:** The system counts all deals where status equals "active" and today's date is within the start and end dates. The total deals count includes all deals regardless of status.
286
+
287
+ ### 3.3 Total Impressions Card
288
+
289
+ This card displays the total count of advertisement plays across all screens during the selected time period. The number is formatted for readability using abbreviations: values over one million appear with an "M" suffix (for example, "5.2M"), values over one thousand appear with a "K" suffix (for example, "245K"), and smaller values appear as regular numbers.
290
+
291
+ The subtitle text reads "Last 30 days" to indicate the time period being measured. Every time a screen finishes showing an advertisement and logs that play back to the system, the impression count increases by one.
292
+
293
+ **Visual elements:** The card displays an eye icon in the top right corner to visually represent impressions (the act of viewing). A trend arrow indicates whether impressions have increased or decreased compared to the previous 30-day period.
294
+
295
+ **Where the data comes from:** The system sums the "delivered impressions" field from the dashboard metrics API. Each line item tracks its own delivery count, and this card presents the aggregate total.
296
+
297
+ **Why it matters:** Impressions are the fundamental currency of advertising. Advertisers buy impressions, and this card shows how many were delivered. Comparing impressions across time periods reveals whether the advertising business is growing or shrinking.
298
+
299
+ ### 3.4 Revenue Card
300
+
301
+ This card shows the total money earned from advertising during the selected time period. The figure is displayed in formatted currency (for example, "$45,230" or "$195,000"). The subtitle text reads "Last 30 days" to indicate the measurement period.
302
+
303
+ **Visual elements:** The card displays a dollar sign icon in the top right corner. A trend arrow indicates whether revenue has increased or decreased compared to the previous period.
304
+
305
+ **Where the data comes from:** Revenue comes from two sources, which the system adds together.
306
+
307
+ For traditional deals, revenue is calculated as:
308
+ > (Delivered Impressions ÷ 1,000) × CPM
309
+
310
+ For example, if a line item delivered 50,000 impressions at a CPM of $12, the revenue is (50,000 ÷ 1,000) × $12 = $600.
311
+
312
+ For programmatic deals, revenue comes from the actual clearing prices of won auctions. Each time the platform wins a bid, the bid amount is added to revenue. These amounts vary based on real-time demand.
313
+
314
+ ### 3.5 Fill Rate Card
315
+
316
+ Fill rate answers the question: "Of all the advertising opportunities we had available, what percentage did we actually sell?" The main value is displayed as a percentage (for example, "87%").
317
+
318
+ The subtitle shows the average CPM in currency format (for example, "Avg CPM: $8.50"). This provides additional context about the quality of demand.
319
+
320
+ **Visual elements:** The card displays an upward trending line icon in the top right corner. A trend arrow indicates whether fill rate has improved or declined compared to the previous period.
321
+
322
+ **The calculation works like this:**
323
+
324
+ First, the system calculates available impressions. This is based on how many screens are active, how many hours each screen operates per day, and how long each advertising slot lasts. For example, if a screen operates 12 hours per day with 15-second ad slots, the screen can show approximately 2,880 ads per day (12 × 60 × 60 ÷ 15).
325
+
326
+ Second, filled impressions are the sum of all delivered impressions.
327
+
328
+ Third, the fill rate is:
329
+ > (Filled Impressions ÷ Available Impressions) × 100
330
+
331
+ **Average CPM calculation:**
332
+ > (Total Revenue ÷ Total Impressions) × 1,000
333
+
334
+ Average CPM indicates the quality of demand. Higher average CPM means advertisers are paying more per impression, suggesting premium inventory or strong demand.
335
+
336
+ ### 3.6 Active Line Items Card
337
+
338
+ This card monitors the operational pulse of the advertising delivery engine by tracking active line items. Line items are the execution units that directly control which advertisements are shown, making their count a critical operational metric.
339
+
340
+ The main value displays the count of line items currently in active delivery. A line item is counted as active when its status is set to active, the current date falls within its flight dates, and it has remaining budget or impression goals to deliver.
341
+
342
+ The subtitle text reads "of X total" where X represents the complete count of all line items across all deals. This ratio reveals the proportion of configured line items that are actually in delivery at any given moment.
343
+
344
+ **Visual elements:** The card displays a layers icon in the top right corner, representing the stacked nature of line items within the deal hierarchy. A trend arrow indicates the direction of change compared to the previous measurement period.
345
+
346
+ **Where the data comes from:** The `activeLineItems` field contains line items meeting the active criteria. The `totalLineItems` field provides the complete count. Both values are retrieved from the dashboard metrics API.
347
+
348
+ **Why it matters:** Active line items represent the current delivery capacity of the platform. A low ratio of active to total line items might indicate underutilized inventory or deals that have completed. A high ratio indicates strong utilization of configured advertising.
349
+
350
+ ### 3.7 Total Creatives Card
351
+
352
+ This card provides a comprehensive view of creative assets in the Content Hub. Creatives are the actual advertisement content—videos, images, and HTML5 assets—that are ultimately displayed on screens.
353
+
354
+ The main value shows the total count of creative assets that have been uploaded to the Content Hub. This includes all creatives regardless of their approval status, assignment status, or active use.
355
+
356
+ The subtitle displays "X approved" where X is the count of creatives that have passed the approval workflow and are eligible for assignment to line items. Only approved creatives can be assigned to line items and delivered to screens.
357
+
358
+ **Visual elements:** The card displays an image icon in the top right corner to represent creative content. A trend arrow indicates whether the total creative count has grown or decreased compared to the previous period.
359
+
360
+ **Where the data comes from:** The `totalCreatives` field provides the complete count of all creative assets. The `acceptedCreatives` field (displayed as "approved" in the subtitle) counts creatives with an approved status. Both values come from the dashboard metrics API.
361
+
362
+ **Operational significance:** The ratio of approved to total creatives indicates workflow efficiency. If many creatives remain unapproved, there may be a bottleneck in the approval process that could impact deal launch schedules.
363
+
364
+ ### 3.8 Pending Approvals Card
365
+
366
+ This card highlights creatives that are waiting for review. The main value shows the count of creatives in the Content Hub with a status of "Pending" or "In Review".
367
+
368
+ The subtitle provides context by showing how many approvals were completed in the current period, enabling users to gauge approval throughput.
369
+
370
+ **Visual elements:** The card displays a clock icon to represent waiting status. A badge may indicate urgency if many approvals are pending.
371
+
372
+ **Where the data comes from:** The system counts creatives where the approval status is not yet finalized.
373
+
374
+ ### 3.9 Impression Delivery Card
375
+
376
+ This card provides a visual representation of impression delivery over time. It displays a line or area chart showing daily impression counts for the selected time period.
377
+
378
+ **Chart Features:**
379
+ - X-axis: Days within the selected time period
380
+ - Y-axis: Impression count
381
+ - Hover tooltips showing exact values for each day
382
+ - Trend line indicating overall delivery trajectory
383
+
384
+ **Time Period Options:**
385
+ - **Today:** Shows hourly breakdown of impressions delivered today
386
+ - **This Week:** Shows daily breakdown for the current week
387
+ - **This Month:** Shows daily breakdown for the current month
388
+ - **Custom:** Shows daily breakdown for the selected custom range
389
+
390
+ The chart helps identify delivery patterns, peak days, and potential issues if delivery drops unexpectedly.
391
+
392
+ ### 3.10 Inventory Availability Card
393
+
394
+ This card provides visibility into inventory booking status across the screen network. It displays the distribution of screens by their availability for new bookings.
395
+
396
+ **Availability Categories:**
397
+ - **Available:** Screens with open inventory that can accept new bookings
398
+ - **Partially Available:** Screens with some booked time slots but remaining availability
399
+ - **Sold Out:** Screens that are fully booked with no available inventory
400
+
401
+ Each category is displayed with a colored indicator (green for available, amber for partially available, red for sold out) and a count of screens in that state.
402
+
403
+ A summary footer shows the total screen count and an availability percentage bar indicating what proportion of inventory is available for booking. This helps operators quickly assess inventory capacity and identify when more screens may be needed to meet demand.
404
+
405
+ ### 3.11 Recent Deals Card
406
+
407
+ This card shows the most recently created or modified deals, allowing users to quickly access their current work.
408
+
409
+ The card displays up to 5 deals in a compact list format, showing:
410
+ - Deal name (clickable, navigates to Deal Detail)
411
+ - Deal type (Traditional/Programmatic badge)
412
+ - Status badge (Active/Paused)
413
+ - Last modified date
414
+
415
+ Deals are sorted by last modified date, with the most recent at the top.
416
+
417
+ ### 3.12 Line Item Delivery Status Card
418
+
419
+ This card provides visibility into the delivery pacing of active line items, helping users identify campaigns that need attention.
420
+
421
+ **Pacing Status Categories:**
422
+ - **On Track:** Line items delivering within 10% of expected pace (green indicator)
423
+ - **Ahead:** Line items delivering more than 10% above expected pace (blue indicator)
424
+ - **Behind:** Line items delivering 10-25% below expected pace (amber indicator)
425
+ - **At Risk:** Line items delivering more than 25% below expected pace (red indicator)
426
+
427
+ Each category displays a count of line items in that pacing state. A summary footer shows the total count of active line items being tracked.
428
+
429
+ This helps operators quickly identify campaigns that may need optimization or budget adjustments to meet their delivery goals.
430
+
431
+ ### 3.13 Creative Status Card
432
+
433
+ This card provides a breakdown of creatives by their approval status, visualized as a donut chart or stacked bar.
434
+
435
+ **Status Categories:**
436
+ - **Accepted:** Creatives that have passed Tier 1 approval
437
+ - **Pending:** Creatives awaiting review
438
+ - **Inadequate:** Creatives that failed review
439
+ - **In Review:** Creatives currently being reviewed
440
+
441
+ The visualization helps identify bottlenecks in the creative approval process.
442
+
443
+ ---
444
+
445
+ ## 4. Deals
446
+
447
+ Deals are the commercial containers that define advertising initiatives. Each deal represents an agreement with an advertiser and contains all the configuration needed for execution, including SSP/DSP settings, media owner selection, budget, goals, and flight dates.
448
+
449
+ ### 4.1 Deal Types
450
+
451
+ The Deal Type field is set directly on the deal and determines the commercial arrangement:
452
+
453
+ **Traditional**
454
+
455
+ Traditional deals represent direct sales with media owners where pricing is negotiated upfront before deal execution. These deals are best suited for brand campaigns requiring guaranteed placements with fixed pricing certainty. Inventory is reserved directly with the media owner without programmatic intermediaries.
456
+
457
+ **Programmatic**
458
+
459
+ When Programmatic is selected, the user must choose a specific programmatic deal type:
460
+
461
+ | Deal Type | Description |
462
+ |-----------|-------------|
463
+ | Programmatic Guaranteed (PG) | Combines automation benefits of programmatic technology with security of reserved inventory. Fixed pricing through DSP ensures predictable costs while leveraging programmatic infrastructure. |
464
+ | Preferred Deal | Enables automated bidding through DSP platforms with real-time pricing dynamics. Provides first-look access to inventory at negotiated floor prices before open auction. |
465
+ | Private Marketplace (PMP) | Provides access to curated inventory through invitation-only auctions. Multiple buyer seats can participate, enabling controlled competition among selected demand partners. |
466
+ | Always On | Supports continuous deals with flexible delivery targets and sophisticated budget pacing controls. Designed for ongoing advertising presence rather than fixed-flight campaigns. |
467
+ | Open Auction | Real-time bidding environment where any qualified buyer can compete for impressions at market-determined prices. |
468
+
469
+ ### 4.2 Deals Page Layout
470
+
471
+ The Deals page presents a comprehensive list of all deals in the system. Understanding the page layout helps users navigate efficiently.
472
+
473
+ **Search Functionality**: At the top of the page, a search input allows users to quickly find deals by typing the deal name or ID. The list filters in real-time as the user types, showing only deals matching the search term.
474
+
475
+ **Listing Order**: Deals are sorted by last edited date, with the most recently edited deals appearing first. This ensures that active work is always visible at the top.
476
+
477
+ **Filter Drawer**: Clicking the "Filters" button in the page header opens a drawer panel from the right side of the screen. This drawer contains filtering options using searchable dropdown selectors:
478
+ - **Status**: Multi-select dropdown to filter by Active or Paused status
479
+ - **Deal Type**: Multi-select dropdown to filter by Traditional or Programmatic types (PG, Preferred Deal, PMP, Always On)
480
+ - **Goal Type**: Multi-select dropdown to filter by goal type (Impressions, Reach, Share of Voice, Carbon Emission, Ad Plays)
481
+ - **SSP Partner**: Multi-select dropdown to filter by SSP partner (defaults to Influence built-in SSP)
482
+ - **Media Owner**: Searchable dropdown to filter by media owner company
483
+ - **Client Type**: Multi-select dropdown to filter by client type (Agency, Direct Advertiser). Both options are unselected by default (showing all deals). When "Agency" is selected, the Agency filter becomes visible
484
+ - **Agency**: Searchable dropdown to filter by agency name (only visible when "Agency" is selected in Client Type filter)
485
+ - **Brand**: Searchable dropdown to filter by specific brand
486
+ - **Source**: Multi-select dropdown to filter by deal source (Influence, Planner, Activate)
487
+ - **Country**: Multi-select dropdown to filter by deal countries
488
+ - **Flight Date Range**: Date picker to filter deals by their flight dates
489
+ - **Budget Range**: Number range to filter by deal budget (min/max)
490
+
491
+ Each dropdown displays a count of selected items (e.g., "2 selected") and shows removable badges below the dropdown for each selected value. The Apply button applies the filters, and the Clear All button resets all selections.
492
+
493
+ **Data Formatting**: All dates are displayed in MMM DD, YYYY format (e.g., "Jan 22, 2026"). Currency values display with ISO 3-letter codes (e.g., "USD 50,000" instead of "$50,000").
494
+
495
+ **Deals Table Columns**: The deals list displays the following columns:
496
+ - **Deal Name**: The name of the deal
497
+ - **Type**: The deal type (Traditional, PG, PMP, etc.)
498
+ - **Source**: Identifies where the deal originated from (Influence, Planner, Activate)
499
+ - **Status**: Current status indicated by a badge (Active or Paused)
500
+ - **Budget**: Total deal budget
501
+ - **Spent**: Amount spent to date
502
+ - **Duration**: Deal start and end dates
503
+
504
+ **Source Field**: The Source column helps identify where a deal was created:
505
+ - **Influence**: Deals created directly in the Influence UI
506
+ - **Planner**: Traditional deals sent from the Planner platform (pre-approved)
507
+ - **Activate**: Programmatic deals sent from the Activate platform (RFP workflow completed)
508
+
509
+ This tracking is essential for auditing deal origins, troubleshooting, and understanding integration usage.
510
+
511
+ ### 4.3 Creating a Deal
512
+
513
+ When the user clicks "New Deal" at the top of the Deals page, the application navigates to a dedicated form page at `/deals/new`. The deal form consolidates all commercial and operational configuration in one place.
514
+
515
+ **[View Interactive Diagram in Miro](https://miro.com/app/board/uXjVGH3XGbs=?moveToWidget=3458764657790198316)**
516
+
517
+ <p align="center"><em>Figure 2: Deal Creation Flow</em></p>
518
+
519
+ **Color Legend:**
520
+
521
+ | Color | Shape | Meaning |
522
+ |:-----:|:-----:|:--------|
523
+ | Yellow | Circle | Start/End points |
524
+ | Light Blue | Rectangle | Basic Info fields |
525
+ | Green | Rectangle | Inventory Source fields |
526
+ | Orange | Diamond/Rectangle | Deal Type configuration |
527
+ | Purple | Rectangle | Client configuration |
528
+ | Blue | Rectangle | Budget & Goals fields |
529
+
530
+ ### 4.4 Deal Form Fields
531
+
532
+ The deal form is organized into logical sections, each grouping related fields together.
533
+
534
+ #### Section 1: Basic Info
535
+
536
+ **Name** *(Required)*
537
+
538
+ A descriptive name that identifies this deal throughout the platform. The name is auto-generated based on brand, agency, and date but can be customized. The name should be clear enough that anyone looking at a list of deals can understand what it is. Good examples: "Holiday Season 2024 - RetailMax" or "New Car Launch - AutoDrive Q1". Poor examples: "Deal 1" or "Test".
539
+
540
+ The name is required and must be unique across all deals. If the user enters a name that already exists, an error message appears: "A deal with this name already exists. Please choose a different name."
541
+
542
+ **Status**
543
+
544
+ A dropdown with two options: Active or Paused. The default value is Active. Active deals are eligible for ad serving when their line items are properly configured. Paused deals will not serve any advertisements.
545
+
546
+ **External Deal ID** *(Optional)*
547
+
548
+ An optional text field for entering a reference ID from external systems. This field allows users to link the deal to records in other platforms such as CRM systems, planning tools, or third-party order management systems.
549
+
550
+ Example values: "DEAL-12345", "PO-2026-001", "MW-IO-789"
551
+
552
+ **Billable**
553
+
554
+ A toggle switch that indicates whether this deal generates revenue. Default is ON.
555
+
556
+ When enabled, impressions delivered under this deal are counted toward revenue reporting and will appear in financial reports. Non-billable deals are typically used for house ads, testing, or promotional content that does not generate advertiser revenue.
557
+
558
+ **Media Type** *(Required)*
559
+
560
+ A dropdown that determines the advertising channel for this deal. Currently available options:
561
+
562
+ | Option | Status | Description |
563
+ |--------|--------|-------------|
564
+ | DOOH | Enabled | Digital Out-of-Home advertising on screens |
565
+ | Mobile | Disabled | Reserved for future release |
566
+ | YouTube | Disabled | Reserved for future release |
567
+ | Connected TV | Disabled | Reserved for future release |
568
+
569
+ Currently, only DOOH is available for selection. The other media types are visible in the dropdown but disabled, indicating planned future capabilities.
570
+
571
+ #### Section 2: Inventory Source
572
+
573
+ **SSP Partner** *(Required)*
574
+
575
+ A dropdown to select the Supply-Side Platform partner for this deal. **Defaults to "Influence"** (the platform's built-in SSP).
576
+
577
+ **SSP List Source:** The SSP list is sourced from Admin Console based on the logged-in user's company. Each company has configured SSP access in Admin Console, so the dropdown will only show SSP partners that the user's company has access to.
578
+
579
+ Available SSP options include:
580
+ - Influence (default - built-in SSP)
581
+ - Hivestack
582
+ - Vistar
583
+ - Place Exchange
584
+ - VIOOH
585
+ - Broadsign
586
+ - Magnite
587
+
588
+ The SSP determines which demand sources can bid on this inventory and how the programmatic connection is established.
589
+
590
+ **Note on Media Owner:** Media Owner is configured at the Line Item level, not the Deal level. This allows for more granular control and supports scenarios where a single deal spans multiple media owners (such as campaigns from Planner). See [Line Item Form Fields](#53-line-item-form-fields) for Media Owner configuration details.
591
+
592
+ #### Section 3: Deal Type Configuration
593
+
594
+ **Type** *(Required)*
595
+
596
+ A dropdown that determines the commercial arrangement for this deal:
597
+
598
+ | Option | Description |
599
+ |--------|-------------|
600
+ | Traditional | Fixed-price guaranteed delivery with reserved inventory, negotiated directly with media owner |
601
+ | Programmatic | Automated buying through DSP platforms with various auction/guaranteed mechanisms |
602
+
603
+ **Programmatic Sub-type** *(Conditional - shown when Programmatic is selected)*
604
+
605
+ When Programmatic is selected, a secondary dropdown appears to specify the exact programmatic mechanism:
606
+
607
+ | Sub-type | Description |
608
+ |----------|-------------|
609
+ | Programmatic Guaranteed (PG) | Guaranteed delivery executed programmatically with fixed pricing |
610
+ | Preferred Deal | First-look access at a fixed CPM before open auction |
611
+ | Private Marketplace (PMP) | Invitation-only auction with selected buyers (supports multi-seat) |
612
+ | Always On | Continuous deal with flexible delivery targets (supports multi-seat) |
613
+ | Open Auction | Real-time bidding where any qualified buyer can compete |
614
+
615
+ #### Section 4: Client Configuration
616
+
617
+ **Brand** *(Optional)*
618
+
619
+ A searchable dropdown to select the brand being advertised. When a brand is selected, the insights panel displays brand-specific information including:
620
+ - Brand Name with initial avatar
621
+ - Category (e.g., Food & Drink, Technology)
622
+ - IAB ID for programmatic targeting
623
+ - Contextual recommendation
624
+
625
+ **Brand Dropdown Features:**
626
+ - An "Add Brand" button appears at the bottom of the dropdown
627
+ - Clicking "Add Brand" opens a drawer with fields for Brand Name (required), IAB Category (required), Website (optional), and Logo Upload (optional)
628
+ - After creating a brand, it is automatically selected in the dropdown
629
+
630
+ **Client Type** *(Required)*
631
+
632
+ A dropdown that determines who the primary client is for this deal:
633
+ - **Direct Advertiser**: The deal is created directly for an advertiser without agency involvement. This is the default option.
634
+ - **Agency**: The deal is managed through an advertising agency.
635
+
636
+ **Agency** *(Conditional - shown when Client Type is Agency)*
637
+
638
+ A searchable dropdown to select the specific agency from the list of registered agencies. The dropdown displays each agency name with its country shown below in smaller text.
639
+
640
+ **Agency Dropdown Features:**
641
+ - An "Add Agency" button appears at the bottom of the dropdown
642
+ - Clicking "Add Agency" opens a drawer with fields for Agency Name (required), Contact Email (required), and Country (required)
643
+ - After creating an agency, it is automatically selected in the dropdown
644
+
645
+ **DSP Configuration** *(Conditional - shown when Programmatic AND Brand or Agency is selected)*
646
+
647
+ When the deal is Programmatic and either a Brand or Agency has been selected, DSP configuration fields appear in a highlighted configuration panel:
648
+
649
+ **DSP Partner**
650
+
651
+ A dropdown to select the Demand-Side Platform partner. The DSP list is sourced from the Admin Console platform based on the company's DSP Access configuration. Each company (Agency or Brand) has a list of DSP partners they are authorized to use.
652
+
653
+ **Seat Name**
654
+
655
+ A dropdown to select the buyer seat for this deal. The available seats are filtered based on the selected DSP Partner. Seat names are configured in Admin Console for each DSP-Company combination.
656
+
657
+ **Seat ID** *(View-Only)*
658
+
659
+ A read-only field that displays the unique identifier for the selected seat. The Seat ID is automatically fetched from Admin Console based on the seat name selection. The system verifies the Seat ID exists in Admin Console before allowing the deal to be saved successfully.
660
+
661
+ **DSP/Seat Management Workflow:**
662
+
663
+ 1. **DSP Access Configuration**: In Admin Console, each company (Agency or Brand) has a list of DSP partners they can access. This controls which DSPs appear in the dropdown.
664
+
665
+ 2. **Seat Creation**: While creating or editing an agency in Influence, users can select a DSP and create seats. This action creates the seat record in Admin Console.
666
+
667
+ 3. **Seat ID Verification**: When saving a deal, the system verifies the Seat ID exists in Admin Console. If the Seat ID is invalid or has been removed, the save will fail with an error message.
668
+
669
+ 4. **Seat ID Display**: Seat IDs are fetched from Admin Console and displayed as read-only in Influence. Users cannot manually enter Seat IDs.
670
+
671
+ See [Admin Console Integration](#105-admin-console-integration) for more details on the integration architecture.
672
+
673
+ #### Section 5: Budget & Goals
674
+
675
+ **Countries** *(Required - at least one)*
676
+
677
+ A multi-select dropdown to select the countries for this deal. **At least one country must be selected. By default, the country of the logged-in user's company is pre-selected.**
678
+
679
+ **Country List Source:** The available countries are sourced from Admin Console based on the logged-in user's country access permissions. Each user account has configured country access in Admin Console, so the dropdown will only show countries that the user has permission to create deals for.
680
+
681
+ The selected countries:
682
+ - Filter available inventory to screens in those countries
683
+ - Determine which cities/areas can be targeted in line items (line item geography targeting is constrained to cities, areas, and towns within the deal's selected countries)
684
+ - Affect currency options
685
+
686
+ When countries are selected, the insights panel updates to show market-specific information including population, available inventories, and estimated impression capacity.
687
+
688
+ **Currency** *(Required)*
689
+
690
+ A dropdown that shows available currencies. **The currency is automatically set based on the first selected country** (e.g., Malaysia → MYR, Singapore → SGD, United States → USD). Users can manually change the currency if needed. If multiple countries are selected, the currency defaults to the first country's currency but can be changed to any supported currency.
691
+
692
+ **Exchange Rate Margin for Cross-Currency Deals**
693
+
694
+ When the selected deal currency differs from a country's local currency, a margin is automatically applied to account for exchange rate fluctuations:
695
+
696
+ | Scenario | Example | Margin Applied |
697
+ |----------|---------|----------------|
698
+ | Currency matches country | Malaysia + MYR | No margin |
699
+ | Currency differs from country | Malaysia + USD | 3% margin added |
700
+ | Mixed currencies in multi-country | Malaysia + Singapore with USD | 3% margin for both |
701
+
702
+ **Important Exchange Rate Considerations:**
703
+
704
+ 1. **Exchange Rate Source**: Exchange rates are fetched from Admin Console, where rates are updated daily by the finance team.
705
+
706
+ 2. **Floor Rate Calculation Timing**: When a line item is created, the floor rate is calculated using the exchange rates available at that moment. This calculated floor rate is then saved on the line item record.
707
+
708
+ 3. **Floor Rate Lock-In (Critical)**: Once a line item is created and its floor rate is calculated, **the floor rate remains fixed regardless of subsequent exchange rate changes**. This means:
709
+ - If you create a line item on January 15th with a floor rate of $5.00 (converted from MYR 22.00 at 1 USD = 4.40 MYR)
710
+ - And the campaign goes live on January 20th when the exchange rate has changed to 1 USD = 4.50 MYR
711
+ - The line item will still use the original floor rate of $5.00, NOT recalculate based on the new rate
712
+
713
+ 4. **User Responsibility**: Users should be aware of this behavior and plan accordingly:
714
+ - Create line items close to the campaign launch date when possible
715
+ - Monitor exchange rate trends when dealing with volatile currencies
716
+ - Consider the margin buffer when setting floor rates for cross-currency deals
717
+
718
+ The system displays a warning in the insights panel when a currency mismatch is detected, reminding users about the margin and the floor rate lock-in behavior.
719
+
720
+ **Budget** *(Optional)*
721
+
722
+ A numeric input for entering the budget amount. When provided, the budget caps total spending for this deal regardless of impressions delivered.
723
+
724
+ While the budget field is not required, providing a budget enables the platform to return better inventory recommendations when configuring targeting in line items.
725
+
726
+ **Goal** *(Optional)*
727
+
728
+ The goal consists of two components displayed inline:
729
+
730
+ 1. **Goal Type Dropdown**: A dropdown to select the type of goal:
731
+
732
+ | Goal Type | Description |
733
+ |-----------|-------------|
734
+ | Impressions | Total number of ad views/exposures to your target audience |
735
+ | Reach | Unique individuals exposed to your deal |
736
+ | Share of Voice | Your brand's presence as a percentage of total market activity |
737
+ | Carbon Emission | Minimize or cap your deal's environmental footprint |
738
+ | Ad Plays | Total number of times your ad content is played on screens |
739
+
740
+ 2. **Goal Value Field**: A numeric input for entering the target value for the selected goal type.
741
+
742
+ **Minimum Target Threshold** *(Mandatory for PG)*
743
+
744
+ The minimum target threshold defines the delivery floor for this deal:
745
+
746
+ 1. **Target Type Dropdown**: Select whether the threshold is measured in Impressions or Ad Plays
747
+ 2. **Target Value Field**: A numeric input for entering the minimum delivery target
748
+
749
+ **Hard Stop** *(Conditional - shown only for Programmatic Guaranteed deals)*
750
+
751
+ A toggle switch that is ONLY visible when the Deal Type is Programmatic Guaranteed (PG). For all other deal types, this field is hidden.
752
+
753
+ - **Enabled**: Delivery stops immediately when the deal's budget is exhausted, preventing overspend
754
+ - **Disabled**: The deal may continue running and attempt to deliver beyond the budget constraint
755
+
756
+ **Start Date** *(Required)*
757
+
758
+ A date picker for selecting when the deal should begin delivering impressions.
759
+
760
+ **End Date** *(Required)*
761
+
762
+ A date picker for selecting when the deal should stop. No impressions will be delivered after this date. The end date must be after the start date.
763
+
764
+ #### Section 6: Verification
765
+
766
+ **AdPay Verification Report**
767
+
768
+ A checkbox that enables third-party verification tracking for this deal. When enabled, the system will generate verification reports that can be shared with advertisers to prove that advertisements were actually displayed.
769
+
770
+ **Service Provider** *(Conditional - shown when AdPay Verification is enabled)*
771
+
772
+ A dropdown specifying which third-party verification service will be used:
773
+
774
+ | Provider | Description |
775
+ |----------|-------------|
776
+ | MAV | Media Audit Verification services |
777
+ | IAS | Integral Ad Science verification |
778
+ | OIS | Out-of-Home Intelligence Services |
779
+ | Veridooh | DOOH-specific verification platform |
780
+
781
+ ### 4.5 Deal Status Lifecycle
782
+
783
+ Deals have two possible statuses: **Active** and **Paused**. This simplified status model provides clear operational control.
784
+
785
+ **[View Interactive Diagram in Miro](https://miro.com/app/board/uXjVGH3XGbs=?moveToWidget=3458764657790198312)**
786
+
787
+ <p align="center"><em>Figure 3: Deal Status Lifecycle</em></p>
788
+
789
+ **Color Legend:**
790
+
791
+ | Color | Status | Meaning |
792
+ |:-----:|:------:|:--------|
793
+ | Green | Active | Deal is running and delivering impressions |
794
+ | Orange | Paused | Deal is temporarily stopped |
795
+
796
+ **New Deal Creation**
797
+
798
+ When a deal is created, its default status is Active. All fields can be edited at any time regardless of status.
799
+
800
+ **Active → Paused**
801
+
802
+ While a deal is Active, the user can click "Pause Deal" to temporarily stop delivery. This is useful when the advertiser needs to halt the deal for business reasons. Pausing immediately stops all impressions.
803
+
804
+ **Paused → Active**
805
+
806
+ The user can click "Resume Deal" to restart a paused deal. Delivery continues from where it stopped.
807
+
808
+ **Note on External Sources:** Deals that arrive from Planner are pre-approved Traditional deals. Deals from Activate are Programmatic deals with completed RFP workflows. These deals do not go through statuses like "Generated", "Reserved", or "Negotiation" as those are part of the source platform's workflow, not Influence.
809
+
810
+ #### Deal Acceptance and Reopening
811
+
812
+ When a deal is ready for execution, the user can send it for acceptance:
813
+
814
+ **For Programmatic Deals:** The "Request Acceptance" button sends the deal configuration to DSP partners for approval.
815
+
816
+ **For Traditional Deals:** The "Activate Deal" button sends the deal to the CMS for activation.
817
+
818
+ Once a deal has been sent for acceptance:
819
+
820
+ 1. **Deal Becomes Locked:** The deal enters a locked state where no edits are permitted. A warning banner is displayed: "This deal has been sent to stakeholders for approval. Click 'Reopen' to make changes."
821
+
822
+ 2. **Reopen Functionality:** If changes are needed after the deal has been sent, the user can click the "Reopen" button to unlock editing.
823
+
824
+ 3. **Editing Restrictions After Reopening:**
825
+ - **Deal Type Cannot Be Changed:** Traditional deals cannot become Programmatic, and vice versa. The deal type is locked and displayed as read-only with a "From Deal" badge.
826
+ - **Limited Editable Fields:** After reopening, only the deal name and ad-play verification settings can be modified at the deal level.
827
+ - **Stakeholder Notification:** Any changes made after reopening require re-approval from stakeholders.
828
+
829
+ 4. **Reopened State Display:** Once reopened, the "Reopen" button shows as "Reopened" (disabled) to indicate the deal has been reopened for editing.
830
+
831
+ ### 4.6 Editing and Deleting Deals
832
+
833
+ **Editing**
834
+
835
+ The user can edit a deal by clicking the three-dot menu icon on the deal row and selecting "Edit". What can be edited depends on the deal status and acceptance state:
836
+
837
+ | Status | Acceptance State | What can be edited |
838
+ |--------|------------------|-------------------|
839
+ | Active | Not Sent | All fields including name, dates, budget, type |
840
+ | Paused | Not Sent | All fields including name, dates, budget, type |
841
+ | Active | Sent (Locked) | No edits allowed until Reopen is clicked |
842
+ | Active | Reopened | Name and Ad-Play Verification only (Deal Type is locked) |
843
+
844
+ **Deleting**
845
+
846
+ Deals can be deleted via the three-dot menu. A confirmation dialog appears: "Are you sure you want to delete this deal? This action cannot be undone."
847
+
848
+ ### 4.7 Deal Detail Page
849
+
850
+ The Deal Detail page provides a comprehensive view of a single deal and all its associated line items. This page is accessed by clicking on any deal row in the Deals list, and serves as the primary interface for managing line items within a deal context.
851
+
852
+ **Accessing the Deal Detail Page**
853
+
854
+ From the Deals list, clicking any deal row navigates to `/deals/:id`, where `:id` is the unique identifier for that deal. The page displays the deal name prominently at the top, along with a breadcrumb trail showing `Deals > Deal Name`.
855
+
856
+ **Summary Statistics**
857
+
858
+ Above the line items table, the page displays a row of metric cards that provide at-a-glance performance information for the deal:
859
+
860
+ | Metric | Description |
861
+ |--------|-------------|
862
+ | Total Line Items | Count of line items within this deal, regardless of status |
863
+ | Ad Plays | Total number of times advertisements were played across all line items |
864
+ | Impressions | Sum of delivered impressions across all line items |
865
+ | Revenue vs Budget | Comparison showing actual revenue earned versus the deal budget |
866
+ | Delivery Progress | Percentage of overall deal delivery completed, displayed as a progress bar |
867
+
868
+ **Line Items Table**
869
+
870
+ The main content area displays a table of all line items belonging to this deal. The table includes the following columns:
871
+
872
+ | Column | Description |
873
+ |--------|-------------|
874
+ | Name | The descriptive name of the line item |
875
+ | Status | Current status (Active, Paused, Draft) |
876
+ | Priority | Number 1-10 indicating serving priority (1 = highest) |
877
+ | Target Impressions | Goal number of impressions to deliver |
878
+ | Delivered | Count of impressions actually delivered |
879
+ | CPM | Cost per thousand impressions |
880
+ | Traffic Allocation | Percentage of deal traffic this item should receive |
881
+ | Pacing | Delivery status indicator (On Track, Behind, Ahead, At Risk) |
882
+
883
+ Clicking any row in this table navigates to the Line Item edit form.
884
+
885
+ **Search and Filter Functionality**
886
+
887
+ A search input at the top of the table allows users to filter line items by name. The list updates in real-time as the user types.
888
+
889
+ A "Filters" button opens the filter drawer with options specific to line items within the current deal:
890
+ - **Status**: Filter by line item status (Active or Paused)
891
+ - **Media Owner**: Filter by media owner assigned to line items
892
+ - **Flight Date Range**: Date picker to filter by line item flight dates
893
+ - **Budget Range**: Number range to filter by line item budget (min/max)
894
+
895
+ **Creating New Line Items**
896
+
897
+ A "New Line Item" button appears in the page header. Clicking this button navigates to the line item creation form at `/deals/:dealId/line-items/new`, with the deal pre-selected.
898
+
899
+ **Deal Activation Workflow**
900
+
901
+ After at least one line item has been created for the deal, an activation button appears in the Deal Detail page header. The button type and behavior depend on the deal type:
902
+
903
+ **For Programmatic Deals**
904
+
905
+ A **Request Acceptance** button appears. Clicking this button:
906
+
907
+ 1. Validates that at least one line item exists
908
+ 2. Generates deal packages with all targeting, pricing, and scheduling parameters
909
+ 3. Sends the deal proposal to the DSP partner specified in the deal
910
+ 4. Transitions the deal to a "pending acceptance" state
911
+
912
+ DSP partners review the deal proposals and respond with either acceptance or rejection. Once accepted, ad serving can begin.
913
+
914
+ **For Traditional Deals**
915
+
916
+ An **Activate Deal** button appears. Clicking this button:
917
+
918
+ 1. Validates that at least one line item exists
919
+ 2. Packages all deal and line item information
920
+ 3. Sends the configuration to the Booking Engine for publication
921
+ 4. Transitions the deal to an "active" state
922
+
923
+ **Button Visibility and Enablement**
924
+
925
+ - **Button is hidden**: Until at least one line item has been created
926
+ - **Button is disabled**: If the deal has no line items
927
+ - **Button is enabled**: When at least one line item exists and is properly configured
928
+
929
+ ### 4.8 Mandatory Fields
930
+
931
+ Certain fields throughout the platform are marked as mandatory, indicated by an asterisk (*) next to the field label. The system prevents saving records when mandatory fields are not completed.
932
+
933
+ **Deal Mandatory Fields**
934
+
935
+ | Field | Description |
936
+ |-------|-------------|
937
+ | Deal Name * | A unique, descriptive name identifying the deal |
938
+ | Media Type * | The advertising channel (currently DOOH only) |
939
+ | Client Type * | Whether the deal is for a Direct Advertiser or Agency |
940
+ | SSP Partner * | The supply-side platform partner for this deal |
941
+ | Countries * | At least one country must be selected |
942
+ | Start Date * | When the deal begins serving |
943
+ | End Date * | When the deal stops serving |
944
+ | Deal Type * | Traditional or Programmatic (with sub-type if Programmatic) |
945
+ | DSP Partner * | Required only for programmatic deal types |
946
+
947
+ **Line Item Mandatory Fields**
948
+
949
+ | Field | Description |
950
+ |-------|-------------|
951
+ | Line Item Name * | A descriptive name for the line item |
952
+ | Media Owner * | The media owner whose screens will be used |
953
+ | Creative Type * | The format of the advertisement (Display, Video, or Audio) |
954
+ | Start Date * | When the line item begins serving |
955
+ | End Date * | When the line item stops serving |
956
+ | Floor Rate * | The minimum price for this line item |
957
+ | Floor Rate Type * | How pricing is calculated (CPM or CPS) |
958
+
959
+ **Validation Indicators**
960
+
961
+ - **Form-level validation**: Inline error messages appear next to incomplete fields
962
+ - **List view warnings**: Warning icons appear next to items with missing required fields
963
+ - **Tooltip details**: Hovering over warnings shows which fields are missing
964
+
965
+ ### 4.9 Deal Form Quick Tips and Brand Information
966
+
967
+ The right side of the deal form displays a dynamic contextual panel that updates as users scroll through the form and interact with fields. This panel provides section-specific guidance and, when applicable, displays brand information.
968
+
969
+ #### 4.9.1 Dynamic Quick Tips (Scroll-Based)
970
+
971
+ The Quick Tips panel intelligently updates its content based on which section of the form is currently visible as the user scrolls. This provides contextually relevant guidance exactly when needed.
972
+
973
+ **Section: Deal Basics** (Visible when viewing Deal Name, Status, External ID, Billable, Media Type)
974
+
975
+ | Tip | Description |
976
+ |-----|-------------|
977
+ | Deal Name | Should be descriptive and unique to easily identify it in lists |
978
+ | Status | Controls whether the deal is Active (running) or Paused (stopped) |
979
+ | Media Type | Defines the channel - DOOH (Digital Out-of-Home) is for digital screens |
980
+ | External Deal ID | Helps sync with external systems like your CRM |
981
+ | Billable | Flag determines if this deal is included in invoicing |
982
+
983
+ **Section: Supply Configuration** (Visible when viewing SSP Partner, Deal Type)
984
+
985
+ | Tip | Description |
986
+ |-----|-------------|
987
+ | SSP Partner | Supply-Side Platform provides access to inventory networks |
988
+ | Deal Type | Determines pricing model - Traditional or Programmatic |
989
+ | Programmatic | Enables automated real-time bidding with DSP partners |
990
+ | Media Owner | Selected at Line Item level for more granular control |
991
+ | Client Type | Indicates if this is a direct client or through an agency |
992
+
993
+ **Section: Brand & Verification** (Visible when viewing Brand, Client, DSP Config, AdPlay Verification, Countries)
994
+
995
+ | Tip | Description |
996
+ |-----|-------------|
997
+ | Brand Selection | Enables brand-specific insights and recommendations |
998
+ | AdPlay Verification | Ensures ads are actually played on screens |
999
+ | Countries | Selected here limit geography targeting in line items |
1000
+ | Line Item Geography | Can only target cities/areas within the deal's countries |
1001
+
1002
+ **Section: Budget & Goals** (Visible when viewing Currency, Budget, Goal Type, Goal Value, PG Settings)
1003
+
1004
+ | Tip | Description |
1005
+ |-----|-------------|
1006
+ | Currency | Determines the monetary unit for all budget and pricing |
1007
+ | Currency Margin | 3% margin applies when inventory uses different currencies |
1008
+ | Goal Type | Sets what you're optimizing for - Impressions, Reach, etc. |
1009
+ | Budget & Goals | Help with better inventory recommendations in Line Items |
1010
+ | Budget Tracking | Setting budget enables spend tracking and pacing recommendations |
1011
+
1012
+ #### 4.9.2 Brand Information Card
1013
+
1014
+ When a brand is selected AND the user is viewing the Brand section of the form, the Quick Tips panel is replaced with a Brand Information card that displays:
1015
+
1016
+ | Element | Description |
1017
+ |---------|-------------|
1018
+ | Brand Logo | Large initial letter avatar (placeholder until logo URL is provided) |
1019
+ | Brand Name | Full brand name prominently displayed |
1020
+ | Status | Active Brand or Inactive Brand indicator |
1021
+ | IAB Category | The brand's business category as a badge (e.g., "Food & Drink", "Technology & Computing") |
1022
+ | IAB Code | Abbreviated code derived from the category (e.g., "F&D" for Food & Drink) |
1023
+ | Recommendation | "Brand selection enables personalized inventory recommendations in line items" |
1024
+
1025
+ The Brand Information card provides immediate visual confirmation of the selected brand and its categorization, helping users verify they've selected the correct brand before proceeding.
1026
+
1027
+ #### 4.9.3 Panel Display Logic
1028
+
1029
+ The right panel follows these display rules in priority order:
1030
+
1031
+ 1. **Brand Info Card**: Displayed when a brand is selected AND the visible section is "brand"
1032
+ 2. **Quick Tips**: Displayed in all other cases, with content matching the currently visible form section
1033
+ 3. **Market Insights**: When countries are selected, the Market Insights panel is shown below the Quick Tips/Brand Info card as an additional panel
1034
+
1035
+ This ensures users always have relevant contextual information visible without having to scroll or navigate away from their current position in the form.
1036
+
1037
+ #### 4.9.4 Market Insights Panel
1038
+
1039
+ When users select one or more countries, an additional Market Insights panel appears below the Quick Tips or Brand Info card:
1040
+
1041
+ | Element | Description |
1042
+ |---------|-------------|
1043
+ | Country Flags | Visual representation of selected markets |
1044
+ | World Map | Regional visualization highlighting selected countries |
1045
+ | Population | Combined population across selected markets |
1046
+ | Inventories | Total available screen inventory in selected countries |
1047
+ | Impressions | Estimated impression capacity across markets |
1048
+
1049
+ ### 4.10 VAST Tag Distribution
1050
+
1051
+ #### 4.10.1 Overview
1052
+
1053
+ Once a deal is created and line items are configured, the ad serving system needs a way to connect with the media owner's CMS and players. This connection happens through VAST (Video Ad Serving Template) endpoints. A VAST endpoint is a URL that the player calls whenever it needs to show an ad. The player sends a request to the endpoint, receives back an XML response containing the creative media file URL and tracking instructions, and then renders the advertisement.
1054
+
1055
+ The challenge is that not all media owners' CMS platforms support VAST endpoints natively. Some older or simpler CMS systems can only schedule static content files like HTML pages or ZIP packages. Influence addresses both scenarios by providing three distribution formats:
1056
+
1057
+ 1. **VAST Endpoint URL** - For CMS platforms that natively support VAST tags (e.g., Broadsign, Scala, Signagelive)
1058
+ 2. **HTML File** - A self-contained HTML page with an embedded VAST player, for CMS platforms that support web content scheduling
1059
+ 3. **ZIP Package** - A bundled package containing the HTML player and all required assets, for CMS platforms that only accept offline file uploads
1060
+
1061
+ #### 4.10.2 VAST Endpoint URL Structure
1062
+
1063
+ Each line item generates its own VAST endpoint URL. The endpoint is generated at the line item level (not the deal level) because each line item has its own targeting, creatives, and delivery configuration.
1064
+
1065
+ **URL Format:**
1066
+
1067
+ ```
1068
+ https://{platform-domain}/vast/v1/{deal-id}/{line-item-id}?screen_id={screen_id}&player_id={player_id}
1069
+ ```
1070
+
1071
+ **URL Parameters:**
1072
+
1073
+ | Parameter | Type | Description |
1074
+ |-----------|------|-------------|
1075
+ | `{platform-domain}` | Path | The Influence platform domain (e.g., `adserver.influence.io`) |
1076
+ | `{deal-id}` | Path | The unique identifier of the parent deal |
1077
+ | `{line-item-id}` | Path | The unique identifier of the line item |
1078
+ | `screen_id` | Query | The ID of the screen making the ad request (provided by the player) |
1079
+ | `player_id` | Query | The ID of the media player making the request (provided by the player) |
1080
+
1081
+ **Example:**
1082
+ ```
1083
+ https://adserver.influence.io/vast/v1/deal_abc123/li_xyz789?screen_id=SCR001&player_id=PL001
1084
+ ```
1085
+
1086
+ **VAST Response:**
1087
+
1088
+ When a player calls the endpoint, Influence evaluates the line item's targeting rules, traffic allocation, priority, and frequency caps. If an ad is eligible to serve, the response is a standard VAST XML document containing:
1089
+
1090
+ - The creative media file URL (video, image, or HTML5)
1091
+ - Impression tracking pixel URLs
1092
+ - Start, complete, and quartile tracking events
1093
+ - Click-through URL (if applicable)
1094
+ - Ad duration and creative dimensions
1095
+
1096
+ If no ad is eligible (e.g., frequency cap reached, budget exhausted, outside flight dates), the response is an empty VAST document with no ad elements, signaling the player to move on to its next scheduled content.
1097
+
1098
+ #### 4.10.3 Distribution Tab on Deal Detail Page
1099
+
1100
+ The Distribution interface is accessed via a **"Distribution"** tab on the Deal Detail page (`/deals/:id`). This tab appears alongside the existing Line Items tab once the deal has been activated (i.e., after "Request Acceptance" for programmatic deals or "Activate Deal" for traditional deals).
1101
+
1102
+ **Tab Visibility Rules:**
1103
+
1104
+ | Deal State | Distribution Tab |
1105
+ |------------|-----------------|
1106
+ | Deal created, no line items | Hidden |
1107
+ | Deal with line items, not yet activated | Hidden |
1108
+ | Deal activated (acceptance requested or deal activated) | Visible |
1109
+ | Deal paused | Visible (with warning banner) |
1110
+
1111
+ **Distribution Tab Layout:**
1112
+
1113
+ The tab displays a table listing each line item in the deal, with distribution information:
1114
+
1115
+ | Column | Description |
1116
+ |--------|-------------|
1117
+ | Line Item Name | The name of the line item (clickable, navigates to line item form) |
1118
+ | Status | Current line item status (Active, Paused) |
1119
+ | VAST Endpoint | The full VAST endpoint URL with a copy-to-clipboard button |
1120
+ | Actions | Download dropdown with options: "Copy URL", "Download HTML", "Download ZIP" |
1121
+
1122
+ **Copy-to-Clipboard Behavior:**
1123
+
1124
+ Clicking the copy button next to the VAST endpoint URL copies the full URL to the clipboard and displays a brief toast notification: "VAST endpoint copied to clipboard". The copy button uses a clipboard icon that briefly changes to a checkmark icon upon successful copy.
1125
+
1126
+ **Bulk Actions:**
1127
+
1128
+ A "Download All" button in the table header allows downloading all line item tags at once:
1129
+ - **Download All as ZIP**: Creates a single ZIP file containing individual HTML files for each line item, organized in folders named by line item
1130
+ - **Copy All URLs**: Copies all VAST endpoint URLs to the clipboard, one per line, with line item names as labels
1131
+
1132
+ #### 4.10.4 CMS Compatibility Options
1133
+
1134
+ The Actions column for each line item provides a dropdown menu with three distribution options:
1135
+
1136
+ **Option 1: Copy VAST URL**
1137
+
1138
+ For media owners whose CMS natively supports VAST tags. The user copies the endpoint URL and pastes it into their CMS scheduling interface. This is the preferred method when supported, as the player communicates directly with Influence's ad server in real-time.
1139
+
1140
+ **Compatible CMS platforms include:**
1141
+ - Broadsign
1142
+ - Scala (Stratacache)
1143
+ - Signagelive
1144
+ - BrightSign
1145
+ - Navori
1146
+ - Any CMS with VAST 3.0+ or VAST 4.0+ support
1147
+
1148
+ **Option 2: Download HTML**
1149
+
1150
+ For CMS platforms that can schedule web content (HTML pages) but do not support VAST tags directly. The downloaded HTML file is a self-contained web page with an embedded lightweight VAST player.
1151
+
1152
+ **Option 3: Download ZIP**
1153
+
1154
+ For CMS platforms that only accept file uploads (no URL scheduling, no web content). The ZIP package contains the HTML player file plus all required JavaScript and CSS assets bundled for offline use.
1155
+
1156
+ #### 4.10.5 HTML File Generation
1157
+
1158
+ When the user clicks "Download HTML", the backend generates a self-contained HTML file that wraps the VAST endpoint in a lightweight ad player.
1159
+
1160
+ **HTML File Contents:**
1161
+
1162
+ The generated HTML file includes:
1163
+
1164
+ 1. **VAST Player Library**: A lightweight JavaScript VAST client (based on the IAB VAST standard) that handles:
1165
+ - Calling the VAST endpoint URL
1166
+ - Parsing the VAST XML response
1167
+ - Rendering the creative (video, image, or HTML5)
1168
+ - Firing tracking pixels (impression, quartile, complete events)
1169
+ - Handling error cases (empty VAST, network failures)
1170
+
1171
+ 2. **Configuration Block**: A JSON configuration embedded in the HTML that includes:
1172
+ - The VAST endpoint URL for this specific line item
1173
+ - Refresh interval (how often to request a new ad, in seconds)
1174
+ - Fallback behavior (what to display if no ad is available)
1175
+ - Creative dimensions (width and height matching the line item's inventory format)
1176
+
1177
+ 3. **Responsive Layout**: The HTML page auto-sizes to fill the player's display area, ensuring the creative renders at the correct dimensions regardless of screen resolution.
1178
+
1179
+ 4. **Error Handling**: If the VAST endpoint returns no ad or is unreachable, the player:
1180
+ - Displays a transparent/blank frame (allowing the CMS's default content to show through)
1181
+ - Retries after the configured refresh interval
1182
+ - Logs errors locally for diagnostic purposes
1183
+
1184
+ **File Naming Convention:**
1185
+
1186
+ ```
1187
+ {deal-name}_{line-item-name}_vast.html
1188
+ ```
1189
+
1190
+ Example: `Summer_Refresh_Mall_Entrance_Screens_vast.html`
1191
+
1192
+ Special characters in names are replaced with underscores, and the filename is truncated to 100 characters maximum.
1193
+
1194
+ #### 4.10.6 ZIP Package Generation
1195
+
1196
+ When the user clicks "Download ZIP", the backend generates a ZIP archive containing everything needed for fully offline VAST playback.
1197
+
1198
+ **ZIP Package Contents:**
1199
+
1200
+ ```
1201
+ /{deal-name}_{line-item-name}/
1202
+ ├── index.html # Main HTML file (same as the HTML download)
1203
+ ├── assets/
1204
+ │ ├── vast-player.min.js # Minified VAST player library
1205
+ │ ├── vast-player.min.css # Player styles
1206
+ │ └── fallback.png # Optional fallback image (transparent 1x1 pixel)
1207
+ ├── config.json # Player configuration
1208
+ └── README.txt # Instructions for the media owner
1209
+ ```
1210
+
1211
+ **README.txt Contents:**
1212
+
1213
+ The README file provides plain-language instructions for the media owner:
1214
+
1215
+ ```
1216
+ VAST Ad Tag Package - {Deal Name} / {Line Item Name}
1217
+ Generated: {date}
1218
+ Generated by: Influence Adserver
1219
+
1220
+ SETUP INSTRUCTIONS:
1221
+ 1. Upload this folder to your CMS
1222
+ 2. Schedule "index.html" as a web content item on the target screens
1223
+ 3. Set the duration to match your ad slot length
1224
+ 4. Ensure the player has internet connectivity for ad requests
1225
+
1226
+ REQUIREMENTS:
1227
+ - Internet connection (for real-time ad requests)
1228
+ - HTML5-capable media player
1229
+ - Minimum screen resolution: {width}x{height}
1230
+
1231
+ VAST ENDPOINT:
1232
+ {full VAST endpoint URL}
1233
+
1234
+ SUPPORT:
1235
+ Contact your Influence account manager for technical assistance.
1236
+ ```
1237
+
1238
+ **File Naming Convention:**
1239
+
1240
+ ```
1241
+ {deal-name}_{line-item-name}_vast_package.zip
1242
+ ```
1243
+
1244
+ #### 4.10.7 Distribution Workflow by Deal Type
1245
+
1246
+ The distribution workflow differs slightly based on deal type:
1247
+
1248
+ **Traditional Deals:**
1249
+
1250
+ 1. Deal is created with traditional line items
1251
+ 2. Line items are configured with targeting, creatives, and flight dates
1252
+ 3. User clicks "Activate Deal" on the Deal Detail page
1253
+ 4. The "Distribution" tab becomes visible
1254
+ 5. User shares VAST tags (URL, HTML, or ZIP) with the media owner
1255
+ 6. Media owner schedules the tags on their CMS/players
1256
+ 7. Players begin calling the VAST endpoint when the flight dates start
1257
+ 8. Influence serves creatives and tracks impressions
1258
+
1259
+ **Programmatic Deals:**
1260
+
1261
+ 1. Deal is created with programmatic line items
1262
+ 2. Line items are configured with targeting, creatives, bid strategy, and flight dates
1263
+ 3. User clicks "Request Acceptance" on the Deal Detail page
1264
+ 4. DSP partners review and accept the deal
1265
+ 5. The "Distribution" tab becomes visible
1266
+ 6. User shares VAST tags with the media owner
1267
+ 7. Players begin calling the VAST endpoint
1268
+ 8. When a request comes in, Influence initiates a programmatic auction via the SSP
1269
+ 9. DSP bids are evaluated, winning creative is served
1270
+ 10. Impressions and bid data are tracked
1271
+
1272
+ **Key Difference:** For programmatic deals, the VAST endpoint triggers an auction process rather than directly serving a pre-assigned creative. The endpoint URL structure is the same, but the backend logic differs.
1273
+
1274
+ #### 4.10.8 API Endpoints
1275
+
1276
+ | Method | Endpoint | Description |
1277
+ |--------|----------|-------------|
1278
+ | `GET` | `/api/deals/:dealId/distribution` | Returns distribution information for all line items in the deal, including VAST endpoint URLs |
1279
+ | `GET` | `/api/deals/:dealId/line-items/:lineItemId/vast-tag` | Returns the VAST endpoint URL for a specific line item |
1280
+ | `GET` | `/api/deals/:dealId/line-items/:lineItemId/vast-tag/html` | Generates and downloads the HTML file for a specific line item |
1281
+ | `GET` | `/api/deals/:dealId/line-items/:lineItemId/vast-tag/zip` | Generates and downloads the ZIP package for a specific line item |
1282
+ | `GET` | `/api/deals/:dealId/distribution/download-all` | Downloads a single ZIP containing HTML files for all line items in the deal |
1283
+ | `GET` | `/vast/v1/:dealId/:lineItemId` | The actual VAST endpoint called by players (returns VAST XML) |
1284
+
1285
+ ---
1286
+
1287
+ ## 5. Line Items
1288
+
1289
+ Line items are where actual advertising execution happens. While deals provide commercial and operational structure, line items specify targeting criteria, pricing, delivery goals, and track how many impressions have been delivered.
1290
+
1291
+ ### 5.1 What Line Items Control
1292
+
1293
+ Each line item specifies the following:
1294
+
1295
+ **Target Impressions**
1296
+
1297
+ The goal number of impressions this line item should deliver. This is the commitment to the advertiser. For example, a target of 100,000 means the line item should show the ad 100,000 times.
1298
+
1299
+ **CPM (Cost Per Mille)**
1300
+
1301
+ The price for 1,000 impressions. For traditional line items, this is the agreed rate with the advertiser. For programmatic line items, this is the floor price - bids below this amount are rejected.
1302
+
1303
+ Example: At $15 CPM, delivering 100,000 impressions generates revenue of (100,000 ÷ 1,000) × $15 = $1,500.
1304
+
1305
+ **Priority**
1306
+
1307
+ A number from 1 to 10, where 1 is highest priority and 10 is lowest. When multiple line items are eligible to show on the same screen at the same moment, priority determines consideration order.
1308
+
1309
+ Priority 1 line items are considered first. Only if they are unavailable (paused, capped, or allocated elsewhere) are priority 2 line items considered, and so on.
1310
+
1311
+ Typical priority assignments:
1312
+ - Priority 1: Sponsorships and premium takeovers
1313
+ - Priority 2-3: High-value guaranteed deals
1314
+ - Priority 4-5: Standard deals (default)
1315
+ - Priority 6-7: Lower-value or remnant inventory
1316
+ - Priority 8-10: House ads and default content
1317
+
1318
+ **Traffic Allocation**
1319
+
1320
+ Controls what share of the parent deal's traffic this line item should receive. See Section 6 for details.
1321
+
1322
+ **Creative Duration**
1323
+
1324
+ The length of the advertisement in seconds. Common values are 5, 10, 15, 20, 30, or 60 seconds. This must match the actual creative file's duration.
1325
+
1326
+ **Assigned Creatives**
1327
+
1328
+ Each line item must have at least one creative assigned to it before it can deliver impressions. Assigned creatives are selected from the Content Hub and must have **Tier 1 Accepted** status.
1329
+
1330
+ When creatives are assigned to a line item, they enter the **Tier 2 Approval workflow** where the Media Owner validates their compatibility with the target screens. A line item requires at least one creative with **Tier 2 Approved** status before any impressions can be delivered.
1331
+
1332
+ Multiple creatives can be assigned to a single line item with individual weights controlling their rotation frequency (e.g., 50%, 30%, 20%). This enables A/B testing, creative rotation, and fatigue prevention.
1333
+
1334
+ ### 5.2 Creating a Line Item
1335
+
1336
+ When the user clicks "New Line Item" from the Deal Detail page, the application navigates to a dedicated form page at `/deals/:dealId/line-items/new`.
1337
+
1338
+ #### Line Item Form Structure
1339
+
1340
+ The Line Item form is a single-page form with card-based sections. Each section is organized vertically with a forecasting panel on the right side that updates in real-time based on form selections.
1341
+
1342
+ The form contains the following card-based sections:
1343
+
1344
+ **[View Interactive Diagram in Miro](https://miro.com/app/board/uXjVGH3XGbs=?moveToWidget=3458764657790198320)**
1345
+
1346
+ <p align="center"><em>Figure 4: Line Item Creation Flow</em></p>
1347
+
1348
+ **Color Legend:**
1349
+
1350
+ | Color | Meaning |
1351
+ |:-----:|:--------|
1352
+ | Light Blue | Form sections |
1353
+ | Green | Targeting criteria fields |
1354
+ | Yellow | Inventory source fields |
1355
+ | Indigo | Inventory selection fields |
1356
+ | Orange | Advanced options |
1357
+ | Purple | Success outcome |
1358
+ | Gray | End point |
1359
+
1360
+ #### Section 1: Basic Info
1361
+
1362
+ **Name** *(Required)*
1363
+
1364
+ A descriptive name that identifies this line item. The name should indicate the creative and targeting approach. Examples: "15s Brand Anthem - Mall Entrances", "10s Product Promo - Transit", or "30s Video - Premium Locations".
1365
+
1366
+ **Status**
1367
+
1368
+ A dropdown with three options:
1369
+ - **Active**: The line item is running and eligible for ad serving
1370
+ - **Paused**: The line item is temporarily stopped
1371
+ - **Draft**: The line item is being configured and is not yet ready to serve
1372
+
1373
+ Default value is Draft for new line items.
1374
+
1375
+ **Copy Existing Line Item**
1376
+
1377
+ A searchable dropdown that allows selecting an existing line item to use as a template. When selected, all configuration from the source line item is copied.
1378
+
1379
+ This option is not available for PG (Programmatic Guaranteed) deals.
1380
+
1381
+ #### Section 2: Creative
1382
+
1383
+ **Creative Type** *(Required)*
1384
+
1385
+ A dropdown that specifies the format of the advertisement:
1386
+
1387
+ | Type | Description |
1388
+ |------|-------------|
1389
+ | Display | Static image advertisements (JPEG, PNG) |
1390
+ | Video | Moving picture advertisements (MP4, WebM) |
1391
+ | Audio | Audio-only advertisements for screens with speakers |
1392
+
1393
+ **Priority**
1394
+
1395
+ A slider control ranging from 1 to 10, where:
1396
+ - **1** = Highest priority (premium placements, sponsorships)
1397
+ - **10** = Lowest priority (house ads, default content)
1398
+
1399
+ Default value is 5 (standard priority).
1400
+
1401
+ **Auction Type** *(View-Only, Auto-Calculated)*
1402
+
1403
+ This field displays the auction mechanism based on the parent deal's type:
1404
+
1405
+ | Parent Deal Type | Auction Type |
1406
+ |------------------|--------------|
1407
+ | Programmatic Guaranteed (PG) | Fixed Price |
1408
+ | Preferred Deal | Fixed Price |
1409
+ | Traditional | Not Applicable |
1410
+ | Always On | First Price Auction |
1411
+ | Private Marketplace (PMP) | First Price Auction |
1412
+ | Open Auction | First Price Auction |
1413
+
1414
+ #### Section 3: Targeting
1415
+
1416
+ **Section Title:** "Targeting"
1417
+ **Section Description:** "Define audience targeting criteria"
1418
+
1419
+ All targeting fields are multi-select, allowing users to include multiple values for broader reach or narrow targeting.
1420
+
1421
+ **Inherited Geographic Constraints**
1422
+
1423
+ Line items inherit country settings from their parent Deal. Geography targeting (cities, areas, towns, POIs) can only select locations within the deal's selected countries.
1424
+
1425
+ **Demographics**
1426
+
1427
+ Demographics targeting is organized into two separate collapsible sections within the Targeting card. Each section uses a summary row pattern that displays the current selection and expands to reveal options when clicked. Clicking outside an expanded section automatically closes it.
1428
+
1429
+ **Age Groups**
1430
+
1431
+ A collapsible section showing "X age groups selected" in the summary row. When expanded, displays a grid of checkboxes:
1432
+ - 18-24
1433
+ - 25-34
1434
+ - 35-44
1435
+ - 45-54
1436
+ - 55-64
1437
+ - 65+
1438
+
1439
+ **Gender**
1440
+
1441
+ A separate collapsible section showing "X genders selected" in the summary row. When expanded, displays checkboxes:
1442
+ - Male
1443
+ - Female
1444
+
1445
+ **Geography (Advanced Map)**
1446
+
1447
+ Select target geographic areas within the deal's countries using an interactive map-based interface. Clicking the Geography row opens the Advanced Map Drawer containing:
1448
+
1449
+ **Advanced Map Drawer**
1450
+
1451
+ The drawer provides a comprehensive geotargeting interface with advanced Mapbox tooling:
1452
+
1453
+ **Map Toolbar**
1454
+
1455
+ A vertical toolbar on the map provides drawing and visualization tools:
1456
+ - **Circle Draw Tool**: Draw circular targeting areas with radius labels displayed on the map
1457
+ - **Polygon Draw Tool**: Draw custom polygon shapes for precise geographic targeting
1458
+ - **Line Draw Tool**: Draw line segments for corridor-based targeting
1459
+ - **3D View Toggle**: Switch between 2D and 3D map perspectives
1460
+ - **Heatmap Toggle**: Display audience density visualization with hourly slider control
1461
+
1462
+ **Audience Density Heatmap**
1463
+
1464
+ When enabled, the heatmap overlay visualizes audience concentration across the map. An hourly slider (0-23) allows viewing density patterns at different times of day, helping advertisers understand when audiences are most concentrated in specific areas.
1465
+
1466
+ **CSV Upload for Bulk Targeting**
1467
+
1468
+ A CSV upload feature enables bulk coordinate targeting:
1469
+ - **Download Template**: Button to download a CSV template with columns: Name (optional), Latitude, Longitude, Radius (optional, defaults to 250m)
1470
+ - **Upload CSV**: Drag-and-drop or file picker for uploading coordinate files
1471
+ - **Validation**: System validates coordinates and displays errors for invalid entries
1472
+ - **Bulk Add**: All valid locations are added to the map as targeting circles
1473
+
1474
+ **Include/Exclude Selection**
1475
+
1476
+ Each selected location can be marked as:
1477
+ - **Include** (green check icon): Screens within this area are targeted
1478
+ - **Exclude** (red ban icon): Screens within this area are excluded from targeting
1479
+
1480
+ This enables precision targeting by including broad areas and excluding specific zones.
1481
+
1482
+ **Additional Features**
1483
+ - **Interactive Mapbox Map**: Full-width map view with searchable location autocomplete filtered to the deal's selected countries
1484
+ - **Search bar**: Find locations by name with autocomplete
1485
+ - **Radius selection**: Adjustable radius for point-based targeting (default 250m)
1486
+ - **Selected Locations List**: Below the map showing selected cities, areas, and custom shapes
1487
+ - **Location Count Badge**: The geography row displays the count of selected locations
1488
+ - **Fixed footer**: "Apply Selection" and "Cancel" buttons
1489
+
1490
+ **Note:** Location search results are filtered to only show locations within the parent deal's selected countries.
1491
+
1492
+ **Points of Interest (POI) Targeting**
1493
+
1494
+ POI targeting allows advertisers to target screens near specific locations. The POI Targeting drawer provides a comprehensive interface for selecting and managing POIs.
1495
+
1496
+ **POI Targeting Drawer**
1497
+
1498
+ Clicking the POI Targeting row opens a side drawer with:
1499
+ - **Search bar**: Find POIs by name or address
1500
+ - **Category filter**: Dropdown to filter POIs by category
1501
+ - **Map view**: Interactive Mapbox map showing POI locations
1502
+ - **POI list**: Selectable list of POIs with distance information
1503
+ - **Selected POIs section**: Summary of currently selected POIs with remove buttons
1504
+ - **Fixed footer**: "Apply Selection" and "Cancel" buttons
1505
+
1506
+ **POI Categories**
1507
+
1508
+ | Category | Description |
1509
+ |----------|-------------|
1510
+ | Shopping | Shopping malls, retail centers, shopping complexes |
1511
+ | Office | Office buildings, business parks, co-working spaces |
1512
+ | Sports | Stadiums, arenas, sports venues, fitness centers |
1513
+ | Entertainment | Cinemas, theaters, amusement parks, recreation centers |
1514
+ | Restaurant | Dining establishments, cafes, food courts |
1515
+ | Hotel | Hospitality establishments, resorts |
1516
+ | Hospital | Medical facilities, healthcare centers, clinics |
1517
+ | Education | Schools, universities, colleges, training centers |
1518
+ | Transit | Bus terminals, train stations, metro stops, airports |
1519
+ | Retail | Individual retail stores, supermarkets, convenience stores |
1520
+ | Custom | User-defined POIs created in the Custom POI management section |
1521
+
1522
+ **Custom POIs**
1523
+
1524
+ Users can also create their own Points of Interest through the Configuration > Custom POIs section. Custom POIs appear in the POI search alongside standard POIs and include:
1525
+ - Custom name and category
1526
+ - Latitude/longitude coordinates
1527
+ - Address and radius settings
1528
+ - Enabled/disabled status
1529
+
1530
+ **Income Bracket**
1531
+
1532
+ Select target income levels:
1533
+
1534
+ | Income Level | Range |
1535
+ |--------------|-------|
1536
+ | Low income | < RM 128,000 |
1537
+ | Lower-middle income | RM 128,000 - RM 213,000 |
1538
+ | Middle income | RM 213,000 - RM 426,000 |
1539
+ | Upper-middle income | RM 426,000 - RM 639,000 |
1540
+ | High income | > RM 639,000 |
1541
+
1542
+ **Behavior**
1543
+
1544
+ Select behavioral segments:
1545
+
1546
+ | Behavior | Description |
1547
+ |----------|-------------|
1548
+ | Commuters | People traveling to/from work |
1549
+ | Shoppers | Active shoppers in retail environments |
1550
+ | Tourists | Visitors in key destinations |
1551
+ | Business Travelers | Professional travelers |
1552
+ | Students | University and college students |
1553
+ | Families | Family groups |
1554
+ | Health Seekers | People visiting medical facilities |
1555
+ | Fitness Enthusiasts | Active individuals near gyms |
1556
+
1557
+ **Interest**
1558
+
1559
+ Select interest categories:
1560
+ - Sports & Fitness
1561
+ - Technology
1562
+ - Fashion & Style
1563
+ - Food & Dining
1564
+ - Travel
1565
+ - Music
1566
+ - Automotive
1567
+ - Entertainment
1568
+ - Home & Garden
1569
+ - Health & Wellness
1570
+
1571
+ **Signals** *(Conditional Automation)*
1572
+
1573
+ Signals enable dynamic ad targeting based on real-time conditions:
1574
+
1575
+ | Signal Type | Description |
1576
+ |-------------|-------------|
1577
+ | Weather | Show ads based on weather conditions |
1578
+ | Search | Target based on search keyword trends |
1579
+ | Footfall | Adjust delivery based on foot traffic |
1580
+ | Audiences | Target based on audience segments |
1581
+
1582
+ #### Section 4: DOOH Inventory Type
1583
+
1584
+ **Section Title:** "DOOH Inventory Type"
1585
+ **Section Description:** "Configure inventory source and format preferences"
1586
+
1587
+ This section uses a summary row pattern where each row displays the current selection and can be clicked to expand or open a drawer for detailed selection.
1588
+
1589
+ **SSP / Exchange** *(View-Only)*
1590
+
1591
+ Displays the SSP inherited from the parent deal. This is automatically set based on the deal configuration and cannot be changed at the line item level.
1592
+
1593
+ **Media Owner Selection**
1594
+
1595
+ Clicking the Media Owner row opens a side drawer for selecting media owners. The drawer includes:
1596
+ - **Search bar**: Filter media owners by name
1597
+ - **Country filter**: Filter by country (e.g., Malaysia, Singapore, Thailand, Indonesia)
1598
+ - **Business type filter**: Filter by business type (e.g., Media Owner, Retail Chain, Property Developer, Transit Authority)
1599
+ - **Media owner list**: Checkboxes for each available media owner
1600
+ - **Selected count**: Shows number of selected media owners
1601
+ - **Fixed footer**: "Apply Selection" and "Cancel" buttons
1602
+
1603
+ **Inventory Type** *(Collapsible)*
1604
+
1605
+ A collapsible section showing "X types selected" in the summary row. When expanded, displays checkboxes for inventory types:
1606
+ - OOH (Out-of-Home billboards and displays)
1607
+ - Transit (transportation-related screens)
1608
+ - Retail (in-store and shopping displays)
1609
+ - Cinema (movie theater screens and lobbies)
1610
+
1611
+ **Venue Type Selection**
1612
+
1613
+ Clicking the Venue Type row opens a side drawer for selecting venue types based on the OpenOOH/IAB 3.1 taxonomy. The drawer provides a hierarchical tree view of venue categories.
1614
+
1615
+ **Venue Type Drawer**
1616
+
1617
+ The drawer includes:
1618
+ - **Search bar**: Filter venues by name across all hierarchy levels
1619
+ - **Hierarchical tree view**: Expandable categories showing parent-child relationships
1620
+ - **Tier badges**: Visual indicators (T1, T2, T3, T4) showing taxonomy depth
1621
+ - **Select all/Deselect all per category**: Quick selection toggles for each parent category
1622
+ - **Checkbox selection**: Individual venue type selection
1623
+ - **Selected count**: Shows total number of selected venue types
1624
+ - **Fixed footer**: "Apply Selection" and "Cancel" buttons
1625
+
1626
+ **OpenOOH Venue Taxonomy**
1627
+
1628
+ The taxonomy organizes venues into 8 parent categories with 3-4 tier hierarchy:
1629
+
1630
+ | Parent Category | Example Child Venues |
1631
+ |-----------------|---------------------|
1632
+ | Retail | Shopping Malls, Supermarkets, Convenience Stores, Department Stores |
1633
+ | Transit | Airports, Train Stations, Bus Terminals, Metro Stations |
1634
+ | Outdoor | Billboards, Street Furniture, Urban Panels |
1635
+ | Health & Beauty | Gyms, Salons, Spas, Pharmacies |
1636
+ | Point of Care | Hospitals, Clinics, Medical Centers |
1637
+ | Education | Universities, Schools, Libraries |
1638
+ | Office Buildings | Lobbies, Elevators, Common Areas |
1639
+ | Residential | Apartment Complexes, Condominiums |
1640
+
1641
+ Each venue type displays its tier level, allowing users to select at any granularity from broad categories (T1) to specific venue types (T3/T4).
1642
+
1643
+ **Inventory Format**
1644
+
1645
+ Clicking the Inventory Format row opens a side drawer for selecting screen formats. The drawer groups formats by DOOH type:
1646
+
1647
+ | Type | Available Formats |
1648
+ |------|-------------------|
1649
+ | OOH | Digital Large Format, Digital Billboard, Digital Bus Shelter Screen, Smart City Panel, Digital Video Walls, Digital Kiosk |
1650
+ | Transit | Taxi Top Digital, Platform Digital Screen, Airport Terminal Screens, Train Digital Display, Bus Interior Screen, Metro Station Screen |
1651
+ | Retail | Mall / Retail Screens, Cinema Pre-Show / Lobby, Elevator / Lobby Screens, Retail Window Screen, Point of Sale Screen, Shelf-edge Digital |
1652
+ | Cinema | Cinema Pre-Show, Cinema Lobby Screen, Premium Format Screen |
1653
+
1654
+ The drawer includes:
1655
+ - **Grouped checkbox lists**: Formats organized by inventory type
1656
+ - **"Select All" per group**: Quick selection toggle for each type
1657
+ - **Selected count**: Shows number of selected formats
1658
+ - **Fixed footer**: "Apply Selection" and "Cancel" buttons
1659
+
1660
+ **Resolution** *(Collapsible)*
1661
+
1662
+ A collapsible section for screen resolution filtering:
1663
+ - 1920x1080 (Full HD)
1664
+ - 3840x2160 (4K)
1665
+ - 2560x1440 (QHD)
1666
+ - 1280x720 (HD)
1667
+
1668
+ #### Section 5: AI Inventory Recommendations
1669
+
1670
+ This section provides AI-powered inventory recommendations using the Recommendation Engine V2.
1671
+
1672
+ **AI Recommendation Panel**
1673
+
1674
+ Located in the right sidebar, the AI Recommendation Panel displays:
1675
+ - **Section header**: "AI Recommendations" with sparkle icon
1676
+ - **Recommendation score badge**: Overall match percentage (e.g., "87% Match")
1677
+ - **8-factor score breakdown**: Visual indicators for each scoring factor
1678
+ - **Recommended screens list**: AI-suggested inventory with justifications
1679
+
1680
+ **8-Factor Scoring System**
1681
+
1682
+ The recommendation engine evaluates inventory based on:
1683
+
1684
+ | Factor | Description |
1685
+ |--------|-------------|
1686
+ | Measure Fit | Alignment with campaign measurement goals |
1687
+ | Geo Fit | Geographic proximity to target locations |
1688
+ | Availability | Screen availability during campaign period |
1689
+ | Budget Fit | Cost efficiency relative to budget constraints |
1690
+ | Audience Fit | Match with target demographic profiles |
1691
+ | Brand Fit | Suitability for brand guidelines and positioning |
1692
+ | Quality Fit | Screen quality, resolution, and placement quality |
1693
+ | Time Fit | Daypart and timing alignment with campaign goals |
1694
+
1695
+ Each factor displays a score from 0-100% with color-coded indicators.
1696
+
1697
+ **AI Actions**
1698
+
1699
+ - **"Add X Screens" button**: Adds all AI-recommended screens to the selection
1700
+ - **"Auto-Optimize" button**: Applies AI optimization to the entire line item
1701
+ - **Individual screen selection**: Add/remove individual screens from recommendations
1702
+
1703
+ **Manual Inventory Edit Drawer**
1704
+
1705
+ Clicking "Edit Selection" opens a 75% width drawer for manual inventory management:
1706
+
1707
+ **Left Panel (Inventory List):**
1708
+ - Search bar for filtering screens
1709
+ - Filter controls (format, resolution, status)
1710
+ - Scrollable list of available screens with:
1711
+ - Screen name and location
1712
+ - Format and resolution info
1713
+ - Availability status
1714
+ - Checkbox for selection
1715
+
1716
+ **Right Panel (Map View):**
1717
+ - Interactive Mapbox map
1718
+ - Screen markers showing locations
1719
+ - Cluster markers for dense areas
1720
+ - Click-to-select functionality
1721
+
1722
+ **Fixed footer:**
1723
+ - Selected screens count
1724
+ - "Apply Selection" and "Cancel" buttons
1725
+
1726
+ **Inventory Availability**
1727
+
1728
+ When screens are selected (either manually or via AI recommendations), an availability summary section appears showing the booking status of selected inventory.
1729
+
1730
+ **Availability Summary Row**
1731
+
1732
+ Displays:
1733
+ - **Availability percentage**: Overall availability across all selected screens (e.g., "85% Available")
1734
+ - **Status counts**: Number of screens in each availability state (Available, Partially Available, Sold Out)
1735
+ - **Color indicators**: Green for available, yellow for partial, red for sold out
1736
+
1737
+ **Availability Drawer**
1738
+
1739
+ Clicking the availability row opens a drawer with a Gantt-chart style timeline view:
1740
+
1741
+ **Timeline Controls:**
1742
+ - **Month/Week toggle**: Switch between monthly and weekly timeline granularity
1743
+ - **Zoom controls**: Zoom in/out on the timeline
1744
+ - **Date range**: Shows the line item's flight dates
1745
+
1746
+ **Gantt Chart View:**
1747
+ - **Screen rows**: Each selected screen displayed as a row
1748
+ - **Time axis**: Horizontal timeline matching the line item's flight dates
1749
+ - **Booking blocks**: Color-coded blocks showing existing bookings
1750
+ - **Available** (green): No bookings during this period
1751
+ - **Booked** (gray): Screen is booked by another campaign
1752
+ - **Own Booking** (blue): Booked by current campaign
1753
+ - **Hover tooltips**: Show booking details on hover
1754
+
1755
+ The timeline uses seeded random data (based on screen ID) to ensure consistent visualization across page refreshes.
1756
+
1757
+ #### Section 6: Flight Dates
1758
+
1759
+ This section configures the campaign flight dates with quick selection options for common durations.
1760
+
1761
+ **Quick Date Selection**
1762
+
1763
+ A row of quick-select buttons enables single-click date range configuration:
1764
+ - **Next 7 days**: Sets start date to today, end date to today + 7 days
1765
+ - **Next 28 days**: Sets start date to today, end date to today + 28 days
1766
+ - **Next 30 days**: Sets start date to today, end date to today + 30 days
1767
+ - **Next 45 days**: Sets start date to today, end date to today + 45 days
1768
+ - **Next 60 days**: Sets start date to today, end date to today + 60 days
1769
+
1770
+ These buttons automatically populate both Start Date and End Date fields for common campaign durations.
1771
+
1772
+ **Start Date** *(Required)*
1773
+
1774
+ Must fall within the parent deal's flight dates.
1775
+
1776
+ **End Date** *(Required)*
1777
+
1778
+ Must be after the start date and not exceed the parent deal's end date.
1779
+
1780
+ #### Section 7: Budget Options
1781
+
1782
+ This section contains all budget-related configuration options, including the total budget which only appears when unlimited budget is disabled.
1783
+
1784
+ **Unlimited Budget**
1785
+
1786
+ Toggle switch that when enabled, removes the budget cap for the line item. This is the first option in the section, allowing users to decide if budget constraints apply before entering budget values.
1787
+
1788
+ **Budget** *(Conditional - Required when Unlimited Budget is OFF)*
1789
+
1790
+ Only displayed when the Unlimited Budget toggle is OFF. Maximum spend allocated to this line item. The budget field displays with an inline currency badge showing the currency inherited from the parent deal. The currency is read-only with a lock icon indicating it cannot be changed at the line item level.
1791
+
1792
+ **Budget Consumption**
1793
+
1794
+ Controls how the budget is consumed over time:
1795
+
1796
+ | Consumption Type | Description |
1797
+ |------------------|-------------|
1798
+ | Daily | Budget is allocated and consumed on a daily basis |
1799
+ | Weekly | Budget is allocated and consumed on a weekly basis |
1800
+ | Monthly | Budget is allocated and consumed on a monthly basis |
1801
+ | Lifetime | Budget is consumed over the entire flight period |
1802
+
1803
+ **Daily Budget**
1804
+
1805
+ Optional daily budget cap to control daily spend. The field label displays the inherited currency code.
1806
+
1807
+ #### Section 8: Pacing & Traffic Allocation *(Programmatic Deals Only)*
1808
+
1809
+ This section is only visible for programmatic deal types and controls delivery distribution.
1810
+
1811
+ **Pacing**
1812
+
1813
+ Controls delivery distribution:
1814
+
1815
+ | Pacing Type | Description |
1816
+ |-------------|-------------|
1817
+ | ASAP | Deliver as fast as possible |
1818
+ | Even | Spread delivery evenly (default) |
1819
+ | Front Loaded | Deliver more early in the flight |
1820
+
1821
+ **Traffic Allocation**
1822
+
1823
+ A slider from 0% to 100% (default: 100%) controlling share of deal traffic. The slider includes visual indicators showing the current allocation percentage.
1824
+
1825
+ #### Section 9: Day Parting
1826
+
1827
+ Configures hourly scheduling for ad delivery. The section contains a 24-hour grid where users can select which hours of the day ads should be delivered. This allows campaigns to target specific times when the target audience is most likely to be present.
1828
+
1829
+ #### Section 10: Billing
1830
+
1831
+ **Billable Status**
1832
+
1833
+ Radio button selection:
1834
+ - **Non-Billable**: Line item is for testing or bonus delivery
1835
+ - **Billable**: Line item is included in billing reports
1836
+
1837
+ #### Section 11: Budget & Delivery (Legacy Reference)
1838
+
1839
+ **Hard Stop** *(View-Only, PG Deals Only)*
1840
+
1841
+ For line items under Programmatic Guaranteed deals, displays the Hard Stop setting inherited from the parent deal with a "From Deal" badge.
1842
+
1843
+ **Currency** *(View-Only)*
1844
+
1845
+ Displays the currency inherited from the parent deal with a "From Deal" badge and lock icon. Currency cannot be changed at the line item level - it automatically follows the deal's currency setting.
1846
+
1847
+ **Budget**
1848
+
1849
+ Maximum spend allocated to this line item.
1850
+
1851
+ **Budget Consumption**
1852
+
1853
+ Controls how the budget is consumed over time:
1854
+
1855
+ | Consumption Type | Description |
1856
+ |------------------|-------------|
1857
+ | Daily | Budget is allocated and consumed on a daily basis |
1858
+ | Weekly | Budget is allocated and consumed on a weekly basis |
1859
+ | Monthly | Budget is allocated and consumed on a monthly basis |
1860
+ | Lifetime | Budget is consumed over the entire flight period |
1861
+
1862
+ **Daily Budget**
1863
+
1864
+ Optional daily budget cap to control daily spend.
1865
+
1866
+ **Pacing**
1867
+
1868
+ Controls delivery distribution:
1869
+
1870
+ | Pacing Type | Description |
1871
+ |-------------|-------------|
1872
+ | ASAP | Deliver as fast as possible |
1873
+ | Even | Spread delivery evenly (default) |
1874
+ | Front Loaded | Deliver more early in the flight |
1875
+
1876
+ **Traffic Allocation**
1877
+
1878
+ A slider from 0% to 100% (default: 100%) controlling share of deal traffic.
1879
+
1880
+ #### Section 8: Bid Strategy
1881
+
1882
+ **Automated Bidding**
1883
+
1884
+ Toggle to let the system automatically optimize bid amounts.
1885
+
1886
+ **Max Bid ($)**
1887
+
1888
+ Maximum bid amount for this line item. The system suggests a max bid based on the average CPM of selected screens or inventory filters. Users can apply the suggestion or enter a custom value.
1889
+
1890
+ **Auto-Calculated Max Bid**
1891
+
1892
+ When screens are selected or inventory filters are configured, the system calculates a suggested max bid:
1893
+ - **CPM**: Average CPM of selected screens
1894
+ - **CPS**: Derived from average CPM (CPM / 1000 / creative duration)
1895
+
1896
+ **Bid Type**
1897
+
1898
+ | Type | Description |
1899
+ |------|-------------|
1900
+ | CPM | Cost Per Mille - price per 1,000 impressions |
1901
+ | CPS | Cost Per Second - price based on ad duration |
1902
+
1903
+ #### Section 9: Advanced Options
1904
+
1905
+ **Custom Fees**
1906
+
1907
+ Repeatable section for adding fees:
1908
+ - Name
1909
+ - Amount
1910
+ - Type (Fixed or Percentage)
1911
+ - Hidden toggle
1912
+
1913
+ **Frequency Cap**
1914
+
1915
+ Controls ad exposure frequency:
1916
+ - Impressions (max per period)
1917
+ - Period (Hour, Day, Week, Month, Lifetime)
1918
+
1919
+ ### 5.3 Line Item Forecasting Panel
1920
+
1921
+ The right side of the line item form displays a contextual forecasting panel that updates in real-time.
1922
+
1923
+ **Budget vs Cost Comparison**
1924
+
1925
+ | Metric | Description |
1926
+ |--------|-------------|
1927
+ | Deal Budget | The total budget from the parent deal |
1928
+ | Line Item Budget | The budget allocated to this line item |
1929
+ | Estimated Cost | Calculated based on max bid and target impressions |
1930
+
1931
+ **Cost Calculation Formulas**
1932
+
1933
+ - **CPM**: `Cost = (Target Impressions ÷ 1000) × Max Bid`
1934
+ - **CPS**: `Cost = Target Impressions × Creative Duration × Max Bid`
1935
+
1936
+ **Budget Status Indicator**
1937
+
1938
+ - **Green**: Estimated cost is within budget
1939
+ - **Red (pulsing)**: Estimated cost exceeds budget
1940
+
1941
+ ### 5.4 Delivery Tracking
1942
+
1943
+ Each line item shows delivery progress prominently.
1944
+
1945
+ **Delivered Impressions**
1946
+
1947
+ Counter that increases with each screen playback.
1948
+
1949
+ **Delivery Percentage**
1950
+
1951
+ Calculated as: (Delivered Impressions ÷ Target Impressions) × 100
1952
+
1953
+ **Pacing Status**
1954
+
1955
+ - **On Track** (green): Within 10% of expected
1956
+ - **Behind** (yellow): 10-25% below expected
1957
+ - **At Risk** (red): More than 25% below expected
1958
+ - **Ahead** (blue): More than 10% above expected
1959
+
1960
+ ### 5.5 Pausing and Resuming
1961
+
1962
+ Line items can be paused independently of their parent deal.
1963
+
1964
+ **To pause:** Click the three-dot menu and select "Pause Line Item"
1965
+
1966
+ **What happens when paused:**
1967
+ - Line item stops participating in ad selection
1968
+ - Delivery metrics freeze
1969
+ - Other line items may receive more traffic
1970
+
1971
+ **To resume:** Click the three-dot menu and select "Resume Line Item"
1972
+
1973
+ ### 5.6 Form Insights and Quick Tips
1974
+
1975
+ The line item form includes a dynamic Form Insights Panel that provides contextual guidance based on the current scroll position. The panel appears in the right sidebar alongside the AI Recommendation Panel and automatically updates its content as the user scrolls through different sections of the form.
1976
+
1977
+ **Scroll-Based Section Detection**
1978
+
1979
+ The form tracks five main sections:
1980
+ 1. **Basic Details** - Line item name, status, and general configuration
1981
+ 2. **Targeting** - Demographics, geography, POI, venue type, and audience targeting
1982
+ 3. **Inventory** - DOOH inventory type, media owners, and screen selection
1983
+ 4. **Schedule** - Flight dates and daypart settings
1984
+ 5. **Budget** - Budget allocation, pacing, and pricing
1985
+
1986
+ As the user scrolls, the Form Insights Panel header updates to show the current section name and displays section-specific insights.
1987
+
1988
+ **Section-Specific Insights**
1989
+
1990
+ | Section | Sample Insights |
1991
+ |---------|-----------------|
1992
+ | Basic Details | "A clear, descriptive name helps identify line items in reports" |
1993
+ | Targeting | "Targeting determines audience reach - broader targeting increases potential impressions but may reduce relevance" |
1994
+ | Inventory | "Select inventory that aligns with your target audience locations" |
1995
+ | Schedule | "Flight dates should fall within the parent deal's date range" |
1996
+ | Budget | "Budget pacing affects delivery distribution - Even pacing provides consistent exposure" |
1997
+
1998
+ **Quick Tips**
1999
+
2000
+ Each section includes practical recommendations:
2001
+ - **Basic Details**: "Use naming conventions that include creative type and targeting approach"
2002
+ - **Targeting**: "Start with broader targeting and narrow based on performance"
2003
+ - **Inventory**: "AI recommendations consider 8 factors including audience fit and availability"
2004
+ - **Schedule**: "Consider dayparting to reach audiences at optimal times"
2005
+ - **Budget**: "Higher priority ensures delivery for premium campaigns"
2006
+
2007
+ **Visibility Behavior**
2008
+
2009
+ The Form Insights Panel is hidden after a forecast is generated to maximize space for the forecasting results. This ensures users can focus on reviewing forecast data without distraction.
2010
+
2011
+ ---
2012
+
2013
+ ## 6. Traffic Allocation
2014
+
2015
+ Traffic allocation controls how available advertising opportunities are divided among competing line items within a deal.
2016
+
2017
+ ### 6.1 Basic Concept
2018
+
2019
+ Imagine a screen that can show 1,000 ads per day. Two line items want to advertise on that screen at the same time. Line Item A has 70% allocation and Line Item B has 30%.
2020
+
2021
+ Each time the screen is ready to show an ad, the system uses traffic allocation percentages to make a weighted random decision. Over the day, Line Item A will receive approximately 700 impressions and Line Item B approximately 300.
2022
+
2023
+ This approach is flexible because it handles situations where one line item's creative is unavailable by automatically giving more opportunities to others.
2024
+
2025
+ ### 6.2 Normalization Logic
2026
+
2027
+ Traffic allocation percentages are relative weights, not absolute guarantees.
2028
+
2029
+ **Example 1: Equal Weights**
2030
+
2031
+ Two line items both set their traffic allocation to 100%.
2032
+
2033
+ The system normalizes:
2034
+ - Line Item A: 100 ÷ (100 + 100) = 50%
2035
+ - Line Item B: 100 ÷ (100 + 100) = 50%
2036
+
2037
+ **Example 2: Weighted Split**
2038
+
2039
+ Line Item A is set to 80% and Line Item B is set to 40%.
2040
+
2041
+ The system normalizes:
2042
+ - Line Item A: 80 ÷ (80 + 40) = 66.67%
2043
+ - Line Item B: 40 ÷ (80 + 40) = 33.33%
2044
+
2045
+ **Why normalization?**
2046
+
2047
+ Normalization allows users to think in terms of relative importance. If a new line item is added or an existing one is paused, the remaining line items automatically adjust.
2048
+
2049
+ **Default Allocation for Auto-Created Line Items**
2050
+
2051
+ When line items are automatically created from external systems such as Planner (see Section 10.2), each line item is assigned a traffic allocation of 100% by default. Because normalization is applied at delivery time, multiple line items each set to 100% will share traffic equally. For example, if Planner creates five line items (one per media owner), each set to 100%, the normalized effective allocation becomes 20% per line item. This default can be adjusted within Influence after the deal is created if different weighting is desired.
2052
+
2053
+ ### 6.3 Priority as Tiebreaker
2054
+
2055
+ When two line items have similar allocations and both are eligible for the same impression, priority breaks the tie.
2056
+
2057
+ The line item with the lower priority number (higher priority) is considered first. Priority 1 always takes precedence over Priority 5.
2058
+
2059
+ However, priority does not override allocation entirely. A Priority 1 line item with 10% allocation will not take 100% of impressions—it receives its allocated 10%, but within that 10%, it gets first consideration.
2060
+
2061
+ **Priority Behavior by Deal Type**
2062
+
2063
+ | Deal Type | Priority Behavior |
2064
+ |-----------|-------------------|
2065
+ | Traditional | Priority strictly enforced for guaranteed delivery |
2066
+ | PG | Priority determines allocation order for guaranteed impressions |
2067
+ | Preferred Deal | Priority influences first-look order |
2068
+ | PMP | Priority affects auction sequence |
2069
+ | Always On | Priority less critical but still applies when inventory is limited |
2070
+
2071
+ ### 6.4 Worked Examples
2072
+
2073
+ **Example: Three Line Items in a Deal**
2074
+
2075
+ Deal has three line items:
2076
+ - Line Item A: 60% allocation, Priority 2
2077
+ - Line Item B: 30% allocation, Priority 1
2078
+ - Line Item C: 10% allocation, Priority 3
2079
+
2080
+ Effective allocations after normalization:
2081
+ - A: 60%, B: 30%, C: 10%
2082
+
2083
+ When competing for an impression:
2084
+ 1. B is considered first (Priority 1)
2085
+ 2. If B is unavailable, A is considered (Priority 2)
2086
+ 3. If A is unavailable, C is considered (Priority 3)
2087
+
2088
+ Over time, impressions distribute approximately 60/30/10.
2089
+
2090
+ ---
2091
+
2092
+ ## 7. Content Hub
2093
+
2094
+ The Content Hub is the central repository for all creative assets used in advertising campaigns.
2095
+
2096
+ ### 7.1 Overview
2097
+
2098
+ Content Hub allows users to:
2099
+ - Upload creative assets (images, videos, HTML5)
2100
+ - Organize creatives into folders
2101
+ - Submit creatives for Tier 1 approval
2102
+ - Assign approved creatives to line items
2103
+
2104
+ ### 7.2 Creative Types
2105
+
2106
+ | Type | Formats | Description |
2107
+ |------|---------|-------------|
2108
+ | Display | JPEG, PNG | Static image advertisements |
2109
+ | Video | MP4, WebM | Moving picture advertisements |
2110
+ | HTML5 | ZIP package | Interactive rich media |
2111
+
2112
+ #### Creative Source
2113
+
2114
+ Creatives can originate from different sources, which is tracked for reporting and workflow purposes:
2115
+
2116
+ | Source | Description |
2117
+ |--------|-------------|
2118
+ | Uploaded | Manually uploaded through the Content Hub interface |
2119
+ | Bid Stream (VAST) | Received via VAST tags from DSP bid responses |
2120
+ | API | Programmatically uploaded via API integration |
2121
+ | Media Owner | Uploaded by the media owner for their inventory |
2122
+
2123
+ **Source Platform Tracking:**
2124
+
2125
+ In addition to the creative source type, the system tracks which platform originated the creative:
2126
+
2127
+ | Platform | Description |
2128
+ |----------|-------------|
2129
+ | Influence | Created directly in the Influence platform |
2130
+ | Planner | Sent from the Planner platform via API |
2131
+ | Activate | Received from the Activate platform via bid stream |
2132
+ | Media Owner | Uploaded by the media owner |
2133
+
2134
+ **Display Format:**
2135
+
2136
+ The creative source is displayed in a combined format showing "Platform - Source Type":
2137
+ - **Influence creatives**: Display source type only (e.g., "Uploaded", "API")
2138
+ - **External platform creatives**: Display "Platform - Source Type" (e.g., "Planner - API", "Activate - Bid Stream")
2139
+
2140
+ This source information is visible in:
2141
+ - The Content Hub preview panel
2142
+ - The Line Item Creatives listing (Source column)
2143
+ - The Edit Creative Assignment page (Metadata panel)
2144
+
2145
+ #### Transcoding
2146
+
2147
+ Video creatives may require transcoding to meet different screen specifications:
2148
+
2149
+ **Transcoding Status Values:**
2150
+ | Status | Description |
2151
+ |--------|-------------|
2152
+ | Pending | Transcoding has been requested but not yet started |
2153
+ | Processing | Transcoding is currently in progress |
2154
+ | Completed | Transcoding completed successfully, transcoded file available |
2155
+ | Failed | Transcoding failed, requires manual intervention |
2156
+
2157
+ When transcoding is enabled for a creative:
2158
+ - The system automatically processes the video to meet various screen format requirements
2159
+ - The transcoding status is displayed in the creative preview panel
2160
+ - Once completed, the transcoded URL is available for playback on compatible screens
2161
+
2162
+ ### 7.3 Status Workflow
2163
+
2164
+ Creatives progress through these statuses:
2165
+
2166
+ | Status | Description |
2167
+ |--------|-------------|
2168
+ | Pending | Newly uploaded, awaiting review |
2169
+ | In Review | Currently being reviewed |
2170
+ | Accepted | Passed Tier 1 approval, ready for assignment |
2171
+ | Inadequate | Failed review, needs revision |
2172
+
2173
+ ### 7.4 Folder Organization
2174
+
2175
+ Creatives can be organized into folders for easy management. Folders support:
2176
+ - Hierarchical nesting
2177
+ - Drag-and-drop reorganization
2178
+ - Bulk operations
2179
+
2180
+ **Content Hub Filter Drawer**: The Content Hub includes a filter drawer with the following options:
2181
+ - **Status**: Filter by creative status (Pending, In Review, Accepted, Inadequate, Archived)
2182
+ - **Type**: Filter by creative type (Display, Video, HTML, Native)
2183
+ - **Folder**: Filter by folder assignment
2184
+
2185
+ ### 7.5 Preview and Approval
2186
+
2187
+ Each creative has:
2188
+ - Full-size preview
2189
+ - Technical specifications display
2190
+ - Approval/rejection controls
2191
+ - Comment thread for feedback
2192
+
2193
+ ### 7.6 Creative Assignment
2194
+
2195
+ #### 7.6.1 Line Item Creatives Page
2196
+
2197
+ Accessed from line item detail, shows all assigned creatives with:
2198
+ - Preview thumbnails
2199
+ - Rotation weights
2200
+ - Tier 2 approval status
2201
+ - Schedule information
2202
+
2203
+ **Line Item Creatives Filter Drawer**: The assigned creatives list includes a filter drawer with:
2204
+ - **Approval Status**: Filter by Tier 2 approval status (Pending, Approved, Rejected, Changes Requested)
2205
+ - **Creative Type**: Filter by creative type (Display, Video, HTML, Native)
2206
+ - **Scheduling Rule**: Filter by scheduling rule (Default, Custom)
2207
+
2208
+ #### 7.6.2 Edit Creative Assignment Page
2209
+
2210
+ Allows editing of:
2211
+ - Schedule matrix (hours × days)
2212
+ - Rotation rule (default, exclusive)
2213
+ - Weight percentage
2214
+
2215
+ #### 7.6.3 Assign Creative Page
2216
+
2217
+ Browse Content Hub to select creatives:
2218
+ - Only Tier 1 Accepted creatives are shown
2219
+ - Multiple selection supported
2220
+ - Automatic validation of format compatibility
2221
+
2222
+ ### 7.7 Tier 2 Approval Workflow
2223
+
2224
+ When creatives are assigned to a line item, they enter Tier 2 approval where the Media Owner validates compatibility with target screens.
2225
+
2226
+ **Tier 2 Statuses:**
2227
+
2228
+ | Status | Description |
2229
+ |--------|-------------|
2230
+ | Pending | Awaiting media owner review |
2231
+ | Approved | Validated for delivery |
2232
+ | Rejected | Not compatible with screens |
2233
+ | Changes Requested | Needs modification |
2234
+
2235
+ **Media Owner Approval Interface:**
2236
+
2237
+ The Edit Creative Assignment page provides a dedicated "Media Owner Approval" section where media owners can:
2238
+ - View the current approval status
2239
+ - Preview the creative (video playback or image display)
2240
+ - Review creative metadata (resolution, duration, source platform)
2241
+ - Take approval actions via dedicated buttons:
2242
+ - **Approve**: Marks the creative as validated for delivery
2243
+ - **Request Changes**: Requests modifications from the creative owner
2244
+ - **Reject**: Marks the creative as not compatible with screens
2245
+
2246
+ When an approval action is taken:
2247
+ - The status updates immediately with visual feedback
2248
+ - A timestamp is recorded for audit purposes
2249
+ - The change is logged in the History drawer
2250
+
2251
+ **Blocking Delivery**
2252
+
2253
+ Line items require at least one Tier 2 Approved creative before they can deliver impressions.
2254
+
2255
+ ---
2256
+
2257
+ ## 8. Signals (Conditional Automation)
2258
+
2259
+ ### 8.1 Overview
2260
+
2261
+ Signals enable conditional automation for line item control based on external data sources.
2262
+
2263
+ ### 8.2 Signal Types
2264
+
2265
+ - **Audiences**: Signal based on audience segment targeting
2266
+ - **Footfall**: Signal based on store foot traffic
2267
+ - **Search**: Signal based on search keyword trends
2268
+ - **Weather**: Signal based on weather conditions
2269
+
2270
+ ### 8.3 Signal Rules
2271
+
2272
+ Each signal contains one or more rules specific to the signal type:
2273
+
2274
+ **Footfall Rules:**
2275
+ - Brand selection
2276
+ - Store locations
2277
+ - Min/Max Busy % parameters
2278
+
2279
+ **Weather Rules:**
2280
+ - Location selection
2281
+ - Condition types (Temperature Above, Below, Weather Condition)
2282
+ - Value parameters
2283
+
2284
+ ### 8.4 Forecasting Visualizations
2285
+
2286
+ - **Footfall**: Weekly heatmap
2287
+ - **Weather**: Line graph with predictions
2288
+ - **Audiences**: Bar chart
2289
+ - **Search**: Trend line chart
2290
+
2291
+ ### 8.5 Signal-Line Item Integration
2292
+
2293
+ - Line items link to signals via signalId
2294
+ - When signalEnabled is true, the signal controls activation
2295
+ - Signal indicator shown in line items table
2296
+
2297
+ ### 8.6 UI/UX
2298
+
2299
+ - Signals page accessible from sidebar (Zap icon)
2300
+ - Two-column form layout
2301
+ - Inline rule management
2302
+ - Type-specific rule forms
2303
+
2304
+ ### 8.7 Quick Tips Panel
2305
+
2306
+ Signal-specific guidance:
2307
+
2308
+ **Footfall Signals**: Activate based on real-time visitor density
2309
+ **Weather Signals**: Trigger based on weather conditions
2310
+ **Audience Signals**: Activate for specific customer segments
2311
+ **Search Signals**: Respond to keyword trends
2312
+
2313
+ ---
2314
+
2315
+ ## 9. Ad Serving Process
2316
+
2317
+ This section explains how advertisements reach screens in the Influence ecosystem. There are two distinct delivery channels, each designed for different operational scenarios. Understanding both channels is essential because in a real-world deployment, some screens will use one channel and some will use the other — and many networks will use both simultaneously.
2318
+
2319
+ ### 9.1 The Two Delivery Channels
2320
+
2321
+ Influence delivers ads to screens through two channels:
2322
+
2323
+ 1. **Channel A — Decision Engine (DE)**: An intelligent, real-time decisioning system that sits between the player and the ad server. The Decision Engine is a **separate external microservice** — it is not part of the Influence Adserver application itself, but communicates with it via shared Redis state and API callbacks. The player asks "what should I play next?" and the Decision Engine decides. The player does not need to know about individual deals or line items in advance.
2324
+
2325
+ 2. **Channel B — VAST Tag Distribution**: A manual distribution model where the Influence user exports VAST tags (URLs, HTML files, or ZIP packages) from the platform and hands them to media owners. The media owner's CMS schedules those tags on specific screens. The CMS controls what plays and when.
2326
+
2327
+ Both channels ultimately serve the same creatives from the same deals and line items. The difference is *who decides* what plays on a given screen at a given moment.
2328
+
2329
+ **When to use which channel:**
2330
+
2331
+ | Scenario | Channel | Why |
2332
+ |----------|---------|-----|
2333
+ | Screens in your own network with DE-enabled players | Decision Engine | Maximum yield and pacing intelligence |
2334
+ | Third-party media owner screens (Broadsign, Scala, etc.) | VAST Distribution | Media owner controls their own CMS |
2335
+ | Screens with no internet reliability | VAST Distribution (ZIP) | Offline fallback with buffered content |
2336
+ | Mixed network with guaranteed + programmatic demand | Decision Engine | DE arbitrates between deal types in real-time |
2337
+ | Simple traditional campaign on partner screens | VAST Distribution (URL) | Easiest integration, no DE setup needed |
2338
+
2339
+ #### Diagram: Dual-Channel Ad Delivery Architecture
2340
+
2341
+ ```
2342
+ INFLUENCE PLATFORM
2343
+ ┌──────────────────────┐
2344
+ │ Deals & Line Items │
2345
+ │ Creatives & Rules │
2346
+ │ Budget & Pacing │
2347
+ └──────┬───────┬────────┘
2348
+ │ │
2349
+ ┌───────────────┘ └────────────────┐
2350
+ │ │
2351
+ CHANNEL A: DE CHANNEL B: VAST
2352
+ (Dynamic / Intelligent) (Manual / Static Distribution)
2353
+ │ │
2354
+ ▼ ▼
2355
+ ┌───────────────────┐ ┌──────────────────────┐
2356
+ │ Decision Engine │ │ Distribution Tab │
2357
+ │ ┌─────────────┐ │ │ (Deal Detail Page) │
2358
+ │ │ Redis State │ │ │ │
2359
+ │ │ (Pacing, │ │ │ Export as: │
2360
+ │ │ Budgets, │ │ │ - VAST URL │
2361
+ │ │ SOV, Caps) │ │ │ - HTML File │
2362
+ │ └─────────────┘ │ │ - ZIP Package │
2363
+ └────────┬──────────┘ └──────────┬───────────┘
2364
+ │ │
2365
+ ▼ ▼
2366
+ ┌─────────────────┐ ┌──────────────────────┐
2367
+ │ Player calls │ │ Media owner pastes │
2368
+ │ DE endpoint │ │ VAST tag into their │
2369
+ │ with screen ID │ │ CMS (Broadsign, │
2370
+ │ every 15-30min │ │ Scala, etc.) │
2371
+ └────────┬────────┘ └──────────┬───────────┘
2372
+ │ │
2373
+ ▼ ▼
2374
+ ┌─────────────────┐ ┌──────────────────────┐
2375
+ │ DE returns a │ │ CMS calls VAST URL │
2376
+ │ manifest: │ │ per its own │
2377
+ │ "Play Deal A, │ │ schedule/rotation │
2378
+ │ then Deal B, │ │ │
2379
+ │ then Deal C" │ │ Each call = 1 ad │
2380
+ └────────┬────────┘ └──────────┬───────────┘
2381
+ │ │
2382
+ ▼ ▼
2383
+ ┌─────────────────┐ ┌──────────────────────┐
2384
+ │ Player follows │ │ Influence returns │
2385
+ │ the manifest │ │ VAST XML with │
2386
+ │ sequence and │ │ creative + tracking │
2387
+ │ fires tracking │ │ pixels │
2388
+ │ heartbeats │ │ │
2389
+ └─────────────────┘ └──────────────────────┘
2390
+ ```
2391
+
2392
+ <p align="center"><em>Figure 5: Dual-Channel Ad Delivery Architecture</em></p>
2393
+
2394
+ ### 9.2 Channel A — Decision Engine
2395
+
2396
+ The Decision Engine (DE) is a high-concurrency, low-latency microservice that replaces static round-robin playback with intelligent, multi-factor ad selection. It is the "brain" that sits between the player and the ad server, deciding in real-time which ad should play next on any given screen.
2397
+
2398
+ #### 9.2.1 Why the Decision Engine Exists
2399
+
2400
+ Without the Decision Engine, DOOH networks operate on fixed-loop (round-robin) logic where all ad slots are treated as equal units of time. This creates four critical problems:
2401
+
2402
+ 1. **No deal-type awareness.** The system cannot distinguish between a "must-run" Traditional/PG deal (which has a contractual delivery guarantee) and a "can-run" Programmatic deal (which competes on price). This leads to manual ad-ops overrides or missed revenue opportunities.
2403
+
2404
+ 2. **No pacing intelligence.** The player shows ads at the same rate at 2:00 AM as it does at 6:00 PM. A campaign that is behind schedule during peak hours will under-deliver, and the system has no mechanism to catch up.
2405
+
2406
+ 3. **No auction cascading.** In Private Marketplace (PMP) deals, if the primary buyer fails to respond or bids below the floor, the system gives up rather than cascading to the next eligible buyer. The slot goes empty.
2407
+
2408
+ 4. **Stale delivery data.** Delivery stats (impressions, spend) are updated in batches. Without real-time state tracking, the engine makes decisions based on outdated data, causing over-delivery and budget overruns.
2409
+
2410
+ #### 9.2.2 How the Decision Engine Works
2411
+
2412
+ The Decision Engine processes each request through a three-stage pipeline:
2413
+
2414
+ **Stage 1 — Hard Filtering (Validation)**
2415
+
2416
+ Eliminate candidates that cannot legally serve. This includes checking flight dates (is the campaign currently active?), creative specifications (does the creative match the screen's resolution and orientation?), budget limits (has the daily or total budget been exhausted?), and geographic eligibility (is this screen in the campaign's target region?).
2417
+
2418
+ **Stage 2 — Prioritization (Deal Type Separation)**
2419
+
2420
+ Separate deterministic demand from probabilistic demand. Traditional and Programmatic Guaranteed (PG) deals have contractual obligations — they *must* deliver a specific number of impressions. Preferred Deals (PD) and Private Auctions (PMP) compete on price but have no hard delivery guarantee. The engine considers guaranteed deals first, then opens remaining slots to programmatic competition.
2421
+
2422
+ **Stage 3 — Dynamic Scoring**
2423
+
2424
+ For each eligible candidate, the engine computes a weighted score based on multiple real-time factors:
2425
+
2426
+ | Factor | Description | Example |
2427
+ |--------|-------------|---------|
2428
+ | Pacing Deficit | How far behind is this campaign on its delivery goal? | Campaign at 40% delivery but 60% through its flight dates gets a boost |
2429
+ | CPM / Yield | What is the revenue per impression? | A $35 CPM deal scores higher than a $12 CPM deal for yield maximization |
2430
+ | Priority | The line item's configured priority (1-10) | Priority 1 always considered before Priority 5 |
2431
+ | Share of Voice (SOV) | Is the campaign meeting its guaranteed SOV percentage? | A deal guaranteed 20% SOV but currently at 12% gets a significant boost |
2432
+ | Budget Velocity | How fast is the budget being consumed relative to remaining flight? | Near-exhaustion campaigns are slowed down to prevent overspend |
2433
+ | Time-of-Day Value | Is this a peak traffic hour? | High-value slots during rush hour are allocated to higher-CPM deals |
2434
+ | Frequency Cap | Has this screen already shown this ad too many times today? | Capped campaigns are deprioritized after reaching their limit |
2435
+ | Recency Cooldown | When was this creative last played on this screen? | Creatives played recently get a cooldown penalty to prevent repetition |
2436
+
2437
+ The candidate with the highest composite score wins the slot.
2438
+
2439
+ #### 9.2.3 The Hybrid Manifest Approach
2440
+
2441
+ Rather than asking the Decision Engine for every single ad slot (which would generate 20,000+ requests per minute across a 5,000-screen network) or downloading a static 24-hour playlist (which loses all flexibility), Influence uses a hybrid approach:
2442
+
2443
+ **Every 15 to 30 minutes**, the player requests a "manifest" — a pre-computed sequence of ads to play during that window. The Decision Engine runs its scoring logic and returns a VAST-wrapped manifest containing multiple ad slots.
2444
+
2445
+ This approach balances three concerns:
2446
+
2447
+ - **Scale**: API load is reduced by ~98% compared to per-spot requests. A 5,000-screen network generates ~300 requests per minute instead of 20,000.
2448
+ - **Yield**: New programmatic demand can be injected into the rotation every 15-30 minutes, which is more than sufficient for DOOH buyers who plan in hours, not seconds.
2449
+ - **Resilience**: If the internet connection drops, the player continues showing ads from its current manifest. No black screens, no frozen displays.
2450
+
2451
+ **The manifest lifecycle:**
2452
+
2453
+ 1. **Request**: The player sends its screen reference ID to the Decision Engine endpoint.
2454
+ 2. **Decision**: The DE runs its three-stage pipeline and builds a sequence of ads for the next 15-30 minutes.
2455
+ 3. **Execution**: The player consumes the manifest in order, playing each ad for its specified duration.
2456
+ 4. **Heartbeat**: After each ad plays, the player fires an async tracking pixel to update Redis counters in near real-time.
2457
+ 5. **Correction**: When the player requests the next manifest, the DE adjusts scores based on the heartbeats it received, ensuring pacing stays accurate.
2458
+
2459
+ #### 9.2.4 Decision Engine Scenarios
2460
+
2461
+ The following table illustrates how the Decision Engine handles real-world situations compared to a legacy fixed-rotation system:
2462
+
2463
+ | Scenario | Legacy System (Round-Robin) | Decision Engine |
2464
+ |----------|-----------------------------|-----------------|
2465
+ | 2 PG Deals, equal priority | Alternates 1:1 regardless of remaining goal | Prioritizes the PG deal with the highest delivery deficit |
2466
+ | 1 PG vs. 2 PD Deals | Rotates all three equally (33% each) | Forces PG until pacing is healthy, then allows PD to compete |
2467
+ | Under-delivering PG deal | No change in frequency; likely to miss goal | Applies "behind-on-delivery" boost to ensure 100% fill |
2468
+ | Peak hour traffic | Serves same rotation; wastes high-value slots | Adjusts scoring via impression multiplier to maximize yield |
2469
+ | Low traffic (midnight) | Burns limited plays on high-value deals | Deprioritizes high-CPM deals to save budget for peak hours |
2470
+ | 2 PD Deals (price competition) | Rotates 1:1 even if one pays 2x more | Favors the higher CPM deal to maximize revenue |
2471
+ | Multi-buyer PMP auction | Fails if first buyer doesn't bid; slot goes empty | Evaluates all buyers; selects highest valid bid |
2472
+ | Daily cap reached (PG) | Continues serving; over-delivers | Hard-stops the deal immediately once threshold is met |
2473
+ | SOV guarantee (min 20%) | Cannot guarantee; depends on total rotation count | Monitors real-time SOV; boosts score if below target |
2474
+ | Budget near exhaustion | Serves until API returns error; overspends | Predictive pacing slows down delivery as budget thins |
2475
+
2476
+ #### 9.2.5 Decision Engine API
2477
+
2478
+ The Decision Engine is deployed as a **separate external microservice** with its own base URL (e.g., `https://de.influence.io`). Its API endpoints are *not* part of the Influence Adserver's `/api` namespace. The DE reads deal, line item, and creative data from the shared database and maintains its own real-time state in Redis. Influence Adserver and the Decision Engine communicate through shared data stores, not direct API calls between each other.
2479
+
2480
+ For the integration relationship between Influence Adserver and the Decision Engine, see [Section 10.6 — Decision Engine Integration](#106-decision-engine-integration).
2481
+
2482
+ **Decision Request: `POST /v1/decision/simple`**
2483
+
2484
+ The player sends a request containing its screen reference ID to the DE's base URL. Optionally, the request can include a specific `dealId` for validation mode (checking if a deal is still live and under budget) or `windowMinutes` for manifest mode.
2485
+
2486
+ ```json
2487
+ {
2488
+ "referenceId": "MYS-MOV-D-00000-09159",
2489
+ "dealId": "DEAL-123",
2490
+ "windowMinutes": 20
2491
+ }
2492
+ ```
2493
+
2494
+ | Field | Type | Required | Description |
2495
+ |-------|------|----------|-------------|
2496
+ | `referenceId` | string | Yes | The unique identifier of the screen (inventory reference) |
2497
+ | `dealId` | string | No | If provided, triggers "Validation Mode" — skips scoring, only checks if the deal is live and under budget |
2498
+ | `windowMinutes` | integer | No | If provided, triggers "Manifest Mode" — returns a sequence of ads for the specified time window |
2499
+
2500
+ **Decision Response (Manifest Mode):**
2501
+
2502
+ ```json
2503
+ {
2504
+ "manifestId": "MF-998877",
2505
+ "expiresAt": "2025-10-14T15:00:00Z",
2506
+ "sequence": [
2507
+ {
2508
+ "dealId": "GD-00704",
2509
+ "lineItemId": "LI-001",
2510
+ "duration": 15,
2511
+ "creativeUrl": "https://cdn.influence.io/creatives/cr_abc123.mp4",
2512
+ "trackingUrl": "https://api.influence.io/v3/track?id=1",
2513
+ "resumeToken": "rt_xk29f"
2514
+ },
2515
+ {
2516
+ "dealId": "PA-00201",
2517
+ "lineItemId": "LI-045",
2518
+ "duration": 15,
2519
+ "creativeUrl": "https://cdn.influence.io/creatives/cr_def456.mp4",
2520
+ "trackingUrl": "https://api.influence.io/v3/track?id=2",
2521
+ "resumeToken": "rt_m83qp"
2522
+ }
2523
+ ]
2524
+ }
2525
+ ```
2526
+
2527
+ | Field | Description |
2528
+ |-------|-------------|
2529
+ | `manifestId` | Unique identifier for this manifest, used for logging and debugging |
2530
+ | `expiresAt` | ISO 8601 timestamp after which the player should request a new manifest |
2531
+ | `sequence` | Ordered array of ad slots to play |
2532
+ | `sequence[].dealId` | The deal this ad belongs to |
2533
+ | `sequence[].lineItemId` | The line item this ad belongs to |
2534
+ | `sequence[].duration` | How many seconds to display this ad |
2535
+ | `sequence[].creativeUrl` | Direct URL to the creative media file |
2536
+ | `sequence[].trackingUrl` | URL the player calls after the ad plays (fires the heartbeat) |
2537
+ | `sequence[].resumeToken` | If the player restarts mid-manifest, it sends this token to resume from the correct position |
2538
+
2539
+ **Heartbeat Endpoint: `GET /v3/track`**
2540
+
2541
+ A high-speed, lightweight listener. When called, it performs a single atomic increment in Redis for the specific deal/line item. This keeps the Decision Engine's state accurate between manifest cycles.
2542
+
2543
+ Performance target: p99 latency under 50ms, to handle high-frequency bursts from thousands of concurrent screens.
2544
+
2545
+ #### 9.2.6 Decision Engine Example: A Day in the Life of Screen SCR-4421
2546
+
2547
+ To make the Decision Engine concrete, here is a walkthrough of what happens on a single screen over the course of a morning.
2548
+
2549
+ **Setup**: Screen SCR-4421 is a portrait LCD in a shopping mall food court. It has three active campaigns assigned to it:
2550
+
2551
+ - **Deal A** (PG, Priority 1): "Nike Summer Collection" — Guaranteed 500,000 impressions over 30 days, $25 CPM. Currently at 38% delivery on day 15 (should be at 50%).
2552
+ - **Deal B** (PD, Priority 3): "Coca-Cola Refresh" — Preferred Deal at $18 CPM. No hard delivery guarantee.
2553
+ - **Deal C** (PMP, Priority 5): "Local Restaurant" — Private Marketplace with a $10 CPM floor.
2554
+
2555
+ **6:00 AM — First manifest request of the day.**
2556
+
2557
+ The player sends `{ "referenceId": "SCR-4421", "windowMinutes": 30 }` to the DE. Traffic at 6 AM is low (estimated 200 impressions in this window). The DE builds a manifest:
2558
+
2559
+ - Deal A gets 80% of slots (it is behind on pacing and has highest priority)
2560
+ - Deal B gets 15% of slots (moderate CPM, fills remaining time)
2561
+ - Deal C gets 5% of slots (lowest priority, but floor price is met by one DSP bidder)
2562
+
2563
+ The manifest contains ~120 ad slots (one every 15 seconds for 30 minutes). The player downloads it and begins playback.
2564
+
2565
+ **8:30 AM — Peak morning traffic begins.**
2566
+
2567
+ The player requests a new manifest. Traffic is now high (estimated 1,200 impressions in this window). The DE recalculates:
2568
+
2569
+ - Deal A still gets priority (pacing deficit has improved slightly to 42% vs. expected 52%), but the DE recognizes these are high-value impressions. It allocates 60% to Deal A.
2570
+ - Deal B's CPM ($18) is competitive for peak hours. It gets 30%.
2571
+ - Deal C: The DSP bid of $12 exceeds the $10 floor. It gets 10%.
2572
+
2573
+ Revenue per slot is maximized because the DE gives more peak-hour impressions to higher-CPM deals instead of wasting them on lower-value demand.
2574
+
2575
+ **11:00 AM — Deal A hits its daily cap.**
2576
+
2577
+ During the 11:00 AM manifest request, the DE checks Redis and finds that Deal A has reached its daily impression cap (set to prevent front-loading the entire monthly goal). The DE hard-stops Deal A for the rest of the day:
2578
+
2579
+ - Deal A: 0% (daily cap reached, will resume tomorrow)
2580
+ - Deal B: 70% (now the highest-value eligible deal)
2581
+ - Deal C: 20% (PMP auction clears above floor)
2582
+ - Remaining 10%: House ad (mall promotion filler content)
2583
+
2584
+ **Key takeaway**: The player never needed to know about Deal A, B, or C. It simply asked the DE "what should I play?" and followed the manifest. The complexity of pacing, priority, CPM optimization, and cap enforcement all happened inside the Decision Engine.
2585
+
2586
+ ### 9.3 Channel B — VAST Tag Distribution
2587
+
2588
+ VAST Tag Distribution is the manual delivery channel, described in detail in [Section 4.10](#410-vast-tag-distribution). In this model, the Influence user exports VAST endpoint URLs (or HTML/ZIP packages) from the Distribution tab on the Deal Detail page and shares them with media owners. The media owner's CMS (Broadsign, Scala, BrightSign, etc.) schedules those VAST tags on specific screens.
2589
+
2590
+ The key difference from the Decision Engine channel is that the **CMS controls the schedule**, not Influence. The CMS decides when to call the VAST URL. Influence's role is limited to responding with the correct creative and tracking the impression.
2591
+
2592
+ #### 9.3.1 VAST Distribution Example: Campaign on a Partner Network
2593
+
2594
+ Consider the same "Nike Summer Collection" campaign, but this time some of the screens belong to a third-party media owner (Clear Channel) who manages their own CMS and does not use the Influence Decision Engine.
2595
+
2596
+ **Step 1**: The Influence user goes to the Deal Detail page for "Nike Summer Collection" and clicks "Activate Deal". The Distribution tab appears.
2597
+
2598
+ **Step 2**: The user copies the VAST endpoint URL for the "Mall Entrance Screens" line item:
2599
+ ```
2600
+ https://adserver.influence.io/vast/v1/deal_abc123/li_mall01?screen_id={SCREEN_ID}&player_id={PLAYER_ID}
2601
+ ```
2602
+
2603
+ **Step 3**: The user emails this URL to the Clear Channel ad operations team.
2604
+
2605
+ **Step 4**: Clear Channel's ad-ops team logs into their Broadsign CMS, creates a new campaign, and pastes the VAST URL as the ad source. They schedule it to run on 50 mall entrance screens from June 1 to June 30, rotating every 15 seconds alongside their other content.
2606
+
2607
+ **Step 5**: When a screen is ready to play the Nike ad, Broadsign calls the VAST URL. Influence checks the line item's targeting rules, flight dates, budget, and frequency caps. If the ad is eligible, Influence returns a VAST XML response containing the creative video URL and tracking pixels. If the ad is not eligible (budget exhausted, outside flight dates, frequency cap hit), Influence returns an empty VAST response and the CMS moves to the next item in its rotation.
2608
+
2609
+ **Step 6**: After each play, the tracking pixels fire back to Influence, recording the impression for reporting and billing.
2610
+
2611
+ **What the VAST URL contains and why:**
2612
+
2613
+ | URL Component | Purpose | Why It's Needed |
2614
+ |---------------|---------|-----------------|
2615
+ | `deal_abc123` (Deal ID) | Identifies which deal this request belongs to | Allows Influence to look up deal-level rules (budget, flight dates, status) |
2616
+ | `li_mall01` (Line Item ID) | Identifies the specific line item | Each line item has its own targeting, creative assignments, CPM, and delivery goals |
2617
+ | `screen_id` (Query param) | Identifies which physical screen is making the request | Enables screen-level frequency capping and geographic validation |
2618
+ | `player_id` (Query param) | Identifies the media player software instance | Enables player-level diagnostics and proof-of-play correlation |
2619
+
2620
+ The Deal ID and Line Item ID are required in the URL because the CMS is explicitly requesting a *specific* ad. Unlike the Decision Engine (where the player asks "what should I play?" and the DE chooses), the VAST Distribution model is a pull system: the CMS already knows which ad it wants and is asking Influence to serve it.
2621
+
2622
+ ### 9.4 Channel Comparison: When Ads Reach Screens
2623
+
2624
+ The following example shows the same campaign delivered through both channels simultaneously to illustrate the operational difference.
2625
+
2626
+ **Campaign**: "Samsung Galaxy Launch" — $75,000 budget, 2 million target impressions, 60-day flight.
2627
+
2628
+ **Line Item 1**: "Airport Screens" — 500 screens in the advertiser's own network, all DE-enabled.
2629
+ **Line Item 2**: "Mall Screens - JCDecaux" — 200 screens owned by JCDecaux, managed via Broadsign CMS.
2630
+
2631
+ | Aspect | Line Item 1 (DE Channel) | Line Item 2 (VAST Distribution) |
2632
+ |--------|--------------------------|----------------------------------|
2633
+ | **Who decides what plays** | Decision Engine | JCDecaux's Broadsign CMS |
2634
+ | **How ads are scheduled** | Automatically via manifest | Manually by JCDecaux ad-ops team |
2635
+ | **How often decisions are made** | Every 15-30 minutes (manifest refresh) | Every time the CMS rotation triggers a VAST call |
2636
+ | **Pacing intelligence** | Yes — DE adjusts delivery rate based on real-time progress | No — CMS plays at a fixed rate regardless of delivery progress |
2637
+ | **Programmatic competition** | Yes — DE can open slots to PMP/PD auctions when PG deals are healthy | No — VAST URL serves only the assigned line item's creative |
2638
+ | **Yield optimization** | Yes — high-value slots go to higher-CPM deals | No — CMS treats all slots equally |
2639
+ | **Offline resilience** | Yes — player buffers current manifest | Depends on CMS capabilities |
2640
+ | **Setup effort** | Low — screens auto-connect to DE | Medium — requires sharing URLs and CMS configuration |
2641
+ | **Revenue reporting** | Real-time via Redis heartbeats | Near real-time via tracking pixels |
2642
+
2643
+ Both line items report into the same deal-level dashboard in Influence. The user sees combined delivery metrics, budget spend, and impression counts regardless of which channel delivered the ads. The reporting layer treats both channels identically — an impression is an impression, whether it came from a DE-managed screen or a VAST-tag-managed screen.
2644
+
2645
+ ### 9.5 Legacy Ad Serving Decision Flow
2646
+
2647
+ For reference, the original step-by-step ad serving flow (used before the Decision Engine) is documented below. This flow applies to VAST Distribution requests, where Influence evaluates a single ad request in isolation.
2648
+
2649
+ **[View Interactive Diagram in Miro](https://miro.com/app/board/uXjVGH3XGbs=?moveToWidget=3458764657790198324)**
2650
+
2651
+ **Step 1: Screen Request** — The screen player sends a request with its unique identifier.
2652
+
2653
+ **Step 2: Screen Validation** — The system checks if the screen is active.
2654
+
2655
+ **Step 3: Find Eligible Deals** — Query for deals where today's date is between start and end dates, status is Active, and targeting includes this screen.
2656
+
2657
+ **Step 4: Find Eligible Line Items** — Get active line items within those deals.
2658
+
2659
+ **Step 5: Apply Filters** — Filter out line items that have exhausted budget, are over-delivering, or are paused.
2660
+
2661
+ **Step 6: Select Winner** — Normalize allocations, sort by priority, apply weighted random selection.
2662
+
2663
+ **Step 7: Return Advertisement** — Return the winning creative's URL to the screen.
2664
+
2665
+ **Step 8: Confirm Delivery** — After playback, the screen sends confirmation to update delivery metrics.
2666
+
2667
+ ---
2668
+
2669
+ ## 10. External System Integrations
2670
+
2671
+ ### 10.1 Integration Overview
2672
+
2673
+ Influence operates as part of a larger advertising ecosystem and integrates with several external systems:
2674
+
2675
+ | System | Purpose | Deal Type |
2676
+ |--------|---------|-----------|
2677
+ | Planner | Campaign planning and inventory reservation | Traditional |
2678
+ | Activate | Programmatic RFP workflows | Programmatic |
2679
+ | Booking Engine | Inventory reservation management | All |
2680
+ | Admin Console | DSP/Seat configuration, company management | All |
2681
+ | Decision Engine | Real-time intelligent ad selection for DE-enabled screens | All |
2682
+
2683
+ ### 10.2 Planner Integration
2684
+
2685
+ Planner is the campaign planning platform used across the advertising ecosystem. It is used by agencies, advertisers, media owners, resellers, internal users, and partner users to build Traditional advertising campaigns. When a campaign is activated in Planner, it flows into Influence for execution. This integration automates the creation of deals and line items, eliminating manual data entry while maintaining the data integrity required for accurate delivery.
2686
+
2687
+ **Campaign Activation and Pre-Approval**
2688
+
2689
+ By the time a campaign reaches Influence from Planner, it has already completed all planning and approval workflows. Inventory reservation, hold requests, pricing negotiation, and stakeholder approvals happen entirely within Planner. Influence receives the campaign in an execution-ready state with status set to Active. Statuses such as "Generated", "Reserved", or "Negotiation" are internal to Planner and have no meaning in Influence.
2690
+
2691
+ All campaigns from Planner are Traditional deals. If a user wants programmatic execution, they select the RFP flow in Planner, which routes the campaign to Activate instead (see Section 10.3).
2692
+
2693
+ **Automatic Deal Creation**
2694
+
2695
+ When Planner activates a campaign, Influence automatically creates a corresponding deal. The deal receives all mandatory fields populated from Planner data:
2696
+
2697
+ The deal name comes from the campaign name in Planner. The External Deal ID field stores the Planner campaign ID for cross-platform tracking. Since Planner only sends Traditional campaigns, the Deal Type is always set to Traditional. The SSP Partner defaults to "Influence" (the built-in SSP). Brand and Agency are linked based on Planner selections. Countries, currency, budget, goals, and flight dates all transfer from Planner configuration. The Source field is automatically set to "Planner" to identify the deal's origin.
2698
+
2699
+ **Note on Multi-Media Owner Campaigns:** When a Planner campaign involves multiple media owners, the system creates a single deal with separate line items for each media owner. The deal ID remains the same across all line items, but each line item is assigned to its specific media owner. This approach enables proper access control while maintaining campaign-level reporting and budget tracking.
2700
+
2701
+ **Automatic Line Item Creation by Media Owner**
2702
+
2703
+ The most important aspect of Planner integration is how line items are created. Influence creates one line item for each media owner included in the campaign. This design enables proper access control and ensures each media owner can manage only their portion of the campaign.
2704
+
2705
+ Consider a campaign called "Holiday Promo 2026" that uses screens from five different media owners: JCDecaux Malaysia with 200 screens, Clear Channel Singapore with 150 screens, oOh!media New Zealand with 100 screens, Lamar Advertising with 75 screens, and Outfront Media with 50 screens. When this campaign is sent to Influence, the system creates one deal and five line items. Each line item is named by appending the media owner name to the deal name (for example, "Holiday Promo 2026 - JCDecaux Malaysia").
2706
+
2707
+ Each line item receives configuration from Planner including the creative type (Display, Video, or Audio), the specific screens pre-selected in Planner, the negotiated CPM rate for that media owner, and geography targeting within the deal's countries. Target impressions are allocated based on Planner's configuration for each media owner segment. Priority defaults to 5 and can be adjusted within Influence if needed. Traffic allocation follows the default behavior described in Section 6.2—each line item is assigned 100%, and the normalization logic distributes traffic proportionally across all active line items.
2708
+
2709
+ **Media Owner Access Control**
2710
+
2711
+ The multi-media owner structure enables granular access control. When a media owner logs into Influence, they see only the deals and line items that belong to them. This isolation is fundamental to the platform's multi-tenant architecture.
2712
+
2713
+ An agency or advertiser who created the campaign sees the complete deal with all line items across all media owners. They can monitor overall campaign performance, track delivery across all markets, and manage budget at the deal level.
2714
+
2715
+ A media owner sees only their portion. When JCDecaux Malaysia logs in, they see the "Holiday Promo 2026" deal but only with their single line item visible. They cannot see line items belonging to Clear Channel, oOh!media, or any other media owner. This prevents competitors from viewing each other's pricing, performance data, or delivery status.
2716
+
2717
+ The access control extends throughout the platform. In the Deals list, media owners see deals containing at least one of their line items. In the Deal Detail page, they see only their line items. In the Line Item Detail, they manage only their assigned items. In Inventory, they see only screens they own. In Content Hub, they see only creatives assigned to their line items for Tier 2 approval.
2718
+
2719
+ **Planner Responsibilities**
2720
+
2721
+ Several workflows remain entirely within Planner and do not occur in Influence. These include inventory reservation, inventory hold, approval workflows, and pricing negotiation. Additionally, Planner is responsible for updating the Booking Engine for campaigns it creates. Influence does not update the Booking Engine for Planner-originated campaigns.
2722
+
2723
+ ### 10.3 Activate Integration
2724
+
2725
+ **Campaign Flow from Activate**
2726
+
2727
+ When a user completes an RFP (Request for Proposal) workflow in Activate, the resulting deal is sent to Influence for execution.
2728
+
2729
+ 1. **RFP Flow Selection**: In Planner, users can select the RFP flow if they want programmatic execution. This routes the campaign to Activate.
2730
+
2731
+ 2. **Programmatic Deals**: All deals from Activate are Programmatic deals in Influence (PG, Preferred Deal, PMP, Always On, or Open Auction as configured in Activate).
2732
+
2733
+ 3. **DSP Configuration**: DSP and seat information is established during the RFP process in Activate and passed to Influence.
2734
+
2735
+ **RFP Badge Display**
2736
+
2737
+ Deals that originate from Activate display an "RFP" badge in the user interface:
2738
+ - In the Deals list: The RFP badge appears in the Source column next to "Activate"
2739
+ - In the Deal Detail page: The RFP badge appears in the page header alongside the deal name
2740
+ - Purpose: The badge indicates to media owners that this deal requires RFP review and approval
2741
+
2742
+ **RFP Filter**
2743
+
2744
+ The Deals list filter drawer includes an RFP Status filter allowing users to filter deals by:
2745
+ - RFP (Pending Review): Shows deals that are RFP deals from Activate
2746
+ - Not RFP: Shows traditional deals or programmatic deals that are not from the RFP workflow
2747
+
2748
+ ### 10.4 Booking Engine Integration
2749
+
2750
+ The Booking Engine is a separate service that manages inventory reservations and campaign scheduling across the Influence ecosystem.
2751
+
2752
+ **Update Responsibilities**
2753
+
2754
+ | Deal Source | Who Updates Booking Engine |
2755
+ |-------------|---------------------------|
2756
+ | Influence (created locally) | Influence |
2757
+ | Planner | Planner |
2758
+ | Activate | Activate |
2759
+
2760
+ **When Influence Updates Booking Engine**
2761
+
2762
+ When a media owner creates a Traditional campaign directly in Influence:
2763
+ 1. The campaign is assumed to be approved offline
2764
+ 2. When the Deal is fully configured and created, Influence updates the Booking Engine
2765
+ 3. The Booking Engine records the inventory reservation
2766
+
2767
+ **Traditional Deal Assumption**
2768
+
2769
+ For Traditional deals created in Influence by media owners, it is assumed that the campaign approval has happened offline through direct communication with the advertiser/agency.
2770
+
2771
+ ### 10.5 Admin Console Integration
2772
+
2773
+ The Admin Console is the central management platform for partner configurations, company data, and access control.
2774
+
2775
+ **Data Sourced from Admin Console**
2776
+
2777
+ | Data Type | Description | Used In |
2778
+ |-----------|-------------|---------|
2779
+ | SSP Partners | Supply-Side Platform configurations available to the company | Deal Form - SSP Partner dropdown |
2780
+ | Media Owner Access | Which media owners are available per SSP | Deal Form - Media Owner dropdown (filtered by SSP) |
2781
+ | DSP Partners | Demand-Side Platform configurations | Deal Form - DSP Partner dropdown |
2782
+ | DSP Access | Which DSPs are available to each company (Agency/Brand) | Deal Form - filters DSP dropdown based on selected Agency/Brand |
2783
+ | Seat Names | Buyer seat configurations per DSP per company | Deal Form - Seat Name dropdown |
2784
+ | Seat IDs | Unique identifiers for each seat | Deal Form - Seat ID field (view-only, verified on save) |
2785
+ | Country Access | Which countries the logged-in user can access | Deal Form - Countries multi-select dropdown |
2786
+ | Company Hierarchy | Media owner parent-child relationships | Deal Form - Media Owner dropdown hierarchy |
2787
+ | User Home Country | Default country for the logged-in user | Deal Form - Countries default selection |
2788
+
2789
+ **SSP Access Workflow**
2790
+
2791
+ 1. **Company SSP Configuration**: In Admin Console, each company has a list of SSP partners they can access.
2792
+ 2. **SSP Dropdown Population**: When a user opens the Deal Form, the SSP Partner dropdown is populated with SSPs that the user's company has access to.
2793
+ 3. **Default SSP**: Influence (built-in SSP) is always available and is the default selection.
2794
+
2795
+ **Media Owner Filtering**
2796
+
2797
+ 1. **SSP-Media Owner Relationship**: Each media owner's inventory is connected to specific SSP partners.
2798
+ 2. **Dynamic Filtering**: When an SSP is selected, the Media Owner dropdown is filtered to show only media owners with inventory connected to that SSP.
2799
+
2800
+ **Country Access Workflow**
2801
+
2802
+ 1. **User Country Permissions**: In Admin Console, each user account has country access permissions configured.
2803
+ 2. **Countries Dropdown Population**: The Countries multi-select dropdown only shows countries the user has permission to access.
2804
+ 3. **Default Country**: The user's home country (configured in Admin Console) is pre-selected by default.
2805
+ 4. **Line Item Geography Constraint**: Line items can only target cities, areas, and towns within the countries selected at the Deal level.
2806
+
2807
+ **DSP/Seat Management Workflow**
2808
+
2809
+ 1. **Viewing DSPs in Influence**: When creating a programmatic deal, the DSP dropdown shows options sourced from Admin Console based on the selected company's (Agency or Brand) DSP Access configuration.
2810
+
2811
+ 2. **Creating Seats**: While creating or editing an agency in Influence, users can select DSP and create seats. This data is created in Admin Console via API.
2812
+
2813
+ 3. **Seat ID Verification**: Before saving a deal, the system verifies the Seat ID exists and is valid in Admin Console. Invalid or removed Seat IDs will cause the save to fail.
2814
+
2815
+ 4. **Seat ID Display**: Seat IDs are fetched from Admin Console and displayed as read-only in Influence. Users cannot manually edit Seat IDs.
2816
+
2817
+ **Integration Architecture**
2818
+
2819
+ **[View Interactive Diagram in Miro](https://miro.com/app/board/uXjVGH3XGbs=?moveToWidget=3458764657790198328)**
2820
+
2821
+ <p align="center"><em>Figure: Admin Console Integration Architecture</em></p>
2822
+
2823
+ ### 10.6 Decision Engine Integration
2824
+
2825
+ The Decision Engine (DE) is an external microservice that provides intelligent ad selection for screens in the network. Unlike Planner or Activate (which send data *into* Influence), the Decision Engine reads data *from* Influence and makes real-time serving decisions independently.
2826
+
2827
+ **Deployment Model**
2828
+
2829
+ The Decision Engine runs as a separate service with its own infrastructure. It is not embedded within the Influence Adserver application. The DE has its own base URL (e.g., `https://de.influence.io`), its own API endpoints, and its own Redis instance for real-time state tracking. The Influence Adserver and the Decision Engine share access to the same underlying deal, line item, and creative data, but they do not call each other's APIs directly during normal operation.
2830
+
2831
+ **Data Flow**
2832
+
2833
+ | Direction | Data | Mechanism |
2834
+ |-----------|------|-----------|
2835
+ | Influence → DE | Deal configurations, line item rules, creative assignments, budget limits, flight dates, targeting | Shared database (DE reads from Influence's data store) |
2836
+ | DE → Redis | Real-time pacing counters, SOV trackers, budget consumption, frequency cap state | Direct Redis writes from DE and heartbeat endpoint |
2837
+ | Player → DE | Screen reference ID, manifest requests | DE API: `POST /v1/decision/simple` |
2838
+ | Player → DE | Impression confirmations (heartbeats) | DE API: `GET /v3/track` |
2839
+ | DE → Player | Manifest (sequence of ads with creative URLs and tracking) | DE API response |
2840
+
2841
+ **What Influence Provides to the Decision Engine**
2842
+
2843
+ The Decision Engine requires the following data from Influence to make serving decisions:
2844
+
2845
+ 1. **Active deals and line items** — which campaigns are currently in-flight, their priorities, budgets, and delivery goals
2846
+ 2. **Creative assignments** — which creatives are approved and assigned to each line item, including media file URLs and dimensions
2847
+ 3. **Targeting rules** — geographic targeting, venue types, screen specifications, and dayparting schedules
2848
+ 4. **Traffic allocation and priority** — the configured allocation percentages and priority rankings for each line item
2849
+ 5. **Frequency cap settings** — maximum plays per screen per time period for programmatic deal types
2850
+
2851
+ **What the Decision Engine Returns to Players**
2852
+
2853
+ The DE returns a time-limited manifest containing a sequence of ads to play. Each entry in the manifest includes the deal ID, line item ID, creative URL, duration, tracking URL, and a resume token. The full API specification is documented in [Section 9.2.5 — Decision Engine API](#925-decision-engine-api).
2854
+
2855
+ **Relationship to VAST Distribution**
2856
+
2857
+ The Decision Engine and VAST Distribution (Section 4.10) are complementary, not competing. A single deal can have some line items served through the DE (on DE-enabled screens) and other line items distributed via VAST tags (on third-party CMS-managed screens). Both channels report impressions back to Influence, and the deal-level dashboard aggregates data from both sources. See [Section 9.4 — Channel Comparison](#94-channel-comparison-when-ads-reach-screens) for a detailed side-by-side comparison.
2858
+
2859
+ ---
2860
+
2861
+ ## 11. Inventory Integration
2862
+
2863
+ ### 11.1 External Product Overview
2864
+
2865
+ The Inventory Management product handles:
2866
+ - Screen registration and configuration
2867
+ - Screen health monitoring
2868
+ - Device management
2869
+ - Physical location and venue mapping
2870
+ - Display specifications
2871
+ - Daily impression forecasting
2872
+
2873
+ ### 11.2 Accessing Inventory Management
2874
+
2875
+ Click "Inventory" in the sidebar to open the Inventory Management application in a new tab.
2876
+
2877
+ ---
2878
+
2879
+ ## 12. Integrations
2880
+
2881
+ ### 12.1 Built-in SSP
2882
+
2883
+ Influence includes a native Supply-Side Platform called "Influence SSP". This SSP is always active and cannot be disabled.
2884
+
2885
+ ### 12.2 External SSP Partners
2886
+
2887
+ Operators can connect additional SSP partners:
2888
+ - Hivestack
2889
+ - Vistar
2890
+ - Place Exchange
2891
+ - VIOOH
2892
+ - Broadsign
2893
+ - Magnite
2894
+
2895
+ ### 12.3 DSP Partners
2896
+
2897
+ DSP integrations define which demand partners can bid on inventory. DSP configurations are managed through Admin Console.
2898
+
2899
+ ---
2900
+
2901
+ ## 13. User Interface Navigation
2902
+
2903
+ ### 13.1 Application Layout
2904
+
2905
+ The application uses a sidebar-and-main-content layout with header bar.
2906
+
2907
+ ### 13.2 Sidebar Navigation
2908
+
2909
+ | Menu Item | Purpose |
2910
+ |-----------|---------|
2911
+ | Dashboard | Main overview with metrics |
2912
+ | Deals | Deal management with drill-down to line items and creatives |
2913
+ | Content Hub | Creative library (Tier 1 approval) |
2914
+ | Inventory | External Inventory Management product (external link) |
2915
+ | Proof of Play | Ad playback verification and playlog uploads |
2916
+ | Integrations | SSP/DSP partner connections |
2917
+ | Measure | External reporting and analytics platform (external link) |
2918
+ | Configuration | Dropdown menu containing Signals, Custom POIs, Tags, and Settings |
2919
+
2920
+ ### 13.3 Navigation Flow
2921
+
2922
+ The primary navigation follows a drill-down pattern:
2923
+
2924
+ ```
2925
+ Deals List → Deal Detail → Line Item Form → Line Item Creatives → Creative Assignment
2926
+ ```
2927
+
2928
+ URLs follow this pattern:
2929
+ - `/deals` - Deals list
2930
+ - `/deals/:id` - Deal detail
2931
+ - `/deals/:id/line-items/new` - Create line item
2932
+ - `/deals/:id/line-items/:lineItemId` - Edit line item
2933
+ - `/deals/:id/line-items/:lineItemId/creatives` - Line item creatives
2934
+
2935
+ ### 13.4 Header Controls
2936
+
2937
+ The header bar includes:
2938
+ - Sidebar toggle
2939
+ - Language switcher
2940
+ - Product switcher
2941
+ - User menu
2942
+
2943
+ ### 13.5 User Menu
2944
+
2945
+ Accessed from the avatar in the header:
2946
+ - Profile settings
2947
+ - Account preferences
2948
+ - Sign out
2949
+
2950
+ ### 13.6 Theme Settings
2951
+
2952
+ Light and dark mode toggle available in settings.
2953
+
2954
+ ### 13.7 Form Pages
2955
+
2956
+ Forms use a two-column layout:
2957
+ - Left column: Form fields organized in sections
2958
+ - Right column: Insights panel with contextual guidance
2959
+
2960
+ ### 13.8 Filter Drawer
2961
+
2962
+ Filter drawers slide in from the right with:
2963
+ - Searchable dropdowns
2964
+ - Date range pickers
2965
+ - Apply/Clear All buttons
2966
+
2967
+ ### 13.9 Inline Filtering and Sorting
2968
+
2969
+ Tables support:
2970
+ - Column sorting
2971
+ - Search input
2972
+ - Status filters
2973
+
2974
+ ### 13.10 Dialog Usage
2975
+
2976
+ Dialogs are used for:
2977
+ - Confirmations (delete, publish)
2978
+ - Quick create (agency, brand)
2979
+ - Previews
2980
+
2981
+ ---
2982
+
2983
+ ## 14. History Logs and Audit Trail
2984
+
2985
+ ### 14.1 Overview
2986
+
2987
+ All changes to deals, line items, and creative assignments are logged for audit purposes.
2988
+
2989
+ ### 14.2 What Gets Tracked
2990
+
2991
+ | Entity | Tracked Changes |
2992
+ |--------|-----------------|
2993
+ | Deal | Create, update, status change, delete |
2994
+ | Line Item | Create, update, status change, delete |
2995
+ | Creative Assignment | Create, update, approval status change |
2996
+
2997
+ ### 14.3 Created By Attribution
2998
+
2999
+ Each record tracks:
3000
+ - Created by (user)
3001
+ - Created at (timestamp)
3002
+ - Last modified by (user)
3003
+ - Last modified at (timestamp)
3004
+
3005
+ ### 14.4 View History Button
3006
+
3007
+ A "View History" button on detail pages opens the audit log showing all changes with timestamps and user attribution.
3008
+
3009
+ ### 14.5 API Endpoints
3010
+
3011
+ History logs are accessible via API for integration with external audit systems.
3012
+
3013
+ ---
3014
+
3015
+ ## 15. Recommendation Engine Integration
3016
+
3017
+ ### 15.1 Overview
3018
+
3019
+ Influence integrates with MW Planner's Recommendation Engine V2 to provide AI-driven inventory recommendations. The engine analyzes available screens against campaign parameters and returns ranked recommendations based on an 8-factor scoring system.
3020
+
3021
+ ### 15.2 Campaign Goals
3022
+
3023
+ The recommendation engine optimizes for the following campaign goal types:
3024
+
3025
+ | Goal Type | Description | Primary Optimization |
3026
+ |-----------|-------------|----------------------|
3027
+ | Impressions | Maximize total ad views | Screen reach and traffic |
3028
+ | Reach | Maximize unique audience exposure | Geographic distribution |
3029
+ | Share of Voice | Achieve target ad presence percentage | Availability and frequency |
3030
+ | Ad Plays | Maximize content display frequency | High-frequency screens |
3031
+ | Carbon Emission | Minimize environmental impact | Energy-efficient displays |
3032
+
3033
+ ### 15.3 Scoring System (8 Factors)
3034
+
3035
+ Each inventory is scored 0-100 across eight factors:
3036
+
3037
+ 1. **Measure Fit** (20-28%): How well the inventory delivers the campaign goal
3038
+ 2. **Geo Fit** (15-22%): Location relevance to target geography
3039
+ 3. **Availability** (10-15%): Fraction of requested schedule available
3040
+ 4. **Budget Fit** (15-20%): Cost efficiency relative to budget
3041
+ 5. **Audience Fit** (8-12%): Audience segment overlap
3042
+ 6. **Brand Fit** (8-10%): Brand category to venue affinity
3043
+ 7. **Quality Fit** (5-20%): Physical and creative quality score
3044
+ 8. **Time Fit** (4%): Daypart and date alignment
3045
+
3046
+ Weights vary by goal type. For example, "carbon_emission" goals weight Quality Fit at 20%, while "impressions" goals weight Measure Fit at 25%.
3047
+
3048
+ ### 15.4 Recommendation Panel (Line Item Form)
3049
+
3050
+ When creating or editing a line item, the AI Recommendations panel appears in the sidebar:
3051
+
3052
+ - **Trigger**: Panel activates when the parent deal has start/end dates
3053
+ - **Display**: Shows top 10 recommended screens with scores
3054
+ - **Actions**: Click "+" to add recommended screen to selection
3055
+ - **Refresh**: Manual refresh button for updated recommendations
3056
+
3057
+ Each recommendation shows:
3058
+ - Score badge (color-coded by score range)
3059
+ - Screen name and format
3060
+ - Location (city, country)
3061
+ - Estimated impressions and CPM
3062
+ - AI explanation ("Why recommended")
3063
+
3064
+ ### 15.5 Score Breakdown Tooltip
3065
+
3066
+ Hovering over the score badge reveals a breakdown of all 8 scoring components with progress bars. This helps users understand why a screen was recommended.
3067
+
3068
+ ### 15.6 Auto-Optimize Feature
3069
+
3070
+ Line items can be automatically optimized via the Deal Detail page:
3071
+
3072
+ 1. Open Deal Detail page
3073
+ 2. Click the actions menu (...) for a line item
3074
+ 3. Select "Auto-Optimize"
3075
+ 4. System analyzes and recommends top 5 screens
3076
+ 5. Confirmation shows: inventories added, estimated impressions, estimated cost
3077
+
3078
+ **Note**: Auto-optimize does not overwrite manual screen selections; it adds recommended screens to the existing selection.
3079
+
3080
+ ### 15.7 API Endpoints
3081
+
3082
+ | Endpoint | Method | Description |
3083
+ |----------|--------|-------------|
3084
+ | `/api/recommendations` | POST | Get inventory recommendations |
3085
+ | `/api/deals/:id/recommendations` | GET | Get recommendations for a deal |
3086
+ | `/api/line-items/:id/auto-optimize` | POST | Auto-optimize a line item |
3087
+
3088
+ ### 15.8 Request Parameters
3089
+
3090
+ ```json
3091
+ {
3092
+ "country": "US",
3093
+ "startDate": "2024-01-01",
3094
+ "endDate": "2024-01-31",
3095
+ "budget": 50000,
3096
+ "goalType": "impressions",
3097
+ "goalValue": 1000000,
3098
+ "geography": {
3099
+ "cities": ["New York", "Los Angeles"]
3100
+ },
3101
+ "limit": 10
3102
+ }
3103
+ ```
3104
+
3105
+ ### 15.9 Response Structure
3106
+
3107
+ ```json
3108
+ {
3109
+ "runId": "uuid",
3110
+ "status": "success",
3111
+ "recommendations": [
3112
+ {
3113
+ "inventoryId": "screen-001",
3114
+ "inventoryName": "Times Square Billboard",
3115
+ "score": 87,
3116
+ "scoreComponents": { ... },
3117
+ "metrics": {
3118
+ "estimatedImpressions": 500000,
3119
+ "estimatedCost": 15000,
3120
+ "cpm": 30.00
3121
+ },
3122
+ "whyRecommended": "Excellent location match • High impression delivery"
3123
+ }
3124
+ ],
3125
+ "summary": {
3126
+ "totalInventoriesAnalyzed": 150,
3127
+ "totalReturned": 10,
3128
+ "estimatedTotalImpressions": 2500000,
3129
+ "estimatedTotalCost": 45000,
3130
+ "budgetUtilization": 90
3131
+ }
3132
+ }
3133
+ ```
3134
+
3135
+ ### 15.10 External Engine Integration
3136
+
3137
+ The recommendation service supports both internal mock scoring and external API integration:
3138
+
3139
+ - **Mock Mode**: Default; uses internal scoring algorithms
3140
+ - **External Mode**: Set `RECOMMENDATION_ENGINE_URL` environment variable to connect to MW Planner's external engine
3141
+
3142
+ When the external engine is unavailable, the system gracefully falls back to mock recommendations.
3143
+
3144
+ ---
3145
+
3146
+ ## 16. Proof of Play (PoP) System
3147
+
3148
+ Proof of Play (PoP) records verify that advertisements were displayed as scheduled. These records provide accountability to advertisers and enable accurate billing and performance reporting.
3149
+
3150
+ ### 16.1 Overview
3151
+
3152
+ PoP records contain proof media (images or videos) captured during ad playback on screens. Each record verifies that a specific creative was displayed on a specific screen at a specific time.
3153
+
3154
+ ### 16.2 PoP Record Sources
3155
+
3156
+ PoP data can originate from two sources:
3157
+
3158
+ | Source | Description |
3159
+ |--------|-------------|
3160
+ | CMS Integration | Automatic playlog data pulled from connected CMS platforms (Studio, Broadsign, etc.) |
3161
+ | Manual Upload | Playlog files uploaded by media owners for traditional campaigns |
3162
+
3163
+ ### 16.3 PoP Record Display
3164
+
3165
+ The Proof of Play page displays a table with the following columns:
3166
+
3167
+ | Column | Description |
3168
+ |--------|-------------|
3169
+ | Inventory | Screen name and location |
3170
+ | Player | Player device identifier |
3171
+ | Creative | Creative name and thumbnail |
3172
+ | Deal / Line Item | Associated deal and line item |
3173
+ | Play Time | Timestamp of ad playback |
3174
+ | Status | Verification status (Verified, Pending, Failed) |
3175
+
3176
+ **Duration Calculation**: Play duration is calculated from the timestamp difference between play start and end times.
3177
+
3178
+ ### 16.4 Status Workflow
3179
+
3180
+ | Status | Description |
3181
+ |--------|-------------|
3182
+ | Pending | PoP record received, awaiting verification |
3183
+ | Verified | Proof media confirmed, record valid |
3184
+ | Failed | Verification failed (missing media, timestamp mismatch) |
3185
+
3186
+ ---
3187
+
3188
+ ## 17. Playlog Upload System
3189
+
3190
+ Media owners can manually upload playlogs for traditional campaigns that do not have CMS integration.
3191
+
3192
+ ### 17.1 Upload Interface
3193
+
3194
+ The playlog upload interface includes:
3195
+ - **Deal/Line Item pre-fill**: When accessed from a specific deal or line item, IDs are pre-filled
3196
+ - **File upload area**: Drag-and-drop or click to select CSV/Excel files
3197
+ - **Template download**: Link to download the standard playlog template
3198
+ - **Preview table**: Shows parsed data before submission
3199
+
3200
+ ### 17.2 CSV Template
3201
+
3202
+ The playlog template includes the following columns:
3203
+
3204
+ | Column | Required | Description |
3205
+ |--------|----------|-------------|
3206
+ | inventory_id | Yes | Screen/inventory identifier |
3207
+ | player_id | No | Player device identifier |
3208
+ | creative_id | Yes | Creative identifier |
3209
+ | play_start | Yes | Playback start timestamp (ISO 8601) |
3210
+ | play_end | No | Playback end timestamp |
3211
+ | duration_seconds | No | Play duration in seconds |
3212
+
3213
+ **Template URL**: Available via download button on the upload page.
3214
+
3215
+ ### 17.3 File Processing
3216
+
3217
+ The system handles:
3218
+ - CSV file parsing with automatic delimiter detection
3219
+ - Excel file conversion (.xlsx, .xls)
3220
+ - Date format normalization
3221
+ - Validation against existing deals, line items, and inventory
3222
+
3223
+ ---
3224
+
3225
+ ## 18. Configuration Menu
3226
+
3227
+ The Configuration dropdown in the sidebar provides access to administrative and setup features.
3228
+
3229
+ ### 18.1 Menu Items
3230
+
3231
+ | Item | Description |
3232
+ |------|-------------|
3233
+ | Signals | Trigger-based automation rules for campaign optimization |
3234
+ | Custom POIs | Points of Interest management for geotargeting |
3235
+ | Tags | Cross-platform tag management |
3236
+ | Settings | Platform-wide configuration options |
3237
+
3238
+ ### 18.2 Signals
3239
+
3240
+ Signals enable conditional automation based on real-time triggers. See Section 8 for detailed documentation.
3241
+
3242
+ ### 18.3 Custom POIs
3243
+
3244
+ Custom POIs allow users to create their own Points of Interest for geotargeting. Features include:
3245
+
3246
+ **POI Library View**:
3247
+ - Table with columns: Name, Category, Location, Radius, Status, Created By, Created Date
3248
+ - Search and filter functionality
3249
+ - Actions: View on map, Edit, Delete
3250
+
3251
+ **POI Categories**:
3252
+ - Shopping, Office, Sports, Entertainment, Restaurant, Hotel, Hospital, Education, Transit, Retail, Custom
3253
+
3254
+ **POI Fields**:
3255
+ - Name (required)
3256
+ - Category (required)
3257
+ - Latitude/Longitude (required)
3258
+ - Address, City, Country
3259
+ - Radius in meters
3260
+ - Status (enabled/disabled)
3261
+
3262
+ **Bulk Upload**:
3263
+ - CSV file upload with downloadable template
3264
+ - Template includes all required and optional fields
3265
+ - Validation and preview before import
3266
+
3267
+ ### 18.4 Tags
3268
+
3269
+ Tags provide cross-platform organization integrated with Admin Console:
3270
+
3271
+ - **Storage**: Tags are stored in Admin Console for consistency across Influence, Planner, and Measure
3272
+ - **Properties**: Name, Color (hex), Description
3273
+ - **Usage Tracking**: Shows count of deals, creatives, and line items using each tag
3274
+ - **Color Presets**: 8 preset colors plus custom color picker
3275
+
3276
+ ---
3277
+
3278
+ ## 19. Settings Module
3279
+
3280
+ The Settings page provides comprehensive platform configuration organized into 11 sections.
3281
+
3282
+ ### 19.1 General Settings
3283
+
3284
+ Basic configuration for the ad server:
3285
+ - **Company Name**: Organization name displayed in reports
3286
+ - **Timezone**: Default timezone (UTC, EST, PST, CET, IST)
3287
+ - **Default Currency**: Currency for new deals (USD, EUR, GBP, INR)
3288
+ - **Date Format**: Display format (MM/DD/YYYY, DD/MM/YYYY, YYYY-MM-DD)
3289
+
3290
+ ### 19.2 Notifications
3291
+
3292
+ Alert and notification preferences:
3293
+ - **Deal Alerts**: Notifications when deals reach budget thresholds
3294
+ - **Screen Status Updates**: Alerts when screens go offline or require maintenance
3295
+ - **Daily Performance Reports**: Daily email summaries of deal performance
3296
+ - **Integration Status**: Notifications for SSP/DSP connectivity issues
3297
+
3298
+ ### 19.3 Traffic Control
3299
+
3300
+ Default settings for traffic allocation and delivery:
3301
+ - **Default Traffic Allocation**: Initial percentage (25%, 50%, 75%, 100%)
3302
+ - **Delivery Pacing**: Even, ASAP, or Frontloaded
3303
+ - **Enable Programmatic Fallback**: Fill unfilled inventory with programmatic demand
3304
+
3305
+ ### 19.4 Forecasting Defaults
3306
+
3307
+ Default settings for line item forecasting:
3308
+ - **Default Goal Type**: Impressions, Reach, Share of Voice, Ad Plays, or Carbon Emission
3309
+ - **Confidence Level**: Low (70%), Medium (85%), or High (95%)
3310
+ - **Budget Buffer**: Extra budget allowance percentage for forecast variance
3311
+ - **Forecast Refresh Interval**: Real-time, Hourly, Daily, or Weekly
3312
+ - **Include Historical Performance**: Toggle to use historical data for forecast accuracy
3313
+
3314
+ ### 19.5 Optimization Preferences
3315
+
3316
+ Configuration for AI-powered optimization behavior:
3317
+ - **Optimization Mode**: Aggressive (maximize performance), Balanced (performance + stability), or Conservative (minimal changes)
3318
+ - **Re-optimization Frequency**: Never (manual only), Daily, Weekly, or Monthly
3319
+ - **Auto-Optimize New Line Items**: Automatically apply AI recommendations to new line items
3320
+ - **Enable A/B Testing**: Allow AI to run A/B tests on inventory selection
3321
+ - **Show Optimization Insights**: Display AI reasoning and recommendations in the UI
3322
+
3323
+ ### 19.6 Recommendation Weights
3324
+
3325
+ Adjustment of the 8-factor scoring system for AI recommendations. Each factor has a weight slider (0-30%):
3326
+
3327
+ | Factor | Default Weight | Description |
3328
+ |--------|---------------|-------------|
3329
+ | Measure Fit | 15% | Alignment with campaign measurement goals |
3330
+ | Geo Fit | 15% | Geographic proximity to target locations |
3331
+ | Availability | 15% | Screen availability during campaign period |
3332
+ | Budget Fit | 10% | Cost efficiency relative to budget |
3333
+ | Audience Fit | 15% | Match with target demographic profiles |
3334
+ | Brand Fit | 10% | Suitability for brand guidelines |
3335
+ | Quality Fit | 10% | Screen quality and placement |
3336
+ | Time Fit | 10% | Daypart and timing alignment |
3337
+
3338
+ **Reset to Defaults**: Button to restore all weights to default values.
3339
+
3340
+ ### 19.7 Workflow Settings
3341
+
3342
+ Approval workflows and automation:
3343
+ - **Require Creative Approval**: All creatives must be approved before going live
3344
+ - **Two-Tier Creative Approval**: Enable Tier 2 (Media Owner) approval after Tier 1 (Content Hub)
3345
+ - **Auto-Accept Deals**: Automatically accept deals from trusted partners
3346
+ - **Deal Locking**: Lock deals after acceptance to prevent modifications
3347
+
3348
+ ### 19.8 Terminology
3349
+
3350
+ Customize labels used throughout the platform:
3351
+ - Deal, Line Item, Creative, Inventory, Advertiser, Campaign
3352
+
3353
+ ### 19.9 Themes & Branding
3354
+
3355
+ Visual customization:
3356
+ - **Theme Mode**: Light, Dark, or System
3357
+ - **Primary Color**: Color picker with hex value
3358
+ - **Logo URL**: Custom logo for white-labeling
3359
+ - **Compact Mode**: More compact UI with smaller spacing
3360
+
3361
+ ### 19.10 Inventory Whitelisting
3362
+
3363
+ Control which inventory is available:
3364
+ - **Enable Inventory Whitelisting**: Only show whitelisted inventory
3365
+ - **Whitelisted Inventory IDs**: Comma-separated or newline-separated list
3366
+ - **Exclude Adult Content Venues**: Automatically exclude venues with adult content
3367
+
3368
+ ### 19.11 API Settings
3369
+
3370
+ API configuration:
3371
+ - **API Endpoint**: Display-only endpoint URL
3372
+ - **Rate Limit**: Requests per minute limit
3373
+ - **Request Timeout**: Timeout in milliseconds