> ## Documentation Index
> Fetch the complete documentation index at: https://docs.feedal.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Core concepts

> The fundamental building blocks of Feedal — forms, nodes, versions, sessions, and conditions.

Understanding a handful of concepts makes the rest of Feedal click immediately. This page covers each building block, what it does, and how they connect.

## The data model

```mermaid theme={null}
graph TD
    Form["Form\n(e.g. Customer Survey)"]
    Draft["Draft\n(work in progress)"]
    Version["Published Version\n(immutable snapshot)"]
    Graph["Form Graph"]
    Node["Nodes\nwelcome · question · statement · end"]
    Edge["Edges\n(connections between nodes)"]
    Condition["Conditions\n(branch on answers)"]
    Session["Session\n(one respondent's visit)"]
    Response["Node Response\n(one answer per question)"]

    Form --> Draft
    Form --> Version
    Version --> Graph
    Graph --> Node
    Graph --> Edge
    Edge -->|optional| Condition
    Session -->|"linked to version"| Version
    Session --> Response
    Response -->|"linked to"| Node
```

***

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

<Note>
  The form's public URL is `yourdomain.com/f/{slug}`. The slug is set when you
  create the form and can be changed in Settings.
</Note>

***

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

A form must have at least one `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](/building-forms/questions/text) 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 first
* **`fallback_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.

<Tip>
  One outgoing edge with no condition acts as the **default route** — it always
  matches and is typically placed last (highest priority number).
</Tip>

***

## 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 to `true` based on the respondent's answers.

Conditions are built from **rule groups**:

```
Condition
└── groups (evaluated with AND or OR between them)
    └── rules (each rule: variable · operator · value)
```

A **variable** is typically a node ID — it refers to the answer the respondent gave to that question. Operators include `equals`, `contains`, `greater_than`, `between`, `is_answered`, `is_skipped`, and more.

See [Conditional branching](/building-forms/workflow/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                |

<Warning>
  Publishing does not replace the draft. After publishing, the draft continues
  to exist and you can keep editing it independently.
</Warning>

***

## 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`, or `abandoned`
* Metadata: IP address, user agent, referrer, source channel, device type, location

Sessions can be browsed and inspected individually in the [Responses](/results/responses) tab of the Results hub.

***

## 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)

<Note>
  Screen nodes (`welcome`, `statement`, `end`) do not produce Node Responses —
  only `question` nodes do.
</Note>

***

## Next steps

<CardGroup cols={2}>
  <Card title="Quick start" icon="rocket" href="/getting-started/quickstart">
    Build and share your first form in 5 minutes.
  </Card>

  <Card title="Studio overview" icon="pencil" href="/building-forms/studio/overview">
    Learn how the three-tab Studio is organized.
  </Card>

  <Card title="Question types" icon="list-check" href="/building-forms/questions/text">
    Explore all 18 question types.
  </Card>

  <Card title="Conditional branching" icon="code-branch" href="/building-forms/workflow/branching">
    Build logic that adapts to each respondent's answers.
  </Card>
</CardGroup>
