Kommo + Payoneer: международные платежи из воронки без ручного выставления счетов

При правильной интеграции Kommo отправляет платёжный запрос через Payoneer в момент перехода сделки на этап «Счёт выставлен», а после подтверждения оплаты автоматически двигает карточку дальше. Менеджер не заходит в Payoneer вручную, финансовый контроллер не сверяет Excel-таблицы.

Для B2B-компаний, работающих с клиентами в США, Европе и Азии, Payoneer - основной инструмент получения международных платежей. Проблема в том, что Kommo не имеет нативной интеграции с Payoneer, а сторонние коннекторы через Zapier не дают нужной глубины: платёжный статус не обновляется в реальном времени, история транзакций не попадает в хронологию сделки.

EU B2B-компании, работающие с клиентами за пределами SEPA, часто выбирают Payoneer именно из-за удобства мультивалютных переводов и низкой комиссии по сравнению с банковским SWIFT. Но при выигрыше сделки в Kommo инициировать платёжный запрос в Payoneer - это всегда ручной шаг: открыть платформу, найти нужного payee, ввести сумму и валюту, скопировать payment ID обратно в CRM. При 50-100 транзакциях в месяц это 10-20 часов менеджерского времени только на рутинные операции. В этой статье разберём кастомную интеграцию, которая запускает платёжный запрос автоматически при смене этапа в воронке Kommo и синхронизирует статус обратно в карточку сделки.

Почему нативная интеграция не работает

Payoneer - платёжная платформа для получения международных B2B-платежей, mass payouts и управления мультивалютными балансами. По состоянию на Q2 2026 Payoneer не предоставляет готового виджета или плагина для Kommo.

Запрос через Zapier выглядит логично, но сталкивается с несколькими ограничениями:

  • Payoneer API требует серверной авторизации через OAuth 2.0 - Zapier не умеет хранить refresh token между запросами надёжно
  • Webhook от Payoneer о статусе платежа (COMPLETED, FAILED, PENDING) нужно слушать на вашем сервере - Zapier не является стабильным webhook endpoint для production нагрузки
  • Комиссии Zapier при объёме 200+ транзакций в месяц делают решение дороже кастомной разработки

Make (бывший Integromat) справляется немного лучше с webhook, но проблема маппинга остаётся: Payoneer оперирует понятиями «payer», «program», «payment batch», которые не соответствуют объектной модели Kommo (сделка, контакт, компания).

Что реализовывается - архитектура решения

Кастомная интеграция строится на трёх компонентах:

  1. Webhook-слушатель на вашем сервере принимает события от Kommo (смена этапа воронки)
  2. Payoneer API-клиент создаёт платёжный запрос и возвращает payment ID
  3. Обратный webhook от Payoneer обновляет поле сделки и добавляет заметку в хронологию
Kommo (этап изменён)
        |
        v
  Ваш сервер (webhook handler)
        |
        v
  Payoneer API (create payment request)
        |
        v
  Payoneer -> Ваш сервер (payment status webhook)
        |
        v
  Kommo API (обновить сделку + заметка)

Поля сделки в Kommo, задействованные в интеграции:

  • payoneer_payment_id - кастомное поле, хранит ID транзакции
  • payment_status - PENDING / COMPLETED / FAILED
  • payment_amount - сумма в валюте платежа
  • payment_currency - USD / EUR / GBP

Технические детали

Payoneer API v4 использует OAuth 2.0 с client credentials flow. Токен выдаётся на 3600 секунд, после чего нужен refresh. Ваш сервер должен кэшировать access token и обновлять его заблаговременно.

import requests
import time

