# Add more feedback to a button

> Stack several feedbacks on one button, show a device image or a live value, test a variable with an Expression feedback, and generate a feedback per dropdown choice.

Create your first button covers adding one feedback. This page covers the three kinds of feedback, stacking several feedbacks on the same button, showing a device's image or a live value, testing a variable's own value as a feedback, and generating a feedback per choice the same way you can with actions. Each button on this Stream Deck Studio uses one technique from this page: Before you begin A button with at least one feedback added. See Create your first button . Know which kind of feedback you have The connection module defines each of its feedbacks as one of three types, and the type decides what the feedback can do on a button: Type What it can do Where you add it Boolean On or off. When on, it applies the Button Content and Button Styling you set on it. Feedbacks tab, or as a Feedback variable that holds true or false . Advanced Any result counts as on, so your styling applies. If the result includes an image, such as a thumbnail, that image is shown on the button. Feedbacks tab only. Value Reports a value such as a level, timecode, or name. It can't change styling on its own. As a Feedback variable on the Variables tab, never on the Feedbacks tab. + Add Feedback... on the Feedbacks tab only lists boolean and advanced feedbacks, and the Feedback variable picker only lists boolean and value feedbacks. If a feedback you expect isn't in one list, look for it in the other. Stack more than one feedback A button can hold as many feedbacks as you need, each independently active or inactive, each overriding its own set of Button Content and Button Styling fields when active. This is how a single button reflects more than one piece of state at once: for example, one feedback that sets Context Background Color when a source is on preview, and a second that sets Background Color when the same source is on program, letting both states show simultaneously on a three-line layout. A lit bulb next to the feedback's name and its Preview means the feedback is active right now. Later feedbacks in the list are evaluated after earlier ones, so if two active feedbacks both target the same field, the one lower in the list wins. Show an image from the device Some advanced feedbacks return an image, such as an ATEM's media pool still or a media server's clip thumbnail. Add one like any other feedback: On the button's Feedbacks tab, select + Add Feedback... and choose the feedback, for example the ATEM Media pool: Preview image feedback. Set the feedback's options, such as which media pool slot to show under Source . Crop and Position set how the image fits the button. Check the button on the surface: the device's image fills the button behind its icon and text. The image also shows on the button at the top of the inspector and on the canvas, but not in the feedback's own Preview . Your own Button Content and Button Styling settings on that feedback still apply while it's on. Text, colors, and sizes that the module itself returns are not applied, so set the styling you want on the feedback yourself. Note Some modules only load images when the connection starts. If a thumbnail feedback shows nothing at first (Resolume's Clip Info / Show Thumbnail is one example), restart the connection. Show a live value from the device Value feedbacks, such as an audio level or a timecode, report a value instead of on or off. To show one on a button, store it in a Feedback variable on the button, then put that variable in the button's text: On the button's Variables tab, add a Self variable and give it a Name , for example masterlevel . Set Type to Feedback , then pick the feedback under Feedback , for example the ATEM Fairlight Audio: Master level feedback, and set its options, such as Meter . Select Create . On the Design tab, put the variable in the button's text: $(self.state.masterlevel) . The text updates live as the device reports new values. A Feedback variable is read-only: actions can't set it, because the next result from the feedback would overwrite it. You can also use it in an expression, for example in an Expression feedback that turns the button red above a threshold. Boolean feedbacks can drive a Feedback variable the same way, holding true or false . See Understand variable scope for how Self variables work. Test a variable directly as feedback The Internal Expression feedback isn't tied to any connection: it evaluates an expression you write against any variable and reports true or false, the same way a connection's own feedback would. Use it for logic a connection doesn't expose directly, such as checking the current hour or comparing two variables. For example, this expression is true from 18:00 onwards, so the Evening button on the Stream Deck above turns red in the evening: dateHour(unixNow()) >= 18 The result of the expression appears under it as you type, such as = true , so you can confirm it evaluates correctly before relying on it. See the expressions reference for the functions you can use. Like any other feedback, it has a Preview . Hold Test to see the button as if the feedback were active, whatever the expression's result. Generate a feedback per choice When a feedback's own field is a dropdown of choices, its ... menu offers Create Button Repeater from choices , the same as an action's dropdown does. This is how a repeated set of buttons gets matching feedback: for example, repeating an ATEM's Set Program input action across every input, then repeating its ME: One ME program source feedback the same way, so each generated button both switches to its own input and lights up when that input is actually live. Both repeaters need to reference the same option list (for example, both keyed off the connection's own input list) to stay aligned button for button. The Repeater tab's Data Sources list shows every action and feedback repeater feeding the current layout together, so you can confirm they're aligned, see Build more capable button actions for the full repeater mechanics, including the $(self.repeatIndex) / $(self.repeatDataId) / $(self.repeatDataLabel) variables and the Customize Data & Labels editor. Feedback repeaters don't have an encoder-selector equivalent: encoder selection is an action-only concept, since it drives what an encoder's turn does, not what a button displays. If you get stuck What you see What to try Two feedbacks conflict on the same styling field. Check their order in the list: a later feedback overrides an earlier one's value for the same field when both are active. A repeated feedback doesn't match up with its repeated action. Confirm both repeaters are built from the same option list, see the Data Sources list on the Repeater tab. A feedback you want isn't listed under + Add Feedback... . It's probably a value feedback. Add it as a Feedback variable on the Variables tab instead (see Show a live value from the device ). A device image doesn't show on the button. Check the surface itself: the feedback Preview doesn't show feedback images. If the surface is blank too, restart the connection, since some modules only load images when the connection starts. The device's own text or colors don't appear on the button. Buttons applies only the image from an advanced feedback. Set the text and colors on the feedback yourself. An Expression feedback never turns true. Check the result shown under the expression, such as = false or = ERR , and confirm the variable it references is actually populated. Where to go next Build more capable button actions , for steps, groups, conditional logic, repeaters, and encoders. Button Inspector reference , for every field on the Feedbacks and Repeater tabs. Understand variable scope , for what a variable in an expression can actually see.
