# Собственная CRM & CDP

## Термины

* **Бот** – сущность на платформе Fasttrack, которая поддерживает работу с несколькими каналами: Telegram, VK, OK, FB, etc.
* **Чат** – непосредственный канал общения клиента из соц. сети/мессенджера с ботом на платформе.
* **Профиль** – клиент на платформе Fasttrack, у него может быть несколько чатов; привязываются по номеру телефона.

## Обмен ключами (опционально)

Fasttrack на своей стороне заводит глобальное приложение CDP. У приложения есть `client_id` и `client_secret`. Эти параметры выдаются платформе CDP/CRM.

Далее, CDP/CRM в своем личном кабинете для клиента выводит интеграцию с Fasttrack. Затем пользователь может на нее нажать и после процесс выглядит следующим образом:

1. Браузер переадресовывает пользователь на страницу авторизации Fasttrack

Пример URL:

{% code overflow="wrap" %}

```
<https://dashboard.fstrk.io/integrations/oauth/?client_id=XXX&redirect_uri=https://enkod.io/endpoint_xxx/&state=dummy&code=code>
```

{% endcode %}

* `client_id` и `client_secret` – ранее выданные ключи;
* `redirect_uri` – куда переадресовать пользователя;
* `state` – доп. значение, которое нужно передать в GET-параметрах для redirect\_uri;
* `code` – временный код.

