Розробка AI-цифрового менеджера з продажів (AI SDR)

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-цифрового менеджера з продажів (AI SDR)
Складний
від 2 тижнів до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка AI SDR — цифрового менеджера з продажів

AI SDR (Sales Development Representative) — автономний агент, що виконує функції менеджера з перших продажів: пошук та збагачення лідів, персоналізований аутріч через email та LinkedIn, кваліфікація за BANT/MEDDIC, обробка заперечень та передача готового ліда до CRM з повним контекстом. На відміну від скрипткових email-відправників, AI SDR веде багатоходовий діалог та адаптує стратегію на основі відповідей.

Архітектура AI SDR

Lead Discovery: збагачення через Apollo, Hunter.io, LinkedIn Sales Navigator API, Clearbit.

Personalization Engine: генерація унікальних повідомлень на основі даних компанії (фінансування, найм, новини, tech stack).

Outreach Orchestrator: управління послідовностями та часом відправлення.

Qualification Engine: багатоходовий діалог з кваліфікацією за методологією BANT/MEDDIC.

CRM Integration: AmoCRM / Bitrix24 / Salesforce — автоматичне створення угод.

Збагачення та персоналізація лідів

import asyncio
from openai import AsyncOpenAI
from pydantic import BaseModel
from typing import Optional

client = AsyncOpenAI()

class LeadProfile(BaseModel):
    company: str
    domain: str
    contact_name: str
    title: str
    email: str
    linkedin_url: Optional[str]

    # Збагачені дані
    company_size: Optional[int]
    industry: Optional[str]
    recent_funding: Optional[str]    # Останній раунд фінансування
    tech_stack: Optional[list[str]]  # Технології на сайті
    recent_news: Optional[list[str]] # Упоминання в новинах
    job_openings: Optional[list[str]] # Відкриті вакансії (сигнал зростання)
    pain_indicators: Optional[list[str]] # Сигнали болю

async def enrich_lead(lead: LeadProfile) -> LeadProfile:
    """Збагачення даних ліда з кількох джерел"""

    # Паралельний збір даних
    clearbit_task = clearbit_api.enrich(domain=lead.domain)
    apollo_task = apollo_api.get_company(domain=lead.domain)
    news_task = newsapi.search(query=lead.company, days=30)
    linkedin_task = proxycurl.get_company(linkedin_url=f"linkedin.com/company/{lead.company.lower().replace(' ', '-')}")

    results = await asyncio.gather(
        clearbit_task, apollo_task, news_task, linkedin_task,
        return_exceptions=True,
    )

    # Оновлюємо профіль
    if not isinstance(results[0], Exception):
        lead.company_size = results[0].get("employees")
        lead.tech_stack = results[0].get("tech", [])

    if not isinstance(results[2], Exception):
        lead.recent_news = [n["title"] for n in results[2][:3]]

    # Визначаємо сигнали болю
    lead.pain_indicators = await detect_pain_indicators(lead)

    return lead

async def detect_pain_indicators(lead: LeadProfile) -> list[str]:
    """LLM аналізує сигнали болю з даних компанії"""
    response = await client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{
            "role": "user",
            "content": f"""На основі даних про компанію визначи можливі болеві точки,
релевантні для продажу {OUR_PRODUCT}.

Компанія: {lead.company}
Галузь: {lead.industry}
Розмір: {lead.company_size} співробітників
Вакансії: {lead.job_openings}
Новини: {lead.recent_news}

Поверни JSON-список з 2-3 конкретних болевих індикаторів."""
        }],
    )
    return json.loads(response.choices[0].message.content)

Генератор персоналізованих повідомлень

class PersonalizedOutreachGenerator:

    SEQUENCE_FRAMES = {
        1: "cold_intro",           # Перший контакт: релевантна пропозиція вартості
        2: "pain_point_follow",    # Follow-up: конкретний біль на основі даних
        3: "social_proof",         # Кейс-стаді з їхньої галузі
        4: "direct_ask",           # Пряме запитання про зустріч
        5: "breakup",              # Фінальний лист
    }

    async def generate_email(
        self,
        lead: LeadProfile,
        step: int,
        previous_responses: list[str] = None,
    ) -> str:

        frame = self.SEQUENCE_FRAMES.get(step, "generic")
        context = self._build_context(lead, previous_responses)

        response = await client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "system",
                "content": f"""Ти — досвідчений B2B SDR. Пиши листи, які отримують відповіді.
Правила:
- 80-120 слів максимум
- Перше речення — не про компанію, а про ліда/його біль
- Один конкретний CTA в кінці
- Без кліше: "сподіваюся цей лист застане вас у доброму здоров'ї"
- Персоналізація повинна бути помітна (не "бачив ваш профіль на LinkedIn")
Рамка листа: {frame}"""
            }, {
                "role": "user",
                "content": f"""Напиши лист для:
Ім'я: {lead.contact_name}, {lead.title} в {lead.company}
Болі: {lead.pain_indicators}
Останні новини: {lead.recent_news}
Tech stack: {lead.tech_stack}
Контекст попередніх листів: {context}"""
            }],
            temperature=0.7,
        )

        return response.choices[0].message.content

    def _build_context(self, lead: LeadProfile, previous_responses: list[str]) -> str:
        if not previous_responses:
            return "Перший контакт"
        return f"Попередніх листів: {len(previous_responses)}, остання відповідь: {previous_responses[-1][:200] if previous_responses else 'немає відповідей'}"

