03 / Path · Independent Sales · 30 Aug 2026

Ranking the roster, without one permanent winner.

A review of the distributor book and a design for ranking, recognition and spiffs. Figures are from the live Airtable base Shopify Shop unless labelled otherwise, measured across all 39,082 commission rows joined to order totals and deduplicated by order. airtable is live production. dev fixture is the June snapshot on the dev Medusa cluster, illustrative only. vrx sheet is the Verified RX commission sheet.

01 / Trailing 12 months$28.4M

32,192 deduplicated orders. Still growing — Aug 2026 ran $3.18M. airtable

02 / Records vs reps401 → 141

401 distributor records; only 141 codes appear in sales at all. airtable

03 / Median rep$13,469

Per year. The mean is meaningless here. airtable

04 / Code 3716's share55%

$15.57M of $28.4M, on 15,134 orders. See section B. airtable

A / The roster, measured

Three people are 65% of the business.

Trailing-twelve-month revenue per distributor code, from live Airtable. Deduplicated by order — a naive per-rep sum double-counts multi-rep orders and overstates the book by 22% ($34.68M against a true $28.43M).

RankRepCodeTTM revenueOrders
1Jake Kiernan3716$15,568,36515,134
2Christy Bermudez6744$4,128,5254,135
3Jonathan Gonzalez7461$2,950,1903,574
4Tylor Triplett9930$1,923,9852,107
5Luis Gomez1313$1,103,7121,261
6Nadav Gordon8083$983,429939
7Grant Lisk7777$819,869650
8Armando Ruiz1717$565,014792
9Jaccobo Osorio2684$498,747992
10Bryan Derrickson2130$405,037451

Top 3 = 65%. Top 10 = 83%. Top 20 = 91%. airtable

The distribution, in percentiles

p10p20p30p40p50p60p70p80p90p100
$626$1,437$3,125$8,958 $13,469$31,739$56,456$101,421 $258,767$15.57M

The 90th percentile rep does $258k. The 100th does sixty times that. airtable

The book is growing, not stalling

Monthly revenue has risen every month bar two since launch: $244k in Aug 2025 → $3.95M in Jun 2026 → $3.18M in Aug 2026 (partial). 118 of 141 codes were active in the last 30 days. Whatever else is wrong, the selling motion works. airtable

B / What code 3716 actually is

Not a person, not a house account — an entire sales organisation.

The Verified RX commission sheet settles it. Code 3716 is the roll-up for a 68-person selling organisation, three managers deep. Jake's $15.57M is VRX's number, not one man's. vrx sheet

ManagerRepsStandard rateNotes
Jake Kiernan4320%Himself at 35%. Alec Kiernan carved out at 25%.
Claudia Lorenzo1915%Herself at 35%.
Verified Rx (entity)6Salaried staff and a shared "Jake + Claudia's Accounts" bucket split 50/50.

And it is deeper than two levels. Three reps are marked under jaq (beneath Jacquelyn, who is herself under Jake) and one under Fab (beneath Fabiana). So the real org is at least three tiers. The portal models parent_agent_id one level deep everywhere it is used — roster scope, sub-agents, team grouping. It cannot currently represent this shape.

Why this changes the whole design

C / The model

Weight classes, drawn on the real distribution.

These are not invented brackets — they are the buckets the roster already falls into, from live Airtable trailing-twelve-month revenue. Within a cohort the rank key is movement, not magnitude: a rep who grows 40% beats one who grew 4%, whatever the absolute dollars.

Circle5 reps · over $1M

The books that carry the business. Ranked among themselves on trailing-90-day growth and new customers. Absolute revenue is displayed — it is the truth and hiding it would be silly — but it is not the rank key. Becomes 4 reps if 3716 is excluded.

Builders10 reps · $250k–$1M

Real books with real headroom. This is where a spiff changes behaviour most, because the effort-to-outcome link is short enough to feel.

Momentum14 reps · $100k–$250k

The bracket most likely to produce next year's Builders. Ranked on growth and customers added.

Rising29 reps · $25k–$100k

