Работа с API amoCRM у меня обычно начинается не с кода, а с ревизии воронки: смотрю, какие данные менеджеры переносят руками между сервисами, где теряются заявки и что из этого реально стоит вынести на автоматику. Часть задач - подключить вебхук, добавить поле в сделку через скрипт, настроить обмен с Telegram - закрывается своими силами за 2-3 дня. Другая часть требует отдельного сервера, очереди задач и постоянного мониторинга, и туда я обычно не советую лезть без опыта работы с REST API и OAuth2.
По теме статьи
Готовое решение
AI-чатбот для сайта на Claude - отвечает как ваш менеджер, работает 24/7
Подключу к вашему сайту чат-бота на Claude API. Бот отвечает на вопросы клиентов голосом вашего бренда, знает каталог и условия доставки, забирает лиды в CRM или Telegram.
от25 000 ₽
Автоматизация / n8n
Связка сервисов без программистов
Настройка n8n для связки ваших сервисов: CRM, email, Telegram, Google Sheets, API банков. Без ежемесячных платежей за Zapier.
от25 000 ₽
С чего начинается работа с API amoCRM
Доступ к API открывается через раздел Настройки - Интеграции - Создать интеграцию. Там же получаете client_id и client_secret, а после первой авторизации - access и refresh токены. Access токен живёт около суток, refresh токен переживает его больше года, но если им не пользоваться, привязка слетает и приходится проходить авторизацию заново через браузер аккаунта.
У amoCRM жёсткий лимит на запросы: около 7 в секунду на аккаунт. Для массовых операций (импорта тысячи контактов или пересчёта полей у всех сделок) лимит ощущается сразу: скрипт без очереди и задержек между запросами упирается в 429‑й ответ, и часть данных теряется молча, если не проверять код ответа.
Работать можно тремя способами: через REST API v4 напрямую, через вебхуки, которые amoCRM сама отправляет при смене статуса сделки или создании лида, и через виджеты с салесботами внутри интерфейса, без своего сервера, но с ограниченной логикой.
Для полей сделок и контактов нужно заранее выгрузить их id через список кастомных полей: имена полей в интерфейсе и id в API не совпадают, и это первая ошибка, с которой сталкиваются, когда пишут скрипт без предварительной выгрузки. Каждый из трёх способов закрывает свою по сложности задачу:
| Способ | Что решает | Порог входа |
|---|---|---|
| Встроенные интеграции (Tilda, плагин WooCommerce) | Передача лида со стандартными полями без разработки | Низкий, настройка в интерфейсе за 20-30 минут |
| Вебхуки и свой обработчик | Кастомные поля, смена стадии сделки, реакция на события | Средний, хватает хостинга с PHP и знания REST API |
| Сценарии в n8n | Связка amoCRM с десятками сервисов без своего бэкенда | Средний, логика собирается визуально |
| Свой скрипт под задачу (PHP или Python) | Массовые операции, дедупликация, сложная бизнес-логика | Высокий, нужен разработчик |
Приём заявок: интеграция amoCRM с сайтом и Tilda
Встроенная интеграция Tilda с amoCRM тянет только стандартные поля формы: имя, телефон, email и название страницы. Как только в форму добавляется калькулятор или мульти-степ с расчётом стоимости, стандартная связка перестаёт передавать эти данные в сделку, и менеджер видит лид без вводных.
Практика простая: форма отправляет данные не напрямую в amoCRM, а на серверную функцию, которая формирует запрос к комплексному методу создания лида с привязкой контакта и заполнением нужных полей. Это тот же принцип, что я использую в Tilda-скриптах для зон доставки или расчёта налогов: JS на странице собирает данные, сервер их валидирует и уже потом отправляет дальше.
Для WooCommerce ситуация похожая: готовый плагин синхронизации создаёт лид при заказе, но не различает склад, не обновляет статус при частичном возврате и не тянет связанные товары в отдельные поля. Если это нужно, дешевле и быстрее написать скрипт на WooCommerce REST API, который раз в несколько минут забирает новые заказы и обновляет сделки в amoCRM, чем донастраивать чужой плагин под нетиповой сценарий.
Автоматизация сделок через вебхуки amoCRM
Вебхуки настраиваются в том же разделе интеграции: указываете адрес и события, на которые реагировать - создание сделки, смена статуса, изменение ответственного. amoCRM шлёт POST с телом в формате form-data, а не JSON, это первое, на чём спотыкаются при первой интеграции: стандартный разбор JSON падает, нужно разбирать данные формы.
Пример обработчика на PHP, который при переходе сделки в статус «Оплата поступила» отправляет уведомление в Telegram-чат менеджера. Файл лежит на обычном хостинге рядом с сайтом, form-data от amoCRM PHP разбирает во вложенный массив сам:
<?php
$config = require __DIR__ . '/../config.php';
$status = $_POST['leads']['status'][0] ?? [];
$statusId = $status['status_id'] ?? '';
$leadId = $status['id'] ?? '';
if ($statusId === '142') {
$ch = curl_init('https://api.telegram.org/bot' . $config['bot_token'] . '/sendMessage');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 3,
CURLOPT_POSTFIELDS => [
'chat_id' => $config['chat_id'],
'text' => 'Сделка ' . $leadId . ' перешла в оплату',
],
]);
curl_exec($ch);
curl_close($ch);
}
http_response_code(200);
Тот же обработчик на Python (Flask) беру, когда у клиента уже крутится свой Python-сервис и вебхук логично встроить в него. Ради одного вебхука отдельный VPS не поднимаю: это настройка, обновления, сертификат и ежемесячная оплата.
from flask import Flask, request
import requests
app = Flask(__name__)
TELEGRAM_TOKEN = "your-bot-token"
CHAT_ID = "123456789"
@app.route("/amocrm/webhook", methods=["POST"])
def amocrm_webhook():
data = request.form.to_dict(flat=False)
status_id = data.get("leads[status][0][status_id]")
lead_id = data.get("leads[status][0][id]")
if status_id == ["142"]:
text = f"Сделка {lead_id[0]} перешла в оплату"
requests.post(
f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage",
json={"chat_id": CHAT_ID, "text": text},
)
return "", 200
Дальше по такому же принципу вешаются любые сценарии: постановка задачи ответственному, запись во внутреннюю таблицу для аналитики, пуш в очередь на отгрузку. Обработчик должен отвечать быстро, за секунду-две, иначе amoCRM считает вебхук неотработанным и повторяет отправку, а на стороне сервера начинают копиться дубли.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Синхронизация amoCRM с оплатой и доставкой
T‑Bank шлёт уведомление об успешном платеже на свой webhook-адрес отдельно от amoCRM. Задача обработчика - принять его, найти сделку по номеру заказа и обновить поле статуса оплаты, передвинув сделку по воронке. Без этого шага оплаченные заказы неделями висят на статусе ожидания, потому что менеджер физически не сверяет каждый платёж вручную.
С СДЭК логика зеркальная: у них есть вебхуки по статусам заказа - принят, в пути, вручён. Каждый такой статус пишется в таймлайн сделки, и менеджеру не нужно открывать личный кабинет СДЭК, чтобы понять, где посылка.
Оба сценария - это чистая передача статуса из внешней системы в поле или заметку amoCRM, без хранения персональных данных клиента вне самой CRM. Если для промежуточных расчётов заводите отдельную базу или таблицу, держите её на сервере в России, а не в зарубежном облаке: персональные данные клиентов не должны утекать за периметр.
amoCRM и Telegram: боты на aiogram и уведомления менеджерам
Помимо уведомлений в готовый чат, часто нужен полноценный бот, который сам создаёт лиды, например, когда клиент оставляет заявку прямо в Telegram, а не на сайте. На aiogram это делается через машину состояний: бот собирает имя, телефон, задачу в несколько шагов, а на последнем отправляет запрос на создание лида с привязкой контакта по идентификатору Telegram, который сохраняется в кастомное поле.
Обратная синхронизация работает так же через вебхуки: когда менеджер отвечает клиенту через комментарий в сделке, обработчик ловит событие и дублирует текст в тот же Telegram-чат. Это закрывает частый запрос, чтобы менеджер не переключался между CRM и мессенджером.
Что не стоит делать своими силами
- Массовый импорт контактов без дедупликации. amoCRM не блокирует создание дублей по номеру телефона на уровне API, и без предварительной проверки в базе за месяц накапливаются сотни повторов.
- Высоконагруженные сценарии с десятками вебхуков в минуту и интеграцией с несколькими внешними системами одновременно. Без очереди и повторных попыток скрипт на голом сервере рано или поздно захлёбывается и теряет события молча.
- Мультиаккаунтные интеграции с собственной авторизацией, когда одно решение подключается к amoCRM у разных клиентов. Тут нужно продумывать хранение и обновление токенов для каждого аккаунта отдельно, и ошибка в этой части ломает интеграцию у всех клиентов разом, а не у одного.
Если задача выходит за рамки простого вебхука и обновления поля, проще заказать разработку кастомной интеграции с amoCRM целиком, чем чинить самописный скрипт, который начал терять сделки через полгода после запуска.
Частые вопросы
Сколько стоит подключить amoCRM к сайту через API
Простая доработка, например передача одного дополнительного поля из формы, стоит от 3 000 ₽. Комплексная интеграция с оплатой, статусами доставки и кастомными полями сделки обходится от 40 000 ₽, срок обычно одна-две недели в зависимости от количества сценариев.
Можно ли обойтись стандартными виджетами amoCRM без программирования
Для типовых сценариев да: приём формы со стандартными полями, базовые триггеры в воронке, готовые интеграции с Tilda или WooCommerce справляются без единой строчки кода. Как только появляются кастомные поля, нетиповая логика статусов или связка с внешней оплатой и доставкой, виджетов не хватает и нужен отдельный обработчик.
Что будет, если превысить лимит запросов к API amoCRM
Сервер отвечает кодом ошибки 429, и часть запросов просто не выполняется. Если скрипт не проверяет код ответа и не делает повторных попыток с задержкой, данные теряются без видимой ошибки: сделка не создаётся, а в логах всё выглядит так, будто запрос ушёл. При массовых операциях нужна очередь с паузой между пачками запросов.
Нужно ли хранить контакты клиентов из amoCRM на отдельном сервере
Если для интеграции заводится промежуточная база, например для сверки заказов между WooCommerce и amoCRM, она должна располагаться на сервере в России, это требование о локализации персональных данных. Использовать для этого зарубежные сервисы не стоит, даже если это временное хранилище на время миграции.