The data model
Form
A Form is the top-level container. It has a name, a slug (used in its public URL), and always has exactly one active Draft and zero or more Published Versions. You manage forms from the dashboard home. Opening a form takes you into the Studio, where you edit its draft.The form’s public URL is
yourdomain.com/v2/{slug}. The slug is set when you
create the form and can be changed in Settings.Node
A Node is a single step in a form. Nodes are the building blocks you arrange in the Studio. There are four node types:| Type | Purpose | Has outgoing edges? |
|---|---|---|
welcome | Opening screen before questions start | Yes |
question | Collects an answer from the respondent | Yes |
statement | Informational screen, no answer required | Yes |
end | Closing screen or redirect — terminates the session | No |
welcome node (the entry node) and at least one end node (the fallback end node). Every other node sits between them.
Question nodes have a question type — short text, multiple choice, rating, and so on. See Question types for the full list.
Graph
The Form Graph is the complete description of a form’s structure: all its nodes and all the edges connecting them. It is stored as a single JSON document and versioned atomically — when you publish, the entire graph is snapshotted. The graph has two special pointers:entry_node_id— which node respondents see firstfallback_end_node_id— where respondents land if no conditional edge matches
Edge
An Edge is a directed connection from one node to another. Edges define the flow — they tell the engine “after this node, go to that node”. Every node can have multiple outgoing edges. Edges are evaluated in priority order (lowest number first). The first edge whose condition is satisfied (or which has no condition) is followed.Condition
A Condition is an optional rule attached to an edge. When an edge has a condition, it is only followed if the condition evaluates totrue based on the respondent’s answers.
Conditions are built from rule groups:
equals, contains, greater_than, between, is_answered, is_skipped, and more.
See Conditional branching for the full condition builder reference.
Version
A Version is an immutable, published snapshot of the form graph. When you click Publish, Feedal freezes the current draft into a new version. Respondents always fill out a specific version — this means historical responses remain accurate even after you update the form.| Draft | Published Version | |
|---|---|---|
| Mutable | Yes — edits happen here | No — never changes |
| Respondents see it | No (preview only) | Yes |
| One per form | Yes | One per publish |
| Responses attached | No | Yes |
Session
A Session represents one respondent’s visit to a published form. It is created the moment someone opens the form URL and tracks:- Which version they are filling out
- Their current position in the graph
- The path of nodes they have visited (
traversal_path) - Status:
in_progress,completed, orabandoned - Metadata: IP address, user agent, referrer, source channel, device type, location
Node Response
A Node Response (or simply a Response) is a single answer recorded within a session — one per question the respondent answered. It stores:- The node it belongs to
- The answer value (type depends on the question type)
- Time spent on this question
- Score awarded (if scoring is enabled)
Screen nodes (
welcome, statement, end) do not produce Node Responses —
only question nodes do.Next steps
Quick start
Build and share your first form in 5 minutes.
Studio overview
Learn how the three-tab Studio is organized.
Question types
Explore all 18 question types.
Conditional branching
Build logic that adapts to each respondent’s answers.