Skip to content

Coming from Qualtrics: Importing a .qsf Survey into Potato

Import a Qualtrics .qsf into Potato survey pages, and map blocks, display logic, randomizers, embedded data and End of Survey elements to Potato keys.

potato import reads a Qualtrics survey file (.qsf) and turns it into Potato survey pages, with its display logic, branches, randomizers and End of Survey elements translated into page and question rules. From Potato 2.12.0, a study that uses Qualtrics for consent, demographics and a screener and another tool for the labeling can run in one place, with the survey, the annotation, Prolific or SONA, and one export.

A .qsf file holds a survey's questions, blocks, survey flow and logic, not its responses. Potato is an annotation and survey server configured in YAML, so each Qualtrics block becomes a survey page in phases.order, and the annotation task sits between the pages that come before it and the pages that come after.

Export the survey from Qualtrics

Survey → Tools → Import/Export → Export Survey downloads the .qsf.

Import it into Potato

bash
potato import -i screener.qsf -o my-study/
python potato/flask_server.py start my-study/config.yaml -p 8000

Each block becomes a page (a page break inside a block starts a new one), each question becomes a Potato question, and the display logic, branches and end-of-survey elements become page and question rules. The new study runs the survey and then a placeholder annotation task, which you replace with the real one. To add the survey to a project you already have:

bash
potato import -i screener.qsf --into my-study/config.yaml --prefix scr_

IMPORT_REPORT.md lists everything that did not carry over. Survey Import covers the flags and the other six formats.

Qualtrics features and their Potato equivalents

QualtricsPotato
BlockA survey page in phases.order
Page breakA new page
Multiple choice (single, multiple, dropdown)radio, multiselect, select
Matrix table (Likert)multirate
Text entry, formtext, one text per form field
Text entry with number validationnumber with min and max
Sliderslider, one per statement
Rank order, constant sumranking, constant_sum
Descriptive textpure_display
Force responselabel_requirement: {required: true}
Display logicdisplay_logic with nested all, any and not
Branch in the survey flowshow_when on the pages under it
Randomizer showing all blocksphases.counterbalance
Randomizer assigning one embedded-data valueconditions, a between-subjects factor
End of Survey in a branch, skip to end of surveyexit_when, which screens the participant out
Choice randomizationrandomize_order
Embedded data from a URL, such as the Prolific IDPotato's login and crowdsourcing settings capture it

A randomizer that assigns embedded data maps onto Potato's conditions block, which assigns each participant to a cell when they arrive and keeps the cells balanced as people arrive and drop out. Logic that tested the embedded-data field tests condition.<field> after the import. Experiment Flow covers assignment, page rules and counterbalancing.

What the import leaves out

Loop & Merge (the block is imported once), piped text, logic on single matrix cells, "is displayed" conditions, choice-level display logic, quotas, web service and authenticator elements, scoring, custom validation, soft "request response", question JavaScript, and question types with no Potato equivalent (heat map, hot spot, file upload, signature, side-by-side, timing) are not imported. Each one is listed in the report.

Qualtrics' Timing question records page timing, not reaction time. For speeded responses, Potato has timed trials on annotation items and jsPsych pages.

Further Reading

For implementation details, see the source documentation.