Ranked on new customers and consistency ahead of revenue — at this size a single order distorts a month, so revenue alone is noise.

Starter64 reps · $1k–$25k

The largest cohort by headcount and the one a leaderboard has never spoken to. Median rep in the whole roster sits here at $13,469/yr.

Onboarding18 under $1k + 260 with no code or no sales

Not a competitive board. Milestones instead — first order, first reorder, fifth customer. Achievable and non-comparative. Note the roster is 401 records but only 141 codes ever appear in sales; most of that gap is Pending and Rejected applications, not dormant reps.

Two planes, not one

Because 3716 is an organisation, a single list cannot hold both kinds of competitor. The portal already has the right shape for this — the master view renders Top Teams and Top Individuals separately. Use it.

TeamsVRX · the 5 masters · the 150 with an upline

Organisations ranked against organisations. VRX at $15.6M competes with the other master books, not with a solo rep doing $13k.

Individualsreps holding their own code

The cohorts above. A rep who rolls up to someone else's code appears on their team's board, not here — until they have a code of their own.

Inside a teamJake's 43 · Claudia's 19

The most motivating board in the business and the one that cannot be built yet. It needs per-rep attribution inside VRX, which does not exist. See the prerequisite below.

How the brackets hold

D / What can actually be measured

Revenue is live. Tenure barely exists. Payment is fiction.

SignalStateDetail
Revenue, orders, customers, AOVLiveOrder-2 (32,689 rows) + Sales Commission (39,082), both written to today
Growth vs prior periodAvailable14 months of monthly history, Jul 2025 onward
Activity recencyAvailable118 codes active in 30 days, 129 in 90, 140 TTM
Per-customer commission rateLiveCustomer-Distributor Splits, 6,011 rows, updated 28 Aug — this is the real rate engine, not the flat rate on the rep
TenureCapped at 13 monthsNo join-date field exists. Only Created, and 12 records share a 2025-07-11 bulk-load date. Anyone who predates July 2025 is indistinguishable.
Territory / regionDoes not existNo field on the rep table at all
Quota / goalDoes not existNowhere in 39 tables
Commission actually paidNot trustworthySee section F

There is one real scoring system already in the base, and it is worth copying: Customers carries Order Frequency Score, Order Value Trend Score, Product Breadth Score, Health Score, Zone and Score Delta. That is a working composite-score methodology built in-house — it just scores customers rather than reps. Reuse the shape.

E / Phase one — recognition

Ship the status game before the money game.

Phase one ranks on revenue, orders and customers — never on commission. Revenue is the one number here that is unambiguously live and trustworthy. Rules v2.0 cuts over 1 September, two days out, and its rate logic does not exist in the schema yet; everything after that date is stamped isProvisional: true. A recognition board can live with a provisional number. A payout cannot.

F / Phase two — spiffs

There is no working payout ledger to attach money to.

This is the single biggest finding for phase two, and it is not a design problem — it is a missing system. Commission accrual is alive and correct. Commission payment died in September 2025.

SignalPopulated
Payouts table2 rows — one blank, one a Draft for Aug 2025
Payout Items0 rows
Commission Paid So Far76 of 39,082  (0.2%)
Total Collected from Customer478 of 32,689  (1.5%)
Last Payout Date1 record

Commissions Payable is a formula over Total Collected from Customer. That input is empty on 98.5% of orders, so Commissions Payable and Commission Status evaluate to $0 and "No Commission" across essentially the whole base. Any "commission paid" number pulled from Airtable today is fabricated. The only surviving signal is Commission Payout Status, a manual single-select with 3,113 rows marked PAID, maintained by hand.

So phase two is gated on rebuilding payout tracking, not on ranking design. Spiffs cannot be paid against a ledger that says everyone is owed zero. When that exists, the mechanics:

G / Anti-gaming

Assume it will be optimised against.

H / Blocking defects

Fix these before any rep sees a rank.

A non-master's rank is meaningless