class PayoneerClient:
    def __init__(self, client_id, client_secret, program_id):
        self.client_id = client_id
        self.client_secret = client_secret
        self.program_id = program_id
        self.base_url = "https://api.payoneer.com/v4"
        self._token = None
        self._token_expires = 0

    def _get_token(self):
        if time.time() < self._token_expires - 60:
            return self._token
        resp = requests.post(
            f"{self.base_url}/oauth2/token",
            data={
                "grant_type": "client_credentials",
                "client_id": self.client_id,
                "client_secret": self.client_secret,
                "scope": "read write"
            }
        )
        resp.raise_for_status()
        data = resp.json()
        self._token = data["access_token"]
        self._token_expires = time.time() + data["expires_in"]
        return self._token

    def create_payment_request(self, payee_id, amount, currency, description):
        headers = {"Authorization": f"Bearer {self._get_token()}"}
        payload = {
            "program_id": self.program_id,
            "payee_id": payee_id,
            "amount": amount,
            "currency": currency,
            "description": description,
            "payment_method": "bank_transfer"
        }
        resp = requests.post(
            f"{self.base_url}/payments",
            json=payload,
            headers=headers
        )
        resp.raise_for_status()
        return resp.json()["payment_id"]

Пошаговая реализация

Шаг 1. Настройте Payoneer Developer Account

Войдите в Payoneer Partner Portal, создайте приложение и получите client_id, client_secret. Запишите program_id вашего аккаунта - он нужен для создания платежей.

Шаг 2. Создайте webhook endpoint в Kommo

В разделе «Интеграции» Kommo создайте новый webhook, указав URL вашего сервера. Подпишитесь на событие leads.status - оно срабатывает при смене этапа воронки.

Шаг 3. Разверните обработчик событий

from flask import Flask, request, jsonify
import hmac, hashlib

app = Flask(__name__)
payoneer = PayoneerClient(
    client_id="YOUR_CLIENT_ID",
    client_secret="YOUR_CLIENT_SECRET",
    program_id="YOUR_PROGRAM_ID"
)

KOMMO_BILLING_STAGE_ID = 12345678  # ID этапа «Счёт выставлен»

@app.route("/kommo/webhook", methods=["POST"])
def kommo_webhook():
    data = request.json
    for lead_update in data.get("leads", {}).get("status", []):
        lead_id = lead_update["id"]
        new_stage = lead_update["status_id"]
        if new_stage == KOMMO_BILLING_STAGE_ID:
            handle_billing_stage(lead_id)
    return jsonify({"ok": True})

def handle_billing_stage(lead_id):
    lead = kommo_api.get_lead(lead_id)
    payee_id = lead.custom_fields.get("payoneer_payee_id")
    amount = lead.custom_fields.get("payment_amount")
    currency = lead.custom_fields.get("payment_currency", "USD")
    
    payment_id = payoneer.create_payment_request(
        payee_id=payee_id,
        amount=float(amount),
        currency=currency,
        description=f"Invoice for deal #{lead_id}"
    )
    
    kommo_api.update_lead(lead_id, {
        "payoneer_payment_id": payment_id,
        "payment_status": "PENDING"
    })
    kommo_api.add_note(lead_id, f"Payoneer payment request создан. ID: {payment_id}")

Шаг 4. Настройте входящий webhook от Payoneer

В Payoneer Partner Portal укажите URL для status webhook: https://yourserver.com/payoneer/status. Payoneer отправляет POST-запрос при каждом изменении статуса платежа.

@app.route("/payoneer/status", methods=["POST"])
def payoneer_status():
    data = request.json
    payment_id = data["payment_id"]
    status = data["status"]  # COMPLETED, FAILED, PENDING
    
    # Найти сделку по payment_id
    lead = kommo_api.find_lead_by_field("payoneer_payment_id", payment_id)
    if not lead:
        return jsonify({"error": "Lead not found"}), 404
    
    kommo_api.update_lead(lead["id"], {"payment_status": status})
    
    if status == "COMPLETED":
        kommo_api.move_to_stage(lead["id"], PAID_STAGE_ID)
        kommo_api.add_note(lead["id"], 
            f"Payoneer: оплата получена. Сумма: {data['amount']} {data['currency']}")
    elif status == "FAILED":
        kommo_api.add_note(lead["id"], 
            f"Payoneer: платёж отклонён. Причина: {data.get('failure_reason', 'unknown')}")
    
    return jsonify({"ok": True})

Шаг 5. Добавьте кастомные поля в Kommo

В настройках Kommo создайте кастомные поля для сделки: payoneer_payee_id (текст), payoneer_payment_id (текст), payment_status (список: PENDING/COMPLETED/FAILED), payment_amount (число), payment_currency (список: USD/EUR/GBP). Привяжите поля к нужным этапам воронки для удобного отображения.

