Survey authoring

Question types reference

Here you can see all question types allowed in Dayalogs surveys.

View it in action Connect an MCP client

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

single

Use when respondents must choose exactly one option from a list. Good for status, category, yes/no and mutually exclusive answers.

Rendered example
Where should we send the next survey invite?
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

multi

Use when more than one answer can be true. Add min_selected, max_selected and exclusive options when the rules matter.

Rendered example
Which tools did you use before coffee?
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 · short

Use for compact open answers: age, postal code, external id, short label or one-line feedback.

Rendered example
Postcode
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 · textarea

Use when the respondent is expected to write a sentence or a paragraph. Keep it optional unless the open answer is essential.

Rendered example
Anything we should know before this questionnaire goes back to behaving itself?
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
}

Email

email

Use for validated email capture. Add a note when the address is used for follow-up, incentives or respondent support.

Rendered example
Email for follow-up

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-10

A standard 0-10 recommendation scale. Technically it is a scale, but it deserves its own authoring pattern because people look for it by name.

Rendered example
How likely are you to recommend Dayalogs to someone who still thinks survey exports should hurt?
Not likelyVery likely
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

scale

Use for numeric ratings such as satisfaction, agreement, importance, probability or 0-10 leader evaluations.

Rendered example
How clear was the questionnaire?
Not clearVery clear
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 + rows

Use when several items share the same numeric scale. This is the classic battery pattern for agreement, satisfaction, importance or leader evaluation.

Rendered example
Rate each part of the service.
1
2
3
4
5
Speed
Clarity
Follow-up
Poor Excellent
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=rating

A scale rendered as stars, hearts, circles, thumbs or smileys. The answer remains numeric, but the interface feels lighter.

Rendered example
How polished does this feel?
RoughPolished
How much do you like the visual treatment?
Not muchA lot
How did this interaction feel?
PainfulSmooth
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 + rating

Use when multiple rows share the same visual rating control. It keeps the answer numeric while making repeated ratings faster to scan.

Rendered example
How do these parts feel?
Tone
Visuals
Flow
Cold Warm
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_single

Use when several rows share the same single-answer options. Internally it behaves like a tidy group of singles.

Rendered example
Rate each part of the service.
Poor
OK
Good
N/A
Speed
Clarity
Follow-up
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_multi

Use when each row can have more than one answer. Useful for feature usage, channels, responsibilities or repeated attributes.

Rendered example
Which teams use each feature?
Research
Marketing
Operations
Imports
Reviews
Exports
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

rank

Use when order matters. Limit how many items must be ranked so respondents do not spend their afternoon sorting your roadmap.

Rendered example
Pick the next three things we should improve.

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

    file

    Use when respondents must attach supporting material. Keep limits explicit and accept only safe file families.

    Rendered example
    Upload supporting material.

    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"
            ]
        }
    }

    Hidden value

    hidden

    Use for derived values, imported contact data, URL parameters or internal metadata that should be stored with the response.

    Rendered example

    Hidden values are stored with the response but are not shown to respondents.

    JSON markup
    {
        "id": "h_gid",
        "alias": "panel_gid",
        "type": "hidden",
        "value": "{{ @urlparams.gid }}"
    }

    Bringing live data into a survey

    data layer

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