CRM Updates
Every call, agreed next step, and follow-up task written back to your CRM — so the record stays complete without adding work for your reps.
Coach with evidence, not impressions
You know who your strong reps are and who is struggling. That part is easy; it shows up in the results. What you cannot see is the movement. Is the rep who is weak at closing getting better, or standing still? Is your coaching working, and by how much?
Without that, coaching runs on impression. You correct what you happen to overhear and hope it lands. The reps you do not sit with are not coached at all.
Sales Signals evaluates every call against the skills that matter: discovery, objection handling, next-step discipline, and the rest. Each becomes a score you can track over time.
So “he is weak at closing” becomes a number. And that number moves week over week, so you can see whether the coaching is working, for every rep on the team.
Example: Closing & Objection Handling Score combines multiple signals to evaluate how effectively a sales rep addresses objections and attempts to close during a call. It can be used to identify coaching opportunities and track improvement over time.
A struggling new rep is rarely obvious in the first weeks. By the time poor results show up, months of salary and ramp time are already spent. Seeing the trend early is the difference between a course correction and a costly replacement.
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 countryCode = Inputs.select(
countryData.map(d => d.code),
{
label: "Country",
format: code => countryData.find(d => d.code === code).name
}
)
viewof salary = Inputs.number({label: "Monthly salary", min: 0, step: 100})
viewof oncost = Inputs.number({label: "Employer on-cost rate (%)", min: 0, max: 100, step: 1})
viewof months = Inputs.range([1, 6], {label: "Months before it is caught", value: 3, step: 1})
viewof recruitment = Inputs.number({label: "Recruitment cost to replace", min: 0, step: 100}){
row; // depend on country change
const sEl = viewof salary;
const oEl = viewof oncost;
const rEl = viewof recruitment;
const baseSalary = Math.round(row.salary * 1.25 / 100) * 100;
sEl.value = baseSalary;
oEl.value = row.oncost;
rEl.value = Math.round(baseSalary * 1.5 / 100) * 100;
sEl.dispatchEvent(new Event("input", {bubbles: true}));
oEl.dispatchEvent(new Event("input", {bubbles: true}));
rEl.dispatchEvent(new Event("input", {bubbles: true}));
}loadedMonthly = salary * (1 + oncost/100)
wastedEmployment = loadedMonthly * months
totalCost = wastedEmployment + recruitment
renderResult([
{label: "Fully-loaded monthly cost", value: fmtMoney(loadedMonthly, row)},
{label: "Wasted employment (" + months + (months === 1 ? " mo" : " mo") + ")", value: fmtMoney(wastedEmployment, row)},
{label: "Recruitment cost", value: fmtMoney(recruitment, row)},
{label: "Total cost of a late decision", value: fmtMoney(totalCost, row), total: true}
])Figures are approximate. Salary and contribution rates vary by role, seniority, and jurisdiction; adjust to your situation.
Catching a struggling rep early, from the trend in their calls, is the difference between a course correction and paying this twice.
You coach the whole team, not only the reps you overhear. You know which skills are improving and which are not. And when you invest coaching time, you can see the return instead of hoping it landed.
The clearest way to understand Sales Signals is to see what it surfaces from your team’s actual conversations. We will set it up with your existing phone system; there is nothing to install, and nothing changes for your reps.