Getting started
What is Rundown Studio?Create an accountRundown
Rundown basicsColumnsTemplatesSettingsGaps and overlapsTrashCell historyMentionsText variablesRunning a showImport CSV rundownEvent
Event basicsSharing eventsAPI
Getting startedAPI reference ↗Build a rundown from CSVWorking with cell contentLive updates over SSEAdvanced usageError referenceMigrating from v0API v0 (deprecated)Integrations
Companion ModuleBitfocus ButtonsOBS StudioOnTheAir VideoProPresenterQLabSharing and outputs
Read-only rundownEditable rundownQuick access codeOutputPrompterPDF exportCSV exportAccount
Your teamSubscription and invoicesUpdates
ChangelogOBS Studio
Switch OBS scenes straight from your rundown.
OBS Studio is the free, open-source standard for streaming and recording. It has an official Bitfocus Companion module, and so does Rundown Studio, so Companion can sit between the two: your rundown says which scene belongs to a cue, and Companion tells OBS to switch to it.
The result is one action for the operator. Move to the next cue in Rundown Studio and OBS lands on the right scene, with nobody hunting through a scene list mid-show.

How it works
The two modules divide the job between them:
- You add a SCENE column to your rundown. In each cue, the cell holds the name of the OBS scene that cue should be on.
- The Rundown Studio module publishes that cell as a Companion variable for whichever cue is currently active.
- A Companion trigger watches that variable. When it changes, it tells OBS to switch to the scene with that name.
Because the trigger keys off the active cue, the rundown is the single source of truth. Rearrange your running order or swap a scene name in the rundown and OBS follows, with no button remapping.
Before you start
You’ll need:
- Companion running on a machine that can reach the computer running OBS.
- OBS Studio 28 or later. The obs-websocket server the module uses is built in from version 28 onwards, so there’s no plugin to install.
- Your Rundown Studio API token and rundown ID.
1. Turn on the OBS WebSocket server
In OBS, go to Tools → WebSocket Server Settings and tick Enable WebSocket server under Plugin Settings.

Further down the same window, Server Settings holds the Server Port - 4455 by default - and the password. Click Show Connect Info to reveal it, and keep the window open: you’ll paste both into Companion in a moment.
Leave authentication enabled if OBS is on a shared network. On a closed show network you can untick Enable Authentication to save a step, but anyone who can reach the machine can then drive your OBS.
2. Set up the SCENE column
In your rundown, add a column named SCENE. See Columns if you haven’t added one before.
In every cue, put the name of the OBS scene that cue should be on. The name has to match the scene in OBS exactly - same spelling, same capitalisation, no stray spaces. Leave the cell empty on cues that shouldn’t change the scene.

Tip: The column has to be public for the module to publish it as a variable, and the name is what the variable is built from. A column called
SCENEbecomes$(rundown-studio:currentcue_scene).
3. Add the Rundown Studio module
In Companion, open Connections and add the Rundown Studio module, then give it your API Token and Rundown ID.
API tokens are generated from the API section of the Rundown Studio dashboard. Only team admins can generate or regenerate a token, but anyone on the team can read and use it.

The rundown ID is in the URL of any rundown. For example, if your rundown URL is:
https://app.rundownstudio.app/rundown/pLRbtKC410HFjBVVcaT1
then the rundown ID is pLRbtKC410HFjBVVcaT1.

The full module setup is covered in Companion Module.
Check the variable
Once the connection is up, open the Variables tab and find the Rundown Studio module. You should see currentcue_scene alongside the built-in variables, described as Current Cue: SCENE and holding the SCENE cell of whichever cue is active. If it’s missing, check the column is public and the name is spelled as you expect.

This is the check worth doing before you build anything else. If the value here follows your rundown as you move between cues, the hard part is done and the trigger is a formality.
4. Add the OBS Studio module
Add the OBS: Studio module as a second connection. It needs:
- Server IP / Hostname - the address of the machine running OBS. Use
127.0.0.1if Companion is on that same machine. - Server Port -
4455unless you changed it. - Server Password - from the WebSocket settings, if authentication is on.

