kpi-scoreboard-and-cadence — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited kpi-scoreboard-and-cadence (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Pick the handful of numbers a gym runs on, organize them by funnel stage, and review them on a fixed rhythm where each meeting ends in a decision.
Organize metrics along the path from stranger to retained member, so a problem shows up at the stage it lives in. Definitions, formulas, sources, and healthy ranges are in the "KPI reference" section below.
Managing only lagging numbers is driving by the rearview mirror. Move the leading numbers to change the lagging ones.
Put the few numbers the owner reviews every morning on one screen or board. Fill the "Scoreboard template" below. If it does not fit on one view, it has too many numbers.
Copy the script in the "Calculator" section into a file named scoreboard.js, edit the week's funnel numbers and benchmarks, and run node scoreboard.js. It returns each stage's conversion rate, the weakest stage against benchmark, and the neighbor skill to apply. Fixing the single weakest stage moves more members than tuning everything at once.
Three meetings, each producing one decision. Full agendas are in the "Meeting-agendas template" below.
Self-contained Node script. Save as scoreboard.js and run node scoreboard.js. No dependencies.
// Weekly funnel scoreboard. Edit inputs, then: node scoreboard.js
const week = {
leads: 120,
booked: 54,
shown: 38,
closed: 14,
}
// Healthy benchmarks for a local gym (edit to your own history).
const benchmarks = {
leadToBooked: 0.50,
bookedToShown: 0.70,
shownToClosed: 0.40,
}
const fixes = {
leadToBooked: 'objection-handling-and-speed-to-lead (faster contact, follow-up to book)',
bookedToShown: 'objection-handling-and-speed-to-lead (reminders and confirmation sequence)',
shownToClosed: 'closer-sales-script (sharpen the consult and the close)',
}
const stages = {
leadToBooked: week.booked / week.leads,
bookedToShown: week.shown / week.booked,
shownToClosed: week.closed / week.shown,
}
// Weakest = largest shortfall below benchmark (in percentage points).
let weakest = null
let worstGap = Infinity
for (const k of Object.keys(stages)) {
const gap = stages[k] - benchmarks[k]
if (gap < worstGap) { worstGap = gap; weakest = k }
}
const pct = (n) => (n * 100).toFixed(1) + '%'
console.log('STAGE CONVERSIONS (actual vs benchmark)')
for (const k of Object.keys(stages)) {
console.log(' ' + k.padEnd(14), pct(stages[k]), 'vs', pct(benchmarks[k]))
}
console.log('Weakest stage:', weakest, '(' + (worstGap * 100).toFixed(1) + ' pts vs benchmark)')
console.log('Focus this week:', fixes[weakest])STAGE CONVERSIONS (actual vs benchmark)
leadToBooked 45.0% vs 50.0%
bookedToShown 70.4% vs 70.0%
shownToClosed 36.8% vs 40.0%
Weakest stage: leadToBooked (-5.0 pts vs benchmark)
Focus this week: objection-handling-and-speed-to-lead (faster contact, follow-up to book)Read it: booking is the weakest stage at 45 percent against a 50 percent benchmark, a 5-point gap, while shows and closes are near target. The fix is not more ads or a new script; it is faster lead contact and better follow-up to get booked. One stage, one owner, one week. Re-run next week to confirm it moved.
The few numbers reviewed every morning.
GYM SCOREBOARD. [FILL: gym name]. [FILL: date]
THIS WEEK TARGET ACTUAL
Leads [FILL] ____
Booked [FILL] ____
Shown [FILL] ____
Closed (joined) [FILL] ____
HEALTH (lagging)
Active members [FILL] ____
Churn this month [FILL]% ____
Revenue (MTD) $[FILL] ____
LTV:CAC [FILL]:1 ____
WEAKEST STAGE THIS WEEK: [FILL from scoreboard.js]
FOCUS + OWNER: [FILL]DAILY HUDDLE (10 min, every morning)
1. Yesterday: leads / booked / shown / closed
2. Today's targets per person
3. Blockers
-> Decision: what each person does today to hit the number
WEEKLY SCORECARD (30-45 min)
1. Week's funnel and conversion rates (run scoreboard.js)
2. Weakest stage and why
3. Last week's focus: did it move?
-> Decision: the one stage to fix and who owns it
MONTHLY ECONOMICS (60 min)
1. Revenue, active members, churn
2. CAC, 30-day cash, LTV:CAC (from gym-money-model)
3. Which lever is constrained
-> Decision: where to invest next month, which lever to pullEach metric, definition, formula, source, and healthy range for a local gym:
Pick the few that drive decisions. A scoreboard with forty numbers gets ignored; one with eight gets used.
The rhythm matters as much as the metrics. Each meeting has a fixed length, a fixed agenda, and produces one decision.
The pattern across all three: look at the numbers, find the one thing to change, assign an owner, and check it next time. A cadence without a decision is just a status update.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.