# 🆔 Идентификация и омниканальный профиль

Gravity Field обеспечивает создание **Единого Профиля Клиента**, объединяя данные из разных источников: Web, Mobile App и оффлайн покупки.

В этом разделе описаны механизмы идентификации, роль различных ID и технические детали склейки профилей.

---

## 🕵️ Как мы узнаем пользователя?

На базовом уровне платформа присваивает каждому посетителю **внутренний идентификатор (UID)**. Он используется для отслеживания поведения в рамках одного устройства или браузера.

### Web (Cookies)
В браузере используются следующие cookie:

- **`_slid`**: Основной идентификатор пользователя (Client-side).
- **`_slid_server`**: Серверный идентификатор (Server-side), используется для поддержки ITP и долгосрочного хранения.
- **`_slsession`**: Идентификатор текущей сессии.

### API / Mobile App
При работе через API или SDK используется параметр `uid` (или `slid` в некоторых запросах). Если `uid` не передан, сервер сгенерирует новый UID.

---

## 🔄 Как работает омниканальность (Склейка профилей)?

Чтобы объединить профили с разных устройств (ноутбук, телефон, планшет), используется **CUID (Customer User ID)**.

1. Пользователь совершает **вход/регистрацию** на сайте или в приложении.
2. Отправляется событие `login-v1` или `signup-v1`.
3. В свойствах события (`props`) передается `cuid` и `cuidType`. **В качестве CUID рекомендуется использовать хеш номера телефона.**
4. Платформа находит все профили с этим `cuid` и объединяет их с текущим анонимным профилем (`uid`).

### Зачем это нужно?

Требуется для реализации ключевых бизнес-сценариев:

*   **Объединение профилей из разных источников:** Однозначная связка, что пользователь на сайте (Web) и в мобильном приложении (Mobile App) — это один и тот же человек.
*   **ROPO (Research Online, Purchase Offline):** Отслеживание совершения офлайн-покупки и связывание её с онлайн-историей пользователя.
*   **Интеграция с CDP и CVM:** Обеспечение единого ключа для обмена данными и сегментами в двустороннем порядке.
*   **Обмен сегментами:** Использование сегментов маркетинга и лояльности для таргетинга в Gravity Field (например, для показа персональных VIP-кампаний).

В результате история действий на новом устройстве "приклеивается" к единому профилю клиента.

### Валидация событий
Для событий `login-v1` и `signup-v1` на сервере действует строгая валидация. В `props` **обязательно** должно присутствовать хотя бы одно из полей:
*   `cuid` (вместе с `cuidType`)
*   `hashedEmail`

Если ни одного из них нет, API вернет ошибку `422 Unprocessable Entity`.

---

## ⚙️ Техническая разница между user.id и cuid

В Server-Side API интеграции часто возникает путаница между двумя параметрами: `user.id` (в блоке `user`) и `cuid` (в свойствах событий). Это **разные сущности** с разным назначением.

### 1. user.id (extUid) — "Ключ поиска или автогенерации"

Это идентификатор пользователя в вашей системе (внутренний ID, ID из CRM), который вы передаете в **блоке `user`** (параметр `id`). Он используется для поиска существующего внутреннего профиля.

**Возможные сценарии использования:**

1.  **Автоматическое управление (без user.id):**
    Если вы не передаете `user.id` и не передаете `uid`, платформа автоматически создаст нового пользователя и вернет его `uid` (в объекте `session.sl`). Этот `uid` необходимо сохранить (в cookie или локальном хранилище) и передавать в последующих запросах.
2.  **Использование внешнего ID:**
    Если у вас есть свой идентификатор, вы можете передавать его в `user.id`. В этом случае платформа будет искать профиль по этому значению.
    **Важно:** При использовании `user.id` вы также должны самостоятельно управлять сессиями, передавая `session.custom` (ваш ID сессии), чтобы обеспечить непрерывность истории.

### 2. cuid — "Атрибут профиля"

Это устойчивый идентификатор клиента (хеш телефона, email), который хранится в профиле.

*   **Назначение:** Склейка профилей и кросс-девайс трекинг.
*   **Как задается:** Передается в свойствах (`props`) событий `login-v1` или `signup-v1`.

---

## ❓ FAQ
**Q: Какой `cuidType` использовать?**
A: Рекомендуемый тип — `phone_hash` (SHA-256 хеш нормализованного телефона). Это обеспечивает наилучшую склейку профилей.

**Q: Что будет, если пользователь почистит куки или зайдёт в режиме инкогнито — мы сможем его узнать?**  
A: Базовый анонимный идентификатор (`slid` в Web и `uid` в App/API) хранится в cookie/локальном хранилище и привязан к конкретному браузеру/устройству. Если пользователь очищает куки, использует режим инкогнито или заходит с нового браузера, для него создаётся новый анонимный профиль. Как только он авторизуется и вы передадите `cuid` в событиях `login-v1`/`signup-v1`, история новых визитов будет "приклеена" к единому омниканальному профилю.

**Q: У нас уже есть собственная система авторизации на сайте. Можно ли использовать наш ID вместо отдельного `cuid`?**  
A: Формально можно, но **рекомендуется использовать именно хеш телефона в качестве `cuid`**. Внутренний ID на сайте часто не совпадает с идентификаторами в CDP, CRM или офлайн-системах, поэтому по нему будет сложно надёжно склеивать профили между каналами. Хеш телефона даёт стабильный, кросс-системный идентификатор.

**Q: Что произойдёт в браузерах, которые ограничивают работу cookie (Chrome, Safari с ITP и т.п.) — не сломается ли идентификация?**  
A: Gravity Field использует в первую очередь **first‑party cookie** на вашем домене, поэтому в стандартных режимах работы браузера идентификация сохраняется. В условиях жёстких ограничений (ITP, приватный режим, корпоративные политики) срок жизни и стабильность cookie могут уменьшаться — в таких случаях особенно важно использовать `cuid` и/или `user.id` при авторизации, чтобы восстанавливать связь с профилем даже при потере анонимного идентификатора.

**Q: У одного пользователя два устройства или два браузера. Значит ли это, что у него будет два разных профиля?**  
A: На уровне анонимного трекинга действительно будут разные `slid`/`uid` для каждого устройства или браузера. Но как только пользователь авторизуется на каждом из них с одним и тем же `cuid`, Gravity Field склеит соответствующие анонимные профили в единый омниканальный профиль клиента.
