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.
- package/.ci/staging.yml +191 -0
- package/.dockerignore +117 -0
- package/.env +40 -0
- package/.env.staging +38 -0
- package/.gitlab-ci.yml +16 -0
- package/DEMO_STATUS.md +579 -0
- package/Dockerfile +61 -0
- package/Influence-MW-AdServer-12-02-2026/client/index.html +17 -0
- package/Influence-MW-AdServer-12-02-2026/client/public/favicon.png +0 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/App.tsx +91 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/advanced-map-drawer.tsx +1131 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ai-recommendation-panel.tsx +379 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/app-sidebar.tsx +183 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/auto-optimize-button.tsx +184 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/availability-drawer.tsx +385 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/brand-insights-panel.tsx +87 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/create-agency-drawer.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/create-brand-drawer.tsx +275 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/creative-assignment.tsx +526 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table-toolbar.tsx +148 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table.tsx +158 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/filter-drawer.tsx +356 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/form-insights-panel.tsx +82 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/geography-selector.tsx +699 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/header-user-menu.tsx +178 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/history-drawer.tsx +313 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-availability-section.tsx +176 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-format-drawer.tsx +173 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-selector.tsx +401 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/manual-inventory-drawer.tsx +368 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/mapbox-map.tsx +368 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/market-insights-panel.tsx +202 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/media-owner-drawer.tsx +217 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/metric-card.tsx +58 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/page-header.tsx +27 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/player-status-indicator.tsx +137 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/poi-targeting-drawer.tsx +298 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/recommendation-score-badge.tsx +102 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/recommended-inventories-panel.tsx +248 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/searchable-combobox.tsx +134 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/signal-visualizations.tsx +407 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/status-badge.tsx +35 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-provider.tsx +73 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-toggle.tsx +37 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/traffic-slider.tsx +75 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/accordion.tsx +56 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert-dialog.tsx +139 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert.tsx +59 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/aspect-ratio.tsx +5 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/avatar.tsx +51 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/badge.tsx +38 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/breadcrumb.tsx +115 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/button.tsx +62 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/calendar.tsx +68 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/card.tsx +85 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/carousel.tsx +260 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/chart.tsx +365 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/checkbox.tsx +28 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/collapsible.tsx +11 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/command.tsx +151 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/context-menu.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dialog.tsx +122 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/drawer.tsx +118 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dropdown-menu.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/form.tsx +178 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/hover-card.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input-otp.tsx +69 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input.tsx +23 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/label.tsx +24 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/menubar.tsx +256 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/navigation-menu.tsx +128 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/pagination.tsx +117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/popover.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/progress.tsx +28 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/radio-group.tsx +42 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/resizable.tsx +45 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/scroll-area.tsx +46 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/select.tsx +160 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/separator.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sheet.tsx +140 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sidebar.tsx +727 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/skeleton.tsx +15 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/slider.tsx +26 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/switch.tsx +27 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/table.tsx +117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tabs.tsx +53 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/textarea.tsx +22 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toast.tsx +127 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toaster.tsx +33 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle-group.tsx +61 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle.tsx +43 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tooltip.tsx +30 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/vendor-stores-modal.tsx +336 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-drawer.tsx +359 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-selector.tsx +436 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-mobile.tsx +19 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-toast.ts +191 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/index.css +244 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/queryClient.ts +57 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/utils.ts +39 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/venue-taxonomy.ts +532 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/main.tsx +5 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/assign-creative.tsx +781 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/content-hub.tsx +995 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/custom-pois.tsx +431 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/dashboard.tsx +620 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-detail.tsx +1062 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-form.tsx +1570 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deals.tsx +716 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/edit-creative-assignment.tsx +1051 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/geotargeting.tsx +675 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/integrations.tsx +425 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-creatives.tsx +622 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-form.tsx +3132 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-items.tsx +530 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/not-found.tsx +21 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play-upload.tsx +479 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play.tsx +880 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/reports.tsx +235 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/settings.tsx +652 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/signal-form.tsx +1117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/signals.tsx +366 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/tags.tsx +332 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/venues.tsx +381 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/types/mapbox-gl-draw.d.ts +37 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/types/react-simple-maps.d.ts +57 -0
- package/Influence-MW-AdServer-12-02-2026/components.json +20 -0
- package/Influence-MW-AdServer-12-02-2026/docs/PRD.md +3373 -0
- package/Influence-MW-AdServer-12-02-2026/docs/influence-feature-mapping.csv +498 -0
- package/Influence-MW-AdServer-12-02-2026/drizzle.config.ts +14 -0
- package/Influence-MW-AdServer-12-02-2026/package-lock.json +9672 -0
- package/Influence-MW-AdServer-12-02-2026/package.json +118 -0
- package/Influence-MW-AdServer-12-02-2026/postcss.config.js +6 -0
- package/Influence-MW-AdServer-12-02-2026/replit.md +91 -0
- package/Influence-MW-AdServer-12-02-2026/script/build.ts +67 -0
- package/Influence-MW-AdServer-12-02-2026/scripts/create-miro-diagrams.cjs +318 -0
- package/Influence-MW-AdServer-12-02-2026/scripts/create-remaining-diagrams.cjs +270 -0
- package/Influence-MW-AdServer-12-02-2026/server/index.ts +103 -0
- package/Influence-MW-AdServer-12-02-2026/server/recommendation-service.ts +319 -0
- package/Influence-MW-AdServer-12-02-2026/server/routes.ts +1890 -0
- package/Influence-MW-AdServer-12-02-2026/server/static.ts +19 -0
- package/Influence-MW-AdServer-12-02-2026/server/storage.ts +2058 -0
- package/Influence-MW-AdServer-12-02-2026/server/vite.ts +58 -0
- package/Influence-MW-AdServer-12-02-2026/shared/schema.ts +1595 -0
- package/Influence-MW-AdServer-12-02-2026/tailwind.config.ts +107 -0
- package/Influence-MW-AdServer-12-02-2026/tsconfig.json +23 -0
- package/Influence-MW-AdServer-12-02-2026/vite.config.ts +40 -0
- package/LINE_ITEM_BUDGET_FIELD_MAPPING.md +178 -0
- package/PCM/.env.example +92 -0
- package/PCM/README.md +558 -0
- package/PCM/docs/TEST_CASES.md +422 -0
- package/PCM/index.js +106 -0
- package/PCM/package-lock.json +3282 -0
- package/PCM/package.json +32 -0
- package/PCM/replit.md +64 -0
- package/PCM/schema.sql +495 -0
- package/PCM/scripts/export-schema.js +183 -0
- package/PCM/scripts/seed-comprehensive.js +631 -0
- package/PCM/scripts/seed-production.js +477 -0
- package/PCM/src/config/db.js +56 -0
- package/PCM/src/config/swagger.js +5975 -0
- package/PCM/src/dto/EmailRequestDTO.js +166 -0
- package/PCM/src/middleware/errorHandler.js +52 -0
- package/PCM/src/middleware/logger.js +26 -0
- package/PCM/src/migrations/001_add_campaign_mode_fields.sql +36 -0
- package/PCM/src/migrations/002_create_deal_id_counters.sql +22 -0
- package/PCM/src/migrations/003_update_publishers_column.sql +15 -0
- package/PCM/src/migrations/004_add_direct_dealtype_and_advertiser.sql +5 -0
- package/PCM/src/migrations/005_add_programmatic_fields_and_update_enums.sql +31 -0
- package/PCM/src/migrations/006_add_line_item_programmatic_fields.sql +12 -0
- package/PCM/src/migrations/007_add_line_item_direct_fields.sql +15 -0
- package/PCM/src/migrations/008_add_inventory_fields.sql +45 -0
- package/PCM/src/migrations/009_move_inventory_fields_to_metadata.sql +32 -0
- package/PCM/src/migrations/010_add_draft_status_and_line_items_count.sql +23 -0
- package/PCM/src/migrations/011_add_planning_field.sql +21 -0
- package/PCM/src/migrations/012_fix_inventory_composite_pk.sql +17 -0
- package/PCM/src/migrations/013_make_external_id_optional.sql +3 -0
- package/PCM/src/migrations/014_create_change_history.sql +38 -0
- package/PCM/src/migrations/016_create_publisher_insertion_orders.sql +33 -0
- package/PCM/src/migrations/017_fix_line_item_id_fk_reference.sql +86 -0
- package/PCM/src/migrations/018_create_approval_tables.sql +44 -0
- package/PCM/src/migrations/019_add_encrypted_token_column.sql +2 -0
- package/PCM/src/migrations/020_add_rejection_reason_to_deals.sql +10 -0
- package/PCM/src/migrations/021_add_publisher_external_id_to_inventories.sql +12 -0
- package/PCM/src/migrations/022_add_line_item_extended_fields.sql +24 -0
- package/PCM/src/migrations/023_add_base_price_fields.sql +8 -0
- package/PCM/src/migrations/run-migrations.js +46 -0
- package/PCM/src/models/ApprovalOTP.js +51 -0
- package/PCM/src/models/ApprovalToken.js +79 -0
- package/PCM/src/models/ChangeHistory.js +107 -0
- package/PCM/src/models/Deal.js +186 -0
- package/PCM/src/models/DealIdCounter.js +28 -0
- package/PCM/src/models/LineItem.js +227 -0
- package/PCM/src/models/LineItemCreative.js +89 -0
- package/PCM/src/models/LineItemInventory.js +115 -0
- package/PCM/src/models/PublisherInsertionOrder.js +93 -0
- package/PCM/src/models/TransactionHistory.js +34 -0
- package/PCM/src/models/associations.js +81 -0
- package/PCM/src/routes/approval.js +321 -0
- package/PCM/src/routes/creatives.js +437 -0
- package/PCM/src/routes/deals.js +1638 -0
- package/PCM/src/routes/digitalSignage.js +242 -0
- package/PCM/src/routes/insertionOrders.js +380 -0
- package/PCM/src/routes/lineItems.js +926 -0
- package/PCM/src/routes/system.js +384 -0
- package/PCM/src/services/ApprovalService.js +885 -0
- package/PCM/src/services/CampaignImportConverter.js +631 -0
- package/PCM/src/services/CampaignModeService.js +273 -0
- package/PCM/src/services/CampaignStatusService.js +395 -0
- package/PCM/src/services/ChangeHistoryService.js +316 -0
- package/PCM/src/services/DealIdService.js +94 -0
- package/PCM/src/services/DealResponseFormatter.js +90 -0
- package/PCM/src/services/EmailNotificationService.js +315 -0
- package/PCM/src/services/LineItemResponseFormatter.js +122 -0
- package/PCM/src/services/LineItemStatusService.js +380 -0
- package/PCM/src/tests/comprehensiveTestRunner.js +360 -0
- package/PCM/src/tests/comprehensiveTests.js +1277 -0
- package/PCM/src/tests/dealTypeUnitTests.js +1058 -0
- package/PCM/src/tests/testRunner.js +248 -0
- package/PCM/src/utils/caseConverter.js +92 -0
- package/PCM/src/utils/dealCalculations.js +206 -0
- package/PCM/src/utils/lineItemPayloadNormalizer.js +41 -0
- package/PCM/src/utils/payloadNormalizer.js +34 -0
- package/PCM/src/utils/sourceNormalizer.js +56 -0
- package/PCM/src/validators/creativeValidator.js +27 -0
- package/PCM/src/validators/dealValidator.js +203 -0
- package/PCM/src/validators/lineItemValidator.js +489 -0
- package/PCM/tests/approval-flows.test.js +238 -0
- package/PCM/tests/approval-workflow.test.js +291 -0
- package/PCM/tests/campaign-import-converter.test.js +543 -0
- package/PCM/tests/campaign-import-e2e.test.js +520 -0
- package/PCM/tests/campaign-status.test.js +539 -0
- package/PCM/tests/direct-publisher-split-reimport.test.js +460 -0
- package/PCM/tests/e2e/digital-signage.test.js +145 -0
- package/PCM/tests/e2e/search-filter-pagination.test.js +399 -0
- package/PCM/tests/e2e-comprehensive.test.js +3446 -0
- package/PCM/tests/edge-cases.test.js +340 -0
- package/PCM/tests/line-item-status.test.js +340 -0
- package/PCM/tests/seller-account-external-ids.test.js +877 -0
- package/PCM/tests/source-validation.test.js +324 -0
- package/PRD.md +3373 -0
- package/README.md +186 -0
- package/client/index.html +35 -0
- package/client/public/DEMO_STATUS.md +579 -0
- package/client/public/img/MW-logo-trans_1754045676555.png +0 -0
- package/client/public/locales/ar/approval.json +144 -0
- package/client/public/locales/ar/buyer.json +61 -0
- package/client/public/locales/ar/campaigns.json +1 -0
- package/client/public/locales/ar/common.json +218 -0
- package/client/public/locales/ar/contentHub.json +266 -0
- package/client/public/locales/ar/creatives.json +79 -0
- package/client/public/locales/ar/dashboard.json +57 -0
- package/client/public/locales/ar/deals.json +886 -0
- package/client/public/locales/ar/dsp.json +131 -0
- package/client/public/locales/ar/inventory.json +201 -0
- package/client/public/locales/ar/lineItems.json +553 -0
- package/client/public/locales/ar/navigation.json +48 -0
- package/client/public/locales/ar/wizard.json +1 -0
- package/client/public/locales/en/approval.json +144 -0
- package/client/public/locales/en/buyer.json +65 -0
- package/client/public/locales/en/campaigns.json +1 -0
- package/client/public/locales/en/common.json +218 -0
- package/client/public/locales/en/contentHub.json +266 -0
- package/client/public/locales/en/creatives.json +79 -0
- package/client/public/locales/en/dashboard.json +57 -0
- package/client/public/locales/en/deals.json +886 -0
- package/client/public/locales/en/dsp.json +131 -0
- package/client/public/locales/en/inventory.json +201 -0
- package/client/public/locales/en/lineItems.json +659 -0
- package/client/public/locales/en/navigation.json +48 -0
- package/client/public/locales/en/wizard.json +1 -0
- package/client/public/locales/ja/approval.json +144 -0
- package/client/public/locales/ja/buyer.json +61 -0
- package/client/public/locales/ja/campaigns.json +1 -0
- package/client/public/locales/ja/common.json +218 -0
- package/client/public/locales/ja/contentHub.json +266 -0
- package/client/public/locales/ja/creatives.json +79 -0
- package/client/public/locales/ja/dashboard.json +57 -0
- package/client/public/locales/ja/deals.json +886 -0
- package/client/public/locales/ja/dsp.json +131 -0
- package/client/public/locales/ja/inventory.json +201 -0
- package/client/public/locales/ja/lineItems.json +553 -0
- package/client/public/locales/ja/navigation.json +48 -0
- package/client/public/locales/ja/wizard.json +1 -0
- package/client/public/locales/zh/approval.json +144 -0
- package/client/public/locales/zh/buyer.json +61 -0
- package/client/public/locales/zh/campaigns.json +1 -0
- package/client/public/locales/zh/common.json +218 -0
- package/client/public/locales/zh/contentHub.json +266 -0
- package/client/public/locales/zh/creatives.json +79 -0
- package/client/public/locales/zh/dashboard.json +57 -0
- package/client/public/locales/zh/deals.json +886 -0
- package/client/public/locales/zh/dsp.json +131 -0
- package/client/public/locales/zh/inventory.json +201 -0
- package/client/public/locales/zh/lineItems.json +553 -0
- package/client/public/locales/zh/navigation.json +48 -0
- package/client/public/locales/zh/wizard.json +1 -0
- package/client/public/manifest.json +36 -0
- package/client/src/App.tsx +464 -0
- package/client/src/components/app-sidebar.tsx +312 -0
- package/client/src/components/approval/approval-decision-form.test.tsx +294 -0
- package/client/src/components/approval/approval-decision-form.tsx +326 -0
- package/client/src/components/approval/approval-sheet.tsx +631 -0
- package/client/src/components/approval/line-item-details-sheet.tsx +371 -0
- package/client/src/components/approval/otp-verification.test.tsx +337 -0
- package/client/src/components/approval/otp-verification.tsx +180 -0
- package/client/src/components/content-hub/bulk-transcode-dialog.tsx +379 -0
- package/client/src/components/content-hub/content-hub-manager-v2.tsx +574 -0
- package/client/src/components/content-hub/content-hub-manager.tsx +330 -0
- package/client/src/components/content-hub/creative-card.tsx +456 -0
- package/client/src/components/content-hub/creative-detail-sheet.tsx +685 -0
- package/client/src/components/content-hub/creative-filters.tsx +457 -0
- package/client/src/components/content-hub/creative-grid.tsx +329 -0
- package/client/src/components/content-hub/creative-selector.tsx +415 -0
- package/client/src/components/content-hub/creative-upload.tsx +547 -0
- package/client/src/components/content-hub/folder-dialogs.tsx +445 -0
- package/client/src/components/content-hub/folder-list.tsx +280 -0
- package/client/src/components/content-hub/review-dialogs.tsx +268 -0
- package/client/src/components/content-hub/transcode-dialog.tsx +226 -0
- package/client/src/components/creative-library/creative-details-view.tsx +446 -0
- package/client/src/components/creative-library/creative-filters-panel.tsx +203 -0
- package/client/src/components/creative-library/creative-list.tsx +360 -0
- package/client/src/components/creative-library/creative-status-badge.tsx +71 -0
- package/client/src/components/creative-library/folder-card.tsx +78 -0
- package/client/src/components/creative-library/index.ts +27 -0
- package/client/src/components/creative-library/new-creative-card.tsx +211 -0
- package/client/src/components/creative-library/upload-creative-dialog.tsx +261 -0
- package/client/src/components/dashboard-overview.tsx +109 -0
- package/client/src/components/deals/approval-history-panel.test.tsx +240 -0
- package/client/src/components/deals/approval-history-panel.tsx +156 -0
- package/client/src/components/deals/deal-status-badge.tsx +92 -0
- package/client/src/components/deals/import-from-planner-dialog.tsx +399 -0
- package/client/src/components/deals/market-insights-panel.tsx +237 -0
- package/client/src/components/deals/reopen-deal-sheet.tsx +191 -0
- package/client/src/components/deals/request-approval-sheet.test.tsx +323 -0
- package/client/src/components/deals/request-approval-sheet.tsx +136 -0
- package/client/src/components/deals/resend-approval-sheet.tsx +201 -0
- package/client/src/components/direct-campaigns/campaign-card.tsx +283 -0
- package/client/src/components/direct-campaigns/deal-filter-panel.tsx +325 -0
- package/client/src/components/inventory/advanced-filters-panel.tsx +273 -0
- package/client/src/components/inventory/csv-upload-modal.tsx +639 -0
- package/client/src/components/inventory/inventory-availability-view.tsx +486 -0
- package/client/src/components/inventory/inventory-details-sheet.tsx +376 -0
- package/client/src/components/inventory/inventory-map-view.tsx +596 -0
- package/client/src/components/inventory/inventory-settings-menu.tsx +52 -0
- package/client/src/components/language-switcher.tsx +53 -0
- package/client/src/components/line-items/campaign-forecast-panel.tsx +138 -0
- package/client/src/components/line-items/form-insights.tsx +89 -0
- package/client/src/components/line-items/geofencing/LocationCsvUploadDrawer.tsx +100 -0
- package/client/src/components/line-items/geofencing/POIDropdown.tsx +379 -0
- package/client/src/components/line-items/geofencing/SelectedLocationsSidebar.tsx +436 -0
- package/client/src/components/line-items/geofencing/ViewFileLocationDrawer.tsx +199 -0
- package/client/src/components/line-items/geofencing/components/ExistingFilesTab.tsx +268 -0
- package/client/src/components/line-items/geofencing/components/TemplateDownloadSection.tsx +59 -0
- package/client/src/components/line-items/geofencing/components/UploadTab.tsx +215 -0
- package/client/src/components/line-items/geofencing-map.tsx +1270 -0
- package/client/src/components/line-items/inventory-availability-section.tsx +178 -0
- package/client/src/components/line-items/line-item-schedule-manager.tsx +313 -0
- package/client/src/components/line-items/manual-inventory-drawer.tsx +346 -0
- package/client/src/components/line-items/planner-inventory-card.tsx +495 -0
- package/client/src/components/line-items/planner-schedule-grid.tsx +495 -0
- package/client/src/components/line-items/schedule-rule-editor.tsx +649 -0
- package/client/src/components/line-items/schedule-rule-types.ts +122 -0
- package/client/src/components/line-items/steps/creatives-step.tsx +681 -0
- package/client/src/components/line-items/steps/inventory-schedule-step.tsx +1596 -0
- package/client/src/components/line-items/steps/inventory-step.tsx +1533 -0
- package/client/src/components/line-items/steps/line-item-details-step.tsx +916 -0
- package/client/src/components/line-items/steps/schedule-step.tsx +273 -0
- package/client/src/components/line-items/steps/summary-step.tsx +680 -0
- package/client/src/components/line-items/steps/targeting-step.tsx +1708 -0
- package/client/src/components/product-switcher.tsx +105 -0
- package/client/src/components/protected-route.tsx +49 -0
- package/client/src/components/skip-link.tsx +22 -0
- package/client/src/components/stat-card.tsx +53 -0
- package/client/src/components/status-badge.tsx +96 -0
- package/client/src/components/ui/hierarchical-venue-selector.tsx +389 -0
- package/client/src/components/ui/toaster.tsx +111 -0
- package/client/src/contexts/auth-context.tsx +181 -0
- package/client/src/contexts/sidebar-state.tsx +50 -0
- package/client/src/contexts/theme-context.tsx +66 -0
- package/client/src/data/campaign-data.json +107 -0
- package/client/src/data/countries.json +22 -0
- package/client/src/hooks/use-approval.ts +366 -0
- package/client/src/hooks/use-keyboard-shortcuts.ts +74 -0
- package/client/src/hooks/use-media-query.ts +46 -0
- package/client/src/hooks/use-mobile.tsx +19 -0
- package/client/src/hooks/use-page-title.ts +21 -0
- package/client/src/hooks/use-toast.ts +195 -0
- package/client/src/index.css +694 -0
- package/client/src/lib/__tests__/accessibility.test.ts +104 -0
- package/client/src/lib/__tests__/date-utils.test.ts +199 -0
- package/client/src/lib/__tests__/dsp-buyer-api.test.ts +127 -0
- package/client/src/lib/__tests__/dsp-buyer-integration.test.ts +247 -0
- package/client/src/lib/__tests__/storage-utils.test.ts +167 -0
- package/client/src/lib/__tests__/utils.test.ts +57 -0
- package/client/src/lib/accessibility.ts +141 -0
- package/client/src/lib/api-config.ts +9 -0
- package/client/src/lib/auth-service.ts +209 -0
- package/client/src/lib/campaign-creative-api.ts +82 -0
- package/client/src/lib/company-api.ts +61 -0
- package/client/src/lib/content-hub-api.ts +407 -0
- package/client/src/lib/creative-mapper.ts +61 -0
- package/client/src/lib/date-utils.ts +119 -0
- package/client/src/lib/deal-helpers.ts +220 -0
- package/client/src/lib/dsp-buyer-api.ts +196 -0
- package/client/src/lib/geo-import-api.ts +151 -0
- package/client/src/lib/google-poi-api.ts +305 -0
- package/client/src/lib/i18n/__tests__/formatting.test.ts +202 -0
- package/client/src/lib/i18n/formatting.ts +130 -0
- package/client/src/lib/i18n/index.ts +8 -0
- package/client/src/lib/i18n-compat.ts +76 -0
- package/client/src/lib/influence-deals-api.ts +896 -0
- package/client/src/lib/inventory-api.ts +399 -0
- package/client/src/lib/oauth-service.ts +678 -0
- package/client/src/lib/poi-types.ts +75 -0
- package/client/src/lib/queryClient.ts +144 -0
- package/client/src/lib/recommendation-api.ts +380 -0
- package/client/src/lib/storage-utils.ts +104 -0
- package/client/src/lib/tolgee.ts +85 -0
- package/client/src/lib/utils.ts +0 -0
- package/client/src/main.tsx +67 -0
- package/client/src/mapbox-draw-modes.d.ts +32 -0
- package/client/src/pages/all-folders.tsx +203 -0
- package/client/src/pages/auth-callback.tsx +115 -0
- package/client/src/pages/buyer-form.tsx +339 -0
- package/client/src/pages/buyer-list.tsx +622 -0
- package/client/src/pages/content-hub.tsx +1358 -0
- package/client/src/pages/create-deal.tsx +2093 -0
- package/client/src/pages/creative-assignment-page.tsx +548 -0
- package/client/src/pages/creatives.tsx +5 -0
- package/client/src/pages/custom-pois.tsx +425 -0
- package/client/src/pages/dashboard.tsx +615 -0
- package/client/src/pages/deal-history.tsx +434 -0
- package/client/src/pages/deal-line-items.tsx +1703 -0
- package/client/src/pages/demo-status.tsx +113 -0
- package/client/src/pages/direct-campaign-details.tsx +361 -0
- package/client/src/pages/direct-campaigns-new.tsx +824 -0
- package/client/src/pages/dsp-form.tsx +803 -0
- package/client/src/pages/dsp-list.tsx +239 -0
- package/client/src/pages/folder-content.tsx +336 -0
- package/client/src/pages/integrations.tsx +429 -0
- package/client/src/pages/line-item-creatives.tsx +789 -0
- package/client/src/pages/line-item-detail-page.tsx +684 -0
- package/client/src/pages/line-item-form-page.tsx +3261 -0
- package/client/src/pages/line-item-wizard.tsx +1207 -0
- package/client/src/pages/login.tsx +154 -0
- package/client/src/pages/not-found.tsx +23 -0
- package/client/src/pages/proof-of-play.tsx +397 -0
- package/client/src/pages/public-approval.tsx +551 -0
- package/client/src/pages/reports.tsx +231 -0
- package/client/src/pages/settings.tsx +760 -0
- package/client/src/pages/signals.tsx +389 -0
- package/client/src/pages/tags.tsx +318 -0
- package/client/src/pages/test-results.tsx +328 -0
- package/client/src/store/hooks.ts +5 -0
- package/client/src/store/index.ts +15 -0
- package/client/src/store/mapMarkerLocationsSlice.ts +241 -0
- package/client/src/styles/design-tokens.css +324 -0
- package/client/src/test/setup.ts +261 -0
- package/client/src/test/test-utils.tsx +40 -0
- package/client/src/types/approval.ts +221 -0
- package/client/src/types/content-hub.ts +209 -0
- package/client/src/types/geofencing.ts +67 -0
- package/client/src/types/transcoding.ts +140 -0
- package/client/src/vite-env.d.ts +18 -0
- package/components.json +20 -0
- package/creative-api.json +1 -0
- package/docs/AI_REFERENCE.md +459 -0
- package/docs/MWDesign-Prompt.md +132 -0
- package/docs/MWDesign-System.md +344 -0
- package/docs/test-plan.md +277 -0
- package/e2e/AUTONOMOUS-TESTING.md +406 -0
- package/e2e/README.md +219 -0
- package/e2e/autonomous-flow.spec.ts +308 -0
- package/e2e/debug-sso.spec.ts +163 -0
- package/e2e/direct-campaigns.spec.ts +219 -0
- package/e2e/explore-sso.spec.ts +149 -0
- package/e2e/fixtures/auth.ts +26 -0
- package/e2e/fixtures/enhanced-test.ts +331 -0
- package/e2e/pagination.spec.ts +280 -0
- package/e2e/view-toggle.spec.ts +312 -0
- package/generated-icon.png +0 -0
- package/i18next-scanner.config.cjs +46 -0
- package/package.json +141 -0
- package/playwright.config.ts +93 -0
- package/postcss.config.js +6 -0
- package/replit.md +196 -0
- package/screenshot-after-login.png +0 -0
- package/screenshot-contenthub-grid.png +0 -0
- package/screenshot-contenthub-list-fixed.png +0 -0
- package/screenshot-contenthub-list.png +0 -0
- package/screenshot-create-deal.png +0 -0
- package/screenshot-dashboard.png +0 -0
- package/screenshot-deals.png +0 -0
- package/screenshot-login-filled.png +0 -0
- package/screenshot-login.png +0 -0
- package/screenshot.mjs +24 -0
- package/scripts/deploy-stg.sh +185 -0
- package/shared/direct-io-schema.ts +383 -0
- package/shared/schema.ts +439 -0
- package/shared/screen-types.ts +149 -0
- package/springdocDefault.json +1 -0
- package/swagger-ui-bundle.js +2 -0
- package/swagger-ui-init.js +10316 -0
- package/tailwind.config.ts +282 -0
- package/terraform/README.md +306 -0
- package/terraform/cloudfront.tf +289 -0
- package/terraform/ecs.tf +727 -0
- package/terraform/environments/dev.tfvars +59 -0
- package/terraform/environments/production.tfvars +60 -0
- package/terraform/main.tf +47 -0
- package/terraform/outputs.tf +145 -0
- package/terraform/s3.tf +192 -0
- package/terraform/variables.tf +226 -0
- package/terraform/waf.tf +165 -0
- package/terraform-frontend/.terraform.lock.hcl +25 -0
- package/terraform-frontend/README.md +85 -0
- package/terraform-frontend/cloudfront.tf +125 -0
- package/terraform-frontend/main.tf +31 -0
- package/terraform-frontend/outputs.tf +24 -0
- package/terraform-frontend/terraform.tfvars +12 -0
- package/terraform-frontend/variables.tf +53 -0
- package/tsconfig.json +23 -0
- package/vite.config.ts +226 -0
- 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
|