Potato imports a questionnaire from Qualtrics, REDCap, LimeSurvey, SurveyJS, Network Canvas, or an XLSForm and runs the questionnaire with random assignment to conditions, list experiments and randomized response for sensitive topics, and ego-network name generators. Potato is free and open source and runs on your own machine or your institution's server, so the responses stay there.
Beyond a form builder, a survey experiment needs random assignment that stays balanced across conditions, questions shown or skipped by rule, designs that let people answer sensitive questions privately, and an export that records what each respondent was assigned and shown. Potato covers each of these needs in a YAML config. Because Potato runs on your own server, the responses stay under your institution's data agreements. Running your own server matters more as some universities and faculties stop using Qualtrics. Radboud University's Faculty of Social Sciences, for example, asks its researchers to move to LimeSurvey by December 1, 2026.
Survey research designs in Potato
Each row is a feature that ships with Potato 2.12, and the linked page has its options.
| Task | How Potato does it | Docs |
|---|---|---|
| Survey and vignette experiments | conditions assigns each respondent one cell of a factorial design, and rules on pages and questions read the assigned condition | Experiment flow |
| List experiments | list_experiment shows the sensitive item to the treatment group only, and the export estimates its prevalence | Sensitive questions |
| Randomized response | randomized_response with forced-response or crosswise designs | Sensitive questions |
| Personal networks | ego_network with name generators, name interpreters, ties between alters, and a sociogram | Ego networks |
| Validated scales | 55 instruments for personality, mental health screening, affect, attitudes, and demographics | Survey instruments |
| Skip logic and branching | display_logic on questions, and show_when and exit_when on pages | Multi-phase workflows |
| Coding open-ended answers | Responses loaded as items and coded with a codebook by several coders, with Krippendorff's alpha | Content analysis |
A list experiment
The part of a config below splits respondents into a control and a treatment group, and shows the sensitive statement only in the treatment group's list. Respondents report how many statements apply, never which ones, and the survey_experiments export estimates the prevalence of the sensitive item with its standard error and a 95% interval.
conditions:
factors:
list_group: [control, treatment]
annotation_schemes:
- annotation_type: list_experiment
name: lists
description: How many of these have you done in the last year?
items:
- Gone to a live music concert
- Bought a book in a shop
- Volunteered for a local group
sensitive_item: Driven a car after drinking alcohol
treatment: {factor: list_group, level: treatment}Pick control statements that are neither all true nor all false for most respondents. When every statement or no statement applies to a respondent, the count reveals the sensitive answer, which defeats the design.
Importing an existing questionnaire
potato import reads a Qualtrics .qsf, a REDCap data dictionary, a LimeSurvey .lss, an XLSForm used by ODK, KoboToolbox, SurveyCTO, or Ona, SurveyJS JSON, a Beiwe survey, or a Network Canvas protocol. The questions, pages, and show/hide logic become Potato survey pages and rules. None of these files contains responses, so the import moves the instrument and leaves the collected data behind.
potato import -i my-survey.qsf -o survey-project/Working alongside Qualtrics, REDCap, ODK, and Network Canvas
Each of these tools is built for a different setting. Qualtrics is a hosted commercial survey platform, usually licensed by a university. REDCap is built for clinical and research databases at consortium institutions. ODK and KoboToolbox collect data offline on mobile devices in the field, and Network Canvas runs interviewer-assisted network interviews. Potato runs web surveys on your own server, and adds experimental conditions, sensitive-question designs, annotation tasks in the same session, Prolific and SONA recruitment, and one export.
Frequently asked questions
Can I run a survey experiment with random assignment without Qualtrics?
Yes. conditions assigns each respondent one cell of a between-subjects design, balanced across cells, at random, or round-robin, and the respondent keeps the cell after a reload. Pages and questions can test the assigned condition, and the CSV export writes each respondent's condition to participants.csv.
How do I build a list experiment online?
Use a list_experiment question with a control list and one sensitive item, and a two-level condition that decides who sees the sensitive item. The survey_experiments export computes the difference-in-means estimate of its prevalence with a standard error and a 95% interval. Randomized-response questions work the same way.
Can survey responses stay on my own server for IRB or GDPR requirements?
Yes. Potato runs on a server you choose, and responses are written to that server's disk. Nothing is sent to a third party unless you configure an external service, such as a hosted AI endpoint. Whether a particular setup meets your IRB's or GDPR's requirements is for your institution to decide.
Can I collect ego-network data with a name generator in a web survey?
Yes. An ego_network question runs its stages on one survey page, covering name generators, questions about each person named, the ties among those people, and placement on a map. The ego_network export writes ego, alter and edge tables and one GraphML file per network, with names left out unless you set export_names=true.
Further reading
- Survey research tools compared, for free alternatives to Qualtrics beside LimeSurvey, REDCap, and oTree
- Coming from Qualtrics, for how a
.qsftranslates, block by block - Cultural domain analysis, for free lists, pile sorts, and triad tests
- Incentive payments, for price lists, BDM, and belief elicitation
- Psychology experiments and qualitative research, for neighboring fields on this site