Skip to content

Studio Recipes

Han Elias edited this page Oct 27, 2026 · 2 revisions

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

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).


Questionnaire

A consent page that screens out non-consenters

  1. On the first page add + Question → Presets → Yes / No — Do you agree to take part? — and turn Required on. Rename the variable to consent.
  2. Put the information text in the page's Body: it is shown above the question, as HTML.
  3. + 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.
  4. Select the consent page → Logic → Branch (next if) → + Rule. The draft rule opens on consent =: pick No (0), set the target to disqualification, press Add rule.
  5. 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).

→ Logic and Branching

An eligibility screener

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.

A follow-up question for some respondents only

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}.

An attention check that ends the survey

  1. + Question → Presets → Attention check (a required single choice, already marked, with its acceptable answer). Rename the variable to attention.
  2. 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_out page is left to its own job; the rule gets a Screen-out page of its own behind the Final page.
  3. Confirm with Test → Walkthrough twice: once answering the check correctly (you should end on the Final page), once failing it.
  4. 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).

→ Data Quality

Measure and report NPS

  1. + Question → Presets → NPS (0–10); rename the variable to nps.
  2. Optionally add an Open text follow-up shown if nps ≤ 6.
  3. In a flow: source → Net Promoter Score (0–10 item nps) — the score (promoters minus detractors) with a confidence interval. Connect its table to 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.

Shuffle answer options, questions or blocks

  • 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.

→ Quotas and Randomization

Run the survey in another language

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.

Move a Qualtrics survey into Studio

  1. In Qualtrics: Tools → Import/Export → Export survey (.qsf).
  2. In Studio: Builder → More ▾ → Import, drop the file, read the Not imported list, press Check with the engine, then Import.
  3. 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.

→ Importing Questionnaires


Fieldwork

Pilot, then launch

  1. Distribute → Publish panel: Target pilot → Publish to pilot. Send the link to a few colleagues.
  2. Check Data, fix in the Builder, Save, press Republish #N on the pilot card; repeat until clean.
  3. Target main → Publish to main. The main link 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

Change a survey that is already in the field

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.

Roll back to an earlier version

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

Set or extend a closing date

  1. Distribute → the environment's card → Closing date chip.
  2. 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.
  3. When the date passes, anyone who opens the link sees "This survey is closed", and the card reads ○ Closed — "Closed — deadline passed date".
  4. 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

Close quota cells when they are full

  1. Builder → Quotas: in "or one for every value of", pick the variable (for example region), set the limit, press Add N cells. Save.
  2. 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.

Accept one response per browser

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

Field a study on Prolific

  1. Distribute → publish pilot and main if they are not published yet: the Panel chip is only on the card of an environment that serves the survey.
  2. Either card → Panel chip → Provider Prolific. The id parameter becomes PROLIFIC_PID.
  3. 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.
  4. Save panel setup, then publish that Save to pilot and to main.
  5. Test on pilot with 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.
  6. 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 adds PROLIFIC_PID, STUDY_ID and SESSION_ID; check that the study link it shows has each of them once.
  7. Before approving, reconcile with Outcomes · reconcile with the provider (completed / screened out / partial CSVs, with duration_seconds, duplicate_id and fast_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.

Field a study on Respondent

  1. Distribute → publish pilot and main if they are not published yet: the Panel chip is only on the card of an environment that serves the survey.
  2. Either card → Panel chip → Provider Respondent. The id parameter becomes respondent_user_id; Screened out and Quota full stay empty.
  3. Replace <projectCompletionId> in Completed — or the whole URL — with the project's Completion Confirmation URL from Respondent, and Save panel setup.
  4. 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.
  5. Publish the latest Save to pilot and to main.
  6. Test on pilot with made-up identifiers (?respondent_profile_id=test&respondent_project_id=test&respondent_screener_response_id=test&respondent_user_id=test0001): you should land on app.respondent.io/complete, and the row should be in Data.
  7. 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 four respondent_* identifiers.
  8. 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.

→ Respondent

→ Panel Providers

Invite a list by email and remind non-responders

(Plus and above, once a plan is bought.)

  1. Publish the environment you will invite to.
  2. Distribute → Email invitations → Import contacts: paste one per line (ada@example.com, Ada Lovelace <ada@example.com>, or a CSV with an email column); check the consent confirmation; Import.
  3. New mailing: subject, message containing {link} (and {name} if you have names), your From name and Reply-to; check the preview; Send to N.
  4. 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").

→ Email Invitations

Restrict the survey to invited participants

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

Embed the survey in your website

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-height you put on its div). 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 height to suit your page.

