Repository navigation
Studio Recipes
Step-by-step solutions to the tasks people ask about most. Each recipe is the
short path; the linked pages have every option and caveat. A flow node's
choice is written as its code followed, in parentheses, by the name its list
in the inspector shows under it: Design independent ("two groups"); the
field itself shows independent.
Contents
- Questionnaire: consent page · eligibility screener · follow-up for some respondents · attention check · NPS · shuffle options or blocks · another language · bring a Qualtrics survey
- Fieldwork: pilot then launch · fix a live survey · roll back · closing date · quota cells · one response per browser · Prolific · Respondent · email invitations · invited participants only · embed
- Data and analysis: erasure request · SPSS / Stata / R · weighted table · banner table · tab book · correlations · Welch's t-test · ANOVA with post-hoc · before and after · factor analysis · MaxDiff scores in a crosstab · 100 % stacked bars by segment · Likert battery chart · significance letters on a bar chart · histogram · monthly trend by segment · brand colors in charts · chart a MaxDiff or TURF result · key drivers · perceptual map · Van Westendorp · ordinal regression · export for R · clean once, reuse · rename or delete a flow · analyze an uploaded file · open answers · nightly report · interactive report for a client · client dashboard · Google Sheets
- Keeping it: pre-register and cite · reproduce on a laptop
Names in these recipes. Conditions, piping, quotas and your data use a question's variable name (
consent,nps). When a recipe says "rename the variable", type the new name in the Inspector's Variable card. The question's Id (Inspector → Advanced) may stay as Studio numbered it; setting it to the same name makes the Logic map and validation messages, which name questions by Id, easier to read. Renaming a variable updates the conditions, branch rules, quotas, piped text and scripts that already use it, but not your flows — and once the survey is in the field, answers collected after you publish again land in a column with the new name. So rename before fieldwork and before you build flows. See Question Id and variable name.
See it done in the example study. A project started from the example study has many of these recipes already built and run on its 729 sample responses. Where it has one, a line In the example study names the page, or the flow and the node id, to look at (node ids are on the node cards; each flow is described in The example study's flows).
- On the first page add + Question → Presets → Yes / No — Do you agree
to take part? — and turn Required on. Rename the variable to
consent. - Put the information text in the page's Body: it is shown above the question, as HTML.
-
+ Page → Screen-out page (Studio names it
disqualification); write a polite message in its Body. Drag it to the end of the page list, after a Final page (add one with + Page → Final page if you have none): pages run in order, so everyone who passes stops at the Final page and only the rule below reaches the Screen-out page. - Select the consent page → Logic → Branch (next if) → + Rule. The
draft rule opens on
consent=: pick No (0), set the target todisqualification, press Add rule. - Test → Walkthrough — answer No and confirm you land on the screen-out page.
The templates that ask for consent (Pilot study among them) use a
variant: a Screen-out page screen_out right after the consent page, with
Show if consent = 0, so only people who decline ever see it. Both
patterns work.
In the example study: the same variant — the Screen-out page No problem
right after Your consent, with Show if consent = 2 (No, not now).
Put the screening questions on their own page, then one Branch (next if)
rule per exclusion, each pointing to the Screen-out page — for example
age < 18, then employment in [5, 6]. The first rule that
matches wins; everyone else continues to the next page. Screened-out
interviews are stored with the status screened_out (the __status column
in Data). They do not count toward the environment's response cap or any
quota cell, and they are still recorded when the cap is full, so your
screener numbers stay complete.
In the example study: the page A quick check asks the age, and the
Screen-out page after it, Thanks for your interest, has Show if
age < 16 — the Show-if variant of the same screener.
Select the follow-up question → Logic → Show if → Add condition — for
example nps ≤ 6. To mention the earlier answer, pipe it into the text:
You gave us {answer:nps} out of 10 — what should we improve? Use
{label:region} for the label of a choice instead of its code (a survey
published before {label:…} showed labels still shows the code until you
publish it again). Check the
Logic map → Questions lens: an arc drawn upward in red means the
condition reads an answer the respondent has not given yet.
In the example study: the commute question on Where you work or study
is shown only to those who work or study and not fully remotely (AND with
NOT), the trust question on Apps & media only if the news source is 1,
2 or 3 (in), and The apps you use pipes the kind of app into the
question after it with {label:main_app}.
-
+ Question → Presets → Attention check (a required single choice,
already marked, with its acceptable answer). Rename the variable to
attention. - In the Inspector, check Also end the survey for respondents who fail
(or, to end it only after several failed checks, End the survey after N
failed attention checks — see
After several failed checks)
(the hint then reads "branches to page"). Studio adds a branch rule from
the check's page to a Screen-out page that only this rule leads to: one
after the last Final or Redirect page, so respondents who pass walk on
to the Final page and are recorded as completed.
- A Screen-out page without a Show if / Hide if already there is reused.
- Otherwise Studio adds one right after the last Final or Redirect page,
named
disqualification("Thank you" / "You do not qualify for this study." — edit both). - If nothing ends the survey for everyone, Studio first adds a Final page after your last content page.
- A consent template's conditional
screen_outpage is left to its own job; the rule gets a Screen-out page of its own behind the Final page.
- Confirm with Test → Walkthrough twice: once answering the check correctly (you should end on the Final page), once failing it.
- To flag rather than exclude, leave both off and use the Response quality node in your flow (Fill from the questionnaire picks up the check).
A respondent who leaves an optional check empty is not screened out. In a
questionnaire saved when Studio still put this Screen-out page in front of
the Final page (or pointed the rule at a consent template's screen_out),
the Inspector shows why the branch does not work, with Fix the branch:
press it, Save, and publish again — see
Attention checks.
In the example study: the attention check is the fourth row of the You and
your phone matrix and does not end the survey; the flow cleaning drops
those who fail it instead (node quality, Attention checks
attention_check: 2, Mode drop).
-
+ Question → Presets → NPS (0–10); rename the variable to
nps. - Optionally add an Open text follow-up shown if
nps≤6. - In a flow: source → Net Promoter Score (0–10 item
nps) — the score (promoters minus detractors) with a confidence interval. Connect itstableto a Report section, or its output to a Live tile.
In the example study: "If the app existed, how likely would you be to
recommend it to a friend?" (app_recommend, a 0–10 Likert scale on
Using the app), scored by the flow wellbeing_app, node recommend.
- Options: select the question → Randomize option order (Single choice, Multiple choice, Ranking). "None of the above", exclusive choices such as "None of these" and the Other option keep their places; the other options are shuffled around them. (A survey published before this rule keeps shuffling them with the rest until you publish it again.)
- Questions inside a block: select the block → Randomize question order.
- Blocks on a page: select the page → Randomize block order.
- Pages: More ▾ → Scripts → Randomize pages. It keeps the first and the last page in place, and every Final, Screen-out and Redirect page wherever it sits, and shuffles the other pages among the remaining positions. A respondent who resumes a saved interview continues in the order they were dealt.
- More ▾ → Randomization lists every shuffle in one table.
In the example study: Your devices and Apps & media shuffle their blocks, the Social block its two questions, four questions their options, and a Shuffle options script the news sources.
One questionnaire is one language. Write the question texts, options and page texts in the target language, then More ▾ → Theme → Wording and replace the runtime's fixed phrases: buttons and page labels ("Welcome", "Page {page} of {pages}", "Final thoughts"), the estimated time, answering hints and error messages, "Other", "None of the above" and "Not applicable", saving and failure messages, the completion, screen-out, redirect and quota-full screens. A few texts are still English only — among them the notices a published survey shows when it is closed or paused, and labels only screen readers announce; see Theme and Branding. Publish again after changing the wording. For several languages, use one project per language.
- In Qualtrics: Tools → Import/Export → Export survey (
.qsf). - In Studio: Builder → More ▾ → Import, drop the file, read the Not imported list, press Check with the engine, then Import.
- Review the variable names — they become your data columns and the names conditions read — recreate anything listed as not imported (embedded data, quotas, loop & merge are not carried), Save.
-
Distribute → Publish panel: Target
pilot→ Publish to pilot. Send the link to a few colleagues. - Check Data, fix in the Builder, Save, press Republish #N on the pilot card; repeat until clean.
-
Target
main→ Publish to main. Themainlink stays the same for the whole study.
New projects cap pilot at 50 and main at 1,200 completed interviews
(screen-outs and unfinished interviews do not count); on Free, the project as
a whole stops at 1,000, so pilot interviews use up part of that.
→ Publishing and Environments
Safe mid-field: typo fixes, new questions at the end, theme colors. Risky: renaming variables, changing option codes, removing questions — your data will have two shapes. Edit, Save, then Republish #N on the card and read the warning ("The live field switches from Save #X to #N mid-collection…"). Responses record the environment, not the Save, so note the switch time — the project Activity log records every publish.
History → open the Save that worked → Deploy → choose the environment → Deploy #N. The link and the responses stay; only the questionnaire changes. Your working version in the Builder is untouched. To make the old version the one you edit, use Restore instead. → History and Versions
- Distribute → the environment's card → Closing date chip.
- Pick a date and time (your browser's local time) → Save date. The toast reads "Collecting until date". It applies at once — no new Save, no rebuild — and the card shows Closes date · set here.
- When the date passes, anyone who opens the link sees "This survey is closed", and the card reads ○ Closed — "Closed — deadline passed date".
- To collect again: Extend on the card → a later date → Extend to this date. The card turns back to ● Live.
No closing date removes the date; Use the Save’s date goes back to
the questionnaire's deadline or the environment's closes_at. To stop right
now, use Close instead. A survey published before the closing check ran
as the page opens shows the notice only when someone submits, until you
publish it again.
→ Deadlines
-
Builder → Quotas: in "or one for every value of", pick the variable
(for example
region), set the limit, press Add N cells. Save. - Publish (or republish) the environment.
Each cell closes once its limit of completed interviews has the value;
screen-outs and unfinished interviews do not count. A later respondent who
gives that answer is stopped when they leave the page, on the quota-full
screen ("Thank you for your interest" / "We have already reached our target
sample for participants like you."); for panel respondents, set Quota
full → return URL on the Panel chip to send them back. Watch the
fill on the Distribute card (region=1 · 64/100). To take more from a full
cell, raise its limit, Save and Republish #N.
A survey published before quota cells closed lets everyone through until you publish it again. The environment's response cap is a separate, overall limit. → When a cell is full
In the example study: three cells on age group, 400 completed interviews each.
Distribute → the environment's card → One per browser → Turn on. The toast reads "One response per browser — on for env" and the chip "One per browser · on". From then on, a browser that has sent a response — or ended on a screen-out or a full quota — sees "You have already taken part" instead of the questionnaire. No new Save or rebuild is needed, but a survey published before this option existed needs one republish.
It is checked in the respondent's browser only: cleared browser data, a private window, another browser or another device can answer again, and people sharing one browser count as one. For one answer per person, use email invitations or a panel provider's own checks.
The survey page keeps a mark in the respondent's browser, and the mark stays after they answer — the survey's other browser data is cleared after a week, the mark is not — so mention it in your survey's consent text. For respondents in the EU, where keeping such a mark on a device needs their consent, unique invitation links are more reliable. → One response per browser
-
Distribute → publish
pilotandmainif they are not published yet: the Panel chip is only on the card of an environment that serves the survey. - Either card → Panel chip → Provider Prolific. The id
parameter becomes
PROLIFIC_PID. - In the three return URLs, replace
<COMPLETION_CODE>,<SCREENOUT_CODE>and<QUOTA_FULL_CODE>with the codes from your Prolific study page, and set what each code does in Prolific. -
Save panel setup, then publish that Save to
pilotand tomain. - Test on
pilotwith a made-up id (?PROLIFIC_PID=test0000000000000000001&STUDY_ID=test&SESSION_ID=test): you should land on Prolific's completion page, and the row should be in Data. - Copy
main's Entry link for the provider — the plain survey link — into the Prolific study's URL and choose I'll use URL parameters; Prolific addsPROLIFIC_PID,STUDY_IDandSESSION_ID; check that the study link it shows has each of them once. - Before approving, reconcile with Outcomes · reconcile with the
provider (completed / screened out / partial CSVs, with
duration_seconds,duplicate_idandfast_outlier). Check a submission without a stored response: an exceptionally fast one may be rejected; otherwise message the participant, and approve it when it looks like a technical problem.
-
Distribute → publish
pilotandmainif they are not published yet: the Panel chip is only on the card of an environment that serves the survey. - Either card → Panel chip → Provider Respondent. The id
parameter becomes
respondent_user_id; Screened out and Quota full stay empty. - Replace
<projectCompletionId>in Completed — or the whole URL — with the project's Completion Confirmation URL from Respondent, and Save panel setup. - In the Builder, which now shows Respondent's warnings, make sure the survey ends only by finishing it: no Screen-out page a participant can reach, no attention check that ends the survey, no quota cells. A Respondent survey project has a single completion URL; screening and quotas stay in Respondent.
- Publish the latest Save to
pilotand tomain. - Test on
pilotwith made-up identifiers (?respondent_profile_id=test&respondent_project_id=test&respondent_screener_response_id=test&respondent_user_id=test0001): you should land onapp.respondent.io/complete, and the row should be in Data. - Paste
main's Entry link for the provider — the plain survey link — into the project's Link to Task (Custom URL), with no parameters of your own: Respondent adds its fourrespondent_*identifiers. - Before Respondent's Auto-Pay pays a participant, 48 hours after task
completion, reconcile Completes with the completed CSV (its id
column is
respondent_user_id) and decide on the participant in Respondent; message one listed under Completes without a completed response before deciding, and mark one who finished but is not under Completes as having attended yourself.
(Plus and above, once a plan is bought.)
- Publish the environment you will invite to.
-
Distribute → Email invitations → Import contacts: paste one per line
(
ada@example.com,Ada Lovelace <ada@example.com>, or a CSV with anemailcolumn); check the consent confirmation; Import. -
New mailing: subject, message containing
{link}(and{name}if you have names), your From name and Reply-to; check the preview; Send to N. - Three to five days later, press Remind on that mailing row — it goes only to invitees who have not completed, through the invitation or any earlier reminder, so you can send a second reminder safely. The Completed column counts completions via reminders under the total ("+N via reminders").
Distribute → card → Access codes → Generate codes (how many, prefix) — Studio saves a new version; republish the environment. Export CSV gives you the codes to hand out. The check runs in the respondent's browser, a code can be used any number of times, and the code a respondent entered is not stored with the response, so treat it as a light gate. For per-person tracking use email invitations. → Links, QR Codes, Embeds and Access Control
Distribute → card → Embed, then copy one of the two snippets into your page:
-
Script (auto-height) — the frame grows and shrinks with the survey, so
visitors never scroll inside your page; it is never shorter than 720 pixels
(or the
data-heightyou put on itsdiv). A survey published before auto-height existed keeps the minimum height until you publish it again. -
Inline frame — a plain frame 720 pixels high; change
heightto suit your page.
- Find what identifies the response: the Response ID the respondent's
thank-you screen showed (the
idcolumn), their panel id or invitation token (in themetacolumn), or an answer only they would have given. -
Data → responses: type it in Filter loaded rows… and press
Enter(or Search all rows). Studio searches every row of the table, not only the 100 loaded, and the note reads "N rows of the whole table match “…”". The search matches any value that contains the text, so for an id such as12check theidcolumn of the row you pick. - Press Delete on the row and confirm. Only owners and admins see the Delete button.
- The deletion is permanent. The response counts and any quota cell the response filled go down with it. It is recorded in the Activity log (without its content) — keep that as your evidence.
- SPSS: Data → responses → Export ▾ → SPSS — variable labels, value labels and declared missing values from the current Save.
- Stata: Data → responses → Export ▾ → Stata gives a labeled
.dtathe same way (and Builder → Test → Simulate downloads one for simulated data). - R: read the
.savwithhaven::read_sav()(labels kept), or export Parquet for a type-faithful table. For the data after your flow's cleaning and weighting, with a script that labels it for you, see Export the cleaned data for R.
Exports contain every row of the table — all environments, partial
interviews and screen-outs; filter on survey_id, partial and __status.
The answers come in the questionnaire's order, an "Other (please specify)"
answer as the question's Other code plus its text in <variable>_other, and
the fieldwork details as columns of their own (duration_s, started_at,
url_<name>, …). → Data Exports
In a flow: Responses → Rake weights (targets such as
{"region": {"1": 0.45, "2": 0.30, "3": 0.25}}) → Apply weight →
Banner table (Questions (down) satisfaction, Breakdowns (across)
region, Significance letters on). The banner shows weighted column
percentages and tests on the effective base.
For a single weighted crosstab, a Crosstab node after Apply weight
works too: Rows satisfaction, Columns region, Percentages
col. Its cells are sums of weights, and its chi-square test uses the
effective base.
Note. After Apply weight, Frequencies, Crosstab (not Fisher's exact test), Group means (not N or the test), Descriptive statistics, Correlation and Correlation matrix with Pearson, Banner table, Net Promoter Score, Regression, TURF, MaxDiff, Conjoint, Share of preference, Principal components, Scale reliability, Key drivers, Perceptual map (not its chi-square test), Price sensitivity, the Bar chart, a Heatmap with By or with Pearson, the Likert chart, the Trend, the Tab book (Excel) and Proportion CI (with Weighted checked) use the weight. Compare groups, Correlation and Correlation matrix with Spearman or Kendall, t-test, Paired tests, Factor analysis, Cluster (k-means), Box plot, Scatter plot, a Spearman or Kendall Heatmap, Response quality, Code open answers and Data check stay unweighted and say so in their output ("unweighted (the weight '…' is not applied)"); a Result chart says whichever its result is. See the linked page.
In the example study: the flow cleaning rakes to age group, gender and
area (node rake); the flow tables applies the weight and has both a
Crosstab with its chi-square on the effective base (node xtab) and a
Banner table with letters (node banner).
Source → cleaning → Banner table: questions down (Questions), breakdowns across (Breakdowns), Significance letters on. Connect it to a Report section; download the report as HTML. For every question of the study in Excel, use a tab book (below). → Node Reference
In the example study: the flow tables, node banner — four habits by
age group and gender, after Missing values so that the refusals get no
column.
Every question of the study by the client's segments, in one Excel file.
- In a flow, after your cleaning and weighting steps, add Tab book (Excel) (Output) and connect the data to it.
-
Banner: check the segments —
gender,region,age_band(age cut into ranges by Bands: a banner takes nominal and ordinal variables). - Questions: leave empty for every nominal, ordinal and multiple-choice question (open answers and rankings are left out, with the reason on the Contents sheet), or check the ones the client asked for — a number you check shows its mean.
- Keep Percentages
column, Counts and Significance letters on. File name already reads<flow>_tabbook; type a name of your own between the fixedoutputs/and.xlsxif you like (client_q3, saved asoutputs/client_q3.xlsx). - Save and Run. The preview shows what it would write; the run keeps the workbook.
- On Reports, pick Tab book and press Excel (or download it from Files).
The workbook opens on a Contents sheet linking to a sheet per question; the Notes sheet says how it was computed — the weight, the test, the minimum base, the missing codes left out. A question with several answers cannot be a banner variable: Explode multiple choice first and use its 0/1 columns. → Tab book (Excel)
In the example study: the flow tables, node tabbook — fourteen named
questions by age group, gender and area.
One pair — in a flow, after your cleaning steps:
- Add Correlation (Analyze): X
age, Yspend_month, Methodpearson("Pearson r"). -
Run to here. The statistics give
r,p_value,nand the 95 % intervallower–upper.
For two rating scales, choose Method kendall ("Kendall tau-b"), or leave
the default, Spearman: rank correlations suit answers on a 1–5 scale, and
tau-b allows for their many ties. Pearson and Kendall leave the codebook's
missing codes out and say how many (missing_codes); the default Spearman
counts them as answers unless Missing values comes first.
Every pair of several variables:
- Add Correlation matrix: check the Variables (
trust_1…trust_6), Methodspearman, Missing answerspairwise. - With many pairs, set p adjustment to
holm(orfdr_bh): the stars then follow the adjusted p, and the footer says "Holm, over 15 pairs". - Connect its
tableto a Report section. The Layoutmatrixprints the lower triangle with*p < .05,**p < .01,***p < .001;pairsgives one row per pair with p and N — the one to read when N differs from pair to pair (the footer's N is then a range,112–194).
After Apply weight a Pearson correlation is weighted, with p on Kish's effective base; Spearman and Kendall stay unweighted and say so. → Correlation · Correlation matrix
- Add t-test (Analyze). Design is
independent("two groups"). -
Variable
satisfaction_score, Groupsgender. - When Groups has more than two answers, pick the two in Group A
1("Male") and Group B2("Female"); with exactly two, leave both empty. - Leave Variances at
welch("Welch's t") — it does not assume the two groups vary equally.studentpools the variances. - Run to here. The table gives each group's N, mean, SD and SE; the footer gives t, df, p, the Mean difference (Male − Female) with its 95% CI, Cohen's d and Hedges' g.
The t-test is unweighted and says so on weighted data. For weighted means
beside the same test, use Group means with Test welch on a grouping
with two values (a filter or a recode can make one). Without Group A and
Group B on a three-group variable the check warns ("Gender has 3 answers (1 =
Male, 2 = Female, 3 = Other); a t-test compares two — name them in Group A and
Group B, unless the data this node reads holds only two of them.") and, unless
a filter upstream leaves two, the run stops with "Gender has 3 groups (1 =
Male, 2 = Female, 3 = Other); a t-test compares two — name them in Group A and
Group B."
→ t-test
In the example study: the flow wellbeing_app, node framing — interest
in the app by message_arm, the A/B message each respondent was shown.
- Add Group means: Variable
spend_month, Byregion. -
Test
anova("one-way ANOVA"), Post-hoctukey("Tukey HSD"). - Run to here. The footer gives F, df, p and η², and "Post-hoc = Tukey HSD: 1 of 3 pairs differ at p < 0.05"; the table Post-hoc: Tukey HSD under the means lists every pair of regions with the difference, its 95 % interval, q and p.
When the groups' spreads differ, use welch_anova with games_howell. For
ratings compared as ranks, kruskal with dunn, whose Dunn p adjustment
is holm (or bonferroni). A post-hoc test that does not follow its test is
refused as you choose it: "Tukey's HSD follows a one-way ANOVA — set Test to
anova, or Post-hoc to none." Connect the node's table to a Report
section: the post-hoc table goes into the report with it. Means, SDs and
medians are weighted after Apply weight; the test and the pairs are not.
→ Group means
In the example study: the flow segments, nodes means (ANOVA with
Tukey's pairs) and ranks (Kruskal-Wallis with Dunn's pairs), both placed
before Apply weight so that the means printed with the tests are the
ones compared.
When the same people answered twice — a rating before and after a message, the same scale about two brands — compare each respondent with themselves:
-
Means: t-test with Design
paired("two variables, same people"), Variablerating_before, Second measurementrating_after. The footer gives t, df, p, the mean difference (before − after) with its CI, Cohen's d (d_z) and the incomplete pairs left out. -
Ratings as ranks: Paired tests, check Variables
rating_beforethenrating_after(the order you check them is the order compared: the difference is the first minus the second). Testautoruns the Wilcoxon signed-rank test: W+, W-, Z, p and the rank-biserial r. -
Yes/no answers: Paired tests with Test
mcnemarand Counts as yes (McNemar) checked on the yes answer (check 4 and 5 for a top-two box): the % yes of each, the change in points, and p. -
Three or more (three concepts rated by everyone): Paired tests with
three Variables runs Friedman's test; its
pairsoutput has a Wilcoxon test for every pair, Holm-adjusted. -
Three or more yes/no answers: Paired tests with Test
cochranruns Cochran's Q; itspairsoutput has a McNemar test for every pair, Holm-adjusted. The example study's flowusagecompares the four ways of managing screen time this way (nodemanage, after Explode multiple choice).
A respondent who missed either question is left out of both, and the codebook's missing codes count as missing; the footer says how many. These tests are unweighted and say so. → Paired tests
- Add Factor analysis: check the Items of your battery (three or more, rated on the same scale).
- Leave Factors empty and set Number of factors by to
parallel(or type the number you expect in Factors). -
Rotation
promaxwhen the factors may correlate (they usually do in attitudes),varimaxwhen they should not. Check Sort items by factor and set Hide loadings below to0.3so the structure reads at a glance. - Run to here. The preview shows the loadings (with each item's communality and MSA), the variance explained and the factor correlations; the statistics give KMO (below 0.5 comes with a warning), Bartlett's test and Variance explained %.
- Check Add factor scores:
factor_1,factor_2, … are added to the data. Wire the node'sdataoutput on — a Group means offactor_1byregion, a Regression on the scores, an Export file.
Before averaging a factor's items into a scale, run Scale reliability on them and build it with Index / scale. Respondents missing any item are left out (their scores are blank); the analysis is unweighted and says so. → Factor analysis
In the example study: the flow wellbeing, node factor — two factors
fixed in Factors, promax, scores digital_1 and digital_2 for the
regression after it; its nodes alpha and index check and build the
wellbeing scale as the paragraph above says.
The MaxDiff node gives one score per item for everyone together. To break preferences down by segment, give each respondent their own scores first:
- Add MaxDiff scores (Prepare) after the source and pick the question in
MaxDiff question. It adds one variable per item —
q_md_score_1, … — labeled "MaxDiff score: item": best minus worst over the times that respondent saw the item, from −1 to 1, blank if they never saw it. - Mean score by segment: Group means, Variable
q_md_score_1, Byregion(weighted after Apply weight). - As a crosstab: add Bands — Variable
q_md_score_1, Boundaries[-1, 0, 1], check Bands include their upper boundary, Band labels["Not ahead", "Ahead"], New variableprice_ahead— then Crosstab, Rowsprice_ahead, Columnsregion. "Ahead" are the respondents who picked the item as best more often than as worst.
Respondents who never saw the item are blank, so they are in neither band. → MaxDiff scores · MaxDiff and Conjoint
In the example study: the flow segments, nodes scores → wants: the
segments' mean scores as a Heatmap.
The chart of a crosstab's column percentages: one bar per segment, each stacked to 100 %.
- After your cleaning steps (and Apply weight, if the data is weighted),
add Bar chart (Visualize): Variable
satisfaction, Split byregion. -
Layout
stacked_100("stacked to 100 %"). (groupedputs each region's bars side by side; with Showpercentthey are % of the region too.) - Optional: Sort
valueputs the regions with the largest share of the top answer first — the answers keep the scale's order — and Horizontal suits many or long segment names. -
Run to here. Each region's
nis under its name; under the plot: "Base: 385 respondents who answered both. Each group's n is under its name." and "Percentages are of each group of Region.", plus the missing codes left out ("Left out as missing: …").
On weighted data the percentages are weighted, as the Crosstab's column percentages are, and the axis reads "% within Region (weighted)". Split by needs one answer per respondent: a multiple-choice question is refused before the run ("Split by needs one answer per respondent, and … allows several: draw it as the Variable, or split by one of its options after Explode multiple choice."). A multiple-choice Variable can be split, side by side only. → Bar chart
- Add Likert chart (Visualize) and check the Items: statements rated
on the same scale, such as
trust_acme,trust_globex,trust_initech(1 = No trust … 5 = Full). - Leave Neutral answer
split("half on either side"), or chooseside("in a panel at the right") to keep the middle answer apart. Sort itemstop2puts the item with the largest top-2 share first;listedkeeps the order of Items. - Run to here. Each item is a bar centered on the neutral answer, with its bottom-2 and top-2 shares at the ends. The title is what the labels share ("Trust"), each bar the rest with its base ("Acme (n = 485)"), and the notes under the chart say which answers make the top-2 and bottom-2 and which missing codes were left out.
Items on different scales are refused before the run — "The items of a Likert chart must share one scale, and these do not: …" — so chart each scale on its own, or recode the items onto one. Codes run low to high, left to right: recode a scale written the other way (1 = Strongly agree) first. After Apply weight the shares are weighted. → Likert chart
In the example study: the flow wellbeing, node likert — the six
statements about the phone.
Which regions are more satisfied than others, marked on the chart the way a banner table marks it.
- After your cleaning steps (and Apply weight), add Bar chart:
Variable
satisfaction, Split byregion, Showpercent, Layoutgrouped. - Check Significance letters. Leave Level at
0.05; with many groups, set Multiple comparisonsbonferroni. - Optional: check Confidence intervals for each bar's margin of error.
-
Run to here. The regions are lettered under their names —
Capital (A),North (B),South (C)— and a letter over a bar names a region whose share of that answer is significantly lower. The note under the chart names the test; "No group's share of any answer is significantly higher than another's." when nothing differs, and "Not tested, fewer than 30 respondents who answered: …" for a small group.
The letters are the Banner table's two-sided z-test of column proportions, on each group's respondents who answered (Kish's effective base when weighted). A Tab book shows the same comparisons, with the letters its banner gives the columns. → Bar chart
How a number spreads — ages, amounts, minutes.
- Add Bar chart: Variable
age(an interval or ratio variable), Layouthistogram("histogram of a number, in Bins"). -
Bins: leave
auto(Freedman and Diaconis's width; whole-number answers get a whole width), type a number of bins (10), or type the edges you report in (18, 25, 35, 50, 65, 100). -
Show
percentfor % of those who answered; Split bygenderfor a panel per group on the same bins. - Run to here. The note under the chart says how the bins were made ("Bins: 11 of width 8 (Freedman–Diaconis), each holding 8 whole numbers.").
A histogram of a nominal or ordinal question is refused before the run — draw its answers as bars. Edges that do not increase are named on the field: "bins: The bins' edges must increase from one to the next, and 5 is followed by 3." → Bar chart
In the example study: the flow usage, node hist — hours a day on
screens in two-hour bins, a panel per age group.
Satisfaction month by month since launch, a line per segment.
- After your cleaning steps (and Apply weight), add Trend (Visualize).
-
Time:
created_at("Response date (created_at)"), or your wave variable for a wave-by-wave tracker.created_atis at the end of the list, under Beside the answers; in a long list, type "created" in its filter box to find it. Periodmonth(weekfor an ISO week, Monday to Sunday). -
Measure
percent, Measure variablesatisfaction, Answer codes4and5checked — a top-2 box. (meantracks the average;countthe respondents.) -
Split by
segment. Keep Confidence band on and Minimum base30. - Run to here. The preview shows the chart and, under it, the table of points — each month's percent, its 95 % interval and its base.
Every month from the first to the last is on the axis; a month without
respondents is a gap, and a point under 30 respondents is hollow, without a
band. With more than four segments the bands give way to marker shapes (the
table keeps the intervals). To put it in the report, add the chart (and
the table, for the numbers) to a Report section; for a live dashboard,
connect the chart to a Live tile (Kind chart).
→ Trend
In the example study: the flow usage, node trend — the weekly mean of
hours a day on screens — whose chart goes both to a Report section and
to the Live tile tile_trend.
Draw a report's charts in your brand's colors and typeface.
- In the flow's Report view, open Look → Chart colors.
-
Series: paste your palette, in order —
#003f5c, #ffa600, #bc5090, #58508d— or pick each swatch. Set Magnitude (the hue of an ordered scale, light to dark), the two Diverging ends (a Likert chart's disagree and agree sides), Chart text and Chart typeface (Inter, sans-serif) as you like. - On each chart node, set Palette to
theme("the report's chart colors (Save report's Look)"), and a Heatmap's Color map totheme. -
Preview report. The charts are drawn in your colors, in the
.md's figures and the.htmlalike, and their node previews and Live tiles follow.
A color too faint on white, text under 4.5:1 or a color given twice is refused on the node with the reason. To use the same colors in every flow, set them in Settings → Reports → House style and Apply to every flow. → Chart colors
In the example study: the six flows' Save report nodes share one Look,
which is also the project's house style, and every chart has Palette
theme (the Heatmap Color map theme).
A Result chart draws an analysis's own table, so the chart in the report shows the same numbers as the table beside it.
MaxDiff:
- Add MaxDiff (Analyze) with your MaxDiff question.
- Add Result chart (Visualize) and connect the MaxDiff node's
tableto its result input. -
Kind
autodraws the utilities with their 95 % intervals, against the reference item at 0. Choosescoresfor the counting scores orsharesfor the shares. With Estimatecountsthe chart draws the scores.
TURF:
- Add TURF with the 0/1 Options (from Explode multiple choice),
Largest portfolio
3, Searchbest. - Connect its
tableto a Result chart: the reach curve, each portfolio size named by the option it adds, with its reach and gain. - With Search
fixedand a Portfolio, the chart draws each option's reach beside what only it reaches, and the whole portfolio's reach.
Put the table and the chart in one report section, at Half each to sit side by side. Under the Result chart's Kind the inspector lists what the connected result suits. → Result chart · MaxDiff and Conjoint
In the example study: the flow wellbeing_app, nodes turf →
turf_chart (the reach of the best shortlist of one, two and three
features) and maxdiff, whose table goes into the report on its own.
Which attribute ratings matter most for overall satisfaction?
- Add Key drivers (Analyze): Outcome
overall_sat, Drivers the attribute ratings (rate_price,rate_service,rate_range,rate_staff). - Leave Importance at
relative_weights("Johnson's relative weights"), or chooseshapley("Shapley value (LMG)"), which takes at most 15 drivers; the two agree closely. - Run to here. The table ranks the drivers by % of R² — together the 100 % of what the model explains — beside each one's correlation (r), standardized Beta with its p, and VIF; the footer gives R², adjusted R², F and p.
- Connect the
tableto a Result chart for the bars, largest first.
Read Warning when it appears: a VIF of 10 or more (drivers that overlap share their importance between them) or a suppressor (a beta whose sign differs from its correlation). A driver with more than two unordered answers is refused — make a 0/1 variable per answer with Explode multiple choice or Derive. Respondents missing the outcome or any driver are left out (Excluded). → Key drivers
In the example study: the flow wellbeing, nodes drivers →
drivers_chart — life satisfaction on six measures.
Which regions (or segments) go with which brands?
- Add Perceptual map (Analyze): Table
crosstab("Rows by Columns"), Rowsregion, Columnsbrand_used. - Run to here. The first table gives each dimension's share of the inertia; the rows and columns tables give each point's coordinates, contribution and quality; the statistics give the chi-square test.
- Connect any of its tables to a Result chart: the map. Points that lie near each other go together more than chance would have it; each axis says how much of the table it shows, and the title how much the map shows in all.
For a brand-image grid — which brands are seen as modern, as good value — use
Table attributes: Rows the brand and Attributes the 0/1
attribute columns, in data with one row per respondent and brand (bring such
a file in with a Data file node); set Counts as yes (attributes) when
the attributes are coded other than 0/1. With a question about the respondent
as Rows and an exploded multiple-choice question as Attributes, the
map shows which regions check which options.
→ Perceptual map
In the example study: the flow usage, nodes map → map_chart —
Table attributes with the kind of app used most as Rows and the
eight yes/no feelings of a wide multiple choice as Attributes.
- In the questionnaire, ask four prices as numbers (interval or ratio scale): so cheap you would doubt the quality, a bargain, getting expensive, too expensive. For the Newton-Miller-Smith extension, also ask how likely the respondent would be to buy at their bargain price and at their getting-expensive price (1–5, 5 = definitely).
- In a flow, add Price sensitivity (Analyze), Method
van_westendorp("four price questions"), and choose Too cheap, Cheap (a bargain), Expensive (getting expensive) and Too expensive. For NMS, choose the two likelihood questions as well; leave Likelihood as probability (NMS) empty for 5 → 0.7, 4 → 0.5, 3 → 0.3, 2 → 0.1, 1 → 0. - Run to here. The table lists the price points — PMC, OPP, IPP, PME, and with NMS the prices of the highest trial and revenue — and the statistics the Range of acceptable prices ("6.4 – 14.34"); the curves are under it.
- Connect the
tableto a Result chart: the four curves with the points named and the acceptable range shaded (with NMS, the trial curve below).
Respondents whose four prices are not in order are left out and counted in
Inconsistent — many of them suggest a question was misread. For
Gabor-Granger (buy or not at set prices), set Method
gabor_granger, check one question per price in Would buy at each price,
list the prices in the same order in Prices ([4.99, 6.99, 8.99]) and,
on a likelihood scale, check the answers that mean would buy in Counts as
would buy (4 and 5 for a top-two box).
→ Price sensitivity
In the example study: the four questions are on the page What it should
cost, shown only to those whose interest is 3 or more; the flow
wellbeing_app, nodes price → price_chart, analyzes them.
For an outcome of ordered answers — very dissatisfied to very satisfied:
- Add Regression (Analyze): Outcome
satisfaction(an ordinal variable), Predictorsage,region,trust_acme. -
Model
ordinal("ordinal logit, ordered answers"). -
Run to here. The table lists each coefficient with its standard
error, z, p, odds ratio and 95 % interval, then the thresholds between
neighboring answers (
Very dissatisfied / Dissatisfied); the statistics give the answers'order,n, McFadden'spseudo_r_squared, the likelihood-ratio test (lr_p) andaic. - Connect the
tableto a Result chart: the odds ratios with their intervals on a log scale, the thresholds left out.
A positive coefficient — an odds ratio above 1 — makes the higher answers
more likely, as in R's MASS::polr. The outcome must be ordered: a nominal
one such as a region is refused before the run ("Region is nominal: its
answers (Capital, North, South) have no order, …"); with two answers, use
the logit. The codebook's missing codes are left out and counted
(missing_codes), and the model is weighted after Apply weight.
→ Regression
In the example study: the flow wellbeing, node ordinal — life
satisfaction (1–7) on the wellbeing index, the two factor scores, hours on
screens and age group.
- End your cleaning flow with Export file: type
cleanin File name and choose Format R bundle (.R). The line under it reads "After a run: Files → outputs/flow/clean.R" and "Beside it: clean.csv, clean.dictionary.json". - Save changes and ▶ Run the flow on its own — Run all keeps an Export file's files only when the flow lists them among its outputs, and the field says "Run all doesn't keep these files: run this flow on its own to get them."
- The run writes three files, on the run's card and under Files as
outputs/<flow>/clean.R,clean.csvandclean.dictionary.json. Download all three into one folder. - In R (with the
jsonlitepackage installed):source("clean.R"). The data framesurvey_datahas the codebook's missing codes asNA, labeled codes as factors and each variable's codebook label as the column'slabelattribute.
The export carries what the flow made — recodes, bands, factor scores, the
weight column. Format Codebook only (.json) writes the codebook
alone, and SPSS (.sav) a labeled SPSS file that R's haven reads.
→ Export file ·
Data Exports
In the example study: the flow cleaning, node export, writes
outputs/clean_responses.R with its .csv and dictionary.
- Flow
a_clean: Responses → Dedup respondents → Speeders & partials → Write table (clean). - Flow
b_tables: Project table (clean) → your analysis.
Run all sees that b_tables reads the table a_clean writes and runs
a_clean first, whatever the names. If a_clean fails, b_tables is
skipped ("skipped: needs a_clean, which failed") while unrelated flows still
run. Running b_tables on its own does not run a_clean first — it reads
the table as it was last written. b_tables gets the table's variables with
their labels and value labels, including variables a_clean made (a recode,
a derived variable, an index), so its pickers offer them ("from table clean ·
made by a_clean").
Run to here in a_clean never writes clean: only a run does. In a
research bundle made with data, b_tables reads data/tables/clean.csv —
the table as it was when the bundle was made — and the Write table step
does not run there; see Reproducibility.
In the example study: cleaning writes clean_responses, which tables,
usage, wellbeing and wellbeing_app read; wellbeing writes
scored_responses, which segments reads — so Run all runs cleaning
first and segments last.
On Flows, open the ⋮ at the end of the flow's row ("More for flow") — or, in the editor, More ▾, where the same commands read Rename flow…, Duplicate flow… and Delete flow… — and choose:
-
Rename… — type the new name (lower-case letters, digits and
_, starting with a letter) → Rename. A new Save stores the flow under the new name; its schedules and comments move with it, and Live keeps its tiles. Past runs and reports keep the old name. Save your own unsaved changes to the flow first — a rename takes the flow as last saved. -
Duplicate… — the name offered is
<name>_copy→ Duplicate. The copy's title gets "(copy)"; schedules are not copied, and the copy counts toward your plan's flow cap. - Delete… → Delete flow. A new Save removes the flow; its past runs and reports stay, and its schedules are paused.
Each is an ordinary Save, so History → Restore of an earlier Save brings a deleted or renamed flow back. A flow a colleague has open cannot be renamed or deleted until they are done. → Rename, duplicate or delete a flow
- In a flow, add a Data file source and choose the upload by name in its
File list (for example
panel_wave2.csv), or press Upload… under the list to upload it from there. - Check its Columns panel: how the file was read, and the one-click fixes it offers — Mark them as missing in these columns for codes that look like missing codes (then add a Missing values node below), Add a Select columns node without them for columns that look like personal data.
- Connect your analysis below. Its pickers offer the file's columns under "From panel_wave2.csv".
Runs, Run all and Run to here read the upload directly; a research bundle made with data brings the uploads its flows name. The full steps, with the dictionary and the reading options, are in Analyzing a dataset collected elsewhere. → Data file · Files
- In a flow, add Code open answers after the Responses node (and your cleaning), and on the node click New codeframe…. Pick the open-text Variable, keep the Name → Open the editor.
-
Add theme, give it a Label (Late delivery) and, under Words
and phrases, the terms that give it:
late,delay*. Add a word that rules it out under But not if one misleads it. The answers on the right show at once what each rule codes ("rule: delay* → “delayed”"). - Repeat for the other themes. Put related themes in one Net (Delivery); check Only when no other theme applies under More for Nothing / Don't know; in Codeframe settings, check An answer may have several themes if answers mention more than one thing.
- Set Show to Uncoded and read what is left: add words from
Suggested words, or select answers and press
1–9to code them by hand (0for no theme). Test a phrase shows why an answer is coded as it is — often a negation:latedoes not find wasn't late. -
Save changes → Save, then Back to flow, save the flow and
run it. The node's
tablegoes into a Report section.
Each run codes the answers collected since by the same rules; come back to Uncoded now and then. Nothing is sent to any AI provider. → Coding Open Answers
In the example study: the codeframe is already made
(analysis/improve.codeframe.json, an older one without rules), and the flow
tables, node code, applies it with Also add sentiment on. Edit
codeframe… on that node opens it in the editor, where the two answers it
has never seen show as Uncoded.
(Plus and above.) Flows → Schedules → Schedule a run → What to run: your flow (or all flows) → When: Daily at 02:00 (UTC) → Schedule. Each run replaces the report on Reports; owners get an email if a scheduled run fails. A schedule never starts a run beside one of the same flow (or a Run all) that is still going: it fires as soon as that run finishes. On Free, the button reads Requires Plus and opens the plans instead. → Schedules and Webhooks
Give a client one file whose charts they can explore: point at a bar for its exact value and base, hide a series to compare the rest, zoom into a scatter plot.
- In the flow's Report view, check Also HTML and Interactive charts in HTML in the title row (on the canvas: the Save report node's Also save HTML and Interactive charts in HTML).
- Preview report and point at a few charts: the tooltips give each value and its base, and a click on a legend entry hides its series.
- Look at the report's Scatter plot and Box plot charts, if any: the file carries each plotted respondent's values (no ids). Take a chart out of its section if those values should not leave the study.
- Run the flow, then on Reports open the report — the bar shows an interactive pill — and press HTML to download it.
- Send the
.html. It opens in any browser, offline, with nothing to install and nothing fetched from anywhere; it prints each chart as its picture, and each chart's … menu saves it as PNG or SVG.
The file is about 0.8 MB larger than without interactive charts (the chart
libraries, once). The .md and the Excel workbook keep the pictures, and a
flow without the box checked writes exactly what it always did. →
Interactive charts
In the example study: its six flows write their HTML with pictures; check
Interactive charts in HTML in the tables flow's Report view and run it
to see its Key tables report drawn this way.
(Plus and above.) Add Live tile nodes to a flow (a respondent count with
Show rows, a crosstab, a chart, a Trend of completes per week), check
Live: recompute on new responses in the flow settings, Save and
Run once. On Live, press Create public link and send it.
Revoke it when the engagement ends. The client can point at a chart
tile for its values and bases and click its legend; a Scatter plot or a
Box plot with Show points shows there as its picture only.
→ Live Monitoring
In the example study: the flow cleaning has two tiles with Live on, and
usage a chart tile of screen time by week.
(Plus and above.) Create a Google service account, share the sheet with its
client_email, then Settings → Connectors → Google Sheets → + Add:
Spreadsheet ID, Range, Source table responses, and a
Credentials secret holding the service-account JSON → + Add & Save.
Press Run export whenever you want a refresh (connectors run on demand,
not on a schedule; only owners and admins can run one). →
Connectors
-
Settings → General → Study & citation: authors (
Name; ORCID; affiliation), license, keywords, abstract → Save study metadata. - History → open the Save you field with → More ▾ → Pre-register.
- Add your Zenodo token under Settings → Secrets (owners and admins).
- More ▾ → Deposit → Zenodo, pick the token, uncheck "Use sandbox.zenodo.org", check Publish immediately for a DOI now → Deposit.
History → open a Save → More ▾ → Download a bundle → With the responses so far, then:
mkdir my-study && unzip <project>-s<N>-data.zip -d my-study && cd my-study
bash environment/run.shrun.sh installs the pinned engine, validates the questionnaire and runs
every flow on the bundled data, in the order Studio's Run all runs them;
reports land in outputs/. Read the bundle's README.md first: it says
where the engine comes from — when requirements.txt installs it from
GitHub, run.sh needs git and network access — and whether that engine can
be older than the one Studio runs, in which case some results may differ.
→ Reproducibility: Code, Bundles and Citation
← Security and Privacy · Studio contents · Limits and Quotas at a Glance →
siamang · Siamang Studio · Free for noncommercial use · Commercial licensing · Wiki source: wiki/
Getting started
Survey design
- Variables and Measurement
- Question Types
- Pages Blocks and Structure
- Visibility and Branching
- Quotas
- Scripts
Validate & simulate
Data & analysis
Reporting
Frontend & deploy
Tooling
More
Get started
Account & workspace
- Sign Up and Sign In
- Account and Profile
- Organizations and Team
- Projects
- Project Settings
- Plans, Trial and Billing
Build the questionnaire
- The Builder
- Question Types
- Codebook and Variables
- Logic and Branching
- Quotas and Randomization
- MaxDiff and Conjoint
- Theme and Branding
- Scripts
- Importing Questionnaires
- Question Bank and Library
- Testing Your Survey
- AI Assistant
Fieldwork
- Publishing and Environments
- Links, QR, Embeds, Access
- Panel Providers
- Email Invitations
- What Respondents See
- Live Monitoring
Data
Analysis & output
- Analysis Flows
- Node Reference
- Cleaning and Weighting
- Coding Open Answers
- Reports
- History and Versions
- Reproducibility
Integrations & admin
Reference