2. На странице Fasttrack пользователь выбирает проект (чат-бот), который хочет авторизовать (у пользователя может быть их много);
3. Браузер переадресовывает юзера обратно на CDP.CRM, на URL переданный параметром `redirect_url` (пример:[https://CDP.io/api/auth/{uuid}/](https://CDP.io/api/auth/%7Buuid%7D/)), с добавлением ранее параметра `stage` и кода авторизации `code` –[https://CDP.io/api/auth/{uuid}/?stage={str}\&code={str}](https://CDP.io/api/auth/%7Buuid%7D/?stage=%7Bstr%7D\&code=%7Bstr%7D);
4. Бэкенд CDP/CRM обращается на бэкенд Fasttrack, обменивая временный код на постоянный `access_token`.

Пример POST запроса:

```json
{
   "client_id": "XXX",
   "client_secret": "YYY",
   "grant_type": "code",
   "code": "ПОЛУЧЕННЫЙ_КОД"
}
```

5. Затем CDP/CRM сохраняет полученный `access_token` в профиле клиента и все последующие запросы подписывает в заголовке \`Authorization: Bearer \<access\_token>

{% hint style="danger" %}
Фронтенд CDP/CRM ни в коем случае не ходит на бэкенд Fasttrack, все запросы должны через бэкенд CDP/CRM.
{% endhint %}

{% hint style="info" %}
Если выбирается вариант кастомной интеграции, то данный пункт можно не делать.
{% endhint %}

## Получение и отправка сообщений

Данная интеграция актуальна для CRM при необходимости для оператора/продавца вести переписку из профиля пользователя в CRM. Для интеграции с CDP это интеграция не нужна.

### Настройка webhook для событий/сообщений от пользователя

Пользователь может написать боту, затем это событие прилетит на указанный URL.

* **Endpoint:** <https://dashboard.fstrk.io/api/partners/integrations/credentials/>
* **HTTP-метод:** `PUT`

```json
{
   "webhook_url": "https://example.com/receive_webhook/{uuid}/"
}
```

Пример события, когда пишет клиент:

```json
{
  "event_type": "message_created",
  "payload": {
    "chat": {
      "uuid": "2220b01d-9d51-4006-bad5-857156444b06",
      "avatar": null,
      "platform": "Telegram",
      "phone": null,
      "name": "Иван Пупкин"
    },
    "profile": {
      "uuid": "9305e2f9-6ee8-4b97-9ef9-7f87f84c575c",
      "integrations": {}
    },
    "message": {
      "uuid": "048b22ae-7da6-4d43-b72b-6669a8b67d18",
      "type": "text",
      "text": "как дела?"
    },
    "session_title": null,
    "session_context": null,
    "session": {
      "title": null,
      "context": null,
      "team": {
        "id": 1303,
        "name": "Нераспределенные"
      }
    }
  },
  "timestamp": 1650891884304
}
```

Чтобы отключить посылку уведомлений, просто отправьте пустой `webhook_url`.

#### Настройка webhook для событий/сообщений от пользователя

Пользователь может написать боту, затем это событие прилетит на указанный URL.

* **Endpoint:** <https://dashboard.fstrk.io/api/partners/integrations/credentials/>
* **HTTP-метод:** `PUT`

```json
{
   "webhook_url": "https://example.com/receive_webhook/{uuid}/"
}
```

Пример события, когда пишет клиент:

```json
{
  "event_type": "message_created",
  "payload": {
    "chat": {
      "uuid": "2220b01d-9d51-4006-bad5-857156444b06",
      "avatar": null,
      "platform": "Telegram",
      "phone": null,
      "name": "Иван Пупкин"
    },
    "profile": {
      "uuid": "9305e2f9-6ee8-4b97-9ef9-7f87f84c575c",
      "integrations": {}
    },
    "message": {
      "uuid": "048b22ae-7da6-4d43-b72b-6669a8b67d18",
      "type": "text",
      "text": "как дела?"
    },
    "session_title": null,
    "session_context": null,
    "session": {
      "title": null,
      "context": null,
      "team": {
        "id": 1303,
        "name": "Нераспределенные"
      }
    }
  },
  "timestamp": 1650891884304
}
```

#### Вебхук когда пишет клиент из вне на платформу

Пример события:

```json
{
   "event_type": "message_created",
   "payload": {
      "chat": {
         "uuid": "b1c99ecb-76f8-4b22-9c1d-fb87f311e5e5",
         "avatar": "https://",
         "platform": "Telegram",
         "phone": null,
         "name": "Ivan Pupkin"
      },
      "profile": {
         "uuid": "007fddc5-c121-483f-9962-016c4952eedf"
      },
      "message": {
         "uuid": "5429be43-acc8-468c-9a79-b8b64b25bc53",
         "type": "text",
         "text": "Привет! Это сообщение прилетело из Телеграм-бота"
      },
      "session": {
         "title": null,
         "context": null,
         "team": {
            "id": 1,
            "name": "Нераспределенные"
         }
      }
   },
   "timestamp": 1678901065779
}
```

#### Вебхук когда оператор пишет клиенту

Пример события:

```json
{
   "event_type": "operator_replied",
   "payload": {
      "chat": {
         "uuid": "b1c99ecb-76f8-4b22-9c1d-fb87f311e5e5",
         "avatar": "https://",
         "platform": "Telegram",
         "phone": null,
         "name": "Ivan Pupkin"
      },
      "profile": {
         "uuid": "007fddc5-c121-483f-9962-016c4952eedf"
      },
      "message": {
         "type": "text",
         "text": "Привет сообщение от оператора.",
         "uuid": "6e4a6ad9-74e1-4b09-bdf0-2affe452519e"
      },
      "session": {
         "title": null,
         "context": null,
         "team": {
            "id": 1,
            "name": "Нераспределенные"
         },
         "operator": {
            "uuid": "ff713022-1ef3-49b9-8a71-83ea07295666",
            "name": "Operator 1",
            "avatar": null
         }
      }
   },
   "timestamp": 1678901061322
}
```

### Отправка сообщения пользователю через UUID чата

Если в п. 1.1 прилетело событие от подписчика, вы можете на него ответить, используя следующий формат:

* **Endpoint:** <https://dashboard.fstrk.io/api/partners/connector/>
* **HTTP-метод:** `POST`

```json
{
   "event": "message_created",
   "chat": {
      "uuid": "2220b01d-9d51-4006-bad5-857156444b06"
   },
   "message": {
      "type": "text",
      "text": "Привет, у меня все отлично!"
   },
   "sender": {
      "name": "Иван Пупкин"
   },
   "timestamp": 1624607235580
}
```

### Отправка PUSH-сообщения по профилю (UUID/номер телефона) для CDP

Предусловие. Настроенная интеграция по передаче информации профиля Fasttrack в CDP (настраивается на стороне Fasttrack кастомно или продуктизировано).

Отправить сообщение по UUID:

* **Endpoint:** <https://dashboard.fstrk.io/api/partners/push-messages/>
* **HTTP-метод:** `POST`

```json
{
   "profile": {
      "uuid": "00000000-0000-0000-0000-000000000000"
   },
   "content": {
      "type": "TEXT",
      "text": "Текст сообщения"
   }
}
```

Отправить сообщение по номеру телефона:

* **Endpoint:** <https://dashboard.fstrk.io/api/partners/push-messages/>
* **HTTP-метод:** `POST`

```json
{
   "profile": {
      "phone_number": "+79999999999"
   },
   "content": {
      "type": "TEXT",
      "text": "Текст сообщения"
   }
}
```

### Отправка платного сообщения WABA пользователю при инициации (написать первым) или за пределами 24-х часового окна для CDP и CRM

Предварительно шаблоны должны заведены быть на платформе Fasttrack и согласованы провайдером (в текущий момент поддерживаются EDNA и SMS Traffic).

* **Endpoint:** <https://dashboard.fstrk.io/api/partners/push-messages/>
* **HTTP-метод:** `POST`

```json
{
   "profile": {
      "phone_number": "+79999999999"
   },
   "content": {
      "type": "WHATSAPP_TEMPLATE",
      "whatsapp_template": {
         "pid": "hello_world"
      },
      "whatsapp_template_variables": {
         "v1": "Иван"
      }
   }
}
```

### Отправка сообщения используя “каскад” для CDP или CRM

Отправка одного запроса для отправки на несколько каналов пошагово.

* **Endpoint:** <https://cascades.fstrk.io/>
* **HTTP-метод:** `POST`

```json
{
   "phone_number": "79991234567",
   "routing": [
      "BOT",
      "WHATSAPP",
      "VIBER",
      "VK",
      "SMS"
   ],
   "validity_period_seconds": 120,
   "whatsapp_template_name": "hello_world",
   "whatsapp_template_variables": {
      "v1": "Иван"
   }
}
```

{% hint style="info" %}
Можно использовать независимо, в интеграцию, описанную в п. 1 «Обмен ключами», будет добавлено в ближайших спринтах.
{% endhint %}

### Список шаблонов WABA

Созданные и добавленные.

Данный сценарий не является необходимым для отправки шаблонов, может использоваться для визуализации шаблонов в CDP и CRM.

* **Endpoint:** <https://dashboard.fstrk.io/api/partners/whatsapp/templates/>
* **HTTP-метод:** `GET`

Пример ответа:

```json
{
   "count": 1,
   "next": null,
   "previous": null,
   "results": [
      {
         "provider_template_id": "test",
         "name": "test",
         "status": "NOT_WORKED",
         "sections": [
            "CHAT_CENTER",
            "BROADCAST_CAMPAIGNS",
            "CONSTRUCTOR"
         ],
         "text": "Hello: {{ v1 }}.",
         "variables": [
            "v1"
         ],
         "buttons": [
            {
               "text": "test"
            }
         ]
      }
   ]
}
```

### Доставка статусов WABA

Имеется возможность дополнительно в настройках в учетке Fasttrack установить специальный URL адрес, на который будут приходить статусы о доставках. Можно при необходимости добавить end-point в рамках интеграции (п.0)

Пример события:

```json
{
   "timestamp": 1651777267.2949505,
   "type": "update",
   "model": "message",
   "data": {
      "uuid": "7feeec45-8013-4757-afb2-6326b358082e",
      "status": "sent",
      "detail": null,
      "messages": [
         {
            "status": "undelivered",
            "error": "failed"
         }
      ]
   }
}
```

### Доставка статусов по каскадным отправкам

Позволяет получать статусы доставок, выполненные по цепочке. Посылка пакета со статусами происходит в том случае, когда транзакция завершается. Устанавливается вручную, через техническую поддержку.

Пример события:

```json
{
   "event_type": "transaction.done",
   "payload": {
      "uuid": "04191c1d-e7dd-4572-a544-6eb9c2855a5e",
      "done_at": "2022-05-05T18:41:00.831294Z",
      "done_status": "MESSAGE_SENT",
      "successful_routes": [
         "WHATSAPP"
      ],
      "route_details": {
         "BOT": {
            "uuid": "cfa41bcb-fdf6-4a34-a8a7-4334e5014bbc",
            "state": "ERROR",
            "response_status": null,
            "response_description": null
         },
         "WHATSAPP": {
            "uuid": "855d6d27-58d4-4ae4-9deb-de6c504cc845",
            "state": "SENT",
            "response_status": "DELIVERED",
            "response_description": null
         }
      }
   },
   "timestamp": 1651776060.8439758
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fstrk.io/knowledge_base/intagrations/custom_crm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