The Label is how this connection appears in actions and variables later. The default obs is fine, but if you’re running more than one OBS machine, name them something you’ll recognise under pressure - obs-stage, obs-stream - because that label is what you’ll be picking from a dropdown mid-build.
Once connected, the module pulls in your scenes and sources, and its variables list fills with what it can see. That list is a handy way to check the scene names you’ve typed into the SCENE column.
If the connection shows an error, check the IP address first, then the password. A blank password in Companion with authentication switched on in OBS is the most common cause.
5. Build the trigger
This is the piece that ties the two together. In Companion, go to Triggers and add a new trigger.
Event: choose Variable value changes and set it to $(rundown-studio:currentcue_scene). The trigger now fires whenever the active cue’s SCENE cell is different from the last one.
Condition: add a Variable value condition so an empty cell doesn’t fire anything. Set it to check that $(rundown-studio:currentcue_scene) is not equal to an empty value. Without this, moving onto a cue with no scene sends a switch request for a scene named nothing.
Action: on the Actions tab, add Scene - Set Program Scene from your OBS connection. Rather than picking a scene from the dropdown, click the $ button beside the Scene field to switch it to an expression, and put in $(rundown-studio:currentcue_scene).

That blue chip under the Scene label is the useful part: it previews what the variable resolves to right now. If it shows the scene name you expect, the action will fire correctly. If it’s empty or shows something odd, fix that before moving on.
The dropdown is the trap here. Picking a scene from the list hard-codes one scene and the trigger will send that same scene for every cue. The whole point is that the field holds the variable, so it changes with the rundown.
That’s the whole integration. Move to a cue in Rundown Studio, the SCENE variable updates, the trigger fires, and OBS cuts to that scene.

From here on the operator only touches the rundown. The scene list in OBS is something to glance at, not something to drive.
Preview first, then take
If you’d rather not cut straight to air, OBS Studio Mode gives you a preview step. Swap Set Program Scene for Set Preview Scene in the trigger, so moving through the rundown queues the next scene up in preview without changing what’s on air. The operator then presses a Companion button running the OBS Transition action when they’re ready.
This is worth doing on any show where the rundown might move before the picture should.
Going the other way
The same two modules work in reverse, letting OBS drive the rundown. Build a Companion button that runs the OBS Set Program Scene action and the Rundown Studio Go to next cue action together, and one press cuts the scene and moves the rundown on.
The Rundown Studio module’s own variables - $(rundown-studio:currentcue_timeleft_mmss) and the rest - sit alongside the OBS ones on the same page, so one surface shows both your running order and your stream status.
Useful extras
Some other things worth putting on the same page:
- Titles from the rundown. Add a
LOWER THIRDcolumn, then use the OBS Set Source Text action in a second trigger to push its value into a text source. Your presenter names live in the rundown and appear on screen automatically. - Start recording with the show. Add the OBS Recording action to a trigger on the Rundown Studio module’s running state, so hitting start on the rundown also rolls the record.
- Stream status on the surface. The OBS module’s streaming and recording feedbacks colour a button red when you’re live, so the director can see stream health next to the rundown timings.
- A second column. If some cues need a scene queued but not taken, add a
SCENE MODEcolumn and use its variable in a trigger condition to pick between Set Program Scene and Set Preview Scene.
Troubleshooting
If a cue doesn’t switch its scene, work down the chain:
- Is the variable right? Check
$(rundown-studio:currentcue_scene)in Companion’s Variables tab while sitting on the cue. If it’s empty or wrong, the problem is in the rundown, not Companion. - Does the scene name match? Names must match the OBS scene exactly. A trailing space or different capitalisation is enough to miss.
- Have the scenes changed? If you’ve added or renamed scenes since Companion connected, the module re-reads them automatically, but a quick disable and re-enable of the connection forces it.
- Is the connection up? Both modules should show as connected in the Connections list rather than an error state.
- Is OBS in Studio Mode? Set Program Scene cuts straight to air in either mode, but if you’re expecting a preview step you need Set Preview Scene and Studio Mode switched on.
Turning on Verbose Mode in the Rundown Studio module’s advanced config writes more detail to the debug log, which usually points straight at the problem.
Related
- Companion Module - full setup for the Rundown Studio module.
- Bitfocus Buttons - the same module running in Bitfocus Buttons.
- Columns - adding and managing columns.
- OnTheAir Video - the same trigger pattern driving video playout.