Note: App Broadcasting requires the
app-broadcasting feature switch. While it is off, publishing does nothing and no messages are delivered — the host answers each publish with a FEATURE_DISABLED notice that the SDK writes to the browser console. Contact your Domo administrator to enable it.When to use broadcasting
Broadcasting is for free-form, real-time coordination between apps — the kind of signalling that page filters and variables aren’t built for.
Choose broadcasting when you need:
- Multiple independent channels between apps (for example, selection events separate from configuration changes)
- Source identity — knowing which app instance sent each message
- A declared contract — channels named in the manifest so the app’s inputs and outputs are explicit
How it works
Every message travels iframe → host → iframe. The publishing app posts a message to the Domo page; the host validates and routes it; each subscribing app receives it. There is no direct iframe-to-iframe path. Key properties:- Host-mediated — Every message routes through the Domo page. Apps never see each other’s iframes or
postMessagetraffic. - One bus per page — A single bus is shared by all app cards on the page and is destroyed when you navigate away. There is no persistence and no cross-page messaging.
- Broker only — The host validates the channel, stamps the sender and a timestamp, enforces limits, and routes. It does not transform your payload.
- Fire-and-forget — The bus holds no history. It delivers each message to the apps subscribed at that moment and keeps nothing. An app that subscribes later sees only messages published after it joins.
- No echo — A publisher never receives its own message, even if it subscribes to the same channel.
Message flow
Core concepts
Channels
A channel is a named string that apps publish to and subscribe on.- Use a
namespace:eventname (for example,filter:region,chart:hover,config:theme). - Channel names are exact strings, compared literally.
- Names beginning with
domo:are reserved for the host and are rejected.
Messages
Each delivered message has this shape:sourceAppIdidentifies the card instance that published the message. The host assigns it — an app cannot set or fake it — so subscribers can trust it. Two copies of the same app on one page have differentsourceAppIdvalues.timestampis assigned by the host when it routes the message.
Declaring channels
Apps declare the channels they use inmanifest.json. Declarations do real work: in production, an app receives a channel only if that channel is listed under subscribes. The host subscribes each app to its declared channels when the app loads.
Limits and safety
The host enforces these on every message, in every environment:Error handling
domo.broadcast() returns immediately and never throws. If the host rejects a publish, it notifies only the sending app, and the SDK writes a warning to the browser console — it does not raise an exception or reject a promise.
Syncing current state on mount
Because the bus keeps no history, an app that mounts after a value was published won’t have it. To catch up, have the new subscriber ask for the current state and let the owner republish it:Lifecycle
1
Page loads
The bus is created for the page (empty — no subscriptions yet).
2
Apps mount
The host subscribes each app to the channels it declared under
subscribes.3
Messages flow
Apps publish and receive messages in real time through the host.
4
Page navigates
The bus is destroyed. All subscriptions are cleared; nothing is retained.
Quick start
Publisher —manifest.json:
app.js:
manifest.json:
app.js:
Broadcasting vs. variables and filters
Rule of thumb: Use variables or filters for state that should survive navigation. Use broadcasting for real-time, channel-based coordination within a single page.
Next steps
- Broadcast SDK Reference —
domo.broadcast(),domo.onBroadcast(), and the source-filtering helpers - The Manifest File — Channel declaration schema
- Cross-App Broadcasting Tutorial — Build two apps that coordinate a selection and a detail view