Реальный кейс с цифрами

Digital-агентство из Берлина, работающее с клиентами в США и Австралии, обрабатывало 80-120 международных платежей в месяц. До интеграции цикл выставления счёта занимал:

  • Ручное открытие Payoneer: 3-5 минут
  • Поиск нужного payee и ввод суммы: 5-7 минут
  • Копирование payment ID в CRM: 2-3 минуты
  • Ручная проверка статуса через 2-3 дня: 10-15 минут в неделю суммарно

Итого: 10-15 минут на каждый счёт + регулярный мониторинг. При 100 платежах в месяц - около 20 часов менеджерского времени.

После внедрения кастомной интеграции Exceltic.dev:

  • Платёжный запрос создаётся автоматически при переходе этапа: 0 минут ручной работы
  • Статус COMPLETED обновляет сделку и двигает её дальше: 0 минут
  • Менеджер видит историю платежей в хронологии карточки без захода в Payoneer

Экономия: 18-20 часов в месяц. Плюс устранена ошибка, которая встречалась 2-3 раза в квартал: менеджер забывал обновить статус в CRM и сделка зависала на этапе «Ожидает оплаты» неделями.

О том, как правильно настроить воронку в Kommo CRM, включая этапы для работы с платежами, читайте в отдельном материале.

Для кого подходит

Интеграция Kommo и Payoneer актуальна для:

  • Агентств и фрилансеров, работающих с международными клиентами и получающих оплату в иностранной валюте
  • SaaS-компаний, у которых часть клиентов платит через банковский перевод, а не карту
  • Сервисного B2B с долгим циклом сделки, где между выставлением счёта и оплатой проходит 2-4 недели
  • Компаний с объёмом от 50 транзакций в месяц, где ручная работа становится узким местом

Если вы работаете с подписочной моделью и нужна рекуррентная биллинг-логика - посмотрите на интеграцию Kommo с Chargebee или Recurly. Для разовых платежей картой внутри CRM лучше подойдёт Stripe. Payoneer оптимален именно для международных B2B-переводов.

Об остальных функциях Kommo CRM и возможностях автоматизации читайте в обзорной статье.

Часто задаваемые вопросы

Payoneer поддерживает API для создания платёжных запросов?

Да. Payoneer предоставляет REST API v4 с поддержкой создания платежей, получения статусов и настройки webhook-уведомлений. API документация доступна на developer.payoneer.com. Для доступа нужно зарегистрироваться как Payoneer Partner и пройти верификацию аккаунта, что обычно занимает 3-5 рабочих дней.

Как интеграция обрабатывает разные валюты?

Payoneer поддерживает мультивалютные платежи: USD, EUR, GBP, JPY и другие. В кастомном поле сделки в Kommo указывается валюта платежа, которая передаётся в API при создании запроса. Конвертация происходит на стороне Payoneer по актуальному курсу. Менеджер видит сумму в исходной валюте в карточке сделки.

Что происходит если webhook от Payoneer не дошёл?

Правильная архитектура предусматривает idempotency: webhook endpoint отвечает 200 даже при повторной доставке одного события. Дополнительно настраивается cron-задача, которая раз в час опрашивает статус незакрытых платежей через Payoneer API и синхронизирует его с Kommo. Это гарантирует актуальность данных даже при временных сбоях delivery.

Можно ли настроить автоматическое напоминание клиенту об оплате?

Да. После создания платёжного запроса интеграция может запускать автоматизацию Kommo: отправить email или SMS-напоминание через 3 и 7 дней если статус остаётся PENDING. Это делается через кастомные интеграции в Kommo CRM - стандартная автоматизация Kommo триггерится по смене кастомного поля.

Сколько занимает разработка интеграции?

Типовой проект Kommo + Payoneer с базовым функционалом (создание платёжного запроса, обновление статуса, заметки в хронологии) занимает 2-3 недели. Более сложные сценарии - mass payouts, мультивалютная логика, интеграция с бухгалтерской системой - требуют 4-6 недель.


Если вы работаете с международными платежами через Payoneer и хотите убрать ручную работу из процесса - опишите задачу команде Exceltic.dev. Разберём архитектуру под ваш стек и оценим объём работ.

Ещё статьи

Все →