---
title: "Key concepts"
description: "Edges, Router/switch, mock API, categorizer, broadcast, Instance Agent — read the subsection before the matching Use Case."
---

# Key platform concepts

**Do not read the whole file at once** — only the subsection before the matching Use Case.

| Subsection | When to read |
|------------|--------------|
| [Edge-driven flow](#edge-driven-flow) | Before **Use Case 2** and later |
| [Branching: Router / switch](#router-branching) | Before **Use Case 2** (optional), **Use Case 4**, **Use Case 10** |
| [AI Assistant and Knowledge base](#instance-agent) | Before **Use Case 1**; reminder after UC-1…4 |
| [Mock vs production API](#mock-vs-production-api) | Before **Use Case 4** |
| [Categorizer pattern](#categorizer-pattern) | Before **Use Case 10** |
| [Broadcast vs scenario entry](#broadcast-vs-scenario-entry) | Before **Use Case 11** |

**Dialog variables vs Registered Users** — in [Use Case 6](/en/learn/implementer/training/basic/use-case-06-registered-users.md).

---

## Edge-driven flow {#edge-driven-flow}

ConnectiveOne is **edge-driven**: after an Action, execution follows the **branch (edge)** you connected on the canvas.

| Node type | Must handle |
|-----------|-------------|
| **Action** (API, custom) | `success` + **`error`** |
| **operator_panel__connect_to_operator_with_msg** | **`success`** + **`limit`** + **`error`** |
| **registered_users__get** | **`success`** + **`error`** |
| **action_fastline_pro** | AI reply + **fallback** |
| **action_tickets_create** | **`success`** + **`error`** |
| **Router** / **`switch`** | each rule + **default** / `else` |
| **MessageKeyboard** | each button or **default** |

**Principle:** a scenario must not end without a message to the client. If an edge is not connected — the bot can go “silent” (see [Use Case 9](/en/learn/implementer/training/basic/use-case-09-scenario-audit.md)).

→ [Built-in actions](/en/scenariobuilder/reference/standard-built-in-actions.md)

---

## Branching: Router / switch {#router-branching}

| Approach | When to use |
|----------|-------------|
| **Edges from MessageKeyboard** | Button menu — a separate edge per button + **default** for free text |
| **Router** (`action_router`) | Branching by a **variable** after saving a choice or API; `first_match` mode + **default branch** |
| **Action `switch`** | The same in an Action node — convenient for JSON / imported scenarios |

**In training:** for a variable (`user_choice`, `ticket_category`, `crm_data`) build a **Router** or **`switch`**, not the legacy `if_else` action.

> In older scenarios you may see **`if_else`** — the logic is the same (conditions + `else`), but for new flows prefer Router.

→ [Conditional branches (Router)](/en/scenariobuilder/explanation/router-node.md) · [Built-in actions — switch](/en/scenariobuilder/reference/standard-built-in-actions.md)

---

## AI Assistant and Knowledge base {#instance-agent}

| Tool | Where | Why in training |
|------|-------|-----------------|
| **Knowledge base** (Fast Line Pro) | Fast Line Pro → Knowledge base | Documents for FAQ (Use Case 1); wait for indexing |
| **AI Assistant (Instance Agent)** | “Spark” icon in Scenario Builder | Node explanations; optionally — rebuild UC **after** manual implementation |

**Rule:** build the Use Case **by hand** → self-check in Runs → optionally the same UC via Agent and compare. The Agent **does not** replace the first pass.

→ [What is AI Assistant](/en/constructor/explanation/what-is-ai-assistant.md) · [FAQ — Instance Agent](/en/learn/implementer/training/reference/faq.md#ai-assistant-instance-agent)

---

## Mock vs production API {#mock-vs-production-api}

For **Use Case 4**, a **mock API** is enough — you do not need a real CRM.

| Approach | When | Example |
|----------|------|---------|
| **Public mock** | Training, first integrations | [JSONPlaceholder](https://jsonplaceholder.typicode.com/) |
| **Webhook inspector** | See the request | [webhook.site](https://webhook.site/) |
| **Instance Settings + URL** | CRM simulation with a token | `training_api_token` + mock URL |
| **Production CRM** | Real project | After the basic level |

→ [Action Jail — integrations](/en/actionjail/how-to/integrator-embed-actions.md)

---

## Categorizer pattern {#categorizer-pattern}

**Input:** free-form client text.  
**Output:** category or `subject_alias`.

1. Fast Line Pro (Chatbot) + [categorizer prompt](/content/en/learn/implementer/training/scenarios/prompts/categorizer-training.txt)
2. `action_fastline_pro` → variable `ticket_category`
3. **Router** / **`switch`** → map to ticket subject

**Use Case 10:** categorizer before `action_tickets_create`.

---

## Broadcast vs scenario entry {#broadcast-vs-scenario-entry}

| Path | When |
|------|------|
| **Alias entry** + Broadcast template | Use Case 11 — one-time/mass broadcast |
| **`action_broadcast__subscribe`** | Subscribe to a topic |
| **`send_after` / `one_time`** | Delayed / one-time delivery |

The alias must match **exactly** between the scenario and the template.

→ [Configure broadcast alias](/en/broadcast/how-to/configure-broadcast-alias.md)

---

## Reference materials

- [Actions glossary](/en/learn/implementer/training/reference/actions-glossary.md)
- [FAQ](/en/learn/implementer/training/reference/faq.md)
- [Testing matrix](/en/learn/implementer/training/reference/testing-matrix.md)
- [When it is not the scenario](/en/learn/implementer/training/reference/when-not-scenario.md)
