Skip to content

Интеграции

Типовая интеграция IqDialer и CRM.

alt_text

Весь функционал IqDialer на 100% покрыт API. Управление работой производится с помощью API запросов.

После инсталяции настраивается система IqDialer (либо вносятся правки по требованию):

Загрузка контактов из CRM в IqDialer

CRM настраивается на стороне клиента.

CRM с помощью API запрашивает список кампаний https://demo.iqtek.ru/dialer/api/v1/docs#/campaigns/__call___campaigns_search_post и бакетов https://demo.iqtek.ru/dialer/api/v1/docs#/buckets/__call___buckets_search_post.

По определенной бизнес-логике (обычно это воронка и статус) CRM заливает лида в систему в указанные через external_id бакеты. Если у лида указан external_id, он в системе может быть только один.

Лиды могут загружаться:

Зная external_id над лидами можно производить разные действия https://demo.iqtek.ru/dialer/api/v1/docs#/leads. Например, изменить данные, пересоздать лида для повторного обзвона или удалить.

Обзвон

Операторы включают софтфоны и выставляют соответствующий статус. Оператору поступит вызов только при получении с телефонии статуса, свидетельствующего о его готовности к работе.

В соответствии с бизнес-логикой клиента в IqDialer настраиваются стратегии обзвона для каждой из кампаний.

В зависимости от выбранной стратегии звонок может поступать:

  • Сначала лиду. При успешном дозвоне звонок поступает оператору.
  • Сначала оператору. При успешом дозвоне звонок поступает лиду.

Настройка нотификаторов

В процессе обзвона из IqDialer в сторону CRM настраиваются нотификаторы или провайдеры уведомлений (web_hook, websoket, rabbtmq). Примеры данных и событий приведены чуть ниже.

Через нотификаторы можно получать события о:

  • Звонке. Дайлер отправляет webhook CRM о том, что произошел дозвон.
  • Операторе. В Дайлере настраиваются коды пауз, с помощью которых можно устанавливать статусы операторов.
  • Процессе обработки лида. CRM отправляет webhook дайлеру о результате звонка (нужно или нет перезванивать лиду). CRM открывает карточку оператору, происходит разговор, оператор выставляет статус в CRM. Также в CRM можно поставить задачу на определенное время, которая является тригером для отправки по API лида в Дайлер с указанием времени. Это пересоздает лид с новыми данными. В случае, если перезвон нужен, а время перезвона не определено, это настраивается переносом лида в другую воронку.

Нотификаторы

Типы нотификаторов

Последовательность отправки событий в процессе совершения вызова

В версии 3.7.0 были добавлены небольшие изменения в наименования событий.

Для стратегий с участием операторов:

alt_text

Для стратегий без участия оператора:

alt_text

Примеры событий