Діалог кваліфікації

from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator

class QualificationState(TypedDict):
    lead_id: str
    messages: Annotated[list, operator.add]
    lead_profile: dict
    qualification: dict  # Прогрес BANT
    lead_score: int
    next_action: str     # "schedule_demo", "nurture", "disqualify", "continue"

QUALIFICATION_SYSTEM = """Ти — B2B SDR, кваліфікуєш ліда за BANT.
Веди природний діалог, не допит. 4-7 повідомлень до рішення.

Поточна кваліфікація:
{qualification_status}

Критерії передачі AE: score >= 70, бюджет підтвердив, влада підтвердила.
Критерії дискваліфікації: немає бюджету + немає часової шкали, компанія < 50 співробітників для нашого продукту."""

def should_continue_qualification(state: QualificationState) -> str:
    score = state["lead_score"]
    qual = state["qualification"]

    # Дискваліфікація
    if score < 20 and len(state["messages"]) > 4:
        return "disqualify"

    # Готовий до передачі AE
    if score >= 70 and qual.get("budget") and qual.get("authority"):
        return "schedule_demo"

    # Продовжуємо діалог
    if len(state["messages"]) >= 14:  # Обмеження переписки
        return "nurture" if score >= 40 else "disqualify"

    return "continue"

CRM-інтеграція

class CRMIntegration:

    async def create_qualified_lead(self, state: QualificationState):
        """Створює угоду в CRM з повним контекстом"""

        # Форматуємо історію діалогу
        conversation_summary = await self.summarize_conversation(state["messages"])

        deal_data = {
            "name": f"{state['lead_profile']['company']} — {state['lead_profile']['contact_name']}",
            "status": "qualified",
            "pipeline_stage": "SQL",
            "lead_score": state["lead_score"],
            "budget_range": state["qualification"].get("budget"),
            "timeline": state["qualification"].get("timeline"),
            "pain_points": state["lead_profile"].get("pain_indicators", []),
            "conversation_summary": conversation_summary,
            "ai_sdr_notes": self.format_handoff_notes(state),
        }

        deal = await amocrm.create_deal(**deal_data)
        await amocrm.attach_conversation(deal.id, state["messages"])

        return deal

    def format_handoff_notes(self, state: QualificationState) -> str:
        """Коротка інформація для AE"""
        qual = state["qualification"]
        return f"""SDR Handoff Notes:
Score: {state['lead_score']}/100
Budget: {qual.get('budget', 'уточнити')}
Authority: {'підтверджено' if qual.get('authority') else 'ні'}
Need: {qual.get('need', '')}
Timeline: {qual.get('timeline', 'уточнити')}
Key pain: {', '.join(state['lead_profile'].get('pain_indicators', [])[:2])}
Рекомендована стратегія AE: {self.recommend_approach(state)}"""

Практичний кейс: B2B SaaS, ринок 5000 компаній

Компанія: HR-tech SaaS, ACV $24,000, цільовий ринок — компанії 100–1,000 співробітників.

До AI SDR: 2 SDR, 400 ручних аутричів/місяць, генерація конвеєру займала 60% часу.

Конфігурація AI SDR:

  • Джерело лідів: Apollo.io (фільтри ICP) + автоматичне збагачення Clearbit
  • Аутріч: email (5-крокові послідовності) + LinkedIn InMail
  • Кваліфікація: BANT, 6–8 ходів діалогу
  • Передача: AmoCRM, автоматичне створення угоди при score >= 65

Результати за перші 3 місяці:

  • Аутріч на місяць: 400 → 2,800 (+600%)
  • Reply rate: 4.2% (людина) → 3.1% (AI) — нижче, але обсяг компенсує
  • Кваліфіковані SQL/місяць: 18 (SDR) → 31 (AI SDR + SDR)
  • SDR перезосередилися: діалоги з уже зацікавленими, теплі вступи
  • Конвеєр: +72% за квартал

Проблеми: перші 3 тижні — занадто "робототехнічні" листи, 2 ітерації інженерії підказок. Частина відповідей "розписуйте мене" — важливо моніторити та виключати домени.

Обмеження: AI SDR не веде фінальні переговори про умови та enterprise-угоди з рішенням-приймачами C-level — тільки розігрів та кваліфікація.

Часова шкала

  • Конвеєр збагачення лідів: 2–3 тижні
  • Генератор аутричу з A/B тестуванням: 2–3 тижні
  • Агент кваліфікації: 2–3 тижні
  • CRM інтеграція + передача: 1–2 тижні
  • Калібрування та запуск: 2 тижні
  • Разом: 9–13 тижнів