The three layers
Questions
A Question is the definition of a single question, independent of any form. It carries:- Identity: a unique
handle, a humanname, and an optionaldescription. - Rendering: a
label, optionalhelp_text,icon, andimage_url, the inputtype,options,validation, and adefault_value. - Availability: an optional active window (
live_from,live_to) and a re-ask cool-down (answer_ttl_days). - Link configuration: where each answer is routed. See Routing answers.
text, textarea, number, slider, boolean, single_select, multi_select, date, datetime, email, phone, and json. A slider requires a validation.min and validation.max.
live_from and live_to bound the dates a question is asked; either can be null, and a null bound means the question is always live on that side. answer_ttl_days sets how long an answer stays valid before the question can be asked again. A null answer_ttl_days means the question is never re-asked once answered, which suits stable facts such as gender.
Versioning
Questions are versioned. Editing a question’s wording, type, or options creates a new immutable version and advances the question’s current version. Answers already captured stay pinned to the version that was active when they were given, so changing a question never rewrites historical responses. Link configuration is the exception: it lives on the question directly and is not versioned. Changing where answers are routed reroutes future submissions only. Past answers keep the destination they were written to.Questionnaires
A Questionnaire groups questions into a form. It has:- A
name, ahandle, and apurposethat callers use to find the right form for a context (for examplebookingfor an appointment form, orgeneral,survey,post_visit, andprofile_onboardingfor standalone forms). - An optional owner: a questionnaire can be attached to another object (such as an appointment definition), targeted at a specific profile, or float free as a global form.
- An ordered set of question slots, each pinning a specific question and version, with its own
mapping_key,sort_order, required flag, and optional visibility condition. - One or more pages for multi-step forms, plus visibility conditions that can reference earlier answers or profile attributes to show or hide questions dynamically.
Submissions
Each time a customer fills a form, Omneo records one submission capturing:- Which form and version was filled, and which profile filled it.
- The answerable: what the answers are about (a profile, a transaction, a product variant, or an appointment).
- A context object holding resolution hints such as a related transaction or staff member.
Routing answers
Every question declares alink_type that decides what happens to its answer once captured. This is what turns a survey response into a Rating, or a profile-update form into an actual profile change.
Routing runs after the submission is saved, and each answer is routed independently: one answer failing to route does not affect the others. An answer ends in one of three states:
mapped (the destination was written), skipped (nothing to write, for example a capture-only question), or failed (the write could not be applied).
Routing to profiles
Whenlink_type is profile, the link_target decides which part of the profile receives the answer:
A write policy controls whether an existing value is replaced:
This is how a profile-update questionnaire keeps a customer’s details current, and how a styling survey can populate appearance attributes or custom attributes without manual data entry.
How this relates to ratings
NPS, CSAT, and product or location ratings are all questionnaires whose questions route torating. The questionnaire is the capture mechanism; the Rating is the stored result that feeds aggregations and reactions. See the individual rating concepts for what each score measures.
Routing to rating always inserts a new Rating rather than updating an earlier one, so re-submitting a score for the same subject produces a second Rating. When you need a single current value, aggregate on the most recent Rating.