Звонки

  • Начало вызова. Отправляется в момент начала вызова (отправки вызова к клиенту).
{
    "event": 'call:start',
    "timestamp": '2025-08-26 14:00:00',
    "data": {
        'campaign': {
            'id': '7a673f3e-ae0c-43d6-b725-649b63d89cd0',
            'external_id': null,
            'name': 'informer_ts_stage-2',
            'priority': 50,
            'strategy': 'informer',
        } if event.campaign else {},
        'bucket': {
            'id': '28edcaa6-3c8b-4b78-9ceb-aacb2eea5f73',
            'external_id': 'test_with_operator',
            'name': 'test_with_operator',
            'priority': 0,
        } if event.lead and event.lead.bucket else {},
        'lead': {
            'id': '42426873-25eb-44f3-88e3-6c7f9b54e132',
            'external_id': null,
            'name': 'TEST',
            'priority': 100,
            'timezone': 3,
            'data': {},
            'status': 'INITIALIZE',
            'attempts': 1,
            'attempts_current_campaign': 1,
            'attempts_current_scheduler_rule': 1,
        } if event.lead else {},
        'lead_selected_data': {
            'phone': {
                'id': 'e2270f69-92e9-44de-ac86-d40117740a52',
                'external_id': null,
                'priority': 1,
                'type': 'mobile',
                'phone': '8923036250',
            },
            'route': {
                'id': '13eb5398-a986-463a-9113-b06378538498',
                'external_id': 'all_to_FreePbx',
                'name': 'all_to_FreePbx',
            },
            'cid': null,
            'agent': {
                'id': '3ddc2ef5-98cb-4d9b-90b6-d2097daada61',
                'external_id': null,
                'name': '2002',
                'ext': 505,
            } if event.lead_selected_data.agent else {},
        } if event.lead_selected_data else {},
        'call': event.call.model_dump() if event.call else {}
    }
}
  • Перевод вызова на другого оператора.
{
    "event": 'call:transfer',
    "timestamp": '2025-08-26 14:00:00',
    "data": {
        'campaign': {
            'id': 'e470a5f6-dbc8-4711-aab0-44bc2cd5e52f',
            'external_id': null,
            'name': 'informer_ts_stage-2',
            'priority': 50,
            'strategy': 'informer',
        } if event.campaign else {},
        'bucket': {
            'id': 'f4535d8e-32bc-4d4e-9733-9c600773dcee',
            'external_id': 'test_with_operator',
            'name': 'test_with_operator',
            'priority': 0,
        } if event.lead and event.lead.bucket else {},
        'lead': {
            'id': '7adc5ad4-255b-43de-b0bf-a54ba306579e',
            'external_id': null,
            'name': 'TEST',
            'priority': 100,
            'timezone': 3,
            'data': {},
            'status': 'INITIALIZE',
            'attempts': 1,
            'attempts_current_campaign': 1,
            'attempts_current_scheduler_rule': 1,
        } if event.lead else {},
        'lead_selected_data': {
            'phone': {
                'id': '488b1070-7d98-4b29-878d-b4719bdf59eb',
                'external_id': null,
                'priority': 1,
                'type': 'mobile',
                'phone': '8923036250',
            },
            'route': {
                'id': '7ba6c7d7-d5d7-49f8-9cd7-5a969d7470d5',
                'external_id': 'all_to_FreePbx',
                'name': 'all_to_FreePbx',
            },
            'cid': null,
            'agent': {
                'id': '41cbfbe6-4b07-49cd-85c1-a69dd677cb6f',
                'external_id': null,
                'name': '2002',
                'ext': 505,
            } if event.lead_selected_data.agent else {},
        } if event.lead_selected_data else {},
        'agent_ext': event.agent_ext,
    }
}
  • Завершение вызовов. Отправляется в момент завершения вызова к клиенту.
{
    "event": 'calls:end',
    "timestamp": '2025-08-26 14:00:00',
    "data": [{
        'campaign': {
            'id': '7a673f3e-ae0c-43d6-b725-649b63d89cd0',
            'external_id': null,
            'name': 'informer_ts_stage-2',
            'priority': 50,
            'strategy': 'informer',
        },
        'bucket': {
            'id': '28edcaa6-3c8b-4b78-9ceb-aacb2eea5f73',
            'external_id': 'test_with_operator',
            'name': 'test_with_operator',
            'priority': 0,
        } if event.lead.bucket else {},
        'lead': {
            'id': '91b87f49-1bfd-4fe4-b13a-d1108f21f4b0',
            'external_id': null,
            'name': 'TEST',
            'priority': 100,
            'timezone': 6,
            'data': {},
            'status': 'INITIALIZE',
            'attempts': 1,
            'attempts_current_campaign': 1,
            'attempts_current_scheduler_rule': 1,
        },
        'lead_selected_data': {
            'phone': {
                'id': 'd46e45aa-bcc1-4f51-b5ec-4815aa015712',
                'external_id': null,
                'priority': 1,
                'type': 'mobile',
                'phone': '89000000001',
            },
            'route': {
                'id': '13eb5398-a986-463a-9113-b06378538498',
                'external_id': 'all_to_FreePbx',
                'name': 'all_to_FreePbx',
            },
            'cid': null,
            'agent': {
                'id': 'b1d7b56e-9163-4165-a3e4-1f53e196f44f',
                'external_id': null,
                'name': '2002',
                'ext': 505,
            } if event.lead_selected_data.agent else {}
        },
        'call': event.call.model_dump() if event.call else {}
    } for event in event.calls]
}

Лиды

Завершение обработки лидов.

Событие отправляется в момент завершения обработки лида по завершении очередного вызова (клиент ответил на вызов или закончились попытки дозвона).

{
  "event": "lead:processed",
  "data": [
    {
      "campaign": {
        "id": "7a673f3e-ae0c-43d6-b725-649b63d89cd0",
        "external_id": null,
        "name": "informer_ts_stage-2",
        "priority": 50,
        "strategy": "informer"
      },
      "lead": {
        "id": "91b87f49-1bfd-4fe4-b13a-d1108f21f4b0",
        "external_id": null,
        "name": "TEST",
        "priority": 100,
        "timezone": 6,
        "data": {},
        "status": "COMPLITED",
        "attempts": 10,
        "attempts_current_campaign": 5,
        "attempts_current_scheduler_rule": 2
      },
      "lead_selected_data": {
        "phone": {
          "id": "d46e45aa-bcc1-4f51-b5ec-4815aa015712",
          "external_id": null,
          "priority": 1,
          "type": "mobyle",
          "phone": "89000000001"
        },
        "route": {
          "id": "13eb5398-a986-463a-9113-b06378538498",
          "external_id": "all_to_FreePbx",
          "name": "all_to_FreePbx"
        },
        "cid": null,
        "agent": {}
      },
      "call": {
        "id": 3867,
        "agent_id": null,
        "agent_ext": null,
        "uniqueid": "1601973054.3422",
        "date": "2020-10-06",
        "calldate": 1601973054,
        "duration": 30,
        "billsec": 0,
        "time_client_ringing": 30,
        "time_agent_ringing": null,
        "time_client_hold_queue": null,
        "time_talk_call": null,
        "disposition": "NOANSWER",
        "causecode": 34,
        "clid": "<74993809012>",
        "timestamp": 1601973054.3584647,
        "talk_stop_leads": true,
        "talk_stop_flow": true,
        "delay_talk_completed": 1601973204,
        "tracking": null,
        "error": null
      }
    }
  ]
}

Агенты

