Автозаполнение CRM
Каждый звонок, каждая договорённость и задача на следующий шаг попадают в CRM автоматически. Карточка остаётся полной, а у менеджеров не…
Стабильное качество звонков по всему отделу
Вы задали стандарт: как должен идти разговор с клиентом. Держит ли отдел этот стандарт от звонка к звонку — вы, как правило, узнаёте поздно: когда клиент пожаловался или, еще хуже, когда выручка пошла вниз.
Слушать звонки, чтобы поймать нарушения стандартов самому, нереально. Руководитель, который пытается контролировать качество вручную, тратит на это часы в неделю и всё равно видит малую часть. Остальное проходит мимо.
Сигналы Продаж оценивают каждый звонок по тому, из чего складывается ваш стандарт: отработано ли возражение, соблюдён ли процесс, есть ли в разговоре обязательные шаги. Каждый пункт становится показателем, который можно отслеживать.
По каждому показателю вы задаёте целевое значение и порог, за которым начинается проблема. Когда скользящее среднее уходит за порог, система присылает оповещение. Вам не нужно следить за дашбордом в надежде заметить неладное — система сама сообщает о проблеме, пока та ещё небольшая.
Пример: Доля звонков с зафиксированным следующим шагом — процент разговоров, которые заканчиваются конкретной договорённостью со сроком. Красный и жёлтый пороги задаются вручную или рассчитываются автоматически.
Ручное прослушивание — это единственная альтернатива, и стоит она дорого в той валюте, которую руководителю никто не вернёт: во времени. Калькулятор ниже оценивает, сколько это время стоит за год.
countryData = FileAttachment("/data/salary-by-country.csv").csv({ typed: true })
fmtMoney = (value, row) =>
new Intl.NumberFormat(row.locale, {maximumFractionDigits: 0}).format(Math.round(value)) + " " + row.sym
renderResult = (rows) => html`<div class="calc-result">
${rows.map(r => html`<div class="calc-result-row ${r.total ? 'calc-result-total' : ''}">
<span>${r.label}</span><span>${r.value}</span>
</div>`)}
</div>`
// Persist a value to a cookie shared across the site (1-year expiry).
// Used to carry calculator inputs (country, reps, calls/day) into the contact form.
setSSCookie = (name, value) => {
document.cookie = "salessignals-" + name + "=" + encodeURIComponent(value) +
";path=/;max-age=" + (60*60*24*365) + ";SameSite=Lax";
}viewof netSalary = Inputs.number({label: "Зарплата руководителя на руки, ₽/мес", value: 130000, min: 0, step: 5000})
viewof isMsp = Inputs.toggle({label: "Компания в реестре МСП", value: true})
viewof reps = Inputs.number({label: "Менеджеров в отделе", value: 5, min: 1, step: 1})
viewof callsPerDay = Inputs.number({label: "Звонков на менеджера в день", value: 20, min: 1, step: 1})
viewof coverage = Inputs.range([5, 100], {label: "Доля прослушиваемых звонков, %", value: 20, step: 5})
viewof minutesPerCall = Inputs.range([1, 15], {label: "Минут на разбор одного звонка", value: 5, step: 1})annualNet = netSalary * 12
annualGross = annualNet <= ndflNetAt1
? annualNet / 0.87
: ndflBand1 + (annualNet - ndflNetAt1) / 0.85
grossMonthly = annualGross / 12
annualContributions = {
let cumulative = 0;
let total = 0;
for (let m = 0; m < 12; m++) {
const capRemaining = Math.max(0, contribCap - cumulative);
const underCap = Math.min(grossMonthly, capRemaining);
const overCap = grossMonthly - underCap;
total += isMsp
? Math.min(underCap, mrotThreshold) * rateBase
+ Math.max(0, underCap - mrotThreshold) * rateReduced
: underCap * rateBase;
total += overCap * rateOverCap;
total += grossMonthly * rateInjury;
cumulative += grossMonthly;
}
return total;
}
annualCost = annualGross + annualContributions
loadedHourly = annualCost / (workingDays * 8)callsPerWeek = reps * callsPerDay * 5
reviewedPerWeek = callsPerWeek * coverage / 100
hoursPerWeek = reviewedPerWeek * minutesPerCall / 60
annualReviewCost = hoursPerWeek * loadedHourly * workingWeeks
fteShare = hoursPerWeek / 40
renderResult([
{label: "Звонков разбирается в неделю", value: Math.round(reviewedPerWeek) + " из " + callsPerWeek},
{label: "Часов на разбор в неделю", value: hoursPerWeek.toFixed(1) + " ч"},
{label: "Это доля рабочей недели", value: (fteShare * 100).toFixed(0) + " %"},
{label: "Стоимость разбора за год", value: fmtRub(annualReviewCost), total: true}
])Стоимость часа считается по полной стоимости сотрудника для компании: из суммы на руки восстанавливается оклад с учётом НДФЛ, сверху начисляются страховые взносы по ставкам 2026 года. Цифры приблизительные, подставьте свои.
Даже при ручном прослушивании вы работаете с выборкой: полностью все звонки никто не слушает. Сигналы Продаж разбирают все — каждый звонок, каждый день.
Вы знаете, что отдел держит стандарт, а не надеетесь на это. Проблемы приходят к вам через оповещения, пока они не стали критичными. А часы, которые вы потратили бы на прослушивание, возвращаются в работу, которую кроме руководителя сделать некому.
Понятнее всего Сигналы Продаж объясняют себя на реальных разговорах вашего отдела. Мы подключаем систему к вашей текущей телефонии — ставить ничего не нужно, для менеджеров ничего не меняется.