Authoring rule of thumb — choose the type that best matches how the respondent should answer, not how the data analyst wants to label the column later. Aliases and exports can handle the data side.
About the examples — they are here to help you understand the survey structure, not to suggest that you should build surveys by hand. In normal use, Dayalogs or your AI assistant prepares this for you and you review the result.
Single choice
singleUse when respondents must choose exactly one option from a list. Good for status, category, yes/no and mutually exclusive answers.
JSON markup
{
"id": "q_channel",
"alias": "preferred_channel",
"type": "single",
"title": "Where should we send the next survey invite?",
"required": true,
"options": [
{
"code": 1,
"alias": "email",
"label": "Email"
},
{
"code": 2,
"alias": "whatsapp",
"label": "WhatsApp"
},
{
"code": 3,
"alias": "sms",
"label": "SMS"
},
{
"code": 97,
"alias": "other",
"label": "Other channel",
"other": true
}
]
}
Multiple choice
multiUse when more than one answer can be true. Add min_selected, max_selected and exclusive options when the rules matter.
JSON markup
{
"id": "q_tools",
"alias": "research_tools",
"type": "multi",
"title": "Which tools did you use before coffee?",
"required": true,
"min_selected": 1,
"max_selected": 3,
"options": [
{
"code": 1,
"alias": "excel",
"label": "Excel"
},
{
"code": 2,
"alias": "slides",
"label": "Slides"
},
{
"code": 3,
"alias": "notes",
"label": "Notes app"
},
{
"code": 97,
"alias": "other_tool",
"label": "Some mysterious fieldwork tool",
"other": true
},
{
"code": 98,
"alias": "not_sure",
"label": "I genuinely do not know",
"exclusive": true
}
]
}
Short text
text · shortUse for compact open answers: age, postal code, external id, short label or one-line feedback.
JSON markup
{
"id": "q_postcode",
"alias": "postcode",
"type": "text",
"title": "Postcode",
"required": true,
"rows": 1,
"min_length": 5,
"max_length": 5,
"pattern": "^[0-9]{5}$",
"pattern_message": "Use a five-digit postcode."
}
Long text
text · textareaUse when the respondent is expected to write a sentence or a paragraph. Keep it optional unless the open answer is essential.
JSON markup
{
"id": "q_comment",
"alias": "final_comment",
"type": "text",
"title": "Anything we should know before this questionnaire goes back to behaving itself?",
"required": false,
"rows": 4,
"max_rows": 4,
"max_rows_message": "Use four lines or fewer.",
"max_length": 800
}
Use for validated email capture. Add a note when the address is used for follow-up, incentives or respondent support.
Only used if we need to clarify your response.
JSON markup
{
"id": "q_email",
"alias": "contact_email",
"type": "email",
"title": "Email for follow-up",
"required": false,
"note": "Only used if we need to clarify your response."
}
NPS
scale · 0-10A standard 0-10 recommendation scale. Technically it is a scale, but it deserves its own authoring pattern because people look for it by name.
JSON markup
{
"id": "q_nps",
"alias": "nps",
"type": "scale",
"title": "How likely are you to recommend Dayalogs to someone who still thinks survey exports should hurt?",
"required": true,
"scale": {
"min": 0,
"max": 10,
"step": 1,
"labels": {
"min": "Not likely",
"max": "Very likely"
}
}
}
Numeric scale
scaleUse for numeric ratings such as satisfaction, agreement, importance, probability or 0-10 leader evaluations.
JSON markup
{
"id": "q_clarity",
"alias": "survey_clarity",
"type": "scale",
"title": "How clear was the questionnaire?",
"required": true,
"scale": {
"min": 1,
"max": 7,
"step": 1,
"labels": {
"min": "Not clear",
"max": "Very clear"
},
"special_options": [
{
"code": 98,
"label": "Cannot evaluate"
},
{
"code": 99,
"label": "Prefer not to answer"
}
]
}
}
Scale battery
scale + rowsUse when several items share the same numeric scale. This is the classic battery pattern for agreement, satisfaction, importance or leader evaluation.
JSON markup
{
"id": "q_service_scores",
"alias": "service_scores",
"type": "scale",
"title": "Rate each part of the service.",
"required": true,
"options": [
{
"code": "speed",
"alias": "speed",
"label": "Speed"
},
{
"code": "clarity",
"alias": "clarity",
"label": "Clarity"
},
{
"code": "followup",
"alias": "followup",
"label": "Follow-up"
}
],
"scale": {
"min": 1,
"max": 5,
"step": 1,
"labels": {
"min": "Poor",
"max": "Excellent"
}
}
}
Visual rating
scale.render=ratingA scale rendered as stars, hearts, circles, thumbs or smileys. The answer remains numeric, but the interface feels lighter.
JSON markup
{
"id": "q_polish",
"alias": "renderer_polish",
"type": "scale",
"title": "How polished does this feel?",
"required": true,
"scale": {
"min": 1,
"max": 5,
"labels": {
"min": "Rough",
"max": "Polished"
},
"render": {
"variant": "rating",
"icon": "star",
"selected_style": "solid",
"unselected_style": "solid",
"selected_color": "#D19A2E",
"unselected_color": "#F2E5C7"
}
}
}
Visual rating battery
scale rows + ratingUse when multiple rows share the same visual rating control. It keeps the answer numeric while making repeated ratings faster to scan.
JSON markup
{
"id": "q_brand_feel",
"alias": "brand_feel",
"type": "scale",
"title": "How do these parts feel?",
"required": true,
"options": [
{
"code": "tone",
"alias": "tone",
"label": "Tone"
},
{
"code": "visuals",
"alias": "visuals",
"label": "Visuals"
},
{
"code": "flow",
"alias": "flow",
"label": "Flow"
}
],
"scale": {
"min": 1,
"max": 5,
"labels": {
"min": "Cold",
"max": "Warm"
},
"render": {
"variant": "rating",
"icon": "heart",
"selected_color": "#B14D42",
"unselected_color": "#F0E3DF"
}
}
}
Categorical matrix
matrix_singleUse when several rows share the same single-answer options. Internally it behaves like a tidy group of singles.
JSON markup
{
"id": "q_service_matrix",
"alias": "service_matrix",
"type": "matrix_single",
"title": "Rate each part of the service.",
"required": true,
"rows": [
{
"id": "speed",
"alias": "speed",
"label": "Speed"
},
{
"id": "clarity",
"alias": "clarity",
"label": "Clarity"
},
{
"id": "followup",
"alias": "followup",
"label": "Follow-up"
}
],
"options": [
{
"code": 1,
"alias": "poor",
"label": "Poor"
},
{
"code": 2,
"alias": "ok",
"label": "OK"
},
{
"code": 3,
"alias": "good",
"label": "Good"
},
{
"code": 99,
"alias": "na",
"label": "N/A"
}
]
}
Checkbox matrix
matrix_multiUse when each row can have more than one answer. Useful for feature usage, channels, responsibilities or repeated attributes.
JSON markup
{
"id": "q_feature_matrix",
"alias": "feature_usage",
"type": "matrix_multi",
"title": "Which teams use each feature?",
"required": false,
"rows": [
{
"id": "imports",
"alias": "imports",
"label": "Imports"
},
{
"id": "reviews",
"alias": "reviews",
"label": "Reviews"
},
{
"id": "exports",
"alias": "exports",
"label": "Exports"
}
],
"options": [
{
"code": 1,
"alias": "research",
"label": "Research"
},
{
"code": 2,
"alias": "marketing",
"label": "Marketing"
},
{
"code": 3,
"alias": "ops",
"label": "Operations"
}
]
}
Ranking
rankUse when order matters. Limit how many items must be ranked so respondents do not spend their afternoon sorting your roadmap.
Rank between 1 and 3 options.
Available
- AI authoring
- Preview reviews
- Exports
- Campaigns
- Something weirdly specific
Your order
JSON markup
{
"id": "q_priorities",
"alias": "next_priorities",
"type": "rank",
"title": "Pick the next three things we should improve.",
"required": true,
"rank_min": 1,
"rank_max": 3,
"options": [
{
"code": 1,
"alias": "builder",
"label": "AI authoring"
},
{
"code": 2,
"alias": "preview",
"label": "Preview reviews"
},
{
"code": 3,
"alias": "exports",
"label": "Exports"
},
{
"code": 4,
"alias": "campaigns",
"label": "Campaigns"
},
{
"code": 97,
"alias": "other_priority",
"label": "Something weirdly specific",
"other": true
}
]
}
File upload
fileUse when respondents must attach supporting material. Keep limits explicit and accept only safe file families.
PDF or document file, maximum 10 MB.
JSON markup
{
"id": "q_upload",
"alias": "supporting_file",
"type": "file",
"title": "Upload supporting material.",
"required": false,
"note": "PDF or document file, maximum 10 MB.",
"file": {
"max_files": 1,
"max_size_mb": 10,
"allowed": [
"pdf",
"document"
],
"extensions": [
"pdf",
"docx"
]
}
}
Bringing live data into a survey
data layerThese are not question types, but they are part of how a survey can work. Use them when the survey already knows something about the respondent and should not ask them to type it again.
URL variables
Read values that arrive in the survey link with {{ @urlparams.gid }}. Useful for panel ids, campaign ids or channel information.
Contact data
Personalized links can already carry respondent data. Reference it with {{ @contact.name }} or richer structured data such as {{ @contact.data.children }}.
Survey variables
Define internal variables once and reuse them in text, visibility logic, hidden values or redirects. They share the survey namespace with question aliases.
API calls
API calls can fetch extra data just before the survey starts, without exposing credentials in the browser. Save selected values with hidden questions when they should appear in exports.