События данного раздела генерируются на основании событий от модуля app_queue, подробнее о событиях и условии их генерации можно ознакомится в документации.

  • Событие AgentCalled
    {
        "event": 'agent:ringing',
        "timestamp": '2025-08-25 11:25:25',
        "data": {
            'campaign': {
                'id': 'db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc',
                'external_id': null,
                'name': 'stage-campaign_10000',
                'priority': 1,
                'strategy': 'progressive',
            } if event.campaign else {},
            'bucket': {
                'id': 'eb498260-ca68-4afc-9459-e42216e19e49',
                'external_id': null,
                'name': 'stage_bucket_1000',
                'priority': 1,
            } if event.lead and event.lead.bucket else {},
            'lead': {
                'id': '442e7245-3527-499e-958b-1b0d0d8930ea',
                'external_id': null,
                'name': 'TEST',
                'priority': 100,
                'timezone': 3,
                'data': {},
                'status': 'INITIALIZE',
                'attempts': 1,
                'attempts_current_campaign': 1,
                'attempts_current_scheduler_rule': 1,
            } if event.lead else {},
            'lead_selected_data': {
                'phone': {
                    'id': '801dcd49-e3f2-481b-85b2-b457c36b34bd',
                    'external_id': null,
                    'priority': 1,
                    'type': 'mobyle',
                    'phone': '89210000000',
                },
                'route': {
                    'id': '88b2a87c-ed94-4b3d-8259-07bbc2eaa5b5',
                    'external_id': null,
                    'name': 'all_to_FreePbx: Emulate',
                },
                'cid': '880000313',
                'agent': {
                    'id': '8bd89c54-dfc9-41fc-a79b-23429f14771f',
                    'external_id': null,
                    'name': '2002',
                    'ext': 505,
                } if event.lead_selected_data.agent else {},
            } if event.lead_selected_data else {},
            'agent_ext': 505,
        }
    }
    
  • Событие AgentConnect
    {
        "event": 'agent:connected',
        "timestamp": '2025-08-26 14:00:00',
        "data": {
            'campaign': {
                'id': 'db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc',
                'external_id': null,
                'name': 'stage-campaign_10000',
                'priority': 50,
                'strategy': 'progressive',
            } if event.campaign else {},
            'bucket': {
                'id': '752aff79-e000-4757-a5f7-b1aba1747198',
                'external_id': null,
                'name': 'stage_bucket_1000',
                'priority': 1,
            } if event.lead and event.lead.bucket else {},
            'lead': {
                'id': '442e7245-3527-499e-958b-1b0d0d8930ea',
                'external_id': null,
                'name': 'TEST',
                'priority': 100,
                'timezone': 3,
                'data': {},
            } if event.lead else {},
            'lead_selected_data': {
                'phone': {
                    'id': '801dcd49-e3f2-481b-85b2-b457c36b34bd',
                    'external_id': null,
                    'priority': 1,
                    'type': 'mobyle',
                    'phone': '89210000000',
                },
                'route': {
                    'id': 'd94e100c-0be8-4bed-a171-b0dc366eeb55',
                    'external_id': null,
                    'name': 'all_to_FreePbx: Emulate',
                },
                'cid': null,
                'agent': {
                    'id': 'a788ec93-5dbe-473f-8ade-2a382352d179',
                    'external_id': null,
                    'name': '2002',
                    'ext': 505,
                } if event.lead_selected_data.agent else {},
            } if event.lead_selected_data else {},
            'agent_ext': 505,
        }
    }
    
  • Событие AgentComplete

    {
        "event": 'agent:completed',
        "timestamp": '2025-08-26 14:00:00',
        "data": {
            'campaign': {
                'id': 'db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc',
                'external_id': null,
                'name': 'stage-campaign_10000',
                'priority': 1,
                'strategy': 'progressive',
            } if event.campaign else {},
            'bucket': {
                'id': '3b8cd085-f228-4447-9ac3-aa80a20e829b',
                'external_id': null,
                'name': 'stage_bucket_1000',
                'priority': 1,
            } if event.lead and event.lead.bucket else {},
            'lead': {
                'id': '442e7245-3527-499e-958b-1b0d0d8930ea',
                'external_id': null,
                'name': 'TEST',
                'priority': 100,
                'timezone': 3,
                'data': {},
            },
            'lead_selected_data': {
                'phone': {
                    'id': '534b51a4-5198-4896-8e57-56a3fe999d55',
                    'external_id': null,
                    'priority': 1,
                    'type': 'mobyle',
                    'phone': '89210000000',
                },
                'route': {
                    'id': 'd1f6e697-03ac-4411-9571-430f69228008',
                    'external_id': null,
                    'name': 'all_to_FreePbx: Emulate',
                },
                'cid': null,
                'agent': {
                    'id': 'fdb687ca-52ce-4586-ad8d-4398b55e38b2',
                    'external_id': null,
                    'name': '2002',
                    'ext': 505,
                } if event.lead_selected_data.agent else {}
            } if event.lead_selected_data else {},
            'agent_ext': event.agent_ext,
        }
    }
    

  • Событие AgentRingNoAnswer

{
    "event": 'agent:ring_no_answer',
    "timestamp": '2025-08-25 11:25:25',
    "data": {
        'campaign': {
            'id': 'e8a4cca2-16ba-4296-b245-889f2d9732ff',
            'external_id': null,
            'name': 'stage-campaign_10000',
            'priority': 1,
            'strategy': 'progressive',
        } if event.campaign else {},
        'bucket': {
            'id': 'f013973c-15be-496e-aaa2-68356d7e6fa6',
            'external_id': null,
            'name': 'stage_bucket_1000',
            'priority': 1,
        } if event.lead and event.lead.bucket else {},
        'lead': {
            'id': 'dfe195af-489f-47b3-a640-a3bc99a0a6ea',
            'external_id': null,
            'name': 'TEST',
            'priority': 100,
            'timezone': 3,
            'data': {},
        } if event.lead else {},
        'lead_selected_data': {
            'phone': {
                'id': 'd0272f57-7fbd-4f8d-a932-7e778397fb00',
                'external_id': null,
                'priority': 1,
                'type': 'mobyle',
                'phone': '89210000000',
            },
            'route': {
                'id': '5385fd89-faac-4939-a535-a1d30bf7fad3',
                'external_id': null,
                'name': 'all_to_FreePbx: Emulate',
            },
            'cid': null,
            'agent': {
                'id': 'd6ad7c3c-7875-4b18-a1b7-e79e39a2051c',
                'external_id': null,
                'name': '2002',
                'ext': 505,
            } if event.lead_selected_data.agent else {},
        } if event.lead_selected_data else {},
        'agent_ext': event.agent_ext,
    }
}

