Разработка · 7 мин чтения

Работа с API amoCRM: что автоматизировать своими силами

Работа с API amoCRM у меня обычно начинается не с кода, а с ревизии воронки: смотрю, какие данные менеджеры переносят руками между сервисами, где теряются заявки и что из этого реально стоит вынести на автоматику. Часть задач - подключить вебхук, добавить поле в сделку через скрипт, настроить обмен с Telegram - закрывается своими силами за 2-3 дня. Другая часть требует отдельного сервера, очереди задач и постоянного мониторинга, и туда я обычно не советую лезть без опыта работы с REST API и OAuth2.

С чего начинается работа с 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, она должна располагаться на сервере в России, это требование о локализации персональных данных. Использовать для этого зарубежные сервисы не стоит, даже если это временное хранилище на время миграции.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно