HTML Creative Technical Specifications
For production agencies delivering HTML5 creative content to Bauer Media Outdoor digital out-of-home platforms.
1. Overview
When creating HTML creative content for Bauer Media Outdoor panels, the guidelines in this document must be followed to ensure compatibility and correct playback across all supported screen environments.
HTML5 creatives are delivered to Bauer Media Outdoor digital panels running the BroadSign Player. Two delivery types are supported:
| Delivery Type | Description |
|---|---|
| HTML Package | A .zip archive containing all assets.
index.html must be at the root of the archive. |
| Web Redirect (URL) | A hosted URL served over HTTPS. Requires Service Worker caching (see §8 Service Workers). |
Both types run in an embedded Chromium browser within the BroadSign
Player. The player pre-loads content before playback begins. All
animations and video must remain paused until
BroadSignPlay() is called by the player.
2. Package Structure
For HTML Package deliveries, the ZIP archive must conform to the following requirements:
index.htmlmust be located at the root of the ZIP — not inside a subdirectory.- All asset references within the creative must use relative paths.
- The archive should not contain hidden system files
(
.DS_Store,__MACOSX/).
Valid structure:
creative.zip
├── index.html
├── css/
│ └── style.css
├── js/
│ └── main.js
└── assets/
├── background.mp4
└── logo.png
Invalid structure (index.html not at root):
creative.zip
└── creative_folder/
├── index.html
└── ...
3. Required Methods
3.1 Paused at Start
To prevent missing elements at playback, content is pre-loaded before being displayed. This means all necessary files are downloaded in the background a few seconds ahead of time.
All video elements and animations must be paused by
default, even after the content is completely loaded. The
player will trigger playback at the correct moment via
BroadSignPlay().
Do not include the autoplay attribute
on <video> elements:
<video width="1080" height="1920" muted>
<source src="myProduct.mp4" type="video/mp4">
<source src="myProduct.ogv" type="video/ogg">
</video>
3.2 BroadSignPlay()
The player calls BroadSignPlay() as soon as the content
is displayed on screen. This function must be:
- Defined at the global (root) level
- Named exactly
BroadSignPlay— it is case-sensitive - The single entry point for starting animations, video playback, and timer-based logic
Data retrieval and preparation can happen before
BroadSignPlay() fires, but playback must not start until it
is called.
function startAnimations() {
// Initialise animations, start video playback, begin timers
}
function BroadSignPlay() {
startAnimations();
}
Note: The creative will appear non-functional when opened in a regular browser, because
BroadSignPlay()is never called automatically. This is expected behaviour. You can trigger it manually in the browser developer console by runningBroadSignPlay();
Warning: The creative must not call
BroadSignPlay()itself. The player is responsible for calling it at the correct moment. Self-invocation during pre-load will cause premature playback.
3.3 Testing Parameters
To allow thorough testing across all content variations, query parameters should be used to simulate dynamic conditions without requiring live data feeds.
const params = new URLSearchParams(window.location.search);
const temperature = params.get('temp');
if (parseInt(temperature) <= 20) {
// Force result for temperatures ≤ 20°C
} else {
// Force result for temperatures > 20°C
}
Cover all variable combinations when defining test parameters. A test parameter guide must be submitted alongside all DCO campaigns (see §12.2 Dynamic Content Submissions).
4. BroadSign Context Variables
The BroadSign player injects a BroadSignObject into the
page before it loads. These variables allow the creative to
contextualise content based on the specific screen it is playing on.
4.1 Object Variables
Available from the moment the content is loaded:
for (var propertyName in BroadSignObject) {
console.log(propertyName + " = " + BroadSignObject[propertyName]);
}
| Variable | Description | Availability |
|---|---|---|
frame_id |
Unique ID of the frame displaying the content | Always |
ad_copy_id |
ID of the ad copy | Always |
campaign_id |
ID of the campaign | Always |
player_id |
ID of the BroadSign player (PC) | Always |
display_unit_id |
ID of the display unit | Always |
display_unit_resolution |
Resolution of the display unit | Always |
frame_resolution |
Resolution of the specific frame | Always |
expected_slot_duration_ms |
Duration of the ad slot in milliseconds | Always |
display_unit_lat_long |
Latitude/longitude of the screen | Location-dependent (*) |
display_unit_address |
Physical address of the screen | Location-dependent (*) |
(*) Not available at all locations.
Example values:
frame_id = 878538496
ad_copy_id = 793583571
campaign_id = 965419085
player_id = 793618615
display_unit_id = 619875851
display_unit_resolution = 1080x1920
frame_resolution = 1024x1280
expected_slot_duration_ms = 300000
display_unit_lat_long = 51.5074,-0.1278
display_unit_address = Oxford%20Street%2C%20London
4.2 Query Variables
For Web Redirect deliveries, the player automatically appends
location IDs as query parameters to the URL before requesting it. These
are available before BroadSignObject is
populated and are limited to location identifiers only.
| Parameter | Description |
|---|---|
resource_id |
Related to the player (PC). Used as a unique location identifier for Monitor Sync file storage. |
frame_id |
Related to the specific screen. One player can serve more than one screen. |
5. Asset and File Specifications
5.1 Scripts
Supported technologies:
- HTML
- CSS
- JavaScript
Warning: Do not use WebAssembly for any component within the creative. It is not supported on the platform.
5.2 Video
| Requirement | Specification |
|---|---|
| Formats | MP4, OGV, WEBM |
| Frame rate | 25 fps |
| Recommended bitrate | ~2 MB/s |
| Audio | No audio — encode without an audio track |
| Codec | H.264 (for MP4) is recommended for broadest compatibility |
5.3 Images
| Requirement | Specification |
|---|---|
| Formats | JPEG, PNG, SVG, GIF |
| Resolution | 72 ppi |
| Maximum size | ~2 MB per 1 megapixel (1,000 × 1,000 px) |
| Colour depth | 16-bit |
5.4 Prohibited and Restricted Technologies
| Technology / Feature | Reason |
|---|---|
<iframe> |
Causes transparency and opacity rendering issues on DOOH hardware. Do not use. |
| WebAssembly | Not supported on the platform. |
autoplay on <video> |
Video must remain paused until BroadSignPlay() is
called. |
CSS @layer (Cascade Layers) |
Silently discarded by the BroadSign Player's Chromium engine — all rules within the layer are dropped entirely. Do not use. See §6.2. |
CSS @container (Container Queries) |
Not supported by the BroadSign Player's Chromium engine — container-based responsive logic is silently ignored. Do not use. See §6.2. |
| Broken or unresolvable asset references | All assets referenced in the creative must be reachable and return HTTP 200. Any reference returning a 4xx or 5xx response will result in the creative not displaying as intended. |
5.5 JavaScript DOM Access
For creatives that build content dynamically from a data feed — for
example, populating copy or images from the result of a
fetch() call — the method used to query DOM elements
matters.
querySelectorAll() returns a static
NodeList: a snapshot of elements matching the selector at the
moment of calling. If elements are added to the DOM after that point,
they will not be included. In a DCO creative, calling
querySelectorAll() before dynamic content is built will
return an empty or incomplete list, causing copy or assets to be
silently missing on-panel. The BroadSign Player will log a warning when
this occurs.
getElementsByClassName() and
getElementsByTagName() return a live
HTMLCollection that automatically reflects changes
to the DOM. They are the safer choice when querying elements that may
not yet exist at call time.
// Avoid in dynamic contexts — NodeList is a static snapshot
const items = document.querySelectorAll('.dynamic-item');
// Preferred for dynamic content — live collection updates as elements are added
const items = document.getElementsByClassName('dynamic-item');
For single-element access, getElementById() and
querySelector() are safe provided they are called after the
target element exists in the DOM.
6. Browser Compatibility
6.1 Chromium Version
BroadSign players run on an older, fixed-version embedded Chromium browser — not an evergreen, auto-updating browser like a desktop install. The exact build is not published in this document; contact your Bauer Media Outdoor account or technical contact for the specific version if you need it for build tooling (e.g. Browserslist/autoprefixer targets).
Note: Some players run on older hardware with an even earlier Chromium build. Treat the feature-support tables in §6.2 and §6.3 as binding regardless of which generation of hardware a campaign targets — if in doubt, confirm with your Bauer Media Outdoor contact.
Use the Chromium release history and Can I Use to cross-check individual feature support once you have a confirmed target version.
6.2 CSS: Breaking Incompatibilities
The following CSS features are silently discarded by the BroadSign Player's Chromium engine. They will cause content to render incorrectly or break entirely without any error being thrown. Do not use these features.
| Feature | Introduced in Chromium | Impact |
|---|---|---|
@layer (CSS Cascade Layers) |
Chromium 99 | All rules within a @layer block are silently discarded.
Any framework that outputs @layer internally will be
completely non-functional. |
@container (Container Queries) |
Chromium 105 | Container-based responsive logic is silently ignored. |
Tailwind CSS v4 warning: Tailwind v4 uses
@layerinternally for all utility classes. If you build with Tailwind v4, none of your styles will render on the player. Use Tailwind v3 or lower. Alternatively, configure your build to output flat, layer-free CSS.
6.3 CSS: Warnings
The following features are not supported by the BroadSign Player's Chromium engine. They will be silently ignored. Content will not break if suitable fallbacks are present, but the feature itself will not apply.
| Feature | Introduced in Chromium | Fallback |
|---|---|---|
oklch() / oklab() colour functions |
Chromium 111 | Use rgb(), rgba(), or hex values. |
Range media query syntax (width >= 1080px) |
Chromium 104 | Use legacy format: (min-width: 1080px). |
color-mix() |
Chromium 111 | Pre-compute the colour at build time. |
6.4 Third-Party Libraries and Platform SDKs
The creative review tool detects third-party libraries and platform SDKs when present in a submitted creative. None have been formally tested on Bauer Media Outdoor panels. Any creative containing a third-party library or SDK requires additional user acceptance testing (UAT) before it can be approved for campaign use. Confirm UAT requirements with Bauer Media Outdoor before build, and avoid using any of these unless strictly necessary.
Creative and Animation Libraries
The following libraries are used for animation, rendering, and UI logic directly within HTML5 creatives. They have clear DOOH use cases and are compatible with the BroadSign Player's Chromium engine at an API level.
| Library | Usage |
|---|---|
| GSAP (GreenSock) | Animation |
| CreateJS / EaselJS | Canvas-based animation |
| Three.js | 3D / WebGL rendering |
| Lottie / Bodymovin | JSON-driven animation |
| PixiJS | 2D WebGL rendering |
| jQuery | DOM manipulation |
Performance note: Avoid loading these libraries unless strictly necessary. Each additional library increases load time and data consumption. On DOOH panels, any time spent loading is time not spent displaying. jQuery in particular should be avoided for simple DOM operations — use native ES6 instead.
Creative Management Platform (CMP) SDKs
The following SDKs are from ad-serving and creative management platforms primarily designed for web programmatic advertising. Their presence in a creative typically indicates the package was exported from or built with a web-focused CMP.
| SDK | Primary Context | DOOH Consideration |
|---|---|---|
| BannerFlow | HTML5 CMP | Has a DOOH export path, but web tracking calls may still be present in the output |
| Google Studio (Enabler) | Web programmatic display | Optimised for web — click tracking, impression beacons and exit events are non-functional in DOOH |
| Sizmek | Web programmatic display | Optimised for web — tracking features non-functional in DOOH |
| Flashtalking | Web/programmatic creative | Optimised for web — tracking features non-functional in DOOH |
| Celtra | Mobile/display CMP | Optimised for mobile and display — not designed for DOOH |
Warning: CMP SDK features including click tracking, impression beacons, exit events, and viewability measurement are non-functional in a BroadSign DOOH context. These SDKs may fire outbound HTTP requests on load that serve no purpose on-panel and count against the campaign's 0.5 MB/slot data budget. If a creative has been adapted from a web campaign, strip unused SDK code before delivery.
7. Data Consumption and Network
7.1 Data Budget
A dynamic (DCO) campaign should consume an average of 0.5 MB per displayed slot over a 24-hour period. Exceeding this budget may result in the campaign being paused pending review.
7.2 Reducing Data Usage
- Do not use cache-busters on static assets. Cache-busters force re-downloads on every play.
- Compress all video and image files before delivery.
- Minimise the number of individual network requests.
- Do not load external fonts, stylesheets, or scripts from third-party CDNs at runtime.
- Do not embed ad network tracking pixels or analytics scripts.
7.3 HTTP Caching Headers
For assets hosted externally, configure the server to return the following headers:
Cache-Control: public, max-age=31536000
Accept-Ranges: none
Disabling byte-range requests (Accept-Ranges: none)
prevents partial-content re-requests that can increase traffic
unexpectedly.
8. Service Workers
Applies to Web Redirect (URL) deliveries only.
Web Redirect creatives must implement a Service Worker to cache static assets locally on the player. This prevents the player from re-downloading all assets on every ad play, which would violate the data budget and cause visible load delays.
Service Workers require an HTTPS connection. They
will not function over plain http:// in local development
without additional browser flags.
See also: BroadSign: Web Redirect Ad Copies
8.1 Service Worker Script
Create a file named sw.js at the root of your hosted
creative path. The following example caches all assets in the
campaigns/creative/ directory:
const cacheName = "static-v1";
const filesToCache = [
"/campaigns/creative/",
"/campaigns/creative/index.html",
"/campaigns/creative/css/style.css",
"/campaigns/creative/js/main.js",
"/campaigns/creative/vid/fallback.mp4",
];
self.addEventListener("install", (event) => {
event.waitUntil(
caches.open(cacheName).then((cache) => {
return cache.addAll(filesToCache);
})
);
});
self.addEventListener("fetch", (event) => {
event.respondWith(
caches.match(event.request).then((cachedResponse) => {
if (cachedResponse) {
return cachedResponse;
}
return fetch(event.request).then((networkResponse) => {
if (networkResponse.ok) {
const responseClone = networkResponse.clone();
caches.open(cacheName).then((cache) => {
cache.put(event.request, responseClone);
});
}
return networkResponse;
});
})
);
});
8.2 Registering the Service Worker
Registration should be triggered after the page content has fully loaded to avoid blocking the initial render:
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register("/campaigns/creative/sw.js")
.then(() => console.log("Service worker registered!"))
.catch((err) => console.error("Service worker registration failed:", err));
}
8.3 Clearing the Cache
If a critical update requires forcing a full cache clear on-panel, the following pattern can be used. Use this sparingly — a forced cache clear triggers a full asset re-download across all live panels, significantly increasing data traffic.
navigator.serviceWorker.getRegistration("/campaigns/creative/sw.js").then((registration) => {
registration?.unregister().then(function () {
caches.keys().then(function (cacheNames) {
return Promise.all(
cacheNames.map(function (cacheName) {
return caches.delete(cacheName);
})
);
});
}).catch(function (error) {
console.error("Error unregistering service worker:", error);
});
});
Warning: Do not use the Workbox library for caching video assets. Compatibility on DOOH players cannot be guaranteed.
9. Dynamic Content Synchronization (Monitor Sync)
Applies to HTML Package deliveries only.
The Monitor Sync feature allows assets to be updated after a campaign has gone live without re-delivering the entire creative package. BroadSign runs scheduled sync jobs independently of content playback. Changed files are fetched from a remote source and stored locally on the player.
See also: BroadSign: Monitor Sync
9.1 Referencing Synced Assets
Synced assets are stored in a local directory on the player. To reference them in your creative, prefix the file path as follows:
- Linux players:
../../bsp/sync/{destination_path}/ - Windows players:
../../sync/{destination_path}/
For example, if the destination path is
campaign/creative, a reference to
img/photo.jpg becomes:
<!-- Linux player path -->
<img src="../../bsp/sync/campaign/creative/img/photo.jpg">
<!-- Windows player path -->
<img src="../../sync/campaign/creative/img/photo.jpg">
9.2 FTP Synchronization
To use FTP sync, provide the following details to Bauer Media Outdoor:
| Field | Description |
|---|---|
| Source root path | The remote FTP directory containing the changing assets |
| FTP host | The FTP server hostname |
| Username | Required if authentication is enabled |
| Target folder | The local destination path on the player |
9.3 HTTP Synchronization
To use HTTP sync, provide a JSON manifest hosted at a stable URL. The manifest must list all changing assets with their last-modified timestamps and MD5 checksums, which BroadSign uses to detect changes:
{
"metadata": {
"version": 1,
"utc_generation_time_ms": 1709720220000
},
"files": [
{
"url": "https://www.server.example/campaigns/creative/vid/video.mp4",
"utc_last_modified_time_ms": 1709720220000,
"md5": "938c2cc0dcc05f2b68c4287040cfcf71",
"local_path": "video.mp4"
},
{
"url": "https://www.server.example/campaigns/creative/img/photo.png",
"utc_last_modified_time_ms": 1709810450000,
"md5": "298a8ca0gee13d8a92g9276419bdbd83",
"local_path": "photo.png"
}
]
}
By default, sync runs every hour. A reduced frequency can be requested from Bauer Media Outdoor.
10. Custom Proof of Play
Custom Proof of Play (Custom PoP) logs each playback event with additional context data specific to the creative variation that was displayed. PoP is enabled on a per-campaign basis — confirm with Bauer Media Outdoor whether Custom PoP is required before implementing it in your creative.
As of BroadSign Player (BSP) 15.13.8, there are two
supported ways to attach Custom PoP data: the WebSocket method described
in §10.1–§10.4 below, and the newer
BroadSignObject.setCustomPopData() method described in
§10.5. Both remain supported by BroadSign — see §10.7 if a creative
needs to call both.
The PoP is recorded by the BroadSign player via a WebSocket
connection on ws://localhost:2326.
See also: BroadSign: Custom PoP Action
10.1 Implementation
The PoP message must be sent from inside
BroadSignPlay() so that it fires at the moment the
creative is shown on screen — not during pre-load.
function BroadSignPlay() {
// Start playback
document.getElementById("video").play();
// Send Custom PoP
if (typeof BroadSignObject !== "undefined") {
const frameId = BroadSignObject["frame_id"];
const contentId = BroadSignObject["ad_copy_id"];
const payload = {
rc: {
version: "1",
id: "1",
action: "custom_pop",
frame_id: frameId,
content_id: contentId,
external_value_1: currentWeather, // String, max 255 chars
external_value_2: displayedContent, // String, max 255 chars
custom_field: JSON.stringify({ // Must be a valid JSON string
description: "CustomPoP"
}),
name: "CPoP" // String, max 255 chars
}
};
const ws = new WebSocket("ws://localhost:2326");
ws.onopen = function () {
ws.send(JSON.stringify(payload));
};
ws.onmessage = function (event) {
const response = JSON.parse(event.data);
if (response.rc.status === 1) {
// PoP successfully registered
}
};
}
}
UK Dynamo: UK Adshel Live / Billboard Live campaigns must use the standardized
thirdpartycreativeref/creativetriggereventkeys insidecustom_fieldrather than free-form key names — see the UK Dynamo Creative Technical Specifications doc for more info.
10.2 Payload Specification
| Field | Required | Type | Constraint |
|---|---|---|---|
version |
Yes | String | Must be "1" |
id |
Yes | String | Must be "1" |
action |
Yes | String | Must be "custom_pop" |
frame_id |
Yes | String | Must be read from BroadSignObject["frame_id"] at
runtime — never hardcoded |
content_id |
Yes | String | Must be read from BroadSignObject["ad_copy_id"] at
runtime — never hardcoded |
external_value_1 |
Optional | String | Max 255 chars |
external_value_2 |
Optional | String | Max 255 chars |
custom_field |
Optional | JSON string | Must be a valid serialised JSON string. Max 255 chars. |
name |
Optional | String | Max 255 chars |
Warning:
frame_idandcontent_idmust always be populated fromBroadSignObjectat runtime. Hardcoding these values will cause incorrect PoP attribution in the reporting dataset.
Warning:
custom_fieldmust be a JSON string — i.e. the result ofJSON.stringify({...}). Passing a raw object will cause a malformed payload.
10.3 Timing Requirements
PoP timing is a hard requirement. Records that fall outside these thresholds will be misattributed or dropped entirely.
| Requirement | Threshold | Consequence of failure |
|---|---|---|
| PoP must fire within | 3 seconds of BroadSignPlay() being
called |
Records may not be captured or may be attributed to the wrong slot |
| PoP must not fire after | 80% of the slot duration has elapsed | High risk of the record being attributed to the next slot |
The PoP must be sent from within BroadSignPlay(), not
from a window.onload, DOMContentLoaded, or any
other handler that fires independently of when the creative is
displayed.
10.4 Validation Checklist
Before submitting a creative that implements Custom PoP, verify all of the following:
10.5
setCustomPopData() Method — New in BSP 15.13.8
Rollout status: Bauer Media Outdoor's inventory has not yet been updated to BSP 15.13.8. Each business unit will roll out this version independently and will notify partners when it becomes available on their estate. Do not assume
setCustomPopData()is usable on a given panel until BMO has confirmed the rollout for that business unit — continue relying on the WebSocket method (§10.1) until then.
BroadSign Player (BSP) 15.13.8 added setCustomPopData()
to BroadSignObject as an alternative to the WebSocket
method above. It is bound to the specific playback item instance rather
than a content ID, which removes the prebuffering timing bug that could
associate WebSocket-based extra data with the wrong ad copy.
setTimeout(() => {
if (typeof BroadSignObject !== "undefined") {
// Note: you cannot use the key `extra_data_source` — Broadsign overwrites it
// with an internal value used to identify the source of the PoP data.
var result = BroadSignObject.setCustomPopData(JSON.stringify({
creative: "foo",
trigger: "bar",
}));
if (result) {
console.log("UberAd: Sending Pop Success");
} else {
console.log("UberAd: Sending PopFailed");
}
}
}, 2000); // add 2s delay to make sure BroadSignObject should be ready when called.
Warning:
setCustomPopData()can returnfalseif called before its underlying connection is ready — this typically only happens if it's the first thing called in the creative's script. Implement retry logic rather than treating a singlefalseas a permanent failure.
Data shape differs from the WebSocket method
The WebSocket method nests your data inside a
custom_field string (see §10.2).
setCustomPopData() instead merges the JSON document you
pass directly into the PoP's extra data — there is no
custom_field wrapper:
| Method | Resulting extra data |
|---|---|
WebSocket (custom_field) |
{ "custom_field": "{\"creative\":\"img1_sunny\",\"trigger\":\"london_sunny\"}" } |
setCustomPopData() |
{ "creative": "img1_sunny", "trigger": "london_sunny", "extra_data_source": "broadsign_object" } |
Broadsign automatically adds an extra_data_source field
with the value "broadsign_object" to any record populated
this way, so the two methods can be told apart in reporting. This key is
reserved — see §10.6 — and cannot be set or overridden by the
creative.
The top-level keys you pass are restricted (§10.6), but the values can be any valid JSON, including nested objects and arrays:
// Valid — "meta" is a top-level key; its value can be any JSON shape
BroadSignObject.setCustomPopData(JSON.stringify({
creative: "img1_sunny",
meta: { weather: "sunny", tempC: 24, tags: ["promo", "summer"] }
}));
UK Dynamo: the same standardized
thirdpartycreativeref/creativetriggereventkeys required for the WebSocket method also apply here oncesetCustomPopData()is rolled out — see the UK Dynamo Creative Technical Specifications doc for more info.
10.6 Reserved Extra Data Keys
The following keys are reserved by Broadsign for internal PoP fields and cannot be written to via either Custom PoP method. Any of these keys present in submitted data will be stripped or overwritten internally:
publish_message_id
publish_message_name
publish_message_url
service_name
service_stat_id
stat_id
ad_unit_uuid
reach_file_name
reach_is_triggered
reach_ad_id
reach_ad_pop_url
reach_creative_url
reach_publisher_category
contract_id
main_html_file_path
publish_message_checksum
Publish_message_mime
extra_data_source
Custom PoP data is only injected into a record if it is under 1KB after all reserved keys have been removed — the same size limit that has always applied to extra data in POP records.
10.7 Using Both Methods Together (Precedence Rules)
If a creative (or a set of creatives across a campaign) calls both
the WebSocket method and setCustomPopData(), the following
precedence applies in the resulting PoP record:
- Keys set via
setCustomPopData()always take precedence and are never overwritten by the WebSocket method, regardless of which method ran first or last. - Keys that don't overlap between the two methods can both appear in the same record — unless a key is on the reserved list (§10.6), in which case it's stripped/overwritten by Broadsign internally either way.
Recommendation: Prefer a single method per creative/campaign to avoid ambiguity in reporting. If both must run temporarily during a migration, do not rely on the WebSocket method to set or update any key already owned by
setCustomPopData()— those writes will have no effect on the final record.
11. Responsive Content
When a creative is designed to adapt automatically to multiple screen formats, the following must be provided alongside the delivery:
- A written description of all supported resolutions.
- Screenshots or renders showing the expected output at each resolution.
- Confirmation of the adaptation mechanism (CSS viewport units, JavaScript resize logic, etc.).
This applies to all formats — including conventional portrait (9:16) and landscape (16:9) — if the creative is intended to adapt between them automatically.
12. Delivery Requirements
12.1 Material Deadline
| Agency type | Deadline |
|---|---|
| Standard | Minimum 10 working days before campaign start |
| Certified DCO/creative vendor | Minimum 5 working days before campaign start |
Note: Certified vendor status is granted to DCO platforms and creative tools that have been pre-tested for compatibility on Bauer Media Outdoor infrastructure. Confirm with Bauer Media Outdoor whether your platform or toolchain holds certified status before assuming the reduced deadline applies.
12.2 Dynamic Content Submissions
All DCO campaigns must be submitted with the following documentation:
- A content matrix mapping every creative variation to its trigger conditions (see example below).
- A scenario description explaining how the creative behaves under each condition.
- A test parameter guide listing all query parameters that can be used to force each variation during review.
Example content matrix:
| Tag | Asset | Trigger Condition |
|---|---|---|
img1 |
day_hot.jpg |
Time: day, Temperature: ≥ 25°C |
img2 |
day_cold.jpg |
Time: day, Temperature: < 25°C |
img3 |
night_hot.jpg |
Time: night, Temperature: ≥ 25°C |
img4 |
night_cold.jpg |
Time: night, Temperature: < 25°C |
This documentation is required for Bauer Media Outdoor to verify that PoP logs correctly reflect what is displayed on screen.
12.3 Responsive Content Submissions
Include reference screenshots at each supported resolution. Explicitly state which formats the creative is confirmed to support.
Further Reading