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.
32,192 deduplicated orders. Still growing — Aug 2026 ran $3.18M. airtable
401 distributor records; only 141 codes appear in sales at all. airtable
Per year. The mean is meaningless here. airtable
$15.57M of $28.4M, on 15,134 orders. See section B. airtable
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).
| Rank | Rep | Code | TTM revenue | Orders | |
|---|---|---|---|---|---|
| 1 | Jake Kiernan | 3716 | $15,568,365 | 15,134 | |
| 2 | Christy Bermudez | 6744 | $4,128,525 | 4,135 | |
| 3 | Jonathan Gonzalez | 7461 | $2,950,190 | 3,574 | |
| 4 | Tylor Triplett | 9930 | $1,923,985 | 2,107 | |
| 5 | Luis Gomez | 1313 | $1,103,712 | 1,261 | |
| 6 | Nadav Gordon | 8083 | $983,429 | 939 | |
| 7 | Grant Lisk | 7777 | $819,869 | 650 | |
| 8 | Armando Ruiz | 1717 | $565,014 | 792 | |
| 9 | Jaccobo Osorio | 2684 | $498,747 | 992 | |
| 10 | Bryan Derrickson | 2130 | $405,037 | 451 |
Top 3 = 65%. Top 10 = 83%. Top 20 = 91%. airtable
| p10 | p20 | p30 | p40 | p50 | p60 | p70 | p80 | p90 | p100 |
|---|---|---|---|---|---|---|---|---|---|
| $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
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
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
| Manager | Reps | Standard rate | Notes |
|---|---|---|---|
| Jake Kiernan | 43 | 20% | Himself at 35%. Alec Kiernan carved out at 25%. |
| Claudia Lorenzo | 19 | 15% | Herself at 35%. |
| Verified Rx (entity) | 6 | — | Salaried 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.
Distributors.Commission Rate and the 6,011-row Customer-Distributor Splits.
Three places, and they do not have to agree.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.
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.
Real books with real headroom. This is where a spiff changes behaviour most, because the effort-to-outcome link is short enough to feel.
The bracket most likely to produce next year's Builders. Ranked on growth and customers added.
Ranked on new customers and consistency ahead of revenue — at this size a single order distorts a month, so revenue alone is noise.
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.
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.
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.
Organisations ranked against organisations. VRX at $15.6M competes with the other master books, not with a solo rep doing $13k.
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.
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.
| Signal | State | Detail |
|---|---|---|
| Revenue, orders, customers, AOV | Live | Order-2 (32,689 rows) + Sales Commission (39,082), both written to today |
| Growth vs prior period | Available | 14 months of monthly history, Jul 2025 onward |
| Activity recency | Available | 118 codes active in 30 days, 129 in 90, 140 TTM |
| Per-customer commission rate | Live | Customer-Distributor Splits, 6,011 rows, updated 28 Aug — this is the real rate engine, not the flat rate on the rep |
| Tenure | Capped at 13 months | No 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 / region | Does not exist | No field on the rep table at all |
| Quota / goal | Does not exist | Nowhere in 39 tables |
| Commission actually paid | Not trustworthy | See 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.
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.
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.
| Signal | Populated |
|---|---|
Payouts table | 2 rows — one blank, one a Draft for Aug 2025 |
Payout Items | 0 rows |
Commission Paid So Far | 76 of 39,082 (0.2%) |
Total Collected from Customer | 478 of 32,689 (1.5%) |
Last Payout Date | 1 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:
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 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.
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 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.
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.
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.
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.
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.
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.
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.
| Need | Reuse |
|---|---|
| Per-distributor aggregate | server/db-data-source.js → /distributor-overview |
| Privacy-safe rows | src/lib/derived-commissions.js → aggregateRowsForLeaderboard |
| Growth % | src/lib/distributor-groups.js → calculateTrendPercentage, getMonthToDateRange |
| Split-applied commission | src/lib/commission-splits.js → splitCommission, isPayable |
| Concentration maths | src/lib/sales-analytics.js → computeConcentration |
| Rules-version gating | src/lib/commission-rules.js → resolveRulesVersion |
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.
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.
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.
Distinct customers whose first-ever order across the whole book lands in the window and is owned by this rep.
Log-ratio of this window's revenue against the rep's own prior window.
Distinct ISO weeks with at least one owned order, over 13.
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.
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.
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:
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.
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.
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
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.