Mean 0.962 · 33/40 perfect tests · $0.63 total · modalities in: text, image, video, audio · out: text · each card: the prompt → the correct answer (gold) → this model's actual answer
Modalities in means what you can send this model: text, images, files, video, or audio. Modalities out means what it can send back. Bench tasks feed text extracts, so modalities do not change the score. They are here so you know what this model can handle in real work.
DEFINITIONS (as applied) - Scope: 156 open deals; 124 at DS2 or later (DS2/DS3/DS4/DS5); 32 at DS1. - why-buys compliant: non-empty, ≥15 chars, not a placeholder (tbd / n/a / see notes / etc.), OR displayed as LONG(n) → counted present+substantive. - Non-compliant: empty or placeholder-or-short. Missing DS1 timestamp = t_ds1 blank. Regressed = any earlier-stage timestamp strictly later than a later-stage timestamp (checked adjacent pairs and full monotonicity). WHY-BUYS COMPLIANCE, DS2+ - Non-compliant: 101 / 124 = 81.5%. Compliant: 23 / 124 = 18.5%. - Arithmetic: 124 − 101 = 23; 23/124 = 0.1855; 101/124 = 0.8145. - Failure mode is uniform: 101 of 101 are blank. Zero short-string or placeholder values. - All 23 compliant values are LONG(n) markers — no DS2+ deal carries a visible inline why-buys. So 100% of the "compliant" set rests on truncated text, not on inspected copy. - Value exposure: $1,260,741 of $1,578,046 DS2+ pipeline = 79.9% sits on a blank why-buys. BY OWNER (non-compliant / DS2+ deals) - Cole Ingram 19/22 = 86.4% - Bryce Harmon 15/18 = 83.3% - Dana Mercer 18/22 = 81.8% - Alex Franklin 48/61 = 78.7% - Farid Osman 1/1 = 100.0% - Elena Sinclair n/a — her only deal (Deal-57FF13) is DS1, outside this rule. - Checks: 61+22+22+18+1 = 124; 48+19+18+15+1 = 101. - Gavin Porter and Hugo Lindqvist appear in owners.csv (both archived=true) with zero deals — no rate reported rather than a 0% one. DS1 TIMESTAMPS - Deals with no t_ds1: 0 / 156. REGRESSIONS - Regressed deals: 0 / 156. Stage timestamps are monotonic non-decreasing everywhere. DATA GAPS FOUND WHILE CHECKING (not part of the asked metrics) - 11 deals have no timestamp for the stage they are currently in: 10 at DS5 (Deal-D348E1, Deal-C26D20, Deal-547B2B, Deal-403845, Deal-B7EBD1, Deal-A2B47C, Deal-2465CE, Deal-C61CF7, Deal-584EE5, Deal-FD9F4E) and 1 at DS3 (Deal-317E6F). Their histories stop at DS4/DS2, so "clean timestamps" here is partly an absence-of-signal result, not evidence of discipline. - Deal-3EED2C has a blank last_contacted_field; Deal-57FF13 has blank last_contacted_field and blank source. THREE PROCESS FIXES 1. Gate the stage advance, not the record. Make why-buys a required field on the DS1→DS2 transition (validation rule on the stage-change workflow, ≥15 chars, placeholder denylist server-side). 101 blanks is not a coaching problem — reps at DS4/DS5 with money committed are equally blank, which means nothing in the flow ever asked. 2. Kill the free-text-only capture. Ship a structured why-buys block (business problem, owner of the problem, measurable impact, alternative considered, trigger event/date) with the 15-char minimum as a floor on the free-text summary. Then audit completion per sub-field, since LONG(n) markers currently hide whether the content is substantive or 1,067 characters of restated product features. 3. Put hygiene in the weekly pipeline review with a named owner and a deadline. Blank-why-buys DS2+ deals over a value threshold (say $10k) get a hard close date for remediation and are excluded from COMMIT/BEST_CASE eligibility until filled — a forecast-category gate changes behavior faster than a data-quality email. Separately, backfill the 11 missing current-stage timestamps and add a validation rule that a stage move must write its own timestamp.
OWNER RESOLUTION — deals_open.csv × owners.csv
Note on the premise: the extract as given has no owner name column at all, and owner_id is populated on all 156 rows (0 blanks). So resolution was a straight ID join, not a gap-fill.
1) DEALS RESOLVED
156 of 156 open deals resolved to an owner name. Count check: 35 + 67 + 24 + 22 + 7 + 1 = 156.
2) OWNER IDS WITH NO MATCH IN OWNERS TABLE
None. Distinct owner_ids in deals = {119337721, 83155923, 84342457, 83155924, 716654662, 701163055}; all six appear in owners.csv. No guessed names were needed.
3) ARCHIVED / DEACTIVATED OWNERS
Two archived owners exist in the owners table:
1520255671 — Gavin Porter (archived=true) — holds 0 open deals
77260721 — Hugo Lindqvist (archived=true) — holds 0 open deals
Neither ID appears in deals_open.csv, so no pipeline is stranded on a deactivated owner. All 156 deals sit with active owners.
4) TOTAL PIPELINE PER RESOLVED OWNER (all amounts, all stages, unweighted)
Bryce Harmon (119337721) 35 deals 1,054,144.00
Alex Franklin (84342457) 67 deals 624,310.00
Dana Mercer (83155923) 24 deals 341,195.00
Cole Ingram (83155924) 22 deals 288,161.43
Farid Osman (716654662) 7 deals 4,134.00
Elena Sinclair (701163055) 1 deal 2,100.00
----------------------------------------------------
TOTAL 156 deals 2,314,044.43
Arithmetic trail:
- Bryce Harmon: largest single item Deal-2D1F1B at 240,000 plus Deal-66D1FC 99,000 + Deal-C6FE92 72,000 + Deal-950043 70,000 + Deal-D73B89 63,600 carry most of the total; 17 of his 35 deals are DS1 and three of those are placeholder 1.00 amounts (Deal-012CB1, Deal-483B2D, Deal-3795AD — the last is DS2).
- Alex Franklin: 67 deals, smallest 1,080 (Deal-BA571A), largest 62,000 (Deal-EC3025).
- Dana Mercer: 24 deals, largest 60,000 (Deal-44EA29), smallest 1,920 (Deal-0660B4).
- Cole Ingram: only owner with non-integer amounts. Long add: 2760 + 1330 + 7225.4 + 3360 + 5616 + 2700 + 7781.2 + 6947.5 + 40000 + 12168 + 2480.4 + 11116 + 11193 + 1875 + 31750 + 32175 + 4779.88 + 3334.8 + 58529.25 + 4140 + 18000 + 18900 = 288,161.43. Largest 58,529.25 (Deal-D04904, DS2, close 2027-02-26).
- Farid Osman: 7 deals = 1249 (Deal-499BF6) + 2880 (Deal-8BA24E) + five 1.00 placeholders (Deal-03BA69, Deal-117863, Deal-F17780, Deal-2B39B0, Deal-8FDCD2) = 4,134.00.
- Elena Sinclair: single deal Deal-57FF13 = 2,100.00. Note this row has a blank last_contacted_field and n_contacts=3 with no close-date activity beyond 2026-09-02 creation; close_date 2026-09-02 is in the past relative to the extract.
- Cross-check: sum of the six owner totals = 2,314,044.43 = sum of all 156 row amounts. Unmatched amount = 0.00. Recomputed with exact decimal arithmetic to avoid float drift on Cole Ingram's cents; both methods agree.
Data caveats worth one line each:
- Five deals carry amount = 1 (placeholder, not real pipeline): Deal-012CB1, Deal-483B2D, Deal-3795AD, Deal-03BA69, Deal-117863, Deal-F17780, Deal-2B39B0, Deal-8FDCD2 — 8 rows total. Excluding them drops the grand total to 2,314,036.43 and Farid Osman to 2,879.00.
- The owners.csv on disk at /Users/amaniphipps/owners.csv carries the same eight owner_ids but entirely different names (e.g. 119337721 = Jake Mason, 84342457 = Justin Durfee). I used the inline table you provided, per your instruction to use only supplied data. If the on-disk file is the live roster, every name above is wrong while the ID join, counts, and dollar totals stay correct.
Gong ↔ HubSpot integrity check. Join key: `gong.hs_deal_id` → `deals_open.deal_id`. `gong_owner_id` was never joined to `owner_id` (confirmed unjoinable: 14 distinct Gong user ids vs 6 HubSpot owner ids, intersection = 0). Stage is the current `stage` column, not the t_ds* timestamps.
Row counts: gong = 67 rows (no duplicate hs_deal_id), deals_open = 156 rows (no duplicate deal_id).
(a) ORPHANS — 30 of 67 gong rows (44.8%)
Arithmetic: 67 rows − 37 with a matching deal_id = 30 orphans. 30/67 = 0.4478 → 44.8%.
Those 30 rows carry 304 of the 411 total calls_90d in the file (304/411 = 74.0% of logged call volume sits on deals that are not in the open default pipeline).
Sample aliases (all from the orphan set): Deal-8FA85D (46 calls), Deal-8FC3F9 (24), Deal-3B7945 (21), Deal-42B265 (21), Deal-9CCC42 (17), Deal-36EA09 (17), Deal-9A43B4 (14), Deal-605F3C (12).
Full orphan alias list for reference: Deal-8FA85D, Deal-8FC3F9, Deal-3B7945, Deal-42B265, Deal-9CCC42, Deal-36EA09, Deal-9A43B4, Deal-605F3C, Deal-E2D34B, Deal-76821A, Deal-D84A2D, Deal-1A0416, Deal-228783, Deal-3F86A0, Deal-9897FA, Deal-422BA6, Deal-344163, Deal-B038F0, Deal-5CA5AF, Deal-D3BD1C, Deal-5592CC, Deal-1E8CFB, Deal-AC944F, Deal-DECCF3, Deal-51EA1A, Deal-38CA53, Deal-32088A, Deal-7C4130, Deal-C00480, Deal-3B6668.
Two signals say these are closed/deleted/reparented deals rather than a broken join:
- 25 of 30 orphans have calls_with_ds2_date = 0 AND calls_with_sqo_date = 0. Every one of the 37 matched rows has at least one non-zero (0 of 37 both-zero). The orphans never reached DS2/SQO in Gong's view of them.
- 16 of 30 orphan ids cluster in the 60250/60251 prefix block (60251290957, 60251649055, 60251639682, 60251082126, 60250446726, 60251622924, 60251652002, 60251092117, 60251004342, 60251681286, 60251124387, 60251184778, 60251733611, 60251032234, 60251705714, 60251130117) — a contiguous imported id range absent from deals_open.
Window caveat (data does not match the stated "last 90 days"): the latest date anywhere in the file is 2026-09-16, so a true 90-day window starts 2026-06-18. Yet 13 orphans have last_call *after* 2026-09-16 (out to 2026-11-27 — future-dated), and 13 orphans have first_call *before* 2026-06-18 (back to 2026-06-08); 8 rows are both. 28 of 67 rows overall start before the window edge. The orphan count of 30 is exact on the data as given, but the "90d" label on calls_90d is not trustworthy.
Reverse direction, for context: 119 of 156 open deals (76.3%) have no gong row at all. Of the 37 that do match, 12 sit on deals below DS3 (Deal-03BA69 DS1, Deal-523604 DS1, Deal-A414F6 DS1, Deal-8FDCD2 DS1, Deal-117863 DS1, Deal-AF932D DS2, Deal-3795AD DS2, Deal-F40F04 DS2, Deal-CA7DC0 DS2, Deal-A71728 DS2, Deal-93C8BF DS2, Deal-4B0BEB DS2) — so only 25 matched rows land in the DS3+ population used in (c).
(b) DUPLICATE CONVERSATION KEYS — 0 rows
Arithmetic: rows where calls_90d > distinct_conversation_keys = 0 of 67. Every row has calls_90d == distinct_conversation_keys exactly (e.g. Deal-C6FE92 11=11, Deal-8FA85D 46=46, Deal-3B6668 4=4). Excess duplicate keys = Σ(calls_90d − distinct) = 0. No double-counted conversations; the duplication problem in this file is not at the conversation-key level.
(c) DS3+ CALL COVERAGE — 25 of 85 = 29.4%
Arithmetic: deals_open with stage ∈ {DS3, DS4, DS5} = 85 (DS3 = 61, DS4 = 14, DS5 = 10; 61+14+10 = 85). Of those, 25 have a gong row, and all 25 rows have calls_90d ≥ 3 (minimum 3, maximum 11), so 25 have at least one logged call. 25/85 = 0.2941 → 29.4%. Coverage gap = 60 of 85 = 70.6%.
Dollar weighting is worse than the deal count: the 60 uncovered DS3+ deals total $494,323.08 of the $876,779.08 DS3+ book = 56.4% of late-stage open value with zero logged call in this file.
Largest uncovered DS3+ deals by amount: Deal-B25F40 (DS3, $40,000), Deal-7BBDFA (DS3, $37,440), Deal-530B50 (DS3, $31,200), Deal-D9A72E / Deal-4F775F / Deal-E73427 / Deal-B936FE / Deal-CFE1E8 (DS3, $18,000 each), Deal-1CCE5C (DS3, $20,880), Deal-792D44 (DS3, $15,000), Deal-E0B692 (DS3, $16,200), Deal-9AAE5F (DS4, $11,250).
Note the skew: coverage is 29.4% overall, but the DS3+ deals that ARE covered are mostly the ones Gong already keyed — the 14 DS4 deals show 5 covered (Deal-25F752, Deal-E53952, Deal-5408B0, Deal-3974EB, Deal-944310, Deal-C6D97A = 6) and the 10 DS5 deals show 6 covered (Deal-D348E1, Deal-C26D20, Deal-547B2B, Deal-B7EBD1, Deal-A2B47C, Deal-2465CE, Deal-C61CF7, Deal-584EE5, Deal-FD9F4E = 9 of 10 for DS5). Recomputed cleanly: DS5 = 9/10 covered, DS4 = 6/14, DS3 = 10/61. 9+6+10 = 25. Late-stage coverage collapses at DS3, which is where the pipeline volume is.
Bottom line: the mapping is unsound. 44.8% of Gong rows point at deals that aren't in the open pipeline, and 70.6% of DS3+ open deals have no logged call — while conversation-key integrity is clean (0 duplicates), so the failure is at the deal-ID join / pipeline-membership layer, not at Gong's own dedup. Missing data I can't resolve from these two files: whether the 30 orphans are closed-won, closed-lost, or moved to a non-default pipeline (deals_open contains only open default-pipeline rows, so it cannot distinguish those three), and why 13 rows carry last_call dates past 2026-09-16.
Working files: /Users/amaniphipps/vera-work/gong-integrity/{gong_calls_by_deal_90d.csv, deals_open.csv, check2.py}
```sql
-- Per customer company, first calendar month as a customer:
-- unique givers, recognition count, successful redemption count.
-- "Customer" / first month: anchored on FIRST_SUB_PAYMENT_DATE (first paid month).
-- SIGNUP_DATE / ACTIVATED_DATE are pre-customer events, so they are not used
-- to define the first month as a customer.
WITH cohort AS (
SELECT
COMPANY_ID, -- ASSUMED COLUMN NAME: catalog states
-- "one row per self-serve company" but
-- does not enumerate the company key.
M1_USERS AS unique_givers, -- ASSUMED MAPPING: only user-count column
-- the catalog offers for month 1; there is
-- no separate givers dimension table.
-- Historical giving count taken as-is from the pre-aggregated M1_GIVES.
-- The documented "exclude deleted givers" filter is deliberately NOT applied
-- here: per business rules it understates historical giving counts.
M1_GIVES AS recognition_count,
DATE_TRUNC('month', FIRST_SUB_PAYMENT_DATE) AS first_customer_month
-- PRODUCTION.PLG.COMPANY_COHORT_SUMMARY: the only populated, documented source of
-- per-company month-1 (M1_*) cohort metrics. Chosen over the decoys:
-- PRODUCTION.HUBSPOT.DEALS (STALE, last sync 2023-03) and
-- HUBSPOT_HUB_1973303.V2_LIVE.OBJECTS_DEALS (UNPOPULATED) are explicitly barred,
-- and no other listed table carries giving/redemption cohort data.
FROM PRODUCTION.PLG.COMPANY_COHORT_SUMMARY
WHERE FIRST_SUB_PAYMENT_DATE IS NOT NULL
),
redemptions AS (
SELECT
c.COMPANY_ID,
COUNT(*) AS successful_redemption_count
-- PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2: despite the DEPRECATED
-- schema name, the catalog documents this as THE source for redemption counts.
-- Business rule applied: only STATE = 'succeeded' rows count as redemptions.
-- Caveat recorded in catalog: confirm before relying on it for finance-grade numbers.
FROM PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2 r
JOIN cohort c
ON c.COMPANY_ID = r.COMPANY_ID -- ASSUMED COLUMN NAMES: the catalog
AND DATE_TRUNC('month', r.CREATED_AT) -- enumerates only STATE for this table;
= c.first_customer_month -- COMPANY_ID / CREATED_AT are assumed
-- and must be verified before running.
WHERE r.STATE = 'succeeded'
GROUP BY c.COMPANY_ID
)
SELECT
c.COMPANY_ID,
c.first_customer_month,
c.unique_givers,
c.recognition_count,
COALESCE(r.successful_redemption_count, 0) AS successful_redemption_count
FROM cohort c
LEFT JOIN redemptions r
ON r.COMPANY_ID = c.COMPANY_ID -- LEFT JOIN so companies with zero
-- succeeded redemptions in month 1
-- still report (count = 0).
ORDER BY c.COMPANY_ID, c.first_customer_month;
```
Verified everything programmatically. Two files' worth of work, one hard gap: **no deals file was supplied**, so deal-field completeness and the pipeline-dollar ranking are not computable. Details below.
═══════════════════════════════════════════
0. SCOPE GAP — DEALS DATA ABSENT
═══════════════════════════════════════════
The extract contains exactly three files: companies.csv (34 rows), contacts.csv (52 rows), zoominfo_enrichment.csv (25 rows). There is no deals object, and no amount / close-date / stage / owner / why-buy field anywhere in the three files present.
Therefore, of the seven fields you asked me to audit on deals, I can audit ZERO:
owner ............ not present
stage ............ not present
amount ........... not present
close date ....... not present
why-buys ......... not present
And the closing requirement — "the 10 fixes with the most pipeline amount at stake" — cannot be answered in dollars. I rank by records affected instead and label it as a non-revenue proxy. If you supply deals.csv, I'll redo sections 1, 2 and 7 with real pipeline weighting.
═══════════════════════════════════════════
1. COMPLETENESS PER FIELD
═══════════════════════════════════════════
COMPANIES (n = 34)
industry ......... 34/34 = 100.0% (missing 0)
employee_count ... 25/34 = 73.5% (missing 9) → 34−25 = 9
hq_country ....... 28/34 = 82.4% (missing 6) → 34−28 = 6
fully complete row 21/34 = 61.8%
Caveat on the 100%: industry is populated everywhere but not clean. 11 of 34 rows (32.4%) hold a non-canonical value — 'tech' (4), 'Tech ' with a trailing space (4), 'health care' (2), 'SaaS' (1). 4 rows carry untrimmed whitespace. So: 100% populated, 67.6% usable without normalization.
CONTACTS (n = 52)
email ............ 52/52 = 100.0% populated, but only 48/52 = 92.3% syntactically valid
title ............ 39/52 = 75.0% (missing 13)
persona .......... 37/52 = 71.2% (missing 15)
COVERAGE (not requested, but it dominates the risk)
companies with ≥1 contact ... 20/34 = 58.8%
companies with zero contacts 14/34 = 41.2%
companies with a champion ..... 13/34 = 38.2%
companies with an econ buyer ... 8/34 = 23.5%
contacts actually reachable ..... 47/52 = 90.4% (valid email AND email-domain = company-domain)
═══════════════════════════════════════════
2. DUPLICATE COMPANY CLUSTERS + SURVIVORS
═══════════════════════════════════════════
Confirmed clusters — identical domain, 2 clusters, 4 rows:
CLUSTER A · domain acme-corp.com
C-0A092931 | Technology | 500 | US
C-0A092932 | tech | 510 | USA
industry agrees after normalization; hq_country agrees after normalization; employee_count DISAGREES (500 vs 510).
No enrichment row exists for acme-corp.com, so nothing in this extract can arbitrate 500 vs 510.
→ SURVIVOR: C-0A092931. Rationale: its values are already canonical (no re-casing, no trimming), and it is 3/3 populated. Merge C-0A092932 into it and carry the 500-vs-510 conflict forward as an OPEN item — do not silently pick 500.
→ Evidence gap: neither row has any contact, so there is no engagement signal to break the tie.
CLUSTER B · domain globex.io
C-0A092933 | SaaS | 200 | US
C-0A092934 | Technology | 200 | US
employee_count and hq_country agree exactly. Industry is the only divergence, and it is a granularity difference, not a contradiction — SaaS is a subset of Technology.
→ SURVIVOR: C-0A092934 (canonical value, matches the cluster's other two fields). Preserve 'SaaS' from C-0A092933 as a sub-segment tag rather than discarding it. No enrichment row for globex.io to arbitrate.
Unverified clone CANDIDATES — distinct domains, identical normalized attribute triple. These are NOT duplicates. company_alias values are opaque hashes and there is no legal-name column, so name-variant clustering is impossible from this extract; attribute coincidence is weak evidence.
C-EC3025 / C-60C75F ......... Technology | (blank) | US
C-44EA29 / C-D04904 ......... Technology | (blank) | (blank)
C-425E2A / C-BA969B ......... Technology | 50 | US
C-7BBDFA / C-50D386 ......... Healthcare | (blank) | CA
→ Action: resolve only against an external name source. Do not merge on this basis.
═══════════════════════════════════════════
3. INVALID EMAILS AND DOMAIN MISMATCHES
═══════════════════════════════════════════
INVALID (4) — all the same shape, `userN@` with an empty domain part and no TLD:
CT-0010 C-66D1FC 'user0@'
CT-0080 C-92D97D 'user0@'
CT-0081 C-92D97D 'user1@'
CT-0192 C-425E2A 'user2@'
These are truncated values, not typos — a systematic capture failure, likely the same upstream export bug across 3 companies.
DOMAIN MISMATCH (1):
CT-0011 C-66D1FC email user1@other-domain.com vs contact.domain 66d1fc.com vs company.domain 66d1fc.com
Both comparisons fail. Either the contact left the company or the row was mis-associated. Flag for rep verification — do not auto-correct the domain to match, that would fabricate an affiliation.
Note: the 4 invalid addresses cannot be domain-checked at all, so they are reported separately from mismatches rather than lumped in.
Contact-level damage: 5 of 52 unusable = 9.6%. Company-level: C-92D97D loses 2 of its 3 contacts (CT-0080, CT-0081) and C-66D1FC loses 2 of 3. Worst single loss — C-425E2A's ONLY champion is CT-0192, whose email is invalid. That account currently has no reachable champion on record.
═══════════════════════════════════════════
4. SAFE ENRICHMENT FILLS (matching row only)
═══════════════════════════════════════════
Join: 25 enrichment rows, all 25 match a company domain, 0 orphan enrichment rows. 7 unique company domains have NO enrichment row (9 company rows): 332637.com, 93c8bf.com, acme-corp.com, ba969b.com, c9bb20.com, ee9ffb.com, globex.io.
FILLABLE — employee_count, 8 rows (this is the only field enrichment can fill; industry and hq_country yield 0 fills because every CRM industry is already populated and every blank-country row is also blank in ZoomInfo):
C-EC3025 (ec3025.com) ← 400
C-96039F (96039f.com) ← 400
C-44EA29 (44ea29.com) ← 400
C-D04904 (d04904.com) ← 400
C-B23205 (b23205.com) ← 400
C-60C75F (60c75f.com) ← 400
C-7BBDFA (7bbdfa.com) ← 400
C-50D386 (50d386.com) ← 400
⚠ HOLD THESE. All eight fills are the identical value 400, across eight companies in four different industries on two continents. That is the signature of a placeholder/default in the enrichment export, not eight independent measurements. Recommend verifying one or two against a second source before writing all eight. I have not counted them toward the post-fill numbers as settled.
STILL MISSING after the join — 5 rows where CRM and ZoomInfo are BOTH blank. Nothing here can fill these; they need a different source or rep input:
hq_country: C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5
(C-44EA29 and C-D04904 are double-blind: blank country AND their employee_count only arrives via the suspect 400 above.)
Plus C-93C8BF: employee_count blank AND no enrichment row at all — the one row that stays incomplete even if the 400s validate. C-EE9FFB: hq_country blank AND no enrichment row.
═══════════════════════════════════════════
5. CRM vs ENRICHMENT DISAGREEMENTS + SOURCE RECOMMENDATION
═══════════════════════════════════════════
Across the 25 matched rows there are 62 field comparisons where both sides are populated. Result: ZERO hard contradictions. Every disagreement is a vocabulary or formatting difference. That is a genuinely good sign for CRM accuracy and it changes the recommendation — this is a normalization problem, not an accuracy problem.
SOFT DISAGREEMENT (20 instances, 2 categories):
a) Industry granularity — 10 rows, CRM 'tech'/'Technology'/'Tech ' vs ZI 'Computer Software':
C-66D1FC, C-EC3025, C-44EA29, C-92D97D, C-D04904, C-77A95A, C-AA8DDA, C-B25F40, C-60C75F, C-425E2A
Both values stand — ZI is strictly more specific, and no row claims a conflicting vertical.
→ RECOMMENDED SOURCE: ZoomInfo, stored as a sub-industry, with CRM's 'Technology' retained as the reporting rollup. Don't overwrite the CRM field; you'd lose segment comparability with historical reports. Where CRM says 'SaaS' (C-0A092933) keep CRM — it is more specific than anything ZI offers, and ZI has no row for that domain anyway.
b) Country formatting — 10 rows, CRM 'US'/'USA' vs ZI 'United States':
C-66D1FC, C-950043, C-EC3025, C-96039F, C-77A95A, C-B23205, C-E51FB7, C-D0662E, C-425E2A, C-2D7423
→ RECOMMENDED SOURCE: neither. This is a formatting defect on both sides (ZI is inconsistent too — it emits 'United States', 'UK', 'Canada' and blanks, mixing full names with codes). Normalize to ISO 3166-1 alpha-2: US, GB, CA. Independent of either vendor.
c) Cluster-internal conflict, no arbitration available: acme-corp.com 500 vs 510 employees. ZI has no row. → Escalate; do not average or guess.
Post-fill completeness (counting the 8 employee_count fills as provisional):
employee_count ... 73.5% → 33/34 = 97.1% (+23.5 pts)
hq_country ....... 82.4% → 82.4% (no change — zero fills available)
industry ......... 100% populated; 67.6% → 100% after vocabulary normalization
full company row .. 61.8% → 27/34 = 79.4% (+17.6 pts)
Ceiling: 7 rows stay incomplete for country (5 both-blank + C-EE9FFB and C-93C8BF with no ZI row). Enrichment alone cannot get this file past 79.4% row-complete.
═══════════════════════════════════════════
6. TOP 10 FIXES — RANKED BY EXPOSURE, NOT DOLLARS
═══════════════════════════════════════════
Pipeline amount is unavailable (§0), so "most dollars at stake" is unanswerable. Ranked instead by: deal-blocking severity → accounts affected → records affected. Treat the ordering as risk-ranked, and note explicitly that record count is NOT a revenue proxy — one 50-person account and one 1,500-person account count as 1 each here.
1. Repair the 4 truncated `userN@` emails (CT-0010, CT-0080, CT-0081, CT-0192). Restores C-425E2A's only reachable champion and halves the contact loss at C-92D97D and C-66D1FC. Cheapest fix, highest engagement impact.
2. Investigate CT-0011 (user1@other-domain.com). Verify departure vs mis-association before touching it — C-66D1FC's champion coverage depends on whether this rep is still there.
3. Attach contacts to the 14 zero-contact companies (41.2% of the book). Largest single hole in the extract and the biggest unknown for any pipeline view.
4. Resolve the acme-corp.com cluster (C-0A092931 survivor) INCLUDING the 500-vs-510 conflict. Merging without settling headcount just relocates the error.
5. Resolve the globex.io cluster (C-0A092934 survivor, preserve 'SaaS' as sub-segment).
6. Validate the eight 400-employee fills against a second source before writing. Suspect placeholder. Blocks 23.5 points of employee_count completeness either way — verify, then commit.
7. Normalize industry vocabulary on 11 rows (incl. 4 trailing-space 'Tech ') to a controlled list, adopting ZI 'Computer Software' as sub-industry. Unblocks segmentation and any industry-level reporting.
8. Normalize hq_country to ISO alpha-2 on 20 rows. Pure formatting; makes the 6 real blanks visible as actual gaps instead of hiding among 'US'/'USA'/'United States'.
9. Source hq_country for the 5 both-blank rows (C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5) outside ZoomInfo — this export cannot help. Country drives timezone, entity and currency assumptions.
10. Extend enrichment coverage to the 7 uncovered domains (9 company rows), prioritizing the 5 UK/Canada accounts (C-332637, C-93C8BF, C-BA969B, C-C9BB20) — the file's only non-US/CA concentration and entirely unenriched.
Honorable mention, 11th: backfill 15 missing personas and 13 missing titles (71.2% / 75.0%). High record count, but it ranks last because it degrades qualification quality rather than blocking contactability.
Files: /tmp/crmaudit/audit.py and /tmp/crmaudit/audit2.py reproduce every number above.
Classified all 90 rows. Full working below.
## Per-deal classification
```
deal_alias tag category side $
Deal-DB0AAC Timing1yr+ timing buyer 5,115
Deal-F7F635 Competitor competitor buyer 3,600
Deal-AC944F MIA other unknown 3,400
Deal-214060 MIA other unknown 2,880
Deal-91A056 Timing1yr+ timing buyer 2,975
Deal-29326C Timing1yr+ timing unknown 6,300
Deal-5DB9B0 NotICP other unknown 10,800
Deal-831B7B Timing1yr+ timing buyer 7,200
Deal-F97C37 Competitor product gap Bonusly 4,320
Deal-13E9CF NoPriority/Cost no decision buyer 33,750
Deal-39E25C Timing1yr+ timing buyer 3,360
Deal-7ED004 Budget/Price pricing buyer 60,000
Deal-21B045 MIA other unknown 11,700
Deal-B3ABED Timing1yr+ timing unknown 40,001
Deal-422BA6 Competitor competitor buyer 3,000
Deal-ED9AE7 Lost DM timing unknown 2,340
Deal-988493 MIA other unknown 8,400
Deal-381C8C Competitor competitor buyer 4,800
Deal-F308CA MIA other unknown 30,321
Deal-F1E8A6 Competitor competitor buyer 3,150
Deal-B6AC09 Timing1yr+ timing buyer 3,000
Deal-70F704 Lost DM other unknown 3,000
Deal-E6E80A Timing1yr+ timing buyer 24,000
Deal-B038F0 Timing1yr+ timing buyer 2,340
Deal-4664E1 MIA other unknown 12,000
Deal-175756 Timing1yr+ timing buyer 2,880
Deal-E74A73 NoPriority/Cost no decision buyer 2,100
Deal-DDAB52 Competitor competitor buyer 4,000
Deal-ACE061 Competitor competitor buyer 3,600
Deal-BB78F3 Timing1yr+ timing buyer 6,600
Deal-D48E0B MIA other unknown 14,931
Deal-15DA99 Timing1yr+ timing buyer 19,600
Deal-F4AF5D Timing1yr+ timing buyer 5,760
Deal-79B7A1 Timing1yr+ timing unknown 25,000
Deal-583ADB MIA other unknown 3,600
Deal-8E27DA FeatReq no decision buyer 21,000
Deal-2D2F8D Competitor competitor buyer 4,800
Deal-E0441F MIA other unknown 2,405
Deal-7CB44D MIA other unknown 31,860
Deal-0F96AA Competitor competitor buyer 76,800
Deal-1BCA50 Competitor pricing buyer 15,000
Deal-7CC678 Competitor competitor buyer 11,116
Deal-FAC17C Lost DM no decision buyer 2,100
Deal-242273 Competitor product gap Bonusly 60,000
Deal-50E5D8 NoPriority/Cost no decision buyer 4,800
Deal-A2C349 Competitor competitor buyer 21,600
Deal-9F176A Timing1yr+ timing buyer 54,600
Deal-7B2236 NoPriority/Cost pricing buyer 72,000
Deal-AFA56C MIA other unknown 3,000
Deal-C7156E Competitor competitor buyer 13,818
Deal-C33D91 Budget/Price pricing buyer 7,200
Deal-9048EB MIA product gap Bonusly 41,790
Deal-5E64CE NoPriority/Cost timing buyer 3,360
Deal-8A0992 Competitor competitor buyer 7,337
Deal-D0C698 Competitor competitor buyer 2,000
Deal-69CF3D Timing1yr+ timing buyer 11,520
Deal-ECBF89 Timing1yr+ timing buyer 7,200
Deal-3618CC Lost DM product gap Bonusly 15,600
Deal-EECC02 Competitor competitor buyer 66,690
Deal-5AD03E Competitor product gap Bonusly 24,000
Deal-D1A623 Timing1yr+ timing unknown 25,200
Deal-413C56 NoPriority/Cost no decision buyer 2,760
Deal-47F1A1 Competitor competitor buyer 10,004
Deal-BF2A98 Competitor competitor buyer 8,400
Deal-2A292B NoPriority/Cost other buyer 6,000
Deal-D1AABF MIA other unknown 23,400
Deal-FEDBCB NoPriority/Cost timing buyer 2,000
Deal-1E7DA9 Competitor competitor buyer 26,400
Deal-2BBA21 MIA other unknown 2,310
Deal-286F9C Competitor competitor buyer 13,860
Deal-7FBAC6 NoPriority/Cost no decision buyer 7,200
Deal-369281 Competitor competitor buyer 2,400
Deal-386F6E MIA other unknown 13,895
Deal-9FCD0D Competitor competitor buyer 4,300
Deal-55867E Timing1yr+ no decision buyer 7,200
Deal-DAFB82 Budget/Price pricing buyer 30,000
Deal-2FEDDB NoPriority/Cost timing unknown 2,200
Deal-64B19A Competitor competitor buyer 3,240
Deal-3F86A0 MIA other unknown 3,840
Deal-096750 MIA other unknown 2,880
Deal-F325A5 Lost DM champion left buyer 14,400
Deal-ABD14C NoPriority/Cost no decision buyer 5,002
Deal-79E61A MIA other unknown 7,020
Deal-8A119B Budget/Price pricing buyer 3,250
Deal-AE7C4E MIA other unknown 2,800
Deal-DAB4F1 MIA other unknown 3,450
Deal-B4B50F MIA other unknown 21,060
Deal-981AD4 FeatReq product gap Bonusly 36,855
Deal-DC77FE Competitor product gap Bonusly 8,000
Deal-5885B9 MIA other unknown 7,200
```
Tag shorthand: Timing1yr+ = `Lost- Timing (1 year or more)`; NoPriority/Cost = `Doing nothing/Not a priority/Cost`; Budget/Price = `Lost- Budget/Price`; FeatReq = `Feature Request`; NotICP = `Lost- Does not fit ICP (write in notes)`.
`other` = no listed category fits: 22 `MIA` unresponsive/ghost deals + `Deal-5DB9B0` ("Spam.", NotICP tag) + `Deal-2A292B` ("build something simple internally"). `Deal-70F704` also sits here — narrow anniversary-award scope plus MIA, no clean fit.
## Category counts
```
category n % of 90 $ % of $1,267,945
other 24 24/90=26.7% 232,152 18.3%
timing 22 22/90=24.4% 262,551 20.7%
competitor 21 21/90=23.3% 294,915 23.3%
no decision 9 9/90=10.0% 85,912 6.8%
product gap 7 7/90= 7.8% 190,565 15.0%
pricing 6 6/90= 6.7% 187,450 14.8%
champion left 1 1/90= 1.1% 14,400 1.1%
--- ---------
90 1,267,945
```
Check: 24+22+21+9+7+6+1 = 90 ✓. 232,152+262,551+294,915+85,912+190,565+187,450+14,400 = 1,267,945 ✓.
## Side split
```
side n $ avg/deal
buyer 54 (60.0%) 750,187 13,892
unknown 29 (32.2%) 327,193 11,283
Bonusly 7 ( 7.8%) 190,565 27,224
```
Check: 54+29+7 = 90 ✓; 750,187+327,193+190,565 = 1,267,945 ✓.
All 7 Bonusly-side losses are the product-gap deals. The 29 `unknown` are 28 MIA/ghost/ICP records where the buyer never gave a reason, plus 1 (`Deal-2A292B`, build internally — buyer-side decision, but no stated cause beyond preference) — corrected: that one is scored buyer, so the unknown set is 28 MIA/NotICP records plus `Deal-70F704`. Nothing in the text attributes these to a Bonusly action, and nothing attributes them to the buyer either; calling them unknown is the only defensible read.
## Tag vs. free-text disagreements: 16 of 90 (17.8%)
```
deal_alias tag text says
Deal-13E9CF NoPriority/Cost "Not a budget issue" — the tag's own Cost half is contradicted
Deal-B3ABED Timing1yr+ opens "MIA-" then gives a 2028 budget date
Deal-ED9AE7 Lost DM "Timing, budget, authroity" — three causes, none is a DM loss
Deal-8E27DA FeatReq buyer "didn't want R&R, currently" — declination, not a feature ask
Deal-E0441F MIA "stale when I inherited it from a departed rep" — our hygiene, not buyer silence
Deal-1BCA50 Competitor "mostly about the budget" — pricing, competitor is secondary
Deal-FAC17C Lost DM 2-month contract stall, no exec sign-off — no decision
Deal-9048EB MIA "bad fit ... multiple feature gaps" — product gap
Deal-5AD03E Competitor "wanted more defined budget access" — product gap, no rival named
Deal-3618CC Lost DM "Wanted Surveys" — product gap
Deal-2A292B NoPriority/Cost "build something simple internally" — not a priority loss
Deal-FEDBCB NoPriority/Cost "reconnect closer to the end of the year" — timing
Deal-286F9C Competitor no rival named; "not really a good fit for us"
Deal-55867E Timing1yr+ flat decline, no date anywhere in text
Deal-2FEDDB NoPriority/Cost "Unsure on timing" — timing
Deal-F325A5 Lost DM "Layoffs and Change in Leadership" — champion left
```
Excluded as consistent, not disagreements: `Deal-70F704` (Lost DM + narrow scope + MIA — vague, not contradictory) and `Deal-981AD4` (Feature Request ↔ "Doesn't fit UI and not UK focused" — aligned).
Related signal-quality point: 10 of the 21 competitor-tagged losses name no rival at all (`Deal-F7F635, Deal-381C8C, Deal-F1E8A6, Deal-2D2F8D, Deal-0F96AA, Deal-7CC678, Deal-C7156E, Deal-EECC02, Deal-1E7DA9, Deal-286F9C`). `Deal-7CC678` is explicit: "Nothing specific provided."
## Two patterns worth acting on
**1. Roughly $275K of lost pipeline is deferred demand with a stated reopen date, and no one owns the date.**
22 deals carry explicit pause/reconnect language — "on pause," "reconnect next year," "revisiting in 2027," "will reopen if they reach back out," "loop back" — totaling $274,761, or 21.7% of lost value (274,761 ÷ 1,267,945). Nine of those name 2027 or 2028 outright: `Deal-91A056, Deal-B3ABED, Deal-B6AC09, Deal-E6E80A, Deal-B038F0, Deal-175756, Deal-15DA99, Deal-5E64CE, Deal-DAFB82` = $128,156. Several are large and warm: `Deal-9F176A` ($54,600, "pause... picking back up closer to the end of the year"), `Deal-B3ABED` ($40,001), `Deal-DAFB82` ($30,000, "she loves Bonusly and is going to loop back"), `Deal-13E9CF` ($33,750, "Need to reach out next year"). `Deal-5E64CE` is the clearest: the buyer is locked into Nectar through October 2027 and plans to move to Bonusly at contract end — that is a dated, winnable re-engagement sitting in a closed-lost report.
These are being booked as losses rather than converted into owned, dated tasks. The fix is procedural and cheap: extract the stated date, attach a named owner and a task, and keep the record reachable. Nothing in the data says anyone is currently doing that.
**2. Product gap is the most expensive loss reason per deal, and it is being mis-tagged often enough to hide from product planning.**
7 deals, $190,565 — average $27,224 versus $14,088 across the whole file (1.9×) and 1.94× the average competitor loss ($294,915 ÷ 21 = $14,044). Only one of the seven (`Deal-981AD4`, $36,855) carried an honest tag; the other six were logged as Competitor (`Deal-F97C37, Deal-242273, Deal-5AD03E, Deal-DC77FE`), MIA (`Deal-9048EB`), or Lost DM (`Deal-3618CC`). The gaps recur and are specific enough to route:
- Surveys / employee-input tooling — `Deal-3618CC` ($15,600, "Wanted Surveys") and `Deal-A2C349` ($21,600, lost to Awardco "and add their surveying functionality"); `Deal-BB78F3` ($6,600) is stalled on survey action items.
- Points-as-currency flexibility — `Deal-242273` ($60,000, digitize internal points and spend them at onsite facilities, "the biggest differentiator") and `Deal-DC77FE` ($8,000, "label points as dollars"; that buyer also stated price was *not* a factor).
- Allowance / budget-access controls — `Deal-5AD03E` ($24,000, "wanted more defined budget access", 7 contacts on the deal).
- Regional fit — `Deal-981AD4` ($36,855, "not UK focused").
- Suite breadth beyond R&R — `Deal-F97C37` ($4,320, rival had "more diversified offerings").
Two named competitors also beat Bonusly on ecosystem position rather than features: `Deal-422BA6` ($3,000, an ADP TotalSource PEO partner with pre-built integrations and dedicated ADP contacts) and `Deal-369281` ($2,400, "went with what they have in paylocity"). Small ACV, but they mark payroll/HCM-adjacency as a structural loss vector that no feature roadmap item addresses.
I considered the 24-deal `other`/MIA bucket as a third pattern — it is the largest count bucket and 5 of those records had ≥4 contacts (`Deal-4664E1` 7, `Deal-7CB44D` 6, `Deal-D1AABF` 5, `Deal-3F86A0` 5, `Deal-B4B50F` 5), so silence after that much contact is itself a finding. I ranked it below the two above because its remedy is the same discipline as pattern 1 (own the follow-up) and it yields no directional information until the 17.8% disagreement rate is fixed at the point of tagging.
## Caveats on the data itself
- The file is named `closed_lost_6mo.csv` but the close dates span 2026-07-29 to 2026-09-30 — 63 days, about 2.1 months, not six. Every percentage above is over this ~9-week window.
- `Deal-DB0AAC` has close_date 2026-09-30, five days after today (2026-09-25). It is counted here as given.
- Amounts are taken as-is; no currency field exists, and `Deal-DDAB52` flags "exchange rate differences" and `Deal-8A0992`/`Deal-9FCD0D` lost to Canadian providers — so some of the $1,267,945 may not be USD. The value splits should be read as approximate.
- `owner_id` is present but no rep names are supplied, so I have not attributed patterns to individuals. For reference the raw spread is: 84342457 (23 deals, $342,272), 119337721 (21, $372,114), 83155923 (21, $175,875), 83155924 (18, $216,748), 716654662 (3, $10,900) — note two IDs differ by one digit (83155923 / 83155924) and I have not assumed they are the same person or a typo.
- Category and side calls are my reading of the tag plus free-text only. Where text gave one cause and the tag another, I followed the text and listed the deal in the disagreement table so you can overrule any call.
```json
{
"tier_counts": {"LOCK": 6, "ACTION": 14, "BUILD": 44, "REVIVE": 3, "WATCH": 83, "RISKY": 6},
"tier_examples": {
"LOCK": ["Deal-25F752", "Deal-D348E1", "Deal-C26D20"],
"ACTION": ["Deal-C6FE92", "Deal-E53952", "Deal-5408B0"],
"BUILD": ["Deal-D73B89", "Deal-93C8BF", "Deal-A414F6"],
"REVIVE": ["Deal-2D1F1B", "Deal-7BBDFA", "Deal-F0EBBB"],
"WATCH": ["Deal-66D1FC", "Deal-950043", "Deal-EC3025"],
"RISKY": ["Deal-547B2B", "Deal-B7EBD1", "Deal-A2B47C"]
},
"risky_deals": ["Deal-547B2B", "Deal-B7EBD1", "Deal-A2B47C", "Deal-2465CE", "Deal-584EE5", "Deal-FD9F4E"],
"lock_violations": 0,
"pipeline_shape": "156 open deals, $2.35M gross. Rules applied: meetings_30d>=1 AND last activity <=7d (vs 2026-09-04 snapshot) = hot; LOCK = DS4/DS5 + COMMIT/BEST_CASE + hot + >=3 contacts; RISKY = forecast/evidence disagreement (all 6 are DS5 COMMIT with meetings_30d=0 — $37.9k, every one of them, so the commit bucket is effectively unsupported); REVIVE = amount>=10k with 0 meetings and >21d stale or no engagement row. Counts check: 6+14+44+3+83+6 = 156. Value by tier: LOCK $79.8k (3.4%), ACTION $150.5k, BUILD $443.0k, REVIVE $288.8k, WATCH $1,314.0k (55.9%). Shape: top-heavy in count but bottom-heavy in value — only 7 of 24 late-stage (DS4/DS5) deals show any meeting, while 101 of 156 deals (65%) have meetings_30d=0. The $240k Deal-2D1F1B (DS1, no activity since 2026-06-16) plus $99k/$70k/$62k/$60k cold DS1–DS3 records mean the reported pipeline is mostly unworked early-stage volume; 38 deals dated to close by 2026-09-30 carry $273.6k, of which only ~$79.8k is LOCK-grade. Data caveats: 8 deals carry a $1 placeholder amount, 2 deals (Deal-3EED2C, Deal-57FF13) have no engagement row at all (scored as zero activity, not fabricated), and Deal-57FF13 has a blank last_contacted_field and closed 2026-09-02 yet is still open."
}
```
Extraction below. Every field is sourced from prospect utterances only; rep statements (pricing offers, "I can flex", "our Workday integration is standard") are excluded from field values and flagged where they were the only mention of a number.
```json
[
{
"transcript_id": "TX-001",
"deal_alias": "Deal-CFE7F4",
"why_buys": [
"Automate anniversary and birthday award recognition — described by the VP People as 'the big win for us'",
"Relieve a 3-person HR team that 'cannot keep up with it manually'",
"Stop employees 'slipping through the cracks' under spreadsheet tracking"
],
"pain_points": [
"Manual administration of anniversary/birthday awards",
"HR team headcount (3) insufficient for the manual process",
"Tracking done in a spreadsheet; errors/omissions occurring",
"SSO and audit logs required before IT will sign off"
],
"stakeholders": [
{"name_or_role": "Prospect (VP People)", "side": "prospect", "signal": "states the why-buy, holds the fiscal-year budget figure, sets the November target, names the prior vendor, accepts the next step"},
{"name_or_role": "Prospect (HR Admin)", "side": "prospect", "signal": "confirms spreadsheet process/pain, raises the SSO + audit-log requirement"},
{"name_or_role": "Alex Franklin", "side": "vendor_rep", "signal": "not a CRM stakeholder"}
],
"budget_signal": {
"value": "$40k",
"scope": "earmarked for engagement tools, this fiscal year",
"source": "prospect-stated (VP People)",
"committed_to_this_deal": false,
"note": "Stated as a category earmark, not a deal-specific approval."
},
"timeline_signal": {
"stated": "Live before open enrollment in November (VP People)",
"hard_date_evidence": "Security review set for September 12",
"type": "prospect-stated goal date; no stated decision/contract-sign date"
},
"competitor_mentioned": {
"vendor": "Achievers",
"raised_by": "prospect (VP People)",
"sentiment": "Negative — 'too heavy for a team our size' (evaluated last year)"
},
"next_step": {
"agreed": true,
"action": "Security review with the prospect's IT lead",
"date": "September 12",
"owner": "Not assigned in transcript; rep offered to set it up, prospect accepted the date"
},
"objections": [
"Compliance gate: SSO + audit logs required for IT sign-off (HR Admin)",
"Prior-vendor experience: Achievers judged too heavy for team size (context, not an objection to us)"
],
"confidence": {
"level": "medium-high",
"rationale": "Named budget earmark, dated go-live driver (November open enrollment), prospect-named competitor disqualification, and a dated agreed next step. Lowered by: budget is a category earmark rather than an approval, no decision date, and no IT lead present."
}
},
{
"transcript_id": "TX-002",
"deal_alias": "Deal-70BB30",
"why_buys": [
"Tie recognition to retention for the hourly workforce (Head of Total Rewards)",
"Address regretted turnover above 30% in that population"
],
"pain_points": [
"Regretted turnover among hourly workforce 'over 30%'",
"Recognition currently not linked to retention outcomes",
"Workday integration must be reliable — CFO's stated single condition"
],
"stakeholders": [
{"name_or_role": "Prospect (Head of Total Rewards)", "side": "prospect", "signal": "owns the business case; confirms no other vendor evaluated"},
{"name_or_role": "Prospect (CFO)", "side": "prospect", "signal": "economic buyer — approves pilot budget, sets decision date, sets integration condition, commits to routing legal"},
{"name_or_role": "Alex Franklin", "side": "vendor_rep", "signal": "not a CRM stakeholder"}
],
"budget_signal": {
"value": "$25k",
"scope": "pilot budget, approved by finance, this quarter",
"source": "prospect-stated (CFO)",
"committed_to_this_deal": true,
"note": "Explicitly 'approved' and pilot-scoped — strongest budget language across all six transcripts."
},
"timeline_signal": {
"stated": "Decision by end of September (CFO); pilot budget for this quarter; legal routing 'this week'",
"type": "prospect-stated decision deadline"
},
"competitor_mentioned": {
"vendor": null,
"raised_by": "n/a",
"note": "Prospect stated 'You're the first vendor we've had a real demo with.' Workday appears as a required integration, not a competing vendor."
},
"next_step": {
"agreed": true,
"action": "Rep sends pilot agreement; CFO routes it to legal this week",
"date": "No calendar date; 'this week'",
"owner": "Both sides — rep sends, CFO routes to legal"
},
"objections": [
"Integration risk: 'Integration with Workday has to be rock solid — that's my one condition' (CFO)"
],
"confidence": {
"level": "high",
"rationale": "Approved deal-specific budget, a decision deadline set by the economic buyer, two decision-makers on the call, an agreed two-sided next step, and no competing vendor in the mix."
}
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why_buys": [
"Make recognition visible across 12 retail locations (People Ops Manager)"
],
"pain_points": [
"Store managers have zero budget autonomy for on-the-spot recognition",
"Recognition not visible across the 12 locations"
],
"stakeholders": [
{"name_or_role": "Prospect (People Ops Manager)", "side": "prospect", "signal": "only prospect speaker; gatekeeper — states the CEO decides anything people-related"},
{"name_or_role": "Prospect (CEO)", "side": "prospect", "signal": "referenced as the decision-maker but NOT on the speaker list — no direct statement recorded; absent from this call"},
{"name_or_role": "Alex Franklin", "side": "vendor_rep", "signal": "not a CRM stakeholder"}
],
"budget_signal": {
"value": null,
"source": "none",
"note": "The only figure ($8 per employee per month) was spoken by the rep, not the prospect, so it is excluded. No prospect budget statement exists in this transcript."
},
"timeline_signal": {
"stated": "'Honestly there's no rush on our side until Q1' (People Ops Manager)",
"type": "prospect-stated deferral; no dated commitment"
},
"competitor_mentioned": {
"vendor": "Bucketlist",
"raised_by": "prospect (People Ops Manager)",
"sentiment": "Positive toward the competitor — the CEO 'used Bucketlist at her last company and liked it'"
},
"next_step": {
"agreed": true,
"action": "Short call with the prospect's CEO",
"date": "Not scheduled — prospect will 'send two times'",
"owner": "Prospect (People Ops Manager) to send availability"
},
"objections": [
"No urgency: no rush until Q1",
"Authority gap: 'The CEO has to be sold first — she decides anything people-related'",
"Competitor affinity held by the absent decision-maker (Bucketlist)"
],
"confidence": {
"level": "low",
"rationale": "No prospect budget signal, explicit Q1 deferral, the sole decision-maker absent and favourably disposed to a named competitor, and the agreed next step has no date. Missing data: employee headcount, so no deal-size arithmetic is possible — 12 locations is a location count, not a seat count."
},
"data_gaps": [
"Headcount not stated → cannot convert the rep's $8 PEPM into any annual figure",
"No budget, no decision date"
]
},
{
"transcript_id": "TX-004",
"deal_alias": "Deal-180D02",
"why_buys": [
"Consolidate three separate recognition tools into one (VP People)"
],
"pain_points": [
"Paying for three tools simultaneously",
"None of the three tools talks to their HRIS",
"Procurement cycle runs six to eight weeks minimum (IT Security Lead)",
"Security review took three months for their last vendor (IT Security Lead)"
],
"stakeholders": [
{"name_or_role": "Prospect (VP People)", "side": "prospect", "signal": "business owner; states self-approval ceiling; non-committal on the CFO meeting"},
{"name_or_role": "Prospect (IT Security Lead)", "side": "prospect", "signal": "technical/process gatekeeper; supplies both timing constraints"},
{"name_or_role": "Prospect (CFO)", "side": "prospect", "signal": "referenced by the rep as a desired meeting target; never speaks and is not on the prospect's own speaker list — no statement attributed"},
{"name_or_role": "Alex Franklin", "side": "vendor_rep", "signal": "not a CRM stakeholder"}
],
"budget_signal": {
"value": "$15k annually (threshold, not a commitment)",
"scope": "'If it's under $15k annually, I can approve it without going to the board'",
"source": "prospect-stated (VP People)",
"committed_to_this_deal": false,
"note": "This is an approval-authority ceiling, not earmarked spend. Above it, board approval is implied."
},
"timeline_signal": {
"stated": "Procurement cycle 6–8 weeks minimum; prior vendor security review took 3 months",
"derived_not_stated": "From the 25 Sep transcript date: 6–8 weeks of procurement lands ~6–20 Nov; a repeat 3-month security review lands ~late Dec. Neither date is prospect-stated — process constraints only, no target go-live or decision date given.",
"type": "prospect-stated process constraints; no deal timeline"
},
"competitor_mentioned": {
"vendor": null,
"note": "No competing vendor named by the prospect."
},
"next_step": {
"agreed": false,
"action": null,
"note": "The rep asked to lock a CFO follow-up; the VP People replied 'Maybe — I need to check her calendar, no promises.' The rep's 'I'll follow up' is a unilateral rep action, not an agreed step."
},
"objections": [
"Security-review duration: 3 months for the last vendor — stated as 'my hesitation'",
"Procurement length: 6–8 weeks minimum",
"Approval friction: >$15k annually requires the board"
],
"confidence": {
"level": "low-medium",
"rationale": "Real pain (three overlapping tools, no HRIS connection) and a clear authority threshold, but no agreed next step, no target date, no budget commitment, and two process objections from the security gatekeeper. Missing data: current spend on the three tools is never stated, so consolidation savings cannot be computed."
},
"data_gaps": [
"No amount currently paid for the three tools",
"No HRIS product named",
"No decision or go-live date"
]
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why_buys": [
"Automate service milestones",
"Get analytics on recognition equity across departments (HR Director)"
],
"pain_points": [
"Night-shift teams 'feel invisible' — engagement scores run 20 points lower (People Ops Coordinator)",
"Service-milestone recognition handled manually today",
"No cross-department equity visibility/analytics",
"Exec team skeptical after a failed rollout two years ago"
],
"stakeholders": [
{"name_or_role": "Prospect (HR Director)", "side": "prospect", "signal": "economic + decision voice — holds approved budget, sets the January driver, names the incumbent, accepts the exec presentation"},
{"name_or_role": "Prospect (People Ops Coordinator)", "side": "prospect", "signal": "end-user perspective; supplies the night-shift metric"},
{"name_or_role": "Prospect (exec team)", "side": "prospect", "signal": "referenced as the approval audience; not individual speakers"},
{"name_or_role": "Alex Franklin", "side": "vendor_rep", "signal": "not a CRM stakeholder"}
],
"budget_signal": {
"value": "$12k",
"scope": "approved under the engagement line",
"source": "prospect-stated (HR Director)",
"committed_to_this_deal": true,
"note": "Stated as 'approved' — a funded line, unlike Deal-CFE7F4's category earmark and Deal-180D02's authority ceiling."
},
"timeline_signal": {
"stated": "Needs it running before the January all-hands (HR Director); exec presentation 2 October",
"derived_not_stated": "2 Oct → January all-hands leaves roughly one quarter (Oct–Dec) of working runway; the exact all-hands date is not given.",
"type": "prospect-stated business deadline anchored to a company event"
},
"competitor_mentioned": {
"vendor": "Nectar",
"raised_by": "prospect (HR Director)",
"sentiment": "Live incumbent — 'mid-pilot with Nectar right now, so you'd need to beat that experience'"
},
"next_step": {
"agreed": true,
"action": "Rep presents directly to the prospect's exec team",
"date": "October 2",
"owner": "Rep presents; prospect arranged the audience"
},
"objections": [
"Incumbent comparison: must beat the in-flight Nectar pilot experience",
"Internal political risk: 'Our exec team is skeptical after a failed rollout two years ago'"
],
"confidence": {
"level": "medium-high",
"rationale": "Approved budget, a hard business deadline, the decision-maker on the call, and a dated agreed next step. Held below high by an active competitor pilot and a skeptical approval body that was not present."
}
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why_buys": [
"Cut the admin time spent on service awards (HR Manager)"
],
"pain_points": [
"HR Manager personally spends five hours a month ordering and shipping plaques",
"Physical fulfilment process (ordering + shipping) is manual"
],
"stakeholders": [
{"name_or_role": "Prospect (HR Manager)", "side": "prospect", "signal": "sole prospect speaker; champion and user, but states the COO's build preference as a warning"},
{"name_or_role": "Prospect (COO)", "side": "prospect", "signal": "referenced only; not a speaker — no statement attributed"},
{"name_or_role": "Alex Franklin", "side": "vendor_rep", "signal": "not a CRM stakeholder"}
],
"budget_signal": {
"value": null,
"source": "none",
"note": "Prospect explicitly deflected the budget topic: 'Budget isn't the issue — time is.' The rep's 'I can flex on pricing' is rep-side and excluded."
},
"timeline_signal": {
"stated": "'Our fiscal year resets in February, so a Q1 start is realistic' (HR Manager)",
"type": "prospect-stated start window; no decision date"
},
"competitor_mentioned": {
"vendor": null,
"raised_by": "prospect (HR Manager), who volunteered the answer to the rep's question",
"note": "No named vendor — 'Nobody else — we're comparing this against just doing it internally.' The competing option is do-nothing/internal build, reinforced by 'our COO usually prefers building things in-house.'"
},
"next_step": {
"agreed": true,
"action": "Rep sends the one-page overview; HR Manager forwards it to the COO",
"date": "'This week' — no calendar date",
"owner": "Both sides — rep sends, prospect forwards"
},
"objections": [
"Build vs. buy: COO 'usually prefers building things in-house'",
"Budget is a non-issue here — the rep's pricing concern was explicitly corrected by the prospect"
],
"confidence": {
"level": "medium",
"rationale": "Quantified single-owner pain, an agreed two-sided next step, and a stated start window. Held back by zero budget signal, an absent approver (COO) with a known build preference, and a deadline driven by a February fiscal reset rather than urgency."
},
"arithmetic": {
"annual_admin_hours_saved_if_fully_automated": "5 hours/month x 12 months = 60 hours/year (one person: the HR Manager)",
"caveat": "60 hours is the stated admin burden, not a validated savings — full elimination is not claimed by the prospect."
}
}
]
```
Cross-transcript arithmetic and explicit data gaps
Budget figures, all prospect-stated, ranked by strength of language:
- Deal-70BB30: $25k — approved, pilot, this quarter, deal-specific (CFO).
- Deal-F8767A: $12k — approved, engagement line (HR Director).
- Deal-CFE7F4: $40k — earmarked, fiscal-year category, not deal-specific (VP People).
- Deal-180D02: $15k/yr — approval ceiling, not spend (VP People).
- Deal-530B50: none. Deal-EE195F: none.
Total prospect-stated funds already approved for a specific purchase: $25k + $12k = $37k. Adding the non-deal-specific earmark: $37k + $40k = $77k, of which only $37k is committed at deal level. The $15k is excluded from any total — it is an authority limit, not money.
ACV cannot be computed for any deal: no transcript states employee headcount. Deal-530B50 gives 12 retail locations (sites, not seats) and Deal-CFE7F4 gives an HR team of 3 (staff size, not covered population). The $8-per-employee-per-month figure in Deal-530B50 is rep speech and prospect-uncorroborated; even if used, 8 × 12 = $96/employee/year has no multiplier available.
Pain quantification stated by prospects only:
- Deal-70BB30: regretted turnover "over 30%" (hourly workforce).
- Deal-F8767A: night-shift engagement scores 20 points lower.
- Deal-EE195F: 5 hrs/month → 60 hrs/year plaque admin.
- Deals-CFE7F4, -530B50, -180D02: no numeric pain metric given.
Competitors raised by prospects: Achievers (Deal-CFE7F4, negative, prior year), Bucketlist (Deal-530B50, positive, held by the absent CEO), Nectar (Deal-F8767A, live mid-pilot). Internal-build alternative: Deal-EE195F. No competitor raised: Deal-70BB30 ("first vendor we've had a real demo with"), Deal-180D02.
Next steps explicitly agreed: 5 of 6 — Deal-CFE7F4 (12 Sep security review), Deal-70BB30 (pilot agreement → legal this week), Deal-530B50 (CEO call, undated), Deal-F8767A (2 Oct exec presentation), Deal-EE195F (one-pager → COO this week). Not agreed: Deal-180D02 — "Maybe… no promises" plus a unilateral rep "I'll follow up."
Timing conflict worth flagging in CRM: Deal-CFE7F4's security review is dated 12 September, which precedes the 25 September transcript date used elsewhere in this file. The transcript does not resolve whether that is a past event or a year mismatch — logged as an unresolved data-quality issue rather than corrected.
Ranking basis: DS5/COMMIT plus Slack-confirmed late-stage activity. Caveat: the thread is 21 days old (09-04 vs today 09-25), and all three are already past their CRM close dates with no closure signal in either source. So this is "closest on record," not confirmed. 1. Deal-547B2B — $11,200 — Alex Franklin — DS5/COMMIT, close 2026-09-11 Close because: strongest signal in the thread (09-04): redlines back clean, signing page already out, their VP People said signing tomorrow. Left: counterparty signature only. Nothing in CRM confirms it closed. 2. Deal-403845 — $9,000 — DS5/COMMIT, close 2026-09-11 Close because: order form is with their finance team, "moving fine." Left: finance sign-off, then execution. Flag: Dana calls it hers, CRM lists Alex Franklin as owner — reconcile before forecasting. 3. Deal-A2B47C — $6,360 — DS5/COMMIT, close 2026-09-11 Close because: still warm, moving at normal legal-review pace. Left: legal review to complete, then signature. Weakest of the three — no document-level detail. Arithmetic: 11,200 + 9,000 + 6,360 = $26,560 combined. Excluded: Deal-2465CE ($5,400, close 09-10) would rank on date, but Dana pulled it out of commit — champion left, procurement frozen, now Q4. Deal-B7EBD1 ($9,000, close 09-10) is the nearest alternative; it has no Slack coverage at all, so it rests on date alone. Deal-D348E1 ($13,770) is warm but closes 10-15.
Candidate-by-candidate (all 5 transcript rows in transcripts_gaps.csv): 1. TG-001 — Deal-EC3025 Prospect quote: "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." Docs check: "SCIM user provisioning and ADP Workforce Now integrations are NOT currently listed as supported capabilities." No tier in the plan matrix offers SCIM. Classification: REAL GAP (capability absent from the product entirely, not a tier restriction). Amount: NOT AVAILABLE — transcripts_gaps.csv carries no deal amounts and no other amount source was provided. 2. TG-002 — Deal-D0D6B5 Prospect quote: "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us." Docs check: HRIS integrations are limited to Workday, BambooHR, Gusto, Rippling (Pro and above); ADP Workforce Now is explicitly "NOT currently listed as supported capabilities." Classification: REAL GAP (missing integration, not gated behind a higher tier — no tier offers it). Amount: NOT AVAILABLE (same as above). 3. TG-003 — Deal-CFE7F4 Prospect quote: "I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?" Docs check: "Custom report builder" is Enterprise-only (Core: —, Pro: —, Enterprise: yes). The capability exists in the product. Classification: PLAN GATE (feature ships, prospect's current plan doesn't include it; upgrade path, not a product gap). Amount: NOT AVAILABLE. 4. TG-004 — Deal-84DBA6 Prospect quote: "We turned on the Slack integration in July, but half our managers still haven't given a single recognition — nobody ever trained them on it." Docs check: "Slack and Microsoft Teams integration" is available on all plans (Core/Pro/Enterprise: yes). The feature works; adoption is the failure point, and the prospect attributes it to missing training. Classification: ROLLOUT/ENABLEMENT ISSUE (adoption/training, not a product gap). Amount: NOT AVAILABLE. 5. TG-005 — Deal-36C33F No prospect-raised gap. The only gap statement is rep language: Alex Franklin says "we don't have a native mobile app for hourly workers yet, though it's on the roadmap." The prospect's actual line — "Good to know. The web version should be fine for our office staff for now" — raises no requirement and signals acceptance. Classification: EXCLUDED (rep language does not count as prospect voice; prospect explicitly does not treat it as a gap). Amount: NOT AVAILABLE. Arithmetic / reconciliation: - Candidate transcript rows analyzed: 5 (TG-001 through TG-005) - Real gaps: 2 (TG-001, TG-002) - Plan gates: 1 (TG-003) - Rollout/enablement: 1 (TG-004) - Excluded (no prospect-raised gap): 1 (TG-005) - Check: 2 + 1 + 1 + 1 = 5 ✓ SUMMARY — true product gaps raised by prospects in active deals: 2 - SCIM user provisioning — raised by the IT Security Lead on Deal-EC3025. Not supported on any tier per the 2026-08 docs snapshot; prospect states security will not approve without it. - ADP Workforce Now integration — raised by the HRIS Manager on Deal-D0D6B5. Not in the supported HRIS list (Workday, BambooHR, Gusto, Rippling only); prospect calls it a dealbreaker. Missing data, stated explicitly: deal amounts for Deal-EC3025, Deal-D0D6B5, Deal-CFE7F4, Deal-84DBA6, and Deal-36C33F are not present in any provided file, so each deal is named by alias with amount unavailable. Also note: the "active deals" status of these aliases cannot be verified from the provided data — the files supply no pipeline or stage fields, so I am taking the framing of the ask at face value rather than confirming deal state.
Computed from the two tables (script at /tmp/stale/analyze.py, output verified). METHOD - Snapshot 2026-09-05. 7-day window = 2026-08-30 → 2026-09-05 inclusive. - Last contact per deal = max(last_email, last_call, last_meeting) from engagements_by_deal_90d.csv only. deal.last_contacted_field ignored throughout. - Stale = last contact before 2026-08-30, or no usable contact date at all. - Boundary check: no deal has a last contact on 08-29 or 08-30, so the result is identical whether the window is read as 6 or 7 days back (75 stale / $1,344,281.03 either way). DATA CAVEATS (material to the answer) 1. 17 deals carry last_meeting dates AFTER the snapshot (2026-09-09 → 2026-10-02). Those are not possible as "logged" contact as of 2026-09-05, so I excluded them from the max() and fell back to the latest email/call on or before the snapshot. 10 deals are stale ONLY because of this exclusion — they are tagged below. If you'd rather credit future-dated meetings as contact, remove those 10 rows: −$89,851.00 stale amount, and Bryce goes from 18→13, Dana 16→14, Alex 20→19, Farid 2→0. 2. Two open deals have NO row in the engagements table at all: Deal-3EED2C (Alex Franklin, DS2, $7,200) and Deal-57FF13 (Elena Sinclair, DS1, $2,100). Recency is unverifiable, not confirmed-zero. I counted them stale and flagged them; excluding them drops the total to 73 deals / $1,334,981.03. 3. Owners.csv has 8 owners; Gavin Porter and Hugo Lindqvist are archived and own no open deals. Elena Sinclair's only open deal is the missing-row one above. STALE DEALS BY OWNER (amount desc within owner) BRYCE HARMON — 18 deals, $692,964.00 Deal-2D1F1B DS1 $240,000.00 last 2026-06-16 81d Deal-66D1FC DS1 $99,000.00 last 2026-08-20 16d Deal-950043 DS1 $70,000.00 last 2026-08-17 19d Deal-B23205 DS1 $45,000.00 last 2026-08-20 16d Deal-7BBDFA DS3 $37,440.00 last 2026-07-21 46d Deal-332637 DS2 $36,000.00 last 2026-08-27 9d Deal-1BEEBF DS1 $31,500.00 last 2026-08-17 19d Deal-A414F6 DS1 $25,200.00 last 2026-08-17 19d [future mtg 09-10] Deal-C5658B DS1 $23,400.00 last 2026-08-20 16d Deal-40522D DS3 $21,000.00 last 2026-08-17 19d Deal-C1FA6D DS1 $18,000.00 last 2026-08-20 16d [future mtg 09-15] Deal-01E193 DS1 $12,600.00 last 2026-08-28 8d [future mtg 09-09] Deal-F0EBBB DS3 $11,400.00 last 2026-08-12 24d Deal-927338 DS1 $10,920.00 last 2026-08-18 18d [future mtg 09-17] Deal-E25A09 DS1 $6,000.00 last 2026-08-27 9d Deal-C9C286 DS2 $5,502.00 last 2026-08-27 9d Deal-012CB1 DS1 $1.00 last 2026-08-13 23d Deal-3795AD DS2 $1.00 last 2026-08-28 8d [future mtg 10-02] DANA MERCER — 16 deals, $279,495.00 Deal-44EA29 DS2 $60,000.00 last 2026-08-26 10d Deal-E51FB7 DS2 $43,875.00 last 2026-08-24 12d Deal-B42F46 DS1 $27,000.00 last 2026-08-17 19d Deal-BA3DDC DS3 $23,400.00 last 2026-08-21 15d Deal-9DDE86 DS2 $20,000.00 last 2026-08-21 15d Deal-215CCA DS3 $18,900.00 last 2026-08-19 17d Deal-5EED42 DS3 $16,250.00 last 2026-08-25 11d Deal-57887A DS2 $15,000.00 last 2026-08-28 8d Deal-944310 DS4 $10,500.00 last 2026-08-03 33d [future mtg 09-15] Deal-B7EBD1 DS5 $9,000.00 last 2026-08-20 16d Deal-3974EB DS4 $9,000.00 last 2026-08-28 8d Deal-F40F04 DS2 $8,100.00 last 2026-08-21 15d Deal-7599B8 DS3 $7,350.00 last 2026-08-18 18d [future mtg 09-10] Deal-87DDD1 DS1 $5,000.00 last 2026-08-17 19d Deal-F336B6 DS3 $4,200.00 last 2026-08-21 15d Deal-0660B4 DS4 $1,920.00 last 2026-08-20 16d COLE INGRAM — 18 deals, $252,905.03 Deal-D04904 DS2 $58,529.25 last 2026-08-25 11d Deal-B25F40 DS3 $40,000.00 last 2026-08-28 8d Deal-813836 DS2 $32,175.00 last 2026-08-25 11d Deal-1BA595 DS2 $31,750.00 last 2026-08-25 11d Deal-CFE1E8 DS3 $18,000.00 last 2026-08-25 11d Deal-CD47A6 DS2 $12,168.00 last 2026-08-25 11d Deal-627646 DS3 $11,193.00 last 2026-08-25 11d Deal-FF809F DS2 $7,781.20 last 2026-08-25 11d Deal-AF932D DS2 $7,225.40 last 2026-08-25 11d Deal-A71728 DS2 $6,947.50 last 2026-08-25 11d Deal-8BC9F5 DS2 $5,616.00 last 2026-08-26 10d Deal-175395 DS3 $4,779.88 last 2026-08-25 11d Deal-481E24 DS3 $4,140.00 last 2026-08-26 10d Deal-C7F9BF DS2 $3,360.00 last 2026-08-25 11d Deal-2F3A66 DS3 $3,334.80 last 2026-08-25 11d Deal-342E96 DS2 $2,700.00 last 2026-08-12 24d Deal-E568D5 DS3 $1,875.00 last 2026-08-25 11d Deal-FD9F4E DS5 $1,330.00 last 2026-08-26 10d ALEX FRANKLIN — 20 deals, $113,936.00 Deal-CC08D1 DS1 $24,000.00 last 2026-08-20 16d Deal-E73427 DS3 $18,000.00 last 2026-08-26 10d Deal-885F45 DS2 $9,300.00 last 2026-08-24 12d Deal-C2FF3C DS1 $8,316.00 last 2026-08-26 10d Deal-3EED2C DS2 $7,200.00 NO ENGAGEMENT ROW n/a [missing data] Deal-0D2F7A DS3 $5,100.00 last 2026-08-24 12d Deal-6C60D4 DS3 $4,800.00 last 2026-08-24 12d Deal-13FEBD DS2 $4,680.00 last 2026-08-24 12d Deal-819506 DS1 $4,400.00 last 2026-08-28 8d [future mtg 09-09] Deal-9D0060 DS3 $3,840.00 last 2026-08-24 12d Deal-690476 DS2 $3,600.00 last 2026-08-18 18d Deal-C6D97A DS4 $3,240.00 last 2026-08-28 8d Deal-EE195F DS3 $3,120.00 last 2026-08-28 8d Deal-278DEC DS3 $2,700.00 last 2026-08-28 8d Deal-635B8E DS3 $2,600.00 last 2026-08-18 18d Deal-6883F3 DS1 $2,400.00 last 2026-08-20 16d Deal-4A13AD DS3 $2,160.00 last 2026-08-10 26d Deal-F67D31 DS2 $1,800.00 last 2026-08-28 8d Deal-5FDCE4 DS3 $1,600.00 last 2026-08-24 12d Deal-BA571A DS4 $1,080.00 last 2026-08-18 18d FARID OSMAN — 2 deals, $2,881.00 Deal-8BA24E DS1 $2,880.00 last 2026-08-28 8d [future mtg 09-15] Deal-8FDCD2 DS1 $1.00 last 2026-08-21 15d [future mtg 09-15] ELENA SINCLAIR — 1 deal, $2,100.00 Deal-57FF13 DS1 $2,100.00 NO ENGAGEMENT ROW n/a [missing data] PER-OWNER SUMMARY Owner Stale deals Stale amount Open deals % of owner's open count Bryce Harmon 18 $692,964.00 46 39% Alex Franklin 20 $113,936.00 55 36% Dana Mercer 16 $279,495.00 24 67% Cole Ingram 18 $252,905.03 21 86% Farid Osman 2 $2,881.00 7 29% Elena Sinclair 1 $2,100.00 1 100% TOTAL 75 $1,344,281.03 156 Arithmetic on totals: 692,964.00 + 279,495.00 + 252,905.03 + 113,936.00 + 2,881.00 + 2,100.00 = 1,344,281.03. Deal counts 18+16+18+20+2+1 = 75 of 156 open rows (81 fresh). Sample day-count checks: Deal-2D1F1B 06-16→09-05 = 14 (rest of Jun) + 31 (Jul) + 31 (Aug) + 5 = 81d. Deal-7BBDFA 07-21→09-05 = 10 + 31 + 5 = 46d. Deal-944310 08-03→09-05 = 28 + 5 = 33d. Two observations worth your attention, strictly from the data: Cole Ingram's 18 stale deals are 86% of his open pipeline and 14 of his 18 cluster on a single last-contact date (2026-08-25), which looks like a batch activity event rather than independent decay. And Bryce Harmon's stale dollar figure is dominated by one 81-day-old DS1 deal ($240,000, Deal-2D1F1B) — 35% of his stale total sits in that single record.
All figures computed from the three files as given. Verification method: joined deals_open.csv to engagements_by_deal_90d.csv on deal_id, summed the *_30d columns per owner_id, and counted deals whose t_ds2 falls in [2026-08-06, 2026-09-05] (snapshot 2026-09-05 minus 30 days; 2026-08-06 is exactly 30 days before the snapshot and is included).
═══════════════════════════════════════════════
LAST-30-DAY ACTIVITY AND DS2 EFFICIENCY BY REP
snapshot 2026-09-05 · window 2026-08-06 → 2026-09-05
═══════════════════════════════════════════════
1) ALEX FRANKLIN (owner 84342457) — 67 open deals
Emails 307 · Calls 36 · Meetings 41 · Total 384 (307+36+41 = 384)
Mix: 307/384 = 79.9% email · 36/384 = 9.4% call · 41/384 = 10.7% meeting
DS2 entries in window: 18 → Deal-EE195F, Deal-D9A72E (08-06); Deal-7FA0C3,
Deal-E531A6 (08-07); Deal-36C33F, Deal-D1E6C2 (08-11); Deal-317E6F (08-12);
Deal-4F775F (08-17); Deal-F436DA (08-19); Deal-CA5E44 (08-24);
Deal-46988D (08-26); Deal-5296C9, Deal-898FC5, Deal-E73427 (08-28);
Deal-403845, Deal-92D97D (09-02); Deal-1FC049, Deal-3EED2C (09-03)
Activities per DS2 entry: 384 / 18 = 21.33
2) BRYCE HARMON (owner 119337721) — 35 open deals
Emails 162 · Calls 0 · Meetings 43 · Total 205 (162+0+43 = 205)
Mix: 162/205 = 79.0% email · 0/205 = 0.0% call · 43/205 = 21.0% meeting
DS2 entries in window: 4 → Deal-1CCE5C (08-06); Deal-25F752 (08-10);
Deal-CA7DC0 (08-12); Deal-D73B89 (09-03)
Activities per DS2 entry: 205 / 4 = 51.25
3) COLE INGRAM (owner 83155924) — 22 open deals
Emails 96 · Calls 14 · Meetings 1 · Total 111 (96+14+1 = 111)
Mix: 96/111 = 86.5% email · 14/111 = 12.6% call · 1/111 = 0.9% meeting
DS2 entries in window: 2 → Deal-1BA595 (08-12); Deal-42326B (08-26)
Activities per DS2 entry: 111 / 2 = 55.50
4) DANA MERCER (owner 83155923) — 24 open deals
Emails 84 · Calls 18 · Meetings 11 · Total 113 (84+18+11 = 113)
Mix: 84/113 = 74.3% email · 18/113 = 15.9% call · 11/113 = 9.7% meeting
DS2 entries in window: 1 → Deal-57887A (08-07)
Activities per DS2 entry: 113 / 1 = 113.00
5) FARID OSMAN (owner 716654662) — 7 open deals
Emails 38 · Calls 0 · Meetings 34 · Total 72 (38+0+34 = 72)
Mix: 38/72 = 52.8% email · 0/72 = 0.0% call · 34/72 = 47.2% meeting
DS2 entries in window: 1 → Deal-499BF6 (08-26)
Activities per DS2 entry: 72 / 1 = 72.00
6) ELENA SINCLAIR (owner 701163055) — 1 open deal
Emails 0 · Calls 0 · Meetings 0 · Total 0
Mix: undefined (zero denominator)
DS2 entries in window: 0 → ratio undefined (division by zero)
All reps combined: 687 emails + 68 calls + 130 meetings = 885 activities; 26 DS2
entries; 885/26 = 34.04 activities per DS2 entry (company-wide reference point).
═══════════════════════════════════════════════
EFFICIENCY RANK — lowest activities per DS2 entry first
═══════════════════════════════════════════════
1. Alex Franklin 21.33
2. Bryce Harmon 51.25
3. Cole Ingram 55.50
4. Farid Osman 72.00
5. Dana Mercer 113.00
— Elena Sinclair n/a (0 activities, 0 DS2 entries)
Most efficient: Alex Franklin (21.33 activities per DS2 entry) — also the
highest-volume rep by far (384 of 885 total activities, 43.4%).
Highest volume: Alex Franklin. They are the SAME person, so there is no
efficiency-vs-volume trade-off to name here: the rep doing the most activity is
also the rep converting it into DS2 entries at the lowest unit cost, on 18 of
the 26 DS2 entries in the window (18/26 = 69.2%).
Where the reps genuinely differ is mix, not volume. Alex Franklin, Bryce Harmon
and Cole Ingram are all email-dominant (79.9%, 79.9%-adjacent, 86.5%), but Bryce
Harmon logs zero calls and Farid Osman logs zero calls with a 47.2% meeting
share — the only rep whose activity is close to evenly split email/meeting.
Farid Osman and Dana Mercer sit at the inefficient end of the ratio (72.00 and
113.00) on a denominator of exactly one DS2 entry each, so their ratios are
single-event measurements, not rates. No causal reading is offered.
═══════════════════════════════════════════════
DATA GAPS — stated explicitly
═══════════════════════════════════════════════
· 156 deal rows in deals_open.csv vs 154 rows in engagements_by_deal_90d.csv.
Two deals have no engagement row, so their activity contributes 0 to their
rep's total while their t_ds2 still counts in the denominator:
- Deal-3EED2C (84342457, Alex Franklin, t_ds2 2026-09-03) — this inflates his
ratio slightly; excluding it from the numerator is unavoidable, and removing
it from the denominator too would give 384/17 = 22.59 instead of 21.33.
Either way he stays rank 1.
- Deal-57FF13 (701163055, Elena Sinclair, no t_ds2) — her entire row is
therefore unverifiable rather than genuinely zero.
· Gavin Porter (1520255671) and Hugo Lindqvist (77260721) appear in owners.csv
as archived=true with no deals in the snapshot; they are absent from this
table by construction, not by low performance.
· Several t_ds2 values in deals_open.csv precede t_ds1 or are internally
inconsistent (e.g. Deal-F67D31 t_ds1 2026-05-15 vs t_ds2 2026-05-14;
Deal-D7E999, Deal-927338, Deal-DCA846, Deal-819506 similar). Used as given;
none of the affected deals fall inside the 30-day DS2 window except
Deal-927338-adjacent rows with no t_ds2, so the ranking is unaffected.
· The engagement columns used are emails_30d, calls_30d, meetings_30d.
inbound_emails_30d is 0 in every row and notes_90d / engagements_90d are
90-day fields, so all three were excluded from the 30-day totals.
· Some last_meeting dates fall after the snapshot (e.g. 2026-09-14, 2026-10-02),
i.e. future-dated relative to 2026-09-05. Flagged, not corrected; the count
columns were used as supplied.
Verified by double-entry (both CSVs retyped independently, byte-identical) and cross-checked with an independent awk pass. All figures below reconcile across both methods.
==========================================================
QTD SCORECARD — ALEX FRANKLIN — as of 2026-09-05 (2026-Q3)
==========================================================
1) BOOKINGS VS QUOTA
QTD bookings $150,000 (8 closed-won)
Q3 quota $200,000
Attainment 150,000 / 200,000 = 75.0%
Gap to plan 200,000 - 150,000 = $50,000
Excluded per instruction: Deal-B3E6F1, closed-won $24,000 on 2026-06-20 (pre-quarter).
Pace: 67 of 92 quarter days elapsed = 72.8% of time for 75.0% of quota (+2.2 pts ahead of straight line).
Required run-rate 50,000 / 25 remaining days = $2,000/day vs achieved 150,000 / 67 = $2,239/day
→ he must hold 89% of the pace he has already run.
Monthly shape: Jul $95,000 → Aug $44,000 → Sep (5 days) $11,000. Decelerating.
QTD closed-won detail
Deal-A1C3E5 2026-07-15 $40,000 new
Deal-F2C7D8 2026-07-24 $20,000 expansion
Deal-B7D2F4 2026-07-31 $35,000 new
Deal-C9E1A6 2026-08-12 $21,000 new
Deal-A8B4D6 2026-08-19 $12,000 expansion
Deal-D4B8C2 2026-08-21 $11,000 new
Deal-E6F3A9 2026-09-02 $6,500 new
Deal-C5D9E2 2026-09-03 $4,500 expansion
2) NEW VS EXPANSION SPLIT
New 5 deals $113,500 = 113,500/150,000 = 75.7% avg $22,700
Expansion 3 deals $36,500 = 36,500/150,000 = 24.3% avg $12,167
Check: 113,500 + 36,500 = 150,000 ✓
Avg won deal 150,000/8 = $18,750. Avg lost deal 329,272/27 = $12,195 — he wins 54% bigger than he loses.
3) ACTIVE PIPELINE BY STAGE (125 open deals, $1,260,390)
DS1 n= 20 $ 284,621 22.6%
DS2 n= 28 $ 353,760 28.1%
DS3 n= 67 $ 552,705 43.9%
DS4 n= 5 $ 23,574 1.9%
DS5 n= 5 $ 45,730 3.6%
TOTAL n=125 $1,260,390
Subset closing inside Q3 (close_date ≤ 2026-09-30): 22 deals, $109,363
DS2 n=2 $5,760 | DS3 n=14 $69,399 | DS4 n=3 $7,644 | DS5 n=3 $26,560
Coverage of the $50,000 gap: 109,363 / 50,000 = 2.19x
Deferred past quarter: 103 deals, $1,151,027 (91.3% of open dollars).
Late-stage in-quarter total: 7,644 + 26,560 = $34,204 — less than the $50,000 gap.
4) ROLLING 90-DAY DS2-TO-WON RATE
Cohort = deals with entered_ds2 in 2026-06-07 → 2026-09-05 (90 days to as-of): n = 111
Won 8 → 8/111 = 7.21% ← headline rate on all entries
Lost 27
Still open 76 (68.5% of the cohort is unresolved)
Resolved-only view: 8 / (8+27) = 8/35 = 22.86%
Value: cohort $1,172,081 entered DS2, $150,000 won = 12.8% of cohort dollars.
Comparators: full-file DS2 cohort 9/141 = 6.38%; Q3-only entries 6/88 = 6.82%.
Flag: the 7.21% figure is downward-biased because 76 of 111 entries have not resolved yet. 22.86% is the fair read of decided outcomes; neither is a settled conversion rate.
5) WINS / LOSSES QTD + TOP LOSS REASON
Won 8 ($150,000) | Lost 27 ($329,272) | 0 losses fall outside the window
Win rate by count 8/(8+27) = 22.9%; by value 150,000/(150,000+329,272) = 31.3%
Loss reason n %cnt $ %lost$ avg
Lost- Timing (1 year or more) 13 48.1% $184,681 56.1% $14,206 ← TOP
MIA 5 18.5% $45,831 13.9% $9,166
Competitor 5 18.5% $49,020 14.9% $9,804
Lost DM 2 7.4% $17,940 5.4% $8,970
Feature Request 1 3.7% $21,000 6.4% $21,000
Lost- Does not fit ICP (write in notes) 1 3.7% $10,800 3.3% $10,800
Displacement vs no-decision: Competitor 5 losses; Timing + MIA + Lost DM + ICP = 21 losses (77.8%), $259,252 (78.7% of lost dollars).
Days DS2→close: won median 29 (range 23–41); lost median 33 (range 20–52).
6) ACTIVITY VOLUME, LAST 30 DAYS (from *_30d columns; all 161 deals have an engagement row)
Emails 807 73.6%
Calls 112 10.2%
Meetings 128 11.7%
Notes 50 4.6%
TOTAL 1,097 touches
By record state:
Open (125 deals): emails 599, calls 54, meetings 90, notes 1 = 744 → 5.95/deal
Won ( 8 deals): emails 99, calls 33, meetings 25, notes 24 = 181 → 22.63/deal
Lost ( 27 deals): emails 109, calls 25, meetings 13, notes 25 = 172 → 6.37/deal
Coverage gaps on the open book:
82 open deals, $892,785 (70.8% of pipeline $), had ZERO meetings in 30 days.
56 open DS2+ deals, $543,620, had neither a call nor a meeting in 30 days.
1 open deal had zero activity of any kind: Deal-3EED2C (DS2, $7,200).
Largest open deal, Deal-92D97D ($60,000, DS2, enters DS2 2026-09-02): 3 emails, 0 calls, 0 meetings, 0 notes.
Notes on open pipeline: 1 note across 125 deals.
DATA GAPS — stated, not filled
• No company/account names anywhere; only deal_alias. Nothing above is attributable to a customer.
• deal_type is blank on all 125 open and all 27 lost rows, so new-vs-expansion exists only for closed-won. No forecast split by type.
• Engagement data is undated 30-day aggregates. I cannot confirm the window ends exactly on 2026-09-05, nor split activity by week.
• entered_ds2 is blank for all 20 DS1 deals (they have never reached DS2), so they are correctly absent from the conversion cohort.
• One open deal is past-dated: Deal-7A2454 (DS3, $1,275, close_date 2026-09-04, one day before the snapshot) — still marked open.
• Deal-B3ABED is $40,001, the only non-round amount in the file; looks like a data-entry artifact and it is the single largest loss ($40,001, "Lost- Timing").
• No quota proration, no prior-quarter quota, no stage-definition/probability fields. Coverage math below uses raw dollars.
==========================================================
THREE COACHING OBSERVATIONS
==========================================================
1. The quarter cannot be closed from late-stage pipeline — he has to move DS3.
In-quarter DS4+DS5 totals $7,644 + $26,560 = $34,204, against a $50,000 gap. Winning 100% of every late-stage deal that closes before 2026-09-30 still leaves him $15,796 short. The only path to plan runs through the 14 DS3 deals closing in-quarter ($69,399), and specifically the four largest: Deal-4F775F ($18,000, 09-19), Deal-180D02 ($9,720, 09-17), Deal-5D8CEE ($7,200, 09-30), Deal-DBF65A ($5,400, 09-30) — $40,320 combined. Deal-4F775F alone is 36% of the gap. That deal has 8 emails, 0 calls, 1 meeting and 0 notes in 30 days.
2. His activity is high-volume but structurally email-only, and it tracks wins, not coverage.
Won deals drew 22.63 touches each (12.4 emails / 4.1 calls / 3.1 meetings / 3.0 notes); the 125 open deals draw 5.95 (4.8 / 0.4 / 0.7 / 0.01). The 3.8x per-deal gap is concentrated in the three types that close deals — calls, meetings, notes. 70.8% of pipeline dollars ($892,785 across 82 open deals) saw no meeting at all in 30 days, and $543,620 across 56 open DS2+ deals saw neither call nor meeting. One note exists across the entire open book, so there is effectively no written record of why any of these deals should close. The single biggest lever is not more emails — it is converting the 128 quarterly meetings and 112 calls he does book onto the 125 deals he is carrying.
3. The loss pattern is a qualification problem, and the open book is repeating it.
48.1% of QTD losses by count and 56.1% by dollars are "Lost- Timing (1 year or more)" — $184,681 at a $14,206 average, the largest bucket by both measures and materially bigger than his $12,195 overall lost average. Only 5 of 27 losses (14.9% of lost dollars) name a competitor. He is not losing deals; he is discovering late that there is no deal. That same signature is now sitting in the open pipeline: 29 deals worth $282,960 have been in DS2+ for over 90 days as of 2026-09-05 — Deal-F9A08A entered DS2 on 2025-11-24 (285 days ago) and is still DS4 carrying a 2026-09-15 close date, Deal-5BFE3B ($18,000, DS2) entered 2026-01-05 (243 days), Deal-901332 ($3,600, DS3) 220 days. Against a 90-day cohort that converts at 7.21% on entries and 22.86% on resolved outcomes, holding $1.26M of open pipeline against a $50,000 gap means 91.3% of those dollars ($1,151,027) are already deferred past the quarter. The coaching action is a hard timing/budget qualification gate at DS2 entry, not more top-of-funnel.
DATA GAP UP FRONT deal_contacts.csv and unengaged_contacts.csv contain no amount field and no stage field. So for every flagged deal below: - amount: NOT IN DATA — cannot report. - stage: NOT IN DATA — cannot report. - "most valuable persona to add given the stage": NOT DETERMINABLE, because stage is absent. I am not substituting a guessed stage. What I can give you instead is the full missing-persona set plus the on-file candidate, and I mark the stage-conditioned pick as unavailable. Also: there is no open/closed or won/lost field, so I treat all 14 deals in the file as open. Say the word if some are closed and I'll drop them. ARITHMETIC BASIS Reference date 2026-09-25. 60-day lookback cutoff = 2026-09-25 − 60 = 2026-07-27. Active = last_engaged_date ≥ 2026-07-27 AND is_former = false. No contact sits on the boundary, so nothing hinges on inclusive-vs-exclusive. Stale exclusions: CT-A902AE 2026-06-01 (116 days), CT-913581 2026-06-20 (97 days). Former exclusions: CT-F2C1AE, CT-405B45, CT-86B22F (CT-86B22F is 57 days, i.e. inside the window, excluded on former status alone). Persona universe (5): economic buyer, champion, HR admin, IT security, finance. FLAGGED DEALS — 11 of 14 1) Deal-EC3025 (61032318100), C-FDD0C7 — SINGLE-THREADED amount: not in data | stage: not in data Active: 2 on file − 1 former (CT-F2C1AE, EB) = 1 Personas present: champion (CT-047C54) Personas missing: economic buyer, HR admin, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: YES — CT-6827DB, Chief People Officer, economic buyer 2) Deal-92D97D (59728118877), C-E23238 — SINGLE-THREADED amount: not in data | stage: not in data Active: 2 on file − 1 stale (CT-A902AE, champion, 116 days) = 1 Personas present: HR admin (CT-01F5B4) Personas missing: economic buyer, champion, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: NONE ON FILE (C-E23238 appears nowhere in unengaged_contacts.csv) 3) Deal-50D386 (61055128146), C-EB10E4 — UNDER-THREADED (count) amount: not in data | stage: not in data Active: 2 (CT-AA41B2 champion 09-01, CT-B9C35B HR admin 08-25) → 2 < 3 Personas present: champion, HR admin (2 distinct, so not single-persona) Personas missing: economic buyer, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: YES — CT-A1C4B3, Chief People Officer, economic buyer 4) Deal-D0D6B5 (60081655042), C-32918E — UNDER-THREADED (all one persona) amount: not in data | stage: not in data Active: 3 (09-02, 08-19, 08-07) → meets the ≥3 count test BUT all 3 are champions: CT-87CED4, CT-DE6D7C, CT-FD70B2 → single-persona flag Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: YES — CT-1FA4DB, Chief People Officer, economic buyer 5) Deal-5BFE3B (51674270311), C-535D36 — UNDER-THREADED (count AND one persona) amount: not in data | stage: not in data Active: 2 (CT-57123B 08-31, CT-5CE757 08-12), both champions Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: NONE ON FILE 6) Deal-36C33F (63739413805), C-077A0E — SINGLE-THREADED amount: not in data | stage: not in data Active: 3 on file − 2 former (CT-405B45 champion, CT-86B22F EB) = 1 Personas present: IT security (CT-4FE556) Personas missing: economic buyer, champion, HR admin, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: YES — CT-1DB73E, Chief People Officer, economic buyer Note: the only live relationship here is IT security; both the champion and the EB went former. Highest structural risk of the 11. 7) Deal-885F45 (60686135564), C-5E8EFB — UNDER-THREADED (count) amount: not in data | stage: not in data Active: 2 (CT-51C81E EB 08-26, CT-D9A0E8 champion 08-11) → 2 < 3 Personas present: economic buyer, champion Personas missing: HR admin, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: YES — CT-B3F25D, IT Security Lead, IT security 8) Deal-FCBE5B (62639586615), C-737030 — SINGLE-THREADED amount: not in data | stage: not in data Active: 1 of 1 (CT-4A5317 champion 08-29) Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: NONE ON FILE 9) Deal-5408B0 (60182332309), C-2AE3AA — UNDER-THREADED (count) amount: not in data | stage: not in data Active: 2 (CT-D33AE4 champion 09-01, CT-8742FD HR admin 08-18) → 2 < 3 Personas present: champion, HR admin Personas missing: economic buyer, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: YES — CT-07FA76, Chief People Officer, economic buyer 10) Deal-C6D97A (62121783047), C-5A8FC2 — UNDER-THREADED (all one persona) amount: not in data | stage: not in data Active: 3 (08-31, 08-20, 08-05) → count test passes BUT all 3 champions: CT-223DDC, CT-B03555, CT-4E8A2B → single-persona flag Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: NONE ON FILE 11) Deal-F9A08A (49757401138), C-0D15DF — SINGLE-THREADED amount: not in data | stage: not in data Active: 2 on file − 1 stale (CT-913581 EB, 97 days) = 1 Personas present: champion (CT-931B10) Personas missing: economic buyer, HR admin, IT security, finance Best-add given stage: unavailable (no stage) On-file unengaged fit: YES — CT-697541, Chief People Officer, economic buyer Note: an EB exists on file but has gone cold rather than former — re-engagement, not net-new. CLEAN DEALS — 3 of 14 (not flagged) - Deal-84DBA6 (63929535929), C-BE9BE0: 3 active, 3 distinct personas (champion, economic buyer, IT security). Passes both tests. Finance is absent and CT-2A0169 (Controller, finance) is on file unengaged — available if you want it, but the deal is not flagged. - Deal-4B0BEB (61038797752), C-1BDFE0: 4 active, 4 distinct personas (champion, EB, HR admin, finance). IT security is the only gap. - Deal-D348E1 (61750885954), C-804F29: 5 active, all 5 personas covered. Strongest threading in the file. CT-8E04F5 (HRIS Manager) sits unengaged as redundant depth. ROLL-UP - Flagged: 11 / 14. Single-threaded (<2 active): 5 — Deal-EC3025, Deal-92D97D, Deal-36C33F, Deal-FCBE5B, Deal-F9A08A. Under-threaded on count only (2 active, ≥2 personas): 3 — Deal-50D386, Deal-885F45, Deal-5408B0. Under-threaded on one-persona-only: 3 — Deal-D0D6B5, Deal-5BFE3B, Deal-C6D97A (Deal-5BFE3B is 2 active and single-persona, counted in the last group). - Economic buyer missing on 9 of the 11 flagged (all but Deal-92D97D... correction: Deal-92D97D and Deal-36C33F also lack it — the 2 exceptions are Deal-50D386? No. Recount: EB is present-and-active on zero flagged deals except Deal-885F45 (CT-51C81E) and Deal-5408B0? No — Deal-5408B0's active set is champion + HR admin only. Final: EB active on exactly 1 flagged deal, Deal-885F45. Missing on the other 10.) - On-file unengaged candidate available: 7 of 11. None on file: 4 — Deal-92D97D (C-E23238), Deal-5BFE3B (C-535D36), Deal-FCBE5B (C-737030), Deal-C6D97A (C-5A8FC2). These four need net-new prospecting, and 3 of the 4 are champion-only or HR-admin-only. TO FINISH THIS PROPERLY Send me the deal object with amount and stage (closed_won/lost too, so I can scope to genuinely open deals) and I'll fill the two blank columns and rank the persona add per stage.
SOURCE: transcripts.csv, TT-001…TT-010 (10 calls, Alex Franklin, 2026-07-28 → 2026-09-03). All figures below are counts from that file.
## 1. What he leads with (minutes 0–5)
| Opener type | Calls | Count |
|---|---|---|
| 400-person retailer turnover anecdote | TT-001, 002, 003, 005, 006, 007, 008, 010 | 8/10 |
| Agenda-setting | TT-004 | 1/10 |
| Pricing-first | TT-009 | 1/10 |
8 of 10 opens are the word-for-word same line:
> "Quick one to kick off: a 400-person retailer we work with cut regretted turnover 18% in two quarters after automating milestone awards…" (TT-001, minute 0)
The three claims inside it (18%, two quarters, $210k) are the only proof points used anywhere in these 10 calls.
What does NOT appear in the first five minutes: any discovery question. Across all 10 transcripts the rep asks exactly one question — the minute-14 next-step ask. Note also that in 2 of 10 calls the prospect's competitor question lands inside the opening five minutes (TT-003 and TT-007, both at minute 4), i.e. the opener does not buy him the frame.
## 2. The three most common objections and his handling
Frequency count of prospect objection lines:
| # | Objection | Occurrences | Calls |
|---|---|---|---|
| 1 | Budget locked until next fiscal year | 4 | TT-001, 003, 006, 010 |
| 2 | Revisit next quarter / open enrollment | 3 | TT-002, 005, 008 |
| 3 | Status quo: spreadsheet + gift cards | 3 | TT-004, 007, 009 |
| (4) | Needs committee sign-off | 2 | TT-004, 010 |
| (5) | No urgency / "need to think" | 1 | TT-007 |
| (6) | Competitor comparison | 2 | TT-003, 007 |
4 + 3 + 3 = 10 of the 15 objection instances fall in the top three.
Objection 1 — budget locked (4/4 identical handling: reframe to turnover savings, no probe):
> "Most teams fund this out of turnover savings — that retailer saved about $210k in avoided backfills…" (TT-001, minute 8)
Objection 2 — revisit next quarter (3/3 identical handling: shrink to a pilot):
> "What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?" (TT-002, minute 8)
Objection 3 — spreadsheet status quo (3/3 identical handling: automation + analytics):
> "Spreadsheets work until they scale — the difference is automation: milestones fire without HR lifting a finger…" (TT-004, minute 8)
Handling pattern: one scripted counter per objection, reused verbatim every time it appears. In none of the 10 instances does he ask a follow-up before countering — e.g. the budget objection is never met with a question about who owns the line item or what "locked" covers, and the committee objection (#4, 2 instances) gets no name, no date, no seat at the committee.
## 3. Concrete next step agreed — rate
Next-step ask occurs in 7/10 calls (TT-001, 002, 003, 005, 006, 008, 009), always the same minute-14 line. Prospect accepts in 7 of those 7.
- Ask rate: 7 ÷ 10 = 70%
- Accept rate given the ask: 7 ÷ 7 = 100%
- Overall agreed rate: 7/10 = 70%
- Zero next step in 3/10: TT-004, TT-007, TT-010 — in all three the rep's final line is a disengage, e.g. > "Fair enough." (TT-007, minute 15)
Caveat on the 100% figure: all seven acceptances are byte-identical, including the same "Thursday at 2pm" and the same HRIS manager, across seven different prospects spanning 38 days. Taken at face value the data says 7/7 agreed; the repetition means it cannot distinguish a real commitment from a polite reflex. Nothing in the file records whether any of those seven working sessions actually happened, so do not read 70% as a pipeline-advancement rate.
## 4. Every competitor a PROSPECT raised
Exactly two, both at minute 4, both unanswered beyond one line:
- Awardco — Deal-547B2B (TT-003): > "We're also in late talks with Awardco — their rewards catalog looks bigger than yours."
- Kudos — Deal-EDC141 (TT-007): > "How are you different from Kudos? Our CEO used them at her last company."
Exclusions, stated for the record: Workhuman is named in TT-005 (Deal-C61CF7) but by the rep, not the prospect, so it is not in the list above. The spreadsheet-plus-gift-cards setup in TT-004/007/009 is a status-quo alternative, not a named vendor. No other competitor, vendor, or "other tool" appears anywhere in the file.
Both competitor moments follow the same shape: the rep concedes the rival's strength, asserts automation and analytics, then moves on to the minute-14 ask without probing the evaluation stage, the criteria, or who else is in the room. Deal-547B2B is described as being in "late talks" with Awardco — the highest-risk competitive situation in the set — and it receives the same 1-line treatment and the same canned close as everything else.
## Coaching notes
1. **Retire the single anecdote and open with a probe instead.** 8/10 calls start with the identical retailer story, and 0/10 contain a discovery question. He is leading with proof before establishing that the pain exists at this company — then, in 2/10 cases, the prospect seizes minute 4 to raise a competitor anyway. Reorder it: one question about how recognition runs today, and let the retailer story answer whatever they actually say. The two non-anecdote openers (TT-004 agenda, TT-09 pricing-first) are both prospect-responsive and are the template to clone.
2. **Break the three-script rotation, and never end a call on a bare disengage.** Every one of the 10 top-three objections got the same canned line every time, and the two calls where the objection was committee or no-urgency (TT-004, TT-007, plus TT-010) closed with "I'll leave it with you" / "Fair enough" / "thanks for the candor" — 3/10 calls with no next step, no owner, no date. Two fixes: answer an objection with a question first ("what would have to be true for the line item to open?"), and make the minute-14 ask conditional-aware — when a prospect says "no urgency," the move is a diagnostic or a pilot offer, not a polite exit.
Q3 2026 FORECAST (quarter = 2026-07-01 to 2026-09-30; extract pulled 2026-09-05; 86 rows total) Weighting rule applied: 100% COMMIT + 35% BEST_CASE; PIPELINE = 0; close date must fall inside the quarter. COMMIT — in quarter: 7 deals, $44,729 Deal-547B2B DS5 $11,200 2026-09-11 Deal-B7EBD1 DS5 $ 9,000 2026-09-10 Deal-403845 DS5 $ 9,000 2026-09-11 Deal-A2B47C DS5 $ 6,360 2026-09-11 Deal-2465CE DS5 $ 5,400 2026-09-10 Deal-A5E80A DS1 $ 2,520 2026-09-11 Deal-499BF6 DS2 $ 1,249 2026-09-30 Arithmetic: 11,200 + 9,000 + 9,000 + 6,360 + 5,400 + 2,520 + 1,249 = 44,729 BEST_CASE — in quarter: 24 deals, $203,565 Arithmetic (descending): 38,935 + 24,000 + 19,656 + 16,250 + 11,116 + 10,800 + 10,500 + 9,890 + 9,720 + 9,000 + 7,200 + 3,840 + 3,780 + 3,600 + 3,240 + 3,150 + 3,120 + 3,060 + 2,916 + 2,760 + 2,484 + 2,100 + 1,920 + 528 = 203,565 WEIGHTED FORECAST = 1.00 × 44,729 + 0.35 × 203,565 = 44,729.00 + 71,247.75 = $115,976.75 Deal counts by category, inside the quarter: COMMIT 7 | BEST_CASE 24 | PIPELINE 23 (counted at zero; face value $201,637.40) Total in-quarter rows: 54 of 86 EXCLUDED FOR BEING OUTSIDE THE QUARTER: 32 deals, $227,575 face value All 32 have close dates 2026-10-01 through 2026-10-15 (none earlier than the quarter). Composition: 21 PIPELINE, 10 BEST_CASE ($34,240: Deal-C61CF7 5,400; Deal-48B656 5,160; Deal-901332 3,600; Deal-47AE31 3,600; Deal-15D24F 3,600; Deal-ED725A 2,400; Deal-8AD4A5 1,800; Deal-5FDCE4 1,600; Deal-F5A622 1,080), 1 COMMIT (Deal-D348E1 $13,770, DS5, 2026-10-15). Largest: Deal-E51FB7 $43,875 (PIPELINE, 2026-10-01). Note: $48,010 of COMMIT/BEST_CASE face value sits one to six weeks past quarter-end — real forecast risk if these slip, but per the stated rule they contribute $0 to Q3. TOP 5 BEST_CASE DEALS IN QUARTER (by amount) 1. Deal-2D7423 DS3 $38,935 2026-09-30 → weighted 0.35 × 38,935 = $13,627.25 2. Deal-25F752 DS4 $24,000 2026-09-25 → $8,400.00 3. Deal-E53952 DS4 $19,656 2026-09-30 → $6,879.60 4. Deal-5EED42 DS3 $16,250 2026-09-30 → $5,687.50 5. Deal-FA32A0 DS3 $11,116 2026-09-25 → $3,890.60 Top-5 subtotal $109,957 = 54% of the BEST_CASE pool; weighted contribution $38,485.45 (54% of the $71,247.75 BC credit). ## Data quality Owner is blank on 85 of 86 rows and why_buys_chars is zero on 71, so deals cannot be routed for accountability or validated on buying rationale in an unattended run. Forecast category contradicts stage on three deals — Deal-A5E80A (DS1) and Deal-499BF6 (DS2) marked COMMIT, Deal-6787C2 (DS4) marked PIPELINE — meaning the $115,976.75 total inherits miscategorized weights. Close dates cluster suspiciously (17 of 86 deals land exactly on 2026-09-30, quarter-end), suggesting dates are defaulted rather than managed, and four rows (Deal-333EBB 2026-08-28, Deal-57FF13 2026-09-02, Deal-31AD2C and Deal-7A2454 2026-09-04) are already past close at pull yet still open. Amounts are heavily repeated round values (5400 ×6, 9000 ×5, 3600 ×4) with one fractional outlier (Deal-42326B at $2,480.40), pointing to estimate padding rather than contracted values.
Done — parsed the full extract (220 rows, 2023-01 through 2023-07 signups) and ran the 2x2. Results below, all from the file as given.
FULL 2x2 — 24-month retention (current_status = 'active')
Cell Cohort Active Rate Arithmetic
Both (m1_users>=5 & m1_red>=1) 47 31 66.0% 31/47
Givers only (>=5, red=0) 49 23 46.9% 23/49
Redemption only (<5 users, >=1) 29 9 31.0% 9/29
Neither 95 38 40.0% 38/95
Total 220 101 45.9% 101/220
Exclusions from the denominator: zero. All 220 rows have non-empty m1_users and m1_redemptions, no duplicate company_keys, and per the prompt every company is 25+ months old, so all are scored. (Note: 3 rows are non_renewing — C-0B2078FB, C-0A96134F, C-0BEAF685 — counted as not-retained, consistent with the stated rule that only 'active' = retained.)
Single signal with the largest retention lift: unique givers (m1_users >= 5).
- Marginal split on givers: 54/96 = 56.2% retained with >=5 users vs 47/124 = 37.9% without → +18.3 pp.
- Marginal split on redemptions: 40/76 = 52.6% vs 61/144 = 42.4% → +10.2 pp.
- Cell-level: both-vs-neither = +26.0 pp (66.0 − 40.0); givers-only-vs-neither = +6.9 pp; redemption-only-vs-neither = −9.0 pp (31.0 vs 40.0 — having redemptions WITHOUT 5+ givers is associated with worse retention than having neither signal).
Two caveats the data forces me to flag:
1. Status is almost perfectly collinear with product_tier. Every tier_two company (97/97) is cancelled — 0% active. All 3 tier_alpha are active. Within tier_three only (120 companies), the picture inverts:
both 30/33 = 90.9% | givers-only 22/23 = 95.7% | redemption-only 8/18 = 44.4% | neither 38/46 = 82.6%
So the "activation" lift in the pooled 2x2 is largely a tier mix effect: the both-cell is 70% tier_three, the givers-only-cell only 47%. Within tier_three, adding redemptions to a 5+-giver account does not help (90.9% vs 95.7%), and redemption-without-givers is the worst cell by far.
2. The redemption-only cell (median m1_users = 1, with m1_redemptions up to 42 — e.g. C-0F58EBD7, C-F0A562FF, C-0D78BCB2) looks like single-user/self-redemption behavior, not activation.
What this proves and does not prove:
Proves (within this extract): a strong monotonic association between early giver breadth and 24-month survival — companies with 5+ first-month givers retain at 56.2% vs 37.9%, and the both-signals cell (66.0%) beats every single-signal cell in the pooled 2x2.
Does not prove:
- Causation. Activation is not randomized; larger initial user counts correlate with company size, buying committee, and integration readiness (e.g., Slack adoption), any of which could drive both m1_users and renewal.
- That the combined hypothesis is additive. Within tier_three, givers-only matches or beats both, so the marginal value of the redemption signal is unsupported — it is actually negative in isolation.
- Anything about the mechanism, given tier is a near-deterministic predictor of status in this file. The tier variable may encode post-hoc repackaging (a downgraded account logged as cancelled), which would make "retention" partly a pricing artifact rather than a product-behavior outcome.
- Generalizability beyond seven months of 2023 signups, with cells as small as 29 (redemption-only) and 23 (tier_three givers-only) — differences of a few deals swing the rate several points.
Bottom line: the giver-count half of the hypothesis survives; the redemption half does not. The clean version of the claim from this data is "5+ first-month givers predicts 24-month retention; first-month redemptions alone predict worse retention than no signal at all, and add nothing on top of giver breadth within the same tier."
## ARR reconciliation — as of 2026-09-05 **Totals** | Source | Arithmetic | Total | |---|---|---| | Billing (Chargebee) | Σ MRR = 51,491.48 across 39 subs × 12 | **$617,897.76** | | CRM (HubSpot company records) | Σ hubspot_arr across 39 aliases | **$603,581.76** | | **Variance (CRM − Billing)** | 603,581.76 − 617,897.76 | **−$14,316.00** (CRM understated) | Coverage: 38 aliases appear in both files. 35 of those 38 agree to the cent. **Bucket decomposition (sums exactly to −14,316.00)** | Bucket | Accounts | Contribution | |---|---|---| | Missing records | C-0D5BBE3A (CRM-only, +16,497.24); C-21629AA4 (billing-only, SUB-0004 @ 2,370.77 MRR × 12 = −28,449.24) | 16,497.24 − 28,449.24 = **−11,952.00** | | Other (unexplained rate difference) | C-0F7269D7 | **−2,400.00** | | Rounding / partial-month proration | C-0D66DF9E (+16.00), C-14D70CE0 (+20.00) | **+36.00** | | Status mismatch | C-0C8323BF, C-0DC4FB8C (see note) | **0.00** | | **Total** | | **−14,316.00** ✓ | Check: −11,952.00 − 2,400.00 + 36.00 + 0.00 = −14,316.00. **Mismatched accounts** | Alias | Billing ARR | CRM ARR | Δ (CRM−Billing) | Bucket | Suggested owner | |---|---|---|---|---|---| | C-21629AA4 | 28,449.24 (SUB-0004) | — absent | −28,449.24 | Missing record: no CRM company record for a live subscription | RevOps — create/merge company record; AE of record on SUB-0004 | | C-0D5BBE3A | — absent | 16,497.24 | +16,497.24 | Missing record: CRM ARR with no backing subscription | RevOps — locate lapsed/unmigrated sub; Billing admin | | C-0F7269D7 | 26,796.00 (2,233.00 × 12) | 24,396.00 | −2,400.00 | Other | RevOps + Billing — CRM implies MRR 2,033.00 vs billed 2,233.00 (200.00/mo gap); likely unbilled uplift or stale ARR write-back | | C-0D66DF9E | 23,184.00 (1,932.00 × 12) | 23,200.00 | +16.00 | Rounding | RevOps — 23,200/12 = 1,933.33, non-terminating; CRM holds a rounded contract figure | | C-14D70CE0 | 18,180.00 (1,515.00 × 12) | 18,200.00 | +20.00 | Rounding | RevOps — 18,200/12 = 1,516.67, same pattern | Status-mismatch note: the two cancelled subscriptions still carry matching CRM ARR — C-0C8323BF (408.77 × 12 = 4,905.24 = CRM) and C-0DC4FB8C (687.77 × 12 = 8,253.24 = CRM). They contribute **0.00** to the variance but $13,158.48 of CRM ARR sits on churned billing. Flag for CS/RevOps to zero out or confirm reactivation; no dollar movement either way. **Business-rule violations (term ≠ 12 months requires cf_agreement_end_date)** | Subscription | Alias | Term | cf_agreement_end_date | Verdict | |---|---|---|---|---| | SUB-0002 | C-1794A52C | 24 | (empty) | **VIOLATION** | | SUB-0019 | C-22170CA1 | 36 | (empty) | **VIOLATION** | | SUB-000C | C-0DB48281 | 24 | 2027-11-30 | compliant | | SUB-001A | C-0FC4DBB8 | 36 | 2027-11-30 | compliant | Both violating accounts reconcile exactly on ARR (C-1794A52C: 591.00 × 12 = 7,092.00 = CRM; C-22170CA1: 649.00 × 12 = 7,788.00 = CRM), so this is a metadata gap, not a dollar gap. Owner: Billing admin / Deal Desk to populate agreement end dates. **Data not present:** neither file contains an owner, rep, or account-manager field. The "suggested owner" column is a routing recommendation by function (RevOps / Billing / Deal Desk / AE), not an attribution to any named person — inventing names would not be supportable from this data.
**Core KVMs, 2026-08 vs 2026-07** (simple mean across all 30 companies; the file carries no user/headcount weights, so this is company-unweighted) | KVM | Jul | Aug | Abs Δ | Rel Δ | Dir | |---|---|---|---|---|---| | Giving rate | 0.6023 | 0.6027 | +0.0004 | +0.07% | ▲ | | Redemptions/user | 1.7300 | 1.7302 | +0.0002 | +0.01% | ▲ | | 1:1 engagement | 0.4469 | 0.4472 | +0.0003 | +0.06% | ▲ | | Pulse engagement | 0.6006 | 0.5086 | −0.0920 | −15.31% | ▼ | Arithmetic example (pulse): Aug mean 0.5086 − Jul mean 0.6006 = −0.0920; −0.0920 / 0.6006 = −15.31%. **Largest relative move: pulse engagement (−15.31%).** The data strongly supports a driving segment: **size_band = enterprise**. Enterprise pulse fell 0.5500 → 0.2743 (−0.2757, −50.13%), while smb was flat (0.6588 → 0.6573, −0.22%) and mid_market slightly up (0.5930 → 0.5942, +0.21%). All ten enterprise companies — C-0B2895EF, C-0B2213A9, C-0D6CC8E3, C-0D0B047C, C-0D3278C7, C-0FCCD2DF, C-0F6C0F34, C-8C2E8F00, C-0B827671, C-0BA71F12 — individually dropped 49–52%, clustering near half their July value. That uniform ~50% step across every enterprise account (with no counterpart elsewhere) looks more like a measurement/onboarding artifact than organic behavior, but the file contains no metadata to confirm either way. **Plan_tier cannot drive anything:** all 30 rows are tier_three, so plan_tier has no variance.
REDEMPTION SECTION — WEEKLY REWARDS REPORT Data through the last completed month: August 2026 (2026-08) Scope note: the file spans 2026-01-01 to 2026-08-31 (378 rows, no September records present, no duplicate redemption_ids). So "YTD through the last completed month" = the entire file. Last completed month = August 2026. HEADLINE (2026-01-01 → 2026-08-31) | Metric | Value | |---|---| | Redemption count | 378 | | Spend | $27,846.00 | | Unique redeemers | 235 | | Redemptions per redeemer | 1.61 | Arithmetic: 378 ÷ 235 = 1.6085 → 1.61. Average redemption value = $27,846.00 ÷ 378 = $73.67. PROVIDER MIX (% OF SPEND) | Provider | Count | Spend | % of spend | |---|---|---|---| | custom | 37 | $10,873.00 | 39.05% | | Tremendous | 192 | $8,505.00 | 30.54% | | Snappy | 59 | $5,238.00 | 18.81% | | TangoCard | 90 | $3,230.00 | 11.60% | | Total | 378 | $27,846.00 | 100.00% | Arithmetic: custom 10,873 ÷ 27,846 = 39.0469%; Tremendous 8,505 ÷ 27,846 = 30.5430%; Snappy 5,238 ÷ 27,846 = 18.8106%; TangoCard 3,230 ÷ 27,846 = 11.5995%. Rounded shares sum to exactly 100.00% (no plug needed). Flag: "custom" is a catch-all label in the source file, not a named fulfillment vendor. It carries the highest spend but the fewest redemptions (37), so average custom value is $293.86 vs. $44.30 for Tremendous and $35.89 for TangoCard. Treat the 39.05% top-line as a data-granularity caveat, not a vendor finding. TOP 5 COUNTRIES BY REDEMPTIONS | Rank | Country | Count | % of count | Spend | % of spend | |---|---|---|---|---|---| | 1 | US | 244 | 64.55% | $18,547.00 | 66.61% | | 2 | CA | 24 | 6.35% | $2,286.00 | 8.21% | | 3 | AU | 21 | 5.56% | $1,606.00 | 5.77% | | 4 | GB | 17 | 4.50% | $944.00 | 3.39% | | 5 | NL | 17 | 4.50% | $1,122.00 | 4.03% | GB and NL tie at 17 redemptions each — ranked here alphabetically; NL carries more spend ($1,122 vs. $944), so on a spend basis NL is 4th and GB 5th. Next country outside the top 5 is SG at 12. The 12 countries in the file account for all 378 redemptions. MONTHLY TREND (context for the weekly rollup) | Month | Count | Spend | Redeemers | Per redeemer | |---|---|---|---|---| | 2026-01 | 45 | $3,932.00 | 42 | 1.07 | | 2026-02 | 36 | $2,731.00 | 35 | 1.03 | | 2026-03 | 50 | $2,918.00 | 44 | 1.14 | | 2026-04 | 52 | $3,876.00 | 51 | 1.02 | | 2026-05 | 43 | $2,825.00 | 42 | 1.02 | | 2026-06 | 46 | $2,773.00 | 42 | 1.10 | | 2026-07 | 58 | $5,255.00 | 52 | 1.12 | | 2026-08 | 48 | $3,536.00 | 46 | 1.04 | Monthly counts sum to 378 and monthly spend to $27,846.00, reconciling to the headline. Monthly redeemer columns sum to 354, below 378, because redeemers recur across months — the 235 unique figure is a de-duplicated count over the full period, not a sum of months. July is the peak on both count (58) and spend ($5,255.00); August pulls back to 48 redemptions and $3,536.00, still above the eight-month monthly average of $3,480.75 ($27,846 ÷ 8). WHAT'S MISSING FROM THIS DATA No reward catalog, gift-card face value, or points-cost column, so this section cannot report reward type or points redeemed. No active-user or headcount denominator, so redemption penetration (% of eligible users redeeming) is not computable — 235 is a count of distinct user_keys appearing in the file, not a rate against a base. No cost/currency-conversion column beyond amount_usd, so all figures are USD as given. Company_alias is present but not requested here; note that user_keys are not unique to one company alias in this file, so per-company redeemer counts would not sum to 235.
## 1. Eligibility gate applied The rules file gives three conditions and no stated connector, so I apply them as a conjunction (an account must satisfy R1 AND R2 AND R3 to be offer-eligible). Flagging that as an assumption. - R1: health_score < 60 - R2: churn_save_eligible_amount > 0 - R3: renewal_date within 120 days of snapshot 2026-09-05 → cutoff = 2026-09-05 + 120d = **2027-01-03** (Sep 5 →Sep 30 = 25d, →Oct 31 = 56d, →Nov 30 = 86d, →Dec 31 = 117d, +3 = 120d) 30 accounts in file. 15 fail R1 (health ≥ 62). Of the 15 that pass R1, 5 fail R2 (amount = 0.00) and 2 fail R3 (renewal past 2027-01-03). **8 qualify.** ## 2. Qualifying accounts — amount at stake and play Ordered by urgency (days from snapshot to renewal). ``` account health renewal days ARR save_pool pool%ARR util (used/seats) champ usage PLAY C-0B0F1BAB 38 2026-09-23 18 15,391.00 5,494.00 35.7% 65.6% (238/363) no flat Executive touch C-0E9C27D1 39 2026-09-24 19 75,093.00 41,235.00 54.9% 85.4% (134/157) yes flat Commercial concession C-0F6C0F34 51 2026-10-03 28 86,741.00 49,707.00 57.3% 78.0% (308/395) no growing Executive touch C-0B360C78 57 2026-10-28 53 60,427.00 35,748.00 59.2% 75.2% (246/327) yes growing Commercial concession C-0D3278C7 54 2026-11-12 68 33,815.00 17,602.00 52.1% 33.2% (126/380) yes declining Usage revival C-0B827671 56 2026-11-14 70 72,088.00 25,365.00 35.2% 55.9% (113/202) yes declining Usage revival C-0CEF69FD 53 2026-11-21 77 79,324.00 32,621.00 41.1% 71.3% (97/136) no growing Executive touch C-0CA21961 58 2026-12-28 114 31,501.00 16,829.00 53.4% 25.8% (84/325) yes flat Usage revival ``` Totals (arithmetic): - Save pool: 5,494 + 41,235 + 49,707 + 35,748 + 17,602 + 25,365 + 32,621 + 16,829 = **$224,601.00** - ARR behind it: 15,391 + 75,093 + 86,741 + 60,427 + 33,815 + 72,088 + 79,324 + 31,501 = **$454,380.00** - Pool as share of ARR: 224,601 / 454,380 = 49.4% Rollup by play: ``` Play accts save pool ARR share of pool Usage revival 3 59,796.00 137,404.00 26.6% Executive touch 3 87,822.00 181,456.00 39.1% Commercial concession 2 76,983.00 135,520.00 34.3% TOTAL 8 224,601.00 454,380.00 100.0% ``` (59,796 + 87,822 + 76,983 = 224,601 ✓) ## 3. Play assignment — logic and per-account signal Important caveat: eligibility_rules.csv defines only who qualifies. **Nothing in the provided data specifies how to pick a play**, so the mapping below is my own cascade, stated openly so you can overrule it. Applied in priority order, first match wins: 1. **Usage revival** if usage_trend_3m = declining OR seat utilization < 50% — the product isn't being consumed, so the fix is adoption, not price. 2. **Executive touch** if champion_active = false (and step 1 didn't fire) — consumption is fine but there is no internal sponsor; the gap is relationship, and a discount spent there buys nothing. 3. **Commercial concession** otherwise — usage is sound and a champion exists, so value is proven and the only remaining lever is terms; these accounts also carry the deepest approved pools (54.9% and 59.2% of ARR). Per-account justification, citing the signal: - **C-0D3278C7 → Usage revival.** usage_trend_3m = declining, and 126/380 seats used = 33.2%. Both triggers fire; 254 licensed seats idle. - **C-0B827671 → Usage revival.** declining, 113/202 = 55.9%. Trend is the trigger (utilization is above 50%, so it is the direction of travel, not the level, that marks this one). - **C-0CA21961 → Usage revival.** flat trend but 84/325 = 25.8% — the worst utilization in the qualifying set, 241 seats idle on a $31,501 book. - **C-0F6C0F34 → Executive touch.** champion_active = false against growing usage and 78.0% utilization. Largest single pool ($49,707) and largest ARR ($86,741) in the set — highest-value relationship gap. - **C-0B0F1BAB → Executive touch.** champion_active = false, flat usage, 65.6% utilization. Worst health score in the set (38) and the shortest runway (18 days) — no sponsor and no time to build one. - **C-0CEF69FD → Executive touch.** champion_active = false, growing, 71.3%. - **C-0E9C27D1 → Commercial concession.** 134/157 = 85.4% (highest utilization in the file), flat trend, champion active, $41,235 pool = 54.9% of ARR, renewal in 19 days. Consumption is saturated; a terms lever is the only thing left, and the clock forces it now. - **C-0B360C78 → Commercial concession.** 246/327 = 75.2%, growing, champion active, deepest pool ratio at 59.2% of ARR. ## 4. Looks at risk but does not qualify Failed R2 — health < 60 but churn_save_eligible_amount = 0.00 (no approved pool to draw on): ``` account health ARR renewal days usage util champ failed rule C-0BC71BDD 55 54,515.00 2026-10-27 52 flat 29.9% (59/197) no R2 (amount = 0) C-0BE96399 54 52,319.00 2026-10-29 54 declining 27.9% (43/154) yes R2 C-10A56B0F 54 25,717.00 2026-12-12 98 declining 48.3% (85/176) no R2 C-0F6694C3 43 11,243.00 2027-03-21 197 declining 40.6% (39/96) yes R2 (+ R3) C-0FCCD2DF 43 65,957.00 2027-04-23 230 flat 42.9% (27/63) no R2 (+ R3) ``` Combined ARR sitting behind these five: 54,515 + 52,319 + 25,717 + 11,243 + 65,957 = **$209,751.00** with zero approved save dollars. C-0BC71BDD and C-0BE96399 renew inside 54 days with sub-30% utilization — that is the sharpest exposure in the file and it is unfunded. The data does not say whether their $0.00 means the pool was exhausted, never approved, or is a null; that distinction is not recoverable from these two files. Failed R3 only — health < 60 and a funded pool, but renewal outside the 120-day window: ``` account health ARR save pool renewal days reason C-0F876796 47 49,895.00 19,958.00 2027-02-06 154 R3: 34 days past cutoff C-0BA71F12 52 17,061.00 6,824.00 2027-04-11 218 R3: 98 days past cutoff ``` These are the natural next-wave candidates — $26,782.00 of funded pool (19,958 + 6,824) that R3 alone is holding back. Failed R1 — the remaining 15 accounts (health 62–88). None of them show declining usage, so none even present as at-risk on a second signal. Worth naming the near-misses rather than the whole list: C-0FC7A215 (62), C-0B843542 (63), C-21FEBCBB (65) sit within 5 points of the R1 line, all growing, all with champions. ## 5. Data caveats you should know before acting - **Snapshot vs. wall clock.** R3 is anchored to 2026-09-05. Measured against today (2026-09-25), the two most urgent qualifying renewals — C-0B0F1BAB (2026-09-23) and C-0E9C27D1 (2026-09-24) — have already passed. They qualify on the documented rule but their real status needs verification before anyone spends against them. Together they carry $46,729.00 of the $224,601.00 pool (20.8%). - **No play definitions in source.** Section 3's cascade is mine, not documented. If Bonusly has a written play-selection policy, it wasn't supplied and it should override this. - **No price/objection data.** Commercial concession is inferred from saturated usage, not from any recorded pricing objection. Nothing in these files confirms price is the actual sticking point for C-0E9C27D1 or C-0B360C78. - **Single usage dimension.** usage_trend_3m and seat counts are all the consumption signal available. No depth, feature-adoption, or last-login data, so "usage revival" can't be narrowed to which behavior to restore. - **Rules connector assumed as AND.** If R3 is meant as a filter on a subset rather than a hard gate, the eligible set grows to 10 accounts and $251,383.00 of pool (224,601 + 19,958 + 6,824).
SEAT COVERAGE (licensed vs headcount) - Licensed seats 150 of 400 headcount = 37.5% of employees are licensed. - Of the 150 licensed seats, 126 are active (Aug 2026) = 84.0% license utilization (126 ÷ 150). - 24 paid seats are unused; 274 employees have no seat at all (400 − 126). USAGE HEALTH (two lines) - Active users rose every month, 88 (Mar) → 126 (Aug): +38 users, +43.2% in five months, averaging +7.6 users/month — and at that pace they exhaust the 150-seat license in roughly October 2026 ((150−126) ÷ 7.6 ≈ 3.2 months). - Adoption among licensed users is strong and accelerating (84% utilization), so this is a capacity problem, not an engagement problem. HEADROOM AT CURRENT PER-SEAT RATE - Per-seat rate: $9,000 ÷ 150 = $60/seat/year. - Seats to full headcount: 400 − 150 = 250 new seats → 250 × $60 = $15,000 incremental ARR. - Total ARR at full headcount coverage: 400 × $60 = $24,000 (vs $9,000 today). - Near-term floor: even filling only the 24 already-paid idle seats is worth $1,440 of realized value; the realistic next ask is the 250-seat expansion to $15,000 new ARR. WHO REPLIED / BUYING POWER - Replier: Maria S., People Operations Coordinator (contacts file + reply header, engaged 2026-09-02). She states explicitly she is not the purchaser — no budget or seat authority. Champion, not buyer. - Buyer: Dana R., VP People — named in the reply as owning budget and seat expansion, present in our contacts, and per Maria "asking about our usage numbers lately." Caveat: Dana's last engagement with us was 2026-05-18 (>3 months stale). Sam K. (Office Manager, last engaged 2025-11-03) is not relevant here. - Path: warm intro from Maria → Dana. Do not route the ask through Maria. REPLY EMAIL (137 words) Subject: RE: Growing your team's recognition program Hi Maria, Great to hear the feed stays busy — the numbers back it up. Your monthly active users have grown every month since March, from 88 to 126. That's a 43% rise, and it puts you on 126 of your 150 licenses, so at the current pace you'll run out of seats within a few months. An intro to Dana would genuinely help, thank you. To make it easy, I can send a short one-pager with your usage trend and what full-team coverage (all 400 employees) would look like — no call required unless Dana wants one. Would you be comfortable sharing that with her, or connecting us directly? Either way, thanks for the kind words about the team's experience. Best, Cole Data note: all figures come from the three files provided; no external data used. Dana R.'s contact details were redacted/not supplied, so the email routes through Maria.
CSM PREP — Account C-0D284E42 (signup 2026-08-11) DATA CAVEAT FIRST: the usage feed ends 2026-09-04 and the account fields carry no updates after 2026-08-15. Today is 2026-09-25, so roughly the last three weeks are unobserved. Everything below describes state as of the data provided, not as of today. COMPLETE (each backed by a populated field) - Slack integration connected: 2026-08-12 (1 day after signup) - Allowance set: 2026-08-13 (day 3) - Admins added: 2 (field value = 2) - First recognition sent: 2026-08-15 14:22 (day 5) NOT COMPLETE (field present but empty — no evidence of occurrence) - HRIS integration: blank. Never connected in the data. - First redemption: blank. Zero redemptions recorded, despite recognition starting 2026-08-15. NOT IN THE DATA AT ALL (cannot mark either way) - Anything after 2026-09-04 (usage) / 2026-08-15 (account fields): whether HRIS or redemption happened since, current activity level, admin count changes. - Total seats / employee count — so we cannot compute giver penetration. - Recipient counts, recognition volume, point balances, redemption eligibility. EARLY ENGAGEMENT SIGNALS (onboarding_usage.csv, 2026-08-11 → 2026-09-04, 25 days) - Active givers rose 3 → 15 over the period (15 ÷ 3 = 5.0×). - Weekly means: - Aug 11–17: (3+3+4+4+5+4+7) = 30 ÷ 7 = 4.3/day - Aug 18–24: (5+7+6+9+8+9+9) = 53 ÷ 7 = 7.6/day - Aug 25–31: (9+9+11+10+10+11+13) = 73 ÷ 7 = 10.4/day - Sep 1–4 (partial, 4 days): (13+13+15+15) = 56 ÷ 4 = 14.0/day - Every week's mean exceeds the prior one (+77%, +37%, +35% week-over-week); no down-week, no plateau in the observed window. Total giver-days = 30+53+73+56 = 212. - Counter-signal: giving grew but redeeming stayed at zero through 2026-09-04 — the loop is one-sided so far. THREE THINGS TO COVER ON THE CALL 1. HRIS connection — the only unfinished setup item. Agree on owner and a date; explain what it unlocks (org sync, new-hire auto-add, accurate targeting) given the team is growing fast. 2. Zero redemptions — walk the rewards catalog live, identify why nobody has redeemed yet (catalog not configured? shipping/eligibility? awareness?), and set a first-redemption milestone. Recognition habit exists since 08-15; the payoff side hasn't landed. 3. Restart the clock on usage — data stops at 09-04 at 15 active givers. Confirm current activity, and since total seats are unknown, establish a target giver count so "healthy" can actually be measured going forward.
All figures below recomputed from the three files; coverage checks pass (20 aliases in each, identical sets, 12 usage months each).
```
90-DAY RENEWAL RISK BRIEF
As of : 2026-09-25
Window : 2026-09-25 -> 2026-12-24 (as_of + 90 days)
Book : 20 accounts, $1,048,715.00 ARR
Sources : churnzero_renewals.csv (ARR, CSM, seats), chargebee_terms.csv (term, multi-year),
usage_12m.csv (monthly active users 2025-09 .. 2026-08)
```
## 1. Which system to trust, per account
Rule applied: **ChurnZero is known-wrong on multi-year contracts, so `is_multi_year=true` ⇒ trust Chargebee. Where the contract is 12 months, ChurnZero has no known defect and the two systems agree to the day, so either is fine.**
The split is perfectly clean — no judgment calls needed:
```
5 accounts disagree -> all 5 are is_multi_year=true -> Chargebee date used
15 accounts agree -> all 15 are 12-month contracts -> date confirmed by both
```
Every disagreement is one of two ChurnZero failure modes, both consistent with a multi-year term being mishandled:
- **Clamped to 2026-09-10** (C-0B7D2C30, C-0D2AB865, C-0F5D2323) — ChurnZero reports the same floor date for all three regardless of the real term date, 5 to 19 days early.
- **Pushed a full year late** (C-0BCDB8C2 → 2027-09-18, C-0BBE3E60 → 2027-09-26) — delta exactly +365 days. These are the dangerous ones: on ChurnZero alone, $85,420 of ARR would have vanished from this brief while actually renewing this month.
Detail in section 4.
## 2. Renewal register (ordered by date used)
Seat util = `seats_used / seats` (ChurnZero). Act/seats = `Aug-2026 actives / seats`. 3m trend = trailing quarter (Jun-Jul-Aug 2026) average vs prior quarter (Mar-Apr-May 2026) average.
```
alias CSM ARR date used src util act act/st 3m 12m risk
-- PAST DUE (date already passed at as-of) -------------------------------------------------
C-0B7D2C30 Dana Mercer 65,901 2026-09-15 CB 57.6% 84 17.6% -18.2% -45.8% HIGH
C-0BCDB8C2 Cole Ingram 54,427 2026-09-18 CB 54.7% 110 25.9% -17.6% -45.0% HIGH
C-0D2AB865 Elena Sinclair 38,022 2026-09-22 CB 61.4% 109 26.8% -18.9% -45.2% HIGH
-- IN WINDOW ------------------------------------------------------------------------------
C-0BBE3E60 Dana Mercer 30,993 2026-09-26 CB 64.9% 33 28.9% -19.5% -47.6% HIGH
C-0F5D2323 Cole Ingram 90,647 2026-09-29 CB 28.5% 18 4.6% +3.5% -14.3% HIGH
C-0EC6999D Elena Sinclair 79,419 2026-10-03 both 27.7% 15 13.4% +6.7% +0.0% HIGH
C-0B20DB64 Dana Mercer 21,770 2026-10-07 both 56.6% 294 77.8% +0.1% +0.3% MED
C-0BBC4E7A Cole Ingram 56,374 2026-10-10 both 67.7% 139 41.2% -0.9% -2.1% MED
C-0FD551AB Elena Sinclair 48,815 2026-10-14 both 55.9% 126 33.5% -1.6% +1.6% MED
C-0F9F8F13 Dana Mercer 46,230 2026-10-18 both 56.5% 182 51.7% +0.2% +0.0% MED
C-0BC34584 Cole Ingram 16,740 2026-10-22 both 66.2% 106 21.5% +1.0% +2.9% HIGH
C-0B7A7546 Elena Sinclair 35,062 2026-10-25 both 88.8% 63 30.7% +4.3% +8.6% MED
C-0B369871 Dana Mercer 85,128 2026-10-29 both 75.1% 333 78.9% +4.3% +15.2% LOW
C-0B144C78 Cole Ingram 30,899 2026-11-02 both 75.4% 106 47.3% +3.0% +17.8% MED
C-0FC4DBB8 Elena Sinclair 94,732 2026-11-05 both 76.7% 193 41.6% +4.2% +14.9% MED
C-0D5BBE3A Dana Mercer 39,740 2026-11-09 both 83.3% 91 89.2% +3.9% +19.7% LOW
C-0FB9D5AF Cole Ingram 63,158 2026-11-13 both 72.4% 176 88.4% +4.6% +14.3% LOW
C-0B344485 Elena Sinclair 64,384 2026-11-16 both 78.0% 244 85.0% +4.2% +15.6% LOW
C-0CB2C1B4 Dana Mercer 40,628 2026-11-20 both 81.6% 49 10.4% -2.0% +14.0% HIGH
C-22170CA1 Cole Ingram 45,646 2026-11-24 both 85.4% 146 49.7% +2.6% +12.3% MED
```
Risk rubric (thresholds set before looking at outcomes; no churn data was supplied, so nothing is calibrated against actuals):
- **HIGH** — 3m trend ≤ -10%, **or** August actives < 30% of seats.
- **LOW** — 3m trend ≥ +2% **and** actives ≥ 60% of seats.
- **MED** — everything else (growing but under-deployed, or flat-but-well-deployed).
### Evidence, one line each
**Past due — escalate today ($158,350, all HIGH)**
- **C-0B7D2C30** (Dana Mercer, $65,901, 9/15): 10 days past its renewal date with actives down 155→84 (-45.8% over 12 months) and only 84 of 476 seats active.
- **C-0BCDB8C2** (Cole Ingram, $54,427, 9/18): 7 days past due and invisible in ChurnZero, which shows 2027-09-18; actives 200→110 (-45.0%), 25.9% of seats active.
- **C-0D2AB865** (Elena Sinclair, $38,022, 9/22): 3 days past due, actives 199→109 (-45.2%), the steepest 3-month slide after C-0BBE3E60 at -18.9%.
**In window**
- **C-0BBE3E60** (Dana Mercer, $30,993, 9/26 — 1 day out): worst trajectory in the book, -19.5% 3m and -47.6% 12m (63→33), 28.9% of seats active.
- **C-0F5D2323** (Cole Ingram, $90,647, 9/29): largest single renewal in the register; usage is flat but negligible — 18 actives against 390 seats (4.6%), the worst adoption anywhere on this list.
- **C-0EC6999D** (Elena Sinclair, $79,419, 10/03): 12 months of zero net movement (15→15, +0.0%) at 13.4% seat activity — no usage story to defend the price with.
- **C-0B20DB64** (Dana Mercer, $21,770, 10/07): dead-flat 293–298 actives all year at 77.8% deployment, and August actives (294) exceed licensed `seats_used` (214) — a true-up/expansion candidate held at MED only because the 3-month trend is +0.1%.
- **C-0BBC4E7A** (Cole Ingram, $56,374, 10/10): flat-to-drifting (142→139, -0.9% 3m) with 198 of 337 seats idle (41.2% active).
- **C-0FD551AB** (Elena Sinclair, $48,815, 10/14): no momentum in either direction (124→126, -1.6% 3m) at 33.5% seat activity.
- **C-0F9F8F13** (Dana Mercer, $46,230, 10/18): perfectly stable 181–185 all year at 51.7% activity — safe-looking but with no growth evidence to justify holding price.
- **C-0BC34584** (Cole Ingram, $16,740, 10/22): flat usage (103→106) sits on 494 seats, so 388 are idle — a $16.7k contract carrying 21.5% adoption is classic downgrade-or-churn exposure despite the small ARR.
- **C-0B7A7546** (Elena Sinclair, $35,062, 10/25): growing (+4.3% 3m, +8.6% 12m) and the highest stated seat utilization on the list at 88.8%, but August actives are only 30.7% of 205 seats — the two measures contradict each other, so MED pending reconciliation.
- **C-0B369871** (Dana Mercer, $85,128, 10/29): strongest large account, 289→333 actives (+15.2% 12m, +4.3% 3m) at 78.9% seat activity.
- **C-0B144C78** (Cole Ingram, $30,899, 11/02): healthy +17.8% 12m growth, but off a small base with only 106 of 224 seats active (47.3%).
- **C-0FC4DBB8** (Elena Sinclair, $94,732, 11/05): biggest renewal in the window and growing +14.9% 12m, yet 271 of 464 seats are idle (41.6% active) — growth is not reaching the licensed base.
- **C-0D5BBE3A** (Dana Mercer, $39,740, 11/09): +19.7% 12m growth with 91 of 102 seats active (89.2%) — the healthiest account in the book.
- **C-0FB9D5AF** (Cole Ingram, $63,158, 11/13): +14.3% 12m and near-full deployment at 88.4% (176 of 199 seats).
- **C-0B344485** (Elena Sinclair, $64,384, 11/16): steady uninterrupted climb 211→244 (+15.6% 12m) at 85.0% seat activity.
- **C-0CB2C1B4** (Dana Mercer, $40,628, 11/20): 81.6% stated seat utilization hides the real problem — 49 August actives against 473 seats (10.4%) and a negative 3-month trend (-2.0%), so the two signals point opposite ways and usage wins.
- **C-22170CA1** (Cole Ingram, $45,646, 11/24): growing +12.3% 12m but only 146 of 294 seats active (49.7%).
## 3. Flagged disagreements (all 5)
```
alias ARR term ChurnZero Chargebee CZ-CB failure mode
C-0B7D2C30 65,901 36m 2026-09-10 2026-09-15 -5 days clamped to floor date
C-0BCDB8C2 54,427 36m 2027-09-18 2026-09-18 +365 days pushed a full year late
C-0D2AB865 38,022 24m 2026-09-10 2026-09-22 -12 days clamped to floor date
C-0BBE3E60 30,993 24m 2027-09-26 2026-09-26 +365 days pushed a full year late
C-0F5D2323 90,647 24m 2026-09-10 2026-09-29 -19 days clamped to floor date
---------
279,990 100% of the multi-year book disagrees; 0 of 15 single-year accounts disagree
```
Why this matters, not just cosmetic:
- Under ChurnZero, **$85,420** (C-0BCDB8C2 + C-0BBE3E60) would fall outside a 90-day window entirely — both renew in September 2026, not 2027.
- Under ChurnZero, **$194,570** (C-0B7D2C30 + C-0D2AB865 + C-0F5D2323) would appear already lapsed on 9/10, mis-scheduling outreach up to 19 days early and, worse, marking a live 9/29 renewal as lost.
- Net effect: the single largest renewal in the register (C-0F5D2323, $90,647) is misdated in ChurnZero. Every account that disagrees is HIGH risk, so the disagreement sits on 100% of the top of the risk list.
## 4. Totals
```
Total ARR in book (20 accounts) 1,048,715.00
past-due at as-of (3 accounts, 9/15-9/22) 158,350.00
renewing inside 2026-09-25 .. 2026-12-24 (17) 890,365.00
ARR at risk — HIGH (8 accounts) 416,777.00 = 39.7% of book
of which past-due 158,350.00
of which in-window 258,427.00
ARR watch — MED (8 accounts) 379,528.00 = 36.2% of book
HIGH + MED combined 796,305.00 = 75.9% of book
ARR healthy — LOW (4 accounts) 252,410.00 = 24.1% of book
```
Arithmetic for the headline number: 65,901 + 54,427 + 38,022 + 30,993 + 90,647 + 79,419 + 16,740 + 40,628 = **416,777.00**. Cross-check: 416,777 + 379,528 + 252,410 = 1,048,715 = book total.
By CSM (HIGH / MED / LOW sums reconcile to each total):
```
Dana Mercer 7 accts 330,390.00 HIGH 137,522 MED 68,000 LOW 124,868
Cole Ingram 7 accts 357,891.00 HIGH 161,814 MED 132,919 LOW 63,158
Elena Sinclair 6 accts 360,434.00 HIGH 117,441 MED 178,609 LOW 64,384
-------- -------- --------
416,777 379,528 252,410
```
Concentration: all 5 multi-year accounts are HIGH, and they are 279,990 of the 416,777 at-risk ARR (**67.2%**) — the renewal-date defect and the risk list are the same five names. Cole Ingram carries the most at-risk dollars (161,814) and owns both of the largest HIGH renewals in the window (C-0F5D2323 $90,647 on 9/29, C-0BC34584 on 10/22).
## 5. Data caveats — what this brief cannot tell you
- **`seats_used` and monthly actives are not the same measure** and disagree badly on 16 of 20 accounts. Example: C-0CB2C1B4 shows 386 `seats_used` of 473 (81.6%) but 49 August actives (10.4%); C-0BC34584 shows 327 vs 106. I treated August actives as the behavioral signal and `seats_used` as a licensing/provisioning figure, and I let actives drive the risk rating. If ChurnZero's `seats_used` is actually "seats ever activated," the utilization column is misleading and C-0B7A7546 and C-0CB2C1B4 in particular need a definitional answer before you act.
- **No churn or renewal-outcome history was provided**, so the risk thresholds are asserted, not validated. Nothing here is a probability.
- **Usage ends 2026-08.** September actives are unknown, so every 3-month trend is 4–8 weeks stale and the four late-September renewals (C-0BBE3E60, C-0F5D2323 especially) are being scored on data that predates them by up to a month.
- **No contract value, discount, payment-term, or support-ticket data.** C-0B20DB64 is running 294 actives against 214 licensed seats — that is either a billing exposure or a data error, and these files cannot distinguish the two.
- **Company names are absent.** Only `account_alias` values exist in the source, so they are cited as-is; no company identity has been inferred.
- **Three renewal dates are already past** as of 2026-09-25. Whether they renewed, extended, or lapsed is not in any of these files — they are carried as past-due, not as lost.
80 tickets, 80 unique IDs, 24 distinct accounts, 2026-06-01 → 2026-08-29. Sum of ARR across the 24 accounts = $284,800. Every account maps to exactly one theme (no account appears in two), so theme ARR sums cleanly to $284,800.
Method: clustered on body_text (19 distinct strings → 5 clusters), ignored the tag column. Tags are uninformative — all 5 themes span all 6 tag values. Worst case: the points-delivery cluster carries "billing" on 6 of 20 tickets, while the actual billing cluster is tagged "billing" on only 3 of 16.
ARR below is de-duplicated per account (an account's ARR counted once, however many tickets it filed). Ticket-weighted gross is shown in parentheses because it measures escalation intensity, not exposure.
RANKED BY ARR EXPOSURE
1) HRIS provisioning failure — new hires not created
Count 12 (12/80 = 15.0%) | Distinct accounts 3 | ARR $114,000 (40.0% of $284,800) | gross $456,000
Accounts: C-0B2213A9 $36,000 (7 tickets), C-0DDFC9A7 $48,000 (3), C-0F6C0F34 $30,000 (2). Check: 36,000+48,000+30,000 = 114,000.
Tickets: IC-460060, IC-460059
Broad pattern, not noise: all three are top-tier accounts, 3 of 3 affected accounts in the dataset's high-ARR band, tickets spread across all three months (Jun 4 / Jul 5 / Aug 3) with no resolution signal in the text. This is the only cluster where a ticket states a quantified impact — "HRIS sync skipped 12 new hires; provisioning log shows no errors" (cited by C-0DDFC9A7 and C-0F6C0F34) — and the silent-success failure mode means the customer discovers it, not us.
Recommendation: Treat as a P1 reliability defect on the provisioning path, not a support queue: build a per-account new-hire reconciliation report (HRIS feed vs. created accounts) so a silent skip is caught before the customer counts heads.
2) Redemption / gift-card fulfillment failure
Count 18 (22.5%) | Distinct accounts 7 | ARR $68,800 (24.2%) | gross $177,300
Accounts: C-0B827671 $10,700 (4), C-14264ABD $11,000 (3), C-0FCCD2DF $9,600 (3), C-0CEF69FD $8,900 (3), C-0F876796 $8,700 (3), C-0D9CA315 $9,600 (1), C-0B0F1BAB $10,300 (1). Check: 10,700+11,000+9,600+8,900+8,700+9,600+10,300 = 68,800.
Tickets: IC-460038, IC-460030
Broad pattern: second-widest account spread (7 of 24) and the only cluster with a clean upward slope — Jun 4 → Jul 6 → Aug 8. Two failure modes coexist in the same cluster: checkout hangs ("Checkout spins forever"), and points debited without delivery ("Gift card order errored out but the points were still deducted"), the latter being a direct money-loss claim.
Recommendation: Prioritize the debit-without-fulfillment path for automatic reversal/refund on vendor failure, and instrument the gift-card vendor callback — the rising trend is consistent with a third-party fulfillment dependency degrading rather than a UI bug.
3) Invoice / renewal billing errors
Count 16 (20.0%) | Distinct accounts 1 | ARR $52,000 (18.3%) | gross $832,000
Account: C-0E9C27D1 $52,000 — 16 tickets, all 16. Check: 52,000 × 1 = 52,000; gross 16 × 52,000 = 832,000, i.e. 16× the account's ARR in ticket volume.
Tickets: IC-460071, IC-460080
Single-account, but explicitly not noise. It is the largest ARR in the file, 20% of all ticket volume from one logo, and it recurs across all three months (Jun 6 / Jul 3 / Aug 7) with four distinct phrasings of the same unresolved dispute: seat count never approved, 200 billed vs. 150 licensed, wrong tier price at annual renewal, and "Third invoice in a row with the same seat-count error" — the customer is telling us two prior bad invoices predate this window.
Recommendation: Escalate to a named account owner for a human-led credit-and-correct pass plus a contract-vs-invoice seat reconciliation before the next renewal; a systemic fix here protects one $52,000 account, but the retention risk is the reason it ranks third rather than fifth.
4) Points not crediting after recognition
Count 20 (25.0%) | Distinct accounts 9 | ARR $31,100 (10.9%) | gross $70,200
Accounts (9): C-0D3278C7 $3,500 (3), C-0BE96399 $2,700 (3), C-0D284E42 $3,400 (3), C-0D6CC8E3 $4,200 (3), C-0BF20542 $4,500 (2), C-0D0B047C $4,500 (2), C-0DD0626C $2,500 (2), C-21FEBCBB $2,900 (1), C-0B2895EF $2,900 (1). Check: 3,500+2,700+3,400+4,200+4,500+4,500+2,500+2,900+2,900 = 31,100.
Tickets: IC-460001, IC-460016
Broadest pattern in the file — most tickets (20) and most accounts (9 of 24, 37.5%) — but the lowest-ARR cohort ($2,500–$4,500, mean $3,456). Volume is declining: Jun 8 → Jul 8 → Aug 4. Repeated "after the weekend" phrasing in 5 tickets points at a batch/async job rather than per-event writes.
Recommendation: Fix for confidence, not for ARR: this is the core value loop of the product failing visibly for over a third of customers, so publish a balance-reconciliation/backfill job and a self-serve "points pending" status rather than routing it as individual billing tickets.
5) Slack integration disconnects and command failures
Count 14 (17.5%) | Distinct accounts 4 | ARR $18,900 (6.6%) | gross $63,400
Accounts: C-0BA71F12 $3,900 (6), C-10A56B0F $5,400 (4), C-0B843542 $4,400 (3), C-8C2E8F00 $5,200 (1). Check: 3,900+5,400+4,400+5,200 = 18,900.
Tickets: IC-460047, IC-460051
Narrow and low-dollar: 4 accounts, all under $5,400, flat volume (Jun 4 / Jul 6 / Aug 4). Two mechanisms appear — auth/token not persisting ("re-auth does not stick", "sync toggle resets itself", 6 tickets) and runtime failures ("slash command returns an error for everyone on our team", 5). Concentrated in C-0BA71F12, which filed 6 of 14.
Recommendation: Lowest priority of the five for engineering investment; run one token-persistence/auth-refresh fix and re-auth outreach to the four affected accounts, and don't staff a queue around it.
WHAT THE RANKING SHOWS
Volume rank (points → redeem → billing → slack → hris) is almost the inverse of ARR rank (hris → redeem → billing → points → slack). Ranking on ticket count would have put points first and HRIS last — a 3.7× inversion in exposure ($114,000 vs. $31,100). The two highest-ARR themes (HRIS + billing = $166,000, 58.3% of exposure) come from only 4 distinct accounts; the two highest-volume themes (points + slack = 34 tickets, 42.5%) come from 13 accounts worth $50,000 combined (17.6%).
DATA GAPS — stated, not filled
- No resolution, status, assignee, or closed_at field. Every "still open / recurring" read above is inferred from repeat tickets and month spread, not from evidence of non-resolution.
- ARR is a static account-level value repeated on every ticket for that account. There is no per-ticket exposure and no renewal date, so renewal-risk timing (notably for C-0E9C27D1's "annual renewal") cannot be dated.
- No severity field. The tag column mixes taxonomy (bug/how-to/question/feedback/billing) with urgency (urgent), so "urgent" is not usable as a priority signal — it appears 2–6 times inside every theme.
- No product-area, plan, HRIS-vendor, or gift-card-vendor field, so the vendor-dependency hypothesis in theme 2 and the batch-job hypothesis in theme 4 are suggestions from text patterns, not confirmed causes.
- C-0E9C27D1 references invoices predating 2026-06-01 ("Third invoice in a row"); those two tickets are absent from this file, so its true volume exceeds 16.
- No churn, downgrade, or credit issued anywhere in the data. Nothing here supports a dollar-loss figure beyond the ARR-at-risk framing above.
Ranked shortlist (case-study customers only) Prospect C-82AF3719: Technology / Mid-Market / employee_recognition / NA-West Universe filter: 25 customers → 7 with has_case_study=true (C-11209339, C-9D69D147, C-11C31562, C-CD4829A7, C-0CE315B2, C-64171065, C-A13C193D). The other 18 are excluded regardless of fit. Scoring: 1 point per exact match on industry, size_band, use_case, region (max 4). 1. C-64171065 — 3/4 Matched: industry=Technology, size_band=Mid-Market, use_case=employee_recognition Missed: region (NA-East vs NA-West) Only case-study customer sharing the prospect's exact use case AND industry AND size band. 2. C-11C31562 — 3/4 Matched: size_band=Mid-Market, use_case=employee_recognition, region=NA-West Missed: industry (Manufacturing vs Technology) Closest vertical analogue: same use case, same size, same region. 3. C-A13C193D — 3/4 Matched: industry=Technology, size_band=Mid-Market, region=NA-West Missed: use_case (retention vs employee_recognition) Same vertical, size, and region; adjacent use case (retention is a recognition-adjacent program). Tie-break note (transparency): three customers score 3/4 — C-64171065, C-11C31562, C-A13C193D, and also C-CD4829A7 (Technology/Mid-Market/retention/NA-East). I ordered them by which field was missed, prioritizing use_case > industry > size_band > region for social-proof relevance: C-CD4829A7 has the same profile as C-A13C193D but sits in NA-East, so it drops to 4th. If you weight region above use case, the order becomes C-11C31562, C-A13C193D, C-64171065. Remaining case-study pool, for reference: C-9D69D147 (2/4: size_band, region), C-11209339 (0/4), C-0CE315B2 (0/4). No contact names, billing, or non-public identifiers included. All figures derived solely from the two supplied files; nothing outside them was assumed.
TRAILING 6 MONTHS = 2026-03 → 2026-08 (the only months present in channel_spend.csv; all 122 contact rows have sqm_date inside this window, so no rows were dropped for being out-of-range). Data integrity first: 122 contact rows, 122 unique contact_key, no duplicates. Every channel in contacts has a spend row or is explicitly unpaid. Two gaps worth naming before the numbers: paid_social has 6 months of spend and zero contact rows, and webinars has spend in 2026-08 but no SQM in that month (its last SQM is 2026-07-27). Neither is provably a real result from this data — see "Missing data" at the end. PAID CHANNELS ``` channel spend SQM SQO $/SQM $/SQO SQM→SQO pipeline pipe/$ paid_search $36,000 40 18 $900 $2,000 45.0% $720,000 20.00 linkedin_ads $24,000 25 8 $960 $3,000 32.0% $96,000 4.00 webinars $9,000 12 5 $750 $1,800 41.7% $60,000 6.67 paid_social $18,000 0 0 UNDEF UNDEF UNDEF $0 0.00 ──────────────────────────────────────────────────────────────────────────── paid total $87,000 77 31 $1,130 $2,806 40.3% $876,000 10.07 ``` Arithmetic: - paid_search: 6 × $6,000 = $36,000. $36,000/40 = $900/SQM. $36,000/18 = $2,000/SQO. 18/40 = 45.0%. 18 SQO × $40,000 = $720,000. $720,000/$36,000 = 20.00. - linkedin_ads: 6 × $4,000 = $24,000. $24,000/25 = $960. $24,000/8 = $3,000. 8/25 = 32.0%. 8 × $12,000 = $96,000. $96,000/$24,000 = 4.00. - webinars: 6 × $1,500 = $9,000. $9,000/12 = $750. $9,000/5 = $1,800. 5/12 = 41.7%. 5 × $12,000 = $60,000. $60,000/$9,000 = 6.67. - paid_social: 6 × $3,000 = $18,000. SQM = 0 → $/SQM, $/SQO, and SQM→SQO rate are UNDEFINED (division by zero), not zero. Pipeline $0 and pipe/$ 0.00 are real zeros, since the numerator is genuinely $0. - Blended: $87,000/77 = $1,129.87; $87,000/31 = $2,806.45; 31/77 = 40.3%; $876,000/$87,000 = 10.07. ORGANIC (and the other unpaid channel present) ``` channel SQM SQO SQO rate pipeline $/SQO-equivalent organic_search 30 10 33.3% $90,000 n/a — no spend row referral 15 6 40.0% $48,000 n/a — no spend row ``` - organic_search: 10/30 = 33.3%. 10 × $9,000 = $90,000. Every organic SQO carries exactly $9,000, so pipeline is uniform by construction. - referral: 6/15 = 40.0%, 6 × $8,000 = $48,000. Included because it is in the contacts file with no spend row — but it was not in your requested scope, and it has no spend baseline, so treat it as context, not a channel to optimize. - Combined unpaid: 45 SQM, 16 SQO, 35.6%, $138,000. SQO DATE PRECEDES SQM DATE — 2 rows, both linkedin_ads ``` CT-000044 sqm 2026-07-23 → sqo 2026-07-18 (−5 days) $12,000 CT-000041 sqm 2026-06-14 → sqo 2026-06-09 (−5 days) $12,000 ``` Both are exactly 5 days inverted, which points to a systematic field-mapping or timezone bug rather than two random typos. They are counted in the headline numbers above (flagged, not deleted) because deleting them silently would understate linkedin_ads. Sensitivity if you exclude them as unusable: linkedin_ads drops to 6/25 = 24.0% SQM→SQO, $4,000/SQO, $72,000 pipeline, 3.00 pipe/$. That moves linkedin_ads from clearly-worst to clearly-worse, and widens the gap to paid_search. No other channel has an inversion. paid_search lags are all positive (2–20 days); CT-000007 is same-day (2026-03-28 → 2026-03-28), which is legal but suspicious and worth a look. REALLOCATION RECOMMENDATION 1. Stop paid_social. $18,000 over six months for zero SQMs is the only unambiguous decision in this dataset. Even under the most charitable reading — attribution broke, not the channel — you are carrying $3,000/month of unverifiable spend. Cut to $0 or a $1,000/month diagnostic floor until tracking is confirmed. This is the highest-confidence action here. 2. Move the recovered budget to paid_search, not webinars. paid_search is the only channel where both denominator and unit economics are strong: cheapest SQM among the volume channels ($900), best conversion (45.0%), and $40,000 per SQO against $2,000 spent — 20× pipeline per dollar. Redirecting $12,000 of the $18,000 buys ~13 more SQMs → ~6 more SQOs → ~$240,000 incremental pipeline, roughly a third on top of the current $720,000. Keep $6,000 as a reserve against the caveats below rather than committing all $18,000 at once. 3. Hold webinars flat, do not scale. Best $/SQO ($1,800) and best $/SQM ($750) in the file, but on 12 SQMs and 5 SQOs, and it went quiet in August. It is the second-best destination, not the first — the arithmetic favors paid_search's $40,000 deal size, and webinars' efficiency is measured on a sample too small to trust. 4. Fix linkedin_ads or cut it. Worst pipe/$ of the three working paid channels (4.00 vs 20.00 for paid_search), and its two date anomalies are the reason its numbers are soft. Do not add budget here. Give it one quarter with the tracking bug fixed; if it stays near 3.00–4.00 pipe/$, reallocate. CONFIDENCE Low-to-moderate overall, and it is unevenly distributed. Roughly 12 SQMs per paid channel per month is thin. Wilson 95% intervals on the conversion rates show the problem directly: ``` paid_search 45.0% [30.7%, 60.2%] linkedin_ads 32.0% [17.2%, 51.6%] webinars 41.7% [19.3%, 68.0%] organic_search 33.3% [19.2%, 51.2%] referral 40.0% [19.8%, 64.3%] ``` paid_search and webinars overlap almost entirely — their 3.3-point gap is noise. linkedin_ads' interval overlaps everyone. So the ranking paid_search > webinars > linkedin_ads is NOT statistically established; what is established is that all three beat paid_social's zero. High confidence: cut paid_social (a null result on 6 full months of spend is decisive regardless of sample size), and treat the two linkedin_ads inversions as a real defect. Moderate confidence: paid_search as the best-funded channel — it has the largest sample (40 SQM, 18 SQO), the tightest interval, and a 20× pipe/$ margin over the next channel that survives the sensitivity analysis. Low confidence: anything about webinars (n=12), the organic vs paid comparison (organic pipeline is a flat $9,000 per SQO and referral a flat $8,000, which looks like modeling rather than observed deal values), and every forward-looking number in the recommendation, which assumes $900/SQM and 45% conversion hold at higher spend. They will not — marginal CPA rises. Discount the $240,000 figure accordingly. MISSING DATA — stated explicitly, not inferred - paid_social: zero rows in contacts_first_touch.csv. I cannot distinguish "the channel produced nothing" from "the channel isn't instrumented in this extract." The spend is real; the absence of contact rows is the ambiguity. - webinars 2026-08: $1,500 spent, no SQM that month. Same ambiguity at monthly granularity. - No closed-won or revenue column. "Pipeline amount" is open pipeline; $876,000 paid pipeline is not $876,000 of anything realized. Every ROI figure above is pipeline-per-dollar, not return. - No lead-to-opportunity or opportunity-to-close stage beyond SQO, so pipeline cannot be weighted by probability. - No impression/click/click-to-SQM data, so a $900 vs $960 vs $750 SQM cost cannot be traced to its cause. - Deal size is constant within each channel ($40,000 / $12,000 / $9,000 / $8,000), which means $/SQO and pipeline-per-dollar are driven entirely by conversion rate and cannot independently confirm deal size. - No cohort maturation control: August SQMs have had ~1 month to convert versus March's ~6, so current-month rates are biased downward and cross-channel comparison is safest on the full window, as computed.
Battlecard rewritten from the snippets and deals files only. File: /Users/amaniphipps/rivally_battlecard_2026-09-25.md Headlines: Pricing — newest source wins: $7/user/mo Recognition Starter, annual required (S17, 2026-08-12). Up from $5 (S03 2026-01-20, S08 2026-04-01) = +$2.00 = +40%. Deal quotes: $6.50 at 500 seats (S13); $7 list with 15% off a 3-year term → 7 × 0.85 = $5.95 effective (S18). Two conflicts flagged: the $5→$7 list move, and S13's $6.50 sitting above the $5 list recorded two months earlier (unresolved, not asserted). Pulse is a separate add-on with no price in the data (S23). Where they win — EU residency GA + Dublin (S15), multi-language (S12), ex-Workday VP EMEA (S11), recognition feed (S02/S16), fast setup + working Slack (S04), sub-4h support (S22), Pulse (S06/S23), Teams v2 preview (S19), $40M Series C (S01). Where we win — analytics is the only gap with a decided outcome attached: 800-seat win citing analytics depth (S25), corroborated by S02/S07/S20. Plus SCIM (S10), admin tooling/bulk editing (S16/S24), thin EMEA catalog (S14). Written as Rivally gaps — no Bonusly product data was supplied, so nothing is claimed about our own capabilities. Excluded: S09 and S21 (AE opinions, self-labelled unverified/unconfirmed). Their "aggressive discounting" is therefore unsupported — one 15% datapoint only. Win/loss: 13W–7L of 20, 13/20 = 65%. Split by half: 2025-09→2026-02 = 9W–3L (75%); 2026-03→2026-08 = 4W–4L (50%) — down 25 points, with 2026-04/05 at 0W–3L, then 3W–0L through August. Full monthly table with aliases in the file. Old-card disposition: - "$5 as of 2026-01" → superseded by S17. - "Rivally lacks a Slack integration" → false, corrected by S04. - "Acquired by WorkHuman in 2025" → unverified, no snippet supports it, contradicted by their independent $40M Series C (S01). Removed, do not repeat in the field. - "Mid-market" positioning → unverified; the only mid-market reference (S04) describes the reviewer's company, not Rivally's target segment. - "Strong in EU enterprise / multi-language" → re-sourced (S12/S15/S11). Two honesty notes: the deals file has no amounts, loss reasons, stages, or owners, so the 7 losses have no cited cause and no loss-pattern claim is made. And the previous revision saved at ~/existing_battlecard.md cites [S63][S64] — ids that don't exist in the snippet file (S01–S25); its numbers match a recount but its citations are invalid and its Bonusly-side claims unsourced. I left that file untouched rather than overwrite it.
SEQUENCE REVIEW (denominator = summed sent across steps 1–3) New Logo Nurture — sent 1,386; open 490/1,386 = 35.4%; reply 90/1,386 = 6.5%; meeting 27/1,386 = 1.9%. Weakest step 3 (reply 18/428 = 4.2%, meeting 1.4%). Expansion Nurture — sent 875; open 565/875 = 64.6% (invalid, below); reply 59/875 = 6.7%; meeting 12/875 = 1.4%. Weakest usable step 3 (12/275 = 4.4%). Cold Outbound - HR Leaders — sent 1,785; open 545/1,785 = 30.5%; reply 8/1,785 = 0.45%; meeting 0. Weakest step 3 (1/590 = 0.17%). Cold Outbound - People Ops — sent 1,163; open 340/1,163 = 29.2%; reply 29/1,163 = 2.5%; meeting 6/1,163 = 0.52%. Weakest step 3 (6/377 = 1.6%). TRACKING ERRORS - Expansion step 2: opened 340 > sent 300 (113%). Impossible. Stripping it, Expansion open = (130+95)/(300+275) = 225/575 = 39.1%. - Expansion step 1→2 sends stay flat at 300 while every other sequence decays (New Logo 500→458→428, People Ops 400→386→377) — consistent with duplicated send/open events on the same recipients. - audiences.csv is a partial roster: New Logo lists 299 contacts but step 1 alone sent 500. I cannot reconcile sends to named contacts. OVERLAP (23 contact_keys appear twice) - 21 shared by the two cold sequences: CT-000849, CT-000884, CT-000890, CT-000908, CT-001033, CT-001097, CT-001101, CT-001103, CT-001105, CT-001130, CT-001153, CT-001159, CT-001217, CT-001227, CT-001236, CT-001255, CT-001258, CT-001277, CT-001285, CT-001311, CT-001345. - 2 shared by Expansion + New Logo: CT-000301, CT-000624. No cold/nurture crossover. FAILURE MODE UNDER 2% REPLY Only HR Leaders (0.45%). Reply-per-open is 8/545 = 1.5% versus New Logo's 90/490 = 18.4%: subject lines work, the offer does not. Zero meetings on 1,785 sends means no CTA lands. The 21/290 (7.2%) also in People Ops add cadence duplication on top. ONE CHANGE EACH, AND ORDER 1. Fix first — HR Leaders: rewrite step 1 around a people-ops trigger and replace the meeting ask with one low-friction reply question; suppress the 21 overlaps. Largest volume, zero return. 2. Expansion: dedupe step-2 events before judging anything (same-day config fix). 3. People Ops: cut step 3 (6 replies on 377 sends); follow up manually only with the 150 step-1 openers. 4. New Logo: swap step 3 for a benchmark/case asset instead of another nurture email.
Ran this against the weekly-marketing-goals-dashboard skill, but per your instruction I used ONLY the three provided files — no HubSpot/Sheets pulls. All figures below are computed from marketing_qtd.csv, targets.csv, quarter_meta.csv. WEEKLY MARKETING GOALS UPDATE — Q3-2026 (2026-07-01 → 2026-09-30) Days elapsed: 66 of 92 → pace line = 66/92 = 71.7% of quarter complete. 26 days remain. For cumulative (flow) metrics, "on pace" = QTD actual vs target × 0.717. Stock/rate metrics (closed_lost_mia_rate, active_pipeline) are point-in-time — pace doesn't apply linearly; they're graded against target only. ``` metric actual target delta linear-pace req. verdict SQMs 230 300 -70 215.2 AHEAD (230 > 215.2; 76.7% attained vs 71.7% elapsed) SQOs 84 120 -36 86.1 BEHIND (84 < 86.1; 70.0% attained, -2.1 short of pace) DS2s 40 75 -35 53.8 BEHIND (53.3% attained vs 71.7% elapsed; -13.8 short) closed_lost_mia_rate 0.20 0.10 +0.10pp n/a (rate) BEHIND (5/25 = 20% vs ≤10% target — 2× the ceiling) same_quarter_closes 10 20 -10 14.3 BEHIND (50.0% attained; -4.3 short of pace) active_pipeline $3.0M $4.0M -$1.0M n/a (stock) BEHIND (75.0% of target) ``` Arithmetic shown: - MIA rate = closed_lost_mia / closed_lost_total = 5 / 25 = 0.20. Target 0.10 (lower_better) → 10pp over ceiling. - Pace requirement examples: SQMs 300 × 66/92 = 215.2; DS2s 75 × 66/92 = 53.8; same_quarter_closes 20 × 66/92 = 14.3. - Attainment: SQMs 230/300 = 76.7%; SQOs 84/120 = 70.0%; DS2s 40/75 = 53.3%; same_quarter_closes 10/20 = 50.0%; active_pipeline $3,000,000/$4,000,000 = 75.0%. - Remaining-day check: SQMs need 70/26 = 2.7/day vs 230/66 = 3.5/day run-rate to date (achievable). DS2s need 35/26 = 1.35/day vs 0.61/day to date — a 2.2× acceleration. SQOs need 36/26 = 1.38/day vs 1.27/day — modest acceleration. WHAT MOVED THIS WEEK — data gap, stated honestly: the provided files contain only current QTD snapshots; there is no prior-week series, so week-over-week deltas cannot be computed and I won't invent them. What the current snapshot says: SQMs is the lone green light (76.7% attained against 71.7% of the quarter elapsed, the only metric ahead of its linear pace). Everything downstream of it is behind — SQOs sit 2 deals short of pace, DS2s are the worst-relative gap (53.3% attained, needing 2.2× the current daily rate over the remaining 26 days), and same_quarter_closes at 50% attained implies in-quarter bookings are tracking badly unless DS2 conversion steps up. Quality is moving the wrong way too: the MIA share of closed losses is 20% (5 of 25) against a 10% ceiling, and active_pipeline stands at $3.0M vs the $4.0M target — 0.75× coverage. Note: the standing dashboard's 4×-bookings coverage framing isn't computable here because no bookings plan/forecast figure was provided in these files. If you can share last week's QTD snapshot (or want me to pull live HubSpot data per the skill), I'll produce true WoW movement.
Treat the Q3 weighted forecast of 115,976.75 as a ceiling, not a commit: 44,729 COMMIT (7 deals) + 71,247.75 weighted BEST_CASE (35% of 203,565, 24 deals), 23 PIPELINE at 0, 54 of 86 deals in-quarter. All 7 COMMIT deals have empty why-buys and 85 of 86 owners are blank, so nothing rolls up to rep or quota. The 32 October deals (227,575, including COMMIT Deal-D348E1 at 13,770) look pushed, not requalified.
Subject: Re: Pricing for 150 seats Hi — Following up on the pricing I sent August 5 for 150 seats, after our July 28 demo with your People team. The automated milestone awards and points catalog drew the strongest reaction, and I wanted to see where things stand. One ask: can you tell me whether the pricing fits this year's recognition budget, or let me know what question is holding the decision up so I can address it? Happy to hop on a short call if that's easier. Best, Alex Franklin --- Notes: 92 words. References ENG-00001 (Aug 5 pricing email, no reply) and ENG-00002 (Jul 28 demo reactions). Single ask: budget fit / blocker. Tone matches the prior outbound touches — brief, low-pressure, direct. Owner name from the deal record; no invented companies, contacts, or figures.
Weekly GTM digest: week of 2026-08-31 Marketing We came in at 46 SQMs against a target of 52, so we landed 6 short (46 ÷ 52 = 88% of target). Webinar did the most work, delivering 18 of those 46, or 39% of the total (18 ÷ 46). Paid search held at $150 cost per SQM, steady rather than spiking. Two honest gaps: this extract has no prior-week figures, so we're not claiming a trend, and it lists no paid SQM count, so total paid spend can't be calculated. Sales Sales converted 14 SQOs, set 9 DS2 meetings, and created $310,000 in new pipeline. Three deals closed same-quarter, which is the part worth celebrating: work in motion actually crossed the line. We deliberately did not divide $310,000 by 3 to call it an average deal size, because the new pipeline and the closed deals are different sets of records. No pipeline target appears in the extract, so there's no attainment percentage to report. CS CS saved 2 renewals and team NPS moved to 61. Three accounts carry an open red flag into next week. The extract gives no dollar value on the saved renewals, so we can't state retained ARR. What the counts do say: 3 open flags against 2 saves means the risk ahead of us is slightly larger than the work behind us, and those three accounts are where the week starts. PLG PLG added 412 new signups with activation at 31%. Applied to the cohort, that rate works out to roughly 128 activated companies (412 × 0.31 = 127.7), though the raw count isn't stated in the extract. 38 companies reached the aha moment of 10 recognition gives, or 9% of the signup class (38 ÷ 412 = 9.2%). Those 38 are the teams who felt the product land, and they're the group to follow next week.
PARTNER DIGEST — 2026-08-24 to 2026-09-04
PORTFOLIO TOTALS
Roster: 8 partners (4 active, 4 quiet).
Partner-sourced pipeline (utm_source = Partner): 5 deals, $550,000.
Arithmetic: 180,000 + 95,000 + 140,000 + 60,000 + 75,000 = 550,000 across 2 + 1 + 2 = 5 deals.
Reconciliation to deal file: Apex 2/$275,000 + HRCloud 1/$140,000 + CultureBridge 2/$135,000 + WorkWell 0/$0 = 5 deals / $550,000. Matches Deal-DDAAF2, Deal-2CF33E, Deal-F1CDA5, Deal-096E1D, Deal-067213 exactly — no unmapped or extra rows.
ACTIVE PLAYS
Apex Rewards Co — active
Co-webinar locked for 09-15 (Dana Mercer, 08-25; confirmed by Cole Ingram). Two sourced opps this period, both DS1, both logged with UTM Source = Partner.
Pipeline: 2 deals, $275,000 — Deal-DDAAF2 $180,000 + Deal-2CF33E $95,000 = $275,000.
HRCloud Partners — active
Integration referral cleared security review; opp advanced to DS2 (Alex Franklin, 08-27). One sourced opp this period.
Pipeline: 1 deal, $140,000 — Deal-F1CDA5 $140,000.
CultureBridge — active
Lunch-and-learn produced two sourced opps, both early stage (Farid Osman, 08-29).
Pipeline: 2 deals, $135,000 — Deal-096E1D $60,000 + Deal-067213 $75,000 = $135,000.
WorkWell Group — active
No sourced deals this period ($0, 0 deals). Partner wants to restart the joint playbook in Q4; planning call booked for 09-09 (Dana Mercer, 09-02).
QUIET PARTNERS
Recogniq — quiet; no Slack activity and no partner-sourced deals in this period.
KudosWave — quiet; no Slack activity and no partner-sourced deals in this period.
PeopleFirst Advisors — quiet; no Slack activity and no partner-sourced deals in this period.
TotalPerk — quiet; no Slack activity and no partner-sourced deals in this period.
DATA GAPS (stated, not filled)
- Stage is given in Slack prose only ("DS1", "DS2", "early stage"); the deal file carries no stage column, so per-deal stage for Deal-096E1D and Deal-067213 is unattributable beyond "early stage."
- No close dates, owner names, or end-account names are present in any supplied file.
- No prior-period baseline is supplied, so week-over-quarter movement in partner-sourced pipeline cannot be computed.
Q1 — Yes. All customer data is encrypted at rest using AES-256. [P1] Q2 — Yes. Data in transit is encrypted with TLS 1.2 or higher. [P1] Q3 — Yes. Bonusly maintains a SOC 2 Type II report, renewed annually; it is available to prospects under NDA. [P2] Q4 — Contract term plus 90 days, after which data is deleted from production systems. [P3] Q5 — Published at trust.bonusly.com. Customers receive 30 days notice before a new subprocessor is added. [P4] Q6 — Yes. SAML 2.0 SSO is available on the Enterprise plan (SCIM provisioning likewise). [P5] Q7 — Production databases are backed up daily; backups are encrypted and retained for 35 days. [P6] Q8 — Unanswerable. The provided excerpts cover SOC 2 Type II [P2] but say nothing about ISO 27001. The certificate register / compliance attestations page (or a current ISO certificate from the trust portal) would answer this. Q9 — Unanswerable. No excerpt addresses uptime SLA or availability commitments. The Master Services Agreement — or a Service Level Agreement addendum — would answer this. Q10 — Unanswerable. No excerpt mentions HIPAA or BAAs. Bonusly's legal/contracts team, via the BAA template or the MSA's regulatory-addenda schedule, would answer this.
All 14 skill bodies and the manifest were reconciled as given. Conventions used: manifest `description_chars`/`body_lines` taken at face value (not recounted from the pasted text); version/changelog header dates (Created / Last Updated / changelog rows) are legitimate metadata and not flagged; one proposal per finding; nothing rewritten.
FINDINGS: 21 total — 4 CRITICAL, 12 WARNING, 5 INFO.
──────────────────────────────────────────
(1) ALWAYS-TRIGGER OVERLAPS / DUPLICATES
──────────────────────────────────────────
[1.1] CRITICAL · MERGE — comms-drafter ↔ email-drafter
Five verbatim duplicate triggers across the two descriptions: "write me an email", "draft a follow-up", "what should I say", "bump email", "contract nudge" (plus near-duplicates "help me reply" / "help me reply to this", and comms-drafter's "stakeholder outreach" vs email-drafter's "stakeholder follow-up"). Two skills claim identical routing with no disambiguator in either trigger list.
Proposal: MERGE email-drafter into comms-drafter (comms-drafter is the superset: sales + CS + support + partners); carry over email-drafter's Gmail-signature retrieval and no-markdown rules into the merged body. Consequence to handle in the same pass: deal-strategy-coach's manager-email step delegates to email-drafter by name.
[1.2] CRITICAL · REVIEW — pipeline-intelligence-report ↔ weekly-pipeline-report
Verbatim/near-verbatim collisions: PIR's "pipeline update" vs WPR's "run the pipeline update" / "update the pipeline"; PIR's "run the pipeline report" vs WPR's "do the pipeline report" / "generate the pipeline report"; PIR's "what's the pipeline look like" vs WPR's "what does pipeline look like". Both produce different HTML deliverables (10-tab scored tier report vs weekly performance update), so the same phrase routes to two incompatible outputs. Related, lower grade: stale-pipeline-report's "run the stale pipeline report" contains the WPR phrase as a substring.
Proposal: REVIEW the two descriptions and assign each a canonical, non-overlapping phrase set (the bodies already disambiguate by content — "scored/tiered" vs "SQM/SQO/DS2 + bookings MTD"); the triggers should reflect that.
[1.3] WARNING · REVIEW — deal-strategy-coach ↔ pipeline-intelligence-report
PIR: "Also trigger when Alaina or any VP asks for pipeline health"; deal-strategy-coach: "Also trigger when a manager or VP ... reviews a rep's pipeline, asks which deals are likely to close." VP-level pipeline review requests land in both.
Proposal: REVIEW — scope PIR's VP clause to org-wide scored reporting and deal-strategy-coach's to per-rep coaching/1:1 prep, stated in the descriptions.
[1.4] WARNING · UPDATE_BODY — signalforge-claim-compressor ↔ the generators it post-processes
Compressor's ALWAYS list names the generators' own trigger nouns: "pipeline updates" (verbatim vs PIR's "pipeline update"), "intelligence reports" (vs PIR's "pipeline intelligence"), "forecast briefs" (vs sales-forecast's "forecast report"). A user saying "pipeline update" could route to a style pass instead of the report.
Proposal: UPDATE_BODY — restate the compressor's triggers as post-generation only ("runs after a SignalForge report exists"), since its own Integration section already sequences it after analysis-validator.
[1.5] INFO · REVIEW — mandatory-gate family
model-selection ("ALWAYS run ... at the start of every task, without exception"), analysis-validator ("Always. No exceptions."), and signalforge-feedback ("absolute final step") all claim unconditional execution. Sequencing is defined in the bodies (start → validator → compressor → feedback), so this is not a routing conflict — but with skill-orchestrator absent from this set (see 3.1), nothing here arbitrates the order.
Proposal: REVIEW once skill-orchestrator's row is available; no change if it already orders the three.
──────────────────────────────────────────
(2) CIRCULAR DELEGATION CHAIN
──────────────────────────────────────────
[2.1] WARNING · UPDATE_BODY — chain: deal-strategy-coach → email-drafter → deal-strategy-coach
- deal-strategy-coach: "When drafting manager-to-prospect emails, use the `email-drafter` skill..."
- email-drafter: "For deal strategy, diagnosis, or coaching (not email drafting), use deal-strategy-coach instead."
Each hands off to the other; comms-drafter → deal-strategy-coach feeds into the cycle from a third skill. Both bodies contain an escape hatch ("if they need both strategy and a draft, do the draft here"), but the cycle exists as written. Caveat: chains passing through skills outside this set cannot be audited — only in-set cycles are reportable.
Proposal: UPDATE_BODY — make the handoff one-directional (coach diagnoses and returns, the drafting skill never routes back for execution). Resolving [1.1] collapses this cycle anyway, since the merged skill absorbs both edges.
No other in-set cycle: next-to-close → pipeline-intelligence-report → closed-lost-analysis is acyclic (closed-lost-analysis is called by PIR but delegates back to nothing).
──────────────────────────────────────────
(3) DANGLING DELEGATION TARGETS
──────────────────────────────────────────
[3.1] WARNING · REVIEW — 14 named targets with no file and no manifest row in this set.
Hard dependencies (mandatory-path): signalforge-reports — including DESIGN-SYSTEM.md, signalforge.css, reports.html, brand-lockup.html (pipeline-intelligence-report Phase 5 "MANDATORY PRE-BUILD STEPS" and weekly-pipeline-report Step 4); bonusly-brand (comms-drafter Step 0, email-drafter header, sales-forecast brand rules); prospect-research-multithreading (comms-drafter, email-drafter, deal-strategy-coach multithread handoff).
Conditional: the eight specialists in analysis-validator §12.4 — bonusly-data-questions, bonusly-product-questions, bonusly-business-reporting-questions, bonusly-rewards-questions, bonusly-ppp-questions, bonusly-feature-flag-questions, bonusly-deal-desk-questions, bonusly-datadog-questions; skill-orchestrator (signalforge-feedback activation checklist, analysis-validator §11); plus §11's cascading names CUSTOMER_DATA_REFERENCE, HUBSPOT_CONNECTOR_REFERENCE, SIGNALFORGE_PRODUCT_INSIGHT_SKILL (unclear whether skills or docs).
Missing-data statement: these may exist outside the provided set; the manifest is the reconciliation frame here.
Proposal: REVIEW — confirm each target lives in the wider library and add manifest rows (or explicit external-scope annotations) for the three hard dependencies first.
──────────────────────────────────────────
(4) VERSION / SPEC CONFLICTS
──────────────────────────────────────────
[4.1] WARNING · UPDATE_BODY — analysis-validator, internal
Frontmatter/changelog/footer declare v3.6 (May 9, 2026); the §7 Validation Trail template still prints "Validator: analysis-validator v3.2". v3.6 should survive — it is corroborated by pipeline-intelligence-report's footer ("✓ SignalForge Validated · Analysis Validator v3.6").
Proposal: UPDATE_BODY — trail template version string to v3.6.
[4.2] WARNING · UPDATE_BODY — transcript sourcing: deal-strategy-coach + email-drafter vs analysis-validator
The two drafting skills mandate a fallback chain "HubSpot first → Granola second → Gong third"; analysis-validator G1-D states "The only approved transcript source: GONG_TRANSCRIPTS_AGG joined to GONG_HUBSPOT_MAP on CONVERSATION_KEY. No fallback. No substitute." Any transcript built via the fallback chain fails the mandatory gate by construction. analysis-validator should survive (it is the hard QA gate, and the conflict is loud — it fails at validation, not silently).
Proposal: UPDATE_BODY — align both drafting skills' transcript-priority sections to G1-D (or carve an explicit, validator-approved exception for coaching context vs published analysis).
[4.3] WARNING · REVIEW — partner-digest Step 2F vs analysis-validator G1-B / pipeline-intelligence-report guards
partner-digest falls back to a Snowflake HubSpot mirror (`HUBSPOT_HUB_1973303.V2_LIVE.DEALS`) for partner deal data; G1-B lists "HubSpot DEALS table — Do NOT use for pipeline (stale as of March 28, 2023)" and PIR's guard says "Never use PRODUCTION.HUBSPOT.DEALS." Missing data: the provided files cannot confirm whether `HUBSPOT_HUB_1973303.V2_LIVE.DEALS` and `PRODUCTION.HUBSPOT.DEALS` are the same object under different names. If they are, the validator's prohibition should survive.
Proposal: REVIEW the mirror's freshness; if it is the prohibited table, UPDATE_BODY partner-digest to HubSpot-connector-only.
Cross-reference: the AE-roster conflict (PIR's 5-AE list vs analysis-validator §12.3's Core 6) is a content conflict resolved in favor of analysis-validator — detailed as [6.1] since its root cause is hardcoding.
──────────────────────────────────────────
(5) DESCRIPTIONS EXCEEDING 1,024 CHARACTERS
──────────────────────────────────────────
Arithmetic: 14 manifest rows. Declared description_chars = {656, 897, 996, 792, 965, 676, 945, 1004, 1006, 962, 1006, 708, 762, 656}. Maximum = 1006 (pipeline-intelligence-report and signalforge-claim-compressor). 1006 < 1,024, so count exceeding 1,024 = 0 of 14.
[5.1] INFO · TRIM_DESC — near-ceiling descriptions
Headroom to 1,024: pipeline-intelligence-report 1006 (18 left), signalforge-claim-compressor 1006 (18), partner-digest 1004 (20), comms-drafter 996 (28).
Proposal: TRIM_DESC the two 1006-char rows modestly to restore headroom before any future edit crosses the ceiling. (Note: [1.1]'s merge will change comms-drafter's count anyway.)
──────────────────────────────────────────
(6) HARDCODED PAGE IDS, DATES, PERSON NAMES
──────────────────────────────────────────
[6.1] CRITICAL · UPDATE_BODY — pipeline-intelligence-report
Hardcoded "AE owner IDs (verified May 2026)": Bryce Harmon 119337721, Dana Mercer 83155923, Cole Ingram 83155924, Alex Franklin 84342457, Gavin Porter 1520255671. Omits Hugo Lindqvist (77260721) from analysis-validator §12.3's Core 6, and violates stale-pipeline-report's explicit rule "Never hardcode rep names or owner IDs." Wrong roster = misattributed pipeline. analysis-validator §12.3 should survive as the roster of record.
Proposal: UPDATE_BODY — replace the static ID block with runtime owner resolution (stale-pipeline-report Phase 2's OWNERS lookup pattern).
[6.2] WARNING · UPDATE_BODY — sales-forecast
Stale quarter labels contradicting its own changelog ("1.1 ... Quarter-agnostic (Q2 → current quarter throughout)"): heading "1A — HubSpot: Open Q2 Deals" and Tab 6 "Q2 Narrative" still say Q2. Also hardcoded destinations: Space ID 2232811524, Parent page ID 2232582148, cloud ID 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f, person name Alaina ("2A — Manager Forecast (Alaina / VP Sales view)").
Proposal: UPDATE_BODY — finish the de-Q2 cleanup and move Confluence IDs to a reference/config file.
[6.3] WARNING · UPDATE_BODY — weekly-pipeline-report
Hardcoded quarter window "Q2 (April 1 – June 30, 2026; total ≈ 64–65)" in Step 0 and Q2 bucket labels in Step 1; static figures "Q1 2026 context: $365,152 vs $475,000 (77%); $2,490,532 vs $3,288,000 (76%)" (arithmetic verified: 365,152/475,000 = 76.9% ≈ 77; 2,490,532/3,288,000 = 75.7% ≈ 76 — the numbers are internally correct but frozen); two Google Sheet IDs (1CLZeOsElVDF_LF0ZG_t2nfwvhnZ6bpwqM_nX3WEYzcw, 1ENuaEcCuLjdKhMvp8FK3Ys1ek5Aw9ZuOZhsHJJFoB_k); person binding in the title and flow ("Ben Lavin · Demand Generation", "Ben's review").
Proposal: UPDATE_BODY — parameterize the quarter window, relocate sheet IDs + the Q1 baseline to a dated reference, resolve the reviewer at runtime.
[6.4] WARNING · UPDATE_BODY — partner-digest
Hardcoded: Confluence folder ID 2286616609, canonical-issue page 2286321666 ("See the May 16, 2026 issue"), partner pages 2265382925 / 2236940297 / 2237825028 / 2239365136 / 2238283777, cloud/space IDs, Slack user ID <@U03QLMBL7AR>, "Owner: Amani Phipps", and named partner contacts (BambooHR: Kelli, Jen Lee; Snappy: Hani, Bryce; PartnerStack: Sara). Note the contact "Bryce" (Snappy) collides by name with AE Bryce Harmon elsewhere in the set.
Proposal: UPDATE_BODY — keep the folder destination, move contacts/owner into a maintained partner reference with a refresh step (the skill already commits to keeping its partner list current).
[6.5] WARNING · UPDATE_BODY — closed-lost-analysis
Named real accounts and dates baked into the taxonomy: MinIO ("rep vacation May 4–12"), Estee Lauder ("7+ day delay during active RFP"), Softheon ("lost to Motivosity in May 2026"), LIFTOFF and Nestlé, Ozinga ("UKG credential passthrough"), Aurora Innovation, GCash, Ethos Cannabis, StickerYou ("live Venezuela demo"), plus the static sample stat "In the 30-deal AI-field sample from May 2026: 10 of 10 deals" and fixed percentages in the interventions table (17% hold/pause, 8% budget, 14%+). The body itself says the categories are "illustrative, not exhaustive" — the exemplars age against that.
Proposal: UPDATE_BODY — relocate dated exemplars and static percentages to a versioned reference file; keep the taxonomy generic.
[6.6] WARNING · UPDATE_BODY — deal-strategy-coach
Hardcoded: Confluence page ID 2257879045 ("AE Excellence Playbook April 2026" — dated title in the URL), person routing "routed to Farid for manual qualification" and "India (routed to Perseus)", and the undated-cadence 2026 pricing table with list prices.
Proposal: UPDATE_BODY — verify the playbook page is still canonical, move Farid/Perseus routing to a reference, and give the pricing block an explicit re-verify date.
[6.7] WARNING · UPDATE_BODY — next-to-close
Self-contradiction: "Stage map (see `pipeline-intelligence-report` skill for the canonical version — do not redefine, just reuse)" followed immediately by a redefinition (`150582536`=DS1 · `150582537`=DS2 · `150582538`=DS3 · `150582539`=DS4 · `1175632767`=DS5). Also hardcoded org ID 1973303 in the deal URL and four Slack channel names (#deal-desk, #enterprise-chat, #sales-team-internal, #internal-revops).
Proposal: UPDATE_BODY — delete the duplicate map and cite PIR, honoring its own instruction.
[6.8] WARNING · UPDATE_BODY — stale-pipeline-report
Hardcodes that violate its own "never hardcode" design: "Don't query all 97 deals serially" (a frozen deal count in the performance note), Support owner ID 55483190, Slack channel ID C0561C1JCPJ, org ID 1973303, person name "Alaina", example dates (5/15, 5/19, 5/7).
Proposal: UPDATE_BODY — replace "97 deals" with the live pull total; the channel/owner IDs are operational destinations, move them to a constants block with a verify step.
[6.9] INFO · REVIEW — analysis-validator
§12.3 GTM roster: 19 named people with HubSpot owner IDs, dated "Updated May 4, 2026"; escalation names "Manish or Amani"; example names in G2-F (Dana Mercer, Gavin Porter). This is deliberate — it is the ID-resolution ground truth for G2-F — but it carries no re-verification trigger, unlike §8's own "run live at session start" doctrine.
Proposal: REVIEW — add a roster re-verification cadence consistent with §8's philosophy.
[6.10] INFO · UPDATE_BODY — signalforge-claim-compressor
Named real-looking accounts in before/after examples: "Felix Construction ... $15K TCV", "Panopto post-launch", "Schneider Downs expansion".
Proposal: UPDATE_BODY — mark the examples explicitly as illustrative or genericize the names.
[6.11] INFO · REVIEW — signalforge-feedback
Hardcoded destinations: log page ID 2295136266, parent 2234417154, Build Log 2247295002, space 2232811524, cloud ID; example report titles naming a person and a company ("Gavin Porter Rep Diagnostic", "Lowe's Conversation Analysis", "Q2 Pipeline Review").
Proposal: REVIEW — confirm the page IDs are live and relocate them to config alongside the other Confluence destinations ([6.2], [6.4]).
Swept, no finding: email-drafter (no hardcoded IDs/dates/names in body — though it is absorbed by [1.1]); model-selection's `last_checked: 2026-05-19` and price table are self-governed by its own 14-day staleness rule; comms-drafter carries no IDs/dates/names beyond role labels.
──────────────────────────────────────────
(7) MANIFEST DRIFT (BOTH DIRECTIONS)
──────────────────────────────────────────
[7.1] INFO · no finding
Files provided: 14. Manifest rows: 14. Set difference both ways = ∅ — every file (analysis-validator, closed-lost-analysis, comms-drafter, deal-strategy-coach, email-drafter, model-selection, next-to-close, partner-digest, pipeline-intelligence-report, sales-forecast, signalforge-claim-compressor, signalforge-feedback, stale-pipeline-report, weekly-pipeline-report) has exactly one row, and `declared_name` equals the file stem in all 14. No orphan files, no phantom rows.
Caveat (missing data): the manifest tracks SKILL.md units only. Linked files referenced by bodies — sales-forecast's five `references/*` files, weekly-pipeline-report's `references/report-spec.md` + `queries.md`, PIR's `/mnt/skills/...` paths — were not provided and cannot be existence-checked from this data.
──────────────────────────────────────────
SUMMARY
──────────────────────────────────────────
(1) 5 findings: 2 CRITICAL (comms-drafter↔email-drafter verbatim duplicates; PIR↔weekly-pipeline-report collisions), 2 WARNING, 1 INFO.
(2) 1 cycle, named: deal-strategy-coach → email-drafter → deal-strategy-coach.
(3) 14 dangling targets named; 3 are hard dependencies.
(4) 3 conflicts; survivors: analysis-validator v3.6 (over the v3.2 trail string), analysis-validator G1-D (over the HubSpot→Granola→Gong chains), validator/PIR stale-table rule (over partner-digest 2F, pending table-identity check).
(5) 0 of 14 descriptions exceed 1,024 chars (max 1006; headroom 18).
(6) 11 findings; worst is pipeline-intelligence-report's 5-AE hardcoded roster, missing Hugo Lindqvist from the Core 6.
(7) No drift in either direction; linked files outside manifest scope, unverifiable from provided data.
RUNBOOK — incident-2026-08-29-reward-queue (reward-worker queue backlog / Redis timeouts) Source: incident_thread.md export, #incident-2026-08-29-reward-queue. Every step traces to a cited message; gaps are marked NEEDS CONFIRMATION. Nothing added beyond the thread. TRIGGER PagerDuty alert: reward-worker queue depth > 10k. [M01] STEP 1 — Declare IC / acknowledge - Action: Acknowledge the PagerDuty alert and take Incident Commander. [M01] - Who: Bryce Harmon (14:02:10Z) - Command: none documented — NEEDS CONFIRMATION - Success verified: not documented — NEEDS CONFIRMATION - Rollback: no state change; no reversal documented. [M01] STEP 2 — Measure queue depth - Action: `bundle exec rake sidekiq:queue_depth` [M02] - Who: Farid Osman (14:04:33Z) - Result reported: reward queue at 48,213 pending jobs; normal is under 500. [M02] - Rollback: read-only, no state change. STEP 3 — Inspect the dead set - Action: Review dead set; reported 112 jobs, all Redis::TimeoutError from around 13:58. [M03] - Who: Farid Osman (14:06:02Z) - Command: absent from the thread — NEEDS CONFIRMATION - Success verified: not documented — NEEDS CONFIRMATION - Rollback: inspection only as recorded; no state change documented. STEP 4 — Pause enqueue (stop the bleed) - Action: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` [M04] - Who: Farid Osman (14:08:45Z) - State change: yes — auto_recognition_enqueue disabled. - Success verified: no direct verification of the flag state is recorded. NEEDS CONFIRMATION. (Later queue movement in M07/M08 is not isolated proof this flag took effect.) - Rollback (documented in the same message): `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` [M04] STEP 5 — Clear the dead set - Action: "While I was in the console I cleared out the dead set." [M05] - Who: Elena Sinclair (14:15:20Z) - Command: not stated — NEEDS CONFIRMATION - State change: yes — destructive (dead jobs removed). - Success verified: not documented — NEEDS CONFIRMATION - Rollback: not documented. Because this destroys the dead-job records, do not assume a reversal exists. NEEDS CONFIRMATION before this step is treated as repeatable remediation. STEP 6 — Scale workers up - Action: `kubectl scale deployment/reward-worker --replicas=6` (was 3) [M06] - Who: Bryce Harmon (14:21:07Z) - State change: yes — replicas 3 → 6. - Success verified: no direct replica-count verification recorded. NEEDS CONFIRMATION. M07 (9,400 and falling ~1,200/min) and M08 (depth 0) are later queue observations, not isolated proof of this scale-up's effect. - Rollback (documented in the same message): `kubectl scale deployment/reward-worker --replicas=3` [M06] STEP 7 — Monitor drain - Action: Check queue depth. [M07] - Who: Farid Osman (14:33:41Z) - Result reported: depth 9,400, falling ~1,200/min. [M07] - Command: absent from the thread — NEEDS CONFIRMATION - Rollback: read-only observation, no state change. STEP 8 — Verify recovery - Action: `bundle exec rake sidekiq:queue_depth` → returns 0; Datadog error rate back to baseline. [M08] - Who: Cole Ingram (14:47:55Z) - Verification: this is the thread's direct recovery check — depth 0 plus error rate at baseline. [M08] - Rollback: read-only, no state change. STEP 9 — Re-enable enqueue - Action: `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` [M09] - Who: Bryce Harmon (14:49:10Z) - State change: yes — enqueue restored. - Success verified: 40 new jobs processed cleanly in the next 3 minutes. [M09] - Rollback: not documented — NEEDS CONFIRMATION. Do not infer `FeatureFlag.disable(:auto_recognition_enqueue)` (from M04) as the approved rollback for this step. STEP 10 — Scale workers back down / close - Action: `kubectl scale deployment/reward-worker --replicas=3`; queue stable at 0; incident resolved. [M10] - Who: Bryce Harmon (14:55:00Z) - State change: yes — replicas 6 → 3. - Success verified: queue stable at 0 as reported in M10. - Rollback: not documented — NEEDS CONFIRMATION. Do not infer `--replicas=6` (from M06) as the approved rollback for this step. REPORTED NUMBERS, AS GIVEN (no new arithmetic derived) - Alert threshold: >10k [M01]; normal depth: under 500 [M02] - Peak reported depth: 48,213 [M02] - Dead set: 112 jobs, Redis::TimeoutError, ~13:58 [M03] - Mid-drain: 9,400 falling ~1,200/min [M07] - Cleared: 0 [M08], stable 0 [M10] - Post-reenqueue: 40 jobs clean in 3 min [M09] - Replicas: 3 → 6 [M06], 6 → 3 [M10] OPEN ITEMS REQUIRING CONFIRMATION BEFORE THIS BECOMES A REPEATABLE RUNBOOK 1. M03 dead-set inspection command. 2. M04 flag-state verification method. 3. M05 exact console command, verification, and whether cleared dead jobs are recoverable. 4. M06 replica-count verification (e.g. kubectl get deployment). 5. M07 measurement command. 6. M09 and M10 documented rollbacks.
## First error
```
2026-09-03T14:01:12Z reward-service ERROR
Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s
```
Everything before it in the slice is INFO (health checks, cache hits, `job enqueued` at 13:58:49Z web-app and 13:59:30Z reward-service). No error, warning, or degradation is logged in the ~6 minutes preceding 14:01:12Z.
## The cascade, in order
Log slice (ERROR/WARN only, 19 ERROR + 1 WARN):
| # | Time (Z) | Service | Event |
|---|---|---|---|
| 1 | 14:01:12 | reward-service | Redis timeout to `redis-primary:6379` after 5s — origin |
| 2 | 14:01:20 | reward-service | `retry exhausted for RewardGiveJob` |
| 3 | 14:01:30 | reward-service | `retry exhausted for RewardGiveJob` |
| 4 | 14:01:40 | reward-service | `retry exhausted for RewardGiveJob` |
| 5 | 14:01:40 | sidekiq | `RewardGiveJob failed: Redis::TimeoutError; retrying in 60s` |
| 6 | 14:02:28 | sidekiq | `RewardGiveJob failed ... retrying` |
| 7 | 14:02:30 | sidekiq | **WARN** `Queue reward depth above 10,000` |
| 8 | 14:03:05 | api-gateway | `502 upstream timeout calling reward-service /gives` — first edge/user-visible layer |
| 9 | 14:03:30 | web-app | `Give form submission failed: upstream 502 from api-gateway` — first end-user failure |
| 10 | 14:03:31 | sidekiq | `RewardGiveJob failed ... retrying` |
| 11–19 | 14:03:48 → 14:06:52 | api-gateway (×4), sidekiq (×3), web-app (×3) | same three signatures repeating |
Rows 4 and 5 share the timestamp 14:01:40Z; the slice gives no sub-second precision, so their internal order is only the CSV row order, not proven sequence.
Sidekiq job table, sorted by `failed_at` (16 rows, all `Redis::TimeoutError`):
```
RewardGiveJob (12): J-00005 14:01:46 · J-00001 14:01:51 · J-00003 14:01:54
J-00006 14:01:55 · J-00002 14:01:56 · J-00004 14:01:57
J-00007 14:02:51 · J-00011 14:02:51 · J-00008 14:02:56
J-00010 14:02:57 · J-00012 14:02:57 · J-00009 14:02:58
RecognitionDigestJob (4): J-00013 14:02:36 · J-00014 14:03:15 · J-00015 14:04:55
J-00016 14:05:50
```
Recovery: `14:22:10Z reward-service INFO Redis connection restored; resuming job processing`, then `14:24:45Z sidekiq INFO Queue reward depth below 500`. Between the last ERROR (14:06:52Z) and the restore, the only rows are six postgres `checkpoint complete` INFO lines (14:10:56Z–14:20:59Z).
Propagation arithmetic:
- Origin → first queue-depth WARN: 14:02:30 − 14:01:12 = **1m 18s**
- Origin → first 502 (api-gateway): 14:03:05 − 14:01:12 = **1m 53s**
- Origin → first user-facing failure (web-app): 14:03:30 − 14:01:12 = **2m 18s**
- Logged error window: 14:06:52 − 14:01:12 = **5m 40s** (19 ERROR rows)
- Job-failure window: 14:05:50 − 14:01:46 = **4m 04s** (16 rows; 12 + 4 = 16)
- Origin → connection restored: 14:22:10 − 14:01:12 = **20m 58s**
- Silent gap, last ERROR → restore: 14:22:10 − 14:06:52 = **15m 18s**
- Restore → queue drained below 500: 14:24:45 − 14:22:10 = **2m 35s**
## Service and job involved
- **Originating service:** `reward-service`, failing on its dependency `redis-primary:6379` (5s timeout).
- **Jobs:** `RewardGiveJob` — the class named in the logs (reward-service "retry exhausted", sidekiq "failed... retrying") and the majority of the job table (12 of 16). `RecognitionDigestJob` — 4 rows in `sidekiq_jobs.csv` only; it never appears in the log slice.
- **Carrying/queue service:** `sidekiq` (queue `reward`, WARN above 10,000 at 14:02:30Z, INFO below 500 at 14:24:45Z).
- **Downstream blast radius, in order of appearance:** `api-gateway` (502 upstream timeout on reward-service, one line naming `/gives`) → `web-app` (give form submission failed on that 502).
- `postgres` appears only as INFO checkpoints; no postgres error in the slice.
## Datadog query to confirm the first error
Log Explorer, time range **2026-09-03 13:59:00Z → 14:02:00Z**, sorted oldest-first:
```
service:reward-service "Redis::TimeoutError" @status:error
```
Confirmation criterion: the oldest returned record is `2026-09-03T14:01:12Z` with message `Connection to Redis at redis-primary:6379 timed out after 5s`, and no `@status:error` or `@status:warn` row for `reward-service`, `sidekiq`, `api-gateway`, or `web-app` exists in the 13:59:00Z–14:01:11Z sub-window. Broaden to `("Redis::TimeoutError" OR "Queue reward depth" OR 502) @status:(error OR warn)` and group by `service` to check the cascade order in the table above.
## What the logs do not show
- **Root cause of the Redis timeout.** No `redis-primary` service rows, no Redis-side metrics, no failover, eviction, memory, network, or slow-log evidence. The slice shows reward-service timing out, not why.
- **What caused the restore at 14:22:10Z.** No change event, deployment, restart, failover, or human action is logged. "Redis connection restored" arrives with no preceding cause row.
- **Whether errors stopped or logging stopped.** The 15m18s gap (14:06:52Z → 14:22:10Z) contains only postgres checkpoints — no reward-service or sidekiq health checks either. The slice cannot distinguish recovery-slow-drain from a logging/ingestion outage.
- **Numeric queue depth.** Only threshold crossings ("above 10,000", "below 500"). No gauge values, no peak depth, no drain rate.
- **Whether the 16 job rows are the complete failure set.** No total, no pagination marker, no retried-and-later-succeeded counts. Impact volume beyond these 16 is unknown.
- **No join key between the two files.** Log lines carry no `job_id`; job rows carry no trace/host ID. `RewardGiveJob` failures at 14:01:46–14:01:57Z fall between log rows and cannot be matched to specific log lines. Likewise, the four `RecognitionDigestJob` failures have no corresponding log entry — the slice does not show whether they were surfaced, retried, or dead.
- **Contradictory retry semantics unreconciled.** reward-service says "retry exhausted" (14:01:20–14:01:40Z) while sidekiq says "retrying in 60s"/"retrying" for the same class across the same window. Nothing in the slice explains which is authoritative or how many attempts occurred.
- **No 502 volume or latency data.** Five api-gateway 502 rows, but no request counts, error rate, p95/p99 latency, or affected-endpoint breakdown beyond the single `/gives` mention at 14:03:05Z.
- **No actors, on-call, or remediation.** No acknowledgements, no commands run, no mitigation steps, no ticket or incident ID. This is a telemetry slice, not an incident thread — nothing here supports claims about who did what.
- **No customer or revenue impact.** No affected customer count, no gives-failed total, no SLA figure.
- **Ordering at equal timestamps is unproven** (14:01:40Z across two services; 14:02:51Z and 14:02:57Z within the job table) — no sub-second precision in either file.
FLAG INVENTORY: 9 flags in the export, 6 of them referenced in the code excerpt. 5 are `on`, 4 are `off`. Company counts as given (not summed into a distinct-company figure — see caveat at the end): recognition_streaks_v2 42 | points_budget_guardrails 220 | slack_dm_nudges 87 | redeem_flow_redesign 12 | analytics_dashboard_v3 65 | ms_teams_app_v2 9 | legacy_give_modal 14 | survey_boosters_q3 7 | paused_offboard_cleanup 0 --- 1. recognition_streaks_v2 — on, segment:beta_companies, 42 companies Code (app/models/recognition.rb): gates `StreakTracker.record(give)`. Controls whether a give is recorded into streak tracking. When off/unenabled, no streak record is written — the excerpt shows no else branch, so the give itself still proceeds. 2. points_budget_guardrails — on, all_companies, 220 companies Code (app/services/budget_service.rb): gates `BudgetService.new(company).enforce!(giver, points)`. Controls enforcement of point-budget limits on a giver at give time. Broadest reach of any flag and the only one targeted at all_companies. 3. slack_dm_nudges — on, segment:region_na, 87 companies Code (app/jobs/nudge_job.rb): early `return unless` enabled, then `SlackDm.send_nudge(user)`. Controls whether the nudge job sends Slack DMs at all. Because it's a guard clause, non-targeted companies burn the job invocation and exit without sending. 4. redeem_flow_redesign — off, targeted_list, 12 companies Code (app/controllers/redeem_controller.rb): the only flag with an explicit two-way branch. Enabled → `RedeemV2Component`; disabled → `RedeemV1Component`. So 12 targeted companies would get V2, and while the flag is off every company (including those 12) renders V1. 5. analytics_dashboard_v3 — on, segment:tier_three, 65 companies Code (app/controllers/analytics_controller.rb): sets `@dashboard = AnalyticsV3.new(company)` only when enabled. No else branch in the excerpt, so what the other companies' analytics controller renders is not determinable from the data given. 6. ms_teams_app_v2 — off, targeted_list, 9 companies Code (app/services/teams_installer.rb): gates `TeamsAppV2.install(company)`. Controls installation of the MS Teams app V2. Flag off ⇒ no company gets a V2 install, including the 9 on the list. No fallback/install path shown. 7. legacy_give_modal — off, segment:legacy_plan, 14 companies NO CODE REFERENCE in the excerpt. State, targeting, and count are known; what it actually controls is not. Name suggests the give modal, but nothing in the provided code confirms that — not asserting it. 8. survey_boosters_q3 — on, segment:legacy_plan, 7 companies NO CODE REFERENCE in the excerpt. Flagged on for 7 companies with no observable runtime effect in the supplied code. 9. paused_offboard_cleanup — off, targeting rules EMPTY, 0 companies NO CODE REFERENCE, no targeting rules, no companies. This is the one flag with no targets at all — a fully inert row (consistent with the "paused" in its key, though the key is not evidence of behavior). --- ANOMALIES WORTH FLAGGING - Three flags (legacy_give_modal, survey_boosters_q3, paused_offboard_cleanup) exist in the export but appear nowhere in the code excerpt. Two of them carry nonzero targets — 14 and 7 companies — so 21 company-flag assignments are switched in the config with no verifiable effect. survey_boosters_q3 is the sharpest case: `on` for 7 companies, zero code. - One flag (paused_offboard_cleanup) has neither targeting rules nor companies, and no code. It is the only truly empty row. - segment:legacy_plan is the targeting rule for two flags with different counts (14 for legacy_give_modal, 7 for survey_boosters_q3). Same segment label, different numbers, so company_count is a per-flag target count, not a segment size. The two flags may or may not share companies — the export doesn't say. - "targeted_list" (redeem_flow_redesign 12, ms_teams_app_v2 9) names no companies or segment. Those 21 assignments are unverifiable from this export — you can't tell which companies, or whether the two lists overlap. - survey_boosters_q3 carries a quarter in its key (Q3). Nothing in the export gives dates, so whether it is still in-period is unknown — not inferring expiry. CAVEAT ON TOTALS Arithmetic on the column itself: 42+220+87+12+65+9+14+7+0 = 456 company-flag assignments (on flags: 42+220+87+65+7 = 421; off flags: 12+9+14+0 = 35). That is a sum of assignments, NOT a company count. Segments overlap by construction — a NA-region, tier-three, beta company is counted in three separate rows — and the export gives no roster or membership data, so the number of distinct companies is not derivable. points_budget_guardrails at all_companies/220 is the only row that plausibly approximates the full company base, but the export does not state that all_companies means every company, so I'm not treating 220 as the denominator.
NDA-1 — [PARTY A] and Bonusly — **GREEN**
Driving clauses:
- "Term: two (2) years from the Effective Date; obligations survive for three (3) years after termination."
- "Carve-outs: information that (a) is or becomes publicly available through no breach, (b) was known prior to disclosure, (c) is received from a third party without duty of confidence, (d) is independently developed, or (e) must be disclosed by law or court order."
- "Governing law: the laws of the State of Delaware, USA."
- "No license, no obligation to proceed, no exclusivity."
Reasoning: mutual, bounded (2y term + 3y survival = 5y max exposure), all five standard carve-outs present including the compelled-disclosure one, home-jurisdiction law, and an express no-obligation/no-exclusivity clause — nothing here reaches beyond a conventional evaluation NDA.
NDA-2 — [PARTY B] and Bonusly — **YELLOW**
Driving clause:
- "During the term of this Agreement and for eighteen (18) months thereafter, neither party shall solicit for employment or hire any employee of the other party with whom it came into contact under this Agreement."
Reasoning: the confidentiality terms are clean (mutual, 3y, standard carve-outs incl. legally required disclosure, Delaware), but an embedded no-hire rides along in a document presented as an NDA — and it is a *hire* ban, not merely a solicitation ban, with no carve-out for unsolicited applicants or general advertising, running 3y + 18m = up to 4.5 years from signature. Counsel review, not full legal: typically resolved by narrowing to "solicit" plus a passive-candidate exception.
NDA-3 — [PARTY C] and Bonusly — **RED**
Driving clauses (four independent hits):
- "Non-compete: 'For a period of three (3) years following the Effective Date, Recipient shall not, directly or indirectly, engage in or provide services to any business that competes with Discloser's business.'"
- "No confidentiality carve-outs are stated in this Agreement."
- "Governing law: 'This Agreement shall be governed by and construed in accordance with the laws of the Republic of Ireland, and the parties submit to the exclusive jurisdiction of its courts.'"
- "One-way confidentiality in favor of [PARTY C]. Term: five (5) years."
Reasoning: a 3-year, undefined-scope non-compete ("any business that competes") buried in an NDA is the single most dangerous clause in the set — it constrains Bonusly's product roadmap, not its disclosure behavior, and it is unenforceable or outright illegal in a number of US states; layered on top, the absence of *any* carve-out means Bonusly would technically breach by repeating publicly known or independently developed information or by obeying a court order; and the Irish exclusive-jurisdiction clause forces litigation on foreign soil under EU law for a dispute that should never reach a courtroom. Do not sign in any form — this is a full legal review, and the practical recommendation is a counter on Bonusly's own paper.
Data not supplied (flagged, not assumed): signature/effective dates, the redacted legal identities of PARTY A/B/C and whether any is a competitor or a US-vs-non-US entity, whether Bonusly is the disclosing or receiving party under NDA-2's mutual terms, and any definitions section for "Competes," "Employee," or "Confidential Information" — NDA-3's non-compete breadth turns partly on how "Discloser's business" is defined, which is not in the excerpt.