На платформе есть три способа что-то запомнить о пользователе или сохранить значение по ходу диалога — атрибут, тег и переменная. Каждый разбирали отдельно (см. «Атрибуты профиля и теги: в чём разница и как это работает» и «Переменные в платформе: что это такое и когда их использовать»), но на практике вопрос обычно один: «а какой из трёх мне тут нужен?». Вот сводная таблица и короткое правило выбора.
Сравнение
| Атрибут | Тег | Переменная | |
| Нужно создавать заранее в настройках | Да (кроме системных: имя, телефон, почта, external id) | Нет | Нет |
| Хранит значение | Да, типизированное | Нет — только сам факт наличия | Да, любое |
| Виден в профиле клиента | Да | Да | Нет |
| Участвует в фильтрации чатов и сегментации аудитории | Да | Да | Нет |
| Где живёт | В профиле, постоянно | В профиле, постоянно | Внутри процедуры — save_variable в рамках всего проекта, set только на время текущей процедуры |
| Где используется | Сценарии, чат-центр, аудитория, рассылки | Сценарии, чат-центр, аудитория, рассылки | Только внутри процедур (DTL-код) |
Когда что брать
Атрибут — когда нужно значение, которое потом пригодится за пределами одного диалога: подставить в текст, сравнить в условии, использовать для сегментации аудитории. Атрибут доступен везде на платформе.
Тег — когда нужно просто пометить профиль без значения, и сделать это быстро, не заводя ничего в настройках заранее. Тоже виден везде и тоже участвует в сегментации — просто без значения, только по факту наличия.
Переменная — когда данные нужны только для логики внутри процедуры и наружу выходить не должны. Ни в профиле, ни в фильтрах, ни в чат-центре её не видно — это чисто техническая, временная сущность.
Короткое правило
Если значение должно быть видно за пределами процедуры (в профиле, в фильтре, в другом сценарии) — это атрибут или тег, не переменная. Между атрибутом и тегом выбор такой же, как в статье про них: есть значение — атрибут, просто факт — тег. Если данные нужны только на время выполнения текущей логики процедуры — берите переменную.