→ Embedding the survey


Data and analysis

Handle a data erasure request

  1. Find what identifies the response: the Response ID the respondent's thank-you screen showed (the id column), their panel id or invitation token (in the meta column), or an answer only they would have given.
  2. 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 as 12 check the id column of the row you pick.
  3. Press Delete on the row and confirm. Only owners and admins see the Delete button.
  4. 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.

→ Responses and the Data Tab

Get labeled data into SPSS, Stata or R

  • 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 .dta the same way (and Builder → Test → Simulate downloads one for simulated data).
  • R: read the .sav with haven::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

A weighted table with significance tests

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).

→ Cleaning and Weighting Data

A banner table for a client deck

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.

A tab book for the client

Every question of the study by the client's segments, in one Excel file.

  1. In a flow, after your cleaning and weighting steps, add Tab book (Excel) (Output) and connect the data to it.
  2. Banner: check the segments — gender, region, age_band (age cut into ranges by Bands: a banner takes nominal and ordinal variables).
  3. 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.
  4. Keep Percentages column, Counts and Significance letters on. File name already reads <flow>_tabbook; type a name of your own between the fixed outputs/ and .xlsx if you like (client_q3, saved as outputs/client_q3.xlsx).
  5. Save and Run. The preview shows what it would write; the run keeps the workbook.
  6. 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.

Pearson or Kendall correlations, and a correlation matrix

One pair — in a flow, after your cleaning steps:

  1. Add Correlation (Analyze): X age, Y spend_month, Method pearson ("Pearson r").
  2. Run to here. The statistics give r, p_value, n and the 95 % interval lower – 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:

  1. Add Correlation matrix: check the Variables (trust_1 … trust_6), Method spearman, Missing answers pairwise.
  2. With many pairs, set p adjustment to holm (or fdr_bh): the stars then follow the adjusted p, and the footer says "Holm, over 15 pairs".
  3. Connect its table to a Report section. The Layout matrix prints the lower triangle with * p < .05, ** p < .01, *** p < .001; pairs gives 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

Compare two groups with Welch's t-test

  1. Add t-test (Analyze). Design is independent ("two groups").
  2. Variable satisfaction_score, Groups gender.
  3. When Groups has more than two answers, pick the two in Group A 1 ("Male") and Group B 2 ("Female"); with exactly two, leave both empty.
  4. Leave Variances at welch ("Welch's t") — it does not assume the two groups vary equally. student pools the variances.
  5. 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.

An ANOVA with post-hoc comparisons

  1. Add Group means: Variable spend_month, By region.
  2. Test anova ("one-way ANOVA"), Post-hoc tukey ("Tukey HSD").
  3. 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.

Compare before and after in the same respondents

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"), Variable rating_before, Second measurement rating_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_before then rating_after (the order you check them is the order compared: the difference is the first minus the second). Test auto runs the Wilcoxon signed-rank test: W+, W-, Z, p and the rank-biserial r.
  • Yes/no answers: Paired tests with Test mcnemar and 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 pairs output has a Wilcoxon test for every pair, Holm-adjusted.
  • Three or more yes/no answers: Paired tests with Test cochran runs Cochran's Q; its pairs output has a McNemar test for every pair, Holm-adjusted. The example study's flow usage compares the four ways of managing screen time this way (node manage, 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

Exploratory factor analysis with scores

  1. Add Factor analysis: check the Items of your battery (three or more, rated on the same scale).
  2. Leave Factors empty and set Number of factors by to parallel (or type the number you expect in Factors).
  3. Rotation promax when the factors may correlate (they usually do in attitudes), varimax when they should not. Check Sort items by factor and set Hide loadings below to 0.3 so the structure reads at a glance.
  4. 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 %.
  5. Check Add factor scores: factor_1, factor_2, … are added to the data. Wire the node's data output on — a Group means of factor_1 by region, 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.

MaxDiff scores per respondent in a crosstab

The MaxDiff node gives one score per item for everyone together. To break preferences down by segment, give each respondent their own scores first:

  1. 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.
  2. Mean score by segment: Group means, Variable q_md_score_1, By region (weighted after Apply weight).
  3. 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 variable price_ahead — then Crosstab, Rows price_ahead, Columns region. "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.

A 100 % stacked bar of a question by segment

The chart of a crosstab's column percentages: one bar per segment, each stacked to 100 %.

  1. After your cleaning steps (and Apply weight, if the data is weighted), add Bar chart (Visualize): Variable satisfaction, Split by region.
  2. Layout stacked_100 ("stacked to 100 %"). (grouped puts each region's bars side by side; with Show percent they are % of the region too.)
  3. Optional: Sort value puts 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.
  4. Run to here. Each region's n is 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

A Likert battery chart

  1. 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).
  2. Leave Neutral answer split ("half on either side"), or choose side ("in a panel at the right") to keep the middle answer apart. Sort items top2 puts the item with the largest top-2 share first; listed keeps the order of Items.
  3. 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.

A bar chart with significance letters

Which regions are more satisfied than others, marked on the chart the way a banner table marks it.

  1. After your cleaning steps (and Apply weight), add Bar chart: Variable satisfaction, Split by region, Show percent, Layout grouped.
  2. Check Significance letters. Leave Level at 0.05; with many groups, set Multiple comparisons bonferroni.
  3. Optional: check Confidence intervals for each bar's margin of error.
  4. 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

A histogram

How a number spreads — ages, amounts, minutes.

  1. Add Bar chart: Variable age (an interval or ratio variable), Layout histogram ("histogram of a number, in Bins").
  2. 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).
  3. Show percent for % of those who answered; Split by gender for a panel per group on the same bins.
  4. 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.

A monthly tracking trend by segment

Satisfaction month by month since launch, a line per segment.

  1. After your cleaning steps (and Apply weight), add Trend (Visualize).
  2. Time: created_at ("Response date (created_at)"), or your wave variable for a wave-by-wave tracker. created_at is at the end of the list, under Beside the answers; in a long list, type "created" in its filter box to find it. Period month (week for an ISO week, Monday to Sunday).
  3. Measure percent, Measure variable satisfaction, Answer codes 4 and 5 checked — a top-2 box. (mean tracks the average; count the respondents.)
  4. Split by segment. Keep Confidence band on and Minimum base 30.
  5. 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.

Brand colors in charts

Draw a report's charts in your brand's colors and typeface.

  1. In the flow's Report view, open Look → Chart colors.
  2. 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.
  3. On each chart node, set Palette to theme ("the report's chart colors (Save report's Look)"), and a Heatmap's Color map to theme.
  4. Preview report. The charts are drawn in your colors, in the .md's figures and the .html alike, 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).

Chart a MaxDiff or TURF result

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:

  1. Add MaxDiff (Analyze) with your MaxDiff question.
  2. Add Result chart (Visualize) and connect the MaxDiff node's table to its result input.
  3. Kind auto draws the utilities with their 95 % intervals, against the reference item at 0. Choose scores for the counting scores or shares for the shares. With Estimate counts the chart draws the scores.