Из события AgentConnected есть возможность брать данные для обогащения шаблонной ссылки с данными о лиде в настройках кампании.

Данные, которыми обогащается ссылка, берутся из отправляемого события AgentConnected.

Сопоставление этих данных осуществляется путем указания в настройках пар <будущий_ключ_в_ссылке>: <путь_на_языке_jsonpath_до_поля_в_отправляемом_событии>.

Пример отправляемого события (добавлены $.call.channel, $.url и $.campaign.settings.url_parameters_mapping):

{
  "event": "AgentConnect",
  "url": "http://localhost:8910?phone=89230360000&channel=Local%2F89230360000%40dialer-call_lead-v4-0000012b%3B1&queue_param=4001",
  "call": {
    "call_id": "",
    "caller_name": "Agentik",
    "caller_num": "89230360000",
    "channel": "Local/89230360000@dialer-call_lead-v4-0000012b;1",
    "hold_time": "2",
    "queue": "4001",
    "ring_time": "0",
    "uniqueid": "1737367051.3894"
  },
  "campaign": {
    "external_id": null,
    "id": "81547d63-08dc-4ef2-8823-25ee8ba4827d",
    "name": "aaaaaaa",
    "settings": {
      "external_urls": null,
      "openUrlNewTab": false,
      "url": "http://localhost:8910",
      "url_parameters_mapping": {
        "any_name": "not.existing.path:p",
        "channel": "call.channel:p",
        "phone": "lead.phone.phone:p",
        "queue_param": "call.queue:p"
      }
    },
    "strategy": "progressive"
  },
  "lead": {
    "data": {},
    "external_id": null,
    "id": "63d50469-19a4-414c-b445-8680af48e3f1",
    "name": "Agentik",
    "phone": {
      "external_id": null,
      "id": "b75c1e7d-413b-4979-a347-86bbd224eae2",
      "phone": "89230360000",
      "priority": 100,
      "type": null
    },
    "priority": 100,
    "timezone": 6
  }
}
{
  "event": "AgentRingNoAnswer",
  "data": {
    "call": {
      "call_id": "",
      "queue": "10000",
      "caller_name": "None",
      "caller_num": "<unknown>",
      "hold_time": "",
      "ring_time": "4000"
    },
    "campaign": {
      "id": "db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc",
      "external_id": null,
      "name": "stage-campaign_10000",
      "strategy": "progressive",
      "settings": {
        "url": "http://example.com/{PHONE}",
        "external_urls": null,
        "openUrlNewTab": null
      }
    },
    "lead": {
      "id": "21e24ee8-8b55-4536-9948-53b47f8d28b1",
      "external_id": null,
      "name": "TEST",
      "priority": 100,
      "timezone": 6,
      "data": {},
      "phone": {
        "id": "b3c0c2af-5420-48e8-ade2-068f32d1c829",
        "external_id": null,
        "priority": 1,
        "phone": "89210000000",
        "type": "mobyle"
      }
    }
  }
}

Управление операторами из CRM

Для управления операторами из CRM необходимо в панели супервайзера выполнить следующие действия:

  1. Создать очереди,за которыми система будет следить на телефонии.
  2. Создать нужное количество операторов, не привязывая их к пользователям, так как под ними не будут входить.
  3. Привязать операторов к очередям.
  4. Создать нужные PauseCode для их отображения у операторов в Real time статистике.

Затем по API из CRM:

  • Залогинить оператора при входе в CRM систему для того, чтобы он вошел на телефонии во все очереди, настроенные в панели супервайзера.

POST /telephony_server_providers/agents/login { "external_id": "crm_operator_id | ext" }

  • Разлогинить оператора при выходе из CRM системы.

POST /telephony_server_providers/agents/logout

  • Поставить оператора на паузу на телефонии.

POST /telephony_server_providers/agents/paused { "external_id": "crm_operator_id | ext", "pause_code": "code", }

  • Снять оператора с паузы на телефонии.

POST /telephony_server_providers/agents/unpaused { "external_id": "crm_operator_id | ext" }