Двусторонний обмен WooCommerce и AmoCRM: заказы, статусы, контакты
Заказ на сайте становится сделкой, стадия в CRM возвращает статус в магазин — без дублей и ручного копирования.
AmoCRM, PHP, Python, REST API, WooCommerce, очереди
Я делал двустороннюю интеграцию интернет-магазина на WooCommerce с AmoCRM: заказ на сайте становился сделкой в воронке, смена стадии в CRM возвращала статус заказа в магазин. Источник правды по оплате — WooCommerce, по работе менеджера — воронка AmoCRM.
Я написал синхронизирующий сервис, а не набор «webhook → создай сделку». Очередь задач, идемпотентность по order_id / deal_id, дедупликация контактов по нормализованному телефону и email. Повторная оплата или двойной webhook не плодили вторую сделку.
Я спроектировал маппинг сущностей: заказ → сделка, позиции → состав и примечание, покупатель → контакт + компания, статусы оплаты/доставки → стадии воронки. Кастомные поля AmoCRM (состав, трек-номер, способ доставки, UTM) заполнял через API, без ручного копирования менеджером.
Я закрыл гонки и конфликты: если менеджер двинул сделку, а покупатель в ту же секунду сменил адрес на сайте — применял правила merge (какие поля пишет магазин, какие только CRM). Для лимитов AmoCRM API сделал backoff, батчи и повтор упавших запросов; битые события уходили в dead-letter с логом для разбора.
Я повесил webhooks с обеих сторон и fallback-опрос (cron), если webhook потерялся. Написал журнал обмена: что ушло, что пришло, код ответа, повтор. Стек: PHP/Python, WooCommerce REST, AmoCRM REST, очереди, PostgreSQL. NDA: магазин и аккаунт CRM не публикуются.