TURF:

  1. Add TURF with the 0/1 Options (from Explode multiple choice), Largest portfolio 3, Search best.
  2. Connect its table to a Result chart: the reach curve, each portfolio size named by the option it adds, with its reach and gain.
  3. With Search fixed and 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.

A key-driver analysis

Which attribute ratings matter most for overall satisfaction?

  1. Add Key drivers (Analyze): Outcome overall_sat, Drivers the attribute ratings (rate_price, rate_service, rate_range, rate_staff).
  2. Leave Importance at relative_weights ("Johnson's relative weights"), or choose shapley ("Shapley value (LMG)"), which takes at most 15 drivers; the two agree closely.
  3. 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.
  4. Connect the table to 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.

A perceptual map

Which regions (or segments) go with which brands?

  1. Add Perceptual map (Analyze): Table crosstab ("Rows by Columns"), Rows region, Columns brand_used.
  2. 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.
  3. 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.

A Van Westendorp study

  1. 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).
  2. 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.
  3. 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.
  4. Connect the table to 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.

An ordinal regression

For an outcome of ordered answers — very dissatisfied to very satisfied:

  1. Add Regression (Analyze): Outcome satisfaction (an ordinal variable), Predictors age, region, trust_acme.
  2. Model ordinal ("ordinal logit, ordered answers").
  3. 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's pseudo_r_squared, the likelihood-ratio test (lr_p) and aic.
  4. Connect the table to 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.

Export the cleaned data for R

  1. End your cleaning flow with Export file: type clean in 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".
  2. 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."
  3. The run writes three files, on the run's card and under Files as outputs/<flow>/clean.R, clean.csv and clean.dictionary.json. Download all three into one folder.
  4. In R (with the jsonlite package installed): source("clean.R"). The data frame survey_data has the codebook's missing codes as NA, labeled codes as factors and each variable's codebook label as the column's label attribute.

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.

Clean once and reuse the clean data in several flows

  1. Flow a_clean: Responses → Dedup respondents → Speeders & partials → Write table (clean).
  2. 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.

Rename, duplicate or delete a flow

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

Analyze a file you uploaded

  1. 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.
  2. 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.
  3. 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

Code an open question by rules

  1. 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.
  2. 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”").
  3. 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.
  4. Set Show to Uncoded and read what is left: add words from Suggested words, or select answers and press 1–9 to code them by hand (0 for no theme). Test a phrase shows why an answer is coded as it is — often a negation: late does not find wasn't late.
  5. Save changes → Save, then Back to flow, save the flow and run it. The node's table goes 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.

A nightly report on a schedule

(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

Send an interactive report to a client

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.

  1. 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).
  2. 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.
  3. 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.
  4. Run the flow, then on Reports open the report — the bar shows an interactive pill — and press HTML to download it.
  5. 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.

A live dashboard for a client

(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.

Keep a Google Sheet in sync

(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


Keeping it

Pre-register and get a DOI

  1. Settings → General → Study & citation: authors (Name; ORCID; affiliation), license, keywords, abstract → Save study metadata.
  2. History → open the Save you field with → More ▾ → Pre-register.
  3. Add your Zenodo token under Settings → Secrets (owners and admins).
  4. More ▾ → Deposit → Zenodo, pick the token, uncheck "Use sandbox.zenodo.org", check Publish immediately for a DOI now → Deposit.

→ History and Versions

Reproduce the study on your own computer

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.sh

run.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

See also


← Security and Privacy · Studio contents · Limits and Quotas at a Glance →

Start here: Studio · Library


📚 Library

Getting started

Survey design

Validate & simulate

Data & analysis

Reporting

Frontend & deploy

Tooling

More


🎛️ Siamang Studio

Get started

Account & workspace

Build the questionnaire

Fieldwork

Data

Analysis & output

Integrations & admin

Reference

Clone this wiki locally