Repository navigation
Studio Tutorial End to End
This tutorial follows one realistic study through every stage of Studio — from an empty project to a published report and a citable research bundle. It takes about two hours the first time. Each part ends with a checkpoint, so you can stop and come back.
The study. Customer Pulse 2026: a short satisfaction survey for the customers of a regional service, fielded in three regions, with a consent page, an age screener, an attention check, a Net Promoter Score, a satisfaction rating and an open comment for unhappy customers. The analysis cleans the data, weights it to the regional customer mix, tabulates satisfaction by region and publishes a report and a live dashboard.
Part 1 Plan Part 5 Build the analysis on simulated data
Part 2 Build the questionnaire Part 6 Pilot, pre-register, launch
Part 3 Make it look right Part 7 Monitor fieldwork
Part 4 Test it Part 8 Report, close, archive
Before you start. You need an organization on a plan that includes the features used here — the 30-day Pro trial covers all of them. Parts marked (Plus) need Plus or higher after the trial. See Plans, Trial and Billing.
A finished study to compare with. The example study (Projects → New project → Template → Example study) is a larger study built with the same tools and already filled with 729 sample responses. Its flow
cleaningdoes what Part 5 builds — quality checks, raking, a table the other flows read, a live tile — with Response quality in drop mode rather than flag;tablesadds a banner table, a tab book and coded open answers; andwellbeing_appreports a Net Promoter Score. Open it in another tab to see each step done on a study that has data — see The example study's flows.
Write down, before touching the Builder, what you need to be true of the data. For this study:
| Decision | Choice |
|---|---|
| Who may answer | adults (18+) who agree to take part |
| Sample | 300 completed interviews, roughly 100 per region |
| Key measures | satisfaction (5-point), NPS (0–10) |
| Quality | one attention check; flag, don't drop |
| Weighting | to the known customer mix: North 45 %, Center 30 %, South 25 % |
| Deliverables | a report with a weighted table and a chart, a live tile for the client, a research bundle |
Two naming habits make everything downstream easier:
-
Name variables for analysis —
consent,age,region,satisfaction,nps,attention,comment. Each answer is stored under its variable name: that is the data column, and the name conditions, piping and quota counting read. -
Give each question the same Id as its variable. The Id is the
question's handle in the Builder: the Logic map and validation messages name
questions by it. Logic works whatever the Id is, but
satisfactionis easier to read there thanq7. The one thing Studio refuses is an Id that is another question's variable name. See Question Id and variable name.
-
Projects → New project. Name:
Customer Pulse 2026. - Start from: Blank project → Create →.
The Builder opens on page1, which holds one placeholder question ("New
question", a single choice with Option 1 / Option 2, variable q1).
The first Save, #1, is valid.
- Select the page in the rail. In the Inspector (Page), set Title to
About this survey and Name to
consent_page. The new name takes effect when you leave the field or pressEnter(Escputs the old one back). - + Question → Presets → Yes / No. Set the Question text to Do you agree to take part in this survey? and turn Required on.
- Open Variable and change the variable name to
consent(pressEnter). Then open Advanced and set Id toconsenttoo. - Select the placeholder question
q1and press Delete question (the trash icon in the Inspector's header). Its variableq1leaves the codebook with it: the message at the bottom says "Removed variable q1 too", with Undo.
The Yes / No preset codes
1 = Yes,0 = Noand shows them as buttons.
Introductory text for respondents goes in the page's Body (hint "HTML,
shown above the questions …"): The survey takes about five minutes. Your
answers are anonymous. It is HTML, not Markdown — wrap paragraphs in
<p>…</p> if you write more than one.
-
+ Page → Content page. Title About you, name
screener. -
+ Question → Types → Number. Text How old are you?, Required on,
Unit
years. Variable nameage, Advanced → Idage. In Variable, set Min16and Max99. -
+ Question → Types → Single choice. Text Where do you live?,
Required on. Choices:
1North,2Center,3South. Variable and Idregion. Variable label Region of residence.
-
+ Page → Content page. Title Your experience, name
experience. -
+ Question → Types → Likert scale. Text Overall, how satisfied are you
with our service? Points
5, Left label Very dissatisfied, Right label Very satisfied. Variable and Idsatisfaction. -
+ Question → Presets → NPS (0–10). Keep the standard wording. Variable
and Id
nps. -
+ Question → Presets → Attention check. It is a required single choice
(…please choose "Rarely") already marked as an attention check with its
acceptable answer. Variable and Id
attention. -
+ Question → Types → Open text. Text You gave us {answer:nps} out of 10.
What should we do better? Turn Multi-line on. Variable and Id
comment.
{answer:nps} is piping: the respondent sees the number they chose.
- + Page → Final page — the thank-you page for completed interviews. Edit its Title and Body in the Inspector.
-
+ Page → Screen-out page — named
disqualification, with the text You do not qualify for this study. Edit it if you like.
Check the order in the rail: consent_page, screener, experience,
final, disqualification. Drag pages to reorder if needed. Keep the
screen-out page last, after the final page — it is reached only by the
rules you add next.
Screen out non-consenters. Select consent_page. In Logic → Branch (next
if) press + Rule. A draft rule opens with its condition editor already
showing a comparison on the page's last question: Variable consent,
operator =. Pick the value No (0), set the target (→) to
disqualification, and press Add rule — it stays disabled until the
comparison has a value ("Pick what the rule tests — it is added once the
condition is complete.").
Screen out minors. Select screener and press + Rule. The draft opens
on region, the page's last question: change Variable to age, the
operator to < and the value to 18, target disqualification, Add
rule.
A branch rule with an empty condition never fires — it is not an "otherwise". Studio does not add a draft rule until its condition is complete, but a rule can lose its condition later (Clear) or arrive without one from an import; then the Inspector shows "Add a condition — an empty rule never fires." under it, and the Logic map labels its arrow "no condition — never fires". Use Default next for "everyone else".
Ask for a comment only from detractors. Select the comment question.
Logic → Show if → Add condition: nps ≤ 6 → Done.
Also screen out inattentive respondents? For this study, no — we flag
them in the analysis instead. (The attention check's Also end the survey
for respondents who fail option would add a branch rule from experience
to a Screen-out page placed after the Final page — here disqualification,
which already sits there — so that respondents who pass still finish on
final.)
Open Logic map. The Pages lens should show
consent_page → screener → experience → final, with rule arrows from
consent_page and screener to disqualification. Switch to the
Questions lens: the comment row carries a SHOW IF chip reading nps,
and no arc is red (a red arc means a condition reads an answer given later).
Open More ▾ → Quotas. In "or one for every value of", pick region,
set the limit to 100 and press Add 3 cells.
Each cell closes once 100 completed interviews have its region;
screen-outs and unfinished interviews do not count. A later respondent who
picks a full region is stopped when they leave the screener page, on the
quota-full screen: "Thank you for your interest" / "We have already reached
our target sample for participants like you." Their interview is not
submitted. Previews do not check quotas — publish to pilot with a small
limit to see the screen. See
When a cell is full.
Press Save changes, message Questionnaire v1, Save. The badge should
read ● valid #2 or ● warnings #2. If it says errors, open Validation
and fix what it lists.
Checkpoint. Five pages, seven questions, three quota cells, a valid Save.
Open More ▾ → Theme.
- Appearance — set a Primary color that matches your brand; read the contrast line under the colors (it turns red below the WCAG floor). Leave Progress on bar: published surveys show the indicator this setting chooses.
- Branding — Institution Customer Insights Team. For a logo, paste a Logo URL from a stable public address (your website). Do not use a link from Files — those download links expire after a few minutes.
-
Respondent experience — fill Contact email, Privacy URL and the
Ethics statement. They appear in the footer of every page. Set
Estimated minutes to
5: respondents see "About 5 minutes" under the title of the first page (you can then drop the sentence about the length from the consent page's Body). - Wording — optionally rephrase the runtime's fixed texts: buttons, page labels, answering hints and error messages, saving and failure messages, the screen-out and quota-full screens. The notices a published survey shows when it is closed or paused stay in English.
Note. Completion screen has a Title and a Message, but they are shown only where a survey ends without its own ending text — on Submit of a question page, or on a Final page with no title (for the Title) or no body (for the Message). This study ends on its own Final page, whose Title and Body you already set, and the hints beside the two fields say that the Final page's own text is shown instead. See Completion screen.
Switch the canvas to Structure | Preview and check both Desktop and Mobile. Save (Theme).
Open Validation. The Engine section should report no errors (press Check now after edits). Read every warning; lint remarks such as an unused variable are fine if you understand them.
Test → Walkthrough. Take the survey as a consenting 35-year-old from the
North who is unhappy (NPS 4): the side panel should show comment evaluated
as shown. Restart and answer No to consent: the panel should report the
consent_page rule matching and routing you to disqualification. Restart
once more as a 16-year-old.
Test → Simulate: Responses 300, Seed 42, Simulate. Look at
the preview rows and the codebook, then download SPSS and open it: are the
variable and value labels right?
Simulation follows the questionnaire's logic the way a respondent meets it: page, block and question conditions, routing and screen-outs, the arm of Assign to a condition, Randomize pages and quotas — a simulated respondent who answers into a full
regioncell stops there. Option shuffles and custom JavaScript are not simulated. See Simulate.
Test → Share preview creates a public link (copied automatically) that a colleague or client can open without an account for 24 hours. Answers are not stored. Collect wording comments; apply them; Save.
Checkpoint. Both routes behave; the simulated SPSS file is labeled.
Build the whole analysis now, before the first real respondent arrives.
Flows → New flow, Title Satisfaction, Open canvas. The canvas
starts with a Responses source; delete it for now (select it,
Delete).
Drag these nodes from the palette and connect each node's data output to the
next node's data input:
Simulated data ─▶ Response quality ─▶ Rake weights ─▶ Apply weight ─┬─▶ Banner table ┐
│ ├─▶ Bar chart ─┤
│ └─▶ Net Promoter Score
└──(table)───────────────────────────────────────────────────┤
▼
Report section ─▶ Save report
Apply weight ─▶ Live tile
Set the parameters:
| Node | Parameter | Value |
|---|---|---|
| Simulated data | Respondents · Seed |
300 · 42
|
| Response quality | Attention checks | use Fill from the questionnaire — it fills attention with its acceptable answer |
| Mode |
flag (adds quality_flags and quality_score, keeps everyone) |
|
| Rake weights | Targets (variable → code → share) | {"region": {"1": 0.45, "2": 0.30, "3": 0.25}} |
| Apply weight | Weight column | weight |
| Banner table | Questions (down) · Breakdowns (across) · Significance letters |
satisfaction · region · on |
| Bar chart | Variable · By |
satisfaction · region
|
| Net Promoter Score | 0–10 item | nps |
| Report section | Heading · Text | Satisfaction by region · a sentence of context |
| Captions | one per connected item | |
| Note | Base: all respondents, weighted by region. | |
| Save report | Title · File name |
Customer Pulse 2026 · satisfaction — already filled in from the flow's name; it is saved as outputs/satisfaction.md
|
| Live tile | Kind · Label · Show |
number · Respondents so far · rows
|
Connect the Banner table's table, the Bar chart's chart, the NPS table and the
Response quality table (counts per quality flag) to the Report section's
items input in the order they should appear.
Which outputs are weighted? After Apply weight, the node's Weight column help lists them: Frequencies, Crosstab (Fisher's exact test counts respondents), Group means (not N or the test), Descriptive statistics (not N, skewness or kurtosis), Banner table, Net Promoter Score, Regression, TURF, MaxDiff, Conjoint, Share of preference, Principal components, Scale reliability, Key drivers, Perceptual map (its chi-square test counts respondents), Price sensitivity, Correlation and Correlation matrix with Pearson, Bar chart, Heatmap with By or with Pearson, Likert chart, Proportion CI with Weighted checked, Trend and Tab book (Excel); a Result chart follows the result it draws. A Banner table is used here for its significance letters; a Crosstab (Rows
satisfaction, Columnsregion, Percentagescol) would also give weighted column percentages, with a chi-square test on the effective base instead of letters. The Bar chart here, with Byregion, shows weighted mean satisfaction per region (its axis reads "Weighted mean …"). 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, Data check, and the counts of MaxDiff scores and Bands stay unweighted and say so in their output. See Making tables and tests use the weight.
- Select Banner table and press
Ctrl/Cmd + Enter(Run to here) — the weighted table appears in the inspector, with column percentages, counts and significance letters. - Press Check — the engine should report no errors. Fix anything it lists before saving: a flow saved with engine errors is stored without code, so it cannot run (its Run button is disabled and the flows table marks it errors) until you fix it and save again. The questionnaire and the project's other flows are not affected.
- Switch to Report view to write the words around the outputs and use Preview report.
Save changes (Analysis v1), then Run. The run appears in Run history; the report appears on the Reports tab.
With no node selected, the inspector shows Flow settings. Check Live: recompute on new responses and Save. New responses will re-run the flow and refresh the tile.
Checkpoint. A saved, runnable flow and a report — all on simulated data.
→ Analysis Flows · Cleaning and Weighting Data · Node Reference
-
Distribute → Publish panel: Target
pilot→ Publish to pilot. - When the card shows ● Live, Copy the link and send it to three colleagues. Answer it yourself on a phone.
- Check Data → responses: are the columns what you expected? Is
commentempty for promoters? - Fix anything you find in the Builder, Save, and press the Republish #N
chip on the
pilotcard.
In the flow, drag in a Responses node, set Environment main and check
Only completed responses. Connect its data output to Response
quality — this replaces the connection from Simulated data — then delete
Simulated data. Check, Save.
Only completed responses leaves out unfinished interviews only. Screen-outs — here the non-consenters and the minors — were submitted, so they stay in the flow, marked
screened_outin__status. To analyze only the people who qualified, put a Filter rows node between Responses and Response quality with the conditionconsent=1andage≥18.
History → open the latest Save → More ▾ → Pre-register. The Save is tagged as the registered questionnaire and analysis plan; later Methods drafts and bundle provenance report what changed since. For an external timestamp, also Deposit it to Zenodo (Part 8 shows how).
Distribute → Publish panel: Target main → Publish to main.
Share the main link: email it, print the QR code, or paste the Embed
snippet into your website.
New projects cap
mainat 1,200 completed interviews andpilotat 50; screen-outs and unfinished interviews do not count. On the Free plan the project also stops at 1,000 completed interviews, all environments together. When a cap is reached, a respondent who opens the link sees "Thank you for your interest — We have already reached our target sample for participants like you." at once; someone who was already answering sees it when they submit, and their interview is not stored as completed.
Alternative channels:
- a sample provider — Panel Providers;
- personal email invitations with reminders (Plus, after the first payment) — Email Invitations;
- restricted access with codes, or One per browser to refuse a second interview from the same browser — Links, QR Codes, Embeds and Access Control.
Checkpoint. main is live; the analysis reads real responses.
- Distribute tiles: Responses · main — the completed interviews against the cap (the tooltip gives all rows, partial and screened-out ones included) — Completion, Median duration (and speeders), Quality screen (share failing the attention check), Today.
- The
maincard: one bar per quota cell (region=1 · 64/100). When a region reaches its target, the cell closes by itself: later respondents from that region end on the quota-full screen when they leavescreener, and the other regions go on. To collect more from a region, raise its limit, Save and Republish #N. - Drop-off on the card: which page people abandon.
- Live tab: project totals, a responses-per-day chart and the flow's tiles. Create public link gives the client a read-only page with just the tiles (Plus); Revoke it when the engagement ends.
→ Live Monitoring · Data Quality
On the main card press Close → Close survey. Respondents now see
"This survey is closed". (Reopen would rebuild the same Save into the same
link.)
If you know the end date in advance, set it instead: the Closing date chip
on the main card → pick the date → Save date. It applies at once,
without a new Save or a rebuild. When the date passes, collection stops by
itself, anyone who opens the link sees "This survey is closed", and the card
reads ○ Closed with an Extend button in case you need a few more
days — see Deadlines.
Flows → Satisfaction → Run. On Reports, open the report and read it.
In the flow's Report view, the Look tab sets typeface, density, table
style and page size (a4 for printing). Download HTML for the client or
use Print / PDF.
Data → responses → Export ▾ → SPSS gives a labeled .sav of the whole
table: all environments, partials and screen-outs included — filter on
survey_id, partial and __status (screened_out). The answers come in
the questionnaire's order, followed by the fieldwork columns (duration_s,
started_at, url_<name> for each link parameter, the captcha verdict and
the tab-switch counts). Stata gives the same as a .dta.
-
Settings → General → Study & citation: title, authors (one per line:
Name; ORCID; affiliation), license, keywords, abstract → Save study metadata. -
History → open the final Save → More ▾ → Methods: a draft Methods
section built from your documents; everything marked
[...]needs you. -
More ▾ → Download a bundle → With the responses so far: the study as a
zip — questionnaire and flow code, documents, codebook,
METHODS.md,CITATION.cff,PROVENANCE.mdand the data (the responses, and the project tables and uploaded files the flows read). The survey link's parameters, such as panel ids, are included only where a flow reads one, and invitation tokens never are. - More ▾ → Deposit (needs a Zenodo token stored under Settings → Secrets, which an owner or admin adds): choose Zenodo, pick the token, uncheck "Use sandbox.zenodo.org" for a real DOI, decide on Publish immediately, and Deposit.
Done. The study, its analysis and its data are versioned, reproducible and citable.
→ Reports · History and Versions · Reproducibility: Code, Bundles and Citation
| Skill | Where it is documented |
|---|---|
| Pages, presets, Ids and variables | The Builder, Question Types |
| Branch rules, show if, piping, Logic map | Logic and Branching |
| Quota cells and the quota-full screen | Quotas and Randomization |
| Theme and footer details | Theme and Branding |
| Validation, walkthrough, simulation, share preview | Testing Your Survey |
| Flows, quality flags, raking, reports, live tiles | Analysis Flows, Reports |
| Environments, pilot, launch, response caps, closing dates | Publishing and Environments |
| Pre-registration, bundles, deposits | History and Versions |
To see the same skills on a larger study, with six flows and their reports already built, start a project from the example study.
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