> For the complete documentation index, see [llms.txt](https://docs.fstrk.io/knowledge_base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.fstrk.io/knowledge_base/intagrations/custom_crm.md).

# Собственная 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
}
```
