Mean 0.937 · 28/40 perfect tests · $13.06 total · each card: the question → the correct answer (gold) → this model's actual answer
STAGE HYGIENE AUDIT — open pipeline (137 deals) DEFINITIONS - DS2+ deal: current stage is DS2, DS3, DS4, or DS5. - Why-buys compliant: why_buys is 15+ chars and not a placeholder (tbd, n/a, na, see notes, none, blank). LONG(n) counts as present and substantive. - No DS1 timestamp: t_ds1 is blank. - Regressed: among the populated stage-entry timestamps (t_ds1..t_ds5), an earlier-stage timestamp is dated later than a later-stage timestamp. (Judged strictly on stage-entry timestamps, not create_date or entered_current_stage.) NUMBERS 1) Why-buys non-compliance, DS2+ overall - 101 of 124 DS2+ deals non-compliant = 101/124 = 81.5%. 2) Why-buys non-compliance by owner (non-compliant / DS2+ = pct) - Alex Franklin: 48/61 = 78.7% - Cole Ingram: 19/22 = 86.4% - Dana Mercer: 18/22 = 81.8% - Bryce Harmon: 15/18 = 83.3% - Farid Osman: 1/1 = 100.0% (No DS2+ deals owned by Elena Sinclair, or by the archived owners Gavin Porter / Hugo Lindqvist.) 3) Deals with no DS1 timestamp - 0. Every deal has a t_ds1 value. 4) Regressed deals - 0. No deal has stage-entry timestamps out of order. NOTE ON WHAT WAS NOT COUNTED: Several DS1 timestamps predate their own create_date by one day (e.g. Deal-403845 t_ds1 2026-08-31 vs create 2026-09-01; also Deal-927338, Deal-DCA846, Deal-D8ABF7, Deal-819506). These are create-vs-DS1 anomalies, not stage-entry-order regressions, so they are excluded from the regressed count per the stated definition. Flagging in case create/DS1 consistency is a separate check you want. THREE PROCESS FIXES 1. Make why-buys a required, validated field to advance past DS1 — block stage progression to DS2 unless a 15+ char, non-placeholder value exists. At 81.5% non-compliance the field is effectively optional today. 2. Add a create_date ≥ DS1-timestamp integrity rule at write time. The handful of DS1-before-create records indicate the stage-entry timestamp is being backdated or the two fields are set by different processes; reconcile the source of truth. 3. Run a weekly owner-level hygiene scorecard (this same non-compliance %) into 1:1s. Non-compliance is uniformly high across all active reps (78–86%), which points to a system/enablement gap rather than an individual one — fix it with a required-field gate plus manager review, not ad-hoc reminders.
Owner resolution complete. Results below. DEALS RESOLVED 156 of 156 open deals resolved to an owner name. Every owner_id in the deal extract matched a row in the owners table. UNMATCHED OWNER IDs (no match in owners table) None. There are zero deals with an owner_id absent from the owners table. OWNER IDs MAPPING TO ARCHIVED/DEACTIVATED OWNERS None. The two archived owners in the owners table — Gavin Porter (1520255671) and Hugo Lindqvist (77260721) — do not appear as owner_id on any deal. Every deal resolved to a non-archived owner. TOTAL PIPELINE AMOUNT PER RESOLVED OWNER (sum of amount field) Bryce Harmon (119337721): 1,054,144.00 Alex Franklin (84342457): 624,310.00 Dana Mercer (83155923): 341,195.00 Cole Ingram (83155924): 288,161.43 Farid Osman (716654662): 4,134.00 Elena Sinclair (701163055): 2,100.00 --------------------------------------------- Grand total: 2,314,044.43 Arithmetic note: totals are straight sums of the `amount` column grouped by resolved owner (no weighting, no exclusion of the $1 placeholder deals or zero-probability stages — all 156 rows included as given). If you want a version that strips the $1 placeholder rows or filters by forecast_category/stage, say the word.
Call-to-deal mapping integrity check. Matching key: hs_deal_id (gong) = deal_id (deals_open). gong_owner_id ignored per your note. (a) Orphan gong rows — deal id has NO match in deals_open Count: 30 of 67 gong rows (44.8%). Sample aliases (from the data): Deal-8FA85D, Deal-8FC3F9, Deal-3B7945, Deal-42B265, Deal-9CCC42, Deal-36EA09, Deal-9A43B4, Deal-605F3C. Note: many orphans cluster on gong_owner_id 373679877710534937 and on a block of near-sequential deal ids (60251xxxxx), consistent with a set of deals that are not in the current open default-pipeline extract (closed, other pipeline, or not synced). (b) Duplicate conversation keys (calls_90d > distinct_conversation_keys) Count: 0. In every gong row, calls_90d equals distinct_conversation_keys, so there is no evidence of duplicate conversation keys in this data. (c) Open deals at stage DS3 or later — share with ≥1 logged call Denominator: 85 open deals at DS3, DS4, or DS5. Numerator: 25 of those have at least one matching gong row. Share = 25 / 85 = 29.4%. Arithmetic / method notes: - "DS3 or later" = stage number ≥ 3 (DS3, DS4, DS5); DS1/DS2 excluded. - A deal "has a logged call" if its deal_id appears in the gong table (calls_90d ≥ 3 for every present row, so presence implies ≥1). - Matching is purely on deal id; deal_alias values are consistent across the two files where ids match, so no alias collisions affected the counts. Data limitation: this only reflects deals present in the deals_open extract. The 30 orphan gong rows cannot be stage-classified (no stage data for them here), so they are excluded from (c) by construction.
Data gap — cannot write the requested query without inventing tables or columns. The three requested metrics cannot be produced at the requested grain from this catalog: 1. Unique givers (per company, first calendar month) - Requires a recognition/giving EVENTS table with GIVER_ID + COMPANY_ID + event timestamp. - No such table exists in the catalog. The only giving-related figures are M1_GIVES in PRODUCTION.PLG.COMPANY_COHORT_SUMMARY, which is a pre-aggregated count, not distinct givers, and carries no giver identity. Missing — cannot compute. 2. Recognition count (per company, first calendar month) - Same problem: no recognition-events table. COMPANY_COHORT_SUMMARY.M1_GIVES is already aggregated to "first month" but cannot be recomputed, cannot be keyed to an actual calendar-month window, and cannot honor the deleted-giver rule (see below). Not derivable from events — the events source is absent. 3. Successful redemption count (per company, first calendar month) - PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2 is named as the redemption source (STATE = 'succeeded' only), but the catalog lists NO columns for it — no COMPANY_ID, no giver key, no event date. Without documented columns I cannot join it to a company or bound it to a first calendar month. Missing columns — cannot compute. Additional blocked dependency: - "Exclude deleted givers must NOT be applied to historical giving counts": this rule presupposes a givers/giving-events table carrying a deleted flag. No such table is in the catalog, so there is nothing to (correctly) leave unfiltered. The rule cannot be honored because its target table is absent. - "First calendar month as a customer" needs a customer-start date. Candidates exist (COMPANY_COHORT_SUMMARY.FIRST_SUB_PAYMENT_DATE / SIGNUP_DATE; CHARGEBEE.SUBSCRIPTIONS.CURRENT_TERM_START), but they cannot be joined to a recognition-events table that does not exist. What would be needed to write a correct query (none present in this excerpt): - A recognition/giving events table: one row per give, with giver id, company id, event timestamp, and the deleted-giver flag. - The column list for REDEMPTION_RECORDS_V2: at minimum COMPANY_ID, an event/redemption timestamp, and STATE. - A confirmed customer-start date field to define the first calendar month. I am not emitting SQL, because any query returning these three columns at the requested grain would require fabricating at least one table name and REDEMPTION_RECORDS_V2's columns — which the instructions prohibit. Provide the recognition-events table definition and REDEMPTION_RECORDS_V2's columns and I will write the query immediately.
Analysis complete. Here is the audit.
═══════════════════════════════════════════════
CRM EXTRACT AUDIT
═══════════════════════════════════════════════
0. SCOPE / MISSING DATA (flagged, not invented)
- NO DEALS FILE was provided. The brief asks to audit deals (owner, stage, amount, close date, why-buys) and to rank fixes by "pipeline amount at stake." There is no deals.csv, no amounts, no owners, no stages, no close dates, and no why-buys anywhere in the three files. I cannot compute deal-field completeness or pipeline dollars. Everything below is companies + contacts only. The final "top 10 by pipeline at stake" cannot be produced as specified — see Section 8.
- Files present: companies.csv (34 rows), contacts.csv (52 rows), zoominfo_enrichment.csv (25 rows). No owner/persona-title reference table, so title/persona blanks can only be flagged, not filled.
1. COMPLETENESS % PER FIELD
Companies (n=34):
- industry: 34/34 = 100.0% (but label-inconsistent — see §6)
- employee_count: 25/34 = 73.5% (9 blank)
- hq_country: 28/34 = 82.4% (6 blank)
Contacts (n=52):
- email (present): 52/52 = 100.0%
- email (VALID): 48/52 = 92.3% (4 malformed — see §4)
- title: 39/52 = 75.0% (13 blank)
- persona: 37/52 = 71.2% (15 blank)
Deals: NO DATA — cannot report.
2. DUPLICATE COMPANY CLUSTERS (shared domain)
Cluster A — domain acme-corp.com
Members: C-0A092931, C-0A092932
Conflict: employee_count 500 vs 510; industry Technology vs tech; country US vs USA
SURVIVOR: C-0A092931 (lower/canonical alias; industry properly cased "Technology")
Merge C-0A092932 into it. Employee count 500 vs 510 is a real conflict — neither is in enrichment (no ZI row for acme-corp.com), so keep 500 and flag for manual verification; do not invent a reconciled number.
Cluster B — domain globex.io
Members: C-0A092933, C-0A092934
Conflict: industry SaaS vs Technology; employee_count both 200 (agree); country both US (agree)
SURVIVOR: C-0A092934 (industry "Technology" matches your dominant taxonomy; "SaaS" is an outlier label). Data otherwise identical, so this merge is low-risk.
No other shared-domain duplicates. (All other 30 companies have unique domains. Note: aliases like C-425E2A "Tech " vs others are label noise, not duplicates.)
3. DOMAIN MISMATCHES (valid email, but email domain ≠ company domain)
- CT-0011: user1@other-domain.com — company C-66D1FC domain is 66d1fc.com. Email is syntactically valid but points at a foreign domain. Recommend: verify contact still works at this account; likely stale/personal or job-changed. Correct to @66d1fc.com or re-verify.
(1 mismatch total.)
4. INVALID EMAILS (malformed — no domain after @)
- CT-0010: "user0@" (company C-66D1FC / 66d1fc.com)
- CT-0080: "user0@" (company C-92D97D / 92d97d.com)
- CT-0081: "user1@" (company C-92D97D / 92d97d.com)
- CT-0192: "user2@" (company C-425E2A / 425e2a.com)
All four are truncated at the "@" with no host. The row's own `domain` column suggests the intended host — recommend reconstructing as user0@<domain> only after verification; do not auto-fill a guessed local-part/host as fact.
5. ENRICHMENT FILLS (CRM blank AND ZoomInfo has a matching-domain value → fill)
All are employee_count, all sourced from ZoomInfo (zi_employee_count = 400):
C-EC3025 → 400
C-96039F → 400
C-44EA29 → 400
C-D04904 → 400
C-B23205 → 400
C-60C75F → 400
C-7BBDFA → 400
C-50D386 → 400
(8 fills.) After these, employee_count completeness → 33/34 = 97.1%. The 1 still-blank (C-93C8BF, blank count) has no ZI row — leave blank, flag for enrichment.
hq_country blanks that CANNOT be filled (no ZI value either — ZI country also blank for these): C-2D1F1B, C-D73B89, C-2C60E5, C-7BBDFA(*), C-50D386(*), C-EE9FFB. (*7bbdfa/50d386 ZI country is also blank.) Actually of the 6 CRM-blank countries, ZI supplies none → 0 country fills possible. Leave blank; flag.
6. CRM↔ENRICHMENT DISAGREEMENTS (both present, differ)
6a. Industry taxonomy mismatches — 10 rows. These are label/taxonomy differences, NOT value conflicts: CRM uses a "tech/Technology/Tech" family; ZoomInfo uses "Computer Software."
C-66D1FC, C-EC3025, C-44EA29, C-92D97D, C-D04904, C-77A95A, C-AA8DDA, C-B25F40, C-60C75F, C-425E2A
RECOMMENDED SOURCE: Adopt one canonical taxonomy. For a GTM CRM, recommend standardizing on ZoomInfo's "Computer Software" (consistent, machine-normalized) OR mapping all tech-family labels to a single internal value. Either way this is a normalization decision, not a factual conflict — both describe the same segment.
6b. Employee count: ZERO true numeric disagreements between CRM and ZI (where both present, they match).
6c. HQ country: ZERO disagreements (US/USA both normalize to United States, matching ZI).
7. HYGIENE / NORMALIZATION ISSUES (no fabrication needed, formatting only)
- Country labels inconsistent: US / USA / United States all used for the same country. Standardize (recommend "United States").
- Industry labels inconsistent: "tech", "Technology", "Tech " (trailing whitespace), "SaaS" and "health care" vs "Healthcare". Trim whitespace and standardize casing/taxonomy.
- Trailing-space values ("Tech ") will break exact-match grouping/reporting — trim on ingest.
8. THE 10 FIXES WITH THE MOST PIPELINE AT STAKE
CANNOT BE PRODUCED AS ASKED. Ranking fixes by "pipeline amount at stake" requires deal amounts joined to companies/contacts. No deals file, no amounts, and no company→deal linkage were provided. I will not invent deals or dollar figures.
What I CAN give instead — the 10 highest-leverage data fixes ranked by count/verification-risk (no dollars, because none exist in the data):
1. Add deals.csv — the entire deal audit + pipeline ranking is blocked without it. (Highest-impact missing input.)
2. Merge acme-corp.com duplicates (C-0A092931 survivor) and resolve the 500-vs-510 headcount conflict.
3. Merge globex.io duplicates (C-0A092934 survivor).
4. Fix 4 malformed emails (CT-0010, CT-0080, CT-0081, CT-0192) — unreachable contacts.
5. Verify domain-mismatched contact CT-0011 (user1@other-domain.com).
6. Apply 8 ZoomInfo employee_count fills (EC3025, 96039F, 44EA29, D04904, B23205, 60C75F, 7BBDFA, 50D386).
7. Standardize industry taxonomy across the 10 tech-family rows (CRM vs "Computer Software").
8. Fill 13 blank contact titles and 15 blank personas (needs a source — not in these files).
9. Enrich the 6 companies with no ZI row (BA969B, 332637, 93C8BF, EE9FFB, C9BB20, plus dedup remnants) and the 6 blank hq_countries ZI can't fill.
10. Normalize country labels (US/USA→United States) and trim trailing whitespace ("Tech ").
If you send me a deals extract (alias, owner, stage, amount, close_date, why_buys + company link), I'll re-run and produce the true pipeline-weighted top-10.
Analysis complete. 90 deals classified. ═══════════════════════════════════════════ PER-DEAL CLASSIFICATION (category | side) ═══════════════════════════════════════════ Deal-DB0AAC timing | buyer Deal-F7F635 competitor | buyer Deal-AC944F no decision | buyer Deal-214060 no decision | buyer Deal-91A056 timing | buyer Deal-29326C timing | buyer Deal-5DB9B0 other | unknown (text "Spam." — junk lead, no real side) Deal-831B7B timing | buyer Deal-F97C37 competitor | buyer Deal-13E9CF no decision | buyer *tag disagree Deal-39E25C timing | buyer Deal-7ED004 pricing | buyer Deal-21B045 no decision | buyer Deal-B3ABED timing | buyer Deal-422BA6 competitor | buyer Deal-ED9AE7 no decision | buyer *tag disagree Deal-988493 no decision | buyer Deal-381C8C competitor | buyer Deal-F308CA no decision | buyer Deal-F1E8A6 competitor | buyer Deal-B6AC09 timing | buyer Deal-70F704 no decision | buyer *tag disagree Deal-E6E80A timing | buyer Deal-B038F0 timing | buyer Deal-4664E1 no decision | buyer Deal-175756 timing | buyer Deal-E74A73 no decision | buyer *tag disagree Deal-DDAB52 competitor | buyer Deal-ACE061 competitor | buyer Deal-BB78F3 timing | buyer Deal-D48E0B no decision | buyer Deal-15DA99 timing | buyer Deal-F4AF5D timing | buyer Deal-79B7A1 timing | buyer Deal-583ADB no decision | buyer Deal-8E27DA competitor | buyer *tag disagree Deal-2D2F8D competitor | buyer Deal-E0441F no decision | buyer Deal-7CB44D no decision | buyer Deal-0F96AA competitor | buyer Deal-1BCA50 competitor | buyer Deal-7CC678 competitor | buyer Deal-FAC17C no decision | buyer *tag disagree Deal-242273 competitor | buyer Deal-50E5D8 no decision | buyer Deal-A2C349 competitor | buyer Deal-9F176A timing | buyer Deal-7B2236 pricing | buyer Deal-AFA56C no decision | buyer Deal-C7156E competitor | buyer Deal-C33D91 pricing | buyer Deal-9048EB product gap | buyer *tag disagree Deal-5E64CE competitor | buyer *tag disagree Deal-8A0992 competitor | buyer Deal-D0C698 competitor | buyer Deal-69CF3D timing | buyer Deal-ECBF89 timing | buyer Deal-3618CC product gap | buyer *tag disagree Deal-EECC02 competitor | buyer Deal-5AD03E pricing | buyer *tag disagree Deal-D1A623 timing | buyer Deal-413C56 no decision | buyer Deal-47F1A1 competitor | buyer Deal-BF2A98 competitor | buyer Deal-2A292B competitor | buyer *tag disagree Deal-D1AABF no decision | buyer Deal-FEDBCB no decision | buyer Deal-1E7DA9 competitor | buyer Deal-2BBA21 no decision | buyer Deal-286F9C competitor | buyer Deal-7FBAC6 no decision | buyer Deal-369281 competitor | buyer Deal-386F6E no decision | buyer Deal-9FCD0D competitor | buyer Deal-55867E no decision | buyer *tag disagree Deal-DAFB82 pricing | buyer Deal-2FEDDB no decision | buyer Deal-64B19A competitor | buyer Deal-3F86A0 no decision | buyer Deal-096750 no decision | buyer Deal-F325A5 other | buyer *tag disagree Deal-ABD14C no decision | buyer Deal-79E61A no decision | buyer Deal-8A119B pricing | buyer Deal-AE7C4E no decision | buyer Deal-DAB4F1 no decision | buyer Deal-B4B50F no decision | buyer Deal-981AD4 product gap | buyer Deal-DC77FE competitor | buyer Deal-5885B9 no decision | buyer ═══════════════════════════════════════════ SUMMARY ═══════════════════════════════════════════ CATEGORY COUNTS (n=90): no decision 33 competitor 28 timing 18 pricing 6 product gap 3 other 2 champion left 0 (33 + 28 + 18 + 6 + 3 + 2 + 0 = 90 ✓) SIDE SPLIT (n=90): buyer 89 unknown 1 (Deal-5DB9B0, "Spam." — no genuine buyer engaged) Bonusly 0 (89 + 1 + 0 = 90 ✓) Note on side: I could not identify a single loss where the free text attributes the cause to Bonusly's own action (e.g., a rep error, a Bonusly-side pull-out). Every substantive loss is a buyer-side decision, condition, or non-response. The lone "unknown" is a spam/junk record with no real buyer. TAG-vs-TEXT CLEAR DISAGREEMENTS: 13 Deal-13E9CF tag "Doing nothing/Not a priority/Cost" — text explicitly "Not a budget issue" → no decision Deal-ED9AE7 tag "Lost DM" — text "Timing, budget, authority" (no DM-access story) → no decision Deal-70F704 tag "Lost DM" — text = narrow scope + MIA → no decision Deal-E74A73 tag "...Cost" — text = wants to test manually first, not a cost objection → no decision Deal-8E27DA tag "Feature Request" — text = chose a swag provider instead → competitor Deal-FAC17C tag "Lost DM" — text = contract stalled on internal approval → no decision Deal-9048EB tag "MIA" — text = bad fit / multiple feature gaps → product gap Deal-5E64CE tag "Doing nothing/Cost" — text = locked in Nectar incumbent contract → competitor Deal-3618CC tag "Lost DM" — text = "Wanted Surveys" (a feature) → product gap Deal-5AD03E tag "Competitor" — text = "Wanted more defined budget access" (no competitor named) → pricing Deal-2A292B tag "Doing nothing/Cost" — text = building it internally (build-vs-buy) → competitor Deal-55867E tag "Lost- Timing (1 year or more)" — text = soft no, "won't be moving forward at this time," no future date → no decision Deal-F325A5 tag "Lost DM" — text = layoffs + leadership change deprioritized it → other (org event) ═══════════════════════════════════════════ TWO PATTERNS MOST WORTH ACTING ON ═══════════════════════════════════════════ 1. Non-engagement dominates and is being under-diagnosed. "No decision" is the single largest bucket at 33 of 90 (37%), and 20 of those carry an MIA tag with text amounting to "unresponsive / no contact / ignored outreach." Several of these are large: Deal-9048EB ($41,790), Deal-7CB44D ($31,860), Deal-F308CA ($30,321). This is a top-of-funnel qualification and multi-threading problem, not a closing problem — deals are going dark after intro/demo, often single-threaded (many n_contacts = 2–3). Worth acting on: tighten qualification before demo, mandate multi-threading on deals >$20K, and instrument a defined re-engagement cadence before flipping to MIA. 2. The structured closed_lost_tag is unreliable — 13 of 90 (14%) clearly contradict the free text, and the errors cluster in two directions: (a) "Lost DM" is being used as a catch-all for timing/budget/feature/approval stalls (Deal-ED9AE7, 70F704, FAC17C, 3618CC, F325A5), and (b) real competitive losses are hidden under "Doing nothing/Cost" or "MIA" (Deal-5E64CE, 2A292B build-vs-buy, 9048EB). Because competitor is already the #2 bucket at 28, the true competitive-loss rate is likely understated. Worth acting on: retrain reps on tag definitions (especially "Lost DM" vs "no decision" and surfacing named competitors/incumbents), and treat the tag field as untrustworthy for reporting until cleaned. Note: no losses were attributable to a departed champion in the free text, so "champion left" = 0.
```json
{
"tier_counts": {"LOCK": 7, "ACTION": 9, "BUILD": 38, "REVIVE": 1, "WATCH": 94, "RISKY": 7},
"tier_examples": {
"LOCK": ["Deal-25F752", "Deal-D348E1", "Deal-C26D20"],
"ACTION": ["Deal-A5E80A", "Deal-499BF6", "Deal-C6FE92"],
"BUILD": ["Deal-D73B89", "Deal-523604", "Deal-CA7DC0"],
"REVIVE": ["Deal-2D1F1B"],
"WATCH": ["Deal-E53952", "Deal-5408B0", "Deal-9AAE5F"],
"RISKY": ["Deal-584EE5", "Deal-BA571A", "Deal-FC22A3"]
},
"risky_deals": ["Deal-584EE5", "Deal-BA571A", "Deal-FC22A3", "Deal-2465CE", "Deal-C6D97A", "Deal-F9A08A", "Deal-0660B4"],
"lock_violations": 0,
"pipeline_shape": "Counts sum to 156 deals (7+9+38+1+94+7). The pipeline is heavily bottom-loaded: 94 deals (60%) fall to WATCH — overwhelmingly early-stage DS1–DS3 PIPELINE-category deals with zero meetings_30d and no committed forecast, meaning the book is mostly unqualified top-of-funnel. Only 16 deals (LOCK+ACTION, ~10%) show the combination of a committed forecast, late stage, recent meeting activity, and warm engagement that signals near-term closeability, and none of the 7 LOCKs violate the zero-meeting rule. A meaningful 38 deals sit in BUILD (net-new PIPELINE with live meetings/engagement worth advancing), while REVIVE is nearly empty (1) because most stale deals lacked enough 90-day engagement volume to qualify for rescue. The 7 RISKY deals are the key hygiene flag: each carries an optimistic COMMIT/BEST_CASE forecast yet has zero meetings_30d alongside stale or thin engagement — forecast confidence unsupported by buyer activity and likely inflating the commit call."
}
```
Note on RISKY: the array lists all 7; tier_examples shows only the first 3 per the "up to 3 examples" instruction. Recency was computed as days since the most recent of last_email/last_call/last_meeting relative to today (2026-09-05); meetings_30d was used as the inbound signal per your note.
CRM write-back fields extracted per transcript. Prospect statements only; rep lines excluded.
```json
[
{
"transcript_id": "TX-001",
"deal_alias": "Deal-CFE7F4",
"why_buys": ["Automating anniversary and birthday awards (HR team of three cannot keep up manually)"],
"pain_points": ["HR team of three cannot keep up with awards manually", "Tracking in a spreadsheet; people slip through the cracks"],
"stakeholders": ["VP People", "HR Admin"],
"budget_signal": "~$40k earmarked for engagement tools this fiscal year",
"timeline_signal": "Live before open enrollment in November",
"competitor_mentioned": "Achievers (looked at last year; too heavy for a team their size)",
"next_step": "Security review on September 12 (agreed by VP People)",
"objections": ["Need SSO and audit logs for IT to sign off"],
"confidence": "High"
},
{
"transcript_id": "TX-002",
"deal_alias": "Deal-70BB30",
"why_buys": ["Tie recognition to retention for hourly workforce (regretted turnover over 30%)"],
"pain_points": ["Regretted turnover for hourly workforce is over 30%"],
"stakeholders": ["Head of Total Rewards", "CFO"],
"budget_signal": "$25k pilot budget approved by finance for this quarter",
"timeline_signal": "Decision by end of September",
"competitor_mentioned": null,
"next_step": "Vendor to send pilot agreement; prospect will route to legal this week (agreed by CFO)",
"objections": ["Workday integration must be rock solid (CFO's one condition)"],
"confidence": "High"
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why_buys": ["Make recognition visible across 12 retail locations"],
"pain_points": ["Recognition not visible across 12 retail locations", "Store managers have zero budget autonomy for on-the-spot recognition"],
"stakeholders": ["People Ops Manager", "CEO (referenced, not present)"],
"budget_signal": null,
"timeline_signal": "No rush until Q1",
"competitor_mentioned": "Bucketlist (CEO used it at her last company and liked it)",
"next_step": "Schedule a call with the CEO; prospect will send two times (agreed by People Ops Manager)",
"objections": ["CEO must be sold first — she decides anything people-related"],
"confidence": "Medium"
},
{
"transcript_id": "TX-004",
"deal_alias": "Deal-180D02",
"why_buys": ["Consolidate three separate recognition tools into one"],
"pain_points": ["Paying for three tools; none of them talk to the HRIS"],
"stakeholders": ["VP People", "IT Security Lead", "CFO (referenced, not present)"],
"budget_signal": "Under $15k annually can be approved by VP People without board approval",
"timeline_signal": "Procurement cycle six to eight weeks minimum",
"competitor_mentioned": null,
"next_step": null,
"objections": ["Procurement cycle runs six to eight weeks minimum", "Security review took three months for last vendor (stated hesitation)"],
"confidence": "Low"
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why_buys": ["Automate service milestones", "Analytics on recognition equity across departments"],
"pain_points": ["Night-shift teams feel invisible; engagement scores run 20 points lower"],
"stakeholders": ["HR Director", "People Ops Coordinator", "Exec team (referenced, not present)"],
"budget_signal": "$12k approved under engagement line",
"timeline_signal": "Running before January all-hands",
"competitor_mentioned": "Nectar (currently mid-pilot; would need to beat that experience)",
"next_step": "Present to exec team on October 2 (agreed by HR Director)",
"objections": ["Exec team skeptical after a failed rollout two years ago"],
"confidence": "High"
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why_buys": ["Cut admin time on service awards"],
"pain_points": ["Personally spends five hours a month ordering and shipping plaques"],
"stakeholders": ["HR Manager", "COO (referenced, not present)"],
"budget_signal": null,
"timeline_signal": "Q1 start realistic (fiscal year resets in February)",
"competitor_mentioned": null,
"next_step": "Vendor to send one-page overview; prospect will forward to COO this week (agreed by HR Manager)",
"objections": ["COO usually prefers building things in-house", "Comparing against doing it internally"],
"confidence": "Medium"
}
]
```
Notes on the judgment calls (all made to keep rep-sourced content out):
- TX-002 competitor: null. "You're the first vendor we've had a real demo with" names no competitor.
- TX-003 budget: null. The $8/employee/month figure was stated by the rep, not the prospect. The prospect gave no budget number.
- TX-004 next_step: null. "Maybe — I need to check her calendar, no promises" is not an explicit agreement.
- TX-006 budget: null. Prospect explicitly said budget isn't the issue and gave no figure.
- TX-006 competitor: null. "Doing it internally" / "building in-house" is a build-vs-buy alternative, not a named vendor, so it's logged under objections instead.
- Referenced-but-absent decision-makers (CEO, CFO, COO, exec team) are tagged "(referenced, not present)" since they weren't in the speaker list but were named by the prospect. If you want stakeholders restricted to only speakers who actually spoke, say so and I'll drop those.
Top 3 deals closest to signature 1) Deal-547B2B — $11,200 (Alex Franklin, DS5/COMMIT) Why close: Highest-confidence signal in the data. Slack (Alex, 09-04 09:12): redlines came back clean, signing page is out, and their VP People said they're signing tomorrow. CRM close date 2026-09-11 aligns. "Signature-imminent." What's left: Countersignature/execution on the signing page. Effectively nothing but the click. 2) Deal-403845 — $9,000 (Alex Franklin, DS5/COMMIT) Why close: Slack (Dana, 09-04 10:02) says it's "moving fine" with the order form already sitting with the buyer's finance team. DS5/COMMIT with a near close date (2026-09-11). Order form out = late-stage. What's left: Finance sign-off and return of the executed order form. Note: CRM lists the owner as Alex Franklin; Dana refers to it as "on my side." That owner discrepancy should be reconciled. 3) Deal-B7EBD1 — $9,000 (Dana Mercer, DS5/COMMIT) Why close: No Slack update, so ranked on CRM signals alone: DS5 (latest stage) + COMMIT forecast + the earliest close date in the file (2026-09-10). Strongest purely-CRM candidate. What's left: Unknown from provided data — no Slack confirmation of paperwork status. Needs a status check. Note on exclusions: Deal-2465CE (DS5/COMMIT, $5,400) is explicitly being pulled from commit — champion left, procurement froze; now Q4. Its CRM record is stale. Deal-D348E1 and Deal-A2B47C are only "warm / normal legal pace," not signature-ready. (Word count: ~215)
I have everything I need in the provided files. Note: deal amounts were requested but no amount field exists in the data.
Analysis of each candidate (prospect voice only):
TG-001 — Deal-EC3025
Quote: "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." (Prospect, IT Security Lead)
Docs check: "SCIM user provisioning ... NOT currently listed as supported capabilities."
Classification: REAL GAP. SCIM is not offered on any tier, so it cannot be resolved by an upgrade (plan gate) or by training (enablement). It is an absent capability.
TG-002 — Deal-D0D6B5
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." (Prospect, HRIS Manager)
Docs check: "ADP Workforce Now integrations are NOT currently listed as supported capabilities." Supported HRIS are Workday, BambooHR, Gusto, Rippling only.
Classification: REAL GAP. ADP Workforce Now is not supported on any tier — not gated behind a plan, absent entirely.
TG-003 — Deal-CFE7F4
Quote: "I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?" (Prospect, VP People)
Docs check: "Custom report builder" = Enterprise only (Core —, Pro —, Enterprise yes).
Classification: PLAN GATE. The capability exists; it is locked to the Enterprise tier. Resolved by upgrade, not by building anything new.
TG-004 — Deal-84DBA6
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." (Prospect, People Ops Manager)
Docs check: Slack integration = supported on all plans; it is already turned on.
Classification: ROLLOUT/ENABLEMENT ISSUE. The product works; the barrier is untrained managers. Fixed by enablement, not product.
TG-005 — Deal-36C33F
The native-mobile-app statement ("we don't have a native mobile app for hourly workers yet") is spoken by Alex Franklin, the rep — not prospect voice, so it does not qualify as a candidate. The only prospect line here ("The web version should be fine ... for now") raises no gap.
Classification: EXCLUDED (rep language, not prospect voice).
Missing data: No deal amount field is present in transcripts_gaps.csv, so amounts cannot be reported for any deal without inventing numbers.
════════════════════════════════════════
SUMMARY — TRUE PRODUCT GAPS (real gaps only)
════════════════════════════════════════
1. Deal-EC3025 — SCIM user provisioning
Prospect (IT Security Lead): "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management."
Amount: NOT IN DATA.
2. Deal-D0D6B5 — ADP Workforce Now integration
Prospect (HRIS Manager): "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us."
Amount: NOT IN DATA.
Count: 2 real gaps of 5 candidates reviewed (1 plan gate, 1 enablement issue, 1 excluded as rep language).
The join is complete. One methodology note before the results: I excluded future-dated engagement fields (some `last_meeting` values are after the 2026-09-05 snapshot, e.g. scheduled meetings) from the "most recent contact" calculation — a future meeting is not a *logged* past touch, so it can't count toward recency. All recency is computed as snapshot − max(last_email, last_call, last_meeting), using only dates ≤ snapshot. STALE OPEN DEALS (no logged email/call/meeting in the last 7 days as of 2026-09-05) Definition applied: days since last contact > 7 (i.e. last touch on or before 2026-08-28). Days-since arithmetic = 2026-09-05 minus the most recent qualifying contact date. ═══════════════════════════════════════════════ BRYCE HARMON — 13 stale deals, total stale amount $626,243.00 ═══════════════════════════════════════════════ alias stage amount days since last contact Deal-2D1F1B DS1 $240,000.00 81 (last email 06-16; 2026-09-05 − 2026-06-16 = 81) Deal-66D1FC DS1 $ 99,000.00 16 (last email 08-20; 09-05 − 08-20 = 16) Deal-950043 DS1 $ 70,000.00 19 (last email 08-17; = 19) Deal-B23205 DS1 $ 45,000.00 16 (last email/meeting 08-20; = 16) Deal-7BBDFA DS3 $ 37,440.00 46 (last email 07-21; = 46) Deal-332637 DS2 $ 36,000.00 9 (last email 08-27; = 9) Deal-1BEEBF DS1 $ 31,500.00 19 (last email 08-17; = 19) Deal-C5658B DS1 $ 23,400.00 16 (last email 08-20; = 16) Deal-40522D DS3 $ 21,000.00 19 (last email 08-17; = 19) Deal-F0EBBB DS3 $ 11,400.00 24 (last email 08-12; = 24) Deal-E25A09 DS1 $ 6,000.00 9 (last email 08-27; = 9) Deal-C9C286 DS2 $ 5,502.00 9 (last email 08-27; = 9) Deal-012CB1 DS1 $ 1.00 23 (last email 08-13; = 23) ═══════════════════════════════════════════════ DANA MERCER — 14 stale deals, total stale amount $261,645.00 ═══════════════════════════════════════════════ alias stage amount days since last contact Deal-44EA29 DS2 $ 60,000.00 10 (last email 08-26; = 10) Deal-E51FB7 DS2 $ 43,875.00 12 (last call 08-24; = 12) Deal-B42F46 DS1 $ 27,000.00 19 (last email 08-17; = 19) Deal-BA3DDC DS3 $ 23,400.00 15 (last call 08-21; = 15) Deal-9DDE86 DS2 $ 20,000.00 15 (last email 08-21; = 15) Deal-215CCA DS3 $ 18,900.00 17 (last meeting 08-19; = 17) Deal-5EED42 DS3 $ 16,250.00 11 (last email/call 08-25; = 11) Deal-57887A DS2 $ 15,000.00 8 (last email 08-28; = 8) Deal-B7EBD1 DS5 $ 9,000.00 16 (last email 08-20; = 16) Deal-3974EB DS4 $ 9,000.00 8 (last email/meeting 08-28; = 8) Deal-F40F04 DS2 $ 8,100.00 15 (last email/meeting 08-21; = 15) Deal-87DDD1 DS1 $ 5,000.00 19 (last email 08-17; = 19) Deal-F336B6 DS3 $ 4,200.00 15 (last email 08-21; = 15) Deal-0660B4 DS4 $ 1,920.00 16 (last meeting 08-20; = 16) ═══════════════════════════════════════════════ COLE INGRAM — 18 stale deals, total stale amount $252,905.03 ═══════════════════════════════════════════════ alias stage amount days since last contact Deal-D04904 DS2 $ 58,529.25 11 (last email 08-25; = 11) Deal-B25F40 DS3 $ 40,000.00 8 (last email 08-28; = 8) Deal-813836 DS2 $ 32,175.00 11 (last email 08-25; = 11) Deal-1BA595 DS2 $ 31,750.00 11 (last email 08-25; = 11) Deal-CFE1E8 DS3 $ 18,000.00 11 (last email 08-25; = 11) Deal-CD47A6 DS2 $ 12,168.00 11 (last email 08-25; = 11) Deal-627646 DS3 $ 11,193.00 11 (last email 08-25; = 11) Deal-FF809F DS2 $ 7,781.20 11 (last email 08-25; = 11) Deal-AF932D DS2 $ 7,225.40 11 (last email 08-25; = 11) Deal-A71728 DS2 $ 6,947.50 11 (last email 08-25; = 11) Deal-8BC9F5 DS2 $ 5,616.00 10 (last email 08-26; = 10) Deal-175395 DS3 $ 4,779.88 11 (last email 08-25; = 11) Deal-481E24 DS3 $ 4,140.00 10 (last call 08-26; = 10) Deal-C7F9BF DS2 $ 3,360.00 11 (last email 08-25; = 11) Deal-2F3A66 DS3 $ 3,334.80 11 (last email 08-25; = 11) Deal-342E96 DS2 $ 2,700.00 24 (last email 08-12; = 24) Deal-E568D5 DS3 $ 1,875.00 11 (last email 08-25; = 11) Deal-FD9F4E DS5 $ 1,330.00 10 (last email 08-26; = 10) ═══════════════════════════════════════════════ ALEX FRANKLIN — 18 stale deals, total stale amount $102,336.00 ═══════════════════════════════════════════════ alias stage amount days since last contact Deal-CC08D1 DS1 $ 24,000.00 16 (last email 08-20; = 16) Deal-E73427 DS3 $ 18,000.00 10 (last email/meeting 08-26; = 10) Deal-885F45 DS2 $ 9,300.00 12 (last email 08-24; = 12) Deal-C2FF3C DS1 $ 8,316.00 10 (last email 08-26; = 10) Deal-0D2F7A DS3 $ 5,100.00 12 (last call 08-24; = 12) Deal-6C60D4 DS3 $ 4,800.00 12 (last call 08-24; = 12) Deal-13FEBD DS2 $ 4,680.00 12 (last call 08-24; = 12) Deal-9D0060 DS3 $ 3,840.00 12 (last email 08-24; = 12) Deal-690476 DS2 $ 3,600.00 18 (last call 08-18; = 18) Deal-C6D97A DS4 $ 3,240.00 8 (last email 08-28; = 8) Deal-EE195F DS3 $ 3,120.00 8 (last email 08-28; = 8) Deal-278DEC DS3 $ 2,700.00 8 (last email 08-28; = 8) Deal-635B8E DS3 $ 2,600.00 18 (last email 08-18; = 18) Deal-6883F3 DS1 $ 2,400.00 16 (last email 08-20; = 16) Deal-4A13AD DS3 $ 2,160.00 26 (last email 08-10; = 26) Deal-F67D31 DS2 $ 1,800.00 8 (last email 08-28; = 8) Deal-5FDCE4 DS3 $ 1,600.00 12 (last email 08-24; = 12) Deal-BA571A DS4 $ 1,080.00 18 (last email 08-18; = 18) ═══════════════════════════════════════════════ PER-OWNER SUMMARY (owners ordered by total stale amount desc) ═══════════════════════════════════════════════ Owner Stale deals Total stale amount Bryce Harmon 13 $626,243.00 Dana Mercer 14 $261,645.00 Cole Ingram 18 $252,905.03 Alex Franklin 18 $102,336.00 ───────────────────────────────────────────── TOTAL 63 $1,243,129.03 DATA GAPS / CAVEATS (stated explicitly, not invented) - Two open deals have NO row in the engagements table, so their last email/call/meeting cannot be computed at all. They are therefore not classified as fresh or stale — status unknown: • Deal-3EED2C — owner Alex Franklin — DS2 — $7,200.00 (created 2026-09-03; no engagement record) • Deal-57FF13 — owner Elena Sinclair — DS1 — $2,100.00 (no engagement record; also missing last_contacted_field/n_contacts in the deal row) If you want a conservative treatment, both would count as stale-by-absence (no logged contact of any kind), which would add Deal-3EED2C ($7,200) to Alex Franklin → 19 deals / $109,536.00, and create a new line for Elena Sinclair → 1 deal / $2,100.00. I've left them out of the totals above pending your call, since "no row" ≠ "confirmed no contact." - Owners Farid Osman (716654662) and Elena Sinclair (701163055): all of Farid's open deals were contacted within 7 days (not stale); Elena's only open deal is the no-engagement-row case above. - Per your instruction, recency ignores the deal-level `last_contacted_field` entirely; it's computed solely from the engagements table. Want me to fold the two no-engagement-row deals into the stale totals (conservative treatment), or keep them broken out as "unknown"?
All 158 engagement rows joined to a deal owner (none dropped). Results below. METHODOLOGY - Snapshot: 2026-09-05. "Last 30 days" = t_ds2 with 0 ≤ (snapshot − t_ds2) ≤ 30 days, i.e. t_ds2 on/after 2026-08-06. - Activities = emails_30d + calls_30d + meetings_30d, summed per owner across all their deals in engagements_by_deal_90d.csv. - Efficiency ratio = total activities ÷ DS2 entries (lower = more efficient). - Owners are joined via deals_open.csv (owner_id) → owners.csv (name). PER-REP TOTALS (last 30 days) Alex Franklin (84342457) Emails 307, Calls 36, Meetings 41 → Total 384 Mix: 79.9% email / 9.4% call / 10.7% meeting DS2 entries: 26 Activities per DS2 = 384 ÷ 26 = 14.77 Cole Ingram (83155924) Emails 96, Calls 14, Meetings 1 → Total 111 Mix: 86.5% email / 12.6% call / 0.9% meeting DS2 entries: 6 Activities per DS2 = 111 ÷ 6 = 18.50 Dana Mercer (83155923) Emails 84, Calls 18, Meetings 11 → Total 113 Mix: 74.3% email / 15.9% call / 9.7% meeting DS2 entries: 5 Activities per DS2 = 113 ÷ 5 = 22.60 Bryce Harmon (119337721) Emails 162, Calls 0, Meetings 43 → Total 205 Mix: 79.0% email / 0.0% call / 21.0% meeting DS2 entries: 5 Activities per DS2 = 205 ÷ 5 = 41.00 Farid Osman (716654662) Emails 38, Calls 0, Meetings 34 → Total 72 Mix: 52.8% email / 0.0% call / 47.2% meeting DS2 entries: 1 Activities per DS2 = 72 ÷ 1 = 72.00 EFFICIENCY RANKING (lowest activities per DS2 = most efficient) 1. Alex Franklin — 14.77 2. Cole Ingram — 18.50 3. Dana Mercer — 22.60 4. Bryce Harmon — 41.00 5. Farid Osman — 72.00 MOST EFFICIENT vs HIGHEST VOLUME - Most efficient rep: Alex Franklin (14.77 activities per DS2 entry). - Highest-volume rep: Alex Franklin (384 total activities). - They do NOT differ — Alex Franklin is both the most efficient and the highest-volume rep in this dataset. DATA NOTES - Two owners in owners.csv with deals but no engagement rows in the 30-day activity file: Elena Sinclair (701163055, 1 deal, DS1) and — note Farid Osman has 6 deals but only 1 engagement row present. Owners Gavin Porter and Hugo Lindqvist are archived and have no deals. No fabrication: reps with zero activities in the engagements file are simply absent from the totals above. - All 158 engagement records matched a deal owner (0 unmatched).
All figures computed from the provided data. Here is the scorecard.
======================================================
QTD SCORECARD — Alex Franklin — as of 2026-09-05 (2026-Q3)
======================================================
1) BOOKINGS vs QUOTA
Bookings (closed-won, close_date 2026-07-01..2026-09-05): $150,000
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
Sum = 40,000+20,000+35,000+21,000+12,000+11,000+6,500+4,500 = 150,000
Quota (2026-Q3): $200,000
Attainment = 150,000 / 200,000 = 75.0%
Excluded per instruction (closed-won dated before quarter start):
Deal-B3E6F1 2026-06-20 $24,000 (pre-Q3, not counted)
2) NEW vs EXPANSION SPLIT (of the $150,000 bookings)
New: 5 deals $113,500 (40,000+35,000+21,000+11,000+6,500) = 75.7%
Expansion: 3 deals $ 36,500 (20,000+12,000+4,500) = 24.3%
Check: 113,500 + 36,500 = 150,000 ✓
3) ACTIVE PIPELINE BY STAGE (open deals)
DS1: 20 deals $ 284,621
DS2: 28 deals $ 353,760
DS3: 67 deals $ 552,705
DS4: 5 deals $ 23,574
DS5: 5 deals $ 45,730
TOTAL: 125 deals $1,260,390
4) ROLLING 90-DAY DS2→WON RATE
Window: 2026-06-07 .. 2026-09-05 (90 days ending as-of date)
Method: deals whose entered_ds2 falls in the window (denominator) vs. those that are won (numerator).
Entered DS2 in window: 111
Won among them: 8
Rate = 8 / 111 = 7.2%
5) WIN & LOSS COUNTS (deals closed in Q3, 2026-07-01..2026-09-05)
Wins: 8
Losses: 27
Count win rate = 8 / (8+27) = 8/35 = 22.9%
Loss-reason breakdown:
13x Lost- Timing (1 year or more) <-- TOP (13/27 = 48%)
5x MIA
5x Competitor
2x Lost DM
1x Feature Request
1x Lost- Does not fit ICP
6) ACTIVITY VOLUME — LAST 30 DAYS (by type, summed across the book from *_30d fields)
Emails: 807
Calls: 112
Meetings: 128
Notes: 50
Total touches: 1,097
------------------------------------------------------
COACHING OBSERVATIONS (grounded in the numbers)
------------------------------------------------------
1) Half of all losses are timing, not "no." 13 of 27 losses (48%) are "Lost- Timing (1 year or more)." That's not a competitive or fit problem — it's a qualification/sequencing problem. These should be routed to a nurture cadence with dated re-engagement, not scored as dead. Reclaiming even a third of them is worth more than net-new prospecting given the volume.
2) Throughput is the bottleneck, not top-of-funnel. The DS2→won rate is 7.2% (8/111) and the count win rate is 22.9% (8/35). With $1.26M of open pipeline concentrated in DS2 ($353,760) and DS3 ($552,705) — 72% of pipeline dollars — the deals exist but aren't converting through the middle. Coaching should focus on advancing DS2/DS3 deals, not adding more.
3) Activity is high-volume but email-heavy and light on live conversations. In 30 days: 807 emails vs 112 calls and 128 meetings — roughly 7 emails per call. Given that "MIA" (5) and "Lost DM" (2) account for 7 losses tied to disengagement/access, the email-first pattern likely correlates with going dark. Rebalancing toward multi-threaded meetings and calls on active DS2/DS3 deals directly addresses both the MIA losses and the mid-funnel conversion gap.
Note on assumptions (stated per your "say so if missing" instruction): Amounts are treated as booking value as given; there is no separate ARR/TCV field. The 90-day DS2→won denominator uses entered_ds2 within the trailing window; deals with a blank entered_ds2 (all DS1) are excluded from that metric. Activity is aggregated across all deals in the book because the engagement file provides only trailing-30-day per-deal counts with no per-touch dates.
DATA GAP — READ FIRST The task asks for each flagged deal's amount and stage. Neither field exists anywhere in the two provided files (deal_contacts.csv has no amount/stage columns; unengaged_contacts.csv has none either). I cannot supply them and will not invent them. Both are marked "NOT ON FILE" for every deal below. Reference date: 2026-09-05 (today). Active = not is_former AND last_engaged within 60 days (on/after 2026-07-07). Because stage is missing, "most valuable persona to add given the stage" cannot be anchored to a real stage. I give a stage-independent recommendation based on which high-leverage persona is absent, and flag the missing-stage caveat each time. FLAGGED DEALS (10 of 13 open deals) 1) Deal-EC3025 — company C-FDD0C7 - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 1 (CT-047C54, champion; the economic buyer CT-F2C1AE is is_former=true → excluded) - Personas present: champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer (single-threaded on a champion only; no buying authority engaged). Stage caveat: stage missing. - Unengaged fit on file: YES — CT-6827DB, Chief People Officer (economic buyer). Directly fills the top gap. 2) Deal-92D97D — company C-E23238 - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 1 (CT-01F5B4, HR admin; champion CT-A902AE last engaged 2026-06-01 = 96 days ago → inactive) - Personas present: HR admin - Personas missing: economic buyer, champion, IT security, finance - Most valuable persona to add: champion (only an HR admin is active — no advocate driving the deal), closely followed by economic buyer. Stage caveat: stage missing. - Unengaged fit on file: none on file (no rows for C-E23238 in unengaged_contacts.csv). 3) Deal-50D386 — company C-EB10E4 - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 2 (CT-AA41B2 champion, CT-B9C35B HR admin) - Personas present: HR admin, champion - Personas missing: economic buyer, IT security, finance - Most valuable persona to add: economic buyer (no buying authority engaged). Stage caveat: stage missing. - Unengaged fit on file: YES — CT-A1C4B3, Chief People Officer (economic buyer). Fills the gap. 4) Deal-D0D6B5 — company C-32918E - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 3 (CT-87CED4, CT-DE6D7C, CT-FD70B2 — all champions) - Personas present: champion (all 3 contacts in ONE persona → under-threaded by the single-persona rule) - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer (three champions, zero authority). Stage caveat: stage missing. - Unengaged fit on file: YES — CT-1FA4DB, Chief People Officer (economic buyer). Fills the gap. 5) Deal-5BFE3B — company C-535D36 - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 2 (CT-57123B, CT-5CE757 — both champions) - Personas present: champion (both in one persona → under-threaded) - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer (two champions, no authority). Stage caveat: stage missing. - Unengaged fit on file: none on file (no rows for C-535D36). 6) Deal-885F45 — company C-5E8EFB - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 2 (CT-51C81E economic buyer, CT-D9A0E8 champion) - Personas present: champion, economic buyer - Personas missing: HR admin, IT security, finance - Most valuable persona to add: IT security (buyer + champion already covered; security review is the usual next gate for HR/people-tech). Stage caveat: stage missing — if late-stage, finance could rival this. - Unengaged fit on file: YES — CT-B3F25D, IT Security Lead (IT security). Fills the recommended gap exactly. 7) Deal-FCBE5B — company C-737030 - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 1 (CT-4A5317, champion) - Personas present: champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer (single-threaded on champion only). Stage caveat: stage missing. - Unengaged fit on file: none on file (no rows for C-737030). 8) Deal-5408B0 — company C-2AE3AA - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 2 (CT-D33AE4 champion, CT-8742FD HR admin) - Personas present: HR admin, champion - Personas missing: economic buyer, IT security, finance - Most valuable persona to add: economic buyer (no buying authority engaged). Stage caveat: stage missing. - Unengaged fit on file: YES — CT-07FA76, Chief People Officer (economic buyer). Fills the gap. 9) Deal-C6D97A — company C-5A8FC2 - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 3 (CT-223DDC, CT-B03555, CT-4E8A2B — all champions) - Personas present: champion (all 3 in one persona → under-threaded by single-persona rule) - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer (three champions, zero authority). Stage caveat: stage missing. - Unengaged fit on file: none on file (no rows for C-5A8FC2). 10) Deal-F9A08A — company C-0D15DF - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 1 (CT-931B10, champion; economic buyer CT-913581 last engaged 2026-06-20 = 77 days ago → inactive) - Personas present: champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer (single-threaded on champion; the on-file buyer has gone cold). Stage caveat: stage missing. - Unengaged fit on file: YES — CT-697541, Chief People Officer (economic buyer). Note: a different economic-buyer contact (CT-913581) already exists on this deal but is inactive — re-engaging that one is the cheaper first move, with CT-697541 as backup. NOT FLAGGED (healthy — 3 deals, shown for completeness) - Deal-4B0BEB (C-1BDFE0): 4 active, 4 personas (HR admin, champion, economic buyer, finance). - Deal-84DBA6 (C-BE9BE0): 3 active, 3 personas (IT security, champion, economic buyer). - Deal-D348E1 (C-804F29): 5 active, all 5 personas. ARITHMETIC / METHOD NOTES - 60-day cutoff from 2026-09-05 = engaged on/after 2026-07-07 counts as active. - Inactive exclusions applied: Deal-92D97D CT-A902AE (2026-06-01, 96d), Deal-F9A08A CT-913581 (2026-06-20, 77d). - is_former=true exclusions applied: Deal-EC3025 CT-F2C1AE; Deal-36C33F CT-405B45 and CT-86B22F. - Under-threaded rule fired on single-persona clusters even at count ≥3: Deal-D0D6B5 and Deal-C6D97A (3 champions each). ONE MORE FLAGGED DEAL I owe you — I listed 10 but the scan found an 11th: 11) Deal-36C33F — company C-077A0E - Amount: NOT ON FILE | Stage: NOT ON FILE - Active contact count: 1 (CT-4FE556, IT security; champion CT-405B45 and economic buyer CT-86B22F are both is_former=true → excluded) - Personas present: IT security - Personas missing: economic buyer, champion, HR admin, finance - Most valuable persona to add: champion (deal is single-threaded on a security contact with no advocate and no authority; a champion is the prerequisite to rebuild the deal), with economic buyer as the immediate follow. Stage caveat: stage missing. - Unengaged fit on file: PARTIAL — CT-1DB73E, Chief People Officer (economic buyer) is on file. It fits a missing persona (economic buyer) but NOT the single most-valuable one I named (champion). No unengaged champion is on file for C-077A0E. Total: 11 of 13 open deals flagged. The two things I could not provide for any deal — amount and stage — are absent from the source data.
Rep: Alex Franklin. Basis: 10 calls (TT-001 through TT-010).
WHAT HE LEADS WITH (first five minutes)
His minute-0 opener is a scripted customer-proof story in 7 of 10 calls, quoted once:
"Quick one to kick off: a 400-person retailer we work with cut regretted turnover 18% in two quarters after automating milestone awards, and I wanted to walk you through exactly how they did it." (TT-001, TT-002, TT-003, TT-005, TT-006, TT-007, TT-008, TT-010)
The other 3 open differently: an agenda ("I put together a short agenda — security review first, then pricing." TT-004), a competitor jab ("And unlike Workhuman, our pricing includes the full rewards catalog with no extra margin." TT-005 min 2 — this call has both), and a pricing-first callback ("You asked for straight pricing last time, so let's start there." TT-009).
THE THREE MOST COMMON OBJECTIONS AND HOW HE HANDLES THEM
1. Budget locked / no line item (4 calls: TT-001, TT-003, TT-006, TT-010)
Objection: "Honestly, budget is locked until next fiscal year — I can't add a new line item right now."
Handling: "Totally fair. Most teams fund this out of turnover savings — that retailer saved about $210k in avoided backfills, which is how their finance team signed off." (funds-it-from-savings reframe)
2. Revisit next quarter / open enrollment (3 calls: TT-002, TT-005, TT-008)
Objection: "This is good, but can we revisit it next quarter? Open enrollment starts in October and we're underwater."
Handling: "Makes sense. What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?" (pilot to create urgency + data)
3. Status quo (spreadsheet + gift cards) (3 calls: TT-004, TT-007, TT-009)
Objection: "We already do recognition with a spreadsheet and quarterly gift cards — why would we change?"
Handling: "Spreadsheets work until they scale — the difference is automation: milestones fire without HR lifting a finger, and you get analytics on who is being recognized." (automation + analytics contrast)
NEXT-STEP AGREEMENT RATE
7 of 10 = 70%.
Arithmetic: agreed = TT-001, TT-002, TT-003, TT-005, TT-006, TT-008, TT-009 (7). Not agreed = TT-004, TT-007, TT-010 (3). 7 ÷ 10 = 0.70 = 70%. The agreed line each time: "Yes, Thursday at 2pm works — send the invite and I'll bring our HRIS manager."
COMPETITORS A PROSPECT RAISED
Only two, each once (competitors mentioned by the rep himself are excluded):
- Awardco — TT-003 (Deal-547B2B): "We're also in late talks with Awardco — their rewards catalog looks bigger than yours."
- Kudos — TT-007 (Deal-EDC141): "How are you different from Kudos? Our CEO used them at her last company."
(Note: Workhuman appears in TT-005 but was named by the rep, not a prospect, so it is not counted here.)
COACHING NOTES
1. Convert stalls into pilots consistently. All 3 lost next-steps (TT-004, TT-007, TT-010) ended with passive closes — "Understood — I'll leave it with you.", "Fair enough.", "Understood, thanks for the candor." — and none deployed the 90-day-pilot move that helped land the 3 "revisit next quarter" calls. Reuse the pilot reframe against the committee/status-quo/no-urgency stalls too.
2. Handle competitor mentions with a proof point, not just a claim. Both competitor rebuttals (TT-003 Awardco, TT-007 Kudos) asserted differentiation on "automation and analytics" but cited no evidence, unlike the budget rebuttal that anchors on the concrete "$210k in avoided backfills." Attach a metric or customer example when displacing Awardco/Kudos.
# Q3 2026 Forecast (quarter = 2026-07-01 to 2026-09-30) Weighting rule: 100% of COMMIT + 35% of BEST_CASE. PIPELINE = 0. Only deals with close_date inside the quarter count. ## Headline numbers COMMIT total (in quarter): $44,729.00 (7 deals) BEST_CASE total (in quarter): $203,565.00 (24 deals) PIPELINE (in quarter): $0 weighted (23 deals, excluded by rule) Weighted forecast: = (COMMIT × 1.00) + (BEST_CASE × 0.35) = (44,729.00 × 1.00) + (203,565.00 × 0.35) = 44,729.00 + 71,247.75 = **$115,976.75** ## In-quarter deal counts by category COMMIT: 7 deals BEST_CASE: 24 deals PIPELINE: 23 deals Total in-quarter: 54 deals ## Excluded — close_date outside the quarter (after 2026-09-30) Count: 32 deals Total amount: $227,575.00 Breakdown: PIPELINE: 22 deals — $185,565.00 BEST_CASE: 9 deals — $28,240.00 COMMIT: 1 deal — $13,770.00 (Deal-D348E1, DS5, close 2026-10-15) Note: the excluded COMMIT deal (Deal-D348E1, $13,770) would have added directly to the weighted forecast had its close date fallen in-quarter — worth flagging to the deal owner in case the date is wrong. ## Top 5 BEST_CASE deals in-quarter (by amount) 1. Deal-2D7423 — $38,935.00 — DS3 — 2026-09-30 2. Deal-25F752 — $24,000.00 — DS4 — 2026-09-25 3. Deal-E53952 — $19,656.00 — DS4 — 2026-09-30 4. Deal-5EED42 — $16,250.00 — DS3 — 2026-09-30 5. Deal-FA32A0 — $11,116.00 — DS3 — 2026-09-25 Sum of top 5 = 38,935 + 24,000 + 19,656 + 16,250 + 11,116 = $109,957.00 (54% of the in-quarter BEST_CASE total). ## Data quality The extract has no owner assigned on 85 of 86 rows, so accountability, routing, and any owner-level roll-up are impossible and category hygiene cannot be trusted. Forecast categories conflict with pipeline stages — Deal-A5E80A is tagged COMMIT while still at DS1 (discovery) and Deal-499BF6 is COMMIT at DS2 — which inflates the highest-confidence bucket with early-stage deals. In-quarter BEST_CASE is heavily concentrated (the top 5 of 24 deals are 54% of the bucket, and Deal-2D7423 alone is a DS3 deal closing on the very last day of the quarter, 2026-09-30), and a cluster of deals sits on the close-date boundary, so small date slips would materially swing the number. Finally, 71 of 86 deals have zero "why_buys" content (no qualification narrative) and one amount is a suspicious non-integer ($2,480.40), both signs of thin/incomplete data that make these categories unsafe to weight unattended.
ACTIVATION HYPOTHESIS TEST — plg_company_cohort_2023.csv Definitions used (as specified): - Giver signal = m1_users >= 5 - Redemption signal = m1_redemptions >= 1 - Retained at 24m = current_status == 'active'. (non_renewing and cancelled are both counted as NOT retained, since neither equals 'active'.) THE 2x2 (all 220 companies) Quadrant Cohort size Retained (active) 24-mo retention -------------------------------------------------------------------------- Both signals 47 31 66.0% Givers-only 49 23 46.9% Redemption-only 29 9 31.0% Neither 95 38 40.0% -------------------------------------------------------------------------- Total 220 101 Arithmetic: - Both: 31/47 = 0.6596 = 66.0% - Givers-only: 23/49 = 0.4694 = 46.9% - Redemption-only: 9/29 = 0.3103 = 31.0% - Neither: 38/95 = 0.4000 = 40.0% - Cell sizes sum: 47 + 49 + 29 + 95 = 220 (every row is assigned to exactly one cell). EXCLUSIONS FROM THE DENOMINATOR None. All 220 companies in the extract were classified into one of the four cells and retained in the denominator. Per the prompt, every company is 25+ months old, so all are eligible for a 24-month retention read. Note: 3 companies carry status 'non_renewing' (C-0B2078FB, C-0A96134F, C-0BEAF685) — these were kept in their denominators and scored as not-retained, because the prompt defines retained strictly as 'active'. SINGLE SIGNAL WITH THE LARGEST RETENTION LIFT The giver signal (m1_users >= 5). Measured two ways, both point to givers: - As standalone quadrants: givers-only 46.9% vs redemption-only 31.0% (givers-only is +15.9 pts higher). - As a lift vs the "neither" baseline of 40.0%: givers-only = +6.9 pts; redemption-only = −9.0 pts (redemption-only actually retains BELOW the no-signal baseline). Either framing names givers as the stronger single signal; the lone redemption signal shows no positive lift. WHAT THIS DOES SHOW - In this cohort, companies with BOTH signals retained best (66.0%), a +26.0 pt lift over the no-signal baseline (40.0%) and clearly above either single-signal cell. The directional pattern is consistent with the activation hypothesis that both-signal accounts retain better. - The two signals are not equivalent: the giver-breadth signal is associated with higher retention, while a lone redemption signal is not (it sits below the no-signal cell). WHAT THIS DOES NOT SHOW - Not causal. This is observational; nothing here proves that engineering more givers or redemptions causes retention. Confounders (tier, ARR, industry, product fit) are uncontrolled. - No statistical significance was tested. Cells are small (redemption-only n=29, both n=47); the 31.0% redemption-only rate rests on just 9 retained of 29 and is fragile to a few accounts. - The "neither" cell (n=95) is heterogeneous — it mixes low-user accounts with genuinely dead ones (e.g. zero m1 activity) — so the 40.0% baseline is not a clean control. - Single cohort window (2023-01 through 2023-07 signups), single product, self-serve/PLG-style data; no external validity beyond this extract. - The both-signal cell partly reflects that "5+ givers AND a redemption" selects for already-engaged accounts; the analysis can't separate activation from pre-existing intent/fit. Bottom line: the data are directionally consistent with the both-signal activation hypothesis and identify givers as the stronger single lever, but this is correlational, untested for significance, and built on small, uncontrolled cells — it is a hypothesis-supporting signal, not proof.
ARR RECONCILIATION — as of 2026-09-05 Billing ARR defined as MRR × 12 across all subscription records. TOTALS CRM total (39 company records): $603,581.76 Billing total (39 subscriptions, MRR×12): $617,897.76 Variance (CRM − Billing): −$14,316.00 VARIANCE DECOMPOSITION (sums exactly to −$14,316.00) Missing records: −$11,952.00 Status mismatch: $0.00 (numeric; see note) Rounding: +$36.00 Other: −$2,400.00 ───────────────────────────────── Total: −$14,316.00 ✓ BUCKET DETAIL / MISMATCHED ACCOUNTS Missing records (−$11,952.00) C-0D5BBE3A CRM $16,497.24, no billing subscription → billing understated by +$16,497.24. Suggested owner: Billing/RevOps (create or link Chargebee subscription). C-21629AA4 Billing $28,449.24 (SUB-0004, MRR 2370.77×12), no CRM company record → −$28,449.24. Suggested owner: Sales/CRM Admin (create HubSpot company record). Net: +16,497.24 − 28,449.24 = −$11,952.00 Rounding (+$36.00) C-0D66DF9E CRM $23,200.00 vs Billing $23,184.00 (1932.00×12) → +$16.00. Suggested owner: RevOps (align CRM ARR to billing). C-14D70CE0 CRM $18,200.00 vs Billing $18,180.00 (1515.00×12) → +$20.00. Suggested owner: RevOps. Net: 16.00 + 20.00 = +$36.00 Other (−$2,400.00) C-0F7269D7 CRM $24,396.00 vs Billing $26,796.00 (2233.00×12) → −$2,400.00. Not a rounding-scale delta; too large to be rounding and no status/record issue. Root cause not determinable from provided data — flagging as OTHER for investigation. Suggested owner: RevOps + Account Owner (reconcile plan/quantity difference). Status mismatch ($0.00 numeric — qualitative flag) C-0C8323BF SUB-000E status=cancelled, MRR 408.77×12 = $4,905.24; CRM still carries $4,905.24. Values match, so no numeric variance, but subscription is cancelled while CRM ARR remains active. Suggested owner: RevOps/CS (zero out CRM ARR if truly churned). C-0DC4FB8C SUB-000F status=cancelled, MRR 687.77×12 = $8,253.24; CRM still carries $8,253.24. Same qualitative mismatch, $0 numeric impact. Suggested owner: RevOps/CS. Note: Because both cancelled subs are still valued identically in CRM and billing, they contribute $0 to the numeric variance. If your convention excludes cancelled subs from billing ARR, they would instead move −$13,158.48 into this bucket and correspondingly change the totals — flagging the convention dependency explicitly rather than assuming. TERM-RULE VIOLATIONS Business rule: any subscription with term ≠ 12 months must have cf_agreement_end_date populated. Violations: SUB-0002 C-1794A52C term 24 cf_agreement_end_date = EMPTY → VIOLATION SUB-0019 C-22170CA1 term 36 cf_agreement_end_date = EMPTY → VIOLATION Compliant non-12-month subs (for reference): SUB-000C (24mo), SUB-001A (36mo) — both populated with 2027-11-30. ARITHMETIC NOTES CRM total = sum of 39 hubspot_arr values = $603,581.76 Billing total = sum of 39 (MRR×12) = $617,897.76 Variance = 603,581.76 − 617,897.76 = −14,316.00 Bucket check: −11,952.00 + 0.00 + 36.00 + −2,400.00 = −14,316.00 ✓ DATA-LIMITATION CALLOUTS - No CRM ↔ subscription join key beyond company_alias; matching is by alias only. - No churn/close dates, plan names, or quantities provided, so the C-0F7269D7 −$2,400.00 delta cannot be root-caused from this data (bucketed as OTHER). - Billing ARR here includes cancelled subs by default (MRR×12 across all records, as specified). The status-mismatch treatment depends on your active-only convention (see note above).
KVM report, 2026-08 vs 2026-07 (portfolio mean across all 20 companies per month; equal-weighted, arithmetic below). | KVM | Aug value | Jul value | Abs change | Rel change | Direction | |---|---|---|---|---|---| | Giving rate | 0.6027 | 0.6023 | +0.0004 | +0.07% | flat/up | | Redemptions per user | 1.7302 | 1.7300 | +0.0002 | +0.01% | flat | | 1:1 meetings engagement | 0.4472 | 0.4469 | +0.0003 | +0.06% | flat/up | | Pulse check engagement | 0.5086 | 0.6006 | -0.0920 | -15.31% | down | Arithmetic: each value = sum of the 20 company readings / 20. Rel change = abs change / Jul value × 100. Largest relative move: pulse check engagement, -15.31%. Driving segment: enterprise (size_band). Pulse by band, Jul→Aug: smb 0.6588→0.6573 (-0.22%), mid_market 0.5930→0.5942 (+0.21%), enterprise 0.5500→0.2743 (-50.13%). All 10 enterprise companies dropped to ~0.26–0.29, while smb and mid_market were essentially flat. The decline is concentrated entirely in the enterprise band; the data supports this attribution. (plan_tier is uniformly tier_three, so it cannot differentiate.)
WEEKLY REWARDS REPORT — REDEMPTION SECTION Last completed month: 2026-08 (August 2026). Data spans 2026-01 through 2026-08; all 378 rows fall within this window, so none were excluded. Redemption count: 378 Spend: $27,846.00 Unique redeemers: 235 (distinct user_key) Redemptions per redeemer: 1.61 Arithmetic: 378 redemptions / 235 redeemers = 1.6085 Provider mix (% of spend): custom $10,873.00 = 10,873.00 / 27,846.00 = 39.05% Tremendous $ 8,505.00 = 8,505.00 / 27,846.00 = 30.54% Snappy $ 5,238.00 = 5,238.00 / 27,846.00 = 18.81% TangoCard $ 3,230.00 = 3,230.00 / 27,846.00 = 11.60% Sum: 39.05 + 30.54 + 18.81 + 11.60 = 100.00% Spend check: 10,873 + 8,505 + 5,238 + 3,230 = 27,846.00 ✓ Top 5 countries by redemptions (count): 1. US — 244 2. CA — 24 3. AU — 21 4. GB — 17 5. NL — 17 Note: GB and NL are tied at 17 redemptions each; both are shown in ranks 4–5. The next country (SG) has 12.
CHURN-SAVE ELIGIBILITY ANALYSIS — snapshot 2026-09-05 ELIGIBILITY RULES (all three must be true; AND logic) R1: health_score < 60 R2: churn_save_eligible_amount > 0 R3: renewal_date within 120 days of 2026-09-05 (i.e. on/before 2027-01-03) QUALIFYING ACCOUNTS (8) — amount at stake = churn_save_eligible_amount 1. C-0F6C0F34 — $49,707.00 R1 HS 51<60 ✓ | R2 $49,707>0 ✓ | R3 renew 2026-10-03 = 28d ✓ Play: EXECUTIVE TOUCH. Signal: champion_active=false with a large save amount and renewal in 28 days. No active champion + near-term renewal = relationship risk, not a product-value or price problem (usage is growing, util 78%). Need to rebuild an executive sponsor before renewal. 2. C-0B827671 — $25,365.00 R1 HS 56<60 ✓ | R2 $25,365>0 ✓ | R3 renew 2026-11-14 = 70d ✓ Play: USAGE REVIVAL. Signal: usage_trend_3m=declining with util 113/202 = 56%. Champion is active, so the relationship is intact; the problem is falling adoption. Drive re-engagement on unused seats. 3. C-0B360C78 — $35,748.00 R1 HS 57<60 ✓ | R2 $35,748>0 ✓ | R3 renew 2026-10-28 = 53d ✓ Play: EXECUTIVE TOUCH. Signal: usage growing and util 246/327 = 75% (healthy adoption) yet health score sits at 57 with a large save amount. Value is being realized, so this is a sentiment/relationship gap best closed by a senior check-in ahead of the 53-day renewal. 4. C-0B0F1BAB — $5,494.00 R1 HS 38<60 ✓ | R2 $5,494>0 ✓ | R3 renew 2026-09-23 = 18d ✓ Play: EXECUTIVE TOUCH. Signal: lowest health score in the qualifying set (38), champion_active=false, renewal in 18 days. Severe risk + no champion + imminent renewal = escalate to executive intervention immediately. (Usage is flat, not declining, so revival alone won't fix a 38 score with no champion.) 5. C-0CA21961 — $16,829.00 R1 HS 58<60 ✓ | R2 $16,829>0 ✓ | R3 renew 2026-12-28 = 114d ✓ Play: USAGE REVIVAL. Signal: util 84/325 = 26% — by far the worst seat utilization in the book. Champion active and 114 days of runway. Classic under-adoption: recover value from the ~241 unused seats before renewal. 6. C-0E9C27D1 — $41,235.00 R1 HS 39<60 ✓ | R2 $41,235>0 ✓ | R3 renew 2026-09-24 = 19d ✓ Play: EXECUTIVE TOUCH. Signal: HS 39 with renewal in just 19 days. Adoption is actually strong (util 134/157 = 85%, champion active), so this is not a usage problem — a very low score despite high usage points to a strategic/relationship issue requiring immediate executive engagement on a short fuse. 7. C-0CEF69FD — $32,621.00 R1 HS 53<60 ✓ | R2 $32,621>0 ✓ | R3 renew 2026-11-21 = 77d ✓ Play: EXECUTIVE TOUCH. Signal: usage growing, util 97/136 = 71% (solid), but champion_active=false with a sizeable save amount. Adoption is fine; the missing sponsor is the risk. Establish an executive relationship before the 77-day renewal. 8. C-0D3278C7 — $17,602.00 R1 HS 54<60 ✓ | R2 $17,602>0 ✓ | R3 renew 2026-11-12 = 68d ✓ Play: USAGE REVIVAL. Signal: usage_trend_3m=declining and util 126/380 = 33% (large paid seat base going unused). Champion active, so revive adoption across the ~254 idle seats. Note on COMMERCIAL CONCESSION: No documented rule maps a signal to the commercial-concession play, and no account in the qualifying set shows a price/discount driver in the provided fields (no contract-value, discount, or budget-cut field exists). I therefore did not assign commercial concession to any account — the data to justify it is not present. Play assignments above use the available adoption (usage_trend_3m, seats_used/seats) and relationship (champion_active) signals; the mapping of signals → plays is my analytical judgment, as no play-assignment rules were provided. TOTAL AT STAKE (qualifying accounts): 49,707 + 25,365 + 35,748 + 5,494 + 16,829 + 41,235 + 32,621 + 17,602 = $224,601.00 ──────────────────────────────────────── LOOK AT RISK BUT DO NOT QUALIFY Fails R2 only (churn_save_eligible_amount = 0) — at risk by health/renewal but no eligible save amount recorded: C-0BC71BDD HS 55, renew 2026-10-27 (52d) — save amount $0 → fails R2 C-0F876796 HS 47, renew 2027-02-06 (154d) — save amount $19,958 but renewal >120d → also fails R3 C-10A56B0F HS 54, renew 2026-12-12 (98d) — save amount $0 → fails R2 Fails R2 and R3 (amount $0 AND renewal beyond 120 days): C-0BA71F12 HS 52, amount $6,824, renew 2027-04-11 (218d) → fails R3 (amount>0 but renewal too far) C-0F6694C3 HS 43, amount $0, renew 2027-03-21 → fails R2 & R3 C-0BE96399 HS 54, amount $0, renew 2026-10-29 (54d) → fails R2 (renewal is near, but no eligible amount) C-0FCCD2DF HS 43, amount $0, renew 2027-04-23 → fails R2 & R3 Correcting/clarifying the two above that are near-term but $0: C-0BE96399 (HS 54, 54d, declining) and C-0BC71BDD (HS 55, 52d) look genuinely at risk on health + timing but are excluded solely because churn_save_eligible_amount = 0. C-0F876796 (HS 47, declining, util 22/95 = 23%) looks very at-risk and has a save amount, but its renewal (2027-02-06) is 154 days out, beyond the 120-day R3 window; C-0BA71F12 (HS 52, declining, amount $6,824) similarly fails R3 at 218 days. Not at risk (fail R1, health_score ≥ 60) — excluded regardless of other fields: C-8C2E8F00 (73), C-0B843542 (63), C-14264ABD (87), C-0B2895EF (73), C-0EE1203E (88), C-0FC7A215 (62), C-0D035262 (85), C-0D6CC8E3 (77), C-0B2213A9 (69), C-0D0B047C (70), C-21FEBCBB (65), C-172EEFBC (75), C-0C3848D2 (73), C-0D890324 (81), C-0AAA9434 (75). All have churn_save_eligible_amount = $0 as well. MISSING-DATA DISCLOSURES - No rules were provided mapping signals to plays (usage revival / executive touch / commercial concession). Play assignments are my analytic judgment from usage_trend_3m, seat utilization, and champion_active; treat them as recommendations, not rule-derived outputs. - No field supports the commercial-concession play (no discount, list-price, contract-value, or budget field). It cannot be justified from the data, so it was not assigned. - Amounts "at stake" are taken as churn_save_eligible_amount per the eligibility framing, not full ARR. If you intended full-ARR exposure instead, say so and I'll re-total.
I'll work through this using only the provided data. ## Expansion Kit — C-0DDFC9A7 **Seat coverage (licensed ÷ headcount)** Licensed seats: 150. Headcount: 400. 150 ÷ 400 = 0.375 = **37.5% of headcount is licensed.** **Usage health (two lines)** Active users rose every month with no decline: 88 → 95 → 102 → 110 → 118 → 126 (Mar–Aug 2026), a gain of 126 − 88 = 38 users, or 38 ÷ 88 = 43.2% growth over five months. Utilization of paid seats is now 126 ÷ 150 = 84.0%, up from 88 ÷ 150 = 58.7% in March — approaching the licensed ceiling. **Headroom in seats and ARR (at current per-seat rate)** Per-seat rate = current ARR ÷ licensed seats = 9,000.00 ÷ 150 = **$60.00 per seat/year.** Seat headroom to full headcount = 400 − 150 = **250 seats.** ARR headroom at current rate = 250 × $60.00 = **$15,000.00** (would take ARR from $9,000.00 to $24,000.00). Note: this is headroom to full headcount, not a forecast — it does not assume every employee will be licensed. **Who replied and whether they can buy** Maria S., People Operations Coordinator (last engaged 2026-09-02). She stated explicitly she is **not the purchasing decision-maker** — budget and seat expansion sit with Dana R. **The right buyer from our contacts** Dana R., VP People (last engaged 2026-05-18). Maria named her as the budget/seat-expansion owner and offered an introduction. Sam K. (Office Manager, last engaged 2025-11-03) is not indicated as a buyer. **Reply email (under 150 words)** --- Subject: RE: Growing your team's recognition program Hi Maria, Thank you — it's great to hear the team loves Bonusly and that the recognition feed stays busy. That momentum shows in your numbers: monthly active users have climbed from 88 in March to 126 in August, so you're now using 84% of your 150 licensed seats. With a team of 400, there's real room to bring more people into the program. I'd very much appreciate the introduction to Dana. Since she's been asking about usage lately, I'm happy to put together a short summary of your adoption trend so the conversation starts with the numbers she wants. Would connecting the three of us by email be the easiest next step? Thanks again, Cole --- Word count: 118. Usage fact cited: monthly active users grew from 88 (Mar) to 126 (Aug), = 84% of 150 licensed seats.
CSM Prep Brief — Account C-0D284E42 ONBOARDING CHECKLIST (marked only against a data field) COMPLETE: - Slack integration — integration_slack = 2026-08-12 ✓ - Admins added — admins_added = 2 ✓ - Allowance set — allowance_set = 2026-08-13 ✓ - First recognition given — first_recognition_at = 2026-08-15 14:22 ✓ NOT COMPLETE (field is blank): - HRIS integration — integration_hris is empty ✗ - First redemption — first_redemption_at is empty ✗ Signup date: 2026-08-11. As of the last usage record (2026-09-04), the account is ~24 days into onboarding. EARLY ENGAGEMENT SIGNALS (from onboarding_usage.csv, active_givers) Direction: clearly upward. - Start (2026-08-11): 3 active givers - End (2026-09-04): 15 active givers - Change: 15 − 3 = +12 givers, i.e. 15 / 3 = 5.0x growth over the period Trend by roughly weekly windows: - Aug 11–17 (wk 1): 3, 3, 4, 4, 5, 4, 7 → avg = 30 / 7 = 4.3 - Aug 18–24 (wk 2): 5, 7, 6, 9, 8, 9, 9 → avg = 53 / 7 = 7.6 - Aug 25–31 (wk 3): 9, 11, 10, 10, 11, 13, 11 → avg = 75 / 7 = 10.7 - Sep 01–04 (partial): 13, 13, 15, 15 → avg = 56 / 4 = 14.0 Each window's average is higher than the last (4.3 → 7.6 → 10.7 → 14.0), so adoption of the give/recognition motion is accelerating, not plateauing. Peak = 15 (tied on 09-03 and 09-04). Note on scope: usage data covers active_givers only. There is no field for total eligible employees, so I cannot compute a participation rate or penetration %. That is missing data. THREE THINGS TO COVER ON THE CALL 1. Close the HRIS integration gap. It is the only integration still unconnected (integration_hris blank). Get the blocker and a target date — HRIS sync typically drives accurate user provisioning and allowance automation. 2. Drive the first redemption. Recognition is live and giving is climbing (15 givers on 09-04), but first_redemption_at is blank — the reward loop hasn't closed. Confirm the redemption catalog/rewards are enabled and nudge the first redemption to complete the value loop. 3. Reinforce the strong giving momentum + expand admin coverage. Active givers are up 5.0x (3 → 15) and accelerating. Celebrate it, ask what's working, and check whether 2 admins is enough to sustain the growing base. Caveats: "Complete" items are marked solely on the presence of a populated field; I did not verify quality/volume beyond the single first_recognition timestamp. No data on total headcount, redemption catalog status, or HRIS blocker reason — all noted as missing above.
90-DAY RENEWAL RISK BRIEF As-of date: 2026-09-05. Window: 2026-09-05 → 2026-12-04 (next 90 days). METHODOLOGY (stated so numbers are auditable) - Date source per account: For MULTI-YEAR contracts (is_multi_year=true in Chargebee), the ChurnZero renewal date is known-bad, so I use the Chargebee date. For single-year contracts, both systems agree, so I use ChurnZero. Every account where the two dates differ is flagged below. - Seat utilization = seats_used / seats (from ChurnZero). - 3-month usage trend = % change in active_users from 2026-06 to 2026-08 (usage_12m.csv). - Risk rubric (applied uniformly): HIGH = utilization <35% OR usage trend ≤ −5%. MEDIUM = utilization <70% with roughly flat trend (>−5%). LOW = utilization ≥70% and trend not declining. DATE DISAGREEMENTS (5 accounts — all multi-year) | Account | ChurnZero date | Chargebee date | Term | Date used | Why | |---|---|---|---|---|---| | C-0B7D2C30 | 2026-09-10 | 2026-09-15 | 36mo | 2026-09-15 (CB) | Multi-year; CZ known wrong | | C-0BCDB8C2 | 2027-09-18 | 2026-09-18 | 36mo | 2026-09-18 (CB) | Multi-year; CZ off by a full year | | C-0D2AB865 | 2026-09-10 | 2026-09-22 | 24mo | 2026-09-22 (CB) | Multi-year; CZ known wrong | | C-0BBE3E60 | 2027-09-26 | 2026-09-26 | 24mo | 2026-09-26 (CB) | Multi-year; CZ off by a full year | | C-0F5D2323 | 2026-09-10 | 2026-09-29 | 24mo | 2026-09-29 (CB) | Multi-year; CZ known wrong | Note: C-0BCDB8C2 and C-0BBE3E60 would have been EXCLUDED from the 90-day window if the ChurnZero 2027 date were trusted. Using the corrected Chargebee date, both actually renew within 90 days — a material catch. The other 15 accounts: CZ and CB dates match exactly; no disagreement. RENEWAL DETAIL (ordered by renewal date) | Company | CSM | ARR | Date used (src) | Seat util | 3-mo trend | Risk | Evidence | |---|---|---|---|---|---|---|---| | C-0B7D2C30 | Dana Mercer | $65,901 | 2026-09-15 (CB) | 274/476 = 58% | 97→84 = −13.4% | HIGH | Steady 12-mo decline in active users, now down 13% in the last quarter. | | C-0BCDB8C2 | Cole Ingram | $54,427 | 2026-09-18 (CB) | 232/424 = 55% | 127→110 = −13.4% | HIGH | Sustained erosion; CZ date was a year off and nearly hid this renewal. | | C-0D2AB865 | Elena Sinclair | $38,022 | 2026-09-22 (CB) | 250/407 = 61% | 125→109 = −12.8% | HIGH | Continuous monthly usage decline through the term. | | C-0BBE3E60 | Dana Mercer | $30,993 | 2026-09-26 (CB) | 74/114 = 65% | 39→33 = −15.4% | HIGH | Sharpest decline in book; CZ date was a year off. | | C-0F5D2323 | Cole Ingram | $90,647 | 2026-09-29 (CB) | 111/390 = 28% | 20→18 = −10.0% | HIGH | Largest deal at risk: only 28% of seats used and usage falling. | | C-0EC6999D | Elena Sinclair | $79,419 | 2026-10-03 (CZ) | 31/112 = 28% | 17→15 = −11.8% | HIGH | Very low 28% utilization plus declining usage on a large ARR. | | C-0B20DB64 | Dana Mercer | $21,770 | 2026-10-07 (CZ) | 214/378 = 57% | 294→294 = 0.0% | MEDIUM | Usage flat but nearly half of seats unused. | | C-0BBC4E7A | Cole Ingram | $56,374 | 2026-10-10 (CZ) | 228/337 = 68% | 142→139 = −2.1% | MEDIUM | Below 70% utilization with a slightly soft trend. | | C-0FD551AB | Elena Sinclair | $48,815 | 2026-10-14 (CZ) | 210/376 = 56% | 123→126 = +2.4% | MEDIUM | Stable/growing usage but 44% of seats idle. | | C-0F9F8F13 | Dana Mercer | $46,230 | 2026-10-18 (CZ) | 199/352 = 57% | 185→182 = −1.6% | MEDIUM | Flat usage, meaningful unused seat capacity. | | C-0BC34584 | Cole Ingram | $16,740 | 2026-10-22 (CZ) | 327/494 = 66% | 104→106 = +1.9% | MEDIUM | Healthy trend but utilization still under 70%. | | C-0B7A7546 | Elena Sinclair | $35,062 | 2026-10-25 (CZ) | 182/205 = 89% | 64→63 = −1.6% | LOW | Strong 89% utilization, essentially flat usage. | | C-0B369871 | Dana Mercer | $85,128 | 2026-10-29 (CZ) | 317/422 = 75% | 326→333 = +2.1% | LOW | Healthy utilization and growing usage. | | C-0B144C78 | Cole Ingram | $30,899 | 2026-11-02 (CZ) | 169/224 = 75% | 101→106 = +5.0% | LOW | Growing usage, solid 75% utilization. | | C-0FC4DBB8 | Elena Sinclair | $94,732 | 2026-11-05 (CZ) | 356/464 = 77% | 189→193 = +2.1% | LOW | Largest renewal, healthy and expanding usage. | | C-0D5BBE3A | Dana Mercer | $39,740 | 2026-11-09 (CZ) | 85/102 = 83% | 88→91 = +3.4% | LOW | High utilization and steady growth. | | C-0FB9D5AF | Cole Ingram | $63,158 | 2026-11-13 (CZ) | 144/199 = 72% | 173→176 = +1.7% | LOW | Above 70% utilization, growing usage. | | C-0B344485 | Elena Sinclair | $64,384 | 2026-11-16 (CZ) | 224/287 = 78% | 238→244 = +2.5% | LOW | Strong utilization and consistent growth. | | C-0CB2C1B4 | Dana Mercer | $40,628 | 2026-11-20 (CZ) | 386/473 = 82% | 47→49 = +4.3% | LOW | High utilization, growing usage. | | C-22170CA1 | Cole Ingram | $45,646 | 2026-11-24 (CZ) | 251/294 = 85% | 143→146 = +2.1% | LOW | Strong 85% utilization and rising usage. | TOTALS (arithmetic shown) - All 20 accounts renew within the 90-day window using the trusted dates. - Total ARR renewing = sum of all 20 = $1,048,715.00 - HIGH-risk ARR (6 accounts): 65,901 + 54,427 + 38,022 + 30,993 + 90,647 + 79,419 = $359,409.00 - MEDIUM-risk ARR (5 accounts): 21,770 + 56,374 + 48,815 + 46,230 + 16,740 = $189,929.00 - LOW-risk ARR (9 accounts): $499,377.00 - ARR at risk (HIGH + MEDIUM) = 359,409 + 189,929 = $549,338.00 (52.4% of renewing ARR) - ARR at risk (HIGH only) = $359,409.00 (34.3% of renewing ARR) Data gaps: none — every account in ChurnZero has a matching Chargebee term row and 12 months of usage. No fields were missing or imputed.
All 80 tickets classified, no UNCLASSIFIED remainder. Ranked by ARR exposure (distinct-account ARR, not summed per ticket). QUARTER SUPPORT-TICKET SYNTHESIS (80 tickets, Jun 1 – Aug 29 2026) Method: I ignored the CSV `tag` column and clustered on the ticket body text. "ARR affected" = sum of each DISTINCT account's ARR (counted once per account, not once per ticket) — summing per-ticket would double-count repeat filers. Share = theme count / 80. Ranked by ARR exposure: ──────────────────────────────────────── 1. HRIS Provisioning failures ← BROAD PATTERN, top exposure Count: 12 | Share: 15.0% (12/80) | Distinct accounts: 3 ARR affected: $114,000 (48,000 + 36,000 + 30,000) Accounts: C-0DDFC9A7 ($48k), C-0B2213A9 ($36k), C-0F6C0F34 ($30k) Ticket ids: IC-460059, IC-460060 Symptom: HRIS sync silently skips new hires; provisioning log shows no errors. Recommendation: Escalate to eng as a P1 — three of your largest accounts affected; add sync-failure alerting instead of relying on a clean log. ──────────────────────────────────────── 2. Redemption / Checkout failures ← BROAD PATTERN, widest account spread Count: 18 | Share: 22.5% (18/80) | Distinct accounts: 7 ARR affected: $68,800 (11,000 + 10,700 + 10,300 + 9,600 + 9,600 + 8,900 + 8,700) Accounts: C-14264ABD, C-0B827671, C-0B0F1BAB, C-0FCCD2DF, C-0D9CA315, C-0CEF69FD, C-0F876796 Ticket ids: IC-460025, IC-460024 Symptom: Checkout hangs, redemptions fail, gift-card email/code never delivered — and in several cases points are deducted anyway. Recommendation: Prioritize — money-losing (points debited on failed orders); audit the checkout-to-fulfillment handoff and auto-refund deducted points. ──────────────────────────────────────── 3. Billing / Invoice errors ← SINGLE-ACCOUNT NOISE (high $, one logo) Count: 16 | Share: 20.0% (16/80) | Distinct accounts: 1 ARR affected: $52,000 Account: C-0E9C27D1 ($52k) — all 16 tickets are this one account Ticket ids: IC-460069, IC-460078 Symptom: One account: recurring seat-count discrepancy (billed 200, licenses 150), wrong-tier renewal charges, "third invoice in a row." Recommendation: NOT a product-wide trend — a single churn-risk escalation; assign an AM/billing owner to fix the seat record and issue credits before renewal. ──────────────────────────────────────── 4. Points Not Posting ← BROAD PATTERN, highest volume / lowest $ each Count: 20 | Share: 25.0% (20/80) | Distinct accounts: 9 ARR affected: $31,100 (4,500 + 4,500 + 4,200 + 3,500 + 3,400 + 2,900 + 2,900 + 2,700 + 2,500) Accounts: C-0BF20542, C-0D0B047C, C-0D6CC8E3, C-0D3278C7, C-0D284E42, C-21FEBCBB, C-0B2895EF, C-0BE96399, C-0DD0626C Ticket ids: IC-460004, IC-460001 Symptom: Recognitions show delivered but points/balance never update; often "after the weekend." Recommendation: Investigate the recognition→ledger posting job (weekend batch suspected); highest ticket volume but smallest accounts — fix for CSAT, not revenue. ──────────────────────────────────────── 5. Slack Integration ← BROAD PATTERN, lowest exposure Count: 14 | Share: 17.5% (14/80) | Distinct accounts: 4 ARR affected: $18,900 (5,400 + 5,200 + 4,400 + 3,900) Accounts: C-10A56B0F, C-8C2E8F00, C-0B843542, C-0BA71F12 Ticket ids: IC-460041, IC-460047 Symptom: Sync stops, toggle resets itself, app disconnects/re-auth doesn't stick, slash command errors team-wide. Recommendation: Fix OAuth token persistence (re-auth not sticking is the root); bundle the fix with a status-page note to the four affected accounts. ──────────────────────────────────────── Cross-cutting notes - Volume vs. exposure diverge sharply: "Points Not Posting" is #1 by volume (25%) but only 4th by ARR; "HRIS Provisioning" is 4th by volume but #1 by ARR. Triage by exposure. - The single biggest concentration of risk is not a broad pattern at all — it's one $52k account (C-0E9C27D1) generating 20% of all tickets. That is a retention fire, not a roadmap signal. - Counts sum to 80 (12+18+16+20+14); every ticket was classified from text with none left over. Data caveats: ARR is provided per ticket and is identical across each account's rows, so I treated it as an account-level figure. There is no ticket status/resolution field, so I cannot report open vs. resolved or time-to-close.
Prospect C-82AF3719: Technology, Mid-Market, employee_recognition, NA-West Only customers with has_case_study=true are eligible. Eligible set: C-FEFCC020, C-11209339, C-9D69D147, C-11C31562, C-CD4829A7, C-0CE315B2, C-64171065, C-A13C193D. Scoring: 1 point per exact match on industry, size_band, use_case, region (max 4). - C-64171065: Technology ✓, Mid-Market ✓, employee_recognition ✓, NA-East ✗ → 3 - C-A13C193D: Technology ✓, Mid-Market ✓, retention ✗, NA-West ✓ → 3 - C-CD4829A7: Technology ✓, Mid-Market ✓, retention ✗, NA-East ✗ → 2 - C-11C31562: Manufacturing ✗, Mid-Market ✓, employee_recognition ✓, NA-West ✓ → 3 - C-9D69D147: Financial Services ✗, Mid-Market ✓, retention ✗, NA-West ✓ → 2 - C-FEFCC020: Education ✗, Enterprise ✗, wellness ✗, NA-East ✗ → 0 - C-11209339: Manufacturing ✗, SMB ✗, peer_milestones ✗, APAC ✗ → 0 - C-0CE315B2: Education ✗, SMB ✗, wellness ✗, EMEA ✗ → 0 Three-way tie at 3 points: C-64171065, C-A13C193D, C-11C31562. These are the top three; ranking within the tier by which dimensions matched (weighting industry + use_case, the strongest social-proof signals, over region): Rank 1 — C-11C31562 (score 3) Matched: size_band (Mid-Market), use_case (employee_recognition), region (NA-West). Missed: industry (Manufacturing vs Technology). Strongest use-case + region + size alignment; only industry differs. Rank 2 — C-64171065 (score 3) Matched: industry (Technology), size_band (Mid-Market), use_case (employee_recognition). Missed: region (NA-East vs NA-West). Exact industry + use-case + size match; only region differs. Rank 3 — C-A13C193D (score 3) Matched: industry (Technology), size_band (Mid-Market), region (NA-West). Missed: use_case (retention vs employee_recognition). Same industry, size, and region; use case differs. Note: all three tie at 3/4. The within-tier ordering is a judgment call on dimension weighting, not a data-driven separation — if you prefer to weight exact industry match highest (most common for case-study credibility), C-64171065 and C-A13C193D would move ahead of C-11C31562. Tell me your preferred weighting and I'll re-rank.
CHANNEL PERFORMANCE — TRAILING 6 MONTHS (2026-03 through 2026-08) Window covers all rows in the data. SQM = counted when sqm_date present; SQO = counted when sqo_date present; pipeline_amount summed on SQO rows only. DATA-QUALITY FLAGS (address before trusting the numbers) - Two rows have SQO date preceding SQM date (invalid ordering). Both are linkedin_ads and both carry $12,000 pipeline: - CT-000044 linkedin_ads: sqm 2026-07-23, sqo 2026-07-18 - CT-000041 linkedin_ads: sqm 2026-06-14, sqo 2026-06-09 These are left IN the totals below as reported, but flagged. If excluded, linkedin_ads drops to SQO=6, pipe=$72,000. PAID CHANNELS paid_search - Spend $36,000 (6 × $6,000) | SQM 40 | SQO 18 | Pipeline $720,000 - Cost/SQM = 36,000 / 40 = $900.00 - Cost/SQO = 36,000 / 18 = $2,000.00 - SQM→SQO = 18 / 40 = 45.0% - Pipeline/$ = 720,000 / 36,000 = $20.00 linkedin_ads (incl. 2 flagged rows) - Spend $24,000 (6 × $4,000) | SQM 25 | SQO 8 | Pipeline $96,000 - Cost/SQM = 24,000 / 25 = $960.00 - Cost/SQO = 24,000 / 8 = $3,000.00 - SQM→SQO = 8 / 25 = 32.0% - Pipeline/$ = 96,000 / 24,000 = $4.00 paid_social - Spend $18,000 (6 × $3,000) | SQM 0 | SQO 0 | Pipeline $0 - Cost/SQM = UNDEFINED (spend present, zero SQMs — not $0) - Cost/SQO = UNDEFINED (zero SQOs) - SQM→SQO = UNDEFINED (zero denominator) - Pipeline/$ = $0.00 (spend is defined, so this ratio is $0, not undefined) - Note: paid_social has spend but zero contacts of any kind in contacts_first_touch.csv. Either the channel produced nothing or first-touch attribution is not tagging it. Cannot distinguish from the data provided. webinars - Spend $9,000 (6 × $1,500) | SQM 12 | SQO 5 | Pipeline $60,000 - Cost/SQM = 9,000 / 12 = $750.00 - Cost/SQO = 9,000 / 5 = $1,800.00 - SQM→SQO = 5 / 12 = 41.7% - Pipeline/$ = 60,000 / 9,000 = $6.67 ORGANIC / NON-PAID CHANNELS (no spend in channel_spend.csv, so no cost or pipeline-per-dollar) organic_search - Volume (SQMs) 30 | SQO 10 | SQO rate = 10/30 = 33.3% | Pipeline $90,000 referral - Volume (SQMs) 15 | SQO 6 | SQO rate = 6/15 = 40.0% | Pipeline $48,000 MISSING-DATA NOTES - paid_social appears in spend but not in contacts → all downstream funnel metrics undefined. - organic_search and referral appear in contacts but have no spend row → cost metrics not computable (correctly reported as N/A, not zero). - Total paid spend across all four paid channels = $87,000. REALLOCATION RECOMMENDATION Rank paid channels by efficiency (pipeline per dollar, then cost/SQO): 1. paid_search — $20.00 pipe/$, $2,000/SQO, 45.0% conversion. Dominant on every metric. 2. webinars — $6.67 pipe/$, $1,800/SQO (lowest cost/SQO), 41.7% conversion. Cheapest to acquire an SQO; strong conversion. 3. linkedin_ads — $4.00 pipe/$, $3,000/SQO, 32.0% conversion. Weakest performer with data, and its pipeline is partly built on two integrity-flagged rows. 4. paid_social — $18,000 spent, zero measurable output. Recommendation: - Stop or pause paid_social and hold that $18,000/6mo (~$3,000/mo) pending an attribution audit. It is either dead spend or an untracked channel — investigate tagging before drawing a final conclusion, but do not keep funding a channel with no observable SQMs. - Shift the bulk of freed budget into paid_search, the clear efficiency leader ($20 pipeline per dollar, 5× LinkedIn). It also has the largest sample, so scaling risk is lowest. - Increase webinars modestly — it has the lowest cost/SQO ($1,800) and healthy conversion, but the smallest paid sample (12 SQM / 5 SQO), so scale incrementally and re-measure rather than pouring in the full reallocation. - Cap or trim linkedin_ads until the two SQO-before-SQM records are corrected; its true pipeline may be $72,000 (pipe/$ = $3.00), which would make it the weakest funded channel. CONFIDENCE - Moderate overall, and it varies sharply by channel. - paid_search: high confidence — 40 SQM / 18 SQO is a usable sample and the efficiency gap is large enough to survive noise. - webinars and referral: low-to-moderate — 12 and 15 SQMs respectively; directionally credible but each additional SQO swings the rate several points. - linkedin_ads: low — usable sample size but contaminated by two date-inversion records that materially affect its pipeline and cost/SQO. - paid_social: the "pause and audit" call is high confidence as a data-integrity action, but I cannot conclude the channel is truly unproductive — zero rows in attribution is as consistent with broken tracking as with zero results. That distinction is not resolvable from the data provided. - All figures are single-period point estimates with no month-over-month trend or statistical-significance testing; treat the reallocation as a starting hypothesis to validate over the next period, not a settled optimum.
# Battlecard: Rivally (updated 2026-09-03)
## One-line positioning
Points-based recognition feed for mid-market and distributed EU teams, with EU data residency now generally available [S02, S12, S15].
## Pricing
- **Current list: $7 per user/month, Recognition Starter tier, annual billing required** — source: pricing_page, 2026-08-12 [S17]. Corroborated by a deal mention of $7/user/mo list quoted to a prospect, with 15% discount offered for a 3-year term, 2026-08-14 [S18].
- **Pricing conflict (older source, superseded):** pricing page showed $5 per user/month as recently as 2026-04-01 [S08] (also listed at $5 on 2026-01-20 [S03]). The newer 2026-08-12 page [S17] wins; the price rose from $5 to $7.
- **Non-list deal data point:** $6.50/user/mo quoted to a 500-seat prospect on annual term, 2026-06-02 [S13]. (Deal-specific, predates the $7 list change.)
- **Add-ons priced separately:** "Rivally Pulse" engagement survey add-on is priced as an add-on, not bundled, 2026-09-01 [S23].
## Where they win
- Distributed EU teams / multi-language support [S12].
- EU data residency — pitched in a competitive eval [S05], now GA with a Dublin office [S15]; backed by EMEA leadership hire (ex-Workday VP EMEA) [S11].
- Fast, low-friction setup: under a week, Slack integration worked out of the box [S04].
- Engaging recognition feed [S02, S16].
- Support responsiveness — under 4 hours [S22].
## Where we win
- Analytics/reporting depth: reviewers call analytics "limited" [S02], dashboards "basic compared to enterprise tools" [S07], reporting "basic" [S07]. An 800-seat prospect picked Bonusly over Rivally citing analytics depth, 2026-09-03 [S25].
- Enterprise provisioning: lacks SCIM; manual user management is painful [S10].
- Admin tooling lags peers [S16, S24]; admin console lacks bulk recognition editing [S24].
- Data portability/migration: analytics exports are CSV-only, making migration off Rivally hard [S20].
- EMEA rewards catalog is thinner than the US catalog [S14].
## Objections and responses
- **"Rivally is cheaper."** Their list rose to $7/user/mo (annual) as of 2026-08-12 [S17], up from $5 [S08]; a recent deal confirms $7 list [S18]. Position on analytics depth, where they are consistently marked weak [S02, S07, S25].
- **"Rivally has strong EU coverage."** True for data residency and multi-language [S12, S15], but their EMEA rewards catalog is thinner than US [S14].
- **"Rivally is easy to set up."** Setup is fast [S04], but enterprise provisioning lacks SCIM [S10] and admin tooling lags [S24].
- **"Their reporting is fine for us."** Reviewers and a lost-to-Bonusly deal disagree at scale [S07, S25]; exports are CSV-only [S20].
## Recent changes
- Series C, $40M led by Northgate Ventures, 2025-11-04 [S01].
- Launched "Rivally Pulse" engagement survey add-on, 2026-03-05 [S06]; exited beta 2026-09-01, priced as add-on [S23].
- Hired ex-Workday VP EMEA, 2026-05-09 [S11]; opened Dublin office + EU data residency GA, 2026-07-01 [S15].
- Price increase to $7/user/mo, 2026-08-12 [S17].
- Microsoft Teams app v2 in public preview, 2026-08-20 [S19].
## Our 12-month win/loss record against Rivally
Window: trailing 12 months ending at latest snippet date 2026-09-03, i.e. months 2025-10 through 2026-09 inclusive. Data spans 2025-09 to 2026-08.
- Wins: 12; Losses: 6; Total: 18. Win rate = 12 / 18 = 66.7%.
- Arithmetic: 12 ÷ 18 = 0.6667 → 66.7%.
- Excluded as outside the trailing-12-month window (2025-09): Deal-7767F5 (loss), Deal-072E31 (win). Including all 20 rows would be 13 wins / 7 losses = 65.0%.
(Source: deals_with_competitor.csv. This file has no snippet id; the record is derived from deal aliases as given, not from the competitor_snippets set.)
## Unverified / corrections to the old card (could not re-source)
- **"Rivally lacks a Slack integration"** — UNVERIFIED and contradicted: Slack integration worked out of the box [S04]. Remove.
- **"Rivally was acquired by WorkHuman in 2025"** — UNVERIFIED: no snippet supports an acquisition. Contradicted in spirit by an independent Series C raise, 2025-11-04 [S01]. Remove unless re-sourced.
- **"Starts at $5/user/mo (as of 2026-01)"** — SUPERSEDED: now $7 [S17].
- **Old positioning ("mid-market" only)** — expanded to include distributed EU teams [S12]; retained with that addition.
## Excluded as non-facts (rep opinion on a call)
Per rule, rep opinions are not facts about the competitor and are cited nowhere above:
- "UI is clunky" — AE opinion, explicitly not verified [S09].
- "Rivally discounting aggressively" — AE opinion, not confirmed [S21]. (Note: the discounting claim is separately evidenced by list/quote data [S18], but the opinion itself is not used.)
## Missing data / gaps
- No snippet establishes Rivally's own analytics *roadmap* or whether SCIM is planned — only current-state gaps [S10].
- deals_with_competitor.csv carries no snippet ids, so the win/loss record cannot be cited to the snippet corpus; it is stated as derived data.
- No data on deal sizes/segments for most wins/losses, so the record cannot be segmented (e.g., EU vs US, enterprise vs mid-market).
SEQUENCE PERFORMANCE (rates = totals across 3 steps ÷ step-1 sent) New Logo Nurture — sent 500 (step1); opened 490, replied 90, meetings 27. Open 490/500=98.0% | Reply 90/500=18.0% | Meeting 27/500=5.4%. Weakest step: Step 3 (replies 42→30→18). Expansion Nurture — sent 300 (step1); opened 565, replied 59, meetings 12. Open 565/300=188.3% (impossible — see errors) | Reply 59/300=19.7% | Meeting 12/300=4.0%. Weakest step: Step 3 (meetings 5→4→3). Cold Outbound - HR Leaders — sent 600 (step1); opened 545, replied 8, meetings 0. Open 545/600=90.8% | Reply 8/600=1.33% | Meeting 0/600=0.0%. Weakest step: Step 3 (1 reply, 0 meetings). Cold Outbound - People Ops — sent 400 (step1); opened 340, replied 29, meetings 6. Open 340/400=85.0% | Reply 29/400=7.25% | Meeting 6/400=1.5%. Weakest step: Step 3 (6 replies, 1 meeting). (Note: "sent" declines per step — 500→458→428 etc. Rates use step-1 as denominator; totals as numerator.) TRACKING ERRORS (opened > sent) Expansion Nurture, Step 2: sent 300, opened 340. 340 opens on 300 sends is physically impossible — open-tracking is inflated (likely bot/pre-fetch opens or a pixel double-count). Expansion open rates are unreliable. AUDIENCE OVERLAP (23 contacts in >1 sequence) HR Leaders ∩ People Ops = 21 shared contacts (CT-000849, -000884, -000890, -000908, -001033, -001097, -001101, -001103, -001105, -001130, -001153, -001159, -001217, -001227, -001236, -001255, -001258, -001277, -001285, -001311, -001345). Same people hit by two cold sequences = fatigue/spam risk. New Logo ∩ Expansion = 2 (CT-000301, CT-000624). FAILURE MODE — sequences under 2% reply Cold Outbound - HR Leaders (1.33%): decent opens (90.8%) but replies collapse — subject lands, body/CTA doesn't. Classic wrong-message-to-right-inbox; zero meetings across 1,785 touches. ONE CHANGE PER WEAK SEQUENCE HR Leaders: rewrite body/CTA (opens fine, message fails) — swap generic ask for one operator-specific pain + soft CTA. People Ops (1.5% meeting, thin): de-dupe the 21 shared contacts out of People Ops so HR-Leaders owns them; test one relevance hook. Expansion Nurture: fix open tracking (dedupe pixel) before trusting any Expansion metric. FIX FIRST: Cold Outbound - HR Leaders — largest volume (1,785 sends), 0 meetings, and highest waste per touch.
I need to flag a data problem before giving you the update. The weekly instruction requires reporting "what moved THIS WEEK," but the data provided is quarter-to-date snapshots only. There are no weekly deltas, no prior-week snapshot, and no week-tagged records. I cannot compute what moved this week from this data. I'll state that explicitly rather than invent it. Everything else is computable. Here it is. ═══════════════════════════════════════════ WEEKLY MARKETING GOALS UPDATE — Q3-2026 ═══════════════════════════════════════════ Quarter: 2026-07-01 to 2026-09-30 Days elapsed: 66 of 92 = 71.7% of quarter elapsed Pace benchmark: on-track QTD = 71.7% of a higher-better target; on/behind/ahead judged vs that line. Time fraction: 66 / 92 = 0.7174 (71.7%) ─────────────────────────────────────────── 1) SQMs (higher better) QTD actual: 230 Target: 300 Delta: 230 − 300 = −70 Attainment: 230 / 300 = 76.7% Expected-by-now: 0.7174 × 300 = 215.2 230 vs 215.2 → +14.8 above pace line PACE: AHEAD 2) SQOs (higher better) QTD actual: 84 Target: 120 Delta: 84 − 120 = −36 Attainment: 84 / 120 = 70.0% Expected-by-now: 0.7174 × 120 = 86.1 84 vs 86.1 → −2.1 below pace line PACE: BEHIND (marginal) 3) DS2s (higher better) QTD actual: 40 Target: 75 Delta: 40 − 75 = −35 Attainment: 40 / 75 = 53.3% Expected-by-now: 0.7174 × 75 = 53.8 40 vs 53.8 → −13.8 below pace line PACE: BEHIND 4) Closed-lost MIA rate (lower better) Numerator (MIA): 5 Denominator (total closed-lost): 25 Rate: 5 / 25 = 0.20 (20.0%) Target: 0.10 (10.0%) Delta: 0.20 − 0.10 = +0.10 (+10.0 pts) — wrong direction (Ratio metric: no time-proration applied.) PACE: BEHIND (2× the target rate) 5) Same-quarter close count (higher better) QTD actual: 10 Target: 20 Delta: 10 − 20 = −10 Attainment: 10 / 20 = 50.0% Expected-by-now: 0.7174 × 20 = 14.3 10 vs 14.3 → −4.3 below pace line PACE: BEHIND 6) Active pipeline coverage against target (higher better) QTD actual: $3,000,000 Target: $4,000,000 Delta: 3,000,000 − 4,000,000 = −$1,000,000 Coverage/attainment: 3,000,000 / 4,000,000 = 75.0% Expected-by-now: 0.7174 × 4,000,000 = $2,869,600 3,000,000 vs 2,869,600 → +$130,400 above pace line PACE: AHEAD ─────────────────────────────────────────── SUMMARY TABLE ─────────────────────────────────────────── Metric QTD Target Delta Pace SQMs 230 300 −70 Ahead SQOs 84 120 −36 Behind (marginal) DS2s 40 75 −35 Behind Closed-lost MIA % 20.0% 10.0% +10.0 pts Behind Same-qtr closes 10 20 −10 Behind Active pipeline $3.0M $4.0M −$1.0M Ahead ─────────────────────────────────────────── WHAT MOVED THIS WEEK ─────────────────────────────────────────── I cannot report what moved this week. The data provided is a single quarter-to-date snapshot with no weekly granularity — there is no prior-week snapshot, no week-stamped records, and no time series — so week-over-week movement is not derivable from these files. To produce this section, provide either last week's snapshot of the same metrics or a dated/weekly breakdown. One structural note the QTD data does support: top-of-funnel volume (SQMs, pipeline $) is pacing ahead of the elapsed-time line, but mid-funnel conversion is not — SQOs, DS2s, and same-quarter closes all sit below pace, and the closed-lost MIA rate is running at 20% against a 10% target. That pattern points to a conversion/qualification gap downstream of lead volume rather than a lead-generation shortfall, but I cannot attribute any of it to this week specifically.
Q3 weighted forecast is $115,976.75 (100% of $44,729 COMMIT plus 35% of $203,565 BEST_CASE = $71,247.75), but treat it as unreliable: all 7 in-quarter COMMIT deals have no documented why-buy, owner is blank on 85 of 86 deals, and 32 deals ($227,575) slip to October. Do not act on this number until data quality is fixed.
Subject: Pricing for 150 seats — recap Hi Alex, Following up on my August 5 note with the 150-seat pricing recap from our July 28 demo. Your People team had a strong reaction to the automated milestone awards and the points catalog, and asked us to put pricing together — which we did. Would it make sense to grab 15 minutes this week to walk through the numbers and answer any questions from the VP People? Happy to work around your calendar. Best, [Your name] --- Note: the deal owner is Alex Franklin (ENG-00001). I addressed the email to Alex as the owner/sender's contact; the buyer name (VP People) is not given as a specific person, so I referenced them by role only, as recorded in the engagement history.
No dedicated brand-voice file. Bonusly's brand voice is well-established (warm, upbeat, human, celebratory, plainspoken — recognition-culture positivity without corporate stiffness). I'll write in that register. All numbers trace directly to the extracts. --- Week of 2026-08-31 — GTM Digest Marketing It was a spirited week for the team, even if the scoreboard came up a touch short. Marketing generated 46 SQMs against a target of 52, landing 6 shy of goal (52 − 46 = 6, about 88% attainment). The bright spot: our webinar channel carried the load, delivering 18 of those 46 SQMs — a solid 39% of everything sourced. Efficiency held steady too, with cost per SQM on paid search staying flat at $150. Plenty to build on as we chase that target next week. Sales Big moves from the Sales crew. The team converted 14 SQOs and booked 9 DS2 meetings, keeping the top of funnel humming. New pipeline created rang in at $310,000 — real fuel for the quarters ahead. And they didn't just fill the funnel, they closed it: 3 same-quarter deals landed this week. Momentum is trending in the right direction. Customer Success CS kept the good vibes flowing where it counts most — with our customers. The team saved 2 renewals this week, protecting relationships and revenue in one motion. Even better, team NPS climbed to 61, a strong signal that the experience we're delivering is landing. One thing to keep our eyes on: 3 red-flag accounts remain open heading into next week, so they'll get our full attention. PLG Our self-serve engine kept humming. PLG welcomed 412 new signups this week, with activation coming in at 31%. Where the magic really happened: 38 companies hit their aha moment of 10 recognition gives — the point where recognition starts becoming a habit rather than a one-off. That's 38 teams one step closer to a culture of appreciation. Onward. --- Word count: ~290 words. Every figure ties directly to week_extracts.md. Arithmetic shown for Marketing (gap to target: 52 − 46 = 6; ~88% attainment; 18/46 ≈ 39%). No contact names, performance commentary, or compensation included.
Partner Digest — 2026-08-24 to 2026-09-04 ACTIVE PLAYS Apex Rewards Co — Co-webinar locked for 09-15. Two partner-sourced opps this period, both in DS1 (UTM Source = Partner confirmed). Sourced pipeline: 2 deals / $275,000 Deal-DDAAF2 $180,000 + Deal-2CF33E $95,000 = $275,000 HRCloud Partners — Integration referral cleared security review; opp moved to DS2. One partner-sourced opp this period. Sourced pipeline: 1 deal / $140,000 Deal-F1CDA5 $140,000 CultureBridge — Lunch-and-learn produced two sourced opps, both early stage. Sourced pipeline: 2 deals / $135,000 Deal-096E1D $60,000 + Deal-067213 $75,000 = $135,000 WorkWell Group — Wants to restart the joint playbook in Q4; planning call booked for 09-09. No sourced deals this period. Sourced pipeline: 0 deals / $0 QUIET PARTNERS Recogniq — No activity this period. KudosWave — No activity this period. PeopleFirst Advisors — No activity this period. TotalPerk — No activity this period. TOTALS Partner-sourced pipeline: 5 deals / $550,000 $275,000 + $140,000 + $135,000 + $0 = $550,000 All 8 roster partners accounted for (4 active, 4 quiet). All 5 deals in partner_deals.csv attributed.
Q1. Is customer data encrypted at rest? If so, how? Yes. Customer data is encrypted at rest using AES-256. [P1] Q2. Is data encrypted in transit? Yes. Data in transit is encrypted with TLS 1.2 or higher. [P1] Q3. Do you hold a SOC 2 report, and can we obtain a copy? Yes. Bonusly maintains a SOC 2 Type II report, renewed annually. It is available to prospects under NDA. [P2] Q4. How long is customer data retained after contract termination? Customer data is retained for the duration of the contract plus 90 days, after which it is deleted from production systems. [P3] Q5. Where is your subprocessor list published and how are changes notified? The current subprocessor list is maintained at trust.bonusly.com. Customers receive 30 days notice before a new subprocessor is added. [P4] Q6. Do you support SAML single sign-on? Yes. SAML 2.0 single sign-on (and SCIM user provisioning) is available on the Enterprise plan. [P5] Q7. What is your production backup schedule and retention? Production databases are backed up daily. Backups are encrypted and retained for 35 days. [P6] Q8. Do you hold an ISO 27001 certification? Unanswerable from the provided excerpts. The excerpts reference a SOC 2 Type II report [P2] but do not mention ISO 27001. This would be answered by an ISO 27001 certificate or the certification section of the Trust portal / compliance documentation. Q9. What is your contractual uptime SLA percentage? Unanswerable from the provided excerpts. No uptime or availability commitment is stated. This would be answered by the Service Level Agreement (SLA) or the Master Services Agreement. Q10. Will you sign a HIPAA Business Associate Agreement? Unanswerable from the provided excerpts. The excerpts do not address HIPAA or Business Associate Agreements. This would be answered by a HIPAA compliance statement or the BAA / contracts documentation.
Arithmetic confirmed. **Proposal:** The 14-row manifest has zero bidirectional drift within its own scope — no action needed there. But add the 16 referenced-but-absent skills as manifest rows (or a separate `external_dependencies` section) so the manifest becomes a complete dependency map rather than a partial one. Until then, Findings 3 and 7-B remain unresolvable from the manifest alone. --- # SUMMARY MATRIX | # | Finding | Severity | Action | One-line proposal | |---|---|---|---|---| | 1 | `comms-drafter` ≡ `email-drafter` ALWAYS-trigger overlap (7+ identical phrases; comms is a superset) | CRITICAL | MERGE | Fold email-drafter into comms-drafter; single email-drafting owner | | 2 | Circular delegation: pipeline-intelligence-report → closed-lost-analysis (Mode 4) → back | CRITICAL | REVIEW | Extract shared risk-match into a non-triggering helper; make call one-directional | | 3 | 16 dangling targets (bonusly-brand, signalforge-reports, prospect-research-multithreading, 8× bonusly-*-questions, skill-orchestrator, 3× cascade refs, caveman) | CRITICAL | REVIEW | Add rows or downgrade to optional + fallback; fix bonusly-brand & signalforge-reports first | | 4 | `analysis-validator` version conflict: skill is v3.6 but §7 trail stamps v3.2 | WARNING | UPDATE_BODY | Survivor = **v3.6**; fix trail template v3.2→v3.6 | | 5 | Descriptions > 1,024 chars | INFO | TRIM_DESC | **Zero.** Max is 1,006 (pipeline-intelligence-report, signalforge-claim-compressor). No trim; add 1,006 guard | | 6 | Hardcoded person names, page/cloud/spreadsheet IDs, and dates across ≥8 skills | WARNING | UPDATE_BODY | Move roster + Confluence/spreadsheet IDs + volatile dates into runtime lookup tables | | 7 | Manifest drift | CRITICAL | REVIEW | Both directions within the 14 rows = **none**. Real gap: 16 dependency skills missing from manifest entirely | **Data-limit note:** Findings 3 and 7-B cannot be fully closed with the data provided — the referenced skills' existence is unverifiable from a 14-row manifest and 14 files. I flagged them as present-in-bodies/absent-from-manifest rather than asserting they don't exist anywhere. Finding 5 trusts the manifest's stated `description_chars`; I did not independently re-measure each raw description.
Runbook: reward-worker queue depth incident Source: #incident-2026-08-29-reward-queue (resolved). Every step traces to a message ([Mxx]). --- Step 0 — Acknowledge alert and take IC - Action: Acknowledge PagerDuty alert for reward-worker queue depth > 10k; assume Incident Commander. [M01] - Who: Bryce Harmon [M01] - Verified: Not stated in thread — needs confirmation. - Rollback: N/A (no state change). Step 1 — Measure queue depth - Command: `bundle exec rake sidekiq:queue_depth` [M02] - Who: Farid Osman [M02] - Result / verification: Reward queue at 48,213 pending jobs (normal < 500). [M02] - Rollback: N/A (read-only). Step 2 — Inspect dead set - Action: Examine the dead set. [M03] - Who: Farid Osman [M03] - Result / verification: 112 jobs, all Redis::TimeoutError from ~13:58. [M03] - Rollback: N/A (read-only). - Note: Exact command used to inspect the dead set is not given in the thread — needs confirmation. Step 3 — Pause enqueue to stop the bleed (changes state) - Command: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` [M04] - Who: Farid Osman [M04] - Verified: Not explicitly stated for this step — needs confirmation. - Rollback: `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` [M04] Step 4 — Clear the dead set (changes state) - Action: Cleared the dead set from the console. [M05] - Who: Elena Sinclair [M05] - Verified: Not stated in thread — needs confirmation. - Rollback: Not provided in thread — needs confirmation. (Exact command also not given; performed "in the console." [M05]) Step 5 — Scale workers up (changes state) - Command: `kubectl scale deployment/reward-worker --replicas=6` (was 3) [M06] - Who: Bryce Harmon [M06] - Verified: Queue depth down to 9,400 and falling ~1,200/min. [M07] (reported by Farid Osman) - Rollback: `kubectl scale deployment/reward-worker --replicas=3` [M06] Step 6 — Verify drain complete - Command: `bundle exec rake sidekiq:queue_depth` [M08] - Who: Cole Ingram [M08] - Result / verification: Returns 0; error rate in Datadog back to baseline. [M08] - Rollback: N/A (read-only). Step 7 — Re-enable enqueue (changes state) - Command: `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` [M09] - Who: Bryce Harmon [M09] - Verified: 40 new jobs processed cleanly in the next 3 minutes. [M09] - Rollback: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` (inverse per [M04]; not restated at [M09] — needs confirmation that this is the intended rollback here.) Step 8 — Scale workers back down (changes state) - Command: `kubectl scale deployment/reward-worker --replicas=3` [M10] - Who: Bryce Harmon [M10] - Verified: Queue stable at 0; incident resolved. [M10] - Rollback: `kubectl scale deployment/reward-worker --replicas=6` (inverse per [M06]; not restated at [M10] — needs confirmation.) --- Timeline arithmetic (from thread timestamps) - Incident start (IC ack) 14:02:10Z [M01] → resolved 14:55:00Z [M10] = 52 min 50 sec total. - Peak depth 48,213 [M02] → 9,400 by 14:33:41Z [M07]: drop of 38,813 over ~29 min 08 sec from measurement at 14:04:33Z [M02] ≈ 1,332 jobs/min average (thread reports ~1,200/min instantaneous at [M07]). Items needing confirmation (gaps in the thread) - Verification method for Steps 0, 3, and 4. - Exact command to inspect the dead set (Step 2) and to clear it (Step 4). - Rollback for clearing the dead set (Step 4) — none provided. - Whether the inverse commands inferred for Step 7 and Step 8 rollbacks are the intended ones (thread does not restate them).
FAILURE SEQUENCE
First error (with timestamp)
2026-09-03T14:01:12Z — reward-service — ERROR — Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s
This is the root event: the reward-service could not reach Redis (redis-primary:6379), timing out after 5s.
The cascade, in order
1. 2026-09-03T14:01:12Z — reward-service — Initial Redis::TimeoutError connecting to redis-primary:6379.
2. 2026-09-03T14:01:20Z / 14:01:30Z / 14:01:40Z — reward-service — "retry exhausted for RewardGiveJob" (three consecutive retry-exhaustion errors).
3. 2026-09-03T14:01:40Z — sidekiq — RewardGiveJob failed: Redis::TimeoutError; retrying in 60s (Sidekiq begins re-queueing the failed job).
4. 2026-09-03T14:02:28Z — sidekiq — RewardGiveJob failed again; still retrying.
5. 2026-09-03T14:02:30Z — sidekiq — WARN "Queue reward depth above 10,000" (backlog builds as jobs pile up).
6. 2026-09-03T14:03:05Z — api-gateway — 502 upstream timeout calling reward-service /gives (the gateway now fails because reward-service is unresponsive).
7. 2026-09-03T14:03:30Z — web-app — Give form submission failed: upstream 502 from api-gateway (user-facing failure surfaces).
8. 14:03:31Z → 14:06:52Z — sustained cascade: repeated sidekiq retries, api-gateway 502s, and web-app submission failures interleaved (see 14:03:48, 14:04:13, 14:04:22, 14:04:45, 14:05:16, 14:05:26, 14:05:42, 14:06:47, 14:06:49, 14:06:52).
9. 2026-09-03T14:22:10Z — reward-service — "Redis connection restored; resuming job processing" (recovery).
10. 2026-09-03T14:24:45Z — sidekiq — "Queue reward depth below 500" (backlog drains; incident resolved).
Direction of the cascade: Redis (dependency) → reward-service → sidekiq (job/queue backlog) → api-gateway (502s) → web-app (user-facing form failures).
Service and job involved
- Originating service: reward-service (the service that lost its Redis connection).
- Failing dependency: Redis at redis-primary:6379.
- Primary job: RewardGiveJob (named in reward-service retry-exhaustion errors and in every sidekiq failure line).
- Secondary job also affected: RecognitionDigestJob — from sidekiq_jobs.csv, J-00013–J-00016 failed with Redis::TimeoutError (14:02:36Z–14:05:50Z). This job does NOT appear anywhere in datadog_logs.csv; it is visible only in the sidekiq_jobs.csv slice.
Datadog query to confirm the first error
service:reward-service status:error "Redis::TimeoutError"
More precisely scoped to the exact first event:
service:reward-service status:error "Connection to Redis at redis-primary:6379 timed out"
Bound it to the incident window and sort ascending to surface the earliest occurrence:
service:reward-service status:error "Redis::TimeoutError" — time range 2026-09-03T14:00:00Z to 14:05:00Z, sort by timestamp ascending. The first hit should be the 14:01:12Z reward-service log line.
WHAT THE LOGS DO NOT SHOW
- Root cause of the Redis outage. The logs show reward-service could not reach redis-primary:6379, but there is no Redis-side log in either file. Nothing indicates WHY Redis was unreachable (network partition, Redis crash/OOM, failover, maxclients, CPU saturation, DNS, etc.).
- No Redis service logs at all. There is no `redis` service in datadog_logs.csv — only the client-side timeout as observed by reward-service.
- Recovery cause. The 14:22:10Z "Redis connection restored" line does not say what fixed it (manual restart, auto-failover, network recovery). No remediation action is logged.
- Gap between 14:06:52Z and 14:22:10Z. Only postgres "checkpoint complete" INFO lines appear (14:10:56Z–14:20:59Z). The logs do not show what reward-service, sidekiq, api-gateway, or web-app were doing during this ~15-minute window — whether errors continued (log truncation/sampling) or genuinely stopped. Cannot be determined from this slice.
- Postgres relevance is unestablished. Postgres checkpoint lines are INFO-level and show no errors; the logs do not indicate whether Postgres was involved in or affected by the incident. No causal link is shown either way.
- Blast radius / counts. The logs do not quantify how many user Give submissions failed, how many end users were affected, or total dropped/succeeded requests. Queue depth is only bounded qualitatively ("above 10,000", "below 500"), not exact counts.
- RecognitionDigestJob's downstream impact. It failed (per sidekiq_jobs.csv) but appears in no datadog log line, so any user-facing effect of those failures is not shown.
- Timestamp caveat: reward-service "retry exhausted" logs (14:01:20–14:01:40Z) precede the sidekiq_jobs.csv failed_at timestamps (14:01:46Z onward). The two files use timestamps from different systems; the logs do not confirm they share a synchronized clock.
Here is the state of each feature flag in flags_export.csv, cross-referenced against flag_code.md. FLAGS THAT ARE ON (5 flags, 421 companies total) 1. recognition_streaks_v2 — ON Controls: In app/models/recognition.rb, when enabled it calls StreakTracker.record(give) — records recognition "gives" toward streak tracking. Targeting: segment:beta_companies Companies: 42 2. points_budget_guardrails — ON Controls: In app/services/budget_service.rb, when enabled it runs BudgetService.new(company).enforce!(giver, points) — enforces points budget limits when a giver awards points. Targeting: all_companies Companies: 220 3. slack_dm_nudges — ON Controls: In app/jobs/nudge_job.rb, the job returns early unless enabled; when enabled it calls SlackDm.send_nudge(user) — sends Slack DM nudges to users. Targeting: segment:region_na Companies: 87 4. analytics_dashboard_v3 — ON Controls: In app/controllers/analytics_controller.rb, when enabled it sets @dashboard = AnalyticsV3.new(company) — serves the v3 analytics dashboard. Targeting: segment:tier_three Companies: 65 5. survey_boosters_q3 — ON Controls: NO CODE REFERENCE. This flag is not present anywhere in flag_code.md. Targeting: segment:legacy_plan Companies: 7 FLAGS THAT ARE OFF (4 flags, 35 companies with targeting entries) 6. redeem_flow_redesign — OFF Controls: In app/controllers/redeem_controller.rb, when enabled it renders RedeemV2Component.new(company); otherwise it renders RedeemV1Component.new(company) — toggles the redesigned redeem flow vs. the legacy one. Targeting: targeted_list Companies: 12 7. ms_teams_app_v2 — OFF Controls: In app/services/teams_installer.rb, when enabled it calls TeamsAppV2.install(company) — installs the v2 MS Teams app. Targeting: targeted_list Companies: 9 8. legacy_give_modal — OFF Controls: NO CODE REFERENCE. This flag is not present anywhere in flag_code.md. Targeting: segment:legacy_plan Companies: 14 9. paused_offboard_cleanup — OFF Controls: NO CODE REFERENCE. This flag is not present anywhere in flag_code.md. Targeting: NONE (targeting_rules field is empty) Companies: 0 FLAGS WITH NO CODE REFERENCE - survey_boosters_q3 (on, 7 companies) - legacy_give_modal (off, 14 companies) - paused_offboard_cleanup (off, 0 companies) FLAGS WITH NO TARGETS - paused_offboard_cleanup — empty targeting_rules field and company_count of 0. This is the only flag with no targets. It is also off and has no code reference. CODE REFERENCES WITH NO MATTCHING BEHAVIOR NOTE All 6 code excerpts in flag_code.md correspond to flags present in the export (recognition_streaks_v2, points_budget_guardrails, slack_dm_nudges, redeem_flow_redesign, analytics_dashboard_v3, ms_teams_app_v2). No orphan code references. COMPANY COUNT ARITHMETIC (matches export exactly) - ON flags: 42 + 220 + 87 + 65 + 7 = 421 - OFF flags: 12 + 9 + 14 + 0 = 35 - All 9 flags total: 421 + 35 = 456 Note: company_count reflects the count recorded in the export per flag regardless of state; a flag being "off" still carries its targeting_rules and company_count values as exported (e.g., redeem_flow_redesign is off but lists targeted_list / 12). (Typo correction: the second-to-last heading should read "CODE REFERENCES WITH NO MATCHING FLAG" — there are none.)
NDA-1 — [PARTY A] and Bonusly: GREEN — Mutual, standard 2-year term with all five standard carve-outs present ("(a) is or becomes publicly available through no breach... (e) must be disclosed by law or court order"), Delaware law, no embedded restrictive covenants; nothing beyond a routine mutual NDA.
NDA-2 — [PARTY B] and Bonusly: YELLOW — Embedded non-solicit: "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" — a hiring/HR restriction beyond confidentiality that warrants counsel review (otherwise mutual, standard carve-outs, Delaware law).
NDA-3 — [PARTY C] and Bonusly: RED — Multiple red flags compounding: a three-year non-compete ("Recipient shall not, directly or indirectly, engage in or provide services to any business that competes with Discloser's business"), one-way terms in Discloser's favor with a long 5-year term, foreign governing law/exclusive jurisdiction ("the laws of the Republic of Ireland, and the parties submit to the exclusive jurisdiction of its courts"), AND "No confidentiality carve-outs are stated" — the missing carve-outs alone create unbounded confidentiality exposure.