←  Case Studies Semantic
Sales Enablement & Modeling

From "Trust Me" to a Number: An Opportunity Estimator That Sizes the Prize

Semantic built an interactive estimator that turns a prospect's rough operational numbers into a banded annual dollar opportunity and a clear invest-or-hold verdict — replacing hand-waved upside claims with a figure the prospect can interrogate.

Context
Semantic's own sales motion — the "what is this worth" step that sits between an audit and a priced proposal
Role
Designer and builder — opportunity model, calculation engine, guided UX, deploy tooling
Stack
Vanilla JavaScript with a single-file, dependency-free calculation engine and no build step; a bash deploy script with a test gate and cache-busting; served as static files privately over Tailscale
Status
Shipped — built and working; internal-only so far, ready to put in front of a prospect but not yet shown to a client

The problem

Every agency pitch eventually reaches the same question from the prospect: what is this actually worth to me? The usual answer is a hand-wave — "we can grow your traffic thirty percent," "this should pay for itself." It is unfalsifiable by design, and a sharp prospect knows it. The claim lands as a sales line rather than a number, and the conversation stalls on trust instead of moving to a decision.

A rigorous site audit already does the hard diagnostic work — surfacing what is broken on a prospect's site and why. But the bridge between "here's what's wrong" and "here's the priced engagement" was still a verbal estimate. There was no artifact that took the prospect's own situation and produced a defensible figure they could push on.

The trap on the other side is just as real: a tool that spits out a single confident number — "$412,800 in new revenue" — is worse than a hand-wave, because the false precision collapses the moment anyone asks how it was derived. The need was a way to size the opportunity honestly: specific enough to be useful, banded enough to be true.

The approach

The first decision was to separate the math from the interface completely. The opportunity model lives in a single, dependency-free calculation engine — pure functions that take inputs and return a result, with no framework, no build step, and nothing to install. That isolation is what makes the model trustworthy: it can be reasoned about and tested on its own, and the exact same engine can drive more than one front end without the numbers ever diverging.

The second decision was to output a band and a verdict, not a point. Rough operational inputs produce a ranged annual dollar opportunity plus a plain invest-or-hold judgment, deliberately refusing the false precision that makes upside claims fall apart under questioning. Honesty here is not a disclaimer bolted on at the end — it is the design. A range that survives scrutiny in the room is worth more than a precise number that doesn't.

The third decision was two front ends over one engine. A guided mode walks a prospect through the inputs one step at a time, keeping the cognitive load low and the conversation moving. A standard mode exposes the full calculator at once for the operator who already knows the levers. Both call the identical engine, so what the prospect sees in the wizard and what the operator sees in the calculator can never drift apart.

The fourth decision was to keep it private by default. The estimator is served as static files over Tailscale — reachable on the same network during a one-to-one, off the public web on purpose. The model is a piece of the agency's commercial edge; it does not need to be indexable to be useful in the room.

The build

The engine is a single JavaScript file with no dependencies and no build pipeline: pure functions mapping a prospect's inputs to a banded dollar opportunity and an invest-or-hold verdict. Because it is pure and self-contained, it is deterministic and unit-testable in isolation — the same property that makes the metric registry and the lead-intake validator elsewhere in the stack reliable.

Two interfaces wrap that one engine:

callscalls Guided wizardprospect · step-by-step Expert calculatoroperator · all inputs Pure enginesingle file · no deps · no build Banded $ opportunity+ invest / hold verdict
One pure engine behind two front ends — the wizard and the calculator can never disagree.

Both call the same functions, so there is exactly one definition of the opportunity math and no chance of the wizard and the calculator disagreeing.

Deployment is a bash script with two pieces of discipline baked in. A test gate runs the engine's tests first and aborts the deploy if any fail — the broken model never ships. Cache-busting ensures a refreshed asset is actually served rather than a stale copy, so an update is live the instant it deploys. The result is served statically over Tailscale, with no server to run and no public surface.

Outcomes

The result is a working tool that converts a prospect's rough operational numbers into a banded annual opportunity and an invest-or-hold verdict in the moment — turning the "what's it worth" question from a trust exercise into a number the prospect can examine.

The pure-engine split means the opportunity model has a single definition, tested on its own and shared by both modes, so there is no daylight between what a prospect sees in the guided wizard and what the operator sees in the full calculator. The banded output is the honest-by-design choice that lets the estimate hold up when someone asks how it was built.

The deploy path carries the same ops discipline as the rest of the stack: a test gate that refuses to ship a failing model, and cache-busting so what's live is actually what was built. As of now the estimator is internal-only — built, tested, and ready to put in front of a prospect, not yet shown to a client.

What's next

The immediate next step is to use it in a live discovery call as the "size the prize" step, sitting between the audit findings and the live demo, so the prospect sees what is broken, what a fixed version looks like, and what it is worth — in one sitting. From there, the engine can feed the proposal directly, so the estimated opportunity flows into the tiered pricing rather than being re-derived by hand. A public, always-on deployment is available if the tool ever needs to live outside the room — but private-by-default remains the deliberate choice for now.

Anonymized case study · Semantic · 2026All case studies