Skip to main content
App Broadcasting lets Custom Apps on the same Domo page send each other named messages in real time. One app publishes a message to a channel; every other app that subscribes to that channel receives it. Apps never talk to each other directly — the Domo page (the host) sits in the middle and routes every message.
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 postMessage traffic.
  • 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.
Conventions:
  • Use a namespace:event name (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:
  • sourceAppId identifies 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 different sourceAppId values.
  • timestamp is assigned by the host when it routes the message.

Declaring channels

Apps declare the channels they use in manifest.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.
See The Manifest File for the full schema.

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:
This keeps late-mounting apps in sync without relying on any retained state.

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

Publishermanifest.json:
Publisherapp.js:
Subscribermanifest.json:
Subscriberapp.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