Содержание ТЗ
10. ТЗ на коннекторы топ-5 сервисов
ТЗ на коннекторы Tilda, Bitrix24, amoCRM, Telegram и Google Sheets: вход, выход, лимиты и приёмка.
Версия: 0.1 Дата: 18.10.2026 Основание: главная страница Albato (albato.ru) и её блоки «Новые интеграции». На главной продвигаются, в частности: Tilda → Битрикс24, Google Sheets → Telegram, amoCRM, Telegram, VK, Яндекс Формы. Для первой волны выбраны пять сервисов, которые чаще всего встречаются в этих сценариях и в каталоге easy-connect:
- Tilda — источник заявок.
- Bitrix24 — приёмник лидов/сделок и источник CRM-событий.
- amoCRM — приёмник лидов/сделок и источник CRM-событий.
- Telegram — приёмник уведомлений и источник сообщений.
- Google Sheets — приёмник строк и источник новых строк.
Документ описывает что именно коннектор получает и передаёт, какие поля поддерживает, как авторизуется и какие ограничения учитывает. Точные пути, лимиты и названия методов перед реализацией сверяются с актуальной документацией провайдера: API меняются.
1. Сводная матрица
| Сервис | Роль в easy-connect | Авторизация | Входящие данные | Исходящие данные | Приоритет |
|---|---|---|---|---|---|
| Tilda | Источник | Секретный webhook | Заявки форм, UTM, page, formid | — (только приём) | P0 |
| Bitrix24 | Приёмник + источник | OAuth 2.0 / inbound webhook | Лиды, сделки, контакты, задачи (события) | Создание лида, сделки, контакта, комментария | P0 |
| amoCRM | Приёмник + источник | OAuth 2.0 | Сделки, контакты, задачи (вебхуки) | Создание сделки/контакта, примечание | P0 |
| Telegram | Приёмник + источник | Bot token | Сообщения, callback-кнопки | Сообщение, фото/документ (P1) | P0 (приёмник), P1 (источник) |
| Google Sheets | Приёмник + источник | OAuth 2.0 | Новые строки (polling) | Добавление/обновление строки | P0 |
2. Общие требования к коннекторам
2.1. Контракт
Каждый коннектор реализует манифест и методы из
06-connectors.md:
auth: OAuth 2.0 / token / bot_token / webhook;triggers: типыwebhook,polling,schedule;actions: одно действие = одна функция;outputSchema/inputSchemaс типами иsemantic;allowedHostsи rate limit;sampleи фикстуры;- contract-тесты.
2.2. Нормализация
Внутренний payload приводит внешние поля к каноническим:
name, phone, email, message, amount, order_id,
text, row, source, page, utm_*, created_at
Правила:
- телефоны — E.164, email — lower-case;
- даты — ISO 8601 UTC;
- пустые строки не считаются значением;
- вложенные объекты сохраняются в
rawдля диагностики (с маскированием); - PII маскируется в логах и UI.
2.3. Webhook-приём
- Поддержать
application/jsonиapplication/x-www-form-urlencoded(Tilda исторически отправляет form-urlencoded). - Ограничение тела — 1 МБ.
- Секретный URL: 32+ байта энтропии, в БД только хеш.
- Подпись/секрет — если провайдер поддерживает; иначе секретный URL + rate limit + проверка через API.
- Ответ 2xx быстро, обработка асинхронно.
- Дедупликация:
transactionid,update_id,event_idили HMAC payload.
2.4. OAuth
- state + PKCE (если поддерживается), проверка state на callback;
- refresh-токен за 5 минут до истечения;
invalid_grant→needs_reauth, пауза зависимых активаций;- минимальные scopes;
- шифрование токенов AES-256-GCM;
- хранение домена/account id (amoCRM, Bitrix24);
- ротация и отзыв.
2.5. Ошибки и лимиты
| Тип | Retry | Действие |
|---|---|---|
| 401/403 | Нет | needs_reauth, пауза, уведомление |
| 429 | Да, по Retry-After | backoff + jitter |
| 5xx / timeout | Да, до 5 попыток | circuit breaker |
| 400/422 | Нет | показать поля и текст ошибки |
| Лимит провайдера | Да, позже | понизить частоту, предупредить |
2.6. Наблюдаемость и приёмка
- Метрики: latency, error rate, 429, reauth, queue.
- Healthcheck каждые 5 минут.
- Contract-тесты: успех, 401, 429, 5xx, timeout, невалидные поля.
- Sandbox-аккаунт и фикстуры.
- Приёмка: тестовый запуск в кабинете + run succeeded + понятная ошибка при неверном токене.
3. Tilda
3.1. Роль
Источник заявок из форм на сайте. Tilda не используется как приёмник в MVP: её API предназначен для управления проектами/страницами, а не для создания лидов в CRM.
3.2. Авторизация
- Отдельная авторизация не нужна: пользователь вставляет webhook URL в настройках формы Tilda.
- URL должен быть уникальным и непредсказуемым; в БД хранится хеш.
- Дополнительно можно запросить у пользователя
formid/formskeyдля фильтрации, но MVP принимает все формы проекта.
3.3. Входящие данные (trigger new_lead)
Tilda отправляет POST при отправке формы. Content-Type может быть
application/x-www-form-urlencoded или JSON — поддержать оба.
Типовые поля:
| Поле Tilda | Смысл | Каноническое |
|---|---|---|
Name | Имя | name |
Phone | Телефон | phone |
Email | email | |
Comment | Комментарий | message |
formid | ID формы | form_id |
formname | Название формы | form_name |
transactionid / tranid | ID отправки | event_id |
payment | Данные оплаты (если есть) | amount (после парсинга) |
utm_source, utm_medium, utm_campaign, utm_content, utm_term | UTM | utm_* |
referer | Источник | source_url |
page | Страница | page_url |
formskey | Ключ формы | form_key |
Пример (form-urlencoded):
Name=Иван&Phone=%2B7+999+123-45-67&Email=ivan%40example.com
&Comment=Интересует+курс&formid=form1&transactionid=123456789
&utm_source=yandex&utm_medium=cpc
3.4. Ограничения и особенности
- Нет подписи запроса; защита — секретный URL, rate limit, проверка размера.
- Tilda может отправлять повторно при сбое; дедупликация по
transactionid/tranidобязательна. - Поля могут быть пустыми; обязательных полей на стороне Tilda нет.
- Названия полей зависят от настроек формы; поддержать case-insensitive
алиасы и
raw. - Телефон может быть в свободном формате — нормализовать.
- HTML/скрипты в комментарии — экранировать при отправке в Telegram/CRM.
3.5. Сценарии easy-connect
- Tilda → Telegram
- Tilda → Bitrix24
- Tilda → amoCRM
- Tilda → Google Sheets
- Tilda → Email/SMS
3.6. Приёмка
- Отправить тестовую форму Tilda.
- Webhook принят, поля нормализованы.
- Дубликат с тем же
transactionidне создаёт второй run. - Пустой телефон не ломает маппинг.
- Комментарий с HTML безопасно отображается в Telegram.
4. Bitrix24
4.1. Роль
Приёмник лидов, сделок, контактов и комментариев; источник событий CRM.
4.2. Авторизация
Два варианта:
- OAuth 2.0 (рекомендуется для продукта):
- приложение Bitrix24 (локальное/облачное), client_id, client_secret;
- redirect URI —
https://easy-connect.ru/api/v1/connections/oauth/bitrix24/callback; - scopes:
crm, при необходимостиtasks,user; - access token + refresh token, domain и
member_idпортала.
- Inbound webhook (для быстрого подключения):
- пользователь создаёт входящий webhook в Bitrix24;
- URL вида
https://{portal}/rest/{user_id}/{token}/; - проще, но хуже UX и сложнее отзыв.
MVP: OAuth; inbound webhook — как резервный режим.
Токены:
- access token живёт ~1 час, refresh — до 30 дней (уточнить в docs);
- хранить
domain,member_id,client_endpoint,server_endpoint; - refresh через
https://oauth.bitrix.info/oauth/token/; invalid_grant→ reauth.
4.3. Исходящие действия
create_lead — создать лид
crm.lead.add.json
| Поле | Обязательность | Примечание |
|---|---|---|
TITLE | Да (рекомендуется) | Название лида |
NAME | Нет | Имя |
LAST_NAME | Нет | Фамилия |
PHONE | Нет | Массив [{VALUE, VALUE_TYPE:"WORK"}] |
EMAIL | Нет | Массив [{VALUE, VALUE_TYPE:"WORK"}] |
COMMENTS | Нет | Комментарий |
SOURCE_ID | Нет | Источник (WEB, CALL, ...) |
STATUS_ID | Нет | Статус лида |
ASSIGNED_BY_ID | Нет | Ответственный |
UF_CRM_* | Нет | Кастомные поля |
CURRENCY_ID | Нет | Валюта |
OPPORTUNITY | Нет | Сумма |
Ответ: { "result": 123, "time": {...} }.
create_deal — создать сделку
crm.deal.add.json — поля TITLE, STAGE_ID, CATEGORY_ID, OPPORTUNITY,
CURRENCY_ID, CONTACT_ID, COMPANY_ID, ASSIGNED_BY_ID,
UF_CRM_*.
create_contact — создать контакт
crm.contact.add.json — NAME, LAST_NAME, PHONE, EMAIL, COMMENTS.
add_timeline_comment — комментарий в таймлайн
crm.timeline.comment.add — ENTITY_ID, ENTITY_TYPE (lead/deal),
COMMENT.
4.4. Входящие события
Варианты:
- Event bind (
event.bind) наONCRMLEADADD,ONCRMLEADUPDATE,ONCRMDEALADD,ONCRMDEALUPDATE,ONCRMCONTACTADD. Payload содержитdata[FIELDS][ID],auth[domain],auth[member_id]. После события коннектор делаетcrm.lead.get/crm.deal.getи отдаёт нормализованные поля. - Polling
crm.lead.listс фильтром>DATE_CREATEиorder. Использовать, если event bind недоступен.
Типовые поля лида: ID, TITLE, NAME, LAST_NAME, STATUS_ID,
SOURCE_ID, ASSIGNED_BY_ID, OPPORTUNITY, CURRENCY_ID, DATE_CREATE,
PHONE, EMAIL, COMMENTS, UF_CRM_*.
4.5. Лимиты
- Ориентир: ~2 запроса/сек на пользователя (облако), burst ограничен.
- Ошибки
QUERY_LIMIT_EXCEEDED,OVERLOAD_LIMIT, HTTP 503. - Использовать batch (
batch) для массовых операций. - 429/503 — backoff с jitter, не более 5 попыток.
- Учитывать
Retry-After, если есть.
4.6. Безопасность
- Минимальные scopes; не запрашивать лишнее.
- Проверять
member_id/domain при callback. - Не логировать токены и телефоны.
- Проверять, что сущность принадлежит тому же порталу, перед обновлением.
4.7. Приёмка
- OAuth-подключение портала.
- Создание лида с именем, телефоном, email, комментарием.
- Ошибка 401 → reauth, связка на паузе.
- Событие
ONCRMLEADADDсоздаёт run и передаёт поля. - 429 не теряет событие: retry/backoff.
- Кастомные поля не ломают маппинг, если не выбраны.
5. amoCRM
5.1. Роль
Приёмник сделок/контактов и источник CRM-событий.
5.2. Авторизация
- OAuth 2.0, интеграция в amoMarket.
client_id,client_secret,redirect_uri.- Токен-эндпоинт:
https://{subdomain}.amocrm.ru/oauth2/access_token. - Access token ~24 часа, refresh token ~3 месяца (проверить актуальные сроки).
- Хранить
subdomain,account_id, токены; refresh заранее. - Scopes:
crm, при необходимостиnotifications,tasks. invalid_grant→ reauth.
5.3. Исходящие действия
create_lead — создать сделку (+ контакт)
POST /api/v4/leads/complex — создаёт сделку и контакт одним запросом.
[
{
"name": "Заявка с сайта",
"price": 5000,
"pipeline_id": 1234567,
"status_id": 12345678,
"responsible_user_id": 1234567,
"_embedded": {
"contacts": [
{
"first_name": "Иван",
"custom_fields_values": [
{ "field_code": "PHONE", "values": [{ "value": "+79991234567", "enum_code": "WORK" }] },
{ "field_code": "EMAIL", "values": [{ "value": "ivan@example.com", "enum_code": "WORK" }] }
]
}
]
}
}
]
Альтернатива: POST /api/v4/leads + POST /api/v4/contacts + связывание.
add_note — примечание к сделке
POST /api/v4/leads/{lead_id}/notes с note_type: "common" и params.text.
create_task (P1)
POST /api/v4/tasks — entity_id, entity_type, text, complete_till.
5.4. Входящие события
- Вебхуки amoCRM настраиваются в интеграции/через API:
add_lead,update_lead,add_contact,update_contact,add_task,update_task. - Payload содержит
account[subdomain],leads[add][0][id],leads[add][0][status_id]и т. п. - После вебхука коннектор запрашивает сущность через API v4 и нормализует.
- Проверка: вебхук не подписан; использовать секретный URL + сверять
account[subdomain]с подключением. Для критичных действий — повторно запросить сущность. - Polling
GET /api/v4/leads?filter[created_at][from]=...— резервный режим.
Типовые поля сделки: id, name, price, pipeline_id, status_id,
responsible_user_id, created_at, updated_at, custom_fields_values
(PHONE, EMAIL, UTM_SOURCE, ...), _embedded.contacts.
5.5. Лимиты
- Ориентир: ~7 запросов/сек на аккаунт, burst; уточнять.
- 429 с
Retry-After; backoff. - Batch-эндпоинты для массовых операций.
- Не более 1 запроса на одно событие; кэшировать pipeline/status.
5.6. Безопасность
- Минимальные scopes.
- Проверка subdomain/account_id.
- Токены только в зашифрованном виде.
- Не логировать телефоны/email; маскировать.
5.7. Приёмка
- OAuth-подключение аккаунта.
- Создание сделки с контактом, телефоном и email.
- Примечание к сделке.
- Вебхук
add_leadсоздаёт run. - 401 → reauth, пауза.
- 429 → backoff, без потери события.
6. Telegram
6.1. Роль
Приёмник уведомлений (основной сценарий) и источник сообщений (P1).
6.2. Авторизация
- Bot token от
@BotFather. - Проверка
getMe; хранитьbot.id,username. - Для webhook —
setWebhookсsecret_token(X-Telegram-Bot-Api-Secret-Token). - Токен шифруется; при 401 — reauth.
6.3. Исходящие действия
send_message
POST https://api.telegram.org/bot{token}/sendMessage
| Поле | Обязательность | Примечание |
|---|---|---|
chat_id | Да | ID чата/канала или @username |
text | Да | До 4096 символов |
parse_mode | Нет | HTML / MarkdownV2 |
disable_notification | Нет | Тихий режим |
protect_content | Нет | Запрет пересылки |
reply_parameters | Нет | Ответ на сообщение |
Ответ: result.message_id.
send_photo / send_document (P1)
sendPhoto/sendDocument — файл по URL или multipart/form-data.
Ограничения: фото 10 МБ, документ 50 МБ (уточнять).
6.4. Входящие события (P1)
getUpdates(long polling) или webhook.- Типы:
message,edited_message,callback_query. - Поля:
update_id,message.message_id,chat.id,from.id,from.first_name,text,date,entities,reply_to_message. - Дедупликация по
update_id. - Игнорировать сообщения ботов (если не нужно иное).
- Webhook secret обязателен; иначе любой может отправить update.
6.5. Лимиты
- ~30 сообщений/сек суммарно; ~1 сообщение/сек в один чат.
- 429 с
retry_after; уважать. - Текст 4096 символов; caption 1024.
- HTML/Markdown — экранировать пользовательские данные.
6.6. Безопасность
- Токен не логировать.
- Проверять
chat_id(не отправлять в чужие чаты). parse_mode+ пользовательский текст = риск HTML-инъекции; экранировать.- Webhook secret + HTTPS.
6.7. Приёмка
- Подключение бота,
getMe. - Тестовое сообщение в чат.
- 401 → reauth.
- 429 → retry с
retry_after. - Webhook secret проверяется.
- Дубликат
update_idне создаёт второй run.
7. Google Sheets
7.1. Роль
Приёмник строк (append/update) и источник новых строк (polling).
7.2. Авторизация
- Google Cloud project + OAuth 2.0 client.
- Scopes:
https://www.googleapis.com/auth/spreadsheets— чтение и запись;https://www.googleapis.com/auth/spreadsheets.readonly— только источник;https://www.googleapis.com/auth/drive.metadata.readonly— список таблиц.
- Access token ~1 час, refresh token долгоживущий.
- Хранить
refresh_token, scopes, email аккаунта. invalid_grant→ reauth.
7.3. Исходящие действия
append_row
POST https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{range}:append?valueInputOption=USER_ENTERED&insertDataOption=INSERT_ROWS
{
"values": [["2026-10-18", "Иван", "+79991234567", "ivan@example.com", "Заявка"]]
}
Поля:
| Поле | Обязательность | Примечание |
|---|---|---|
spreadsheetId | Да | Из URL таблицы |
range | Да | Лист, например Заявки!A:E |
values | Да | Массив строк/ячеек |
valueInputOption | Нет | USER_ENTERED по умолчанию |
insertDataOption | Нет | INSERT_ROWS |
update_row (P1)
PUT .../values/{range}?valueInputOption=USER_ENTERED — требует знать
строку/диапазон; в MVP не обязательно.
7.4. Входящие события
- У Google Sheets нет нативных вебхуков для «новая строка».
- Основной режим — polling:
GET .../values/{range}каждые 1–5 минут;- хранить
last_row/курсор на активацию; - сравнивать с предыдущим снимком по ключу (например,
row_number+ hash); - первая синхронизация — только новые строки после активации (по умолчанию).
- Альтернатива — Google Apps Script
onEdit→ webhook easy-connect (требует установки скрипта пользователем; P1). - Заголовки: первая строка листа используется как имена полей; если её нет —
col_A,col_B, ... - Пустые строки пропускаются.
7.5. Лимиты
- Ориентир: 300 запросов/мин на проект, 60/мин на пользователя (проверять квоты Google Cloud).
- 429/403 quota exceeded → backoff, снижение частоты.
- Не более 10 млн ячеек на таблицу.
- Записи батчить, если несколько строк.
7.6. Безопасность
- Минимальные scopes; не запрашивать Drive полностью.
- Хранить refresh token в шифрованном виде.
- Проверять, что таблица доступна пользователю.
- Не логировать содержимое строк (PII).
7.7. Приёмка
- OAuth-подключение Google.
- Append строки в тестовую таблицу.
- Polling находит новую строку и создаёт run.
- Повторный polling не создаёт дубль.
- 429 → backoff.
- Отзыв доступа → reauth.
8. Какие данные передаём и получаем (сводно)
| Направление | Tilda | Bitrix24 | amoCRM | Telegram | Google Sheets |
|---|---|---|---|---|---|
| Получаем | заявки, UTM, formid, page | лиды/сделки/контакты, ID, статусы, суммы, телефоны, email | сделки/контакты, ID, статусы, суммы, телефоны, email, примечания | сообщения, chat_id, from, text, update_id | строки таблицы, заголовки, номера строк |
| Передаём | — | лид, сделка, контакт, комментарий | сделка+контакт, примечание, задача | сообщение, фото/документ (P1) | append/update строки |
| Ключевые ID | transactionid | lead/deal/contact ID, member_id | lead/contact ID, account_id | chat_id, message_id, update_id | spreadsheetId, range |
| Дедуп | transactionid | event ID | event ID + entity ID | update_id | row number + hash |
9. Сценарии easy-connect (маппинг в каталог)
| Связка | Источник | Приёмник | Приоритет |
|---|---|---|---|
| Tilda → Telegram | заявка | сообщение | P0 |
| Tilda → Bitrix24 | заявка | лид | P0 |
| Tilda → amoCRM | заявка | сделка+контакт | P0 |
| Google Sheets → Telegram | новая строка | сообщение | P0 |
| Google Sheets → Bitrix24 | новая строка | лид | P1 |
| Bitrix24 → Telegram | новый лид | сообщение | P1 |
| amoCRM → Telegram | новая сделка | сообщение | P1 |
| Telegram → Google Sheets | сообщение | строка | P1 |
| Telegram → Bitrix24/amoCRM | сообщение | лид/сделка | P2 |
10. План реализации
| Этап | Работа | Оценка |
|---|---|---|
| 1 | Tilda source: webhook JSON/form, нормализация, дедуп | 5–7 дней |
| 2 | Telegram target: sendMessage, 429, secret webhook | уже есть; 2–3 дня на P1 source |
| 3 | Google Sheets: OAuth, append, polling | 8–10 дней |
| 4 | amoCRM: OAuth, leads/complex, webhooks | 10–12 дней |
| 5 | Bitrix24: OAuth, crm.lead.add, event.bind | 10–12 дней |
| 6 | Contract-тесты, health, документация, ревью | 5–7 дней |
Итого: 6–8 недель на 5 коннекторов с учётом тестов и модерации OAuth.
11. Открытые вопросы
- Актуальные лимиты Bitrix24/amoCRM/Google Sheets на дату реализации.
- Требования модерации OAuth-приложений и сроки.
- Нужен ли Tilda API для создания/обновления страниц (вне MVP).
- Нужны ли вложения (фото/документы) в Telegram и файлы в Sheets.
- Политика хранения payload с PII: 7 дней для тел, 90 дней для метаданных.
- Подпись вебхуков: у Tilda/amoCRM её нет — компенсировать секретным URL и проверкой через API.
- Стоимость и квоты Google Cloud при росте.
12. Definition of Done для каждого коннектора
- Манифест и схемы полей.
- Авторизация и refresh/reauth.
- Минимум один триггер и одно действие.
- Нормализация и дедупликация.
- Обработка 401/429/5xx/timeout.
- Contract-тесты и фикстуры.
- Healthcheck и метрики.
- Инструкция «где взять токен/доступ».
- Тестовый запуск в кабинете.
- Ревью безопасности.