Calculator Tool Skill
What This Is
A Calculator Tool takes someone's real numbers and computes a result they couldn't see without doing the math. The person provides 3–5 inputs. The tool does the arithmetic and shows them what their numbers mean.
This is NOT a diagnostic (which sorts into categories) or a revelation tool (which surfaces hidden quantity). A calculator says "given YOUR specific numbers, here's what's actually happening in your practice."
The value is in the computation. The person walks in with scattered numbers they've never put side by side. They walk out with a ratio, a gap, or a projection they couldn't have computed on their own — using their own data.
When to Use This Tool Type
Use a Calculator Tool when:
- The person has real numbers they could provide but hasn't done the math
- The insight comes from the RELATIONSHIP between numbers (ratios, gaps, projections), not the numbers themselves
- Different input values produce meaningfully different results and different prescriptions
- The result is more persuasive because it uses their data, not generic benchmarks
Do NOT use when:
- The person needs to be sorted into a category (use a Diagnostic)
- The person underestimates what they already have (use a Revelation Tool)
- The inputs would require research they can't do in 90 seconds (too much friction)
- The math is trivial enough they could do it in their head
- The "computation" is really just a weighted score (that's a revelation tool or diagnostic with extra steps)
Architecture
INTRO SCREEN (frames what the numbers will reveal)
↓
CALCULATOR SCREEN (3–5 inputs with labels + hints, all visible at once)
↓
RESULTS PAGE
→ Hero number (primary computed metric — big, colored by severity)
→ Ratio insight line (standalone callout — the sentence they'll remember)
→ Ratio/comparison visualization (bar showing the relationship)
→ Stat grid (supporting computed numbers)
→ Equation visual (before → after transformation)
→ Insight box (severity-tiered interpretation)
→ Context box (scale-appropriate framing)
→ Bridge to companion content
→ CTA
→ Disclaimer
→ Recalculate button
The Critical Pattern: Computed Insight
Every result is arithmetic on the user's inputs. No preset categories. No scoring. The same tool produces entirely different numbers, visualizations, and contextual copy depending on what the person enters.
Why This Works
A diagnostic tells someone "you're in category B." A calculator tells someone "your dead list is worth 3.2× your entire marketing budget — that's $156,000 a year sitting in conversations you already had." The second uses THEIR numbers, which makes it undeniable. They can't dismiss it as generic advice because the math came from their own inputs.
The Insight Line
Every calculator needs one sentence that captures the entire computed relationship. This sentence gets its own visual moment on the results page — an insight box with a severity-colored left border and a label like "The ratio."
Good insight lines reference both sides of the relationship:
- "For every $1 you spend finding strangers, $3.20 is sitting in conversations you already had."
- "62% of your team's effort is invisible to clients — that's 186 hours per month they never see."
Bad insight lines state only one number:
- "You have $156,000 in recoverable revenue." (missing the comparison)
- "Your invisible work ratio is 62%." (missing the consequence)
Input Design
Input Rules
- 3–5 inputs (3 is ideal — enough for meaningful computation, fast enough for under 90 seconds)
- Number fields for quantities (clients, hours, dollars, percentages)
- Sliders for estimates (recovery rates, automation potential — things without exact answers)
- Every input needs a label + hint — the hint coaches what to count and what not to count
- Inputs must be things the person knows or can estimate quickly — if they need to look something up, you've lost them
- Calculate button disabled until all required inputs are filled
- All inputs visible on one screen — this is a form, not a question sequence
Input Anti-Patterns
| Bad Input | Why It Fails | Better Version |
|---|---|---|
| Full-width text field with placeholder "e.g. 30" | Looks like a text field, not a number entry. Placeholder text disappears on focus, removing the guidance. | Narrow (100–120px) number field with em-dash placeholder and unit label beside it: [—] contacts |
border-radius: 6px on inputs and buttons | Rounded corners soften the brand's sharp geometric identity. Doesn't match any shipping AOS tool. | Sharp corners (no border-radius) on inputs, buttons, insight boxes, ratio bars |
| No section labels between input groups | All inputs feel like one undifferentiated list | Gold uppercase eyebrow labels group inputs: "Your Practice" / "The Recovery Question" |
| No form divider when context shifts | Missing visual signal that inputs serve different parts of the computation | with 1px border-top between input groups |
Number Field Spec
<div class="input-group">
<div class="input-label">People who went quiet in the last quarter</div>
<div class="input-hint">No-shows, ghosted proposals, past clients who drifted. Count all of them.</div>
<div class="input-row">
<input type="number" class="input-field" id="input-contacts" placeholder="—" min="1" max="500" oninput="checkReady()">
<span class="input-unit">contacts</span>
</div>
</div>
- Width: 100–120px (not full-width)
- Placeholder: em-dash (—), not "0", not "e.g. 30"
- Suppress spinner buttons with CSS (
-moz-appearance: textfield+::-webkit-inner-spin-button) - Gold border on focus
- Dollar inputs get a
$prefix label before the field
Slider Spec
<div class="slider-value" id="slider-display">20%</div>
<input type="range" class="slider" id="input-recovery" min="10" max="40" value="20" step="5" oninput="updateSlider()">
<div class="slider-labels">
<span>Conservative (10%)</span>
<span>Aggressive (40%)</span>
</div>
- Live value display above track (Cormorant Garamond, 2rem, gold)
- Gold thumb (20px circle), subtle track (4px, rgba 0.08)
- Labeled endpoints with descriptive context
- Step increments of 5 to prevent false precision
Hint Design
Calculator hints tell the person WHAT TO COUNT. They're more specific than diagnostic/revelation hints because the person is providing actual numbers, not selecting from options.
Good hints:
- "No-shows, ghosted proposals, past clients who drifted, referrals that fizzled, inquiries that went nowhere. Count all of them."
- "Your typical first-year fee per client. If it varies, use the midpoint."
- "Ads, content, networking costs, sponsorships, referral fees — everything you pay to find people who don't already know you."
Bad hints:
- "Enter a number."
- "How many contacts do you have?"
- No hint at all.
Validation
function checkReady() {
var c = document.getElementById('input-contacts').value;
var v = document.getElementById('input-value').value;
var m = document.getElementById('input-marketing').value;
document.getElementById('btn-calculate').disabled = !(c > 0 && v > 0 && m !== '');
}
Calculate button stays disabled until all required fields have valid values. No partial results. No "we'll estimate the rest."
Edge case: $0 inputs. Some inputs legitimately accept zero (e.g., marketing spend — they might spend nothing). Allow zero where it's a real answer, but handle it in the computation: if marketing is $0, skip the ratio bar and reframe the insight around "this is your only growth channel."
Computation Logic
Pure arithmetic. No scoring, no categories. The calculator computes derived values from raw inputs and determines severity thresholds for contextual copy.
Deriving Everything From Their Inputs
This is a hard rule. Every number on the results page must trace back to what the person entered. No smuggled assumptions. No made-up benchmarks.
| Good | Bad |
|---|---|
recoveredClients = Math.round(contacts * recoveryRate) — both values from their inputs | newClients = Math.round(marketingSpend / 3000) — the $3,000 acquisition cost is a number you invented, not something they entered |
ratio = quarterlyRecoverable / marketingSpend — both from their inputs | costPerAcquired = marketingSpend / estimatedNewClients — estimatedNewClients is a guess |
If a derived metric requires an assumption, either make it an input (let them enter it via slider) or don't show the metric.
Severity Thresholds
The primary computed metric determines which tier of contextual copy to display. Three tiers:
- High severity (red #c45a4a) — the number reveals a serious imbalance
- Medium severity (gold #b79d64) — notable, clear opportunity
- Low severity (green #5a9a6a) — better than most, but still worth acting on
Each tier gets different insight copy, different color treatment, and different framing — but the NUMBERS are always the person's real numbers. Only the interpretation changes.
Severity Background Consistency
All three severity tiers use the same opacity for background fills: rgba(r, g, b, 0.1). This keeps the visual weight consistent across tiers.
- Red:
rgba(196, 90, 74, 0.1) - Gold:
rgba(183, 157, 100, 0.1) - Green:
rgba(90, 154, 106, 0.1)
Note: the brand kit's canonical gold-dim value is rgba(183, 157, 100, 0.3) — that's for borders and tints, not background fills on insight boxes. At 0.3 the gold panel is noticeably more opaque than red or green panels at 0.1, creating inconsistent visual weight.
Division by Zero
Handle every case where a denominator could be zero. If marketing spend is $0, the ratio is undefined — don't compute it, don't display the ratio bar, and write the insight line to address the $0 case directly.
Results Page Structure
The results page does eight things in order. Some are conditional based on the tool's specific computation.
1. Hero Number
The single most important computed metric, displayed enormous. This is the moment of impact.
- Eyebrow label: uppercase, gold, names what the number represents
- Number: Cormorant Garamond, clamp(4rem, 12vw, 7rem), weight 300, colored by severity tier
- Unit line: 14px, stone, describes how the number was derived (show the formula)
- Count-up animation (scale 0.8 → 1, opacity 0 → 1, 0.6s ease)
- Centered, generous margin below (48px)
The hero number must be severity-colored, not always gold. If the hero is always gold regardless of the result, it undermines the severity system — a "good" result and a "bad" result look identical at the moment of impact.
2. Ratio Insight Line
The one sentence that captures the computed relationship. Gets its own insight box with severity-colored left border.
- Label above: "The ratio" or equivalent (Inter, 15px, weight 500, severity-colored)
- Body: the insight sentence referencing both sides of the relationship
- Background: severity-tinted at 0.1 opacity
- Left border: 3px, severity color
If the denominator is zero (e.g., $0 marketing), write a different insight line that doesn't reference the ratio. Don't show "infinity" or "$0" in a ratio sentence.
3. Ratio/Comparison Visualization
Shows the relationship between two computed values visually. Conditional — skip if one side is zero.
- Horizontal bar, two segments filling proportionally
- 40px height, no border-radius
- Primary segment in red (#c45a4a), secondary in stone (#8a8680)
- Percentage labels inside segments (only if segment ≥ 15% width — below that, the label is illegible)
- Legend below with colored dots and values
4. Stat Grid
Supporting numbers in a 2-column grid of cards.
- 2 columns desktop, 1 column at 968px
- 24px padding, centered text
- Big number: Cormorant Garamond, 2.5rem, weight 300, colored by meaning
- Label: 12px, stone
- Color-tinted backgrounds and borders matching the number's meaning
5. Equation Visual
Shows the before → after transformation.
- Contained box: subtle background + 1px subtle border
- Eyebrow label in stone (not gold — stone for section labels inside result boxes)
- Before → After: two items connected by arrow (→)
- Before number: red, with line-through text-decoration
- After number: green
- Below a divider: key recovery metrics in gold at 2.25rem
- Each number has its own label below
The equation must use only their inputs. Don't introduce made-up numbers in the equation (see Computation Logic).
6. Insight Box (Severity-Tiered)
Interpretation of their specific numbers. Neutral styling (subtle background + 1px border, no severity color).
- Title changes by severity tier — genuinely different framing, not word swaps
- Body references their actual computed numbers
- One paragraph, 2–4 sentences
- Different copy per tier
7. Context Box (Scale-Tiered)
What the recovered/changed numbers mean in practical terms. Same neutral styling.
- Title references the specific computed number (e.g., "What 6 recovered clients per quarter looks like")
- Body scales framing based on output magnitude:
- High output (≥$200K annual): equivalence framing — "that's a full business development hire"
- Medium output ($50K–$200K): reinvestment framing — "enough to fund your marketing budget"
- Low output (<$50K): compounding framing — "the starting point; the second round compounds"
8. Bridge + CTA
Bridge to companion content: Links to the campaign's thought leadership article. Copy should connect their specific numbers to why the deeper content matters.
Bridge copy quality rule: Name the specific mechanisms from the article, not generic teasers.
| Good Bridge | Bad Bridge |
|---|---|
| "Each of those 30 silent contacts went quiet for a different reason. A no-show needs permission to come back without shame. A stalled proposal needs a smaller entry point." | "The full breakdown shows how practices make the shift." |
The good version names wound types and barriers. The bad version could describe any article about anything.
CTA: Connects calculator output to the service. The copy should name what the calculator showed AND what the service provides.
Below CTA:
- Disclaimer in italics, stone color, centered
- Recalculate button (btn-secondary) — goes to calc screen preserving inputs, not back to intro
UX Rules
Navigation
- Three screens: Intro → Calculator → Results
- No progress bar — calculators are too short and non-sequential to need one
- Calculator screen is a form, not a question sequence — all inputs visible at once
- Section labels group related inputs (gold uppercase eyebrows)
- Form divider between input groups when context shifts
- Calculate button at bottom of form, disabled until all inputs valid
- Recalculate goes to calc screen (preserves inputs), not intro
Transitions
window.scrollTo(0, 0)on screen change- Fade-in on results (0.5s ease, translateY 12px)
- Count-up animation on hero number (0.6s ease, scale 0.8 → 1)
Visual Design
Brand Compliance
All colors use hardcoded hex values in output files. Never use CSS custom properties (var()). The brand kit skill is explicit: canonical names (charcoal, gold, cream) are documentation labels, not CSS variable names.
Page Layout
Full-page screens. No tool-container wrapper (unlike revelation/diagnostic tools which use a container with gold border).
- Nav: fixed, full-width, #1a1a1a background, 3px #b79d64 bottom border. Logo image + text left, tool label right (#8a8680).
- Screens: full-page divs, display:none/block toggling.
- Container: centered, max-width 640px, 5% horizontal padding.
- Footer: #1a1a1a background, 3px #b79d64 top border, links + copyright.
Core Palette (Hardcoded)
| Name | Hex | Role |
|---|---|---|
| charcoal | #1a1a1a | Background, nav, footer |
| deep-charcoal | #2a2a2a | Gradient depth |
| gold | #b79d64 | Accent — labels, CTAs, slider, scrollbar |
| gold-light | #c4aa74 | Hover states |
| cream | #f5f4f0 | Primary text |
| stone | #8a8680 | Secondary text, hints, units |
| red | #c45a4a | High severity, "bad" numbers |
| green | #5a9a6a | Low severity, "good" numbers |
No ad hoc colors. Every hex in the file must appear in this table.
Typography
| Element | Font | Size | Weight |
|---|---|---|---|
| Intro title | Cormorant Garamond | clamp(2rem, 5vw, 2.75rem) | 400 |
| Input labels | Inter | 14px | 400 |
| Input hints | Inter | 12px | 300 |
| Input fields | Inter | 18px | 400 |
| Input units | Inter | 13px | 300 |
| Section/eyebrow labels | Inter | 0.625rem (10px) | 600, 0.25em tracking, uppercase |
| Slider value | Cormorant Garamond | 2rem | — |
| Hero number | Cormorant Garamond | clamp(4rem, 12vw, 7rem) | 300 |
| Stat card numbers | Cormorant Garamond | 2.5rem | 300 |
| Equation numbers | Cormorant Garamond | 1.75rem | 300 |
| Insight box title | Inter | 15px | 500 |
| Insight box body | Inter | 15px | 300 |
Cormorant Garamond is never set below 18px. Never set to Bold (700). Inter is never used for headlines.
Signature Elements
- Gold scrollbar (always)
- 3px gold nav border (always)
- 3px gold footer border (always)
- Gold accent on intro context box (3px left border)
Gold appears on max 2 elements per viewport. Count: intro screen has gold in the time label + button = 2. Calculator screen has section labels + slider value + button = 3 — acceptable because section labels are small and scanner-level, not competing with the CTA.
Sharp Geometry
No border-radius on structural elements — inputs, buttons, insight boxes, ratio bars, equation boxes. Only exceptions: scrollbar thumb (5px), slider thumb (50% / circle), legend dots (50% / circle).
Technical Specs
- Single HTML file — CSS + JS inline, no external dependencies except Google Fonts
- Vanilla JavaScript — no frameworks, no build step
- Works locally — opens from filesystem
- Mobile-first responsive — breakpoints at 968px and 768px
- No data saved — nothing persisted
- Computation in a single function —
calculate()reads all inputs, computes all derived values, builds all HTML - Severity thresholds determine contextual copy — functions return different text based on computed values
JavaScript Architecture
showScreen(id) → Toggle active screen, scroll to top
updateSlider() → Live-update slider value display
checkReady() → Enable/disable calculate button based on input validity
calculate() → Read inputs, compute all values, determine severity,
build full results HTML, show results screen
insightTitle(ratio) → Return severity-tiered title string
insightBody(ratio, …) → Return severity-tiered body with computed numbers embedded
recoveryContext(…) → Return scale-tiered context paragraph
QC Checklist
Brand Compliance
- [ ] Zero CSS custom properties (var()) — all colors hardcoded
- [ ] Every hex value matches the core palette table — no ad hoc colors
- [ ] No pure black (#000000) — use #1a1a1a or #2a2a2a
- [ ] No pure white (#ffffff) for text — use #f5f4f0
- [ ] Severity backgrounds all at 0.1 opacity (consistent visual weight)
- [ ] Label spec: 0.625rem (10px), weight 600, 0.25em tracking, uppercase
- [ ] Cormorant Garamond never below 18px, never Bold (700)
- [ ] No border-radius on structural elements (inputs, buttons, bars, boxes)
- [ ] Gold scrollbar present
- [ ] Nav: logo image + text left, tool label right, 3px gold border
- [ ] Footer: 3px gold top border, links + copyright
Inputs
- [ ] 3–5 inputs total (number fields + optional sliders)
- [ ] Every input has a label AND a hint
- [ ] Hints tell the person what to count / what to include
- [ ] Number fields are narrow (100–120px), not full-width
- [ ] Number fields suppress spinner buttons
- [ ] Placeholder is em-dash (—), not "0" or example text
- [ ] Dollar fields have $ prefix label
- [ ] Slider has live value display above track
- [ ] Slider has labeled endpoints with context
- [ ] Section labels group related inputs (gold uppercase eyebrows)
- [ ] Form divider between input groups when context shifts
- [ ] Calculate button disabled until all required inputs filled
- [ ] checkReady() fires on every input's oninput event
Computation
- [ ] Every number on results traces back to user inputs — no smuggled assumptions
- [ ] Division by zero handled (skip ratio bar, write alternate insight)
- [ ] $0 inputs handled where they're legitimate answers
- [ ] Percentages round to integers (no decimals in display)
- [ ] Severity thresholds produce correct tier for edge cases
- [ ] Annual projections use correct multiplier
Scoring Validation
- [ ] Minimum plausible input values produce a credible, non-zero result
- [ ] Maximum plausible input values produce a credible, non-inflated result
- [ ] Every severity tier is reachable by some input combination
- [ ] Boundary inputs between severity tiers land in intended tier (test exact threshold and ±1)
- [ ] Every input × input combination in a representative grid produces a believable number
- [ ] If multiple severity tiers exist (e.g., hero number tier + ratio tier), incoherent pairings identified and handled
Results
- [ ] Hero number prominent (clamp 4rem–7rem)
- [ ] Hero number colored by severity tier (not always gold)
- [ ] Ratio insight line gets its own box (severity border + background)
- [ ] Ratio insight references both sides of the relationship
- [ ] Ratio bar segments add up to 100%
- [ ] Ratio bar labels hidden when segment < 15% width
- [ ] Ratio bar skipped when one side is zero
- [ ] Stat grid shows supporting numbers with colored cards
- [ ] Equation visual shows before → after using only user-derived numbers
- [ ] Insight box uses severity-tiered title AND body (genuinely different, not word swaps)
- [ ] Insight body references actual computed numbers
- [ ] Context box uses scale-tiered framing (high/medium/low output)
- [ ] Bridge copy names specific mechanisms from the companion article
- [ ] CTA names what calculator showed AND what service provides
UX
- [ ] No progress bar
- [ ] All inputs visible on calculator screen (not one at a time)
- [ ] Recalculate goes to calc screen (preserves inputs), not intro
- [ ] Scroll to top on screen transitions
- [ ] Fade-in on results
- [ ] Count-up animation on hero number
Technical
- [ ] Single HTML file, no external dependencies (except fonts)
- [ ] Works when opened locally from filesystem
- [ ] Mobile responsive (test at 768px and 375px)
- [ ] No data saved or persisted
- [ ] Number fields work on mobile (correct keyboard type)
- [ ] Slider works on touch devices
- [ ] All computed text renders correctly (render test — .toLocaleString() for large numbers, not whether the math is right)
Copy Quality
- [ ] Zero AI slop (no parallel constructions, dramatic reveals, three-beat buildups)
- [ ] Insight text references the person's actual numbers on both sides of the comparison
- [ ] Different severity tiers read as genuinely different interpretations
- [ ] Context box scales framing appropriately (equivalence for large, compounding for small)
- [ ] Bridge copy names specific mechanisms, not generic teasers
- [ ] CTA connects calculator output to service
- [ ] Every sentence could be said out loud in a conversation
Reference Implementations
Subtract/Add Calculator (calculator-micro-tool-golden-example.html)
- Campaign: The Subtract/Add Equation
- Question: "How much of your team's effort is invisible to clients?"
- Inputs: Active clients (number), production hours/client (number), visible hours/client (number), automation % (slider)
- Hero metric: Invisible Work Ratio (percentage)
- Severity: ≥50% red, ≥30% gold, <30% green
- Visualization: Ratio bar (red/green), stat grid (2 cards), equation (before → after hours)
- Bridge: The Subtract/Add Equation article
- CTA: Systems Diagnostic
Dead List Calculator (dead-list-calculator.html)
- Campaign: The No-Show Revival
- Question: "What is your silence costing you relative to what you spend on marketing?"
- Inputs: Silent contacts/quarter (number), avg engagement value (dollar), quarterly marketing spend (dollar), recovery rate (slider)
- Hero metric: Annual Recoverable Revenue (dollar)
- Severity: ratio ≥2x red, ≥1x gold, <1x green
- Insight line: "For every $1 you spend finding strangers, $X is sitting in conversations you already had."
- Visualization: Ratio bar (red/stone), stat grid (2 cards), equation (contacts before → after recovery)
- Edge case: $0 marketing — ratio bar hidden, insight reframed
- Bridge: The No-Show Revival article (names five wound types and their barriers)
- CTA: Systems Diagnostic
Skill file reverse-engineered from the Subtract/Add Calculator and the Dead List Calculator, February 2026 v2: Scoring Validation section added from recurring QC gap identified during System Readiness Assessment build