---
title: "Use Case 7b: CSAT / NPS після діалогу"
description: "Оцінка кнопками 1/3/5, INTEGER у Custom Data, chat_closed_alias, audit connect-блоків."
---

# Use Case 7b: Оцінка після діалогу (CSAT / NPS)

**Рівень:** базовий · **Модулі:** Scenario Builder, Custom Data · **Actions:** `custom_modules__set`, опційно `statistic__set`

## Необхідні права та доступ

| Що потрібно | Де в меню | Навіщо |
|-------------|-----------|--------|
| **Scenario Builder** | Меню → Scenario Builder | CSAT-секція, connect з `chat_closed_alias` |
| **Custom Data** | Меню → Custom Data | Модель `feedback_scores`, поле INTEGER |

Якщо розділу немає в меню — перевірте права облікового запису або зверніться до підтримки ConnectiveOne.

## Бізнес-контекст

Після завершення діалогу з оператором (або самообслуговування) бот просить оцінити якість обслуговування і зберігає результат. Типова вимога: оцінка **лише кнопками**, вільний текст не потрапляє в INTEGER-поле.

## Очікуваний результат

- Entry у секцію CSAT через alias після закриття діалогу (`chat_closed` / `exit_*`).
- Клієнт обирає оцінку кнопками 1 / 3 / 5 (або ваш набір).
- Оцінка зберігається в Custom Data (поле типу **INTEGER**).
- Вільний текст замість кнопки **не** потрапляє в INTEGER-поле (edge `error` або validation).
- Опційно: `statistic__set` для платформенної статистики.

## Архітектура flow

```text
[Connect blocks] chat_closed_alias → exit_csat
   → send-message-keyboard (1 / 3 / 5)
        ├─ кнопки → custom_modules__set (rate: INTEGER)
        ├─ source-handle → Router / validation (НЕ напряму в __set)
        └─ error на __set → «Оберіть оцінку кнопкою»
   → (опційно) statistic__set
   → «Дякуємо за оцінку»
```

## Зв'язок з іншими налаштуваннями

Alias закриття діалогу (`chat_closed_alias` / `exit_*`) задається в connect-блоці і має збігатися в **усіх** гілках connect у сценарії. Закриття діалогу ініціює вхід у CSAT-секцію — це поведінка операторського контуру + сценарію разом.

Рекомендується мати connect з [Use Case 3](/uk/learn/implementer/training/basic/use-case-03-handoff-to-operator.md) перед налаштуванням CSAT.

→ [Connect to operator node](/uk/scenariobuilder/explanation/connect-to-operator-node.md)

## Покрокова реалізація

### Крок 0. Custom Data — модель оцінок

Custom Data → **Нова модель** `feedback_scores`:

| Поле | Тип | Alias |
|------|-----|-------|
| Оцінка | **INTEGER** | `rate` |
| Канал | text | `channel` |
| Коментар | text | `comment` *(опційно)* |

Тип **INTEGER** для `rate` — обов'язково; free-text у це поле викличе помилку запису.

---

### Крок 1. Connect-блоки — єдиний exit alias

У **кожному** `operator_panel__connect_to_operator_with_msg` (і інших connect, якщо є):

| node_params | Значення | Навіщо |
|-------------|----------|--------|
| `chat_closed_alias` | `exit_csat` | Після закриття діалогу — вхід у CSAT-секцію |

**Audit (self-check):** пройдіть усі connect-блоки в сценарії — alias однаковий; немає дубльованого alias entrypoint у CSAT-секції.

---

### Крок 2. Entry alias — секція CSAT

1. Секція з **точкою входу** `exit_csat`.
2. `send-message-keyboard`: «Оцініть обслуговування» + кнопки `1`, `3`, `5`.

| Параметр | Навіщо |
|----------|--------|
| `validation.type` | `none` лише якщо source-handle **від'єднано** або захищений |
| Edges на кожну кнопку | → `custom_modules__set` з `feedback_scores:rate` = значення кнопки |

**Критично:** edge **source-handle** (fallback для вільного тексту) — **не** вести напряму в `custom_modules__set`. Варіанти:

- Від'єднати source-handle.
- Або → Router / повторне питання / validation.

---

### Крок 3. Action — `custom_modules__set`

| node_params | Значення |
|-------------|----------|
| `module_name` | `feedback_scores` |
| `set_to` | `feedback` |
| constants | `feedback_scores:rate` з кнопки, `feedback_scores:channel` = `{{channel}}` |

**Edges:** `success` → подяка · `error` → «Не вдалося зберегти оцінку» + перевірити тип поля.

---

### Крок 4 (опційно). `statistic__set`

Якщо інстанс використовує платформенну статистику CSAT — додайте action після успішного запису в CD згідно з [довідником actions](/uk/actionjail/reference/actions-reference.md).

---

### Крок 5. Канали без keyboard

Перевірте `supportedMessengers` на ноді keyboard: для email / каналів без кнопок — окрема гілка (текстова оцінка з validation або пропуск CSAT).

## Критерії приймання (self-check Runs)

- [ ] У Runs: після CSAT-питання надіслати **текст** замість кнопки → не edge success на `__set`; немає помилки типу INTEGER.
- [ ] Кнопки 1/3/5 → запис у CD, ID у constants.
- [ ] Audit connect: однаковий `chat_closed_alias` у всіх блоках.
- [ ] Немає дубльованого alias `exit_csat` у двох секціях.
- [ ] Edge **error** на `custom_modules__set` підключений.
- [ ] source-handle **не** веде напряму в `__set` з INTEGER-полем.

## Типові помилки

| Симптом | Причина | Що зробити |
|---------|---------|------------|
| Помилка типу INTEGER | Free-text у `rate` | Захистити source-handle, validation |
| CSAT не запускається | Різні `chat_closed_alias` | Audit усіх connect-блоків |
| Дубль entry | Два `exit_csat` у секціях | Залишити один entrypoint |
| Запис OK, статистика порожня | Немає `statistic__set` | Додати опційно за docs |

## Пов'язана документація

- [use-custom-modules-set](/uk/customdata/how-to/use-custom-modules-set.md)
- [FAQ — CSAT / NPS](/uk/learn/implementer/training/reference/faq.md)
- [Use Case 3 — connect](/uk/learn/implementer/training/basic/use-case-03-handoff-to-operator.md)
- Далі: [Use Case 8 — секція-макрос](/uk/learn/implementer/training/basic/use-case-08-macro-section.md)