server/db-data-source.js:228-230 scopes a non-master's roster to themselves plus direct children. Most reps therefore see a board of one row and a rank of 1. Gamifying on top of this ships a leaderboard that congratulates everyone for being first.

The leaderboard visibility toggle is dead

The PATCH in src/api/distributor.js:71-78 hits the 501 catch-all in database mode. show_on_leaderboard is read-only in practice — you cannot remove anyone from a board you are about to make prominent. In Airtable the same flag is checked on 288 of 401 records including reps with zero customers and Pending applications, so it currently means nothing.

A quarter of the split registry was dropped

1,322 of 6,011 Airtable split rows — 69 distinct distributor codes — name a distributor that does not exist in Medusa and were excluded at import. Those shares are credited to nobody. Two further codes appear in sales with no rep record at all: 6483 ($22,416 across 82 rows) and a junk Gonzalez row.

Eleven duplicate people, and a self-referential parent

Eleven names hold two or three records each. A 19 Jul 2026 batch created rate-0 clones of Kiernan, Pena and Ferreira. Jake Kiernan's record names himself as his own Parent Agent. Any ranking keyed on person rather than code will double-count, and any recursive roll-up will loop.

The largest sales team cannot see the leaderboard at all

buildVisibleNavigation in src/pages/Layout.jsx:181-199 drops the Leaderboard nav item for VRX accounts. Airtable has Is VRX checked on 70 records — matching the 68 on the sheet. So the single biggest block of sellers in the business is currently excluded from the feature you want to gamify.

VRX reps have no attributable identity — the prerequisite for all of this

68 people sell, and their revenue lands on one code. Until each has a distributor code, or orders carry a sub-rep field, they cannot be ranked, cannot earn a tier, and cannot be paid a spiff. Everything else in this document is downstream of that one change.

The commission sheet is a spreadsheet doing a database's job

68 rows and 15 of them (22%) carry no rate at all: fired ×5 — still listed — salary only ×3, under jaq ×3, under Fab, no clue ×2, and one row that is not a person but a shared bucket, Jake + Claudia's Accounts, split 50/50. Plus fired with a trailing space, 15 Percent capitalised inconsistently, CMG and Brannon | CMG MedSource sharing one email, a verifiedrxsolutions.co typo missing its m, and four people with no email. Two entries — CMG, TMD — are companies, not people.

Commission is provisional from 1 September

Rules v2.0 cuts over in two days and its rate logic is not in the schema. Everything after computes under v1.0 stamped provisional. Rank on revenue until that is resolved.

Three traps for whoever builds this

Orders (95 rows, dead since 1 Aug 2025) sits beside Order-2 (32,689, live) — querying the wrong one is almost certainly where "the data stopped in Aug 2025" came from. Two frozen Aug-2025 duplicates of the whole base share identical table IDs with the live one. And a separate "Sales Commission Tracker" base has perfect-sounding field names — Sales Rep, Commission Status, Date Of Payout(s) — and contains nothing but Airtable's demo data: John Doe, Jane Smith, and one empty row.

I / Implementation

Extend what exists. Almost none of this is new code.

The all-distributors console (GET /distributor-overview) already computes per distributor: orders, revenue, commission, distinct customers, active months, split orders, flagged count and AOV. It is all-time and unbucketed — the single axis it lacks is a period window. Add periods and cohorts to that endpoint and the ranking falls out of data that already exists.

NeedReuse
Per-distributor aggregateserver/db-data-source.js/distributor-overview
Privacy-safe rowssrc/lib/derived-commissions.jsaggregateRowsForLeaderboard
Growth %src/lib/distributor-groups.jscalculateTrendPercentage, getMonthToDateRange
Split-applied commissionsrc/lib/commission-splits.jssplitCommission, isPayable
Concentration mathssrc/lib/sales-analytics.jscomputeConcentration
Rules-version gatingsrc/lib/commission-rules.jsresolveRulesVersion

One attribution rule this design must not break. Revenue and order count belong to the owning distributor once, however many parties share the commission — only commission divides. Every board must state which of the two it ranks on. Mixing them is how a leaderboard starts disagreeing with a payout.

J / The scoring logic

Rank on movement, inside your weight class.

Cohort decides who you are measured against. Score decides where you land inside it. Nothing in the score is an absolute dollar figure — that is deliberate, and it is the only way a $13k rep and a $250k rep can be judged by one formula.

Unit and window

Attribution — where the 22% error lives

Revenue and order count belong to the owning distributor once, however many parties share the commission. Split participants get an assisted counter that is displayed but never feeds the score — otherwise co-repping becomes a way to farm rank, and 5,583 orders already carry more than one rep.

The four components

Acquisition35%

Distinct customers whose first-ever order across the whole book lands in the window and is owned by this rep.

Growth35%

Log-ratio of this window's revenue against the rep's own prior window.

Consistency18%

Distinct ISO weeks with at least one owned order, over 13.

Retention12%

Share of window revenue from customers who also bought in the prior window.

Acquisition must be measured globally, not per rep. If "new" means new-to-you, moving a customer between reps mints an acquisition out of nothing. Dedupe customer identity on normalised email, falling back to company name.

Growth is a log-ratio, not a percentage

g = ln( (rev_this_window + k) / (rev_prior_window + k) ) k = 10% of the cohort's median 90-day revenue

Why log. It is symmetric: doubling scores +0.693, halving scores −0.693. Percent growth is unbounded above and floored at −100%, which is precisely why every percent-growth leaderboard ever built is won by whoever had the smallest base.

Why k. It damps the denominator. Without it, $200 → $2,000 is +900% and beats every real performance in the bracket. With k drawn from the cohort's own median, a tiny base cannot manufacture a large ratio.

Then shrink it — the part that makes it honest

The classic failure of a growth board is a rep with two orders posting +300% and topping the table. Every component is therefore pulled toward the cohort midpoint in proportion to how much evidence the rep actually has:

w = n / (n + n₀) n = owned orders this window n₀ = the cohort's median order count component = w · percentile + (1 − w) · 50

A rep at the cohort median gets w = 0.5 — half their own signal, half the midpoint. At four times the median, w = 0.8. One order against a cohort median of twelve gives w ≈ 0.08, so they sit near 50 whatever their ratio claims. This is empirical-Bayes shrinkage, and it is the difference between a board people trust and one they laugh at.

Each component is a within-cohort percentile rather than a z-score — the distributions are skewed even inside a bracket, and a percentile survives that and can be explained to a rep in one sentence: you are in the 70th percentile of your bracket for new customers.

The composite

SCORE = 0.35·Acquisition + 0.35·Growth + 0.18·Consistency + 0.12·Retention 0–100, weights published, formula published

Tie-breaks, written down and deterministic, because money will eventually ride on them: acquisition, then growth, then owned order count, then earliest first owned order. Never alphabetical by name — which is exactly what the current board does today.

K / Rank, tier, streak

A floor that never drops, under a race that resets.

Rank alone is punishing: lose once and you are visibly demoted. Tier alone is inert: reach it and stop. Running both is what makes this stick.

The rate ladder already in use — 15% / 20% / 25% / 35% on the Verified RX sheet — is the closest thing the business has to a tier system today. It is hand-maintained in a spreadsheet. Worth folding into the tier design rather than inventing a parallel one. vrx sheet

L / Funding the spiffs

Pay on incremental revenue, never on total.

Each cohort's pool is a fixed percentage of that cohort's growth against the prior period, not of its revenue. Three consequences, all of them good:

Distribute 50 / 30 / 20 across the top three, or smoothly across everyone above the cohort median. Freeze at close, stamp the rules version, and keep it auditable down to the individual orders that composed the number — a rep who cannot see what made their figure will not trust it, and one wrong payout poisons the whole scheme.

None of this can run yet. Commissions Payable evaluates to $0 base-wide, Payout Items has zero rows, and Commission Paid So Far is populated on 76 of 39,082 records. Phase two is gated on rebuilding payout tracking, not on ranking design.

Path Peptides · internal Distributor ranking · review & design 30 Aug 2026