Mean 0.968 · 34/40 perfect tests · $0.59 total · each card: the question → the correct answer (gold) → this model's actual answer
DEFINITIONS
- DS2+ deal: stage ∈ {DS2, DS3, DS4, DS5} (124 deals of 156 total).
- why_buys compliant: present, ≥15 chars, not a placeholder (tbd / n/a / see notes). Form LONG(n) is treated as present + substantive.
- non-compliant on why-buys: blank (or placeholder) value.
- no DS1 timestamp: t_ds1 blank.
- regressed: any present earlier-stage timestamp strictly later than a present later-stage timestamp (t_ds1…t_ds5).
NUMBERS
- DS2+ deals: 124. Non-compliant on why-buys: 101 (all blank; 23 had LONG(n) present, 0 had plain text, 0 placeholders). = 101/124 = 81.5%.
Arithmetic: 124 − 23 compliant = 101 non-compliant; 101 ÷ 124 = 0.8149 → 81.5%.
By owner (name, owner_id — non-compliant/total, %):
- Alex Franklin (84342457): 48/61 = 78.7%
- Dana Mercer (83155923): 18/22 = 81.8%
- Cole Ingram (83155924): 19/22 = 86.4%
- Bryce Harmon (119337721): 15/18 = 83.3%
- Farid Osman (716654662): 1/1 = 100.0%
(Gavin Porter/Hugo Lindqvist archived, absent; Elena Sinclair only owns a DS1 deal, excluded.) Sum check: 48+18+19+15+1 = 101; 61+22+22+18+1 = 124. ✓
- Deals with no DS1 timestamp: 0 (every deal has t_ds1 populated).
- Deals that regressed: 0.
THREE PROCESS FIXES
1. Gate DS2 advancement on a validated why_buys (≥15 chars, placeholders rejected). Root cause of the 81.5% gap is that 101 DS2+ deals carry blank why_buys; a pipeline rule blocking stage move past DS1 until the field is real stops new leakage.
2. Run a remediation sprint on the 101 existing blank DS2+ deals, prioritized by exposure — Alex Franklin alone owns 48 of them, the largest single-owner block; backfill before forecast commit.
3. Add an automated stage-timestamp guard (flag t_dsN < t_ds(N−1)) plus a weekly by-owner why_buys compliance report. DS1 coverage (0 missing) and ordering (0 regressions) are already clean — these guardrails keep them that way and surface owner-level drift like Cole Ingram's 86.4%.
OWNER RESOLUTION REPORT — deals_open.csv vs owners.csv Deals resolved: 156 of 156 (all owner_ids present in deals have a match in the owners table) Deals with no owner-id match in owners table: NONE - Every owner_id appearing in the extract (119337721, 84342457, 83155923, 83155924, 716654662, 701163055) is present in owners.csv, so nothing was guessed and nothing was left unresolved. Owner ids mapping to archived/deactivated owners: NONE - The two archived owners in owners.csv are Gavin Porter (id 1520255671) and Hugo Lindqvist (id 77260721). Neither id appears on any deal row, so no open deal is owned by an archived/deactivated owner. Total pipeline per resolved owner (count and sum of amount): 1. Bryce Harmon (id 119337721): 35 deals, $1,054,144.00 2. Alex Franklin (id 84342457): 67 deals, $624,310.00 3. Dana Mercer (id 83155923): 24 deals, $341,195.00 4. Cole Ingram (id 83155924): 22 deals, $288,161.43 5. Farid Osman (id 716654662): 7 deals, $4,134.00 6. Elena Sinclair (id 701163055): 1 deal, $2,100.00 Arithmetic check (deal counts): 35 + 67 + 24 + 22 + 7 + 1 = 156 ✓ Arithmetic check (pipeline total): $1,054,144.00 + $624,310.00 + $341,195.00 + $288,161.43 + $4,134.00 + $2,100.00 = $2,314,044.43 Notes: - No name was inferred for any id; all six owners resolved directly from owners.csv. - The two archived owner ids (1520255671, 77260721) carry zero deals in this extract. - Cole Ingram's total includes fractional amounts (e.g., Deal-AF932D $7,225.40, Deal-FF809F $7,781.20, Deal-A71728 $6,947.50, Deal-42326B $2,480.40, Deal-175395 $4,779.88, Deal-2F3A66 $3,334.80, Deal-D04904 $58,529.25) which is why that sum carries cents.
Integrity check results below. All figures computed directly from the two files (gong = 67 rows, deals_open = 156 rows, 156 distinct open deal_ids, no duplicate deal_ids inside deals_open). (a) Orphans — gong rows whose deal id has NO match in deals_open - Count: 30 of 67 gong rows (the other 37 gong rows do match an open deal). - Sample aliases (taken verbatim from the data): Deal-8FA85D (60251290957), Deal-8FC3F9 (60251649055), Deal-3B7945 (60251639682), Deal-42B265 (61227242540), Deal-9CCC42 (61430316324), Deal-36EA09 (60251082126), Deal-9A43B4 (60250446726), Deal-605F3C (60251622924), Deal-E2D34B (60251652002), Deal-76821A (60251092117), Deal-D84A2D (60251004342), Deal-1A0416 (62333117085), Deal-228783 (60251681286), Deal-3F86A0 (60419904928), Deal-9897FA (60905732106). Note: these are all the high-call-count rows (46, 24, 21, 21, 17, 17, 14, 12, 11, 11, 9, 8, 7, 6, 6 calls) — i.e. the gong export includes call records for deals that are NOT in the current open default pipeline. (gong_owner_id was correctly NOT used for matching, per the note that it is a Gong user id.) (b) Duplicate conversation keys — rows where calls_90d > distinct_conversation_keys - Count: 0. - In every one of the 67 gong rows, calls_90d equals distinct_conversation_keys exactly (e.g., Deal-C6FE92: 11=11; Deal-8FA85D: 46=46; Deal-AC944F: 5=5). No row has more calls than distinct conversation keys, so there are no duplicate-key rows. (c) Open deals at DS3 or later, share with at least one logged call - Open deals at stage DS3, DS4, or DS5: 85. - Of those, the ones whose deal_id appears in the gong table (i.e., ≥1 logged call): 25. - Share = 25 / 85 = 0.2941 = 29.4% (about 7 in 10 DS3+ open deals have NO logged call in this 90-day gong cut). - Sample DS3+ open deals with NO logged call: Deal-9AAE5F (47659847193, DS4), Deal-403845 (64524461403, DS5), Deal-6787C2 (60083540312, DS4), Deal-2465CE (47098082209, DS5), Deal-F0EBBB (60862757952, DS3), Deal-FC22A3 (48987890209, DS3), Deal-7BBDFA (61055143851, DS3). 60 of the 85 fall in this no-call bucket. Caveat: "logged call" here means the deal_id is present in the gong_calls_by_deal_90d table. The gong table itself has no explicit "call logged" flag beyond calls_90d>0, and every matched row has calls_90d ≥ 1, so presence = at least one call. No data was invented; all aliases and ids are copied exactly from the provided files.
```sql
-- Goal: per customer company, for its first calendar month as a customer,
-- return unique givers, recognition count, and successful redemption count.
--
-- Source decision: PRODUCTION.PLG.COMPANY_COHORT_SUMMARY is the ONLY table in
-- the catalog that carries per-company first-month giver/gives/redemptions
-- (M1_USERS, M1_GIVES, M1_REDEMPTIONS = lifecycle month 1 = first calendar
-- month as a customer). There is no raw recognition-events table exposed in
-- this catalog excerpt, so these pre-aggregated M1_* columns are the source.
--
-- Business-rule compliance:
-- * Redemptions = STATE='succeeded' only. M1_REDEMPTIONS is the documented
-- first-month redemption figure (granular source would be
-- PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2 WHERE STATE='succeeded',
-- but that table exposes no join/date keys in this excerpt, so we use the
-- cohort aggregation and flag it for finance-grade confirmation).
-- * The "exclude deleted givers" filter is intentionally NOT applied: the
-- catalog rule states it must NOT be applied to historical giving counts
-- because it understates history. The M1_* aggregates are used as-is, so
-- no deleted-giver exclusion is possible or required here.
SELECT
-- Catalog: "one row per self-serve company." The per-company key is not
-- named in the excerpt; select the actual company key column here
-- (e.g. <company_key>) to label each row.
DATE_TRUNC('month', FIRST_SUB_PAYMENT_DATE) AS first_calendar_month, -- "customer" = paying => first paid month
M1_USERS AS unique_givers,
M1_GIVES AS recognition_count,
M1_REDEMPTIONS AS successful_redemption_count
FROM PRODUCTION.PLG.COMPANY_COHORT_SUMMARY
-- FROM choice: sole catalog source for first-month givers/gives/redemptions.
-- No JOIN is needed; all three metrics live on this one row per company.
-- Tables deliberately AVOIDED (they exist but must not be used per catalog):
-- * PRODUCTION.HUBSPOT.DEALS -> STALE (last sync 2023-03)
-- * HUBSPOT_HUB_1973303.V2_LIVE.OBJECTS_DEALS -> UNPOPULATED
-- * PRODUCTION.HUBSPOT.GONG_HUBSPOT_MAP_FAST -> RETIRED pattern
WHERE FIRST_SUB_PAYMENT_DATE IS NOT NULL -- company must have a customer start date
AND CURRENT_STATUS IS NOT NULL -- and a recorded customer status
;
```
CRITICAL DATA-INTEGRITY FLAG: The brief asks me to audit "deals" (owner, stage, amount, close date, why-buys) and to rank the "10 fixes with the most pipeline amount at stake." But no deals/deals file, opportunities table, or any amount field was included in the CRM extract you pasted — the only files present are companies.csv, contacts.csv, and zoominfo_enrichment.csv, and none of them contain owner, stage, amount, close date, or why-buys. I cannot compute pipeline amount or rank fixes by dollars because that data is not in the provided extract. I will not invent deal amounts. Everything below is built only from the three files given.
═════════════════════════════════════════════
1. COMPLETENESS PERCENT BY FIELD
═════════════════════════════════════════════
Company fields (n=34 companies):
domain: 34/34 = 100.0%
industry: 34/34 = 100.0%
employee_count: 25/34 = 73.5% (9 missing)
hq_country: 28/34 = 82.4% (6 missing)
Contact fields (n=52 contacts):
email: 52/52 = 100.0%
domain: 52/52 = 100.0%
title: 39/52 = 75.0% (13 missing)
persona: 37/52 = 71.2% (15 missing)
Deal fields: NOT COMPUTABLE — no deals file provided (no owner/stage/amount/close date/why-buys rows exist in the extract).
Missing company rows, by alias:
employee_count only or both:
C-EC3025 (emp missing, hq=USA), C-96039F (emp missing, hq=USA), C-44EA29 (emp missing, hq empty), C-D04904 (emp missing, hq empty), C-B23205 (emp missing, hq=US), C-60C75F (emp missing, hq=United States), C-7BBDFA (emp missing, hq=Canada), C-50D386 (emp missing, hq=Canada), C-2C60E5 (emp=340, hq empty), C-93C8BF (emp empty, hq=Canada), C-EE9FFB (emp=1500, hq empty)
(employee_count missing: C-EC3025, C-96039F, C-44EA29, C-D04904, C-B23205, C-60C75F, C-7BBDFA, C-50D386, C-93C8BF = 9)
hq_country missing: C-D73B89, C-44EA29, C-D04904, C-2C60E5, C-7BBDFA, C-50D386, C-EE9FFB = 7 (note C-44EA29 and C-D04904 and C-7BBDFA and C-50D386 appear in both lists).
═════════════════════════════════════════════
2. DUPLICATE COMPANY CLUSTERS (shared domain)
═════════════════════════════════════════════
Cluster A — domain acme-corp.com (2 rows):
• C-0A092931 — industry=Technology, emp=500, hq=US
• C-0A092932 — industry=tech, emp=510, hq=USA
Survivor: C-0A092931 (kept as canonical; C-0A092932 is a near-duplicate with inconsistent casing and a 10-headcount delta). Recommend dedupe and re-point C-0A092932's contacts (none in contacts.csv) to C-0A092931.
Cluster B — domain globex.io (2 rows):
• C-0A092933 — industry=SaaS, emp=200, hq=US
• C-0A092934 — industry=Technology, emp=200, hq=US
Survivor: C-0A092933 (retain SaaS label; C-0A092934 duplicates the same domain/headcount). Re-point any C-0A092934 contacts to C-0A092933.
No name-variant clusters without shared domain were found (every duplicate shares an identical domain). Note: industry text is inconsistent across the file ("tech"/"Tech "/"Technology"; "health care"/"Healthcare") but those are distinct domains, not duplicates.
═════════════════════════════════════════════
3. INVALID EMAILS
═════════════════════════════════════════════
4 contacts have a malformed/empty email (no domain after "@"):
• CT-0010 (C-66D1FC) — "user0@"
• CT-0080 (C-92D97D) — "user0@"
• CT-0081 (C-92D97D) — "user1@"
• CT-0192 (C-425E2A) — "user2@"
═════════════════════════════════════════════
4. DOMAIN MISMATCHES (email domain ≠ company domain)
═════════════════════════════════════════════
• CT-0010 (C-66D1FC) — "user0@" — no domain (also invalid)
• CT-0011 (C-66D1FC) — "user1@other-domain.com" — email domain "other-domain.com" ≠ company "66d1fc.com"
• CT-0080 (C-92D97D) — "user0@" — no domain (also invalid)
• CT-0081 (C-92D97D) — "user1@" — no domain (also invalid)
• CT-0192 (C-425E2A) — "user2@" — no domain (also invalid)
Only one true cross-domain mismatch with a resolvable domain: CT-0011 (user1@other-domain.com vs 66d1fc.com). The other four are invalid-blank (covered in §3).
═════════════════════════════════════════════
5. ENRICHMENT FILLS (CRM empty, enrichment has a value)
═════════════════════════════════════════════
Fill employee_count from zoominfo where CRM blank:
• C-EC3025 ← 400
• C-96039F ← 400
• C-44EA29 ← 400
• C-D04904 ← 400
• C-B23205 ← 400
• C-60C75F ← 400
• C-7BBDFA ← 400
• C-50D386 ← 400
No hq_country fills possible: every CRM blank hq_country also has a blank zi_hq_country in enrichment (C-D73B89, C-44EA29, C-D04904, C-2C60E5, C-7BBDFA, C-50D386, C-EE9FFB → all blank in enrichment too). No enrichment industry fills needed (CRM industry always present). 9 company domains have NO enrichment row at all (C-BA969B, C-332637, C-93C8BF, C-EE9FFB, C-C9BB20, C-0A092931, C-0A092932, C-0A092933, C-0A092934) so nothing can be filled there.
═════════════════════════════════════════════
6. CRM vs ENRICHMENT DISAGREEMENTS (both present, differ)
═════════════════════════════════════════════
Industry (CRM free-text vs zoominfo normalized):
• C-66D1FC CRM=tech vs ZI=Computer Software
• C-EC3025 CRM=Technology vs ZI=Computer Software
• C-44EA29 CRM=tech vs ZI=Computer Software
• C-92D97D CRM=Technology vs ZI=Computer Software
• C-D04904 CRM=Technology vs ZI=Computer Software
• C-77A95A CRM=Technology vs ZI=Computer Software
• C-AA8DDA CRM=Technology vs ZI=Computer Software
• C-B25F40 CRM=Technology vs ZI=Computer Software
• C-60C75F CRM=tech vs ZI=Computer Software
• C-425E2A CRM="Tech " (trailing space) vs ZI=Computer Software
Recommendation: For industry taxonomy, prefer the external enrichment (zoominfo / "Computer Software") as the standardized value and map CRM free-text ("tech"/"Technology"/"Tech ") into that controlled vocabulary. The CRM values are clearly the same category expressed inconsistently.
Employee_count disagreements (CRM vs ZI): NONE — every company with both present agrees (where CRM has a count, ZI matches or ZI is also blank). The only employee_count diffs are the fills above.
hq_country disagreements: NONE after normalizing US/USA/United States and UK. (e.g., C-66D1FC CRM=US vs ZI=United States → same; C-96039F CRM=USA vs ZI=United States → same.)
═════════════════════════════════════════════
7. TOP 10 FIXES BY PIPELINE AMOUNT AT STAKE
═════════════════════════════════════════════
CANNOT BE PRODUCED. The brief asks for the 10 fixes ranked by "most pipeline amount at stake," but the provided extract contains NO deal/opportunity records and NO amount field anywhere (companies.csv has no amount; contacts.csv has no amount; enrichment has no amount). There is therefore no dollar value to attach to any fix. I will not fabricate pipeline amounts.
What I can rank instead — the fixes by data-impact / record count, which is the only ordering the supplied data supports:
1. Industry standardization (10 companies CRM-vs-ZI disagreement) — C-66D1FC, C-EC3025, C-44EA29, C-92D97D, C-D04904, C-77A95A, C-AA8DDA, C-B25F40, C-60C75F, C-425E2A
2. employee_count enrichment fill (8 companies) — C-EC3025, C-96039F, C-44EA29, C-D04904, C-B23205, C-60C75F, C-7BBDFA, C-50D386
3. Merge duplicate cluster A — acme-corp.com (C-0A092931 / C-0A092932)
4. Merge duplicate cluster B — globex.io (C-0A092933 / C-0A092934)
5. Contact title missing (13 contacts) — e.g. CT-0000, CT-0022, CT-0041, CT-0072, CT-0081, CT-0092, CT-0120, CT-0121, CT-0122, CT-0132, CT-0141, CT-0162, CT-0170
6. Contact persona missing (15 contacts) — e.g. CT-0022, CT-0041, CT-0060, CT-0070, CT-0082, CT-0092, CT-0110, CT-0132, CT-0162, CT-0170, CT-0171, CT-0172, CT-0180, CT-0181, CT-0192
7. hq_country missing (7 companies) — C-D73B89, C-44EA29, C-D04904, C-2C60E5, C-7BBDFA, C-50D386, C-EE9FFB (no enrichment available → must source elsewhere)
8. Invalid emails (4 contacts) — CT-0010, CT-0080, CT-0081, CT-0192
9. Domain mismatch with real external domain (1) — CT-0011 (user1@other-domain.com)
10. Companies with no enrichment coverage at all (9) — C-BA969B, C-332637, C-93C8BF, C-EE9FFB, C-C9BB20, C-0A092931, C-0A092932, C-0A092933, C-0A092934 (cannot be enriched from supplied file)
To produce the actual "top 10 by pipeline amount," please supply the deals/opportunities extract (with owner, stage, amount, close date, why-buys and a company_alias or contact link). I will then re-rank every fix above against real dollar exposure and report it.
CLOSED-LOST CLASSIFICATION — 90 deals in file (close dates 2026-07-29 to 2026-09-30) METHODOLOGY - Category: one of pricing / competitor / no decision / timing / product gap / champion left / other, derived from the structured closed_lost_tag AND the free-text reason (free text wins where they conflict). - Side: Bonusly = loss attributable to a Bonusly shortcoming (product/feature gap or uncompetitive value); buyer = loss driven by the buyer's circumstance or decision (timing, deprioritization, budget not approved, going dark, choosing a competitor, internal change, ICP misfit); unknown = free text gives no actionable reason. - "Lost DM" read as "Lost – Decision Maker"; "MIA" read as buyer went silent (no decision). PER-DEAL (alias | structured tag | category | side) Deal-DB0AAC | Lost-Timing | timing | buyer Deal-F7F635 | Competitor | competitor | unknown Deal-AC944F | MIA | no decision | buyer Deal-214060 | MIA | no decision | buyer Deal-91A056 | Lost-Timing | timing | buyer Deal-29326C | Lost-Timing | timing | buyer Deal-5DB9B0 | Lost-ICP | other | buyer Deal-831B7B | Lost-Timing | timing | buyer Deal-F97C37 | Competitor | competitor | Bonusly Deal-13E9CF | Not-a-priority/Cost | no decision | buyer Deal-39E25C | Lost-Timing | timing | buyer Deal-7ED004 | Lost-Budget/Price | pricing | buyer Deal-21B045 | MIA | no decision | buyer Deal-B3ABED | Lost-Timing | timing | buyer Deal-422BA6 | Competitor | competitor | Bonusly Deal-ED9AE7 | Lost DM | no decision | buyer Deal-988493 | MIA | no decision | buyer Deal-381C8C | Competitor | competitor | unknown Deal-F308CA | MIA | no decision | buyer Deal-F1E8A6 | Competitor | competitor | unknown Deal-B6AC09 | Lost-Timing | timing | buyer Deal-70F704 | Lost DM | no decision | buyer Deal-E6E80A | Lost-Timing | timing | buyer Deal-B038F0 | Lost-Timing | timing | buyer Deal-4664E1 | MIA | no decision | buyer Deal-175756 | Lost-Timing | timing | buyer Deal-E74A73 | Not-a-priority/Cost | no decision | buyer Deal-DDAB52 | Competitor | competitor | Bonusly Deal-ACE061 | Competitor | competitor | unknown Deal-BB78F3 | Lost-Timing | timing | buyer Deal-D48E0B | MIA | no decision | buyer Deal-15DA99 | Lost-Timing | timing | buyer Deal-F4AF5D | Lost-Timing | timing | buyer Deal-79B7A1 | Lost-Timing | timing | buyer Deal-583ADB | MIA | no decision | buyer Deal-8E27DA | Feature Request | no decision | buyer [DISAGREEMENT] Deal-2D2F8D | Competitor | competitor | unknown Deal-E0441F | MIA | no decision | buyer Deal-7CB44D | MIA | no decision | buyer Deal-0F96AA | Competitor | competitor | unknown Deal-1BCA50 | Competitor | competitor | Bonusly Deal-7CC678 | Competitor | competitor | unknown Deal-FAC17C | Lost DM | no decision | buyer Deal-242273 | Competitor | competitor | Bonusly Deal-50E5D8 | Not-a-priority/Cost | no decision | buyer Deal-A2C349 | Competitor | competitor | Bonusly Deal-9F176A | Lost-Timing | timing | buyer Deal-7B2236 | Not-a-priority/Cost | pricing | Bonusly Deal-AFA56C | MIA | no decision | buyer Deal-C7156E | Competitor | competitor | unknown Deal-C33D91 | Lost-Budget/Price | pricing | buyer Deal-9048EB | MIA | product gap | Bonusly [DISAGREEMENT] Deal-5E64CE | Not-a-priority/Cost | timing | buyer [DISAGREEMENT] Deal-8A0992 | Competitor | competitor | Bonusly Deal-D0C698 | Competitor | competitor | buyer Deal-69CF3D | Lost-Timing | timing | buyer Deal-ECBF89 | Lost-Timing | timing | buyer Deal-3618CC | Lost DM | product gap | Bonusly [borderline] Deal-EECC02 | Competitor | competitor | unknown Deal-5AD03E | Competitor | competitor | Bonusly Deal-D1A623 | Lost-Timing | timing | buyer Deal-413C56 | Not-a-priority/Cost | no decision | buyer Deal-47F1A1 | Competitor | competitor | buyer Deal-BF2A98 | Competitor | competitor | buyer Deal-2A292B | Not-a-priority/Cost | no decision | buyer Deal-D1AABF | MIA | no decision | buyer Deal-FEDBCB | Not-a-priority/Cost | no decision | buyer Deal-1E7DA9 | Competitor | competitor | unknown Deal-2BBA21 | MIA | no decision | buyer Deal-286F9C | Competitor | competitor | Bonusly Deal-7FBAC6 | Not-a-priority/Cost | no decision | buyer Deal-369281 | Competitor | competitor | buyer Deal-386F6E | MIA | no decision | buyer Deal-9FCD0D | Competitor | competitor | buyer Deal-55867E | Lost-Timing | timing | buyer Deal-DAFB82 | Lost-Budget/Price | pricing | buyer Deal-2FEDDB | Not-a-priority/Cost | no decision | buyer Deal-64B19A | Competitor | competitor | buyer Deal-3F86A0 | MIA | no decision | buyer Deal-096750 | MIA | no decision | buyer Deal-F325A5 | Lost DM | champion left | buyer [borderline] Deal-ABD14C | Not-a-priority/Cost | no decision | buyer Deal-79E61A | MIA | no decision | buyer Deal-8A119B | Lost-Budget/Price | pricing | buyer Deal-AE7C4E | MIA | no decision | buyer Deal-DAB4F1 | MIA | no decision | buyer Deal-B4B50F | MIA | no decision | buyer Deal-981AD4 | Feature Request | product gap | Bonusly Deal-DC77FE | Competitor | competitor | Bonusly Deal-5885B9 | MIA | no decision | buyer SUMMARY — CATEGORY COUNTS (arithmetic shown) timing ............ 20 competitor ........ 26 no decision ....... 34 pricing ........... 5 product gap ....... 3 champion left ..... 1 other ............. 1 TOTAL = 20+26+34+5+3+1+1 = 90 As shares of 90: timing 22.2%, competitor 28.9%, no decision 37.8%, pricing 5.6%, product gap 3.3%, champion left 1.1%, other 1.1%. Note: timing + no decision = 54 = 60.0% of all closed-lost. Competitor is the only external-loss category of size; pricing and product gap are small. SUMMARY — SIDE SPLIT (arithmetic shown) Bonusly ... 14 (15.6%) buyer ..... 66 (73.3%) unknown ... 10 (11.1%) TOTAL = 14+66+10 = 90 Bonusly-side breakdown: 10 competitor deals whose text cites a Bonusly gap (Deal-F97C37, Deal-422BA6, Deal-DDAB52, Deal-1BCA50, Deal-242273, Deal-A2C349, Deal-8A0992, Deal-5AD03E, Deal-286F9C, Deal-DC77FE) + 3 product-gap deals (Deal-9048EB, Deal-3618CC, Deal-981AD4) + 1 pricing/value deal (Deal-7B2236). Unknown-side = 10 competitor deals with no stated reason (Deal-F7F635, Deal-381C8C, Deal-F1E8A6, Deal-ACE061, Deal-2D2F8D, Deal-0F96AA, Deal-7CC678, Deal-C7156E, Deal-EECC02, Deal-1E7DA9). buyer-side = all timing + all no-decision + 4 pricing (budget-not-approved: Deal-7ED004, Deal-C33D91, Deal-DAFB82, Deal-8A119B) + 6 competitor-to-incumbent (Deal-D0C698, Deal-47F1A1, Deal-BF2A98, Deal-369281, Deal-9FCD0D, Deal-64B19A) + champion-left (Deal-F325A5) + other (Deal-5DB9B0). SUMMARY — TAG vs FREE-TEXT DISAGREEMENTS Strict count (tag's implied category vs free-text's stated primary reason are incompatible): 3 1. Deal-8E27DA — tag "Feature Request" (product gap) but text "moved forward with just a swag provider and didn't want R&R" = no decision. 2. Deal-9048EB — tag "MIA" (buyer silence) but text "bad fit based on desired setup and multiple feature gaps" and Bonusly itself closed it = product gap (Bonusly-side). 3. Deal-5E64CE — tag "Not a priority/Cost" (no decision) but text "fee for getting out of Nectar agreement is a lot, agreement through Oct 2027" = timing/contract lock-in (they want Bonusly but are stuck). Borderline (not counted, depends on reading of "Lost DM" and on whether competitor+gap counts as a disagreement): - Deal-3618CC (tag "Lost DM"; text "Wanted Surveys" = product gap) and Deal-F325A5 (tag "Lost DM"; text "Layoffs and Change in Leadership" = champion left) — both consistent with a "decision-maker" reading of "Lost DM," so excluded. - 10 competitor-tagged deals above also carry free-text citing a Bonusly product/pricing gap. The "Competitor" tag is not contradictory (a competitor did win) but it obscures the root cause — see Pattern 2. Not counted in the strict 3, but this is the more actionable signal. TWO PATTERNS MOST WORTH ACTING ON PATTERN 1 — Losses are dominated by buyer inertia (timing + no-decision), not head-to-head competitive or pricing failure. Arithmetic: timing 20 + no decision 34 = 54 deals = 54/90 = 60.0%. Competitor is only 26 (28.9%); pricing is just 5 (5.6%); product gap only 3 (3.3%). Within the 34 no-decision deals, a large share are pure ghosting with no real engagement — e.g., Deal-4664E1 "No contact after intro - ignored outreach," Deal-2BBA21 "No contact since intro call. Ignored four nudges," Deal-7CB44D "No meaningful contact since demo," Deal-E0441F stale inherited deal, Deal-096750 "Ignored four attempts to revive." Many timing deals explicitly say "reconnect 2027 / Q2 next year / early 2027" (Deal-DB0AAC, Deal-91A056, Deal-B6AC09, Deal-15DA99, Deal-9F176A, Deal-B3ABED, etc.). Action: tighten early qualification and first-meeting engagement; build a disciplined re-engagement/nurture cadence for "on hold"/timing deals timed to their stated reconnect window; and enforce pipeline hygiene to purge genuinely dead MIA records rather than letting them inflate loss counts. PATTERN 2 — When Bonusly does lose competitively, the differentiator is capability gaps (not price), and the barrier is often a locked-in incumbent. Among the 26 competitor losses, the free text repeatedly names Bonusly missing capabilities: surveys (Deal-A2C349 stayed with Awardco "add their surveying functionality"; Deal-3618CC "Wanted Surveys"), integrations/PEO (Deal-422BA6 "preferred ADP TotalSource PEO partner… pre-built integrations"), customization (Deal-DC77FE "label points as dollars"; Deal-8A0992 "more closely aligns"), value-at-same-cost (Deal-DDAB52 "Rippl offers a lot more at the same cost"), on-site points redemption (Deal-242273), diversified offerings (Deal-F97C37), UK/international (Deal-981AD4 "not UK focused"), budget-access feature (Deal-5AD03E). Decisively, Deal-DC77FE states "Bonusly was a very strong contender, and you were competitive in price so that wasn't a factor" — price is NOT the lever; features are. Several losses are to incumbents the buyer is contract-locked with: Deal-5E64CE (Nectar through Oct 2027), Deal-47F1A1 (WorkTango 12 months), Deal-BF2A98 (HiThrive already deployed), Deal-369281 (Paylocity), Deal-64B19A (Motivosity), Deal-D0C698 (Kudos past user). Switching cost / contract timing — not Bonusly's pitch — is the barrier. Action: (a) Product/roadmap — prioritize surveys, ADP/PEO and key integrations, point-customization (label-as-dollars), international/UK support, and on-site redemption; (b) GTM — run a "contract-end / competitive displacement" play. Multiple buyers literally say "reach out when closer to contract end" (Deal-5E64CE) or name a future reconnect (Pattern 1), so build a contract-expiry landmine/timer motion and capture them at renewal — rather than discounting, which the data shows is not the deciding factor.
{
"tier_counts": {
"LOCK": 3,
"ACTION": 6,
"BUILD": 7,
"REVIVE": 39,
"WATCH": 66,
"RISKY": 35
},
"tier_examples": {
"LOCK": ["Deal-D348E1", "Deal-C26D20", "Deal-403845"],
"ACTION": ["Deal-25F752", "Deal-944310", "Deal-3974EB"],
"BUILD": ["Deal-C6FE92", "Deal-EE195F", "Deal-46988D"],
"REVIVE": ["Deal-D73B89", "Deal-012CB1", "Deal-523604"],
"WATCH": ["Deal-6787C2", "Deal-2D1F1B", "Deal-66D1FC"],
"RISKY": ["Deal-E53952", "Deal-5408B0", "Deal-9AAE5F"]
},
"risky_deals": [
"Deal-E53952", "Deal-5408B0", "Deal-9AAE5F", "Deal-547B2B", "Deal-B7EBD1",
"Deal-A2B47C", "Deal-2465CE", "Deal-C61CF7", "Deal-62D607", "Deal-584EE5",
"Deal-C6D97A", "Deal-7B3B0F", "Deal-F9A08A", "Deal-0660B4", "Deal-FD9F4E",
"Deal-BA571A", "Deal-FC22A3", "Deal-7BBDFA", "Deal-60C2C2", "Deal-4A13AD",
"Deal-8AD4A5", "Deal-15D24F", "Deal-9D0060", "Deal-690476", "Deal-635B8E",
"Deal-ED725A", "Deal-55164C", "Deal-3BA5EA", "Deal-5FDCE4", "Deal-F336B6",
"Deal-5EED42", "Deal-BA3DDC", "Deal-7599B8", "Deal-F9A3C1", "Deal-FA32A0"
],
"lock_violations": 0,
"pipeline_shape": "Of 156 open deals the book is overwhelmingly early-stage and under-engaged: 66 WATCH (PIPELINE, zero meetings_30d) and 39 REVIVE (PIPELINE with at least one meeting) account for ~67% of all deals, while only 3 LOCK (COMMIT, stage DS4+ with a meeting) and 6 ACTION carry real near-term commit confidence. A 35-deal RISKY cohort (optimistic COMMIT/BEST_CASE forecast but zero meetings in the last 30 days) — about 22% of the pipeline — signals forecast inflation, since the forecast category disagrees with the engagement evidence. BUILD (7) is a thin middle band of BEST_CASE deals that show meetings but sit in earlier stages."
}
[
{
"transcript_id": "TX-001",
"deal_alias": "Deal-CFE7F4",
"why_buys": [
"Automating anniversary and birthday awards — our HR team of three cannot keep up with it manually."
],
"pain_points": [
"HR team of three cannot keep up with manual anniversary/birthday awards.",
"Everything is tracked in a spreadsheet and people slip through the cracks.",
"Need SSO and audit logs for IT to sign off."
],
"stakeholders": [
"Prospect (VP People)",
"Prospect (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 with IT lead on September 12",
"objections": [
"Need SSO and audit logs before IT signs off.",
"Achievers was too heavy for a team their size (implied fit risk)."
],
"confidence": "high"
},
{
"transcript_id": "TX-002",
"deal_alias": "Deal-70BB30",
"why_buys": [
"Tie recognition to retention for the hourly workforce — regretted turnover there is over 30%."
],
"pain_points": [
"Regretted turnover for hourly workforce over 30%.",
"Workday integration has to be rock solid (CFO's one condition)."
],
"stakeholders": [
"Prospect (Head of Total Rewards)",
"Prospect (CFO)"
],
"budget_signal": "$25k pilot budget approved for this quarter",
"timeline_signal": "Decision by end of September",
"competitor_mentioned": null,
"next_step": "Send the pilot agreement; prospect will route to legal this week",
"objections": [
"Workday integration must be rock solid (CFO condition)."
],
"confidence": "high"
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why_buys": [
"Make recognition visible across 12 retail locations.",
"Store managers have zero budget autonomy for on-the-spot recognition today."
],
"pain_points": [
"Recognition not visible across 12 retail locations.",
"Store managers have zero budget autonomy for on-the-spot recognition."
],
"stakeholders": [
"Prospect (People Ops Manager)"
],
"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",
"objections": [
"CEO has to 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.",
"Paying for three tools and none talk to the HRIS."
],
"pain_points": [
"Paying for three tools that don't integrate with HRIS.",
"Procurement cycle runs six to eight weeks minimum.",
"Security review took three months for the last vendor."
],
"stakeholders": [
"Prospect (VP People)",
"Prospect (IT Security Lead)"
],
"budget_signal": "Under $15k annually can be approved without going to the board",
"timeline_signal": "Procurement cycle six to eight weeks minimum",
"competitor_mentioned": null,
"next_step": null,
"objections": [
"Security review took three months for the last vendor (hesitation).",
"Procurement cycle six to eight weeks minimum.",
"No firm commitment to CFO follow-up ('Maybe — I need to check her calendar, no promises')."
],
"confidence": "low"
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why_buys": [
"Automate service milestones.",
"Analytics on recognition equity across departments.",
"Night-shift teams feel invisible (engagement scores 20 points lower)."
],
"pain_points": [
"Night-shift teams feel invisible; engagement scores 20 points lower.",
"Need analytics on recognition equity across departments.",
"Exec team skeptical after a failed rollout two years ago."
],
"stakeholders": [
"Prospect (HR Director)",
"Prospect (People Ops Coordinator)"
],
"budget_signal": "$12k approved under the engagement line",
"timeline_signal": "Running before the January all-hands",
"competitor_mentioned": "Nectar (mid-pilot now; must beat that experience)",
"next_step": "Present to the exec team on October 2",
"objections": [
"Exec team skeptical after a failed rollout two years ago.",
"Active Nectar pilot must be beaten."
],
"confidence": "medium"
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why_buys": [
"Cut the admin time on service awards.",
"Personally spends five hours a month ordering and shipping plaques."
],
"pain_points": [
"Spends five hours a month ordering and shipping plaques.",
"Admin time on service awards is the core problem (not budget)."
],
"stakeholders": [
"Prospect (HR Manager)"
],
"budget_signal": null,
"timeline_signal": "Q1 start realistic (fiscal year resets in February)",
"competitor_mentioned": null,
"next_step": "Send one-page overview; prospect will forward to COO this week",
"objections": [
"COO usually prefers building things in-house."
],
"confidence": "medium"
}
]
Analysis — CRM shows DS5/COMMIT as the most advanced stage. Slack overrides/refines CRM: • Deal-2465CE (CRM: DS5/COMMIT, $5,400, close 2026-09-10) is REJECTED — Dana says champion left, procurement froze vendors, pulled from commit, now a Q4 deal. Remaining DS5/COMMIT deals with Slack signal, ranked by closeness to signature: 1. Deal-547B2B — $11,200 Why close: Alex (09-04) — redlines clean, signing page out, VP People "signing tomorrow." Signature-imminent. Left: nothing substantive; awaiting the signature. 2. Deal-403845 — $9,000 Why close: Dana (09-04) — "moving fine," order form with their finance team. Left: finance sign-off / signature. 3. Deal-A2B47C — $6,360 Why close: Alex (09-04) — "still warm, just normal legal-review pace"; CRM DS5/COMMIT, close 2026-09-11. Left: legal review, then signature. (Runner-up Deal-D348E1, $13,770, also "warm, legal-review pace" but CRM close 2026-10-15 — later than A2B47C's 2026-09-11, so A2B47C is nearer.) Arithmetic check: top-3 amounts = 11,200 + 9,000 + 6,360 = $26,560. All three are DS5/COMMIT in CRM; all three have explicit Slack confirmation they are live and advancing. Note: Deal-B7EBD1 ($9,000, DS5/COMMIT, 09-10) has no Slack signal and is not flagged as blocked, but also lacks confirmation of imminent signing, so it ranks below the three above.
Candidates (prospect voice only — rep lines excluded):
1) Deal-EC3025
Prospect line: "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management."
Classification: REAL GAP
Arithmetic vs product docs: product_docs "Supported integrations" explicitly lists "SCIM user provisioning ... are NOT currently listed as supported capabilities." Capability is absent from the product → cannot be met by any plan. Real gap.
Amount: not present in the provided data.
2) Deal-D0D6B5
Prospect line: "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us."
Classification: REAL GAP
Arithmetic vs product docs: product_docs "Supported integrations" explicitly lists "ADP Workforce Now integrations are NOT currently listed as supported capabilities." Capability is absent from the product → cannot be met by any plan. Real gap.
Amount: not present in the provided data.
3) Deal-CFE7F4
Prospect line: "I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?"
Classification: PLAN GATE (not a real gap)
Arithmetic vs product docs: plan table shows Custom report builder = yes only on Enterprise ("—" for Core and Pro). The capability EXISTS in the product; it is gated to a higher tier. Rep confirmed: "The custom report builder sits on our Enterprise tier." → plan gate, excluded from real-gap summary.
4) Deal-84DBA6
Prospect line: "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."
Classification: ROLLOUT/ENABLEMENT ISSUE (not a real gap)
Arithmetic vs product docs: Slack integration = yes on all plans per docs. The integration is supported and turned on; the issue is manager training/adoption, not missing product capability. Rep confirmed enablement path. → rollout/enablement, excluded from real-gap summary.
Excluded by rule:
TG-005 (Deal-36C33F): the mobile-app-for-hourly-workers gap was raised by the REP ("we don't have a native mobile app for hourly workers yet"), not the prospect. Per "Rep language does not count as prospect voice," it is excluded. The prospect's reply ("The web version should be fine for our office staff for now") accepts the status, raising no gap.
SUMMARY — real gaps only:
- Deal-EC3025: SCIM user provisioning not supported by product (real gap).
- Deal-D0D6B5: ADP Workforce Now integration not supported by product (real gap).
Deal amounts: the provided files (transcripts_gaps.csv, product_docs.md) contain no deal-amount field. I cannot name amounts — that data is missing.
STALE OPEN DEALS — snapshot 2026-09-05 Recency = max(last_email, last_call, last_meeting) from engagements_by_deal_90d, using only dates on/before the snapshot. A deal is stale if its most recent real logged contact is ≥8 days before 2026-09-05 (i.e., on/before 2026-08-28). The deal's last_contacted_field was NOT used. Future-dated engagement fields (a meeting logged after the snapshot) were ignored — they cannot represent a real past touch. Grouped by owner, ordered by amount descending within each owner: Bryce Harmon (owner_id 119337721) Deal-2D1F1B DS1 $240,000 81d (last 2026-06-16) Deal-66D1FC DS1 $99,000 16d (last 2026-08-20) Deal-950043 DS1 $70,000 19d (last 2026-08-17) Deal-B23205 DS1 $45,000 16d (last 2026-08-20) Deal-7BBDFA DS3 $37,440 46d (last 2026-07-21) Deal-332637 DS2 $36,000 9d (last 2026-08-27) Deal-1BEEBF DS1 $31,500 19d (last 2026-08-17) Deal-A414F6 DS1 $25,200 19d (last 2026-08-17) [future-dated 2026-09-10 ignored] Deal-C5658B DS1 $23,400 16d (last 2026-08-20) Deal-40522D DS3 $21,000 19d (last 2026-08-17) Deal-C1FA6D DS1 $18,000 16d (last 2026-08-20) [future-dated 2026-09-15 ignored] Deal-01E193 DS1 $12,600 8d (last 2026-08-28) [future-dated 2026-09-09 ignored] Deal-F0EBBB DS3 $11,400 24d (last 2026-08-12) Deal-927338 DS1 $10,920 18d (last 2026-08-18) [future-dated 2026-09-17 ignored] Deal-E25A09 DS1 $6,000 9d (last 2026-08-27) Deal-C9C286 DS2 $5,502 9d (last 2026-08-27) Deal-012CB1 DS1 $1 23d (last 2026-08-13) Deal-3795AD DS2 $1 8d (last 2026-08-28) [future-dated 2026-10-02 ignored] -> 18 stale deals | total $692,964 Dana Mercer (owner_id 83155923) Deal-44EA29 DS2 $60,000 10d (last 2026-08-26) Deal-E51FB7 DS2 $43,875 12d (last 2026-08-24) Deal-B42F46 DS1 $27,000 19d (last 2026-08-17) Deal-BA3DDC DS3 $23,400 15d (last 2026-08-21) Deal-9DDE86 DS2 $20,000 15d (last 2026-08-21) Deal-215CCA DS3 $18,900 17d (last 2026-08-19) Deal-5EED42 DS3 $16,250 11d (last 2026-08-25) Deal-57887A DS2 $15,000 8d (last 2026-08-28) Deal-944310 DS4 $10,500 33d (last 2026-08-03) [future-dated 2026-09-15 ignored] Deal-B7EBD1 DS5 $9,000 16d (last 2026-08-20) Deal-3974EB DS4 $9,000 8d (last 2026-08-28) Deal-F40F04 DS2 $8,100 15d (last 2026-08-21) Deal-7599B8 DS3 $7,350 18d (last 2026-08-18) [future-dated 2026-09-10 ignored] Deal-87DDD1 DS1 $5,000 19d (last 2026-08-17) Deal-F336B6 DS3 $4,200 15d (last 2026-08-21) Deal-0660B4 DS4 $1,920 16d (last 2026-08-20) -> 16 stale deals | total $279,495 Cole Ingram (owner_id 83155924) Deal-D04904 DS2 $58,529.25 11d (last 2026-08-25) Deal-B25F40 DS3 $40,000 8d (last 2026-08-28) Deal-813836 DS2 $32,175 11d (last 2026-08-25) Deal-1BA595 DS2 $31,750 11d (last 2026-08-25) Deal-CFE1E8 DS3 $18,000 11d (last 2026-08-25) Deal-CD47A6 DS2 $12,168 11d (last 2026-08-25) Deal-627646 DS3 $11,193 11d (last 2026-08-25) Deal-FF809F DS2 $7,781.20 11d (last 2026-08-25) Deal-AF932D DS2 $7,225.40 11d (last 2026-08-25) Deal-A71728 DS2 $6,947.50 11d (last 2026-08-25) Deal-8BC9F5 DS2 $5,616 10d (last 2026-08-26) Deal-175395 DS3 $4,779.88 11d (last 2026-08-25) Deal-481E24 DS3 $4,140 10d (last 2026-08-26) Deal-C7F9BF DS2 $3,360 11d (last 2026-08-25) Deal-2F3A66 DS3 $3,334.80 11d (last 2026-08-25) Deal-342E96 DS2 $2,700 24d (last 2026-08-12) Deal-E568D5 DS3 $1,875 11d (last 2026-08-25) Deal-FD9F4E DS5 $1,330 10d (last 2026-08-26) -> 18 stale deals | total $252,905.03 Alex Franklin (owner_id 84342457) Deal-CC08D1 DS1 $24,000 16d (last 2026-08-20) Deal-E73427 DS3 $18,000 10d (last 2026-08-26) Deal-885F45 DS2 $9,300 12d (last 2026-08-24) Deal-C2FF3C DS1 $8,316 10d (last 2026-08-26) Deal-3EED2C DS2 $7,200 days N/A — NO engagements_by_deal record (no email/call/meeting logged in provided data) Deal-0D2F7A DS3 $5,100 12d (last 2026-08-24) Deal-6C60D4 DS3 $4,800 12d (last 2026-08-24) Deal-13FEBD DS2 $4,680 12d (last 2026-08-24) Deal-819506 DS1 $4,400 8d (last 2026-08-28) [future-dated 2026-09-09 ignored] Deal-9D0060 DS3 $3,840 12d (last 2026-08-24) Deal-690476 DS2 $3,600 18d (last 2026-08-18) Deal-C6D97A DS4 $3,240 8d (last 2026-08-28) Deal-EE195F DS3 $3,120 8d (last 2026-08-28) Deal-278DEC DS3 $2,700 8d (last 2026-08-28) Deal-635B8E DS3 $2,600 18d (last 2026-08-18) Deal-6883F3 DS1 $2,400 16d (last 2026-08-20) Deal-4A13AD DS3 $2,160 26d (last 2026-08-10) Deal-F67D31 DS2 $1,800 8d (last 2026-08-28) Deal-5FDCE4 DS3 $1,600 12d (last 2026-08-24) Deal-BA571A DS4 $1,080 18d (last 2026-08-18) -> 20 stale deals | total $113,936 Farid Osman (owner_id 716654662) Deal-8BA24E DS1 $2,880 8d (last 2026-08-28) [future-dated 2026-09-15 ignored] Deal-8FDCD2 DS1 $1 15d (last 2026-08-21) [future-dated 2026-09-15 ignored] -> 2 stale deals | total $2,881 Elena Sinclair (owner_id 701163055) Deal-57FF13 DS1 $2,100 days N/A — NO engagements_by_deal record (no email/call/meeting logged in provided data) -> 1 stale deal | total $2,100 PER-OWNER SUMMARY Bryce Harmon 18 deals | $692,964.00 Dana Mercer 16 deals | $279,495.00 Cole Ingram 18 deals | $252,905.03 Alex Franklin 20 deals | $113,936.00 Farid Osman 2 deals | $2,881.00 Elena Sinclair 1 deal | $2,100.00 ────────────────────────────────────────────── GRAND TOTAL 75 deals | $1,344,281.03 Notes / data caveats (all from the data as given): - Of 156 open deals, 154 appear in engagements_by_deal_90d. The 2 missing — Deal-3EED2C (Alex Franklin) and Deal-57FF13 (Elena Sinclair) — have no logged email/call/meeting in the provided data, so they cannot satisfy the "contact in last 7 days" test; I list them as stale with days = N/A rather than dropping them. - Several deals carry a last_meeting date AFTER the 2026-09-05 snapshot (e.g., 2026-09-09, 2026-09-15, 2026-09-17, 2026-10-02). A meeting cannot have occurred after the snapshot, so I ignored those future-dated fields and computed recency from the most recent real (on/before snapshot) touch. This is the only judgment call; flagged inline with [future-dated … ignored]. - The deal-level last_contacted_field was not used, per instruction. When compared, it would have incorrectly "rescued" several deals (e.g., Deal-2D1F1B shows last_contacted_field 2026-06-16 — same as the engagement data here — but others like Deal-7BBDFA show 2026-07-21 vs an unreliable field; the field was excluded regardless). - No outreach text was generated, per request.
Analysis complete. All arithmetic verified (emails+calls+meetings = total activities for every rep). One variable-swap bug in an interim check was caught and corrected before finalizing — the per-rep numbers below are the corrected ones.
Snapshot date: 2026-09-05.
"Last 30 days" window used: t_ds2 in [2026-08-06, 2026-09-05] inclusive (within 30 days of snapshot). Activity totals are taken from the engagements table (emails_30d, calls_30d, meetings_30d), summed per owner across all of that owner's deals.
Note on data gaps: Deal-3EED2C (owner 84342457) and Deal-57FF13 (owner 701163055) appear in the deals file but have NO row in the engagements file, so their activity counts are 0. Deal-3EED2C still counts toward owner 84342457's DS2 entries because t_ds2 is read from the deals file (t_ds2=2026-09-03, in window). No other engagement-row gaps.
==================================================
PER-REP RESULTS (only owners with ≥1 DS2 entry in window; archived reps Gavin Porter / Hugo Lindqvist and Elena Sinclair have 0 DS2 entries and 0 activities, so excluded from ranking)
==================================================
ALEX FRANKLIN (84342457) — 67 deals, 66 with engagement rows
Emails 307 + Calls 36 + Meetings 41 = 384 total activities
Mix: emails 79.9% (307/384), calls 9.4% (36/384), meetings 10.7% (41/384)
DS2 entries in last 30d: 18
aliases: Deal-EE195F, Deal-D9A72E (t_ds2 2026-08-06), Deal-7FA0C3, Deal-E531A6 (08-07), Deal-36C33F (08-11), Deal-D1E6C2 (08-11), Deal-317E6F (08-12), Deal-4F775F (08-17), Deal-F436DA (08-19), Deal-CA5E44 (08-24), Deal-46988D (08-26), Deal-5296C9 (08-28), Deal-898FC5 (08-28), Deal-E73427 (08-28), Deal-403845 (09-02), Deal-92D97D (09-02), Deal-1FC049 (09-03), Deal-3EED2C (09-03)
Activities per DS2 entry = 384 / 18 = 21.33
BRYCE HARMON (119337721) — 35 deals, all 35 with engagement rows
Emails 162 + Calls 0 + Meetings 43 = 205 total activities
Mix: emails 79.0% (162/205), calls 0.0%, meetings 21.0% (43/205)
DS2 entries in last 30d: 4
aliases: Deal-1CCE5C (t_ds2 2026-08-06), Deal-25F752 (08-10), Deal-CA7DC0 (08-12), Deal-D73B89 (09-03)
Activities per DS2 entry = 205 / 4 = 51.25
COLE INGRAM (83155924) — 22 deals, all 22 with engagement rows
Emails 96 + Calls 14 + Meetings 1 = 111 total activities
Mix: emails 86.5% (96/111), calls 12.6% (14/111), meetings 0.9% (1/111)
DS2 entries in last 30d: 2
aliases: Deal-1BA595 (t_ds2 2026-08-12), Deal-42326B (08-26)
Activities per DS2 entry = 111 / 2 = 55.50
FARID OSMAN (716654662) — 7 deals, all 7 with engagement rows
Emails 38 + Calls 0 + Meetings 34 = 72 total activities
Mix: emails 52.8% (38/72), calls 0.0%, meetings 47.2% (34/72)
DS2 entries in last 30d: 1
alias: Deal-499BF6 (t_ds2 2026-08-26)
Activities per DS2 entry = 72 / 1 = 72.00
DANA MERCER (83155923) — 24 deals, all 24 with engagement rows
Emails 84 + Calls 18 + Meetings 11 = 113 total activities
Mix: emails 74.3% (84/113), calls 15.9% (18/113), meetings 9.7% (11/113)
DS2 entries in last 30d: 1
alias: Deal-57887A (t_ds2 2026-08-07)
Activities per DS2 entry = 113 / 1 = 113.00
==================================================
EFFICIENCY RANKING (lowest activities per DS2 entry = most efficient)
==================================================
1. Alex Franklin (84342457) — 21.33 activities per DS2 entry
2. Bryce Harmon (119337721) — 51.25
3. Cole Ingram (83155924) — 55.50
4. Farid Osman (716654662) — 72.00
5. Dana Mercer (83155923) — 113.00
==================================================
HEADLINE
==================================================
Most efficient rep: Alex Franklin (84342457) — 21.33 activities per DS2 entry.
Highest-volume rep (by total activities): Alex Franklin (84342457) — 384 total activities (next highest is Bryce Harmon at 205).
They are the SAME rep. They do not differ.
==================================================
NOTES / CAVEATS (no cause attributed)
==================================================
- Window boundary: the window includes 2026-08-06 (exactly 30 days before snapshot). Three DS2 deals fall on that date: Deal-EE195F and Deal-D9A72E (Alex Franklin) and Deal-1CCE5C (Bryce Harmon). If the exact 30-day boundary were excluded, Alex would have 16 DS2 entries (eff 24.00, still rank 1) and Bryce would have 3 (eff 68.33, dropping to rank 3). The headline finding (Alex is both most efficient and highest-volume) is unaffected by this choice.
- Owners excluded from ranking: Gavin Porter (1520255671, archived), Hugo Lindqvist (77260721, archived), and Elena Sinclair (701163055) each have 0 DS2 entries in the window and 0 activities, so no efficiency ratio is defined.
- "Total activities per DS2 entry" is computed as total 30-day activities ÷ count of DS2 entries in the last 30 days; it is a ratio of two independent 30-day windows (activity window and DS2-entry window are both the trailing 30 days, but activity counts are per-deal engagement totals while DS2 counts are per-deal stage timestamps).
- No cause is attributed for any ranking difference.
All numbers computed directly from the files. Here is the QTD scorecard.
================================================================
QTD SCORECARD — Alex Franklin — as of 2026-09-05 (2026-Q3)
Snapshot source: ae_deals.csv, ae_engagements.csv, quota.csv
================================================================
1) BOOKINGS vs QUOTA
--------------------
Quota (quota.csv): $200,000 for 2026-Q3.
Closed-Won in file = 9 deals. Per the rule, exclude any closed-won before the quarter (Q3 starts 2026-07-01):
- EXCLUDED: Deal-B3E6F1, closed 2026-06-20 ($24,000) — pre-quarter.
- QTD Closed-Won = 8 deals:
Deal-A1C3E5 $40,000 (2026-07-15)
Deal-F2C7D8 $20,000 (2026-07-24)
Deal-B7D2F4 $35,000 (2026-07-31)
Deal-C9E1A6 $21,000 (2026-08-12)
Deal-A8B4D6 $12,000 (2026-08-19)
Deal-D4B8C2 $11,000 (2026-08-21)
Deal-E6F3A9 $6,500 (2026-09-02)
Deal-C5D9E2 $4,500 (2026-09-03)
QTD Bookings = 40,000+20,000+35,000+21,000+12,000+11,000+6,500+4,500 = $150,000
Attainment = 150,000 / 200,000 = 75.00%
Remaining to quota = $50,000.
2) NEW vs EXPANSION SPLIT (QTD bookings)
----------------------------------------
New: Deal-A1C3E5 (40,000) + Deal-B7D2F4 (35,000) + Deal-C9E1A6 (21,000) + Deal-D4B8C2 (11,000) + Deal-E6F3A9 (6,500) = $113,500 (75.7%)
Expansion: Deal-F2C7D8 (20,000) + Deal-A8B4D6 (12,000) + Deal-C5D9E2 (4,500) = $36,500 (24.3%)
Check: 113,500 + 36,500 = 150,000. ✓
3) ACTIVE PIPELINE BY STAGE (open deals, 125 total)
---------------------------------------------------
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 open pipeline = 284,621+353,760+552,705+23,574+45,730 = $1,260,390
Stage-weighting: 115 of 125 open deals (92.0%) and $1,191,086 (94.5%) sit at DS3 or earlier. Only DS4+DS5 = $69,304 (5.5%) is late-stage.
4) ROLLING 90-DAY DS2-TO-WON RATE
---------------------------------
Window: entered_ds2 between 2026-06-07 and 2026-09-05 → 111 deals entered DS2.
Decided by snapshot: 8 won, 27 lost → 35 decided; 76 still open.
Conversion among decided = 8 / (8+27) = 8/35 = 22.9%
Raw entry-to-won (incl. still-open) = 8/111 = 7.2%
Headline rate: 22.9% of DS2-entered deals that have reached a decision converted to won.
5) WIN / LOSS COUNTS + TOP LOSS REASON
--------------------------------------
Wins (QTD, post-exclusion): 8 (all-time in file: 9, +Deal-B3E6F1 pre-quarter)
Losses: 27 (all 27 lost deals close within Q3; none excluded)
Loss reasons:
Lost- Timing (1 year or more): 13 (48.1% of losses)
MIA: 5
Competitor: 5
Lost DM: 2
Feature Request: 1
Lost- Does not fit ICP (write in notes): 1
TOP LOSS REASON: "Lost- Timing (1 year or more)" — 13 of 27 (48.1%).
6) ACTIVITY VOLUME — LAST 30 DAYS (all 161 deals)
-------------------------------------------------
Emails: 807
Calls: 112
Meetings: 128
Notes: 50
TOTAL: 1,097
Call-to-email ratio = 112 / 807 = 0.14 (very email-heavy, call-light).
================================================================
THREE COACHING OBSERVATIONS (grounded in the numbers)
================================================================
A) Late-stage pipeline is thin relative to the gap. At 75% attainment ($150K of $200K), the $50K gap is small, but the open pipeline is 94.5% DS3-or-earlier ($1,191,086) and only $69,304 (5.5%) sits at DS4/DS5. The $1.26M coverage looks massive but is early-stage-weighted; conversion of that volume into late-stage is the real constraint, not top-of-funnel volume.
B) Disqualification at DS2 entry is the dominant leakage. 48.1% of all losses (13 of 27) are "Lost- Timing (1 year or more)," and the rolling DS2-to-won conversion among decided deals is only 22.9% (8 won / 35 decided). These are deals that were admitted into pipeline (they reached DS2) yet almost half are lost to timing beyond a year — a qualification gate problem at DS2 entry, not a late-stage execution problem.
C) Activity mix is email-heavy with weak call coverage on large deals. In the last 30 days the AE sent 807 emails but only 112 calls (0.14 ratio) and 50 notes. Several high-value open deals show zero calls in the window — e.g., Deal-92D97D ($60,000, DS2), Deal-50D386 ($36,000, DS2), Deal-D0D6B5 ($23,800, DS2), Deal-84DBA6 ($16,000, DS2) each logged 0 calls_30d. Pushing those named large deals to a live call is the highest-leverage motion to thicken the DS4/DS5 bucket.
Reference date used: 2026-09-07 (the date of this analysis). Active window = engaged on/after 2026-07-09 (60 days back, inclusive) AND is_former = false. None of the determinations below sit near the boundary, so the exact reference date does not change any result.
Flag rules (from your definition):
- Single-threaded = fewer than 2 active contacts (count < 2)
- Under-threaded = fewer than 3 active contacts (count < 3) OR all active contacts in one persona
Data caveat (stated explicitly): The provided files contain NO amount column and NO stage column. Therefore "amount" and "stage" cannot be reported, and "the most valuable persona to add given the stage" cannot be computed from data — it is stage-dependent and the stage is missing. I report personas missing instead.
================================================================
FLAGGED DEALS (11 of 14)
================================================================
Deal-EC3025 (C-FDD0C7)
Active check:
CT-047C54 champion 2026-09-02 not former -> ACTIVE
CT-F2C1AE economic buyer 2026-08-15 FORMER -> excluded
Active count = 1 -> single-threaded (1<2) AND all-one-persona. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion
Personas missing: economic buyer, HR admin, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: CT-6827DB, Chief People Officer (economic buyer) -> fits missing economic buyer.
Deal-92D97D (C-E23238)
Active check:
CT-01F5B4 HR admin 2026-08-28 not former -> ACTIVE
CT-A902AE champion 2026-06-01 not former -> STALE (>60d, before 2026-07-09) -> excluded
Active count = 1 -> single-threaded (1<2) AND all-one-persona. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: HR admin
Personas missing: economic buyer, champion, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: none on file (C-E23238 not in unengaged_contacts.csv).
Deal-50D386 (C-EB10E4)
Active check:
CT-AA41B2 champion 2026-09-01 not former -> ACTIVE
CT-B9C35B HR admin 2026-08-25 not former -> ACTIVE
Active count = 2 -> not single (2 not <2), but under-threaded (2<3). FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion, HR admin
Personas missing: economic buyer, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: CT-A1C4B3, Chief People Officer (economic buyer) -> fits missing economic buyer.
Deal-D0D6B5 (C-32918E)
Active check:
CT-87CED4 champion 2026-09-02 not former -> ACTIVE
CT-DE6D7C champion 2026-08-19 not former -> ACTIVE
CT-FD70B2 champion 2026-08-07 not former -> ACTIVE
Active count = 3 -> not <2 and not <3, but ALL in one persona (champion). Under-threaded by persona rule. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion
Personas missing: economic buyer, HR admin, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: CT-1FA4DB, Chief People Officer (economic buyer) -> fits missing economic buyer.
Deal-5BFE3B (C-535D36)
Active check:
CT-57123B champion 2026-08-31 not former -> ACTIVE
CT-5CE757 champion 2026-08-12 not former -> ACTIVE
Active count = 2 -> under-threaded (2<3); also all-one-persona. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion
Personas missing: economic buyer, HR admin, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: none on file (C-535D36 not in unengaged_contacts.csv).
Deal-36C33F (C-077A0E)
Active check:
CT-4FE556 IT security 2026-08-15 not former -> ACTIVE
CT-405B45 champion 2026-08-10 FORMER -> excluded
CT-86B22F economic buyer 2026-07-30 FORMER -> excluded
Active count = 1 -> single-threaded (1<2) AND all-one-persona. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: IT security
Personas missing: champion, economic buyer, HR admin, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: CT-1DB73E, Chief People Officer (economic buyer) -> fits missing economic buyer.
Deal-885F45 (C-5E8EFB)
Active check:
CT-51C81E economic buyer 2026-08-26 not former -> ACTIVE
CT-D9A0E8 champion 2026-08-11 not former -> ACTIVE
Active count = 2 -> under-threaded (2<3). FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: economic buyer, champion
Personas missing: HR admin, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: CT-B3F25D, IT Security Lead (IT security) -> fits missing IT security.
Deal-FCBE5B (C-737030)
Active check:
CT-4A5317 champion 2026-08-29 not former -> ACTIVE
Active count = 1 -> single-threaded (1<2) AND all-one-persona. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion
Personas missing: economic buyer, HR admin, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: none on file (C-737030 not in unengaged_contacts.csv).
Deal-5408B0 (C-2AE3AA)
Active check:
CT-D33AE4 champion 2026-09-01 not former -> ACTIVE
CT-8742FD HR admin 2026-08-18 not former -> ACTIVE
Active count = 2 -> under-threaded (2<3). FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion, HR admin
Personas missing: economic buyer, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: CT-07FA76, Chief People Officer (economic buyer) -> fits missing economic buyer.
Deal-C6D97A (C-5A8FC2)
Active check:
CT-223DDC champion 2026-08-31 not former -> ACTIVE
CT-B03555 champion 2026-08-20 not former -> ACTIVE
CT-4E8A2B champion 2026-08-05 not former -> ACTIVE
Active count = 3 -> not <2 and not <3, but ALL in one persona (champion). Under-threaded by persona rule. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion
Personas missing: economic buyer, HR admin, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: none on file (C-5A8FC2 not in unengaged_contacts.csv).
Deal-F9A08A (C-0D15DF)
Active check:
CT-931B10 champion 2026-09-03 not former -> ACTIVE
CT-913581 economic buyer 2026-06-20 not former -> STALE (>60d, before 2026-07-09) -> excluded
Active count = 1 -> single-threaded (1<2) AND all-one-persona. FLAGGED.
Amount/Stage: NOT IN PROVIDED DATA
Personas present: champion
Personas missing: economic buyer, HR admin, IT security, finance
Most valuable persona given stage: cannot compute (stage missing)
Unengaged on file fitting a missing persona: CT-697541, Chief People Officer (economic buyer) -> fits missing economic buyer.
================================================================
NOT FLAGGED (3 of 14) — shown for completeness
================================================================
Deal-84DBA6 (C-BE9BE0): 3 active (champion, economic buyer, IT security) across 3 personas -> count>=3, multiple personas. Not flagged.
Deal-4B0BEB (C-1BDFE0): 4 active (champion, economic buyer, HR admin, finance) across 4 personas -> not flagged.
Deal-D348E1 (C-804F29): 5 active covering all 5 personas -> not flagged.
================================================================
SUMMARY
================================================================
Flagged: 11 deals. Unengaged contacts available on file that fit a missing persona: 8 (Deal-EC3025, 50D386, D0D6B5, 36C33F, 885F45, 5408B0, F9A08A — all economic buyer fits; 885F45 — IT security fit). No unengaged match on file for: Deal-92D97D, 5BFE3B, FCBE5B, C6D97A.
Amount and stage: NOT PRESENT in either provided file, so unreportable; the stage-based "most valuable persona to add" is therefore indeterminate for every deal.
LEAD-WITH IN FIRST 5 MINUTES
Dominant opener (8 of 10 calls, at minute 0): the 400-person retailer story.
"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."
Exceptions: Deal-403845 opened with "I put together a short agenda — security review first, then pricing." and Deal-1E2498 opened with "You asked for straight pricing last time, so let's start there." (neither used the retailer story). Deal-C61CF7 used the story at minute 0 then pivoted at minute 2.
THREE MOST COMMON OBJECTIONS (and how handled)
1) Budget locked — appears 4x (Deal-D348E1, Deal-547B2B, Deal-60C2C2, Deal-84DBA6). Handled by reframing to turnover savings:
"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."
2) Revisit next quarter — appears 3x (Deal-5408B0, Deal-C61CF7, Deal-D9A12F). Handled by offering a scoped pilot:
"Makes sense. What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?"
3) Already using spreadsheet + gift cards — appears 3x (Deal-403845, Deal-EDC141, Deal-1E2498). Handled by scaling/automation contrast:
"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."
NEXT-STEP AGREEMENT RATE
7 of 10 calls (70%) agreed a concrete next step.
"Yes, Thursday at 2pm works — send the invite and I'll bring our HRIS manager." (the agreed step in TT-001, 002, 003, 005, 006, 008, 009)
The 3 that did NOT: Deal-403845 ("Understood — I'll leave it with you."), Deal-EDC141 ("Fair enough."), Deal-84DBA6 ("Understood, thanks for the candor.") — all ended with no booked next step.
Arithmetic: agreed = TT-001, 002, 003, 005, 006, 008, 009 = 7; total = 10; 7/10 = 70%.
COMPETITORS A PROSPECT RAISED
Awardco — Deal-547B2B (TT-003):
"We're also in late talks with Awardco — their rewards catalog looks bigger than yours."
Kudos — Deal-EDC141 (TT-007):
"How are you different from Kudos? Our CEO used them at her last company."
Note: Workhuman was mentioned in Deal-C61CF7 (TT-005) but only by the rep ("And unlike Workhuman, our pricing includes the full rewards catalog with no extra margin.") — not raised by a prospect, so excluded.
COACHING NOTES
1) When a call stalls on committee / no-urgency (TT-004, TT-007, TT-010), the rep ends cold ("I'll leave it with you" / "Fair enough" / "thanks for the candor") and books nothing — that's the entire 30% gap. Train a fallback low-commitment next step (send the retailer case study or a one-department pilot one-pager) so every call exits with some momentum.
2) The opener is almost always the same retailer story, even when a prospect names a competitor (Awardco, Kudos both came after the generic opener). When a prospect name-drops a rival, lead with a tailored differentiator against that specific competitor instead of the standard story — it converts the objection into the hook.
Q3 2026 FORECAST
Scope: close_date 2026-07-01 through 2026-09-30 inclusive. Only those count.
Weighting: 100% of COMMIT + 35% of BEST_CASE; PIPELINE = 0.
COMMIT inside quarter (7 deals)
Deal-547B2B 11,200
Deal-B7EBD1 9,000
Deal-403845 9,000
Deal-A2B47C 6,360
Deal-2465CE 5,400
Deal-A5E80A 2,520
Deal-499BF6 1,249
Sum = 11,200+9,000+9,000+6,360+5,400+2,520+1,249 = 44,729
BEST_CASE inside quarter (24 deals)
Deal-2D7423 38,935 | Deal-25F752 24,000 | Deal-E53952 19,656 | Deal-5EED42 16,250
Deal-FA32A0 11,116 | Deal-FC22A3 10,800 | Deal-944310 10,500 | Deal-5195DB 9,890
Deal-180D02 9,720 | Deal-3974EB 9,000 | Deal-5D8CEE 7,200 | Deal-9D0060 3,840
Deal-46988D 3,780 | Deal-357C30 3,600 | Deal-C6D97A 3,240 | Deal-DAF1D9 3,150
Deal-EE195F 3,120 | Deal-55164C 3,060 | Deal-001FF4 2,916 | Deal-7B3B0F 2,760
Deal-F9A08A 2,484 | Deal-8952F0 2,100 | Deal-1FC049 1,920 | Deal-87412C 528
Sum = 203,565
(check: 38,935+24,000=62,935; +19,656=82,591; +16,250=98,841; +11,116=109,957;
+10,800=120,757; +10,500=131,257; +9,890=141,147; +9,720=150,867; +9,000=159,867;
+7,200=167,067; +3,840=170,907; +3,780=174,687; +3,600=178,287; +3,240=181,527;
+3,150=184,677; +3,120=187,797; +3,060=190,857; +2,916=193,773; +2,760=196,533;
+2,484=199,017; +2,100=201,117; +1,920=203,037; +528=203,565)
WEIGHTED FORECAST
= 100% x 44,729 + 35% x 203,565
= 44,729 + (203,565 x 0.35)
= 44,729 + 71,247.75
= 115,976.75
COUNTS INSIDE QUARTER
COMMIT 7 | BEST_CASE 24 | PIPELINE 23 | Total 54
EXCLUDED — outside quarter (close_date 2026-10-01..2026-10-15): 32 deals, total 227,575
By category:
PIPELINE 22 deals = 185,565 (Deal-E51FB7 43,875; Deal-B936FE 18,000; Deal-D9A12F 17,000;
Deal-4062CF 10,800; Deal-293AF3 9,000; Deal-034D49 9,000; Deal-E0ADD8 7,920;
Deal-9F2E43 7,690; Deal-FCBE5B 7,500; Deal-712010 7,200; Deal-6691E0 5,700;
Deal-600CD9 5,400; Deal-A92065 5,400; Deal-1D532E 5,400; Deal-E531A6 4,800;
Deal-D1E6C2 4,400; Deal-D9E112 4,300; Deal-5AD94B 4,000; Deal-766C74 3,300;
Deal-D7E999 1,800; Deal-ED13B0 1,680; Deal-7FA0C3 1,400)
COMMIT 1 deal = 13,770 (Deal-D348E1)
BEST_CASE 9 deals = 28,240 (Deal-C61CF7 5,400; Deal-48B656 5,160; Deal-901332 3,600;
Deal-47AE31 3,600; Deal-15D24F 3,600; Deal-ED725A 2,400; Deal-8AD4A5 1,800;
Deal-5FDCE4 1,600; Deal-F5A622 1,080)
Check: 185,565 + 13,770 + 28,240 = 227,575
TOP 5 BEST_CASE BY AMOUNT (inside quarter)
1. Deal-2D7423 38,935
2. Deal-25F752 24,000
3. Deal-E53952 19,656
4. Deal-5EED42 16,250
5. Deal-FA32A0 11,116
## Data quality
Owner is blank on 85 of 86 rows (only "Bryce Harmon" on Deal-C9C286), so the forecast cannot be attributed to or reviewed by any rep. forecast_category is decoupled from stage: DS1 (Deal-A5E80A) and DS2 (Deal-499BF6) deals are tagged COMMIT while a DS5 contract-stage deal (Deal-C61CF7) is tagged BEST_CASE, so the category is not a trustworthy probability signal. A large cluster of deals sits exactly on the quarter boundary (many dated 2026-09-30 inside and 2026-10-01 outside), a pattern consistent with date-pushing that would distort any time-windowed run. The why_buys_chars field is 0 for 83 of 86 deals, leaving no underlying qualitative signal to validate the category assignments.
ACTIVATION HYPOTHESIS TEST — 2x2 COHORT ANALYSIS Source: plg_company_cohort_2023.csv (220 companies). No companies excluded (all 220 are 25+ months old; signup months span 2023-01 to 2023-07, and as of 2026-09-07 the youngest is ~38 months old). Denominator = full 220. Signals: givers = m1_users >= 5; redemption = m1_redemptions >= 1. Retained = current_status == 'active'. All other statuses (cancelled, non_renewing) counted as not retained. 2x2 RESULTS - Both signals (givers AND redemption): n=47, active=31 → 31/47 = 66.0% - Givers-only (m1_users>=5, m1_redemptions=0): n=49, active=23 → 23/49 = 46.9% - Redemption-only (m1_redemptions>=1, m1_users<5): n=29, active=9 → 9/29 = 31.0% - Neither signal: n=95, active=38 → 38/95 = 40.0% Cell check: 47+49+29+95 = 220. Active total: 31+23+9+38 = 101 (101/220 = 45.9% overall). HYPOTHESIS OUTCOME Confirmed directionally. Both-signals cohort retains best at 66.0%, above givers-only (46.9%), above neither (40.0%), and well above redemption-only (31.0%). The combination beats every single-signal and the no-signal group. EXCLUSIONS None. Every company in the extract qualifies (all 25+ months old), so the denominator is the full 220 with no removals. SINGLE SIGNAL WITH THE LARGEST RETENTION LIFT Givers (5+ unique givers) — measured at signal level: - Givers present: 54/96 = 56.2% vs givers absent 47/124 = 37.9% → +18.3 pts - Redemption present: 40/76 = 52.6% vs redemption absent 61/144 = 42.4% → +10.3 pts Givers' lift (+18.3 pts) is larger than redemptions' lift (+10.3 pts). Important nuance inside the 2x2: redemption as a STANDALONE signal is negatively associated with retention — redemption-only (31.0%) is actually BELOW neither (40.0%), a -9.0 pt gap. Redemptions only help in combination with givers. So the stronger individual signal is givers, and redemptions add value only when givers are already present. WHAT THIS DOES PROVE - In this historical cohort, the two activation signals are jointly associated with the highest 24-month retention (66.0% for both vs 40.0% for neither = +26.0 pts). - 5+ unique givers is the more powerful single predictor: its presence is associated with an +18.3 pt retention advantage. WHAT THIS DOES NOT PROVE - Causation. This is observational; companies that activate (especially multiple givers) may simply be larger/healthier at signup (selection bias). The data has no controls for product_tier, industry_group, country, or signup-month seasonality. - That driving redemptions alone improves retention. Redemption-only underperforms the no-signal group, so redemption in isolation is not a retention lever here. - Statistical significance. No test was run; cells are moderate (redemption-only n=29, both n=47). The lift could be driven by a few accounts. - That "active" = true 24-month survival beyond the label given; non_renewing is treated as not-retained per the stated rule, but its 3 rows are a small, undefined category. - Generalizability: single 2023-signup extract; no out-of-sample or future-cohort validation. Data-quality flag (not excluded, but worth noting): several redemption-only rows have near-zero givers (e.g., C-F0A562FF m1_users=0/m1_redemptions=10, C-0F58EBD7 m1_users=1/m1_redemptions=42, C-0D78BCB2 m1_users=1/m1_redemptions=18). These are valid per the rule (redemption>=1, givers<5) but suggest redemption without adoption may reflect non-standard/abnormal usage rather than healthy activation.
ARR RECONCILIATION — as of 2026-09-05
Source data: chargebee_subscriptions.csv (billing) + company_arr.csv (CRM/HubSpot). All $ USD.
ASSUMPTION (material — stated up front): Billing ARR = MRR × 12 summed over ACTIVE subscriptions only. Cancelled subscriptions are excluded from recurring ARR and flow into the "status mismatch" bucket. Rationale: this is standard ARR-reconciliation practice and is the only way the "status mismatch" bucket is non-empty (the two cancelled subs otherwise match CRM exactly). See alternative at bottom if you meant literal all-inclusion.
================================================================
TOTALS
================================================================
Billing ARR (active subs):
Σ active MRR = 50,394.94 × 12 = 604,739.28
CRM ARR (HubSpot, 39 company records):
Σ hubspot_arr = 603,581.76
Variance (Billing − CRM): +1,157.52 (billing higher)
================================================================
VARIANCE DECOMPOSITION (must sum to +1,157.52)
================================================================
1) STATUS MISMATCH: −13,158.48
Cancelled subs still carrying CRM ARR (billing counts them as 0):
• C-0C8323BF SUB-000E 408.77×12 = 4,905.24 → billing 0, CRM 4,905.24 (−4,905.24)
• C-0DC4FB8C SUB-000F 687.77×12 = 8,253.24 → billing 0, CRM 8,253.24 (−8,253.24)
Sum = −13,158.48
2) ROUNDING: −36.00
CRM ARR = billing ARR rounded UP to nearest $100:
• C-0D66DF9E 1,932.00×12 = 23,184.00 ; CRM 23,200.00 (−16.00)
• C-14D70CE0 1,515.00×12 = 18,180.00 ; CRM 18,200.00 (−20.00)
Sum = −36.00
3) MISSING RECORDS: +11,952.00
• C-21629AA4 SUB-0004 2,370.77×12 = 28,449.24 ; NO CRM record (+28,449.24)
• C-0D5BBE3A CRM 16,497.24 ; NO subscription in billing (−16,497.24)
Sum = +11,952.00
4) OTHER: +2,400.00
• C-0F7269D7 2,233.00×12 = 26,796.00 ; CRM 24,396.00 (+2,400.00)
Unexplained: CRM implies MRR 2,033.00 vs billing MRR 2,233.00 (gap 200.00/mo).
Sum = +2,400.00
CHECK: −13,158.48 + 11,952.00 − 36.00 + 2,400.00 = +1,157.52 ✓ (equals variance)
================================================================
MISMATCHED ACCOUNTS (7) — WITH SUGGESTED OWNER
================================================================
Note: no owner/rep field exists in the provided data, so owners are suggested by exception type.
Alias Billing ARR CRM ARR Variance Bucket Suggested owner
C-0D66DF9E 23,184.00 23,200.00 −16.00 Rounding RevOps — AR normalization (low priority)
C-14D70CE0 18,180.00 18,200.00 −20.00 Rounding RevOps — AR normalization (low priority)
C-0F7269D7 26,796.00 24,396.00 +2,400.00 Other Deal owner + RevOps — investigate MRR basis
C-0C8323BF 0 4,905.24 −4,905.24 Status mismatch Account owner/CSM + RevOps — zero out churned ARR
C-0DC4FB8C 0 8,253.24 −8,253.24 Status mismatch Account owner/CSM + RevOps — zero out churned ARR
C-21629AA4 28,449.24 0* +28,449.24 Missing record RevOps/Billing Ops — create CRM company record
C-0D5BBE3A 0* 16,497.24 −16,497.24 Missing record Sales Ops/Billing Ops — log subscription in Chargebee
(* = record absent in that system)
================================================================
BUSINESS-RULE VIOLATIONS
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
• SUB-0019 — C-22170CA1 — term 36 — cf_agreement_end_date EMPTY
COMPLIANT (term ≠ 12 but end date present):
• SUB-000C — C-0DB48281 — term 24 — 2027-11-30
• SUB-001A — C-0FC4DBB8 — term 36 — 2027-11-30
================================================================
ALTERNATIVE (if Billing ARR must include ALL subs, literal "MRR × 12")
================================================================
Billing ARR (all 39 subs) = 617,897.76 ; CRM = 603,581.76 ; Variance = +14,316.00
Decomposition: Status mismatch = 0 (both cancelled subs match CRM exactly),
Rounding −36.00, Missing records +11,952.00, Other +2,400.00 → sums to +14,316.00.
I did NOT use this version because it leaves the "status mismatch" bucket empty. Flag if you want it.
Four core KVMs, 2026-08 vs 2026-07 (company-level means, n=30 each month): - Giving rate: 0.6027 vs 0.6023, +0.0004 (+0.07%), up - Redemptions per user: 1.7302 vs 1.7300, +0.0002 (+0.01%), up - 1:1 meetings engagement: 0.4472 vs 0.4469, +0.0003 (+0.06%), up - Pulse check engagement: 0.5086 vs 0.6006, -0.0920 (-15.31%), down Largest relative move: pulse check engagement (-15.31%). The data supports a segment driver: size_band. Pulse fell -50.13% in enterprise (0.5500 → 0.2743) while smb (-0.22%) and mid_market (+0.21%) were essentially flat. plan_tier does not drive it — all 30 companies are tier_three, so there is no variation to attribute. Table (mean per month; abs = Aug − Jul; rel = abs/Jul): | KVM | 2026-07 | 2026-08 | Abs Δ | Rel Δ | Direction | |---|---|---|---|---|---| | Giving rate | 0.6023 | 0.6027 | +0.0004 | +0.07% | up | | Redemptions/user | 1.7300 | 1.7302 | +0.0002 | +0.01% | up | | 1:1 meetings | 0.4469 | 0.4472 | +0.0003 | +0.06% | up | | Pulse check | 0.6006 | 0.5086 | -0.0920 | -15.31% | down | All three other KVMs moved <0.1% and stayed flat-to-up. The pulse collapse is concentrated entirely in enterprise.
Last completed month: 2026-08 (the dataset's latest redemption is 2026-08-31; there are no September-or-later rows, so the full file is "through 2026-08"). All 378 rows fall in Jan–Aug 2026, so the metrics below are the cumulative YTD total as of the end of August. REDEMPTION SECTION — through 2026-08 (YTD) Redemption count: 378 Spend: $27,846.00 Unique redeemers: 235 Redemptions per redeemer: 378 ÷ 235 = 1.61 Provider mix (% of spend, shares sum to 100): - custom: $10,873.00 → 39.05% - Tremendous: $8,505.00 → 30.54% - Snappy: $5,238.00 → 18.81% - TangoCard: $3,230.00 → 11.60% Checks: 10,873 + 8,505 + 5,238 + 3,230 = 27,846 (matches total spend). 39.05 + 30.54 + 18.81 + 11.60 = 100.00%. Top 5 countries by redemptions (count of redemptions): 1. US — 244 2. CA — 24 3. AU — 21 4. GB — 17 5. NL — 17 Note: No data was missing or excluded; no values were invented. All figures are computed directly from the 378 rows in redemptions_ytd.csv.
QUALIFYING ACCOUNTS (meet all 3 eligibility rules) Snapshot date: 2026-09-05. R3 window = 2026-09-05 through 2027-01-03 (120 days). R1: health_score < 60. R2: churn_save_eligible_amount > 0. R3: renewal within 120 days. 1. C-0F6C0F34 — eligible $49,707.00 R1 health 51<60 ✓ | R2 $49,707>0 ✓ | R3 renewal 2026-10-03 = 28 days out ✓ Play: EXECUTIVE TOUCH — signal: champion_active = false (no active champion to work through; needs top-down engagement). 2. C-0B827671 — eligible $25,365.00 R1 56<60 ✓ | R2 $25,365>0 ✓ | R3 2026-11-14 = 70 days ✓ Play: USAGE REVIVAL — signal: usage_trend_3m = declining. 3. C-0B360C78 — eligible $35,748.00 R1 57<60 ✓ | R2 $35,748>0 ✓ | R3 2026-10-28 = 53 days ✓ Play: COMMERCIAL CONCESSION — signal: champion_active = true and usage_trend_3m = growing (relationship intact, risk is commercial; seats 246/327 = 75% utilized). 4. C-0B0F1BAB — eligible $5,494.00 R1 38<60 ✓ | R2 $5,494>0 ✓ | R3 2026-09-23 = 18 days ✓ Play: EXECUTIVE TOUCH — signal: champion_active = false. 5. C-0CA21961 — eligible $16,829.00 R1 58<60 ✓ | R2 $16,829>0 ✓ | R3 2026-12-28 = 114 days ✓ Play: COMMERCIAL CONCESSION — signal: champion_active = true and usage_trend_3m = flat; seats only 84/325 used (26% utilization) supports a right-sizing/concession angle. 6. C-0E9C27D1 — eligible $41,235.00 R1 39<60 ✓ | R2 $41,235>0 ✓ | R3 2026-09-24 = 19 days ✓ Play: COMMERCIAL CONCESSION — signal: champion_active = true and usage_trend_3m = flat (seats 134/157 = 85% utilized; healthy adoption, commercial lever). 7. C-0CEF69FD — eligible $32,621.00 R1 53<60 ✓ | R2 $32,621>0 ✓ | R3 2026-11-21 = 77 days ✓ Play: EXECUTIVE TOUCH — signal: champion_active = false. 8. C-0D3278C7 — eligible $17,602.00 R1 54<60 ✓ | R2 $17,602>0 ✓ | R3 2026-11-12 = 68 days ✓ Play: USAGE REVIVAL — signal: usage_trend_3m = declining (seats only 126/380 = 33% utilized). TOTAL AT STAKE 49,707 + 25,365 + 35,748 + 5,494 + 16,829 + 41,235 + 32,621 + 17,602 = 224,601.00 Play summary: - Usage revival (2): C-0B827671, C-0D3278C7 - Executive touch (3): C-0F6C0F34, C-0B0F1BAB, C-0CEF69FD - Commercial concession (3): C-0B360C78, C-0CA21961, C-0E9C27D1 Play-selection note: no explicit play-to-signal rule was provided in the data, so plays were inferred from the available signals — declining usage_trend_3m → usage revival; champion_active = false → executive touch; active champion with flat/growing usage → commercial concession. No qualifying account had both declining usage and an inactive champion, so there was no conflict. AT-RISK BUT DO NOT QUALIFY (health<60 under R1, but fail R2 and/or R3) - C-0BC71BDD — at risk (health 55), renewal 2026-10-27 within 120 days, but churn_save_eligible_amount = 0.00 → FAILS R2. - C-0BA71F12 — at risk (health 52), eligible $6,824>0, but renewal 2027-04-11 is 218 days out (>120, past 2027-01-03 cutoff) → FAILS R3. - C-0F6694C3 — at risk (health 43), eligible 0.00 → FAILS R2; renewal 2027-03-21 (228 days out) also past cutoff → FAILS R3. - C-0BE96399 — at risk (health 54), eligible 0.00 → FAILS R2; renewal 2026-10-29 within 120 days. - C-0F876796 — at risk (health 47), eligible $19,958>0, but renewal 2027-02-06 (154 days out) → FAILS R3. - C-0FCCD2DF — at risk (health 43), eligible 0.00 → FAILS R2; renewal 2027-04-23 (230 days out) → FAILS R3. - C-10A56B0F — at risk (health 54), eligible 0.00 → FAILS R2; renewal 2026-12-12 within 120 days. 7 at-risk accounts fail to qualify: 5 fail R2 (eligible amount = 0.00), and 2 fail only R3 (renewal beyond 120 days) — of those, C-0F6694C3 and C-0FCCD2DF fail both R2 and R3. Accounts with health ≥ 60 (e.g., C-0B843542 at 63, C-0FC7A215 at 62, C-8C2E8F00 at 73, and the rest at 65–88) are NOT at risk under R1 and are excluded. Data gaps / caveats: The file gives no documented rule linking specific signals to the three named plays, so the play assignments above are my inference from the signal columns, not a documented mapping. "At stake" is taken to mean churn_save_eligible_amount as labeled; no separate pipeline or ARR-at-risk field is used.
EXPANSION KIT — company_alias C-0DDFC9A7 SEAT COVERAGE (licensed over headcount) - licensed_seats 150 / headcount 400 = 0.375 = 37.5% headcount covered by license. - Active users (2026-08) 126 / licensed_seats 150 = 0.84 = 84.0% of license in use. - Active users (2026-03) 88 / licensed_seats 150 = 58.7% — usage has eaten into the license. PER-SEAT RATE - current_arr $9,000.00 / licensed_seats 150 = $60.00 per seat/yr. HEADROOM IN SEATS + ARR (at $60.00/seat) - Within current license: 150 − 126 active = 24 seats remain. 24 × $60 = $1,440 ARR before hitting the cap. - To full headcount coverage: 400 − 150 = 250 seats. 250 × $60 = $15,000 additional ARR. USAGE HEALTH - Monthly actives climbed every month: 88 → 95 → 102 → 110 → 118 → 126 (Mar–Aug). That is +38 users, +43.2% over the window. - Aug actives (126) now sit at 84% of the 150-seat license, up from 58.7% in March — steady, compounding adoption. WHO REPLIED / CAN THEY BUY - Maria S. (People Operations Coordinator) replied 2026-09-02. She explicitly stated she is NOT the right person for purchasing decisions. She cannot buy. She offered to introduce Dana R. RIGHT BUYER FROM OUR CONTACTS - Dana R., VP People (last_engaged 2026-05-18). Maria confirmed budget and seat expansion sit with Dana, and that Dana "has been asking about our usage numbers lately." This is the buyer to move toward. REPLY EMAIL (to Maria, looping Dana) Hi Maria, Great to hear the team is getting so much out of Bonusly — and thank you for offering to introduce Dana. Given that monthly actives have grown from 88 to 126 since March (now about 84% of your 150 licensed seats), there may be headroom worth a quick conversation about covering more of the 400-person org. Would you be open to looping in Dana R.? I'd love to share the usage numbers she's been asking about and see if expanding coverage makes sense. No rush — happy to go at your pace. Best, Cole (91 words)
Mid-Onboarding Call Prep — Company C-0D284E42 Signup date: 2026-08-11. Data current through 2026-09-04 (usage) / account snapshot above. === COMPLETE (each backed by a data field) === 1. Slack integration connected - Field: integration_slack = 2026-08-12 - Connected 1 day after signup (2026-08-11 → 2026-08-12). 2. Allowance set - Field: allowance_set = 2026-08-13 - Set 2 days after signup. 3. Admins added - Field: admins_added = 2 - Two admins present. 4. First recognition given - Field: first_recognition_at = 2026-08-15 14:22 - First recognition 4 days after signup (2026-08-11 → 2026-08-15). === NOT COMPLETE (no data field shows completion) === 1. HRIS integration — NOT connected - Field integration_hris is empty. No connection date recorded. 2. First redemption — NOT complete - Field first_redemption_at is empty. No redemption recorded to date, despite active recognition (first_recognition_at = 2026-08-15). === EARLY ENGAGEMENT SIGNALS (from onboarding_usage.csv, active_givers) === - Active givers grew from 3 (2026-08-11) to 15 (2026-09-04). - Arithmetic: 15 / 3 = 5.0x growth over the 24-day window (Aug 11 → Sep 4). - Net add: 15 − 3 = +12 givers (+400%). - Participation is consistently rising with only minor dips (e.g., 5→4 on Aug 16, 7→5 on Aug 18, 9→8 on Aug 22, 13→11 on Sep 1). - 25-day total active-giver-days = 214; average ≈ 214 / 25 = 8.56 givers/day. - First 7 days avg (Aug 11–17): (3+3+4+4+5+4+7)=30 → 4.29/day. - Last 7 days avg (Aug 29–Sep 4): (11+13+11+13+13+15+15)=91 → 13.00/day. - Arithmetic: 13.00 / 4.29 ≈ 3.0x vs. first-week average. - Most recent reading (2026-09-04) = 15 active givers, the highest in the dataset. Signal: engagement is accelerating and broad-based (15 distinct active givers by Sep 4), but it has not yet converted into a redemption event. === THREE THINGS TO COVER ON THE CALL === 1. Connect the HRIS integration. - Why: integration_hris field is empty — no HRIS connection on record. Blocks automated employee data sync. Get a connection date committed on the call. 2. Drive the first redemption. - Why: 15 active givers as of 2026-09-04 and recognition started 2026-08-15, but first_redemption_at is still empty. There is recognition activity with zero redemption follow-through — coach the customer on launching/communicating rewards so givers become redeemers. 3. Lock in and extend the engagement momentum. - Why: active givers are up 5x (3→15) and last-7-day average (13.0) is ~3x the first-7-day average (4.29). Confirm what's working, and set a near-term active-giver goal to keep the curve climbing through the post-onboarding phase. === DATA GAPS / NOT ASSERTED === - No field shows HRIS status, redemption, or any post-recognition redemption activity — these are reported as not-complete, not as failures. - onboarding_usage.csv contains only active_givers; no separate "active redeemers" or "recognitions sent" series is provided, so redemption engagement cannot be quantified — only that first_redemption_at is empty. - admins_added = 2 is a count; no admin names/roles are provided.
90-DAY RENEWAL RISK BRIEF As of 2026-09-07 (today). 90-day window = 2026-09-07 through 2026-12-06. All 20 accounts renew inside this window under their trusted dates. SOURCE-OF-TRUTH RULE - ChurnZero is known to be wrong on multi-year contracts. The 5 accounts flagged is_multi_year=true (chargebee_terms.csv) are trusted to ChargeBee (cb_renewal_date); ChurnZero dates are rejected for these. - The 15 single-year accounts: ChurnZero and ChargeBee agree exactly on every one, so no conflict and no override needed. DISAGREEMENTS FLAGGED (all 5 are multi-year; all resolved to ChargeBee) - C-0B7D2C30: CZ 2026-09-10 vs CB 2026-09-15 -> used 2026-09-15 (multi-year, CZ unreliable) - C-0BCDB8C2: CZ 2027-09-18 vs CB 2026-09-18 -> used 2026-09-18 (multi-year; CZ pushed it a year out, which would have dropped $54,427 from this window) - C-0D2AB865: CZ 2026-09-10 vs CB 2026-09-22 -> used 2026-09-22 (multi-year) - C-0BBE3E60: CZ 2027-09-26 vs CB 2026-09-26 -> used 2026-09-26 (multi-year; CZ pushed it a year out, which would have dropped $30,993 from this window) - C-0F5D2323: CZ 2026-09-10 vs CB 2026-09-29 -> used 2026-09-29 (multi-year) No disagreements on the 15 single-year accounts. PER-ACCOUNT (date used = trusted renewal date; util = seats_used/seats; trend = 2026-06->07->08 active users) C-0B7D2C30 | CSM Dana Mercer | ARR $65,901 | used 2026-09-15 | util 274/476 = 57.6% | trend 97->94->84 (-13, -13.4%) | HIGH: 12-mo active users fell 155->84 (-45.8%) with only 57.6% seat adoption — steep sustained decline. C-0BCDB8C2 | CSM Cole Ingram | ARR $54,427 | used 2026-09-18 | util 232/424 = 54.7% | trend 127->118->110 (-17, -13.4%) | HIGH: 12-mo active users fell 200->110 (-45.0%) — steady erosion, sub-55% adoption. C-0D2AB865 | CSM Elena Sinclair | ARR $38,022 | used 2026-09-22 | util 250/407 = 61.4% | trend 125->117->109 (-16, -12.8%) | HIGH: 12-mo active users fell 199->109 (-45.2%) — steady erosion. C-0BBE3E60 | CSM Dana Mercer | ARR $30,993 | used 2026-09-26 | util 74/114 = 64.9% | trend 39->35->33 (-6, -15.4%) | HIGH: 12-mo active users fell 63->33 (-47.6%) — steepest decline in book. C-0F5D2323 | CSM Cole Ingram | ARR $90,647 | used 2026-09-29 | util 111/390 = 28.5% | trend 20->21->18 (-2, flat/volatile) | HIGH: only ~18 active users against 390 seats (28.5% util), no growth in 12 months — minimal adoption. C-0EC6999D | CSM Elena Sinclair | ARR $79,419 | used 2026-10-03 | util 31/112 = 27.7% | trend 17->16->15 (-2, -11.8%) | HIGH: only ~15 active users against 112 seats (27.7% util), no growth — minimal adoption. C-0B20DB64 | CSM Dana Mercer | ARR $21,770 | used 2026-10-07 | util 214/378 = 56.6% | trend 294->298->294 (flat) | MEDIUM: usage flat (~294) but only 56.6% seat adoption — stable yet under-penetrated. C-0BBC4E7A | CSM Cole Ingram | ARR $56,374 | used 2026-10-10 | util 228/337 = 67.6% | trend 142->141->139 (-3, -2.1%) | MEDIUM: usage flat (~141), moderate 67.6% adoption — stable but not expanding. C-0FD551AB | CSM Elena Sinclair | ARR $48,815 | used 2026-10-14 | util 210/376 = 55.9% | trend 123->122->126 (+3, +2.4%) | MEDIUM: usage flat-to-slightly-up but only 55.9% seat adoption — stable yet under-penetrated. C-0F9F8F13 | CSM Dana Mercer | ARR $46,230 | used 2026-10-18 | util 199/352 = 56.5% | trend 185->185->182 (-3, -1.6%) | MEDIUM: usage flat (~183), moderate 56.5% adoption — stable but not expanding. C-0BC34584 | CSM Cole Ingram | ARR $16,740 | used 2026-10-22 | util 327/494 = 66.2% | trend 104->104->106 (+2, +1.9%) | MEDIUM: usage flat-to-slightly-up, 66.2% adoption — stable. C-0B7A7546 | CSM Elena Sinclair | ARR $35,062 | used 2026-10-25 | util 182/205 = 88.8% | trend 64->65->63 (flat) | LOW: high 88.8% seat adoption with flat, healthy usage. C-0B369871 | CSM Dana Mercer | ARR $85,128 | used 2026-10-29 | util 317/422 = 75.1% | trend 326->330->333 (+7, +2.1%) | LOW: 12-mo active users grew 289->333 (+15.2%) with 75.1% adoption. C-0B144C78 | CSM Cole Ingram | ARR $30,899 | used 2026-11-02 | util 169/224 = 75.4% | trend 101->101->106 (+5, +5.0%) | LOW: 12-mo active users grew 90->106 (+17.8%) with 75.4% adoption. C-0FC4DBB8 | CSM Elena Sinclair | ARR $94,732 | used 2026-11-05 | util 356/464 = 76.7% | trend 189->191->193 (+4, +2.1%) | LOW: 12-mo active users grew 168->193 (+14.9%) with 76.7% adoption. C-0D5BBE3A | CSM Dana Mercer | ARR $39,740 | used 2026-11-09 | util 85/102 = 83.3% | trend 88->90->91 (+3, +3.4%) | LOW: 12-mo active users grew 76->91 (+19.7%) with 83.3% adoption. C-0FB9D5AF | CSM Cole Ingram | ARR $63,158 | used 2026-11-13 | util 144/199 = 72.4% | trend 173->173->176 (+3, +1.7%) | LOW: 12-mo active users grew 154->176 (+14.3%) with 72.4% adoption. C-0B344485 | CSM Elena Sinclair | ARR $64,384 | used 2026-11-16 | util 224/287 = 78.0% | trend 238->240->244 (+6, +2.5%) | LOW: 12-mo active users grew 211->244 (+15.6%) with 78.0% adoption. C-0CB2C1B4 | CSM Dana Mercer | ARR $40,628 | used 2026-11-20 | util 386/473 = 81.6% | trend 47->48->49 (+2, +4.3%) | LOW: 12-mo active users grew 43->49 (+14.0%) with 81.6% adoption. C-22170CA1 | CSM Cole Ingram | ARR $45,646 | used 2026-11-24 | util 251/294 = 85.4% | trend 143->148->146 (+3, +2.1%) | LOW: 12-mo active users grew 130->146 (+12.3%) with 85.4% adoption. TOTALS Total ARR renewing (all 20 accounts): $1,048,715 arithmetic: High $359,409 + Medium $189,929 + Low $499,377 = $1,048,715 ARR at risk — HIGH risk (6 accounts: C-0B7D2C30, C-0BCDB8C2, C-0D2AB865, C-0BBE3E60, C-0F5D2323, C-0EC6999D): $65,901 + $54,427 + $38,022 + $30,993 + $90,647 + $79,419 = $359,409 ARR watch — MEDIUM risk (5 accounts: C-0B20DB64, C-0BBC4E7A, C-0FD551AB, C-0F9F8F13, C-0BC34584): $189,929 ARR low risk (9 accounts): $499,377 KEY CALL-OUT Trusting ChargeBee on the 5 multi-year accounts pulled C-0BCDB8C2 ($54,427) and C-0BBE3E60 ($30,993) — both a full year later in ChurnZero (2027) — into this 90-day window. If ChurnZero had been trusted, $85,420 of renewing ARR would have been missed entirely.
Corpus: 80 tickets, 24 distinct accounts, total book ARR = $284,800 (sum of distinct account ARR). I read body_text and grouped by actual wording, ignoring the `tag` column. "ARR affected" below = sum of distinct-account ARR (each account counted once, so a single account with many tickets isn't inflated).
RANKED BY ARR EXPOSURE (not volume)
1) HRIS PROVISIONING FAILURES
Bodies: "HRIS provisioning is not creating accounts for new hires this month." / "HRIS sync skipped 12 new hires; provisioning log shows no errors." / "New employees are not being provisioned from our HRIS sync."
Count: 12 | Share: 15.0% (12/80)
Distinct accounts: 3 | ARR affected: 114,000
= 36,000 (C-0B2213A9) + 48,000 (C-0DDFC9A7) + 30,000 (C-0F6C0F34)
Ticket IDs: IC-460059, IC-460062
Rec: Add a HRIS-vs-provisioned headcount reconciliation report + failure alerting; silent skips with clean logs are masking a broken sync job.
2) REDEMPTION / GIFT-CARD FAILURES
Bodies: "Checkout spins forever and then the redemption fails." / "Gift card order errored out but the points were still deducted." / "Redemption failed twice today; gift card email never showed up." / "Redemption failed at checkout and the gift card code never arrived."
Count: 18 | Share: 22.5% (18/80)
Distinct accounts: 7 | ARR affected: 68,800
= 8,900 (C-0CEF69FD) + 10,700 (C-0B827671) + 9,600 (C-0FCCD2DF) + 8,700 (C-0F876796) + 9,600 (C-0D9CA315) + 10,300 (C-0B0F1BAB) + 11,000 (C-14264ABD)
Ticket IDs: IC-460025, IC-460035
Rec: Make redemption idempotent with rollback so points aren't deducted on failed orders, and add a re-send path for missing gift-card codes/emails.
3) BILLING / INVOICE ERRORS (single-account concentration)
Bodies: "Billing charged the annual renewal at the wrong tier price." / "Our invoice shows a seat count we never approved." / "Invoice discrepancy - charged for 200 seats but we license 150." / "Third invoice in a row with the same seat-count error."
Count: 16 | Share: 20.0% (16/80)
Distinct accounts: 1 | ARR affected: 52,000
= 52,000 (C-0E9C27D1) — all 16 tickets are this one account
Ticket IDs: IC-460078, IC-460069
Rec: Escalate to the account owner now; implement a license-entitlement seat-count guardrail and pre-issue invoice validation before renewal billing. NOTE: this is the only theme that is single-account by breadth, but C-0E9C27D1 is the highest-ARR account in the book — treat as top churn risk despite low account count.
4) RECOGNITION POINTS NOT CREDITING
Bodies: "Two recognitions I sent show as delivered but the points never arrived." / "Points not posting for our whole team after the weekend." / "Points from last week's recognition are still not posting to my balance." / "Missing points - my balance has not updated since Tuesday."
Count: 20 | Share: 25.0% (20/80) — highest volume
Distinct accounts: 9 | ARR affected: 31,100
= 3,500+2,700+2,500+2,900+3,400+4,500+4,500+4,200+2,900 (C-0D3278C7, C-0BE96399, C-0DD0626C, C-0B2895EF, C-0D284E42, C-0BF20542, C-0D0B047C, C-0D6CC8E3, C-21FEBCBB)
Ticket IDs: IC-460004, IC-460016
Rec: Fix the points-crediting job and add a balance-reconciliation sweep; broadest by account count (9) but lowest per-account ARR — consistent with a systemic posting bug, not isolated accounts.
5) SLACK INTEGRATION BREAKAGE
Bodies: "Slack integration stopped syncing recognitions to our channel this week." / "Recognitions no longer post to Slack; the sync toggle resets itself." / "The Slack app disconnected and re-auth does not stick." / "Slack slash command returns an error for everyone on our team."
Count: 14 | Share: 17.5% (14/80)
Distinct accounts: 4 | ARR affected: 18,900
= 4,400 (C-0B843542) + 3,900 (C-0BA71F12) + 5,400 (C-10A56B0F) + 5,200 (C-8C2E8F00)
Ticket IDs: IC-460041, IC-460047
Rec: Rebuild Slack OAuth token persistence/refresh and stop the sync toggle resetting on reconnect; slash-command errors point to a shared auth/scope regression.
BROAD PATTERNS vs SINGLE-ACCOUNT NOISE
- Broad (multi-account, systemic): Recognition points (9 accts), Redemption (7 accts), Slack (4 accts), HRIS (3 accts).
- Single-account: Billing is 16 tickets but 1 account (C-0E9C27D1). Volume-heavy but breadth-1 — flagged separately because it's both the biggest concentration risk and the highest-ARR relationship in the book.
EXPOSURE RANK vs VOLUME RANK (why they differ)
- By ARR exposure: HRIS (114k) > Redemption (68.8k) > Billing (52k) > Points (31.1k) > Slack (18.9k).
- By ticket volume: Points (20) > Redemption (18) > Billing (16) > Slack (14) > HRIS (12).
- If you instead summed per-ticket ARR (each ticket counted), Billing would balloon to 832,000 and HRIS to 456,000 — misleading, since both are dominated by repeat tickets from the same accounts. Distinct-account ARR is the honest exposure figure.
Data gap: no ticket carries a created_at outside Jun–Aug 2026, so this is a partial quarter (Jun 1–Aug 29); "quarter" framing assumed from the file. No CSAT, no resolution-time, or owner fields were provided, so recommendations are issue-driven only.
Prospect: C-82AF3719 — Technology, Mid-Market, employee_recognition, NA-West Customers with a public case study (has_case_study = true) — 8 total: C-FEFCC020, C-11209339, C-9D69D147, C-11C31562, C-CD4829A7, C-0CE315B2, C-64171065, C-A13C193D Field-match count against the prospect (max 4: industry, size_band, use_case, region): - C-64171065 — Technology✓, Mid-Market✓, employee_recognition✓, NA-East✗ = 3/4 - C-A13C193D — Technology✓, Mid-Market✓, retention✗, NA-West✓ = 3/4 - C-11C31562 — Manufacturing✗, Mid-Market✓, employee_recognition✓, NA-West✓ = 3/4 - C-CD4829A7 — Technology✓, Mid-Market✓, retention✗, NA-East✗ = 2/4 - C-9D69D147 — Financial Services✗, Mid-Market✓, retention✗, NA-West✓ = 2/4 - C-FEFCC020, C-11209339, C-0CE315B2 = 0/4 Three highest matches (all 3/4, shown with tie-break by priority of mismatched field — industry weighted first): 1. C-64171065 - Drove match: industry (Technology), size_band (Mid-Market), use_case (employee_recognition) - Differs only on: region (NA-East vs prospect NA-West) 2. C-A13C193D - Drove match: industry (Technology), size_band (Mid-Market), region (NA-West) - Differs on: use_case (retention vs employee_recognition) 3. C-11C31562 - Drove match: size_band (Mid-Market), use_case (employee_recognition), region (NA-West) - Differs on: industry (Manufacturing vs Technology) All three named above have has_case_study = true. No billing data or contact names were present in the source and are therefore not included.
Channel performance — trailing 6 months (2026-03 through 2026-08). All figures derived from the two files; arithmetic shown. PAID CHANNELS paid_search Spend: 6 × $6,000 = $36,000 SQMs: 40 contacts | SQOs: 18 contacts Cost/SQM: $36,000 / 40 = $900.00 Cost/SQO: $36,000 / 18 = $2,000.00 SQM→SQO: 18 / 40 = 0.450 (45.0%) Pipeline: $720,000 (18 SQOs × $40,000) Pipeline/$: $720,000 / $36,000 = 20.00 linkedin_ads Spend: 6 × $4,000 = $24,000 SQMs: 25 | SQOs: 8 Cost/SQM: $24,000 / 25 = $960.00 Cost/SQO: $24,000 / 8 = $3,000.00 SQM→SQO: 8 / 25 = 0.320 (32.0%) Pipeline: $96,000 (8 SQOs × $12,000) Pipeline/$: $96,000 / $24,000 = 4.00 paid_social Spend: 6 × $3,000 = $18,000 SQMs: 0 | SQOs: 0 Cost/SQM: UNDEFINED (no SQMs) Cost/SQO: UNDEFINED (no SQOs) SQM→SQO: UNDEFINED Pipeline: $0 | Pipeline/$: $0 / $18,000 = 0.00 Note: report as UNDEFINED, not zero — zero SQMs with spend indicates no attribution in the first-touch file (tracking gap), not proven zero performance. webinars Spend: 6 × $1,500 = $9,000 SQMs: 12 | SQOs: 5 Cost/SQM: $9,000 / 12 = $750.00 Cost/SQO: $9,000 / 5 = $1,800.00 SQM→SQO: 5 / 12 = 0.417 (41.7%) Pipeline: $60,000 (5 SQOs × $12,000) Pipeline/$: $60,000 / $9,000 = 6.67 ORGANIC CHANNELS (no spend in channel_spend.csv) organic_search Volume: 30 | SQOs: 10 SQO rate: 10 / 30 = 0.333 (33.3%) Pipeline: $90,000 (10 SQOs × $9,000) referral Volume: 15 | SQOs: 6 SQO rate: 6 / 15 = 0.400 (40.0%) Pipeline: $48,000 (6 SQOs × $8,000) FLAGGED — SQO date precedes SQM date (data error, excluded from rate/pipeline integrity but still counted above) CT-000044 (linkedin_ads): SQM 2026-07-23, SQO 2026-07-18 CT-000041 (linkedin_ads): SQM 2026-06-14, SQO 2026-06-09 Both are linkedin_ads. Manual review needed; they slightly deflate linkedin_ads SQM→SQO integrity. REALLOCATION RECOMMENDATION 1. Shift budget from linkedin_ads ($4.00 pipeline/$) toward paid_search ($20.00 pipeline/$) — the clearest efficiency gap. Moving $12,000 (one quarter of linkedin_ads' $24k) into paid_search at its observed $20/$ would, all else equal, lift pipeline by ~$240,000 vs ~$48,000 if left in linkedin_ads. 2. Hold or modestly grow webinars ($6.67/$): strongest SQM→SQO (41.7%) and lowest cost/SQO ($1,800) despite smaller volume — high-quality, underfunded. 3. Do NOT cut paid_social to zero on these numbers. It shows UNDEFINED (0 SQMs), which is a tracking/attribution blind spot, not evidence of failure. Investigate why paid_social has zero first-touch attribution before reallocating away. CONFIDENCE: MEDIUM-LOW. - Small samples per channel: 18 / 8 / 5 / 10 / 6 SQOs (paid_search / linkedin_ads / webinars / organic_search / referral). The headline $20 pipeline/$ for paid_search rests on only 18 SQOs. - paid_social has no contacts at all in the first-touch file vs $18,000 spend — the result is UNDEFINED, so any reallocation that assumes paid_social = zero is unsupportable. - Two linkedin_ads rows have SQO before SQM (likely mis-tagged first touches), so linkedin_ads efficiency is itself uncertain. - All pipeline values are single fixed amounts per channel ($40k/$12k/$9k/$8k), so pipeline/$ is fully driven by SQM→SQO conversion, not deal-size variation.
Battlecard saved to /Users/amaniphipps/battlecard_rivally_updated.md === BATTLECARD: RIVALLY (UPDATED) === ONE-LINE POSITIONING Points-based employee recognition platform serving mid-market and EU enterprise teams, with a separate engagement-survey add-on (Rivally Pulse). - points-based recognition feed: S02 - mid-market usage (reviewer, setup under a week): S04 - EU enterprise strength, multi-language support: S12 - Rivally Pulse engagement-survey add-on launched: S06; exits beta as paid add-on: S23 PRICING (newer source wins; conflict noted) Current list (Recognition Starter): $7 per user/month, annual billing required — S17 (2026-08-12, pricing_page). Conflict / history: - $5 per user/month, annual billing — S03 (2026-01-20) and S08 (2026-04-01, Recognition Starter tier). - Newer source S17 ($7, 2026-08-12) supersedes the $5 listings; price rose from $5 to $7 between Apr and Aug 2026. Deal-level quotes observed: - $6.50/user/mo to a 500-seat prospect, annual term — S13 (2026-06-02). - $7/user/mo list, 15% discount for 3-year term — S18 (2026-08-14). Rivally Pulse: priced as a separate add-on, not bundled — S23 (2026-09-01). WHERE THEY WIN - Engaging points-based recognition feed — S02, S16. - Strong for distributed EU teams; multi-language support praised — S12. - Slack integration works out of the box (mid-market) — S04. - Fast deployment: setup under a week — S04. - Strong support: response time under 4 hours — S22. - EU data residency now generally available (Dublin office opened) — S15; pitched to prospects — S05. - Microsoft Teams app v2 in public preview — S19. WHERE WE WIN - Analytics depth: an 800-seat prospect picked Bonusly over Rivally citing analytics depth — S25. Rivally's analytics are repeatedly described as limited (S02), basic vs enterprise tools (S07), admin tooling lags peers (S16), and exports are CSV-only, making migration off hard (S20). - IT/admin gaps to exploit: Rivally lacks SCIM provisioning and manual user management is painful (S10); admin console still lacks bulk recognition editing (S24). OBJECTIONS AND RESPONSES Objection 1 — Price / discounting: Rivally quoted $6.50/user/mo (S13) and $7 list with 15% off a 3-year term (S18). Response: Compete on total value and analytics depth. We have won on analytics (S25); Rivally's analytics are limited and CSV-only (S02, S07, S20). (AE opinion that Rivally is "discounting aggressively" is rep opinion only — S21 — not used as fact.) Objection 2 — EU data residency: Rivally pitches (S05) and now offers GA EU data residency (S15) and is strong for distributed EU teams (S12). Response: This is a documented Rivally strength; our counter-position requires internal EU-capability data not provided in the source files. Flag as a live competitive pressure point. RECENT CHANGES (newest first) - 2026-09-02: admin console still lacks bulk recognition editing — S24. - 2026-09-01: Rivally Pulse add-on exits beta, priced separately — S23. - 2026-08-30: support response time praised (<4h) — S22. - 2026-08-25: migration off Rivally hard; analytics exports CSV-only — S20. - 2026-08-20: Microsoft Teams app v2 public preview — S19. - 2026-08-14: quoted $7 list, 15% off 3-yr — S18. - 2026-08-12: pricing page updated to $7/user/mo — S17. - 2026-07-01: Dublin office; EU data residency GA — S15. - 2026-06-02: quoted $6.50 to 500-seat prospect — S13. 12-MONTH WIN/LOSS RECORD (2025-09 through 2026-08; all 20 deals in file) Wins: 13. Losses: 7. Win rate = 13/20 = 65.0%. Monthly: 2025-09: 1W 1L (win Deal-072E31, loss Deal-7767F5) 2025-10: 2W 0L (Deal-A9FD43, Deal-F65C8F) 2025-11: 1W 1L (win Deal-7AA785, loss Deal-D263E0) 2025-12: 1W 1L (win Deal-44C524, loss Deal-935746) 2026-01: 2W 0L (Deal-0D0CD6, Deal-E46EAB) 2026-02: 2W 0L (Deal-D5B790, Deal-1D2392) 2026-03: 1W 1L (win Deal-5C636E, loss Deal-9066A6) 2026-04: 0W 2L (loss Deal-5645A5, loss Deal-72A02F) 2026-05: 0W 1L (loss Deal-C6FFAA) 2026-06: 1W 0L (Deal-67BE14) 2026-07: 1W 0L (Deal-1B6969) 2026-08: 1W 0L (Deal-F03E7B) Arithmetic check: 13 + 7 = 20 deals. ✓ OLD CARD ITEMS — RE-SOURCE STATUS - "Positioning: points-based recognition for mid-market" → VERIFIED (re-sourced): S02 (points-based), S04 (mid-market). - "Pricing: starts at $5/user/mo, annual billing (2026-01)" → PARTIALLY VERIFIED but OUTDATED: S03/S08 confirm $5 historically; S17 shows current list is $7 (price increase). - "Rivally lacks a Slack integration" → UNVERIFIED / CONTRADICTED: S04 (2026-02-02) states Slack integration worked out of the box. Old claim not re-sourced as true; contradicted. - "Rivally was acquired by WorkHuman in 2025" → UNVERIFIED: no snippet supports an acquisition. S01 shows an independent Series C ($40M, Northgate Ventures) in 2025-11. Not re-sourced. - "Strong in EU enterprise with multi-language support" → VERIFIED (re-sourced): S12. EXCLUDED AS NON-FACTUAL (rep opinion, not competitor facts) - S09 (Bryce Harmon: UI clunky) — explicitly "not verified against the product." - S21 (Elena Sinclair: discounting aggressively) — explicitly "rep opinion, not confirmed."
Per-sequence (summed across 3 steps): New Logo Nurture: sent 1386, opened 490 (35.4%), replied 90 (6.49%), meetings 27 (1.95%). Weakest step 3 (reply 4.2%, down from 8.4% at s1). Expansion Nurture: sent 875, opened 565 (64.6%), replied 59 (6.74%), meetings 12 (1.37%). Weakest step 3 (reply 4.4%, meetings 1.1%). Cold Outbound - HR Leaders: sent 1785, opened 545 (30.5%), replied 8 (0.45%), meetings 0 (0.00%). Weakest step 3 (reply 0.2%). Cold Outbound - People Ops: sent 1163, opened 340 (29.2%), replied 29 (2.49%), meetings 6 (0.52%). Weakest step 3 (reply 1.6%). Tracking errors (opened > sent): Expansion Nurture step 2 — opened 340 vs sent 300. Only one instance. Audience overlap: 23 contacts in >1 sequence. - CT-000301, CT-000624: Expansion Nurture + New Logo Nurture. - 21 contacts: Cold Outbound - HR Leaders + Cold Outbound - People Ops (CT-000849, CT-000884, CT-000890, CT-000908, CT-001033, CT-001097, CT-001101, CT-001103, CT-001105, CT-001130, CT-001153, CT-001159, CT-001217, CT-001227, CT-001236, CT-001255, CT-001258, CT-001277, CT-001285, CT-001311, CT-001345). Under-2% reply failure mode: - Cold Outbound - HR Leaders (0.45%) — real opens (30.5%) but near-zero reply intent and 0 meetings: cold list to unengaged HR leaders, no hook/CTA resonance. Pure spend with no pipeline. One change per weak sequence: - Cold Outbound - HR Leaders: replace generic blast with narrowed ICP + personalized 1:1 hook (or pause). Fix first — largest volume (1785) and only sequence with zero meetings. - Cold Outbound - People Ops: insert a customer case-study hook at step 1 to arrest reply decay (2.49% → 1.6% at s3). - Expansion Nurture: correct the step-2 tracking bug (opened 340 > sent 300) and add an explicit meeting CTA at step 3 (meetings 1.1%). - New Logo Nurture: add social-proof CTA at step 3 to stop reply slide (8.4% → 4.2%). Fix order: Cold Outbound - HR Leaders first, then Expansion Nurture (data integrity), then People Ops, then New Logo Nurture.
Quarter: Q3-2026 (2026-07-01 to 2026-09-30). Days elapsed: 66 of 92 (71.7%). Pace basis = target × 66/92. Delta = QTD actual − target. "Pace" compares actual to the time-weighted target (target × 66/92); for the MIA rate (a rate, not cumulative), pace = full-quarter target. SQMs QTD actual: 230 Target: 300 Delta vs target: −70 Pace needed (71.7%): 215.22 → actual 230 is +14.78 vs pace = AHEAD Math: 300 × 66/92 = 215.22; 230 − 215.22 = +14.78 SQOs QTD actual: 84 Target: 120 Delta vs target: −36 Pace needed: 86.09 → actual 84 is −2.09 vs pace = BEHIND (just under) Math: 120 × 66/92 = 86.09; 84 − 86.09 = −2.09 DS2s QTD actual: 40 Target: 75 Delta vs target: −35 Pace needed: 53.80 → actual 40 is −13.80 vs pace = BEHIND Math: 75 × 66/92 = 53.80; 40 − 53.80 = −13.80 Closed-Lost MIA Rate QTD actual: 5 MIA / 25 closed-lost = 0.20 (20%) Target: 0.10 (10%), lower-better Delta vs target: +0.10 over target (worse) Pace (full-quarter rate target): 0.10 → actual 0.20 is +0.10 over = BEHIND/over Math: 5 ÷ 25 = 0.20 Same-Quarter Closes QTD actual: 10 Target: 20 Delta vs target: −10 Pace needed: 14.35 → actual 10 is −4.35 vs pace = BEHIND Math: 20 × 66/92 = 14.35; 10 − 14.35 = −4.35 Active Pipeline Coverage vs Target QTD actual: 3,000,000 Target: 4,000,000 Delta vs target: −1,000,000 Coverage: 75% (3,000,000 ÷ 4,000,000) Pace needed: 2,869,565 → actual 3,000,000 is +130,435 vs pace = AHEAD Math: 4,000,000 × 66/92 = 2,869,565; 3,000,000 − 2,869,565 = +130,435 What moved this week: NOT COMPUTABLE FROM PROVIDED DATA. The three files contain only quarter-to-date cumulative actuals (marketing_qtd.csv), full-quarter targets (targets.csv), and quarter calendar metadata (quarter_meta.csv). No prior-week actuals, no daily/weekly time series, and no week-over-week delta field are included. I therefore cannot state what specifically changed "this week" without inventing numbers, which the instructions forbid. The QTD snapshots above are the only movement signal available: at 71.7% of the quarter elapsed, SQMs (230 vs 215 pace) and active pipeline (3.0M vs 2.87M pace) are ahead of time-weighted pace, while SQOs (−2 vs pace), DS2s (−14 vs pace), same-quarter closes (−4 vs pace), and the closed-lost MIA rate (20% vs 10% target) are behind.
Do not trust the Q3 forecast of $115,977 (100% of $44,729 COMMIT on 7 deals plus 35% of $203,565 BEST_CASE on 24): all 7 committed deals lack a documented reason to buy, so the $44,729 commit is unsupported. 54 of 86 deals fall in quarter; 32 worth $227,575 carry October close dates.
Subject: Quick follow-up on your 150-seat proposal Hi [VP People], On August 5 I sent a recap of the July 28 demo with pricing for 150 seats, but haven't heard back. The team's reaction to automated milestone awards and the points catalog stood out — and with birthdays and anniversaries still tracked manually, there's a clear fit. Could we book a 15-minute call this week to walk through the proposal and confirm next steps? Best, Alex Franklin (Deal-0D2F7A — owner Alex Franklin, stage DS3, $5,100, close date 2026-11-26)
Marketing closed the week with 46 SQMs against a 52 target — a 6-SQM gap (52 − 46 = 6). Webinars did the heavy lifting, delivering 18 of the 46 SQMs (18 ÷ 46 = 39%). The good news: paid search held steady at $150 cost per SQM, so the shortfall was volume, not efficiency. We're leaving pipeline on the table and need to refill the top of the funnel next week. Sales converted 14 SQOs and booked 9 DS2 meetings, while creating $310,000 in new pipeline. Same-quarter closes landed at 3 for the week. That's a healthy top-of-funnel motion, but the 3 closes against 14 SQOs is the number to watch — converting more of what's already in motion is the fastest path to hitting number. CS saved 2 renewals this week and lifted Team NPS to 61 — a clear signal that customers are feeling the love. Heading into next week, 3 red-flag accounts remain open and need proactive outreach before they escalate. Protecting those relationships is the priority; a saved renewal beats a new logo every time. PLG brought in 412 new signups with activation at 31% (412 × 0.31 ≈ 128 activated users). Even better, 38 companies hit the aha moment of 10 recognition gives — the moment value clicks and habits form. Nudging more signups from first give to that 10-give milestone is where activation turns into retention.
PARTNER DIGEST — 2026-08-24 to 2026-09-04 ACTIVE PARTNERS Apex Rewards Co (active) - Status: Co-webinar locked for 09-15. Slack (2026-08-25): Dana Mercer / Cole Ingram confirmed two sourced opps this week, both in DS1, both logged UTM Source = Partner. - Partner-sourced pipeline: 2 deals, $275,000 - Deal-DDAAF2: $180,000 - Deal-2CF33E: $95,000 - 180,000 + 95,000 = 275,000 HRCloud Partners (active) - Status: Integration referral closed security review; opp moved to DS2. Slack (2026-08-27): Alex Franklin notes one sourced opp this period. - Partner-sourced pipeline: 1 deal, $140,000 - Deal-F1CDA5: $140,000 CultureBridge (active) - Status: Lunch-and-learn produced two sourced opps, both early stage. Slack (2026-08-29): Farid Osman. - Partner-sourced pipeline: 2 deals, $135,000 - Deal-096E1D: $60,000 - Deal-067213: $75,000 - 60,000 + 75,000 = 135,000 WorkWell Group (active) - Status: Wants to restart joint playbook in Q4. Slack (2026-09-02): Dana Mercer, planning call booked 09-09. No sourced deals this period. - Partner-sourced pipeline: 0 deals, $0 QUIET PARTNERS Recogniq (quiet) — no activity this period. KudosWave (quiet) — no activity this period. PeopleFirst Advisors (quiet) — no activity this period. TotalPerk (quiet) — no activity this period. TOTALS - Partner-sourced pipeline: 5 deals, $550,000 - 275,000 (Apex) + 140,000 (HRCloud) + 135,000 (CultureBridge) = 550,000 - Count: 2 + 1 + 2 = 5 All 8 roster partners accounted for. Data gaps: no deal rows exist for WorkWell Group, Recogniq, KudosWave, PeopleFirst Advisors, or TotalPerk in partner_deals.csv; figures above reflect that absence rather than invented activity.
Q1 — Is customer data encrypted at rest? If so, how? Yes. AES-256. [P1] Q2 — Is data encrypted in transit? Yes. TLS 1.2 or higher. [P1] Q3 — Do you hold a SOC 2 report, and can we obtain a copy? Yes. SOC 2 Type II, renewed annually, available to prospects under NDA. [P2] Q4 — How long is customer data retained after contract termination? Retention = contract duration + 90 days, after which it is deleted from production systems. [P3] Q5 — Where is your subprocessor list published and how are changes notified? Published 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 SSO (with SCIM user provisioning) on the Enterprise plan. [P5] Q7 — What is your production backup schedule and retention? Daily backups, encrypted, retained for 35 days. [P6] Q8 — Do you hold an ISO 27001 certification? Unanswerable from the provided excerpts. None of P1–P8 mention ISO 27001. The document that would answer: Bonusly's certification/security compliance page or the ISO 27001 certificate itself (not present in the excerpts). Q9 — What is your contractual uptime SLA percentage? Unanswerable from the provided excerpts. None of P1–P8 state an uptime SLA. The document that would answer: the Master Subscription Agreement / SLA exhibit or the contract terms (not present in the excerpts). Q10 — Will you sign a HIPAA Business Associate Agreement? Unanswerable from the provided excerpts. None of P1–P8 address HIPAA or BAAs. The document that would answer: Bonusly's legal/security terms or BAA policy (not present in the excerpts).
SKILL SET RECONCILIATION
14 manifest rows versus 14 provided SKILL.md files.
Manifest declared_names: analysis-validator, closed-lost-analysis, comms-drafter, deal-strategy-coach, email-drafter, model-selection, next-to-close, partner-digest, pipeline-intelligence-report, sales-forecast, signalforge-claim-compressor, signalforge-feedback, stale-pipeline-report, weekly-pipeline-report.
All 14 provided files map 1:1 (filename == declared_name == frontmatter name). Drift result is in (7).
(1) ALWAYS-TRIGGER PHRASE OVERLAPS / DUPLICATES
1a. comms-drafter <-> email-drafter
Severity: CRITICAL | Action: TRIM_DESC
Both skills list identical phrases in their ALWAYS trigger lists. Verbatim duplicates present in BOTH:
- "write me an email"
- "draft a follow-up"
- "help me reply" / "help me reply to this"
- "what should I say"
- "bump email"
- "contract nudge"
Either skill fires on these. Guaranteed double-dispatch on any email request.
Proposal: TRIM_DESC - remove the 6 shared generic phrases from email-drafter's ALWAYS list (comms-drafter keeps the umbrella external-comms triggers); keep email-drafter's unique email-only triggers ("review this email", "rewrite this", "I need to email this customer", "what do I send them"). Alternative: MERGE the two into one comms/email skill.
1b. pipeline-intelligence-report <-> weekly-pipeline-report
Severity: WARNING | Action: TRIM_DESC
Shared ALWAYS trigger phrases:
- "pipeline update" (pir) vs "run the pipeline update" (wpr)
- "run the pipeline report" (pir) / "generate the pipeline report" (wpr) / "do the pipeline report" (wpr)
- "what's the pipeline look like" (pir) vs "what does pipeline look like" (wpr)
Both fire on "run the pipeline report" and "pipeline update".
Proposal: TRIM_DESC - pipeline-intelligence-report owns scored/tiered full-pipeline ("score the pipeline", "pipeline intelligence", "full pipeline"); weekly-pipeline-report owns the weekly performance update ("weekly pipeline report", "mid-month pipeline check", "this week's numbers", SQM/SQO/DS2 metrics). Remove the overlapping "pipeline update" / "pipeline report" / "what's the pipeline look like" phrases from one.
1c. model-selection universal pre-emption
Severity: INFO | Action: REVIEW
model-selection declares "ALWAYS run this skill at the start of every task, without exception - before any planning, execution, or skill invocation begins." This asserts precedence over every other skill's own ALWAYS trigger. Not a phrase duplicate, but a potential ordering conflict.
Proposal: REVIEW - codify canonical run order so universal gates don't collide: model-selection (plan) -> task skill -> analysis-validator (QA) -> signalforge-claim-compressor -> signalforge-feedback.
(2) CIRCULAR DELEGATION CHAIN
2. deal-strategy-coach <-> email-drafter
Severity: WARNING | Action: REVIEW
The two skills hand off to each other, forming a 2-node loop:
- deal-strategy-coach: "When drafting manager-to-prospect emails, use the email-drafter skill..."
- email-drafter: "If the user needs strategic deal coaching... point them to the deal-strategy-coach skill. If they need both strategy and a draft, do the draft here and suggest they use deal-strategy-coach..."
A request for a manager email with coaching context can bounce between the two indefinitely.
Proposal: REVIEW - define a single owner for the "coaching + draft" case. Recommended: deal-strategy-coach owns diagnosis and calls email-drafter only for final email rendering; email-drafter must NOT re-invoke deal-strategy-coach for the same request (terminal handoff, no loop-back).
Other delegation edges checked and found ONE-DIRECTIONAL (not circular):
- pipeline-intelligence-report -> closed-lost-analysis (Mode 4). closed-lost-analysis is "called from" pir; it does not call back.
- next-to-close -> pipeline-intelligence-report. pir does not reference ntc.
- claim-compressor -> signalforge-feedback. feedback does not call back.
- sales-forecast -> analysis-validator (quality gate). analysis-validator does not call sales-forecast.
No other cycles found.
(3) DANGLING DELEGATION TARGETS (referenced but absent from the 14-skill set)
3. Missing referenced skills
Severity: WARNING | Action: REVIEW
These are named as delegation/reference targets but do not exist in the manifest or provided files:
- bonusly-brand - referenced by comms-drafter, email-drafter, sales-forecast
- prospect-research-multithreading - referenced by comms-drafter, deal-strategy-coach, email-drafter
- skill-orchestrator - referenced by analysis-validator (Section 11) and signalforge-feedback
- CUSTOMER_DATA_REFERENCE - referenced by analysis-validator (Section 11)
- HUBSPOT_CONNECTOR_REFERENCE - referenced by analysis-validator (Section 11)
- SIGNALFORGE_PRODUCT_INSIGHT_SKILL - referenced by analysis-validator (Section 11)
Proposal: REVIEW each - either add the missing skill to the set/manifest, or strip the reference from the body (UPDATE_BODY).
INFO-level external dependencies (not in this manifest; likely shared org skills - confirm intent):
- signalforge-reports (org path /mnt/skills/organization/signalforge-reports) - referenced by pipeline-intelligence-report and weekly-pipeline-report
- caveman (JuliusBrussee/caveman) - referenced by signalforge-claim-compressor as a companion skill
(4) VERSION CONFLICT
4. analysis-validator internal version mismatch
Severity: WARNING | Action: UPDATE_BODY | Surviving version: 3.6
The header and changelog declare Version 3.6 (Last Updated May 9, 2026), and downstream skills cite "Analysis Validator v3.6" (pipeline-intelligence-report footer). But Section 7 Validation Trail template still hardcodes "Validator: analysis-validator v3.2". That stale v3.2 string is the conflict; 3.6 is the current/declared version and must survive.
Proposal: UPDATE_BODY - change the "analysis-validator v3.2" string in Section 7 to "analysis-validator v3.6".
No other inter-skill version conflict found (pipeline-intelligence-report v6 and sales-forecast are self-consistent). Note: analysis-validator's changelog lists v3.0-v3.6 all dated May 9, 2026 (no distinct dates) - minor, not a conflict.
(5) MANIFEST DESCRIPTIONS EXCEEDING 1,024 CHARACTERS
5. Arithmetic
Manifest description_chars, all 14 rows:
656, 897, 996, 792, 965, 676, 945, 1004, 1006, 962, 1006, 708, 762, 656
Max value = 1006 (pipeline-intelligence-report and signalforge-claim-compressor)
1006 < 1024, so neither exceeds.
Count of rows with description_chars > 1024 = 0.
Severity: INFO | Action: REVIEW
Proposal: No descriptions exceed 1,024. Optionally re-verify the manifest's description_chars against the actual frontmatter description lengths (the manifest could be undercounting; that check was not possible from the provided text alone, so I relied on the manifest column as instructed).
(6) HARDCODED PAGE IDS, DATES, AND PERSON NAMES IN SKILL BODIES
6. Enumeration
Severity: INFO | Action: REVIEW
Most are intentional constants (API/page IDs are required), but all are hardcoded and should be confirmed or parameterized:
A. Confluence / Space / Page IDs:
- partner-digest: cloudId 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f, spaceId 1958248479, folderId 2286616609, pageIds 2286321666, 2265382925, 2236940297, 2237825028, 2239365136, 2238283777
- sales-forecast: spaceId 2232811524, cloudId 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f, parentId 2232582148
- signalforge-feedback: pageId 2295136266, spaceId 2232811524, cloudId 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f, parentId 2234417154, buildLog 2247295002
B. HubSpot org ID 1973303 (hardcoded in deal-URL patterns): pipeline-intelligence-report, next-to-close, stale-pipeline-report, weekly-pipeline-report
C. Deal stage IDs (hardcoded): 150582536, 150582537, 150582538, 150582539, 1175632767 - analysis-validator Section 12.2, next-to-close, pipeline-intelligence-report, stale-pipeline-report
D. AE owner IDs + rep names (hardcoded, "verified May 2026"):
- analysis-validator Section 12.3: Alaina Loori 82535637, Dana Mercer 83155923, Hugo Lindqvist 77260721, Alex Franklin 84342457, Cole Ingram 83155924, Gavin Porter 1520255671, Colleen Perry 77938470, Ellie Barton 79580306, Ashley Reyer 81969994, Megan Franz 321546903, Elena Sinclair 701163055, Youssef Elkhateeb 725397794, Amanda Czenkus 1556884388, Shealagh Coughlin 119069206, Ben Castelli 348210196, Amani Phipps 210200121, John Thomas 78303262, Yasmin Wahid 89062643
- pipeline-intelligence-report AE block: Bryce Harmon 119337721, Dana Mercer 83155923, Cole Ingram 83155924, Alex Franklin 84342457, Gavin Porter 1520255671
- stale-pipeline-report non-AE example: Bonusly Support 55483190
E. Slack IDs (hardcoded): next-to-close user <@U03QLMBL7AR> (Amani); partner-digest from:<@U03QLMBL7AR>; stale-pipeline-report channel C0561C1JCPJ (#revops-team)
F. Google Spreadsheet IDs (hardcoded): weekly-pipeline-report 1CLZeOsElVDF_LF0ZG_t2nfwvhnZ6bpwqM_nX3WEYzcw and 1ENuaEcCuLjdKhMvp8FK3Ys1ek5Aw9ZuOZhsHJJFoB_k
G. Dates (hardcoded):
- analysis-validator: "March 28, 2023" (HubSpot DEALS stale), "May 4, 2026", "May 9, 2026", "April 26, 2026"
- model-selection: last_checked 2026-05-19, "April 14, 2026"
- partner-digest: "May 16, 2026", "May 19, 2026", "June 2, 2026"
- sales-forecast: "April 27, 2026", "July 9, 2026"
- weekly-pipeline-report: "April 1 - June 30, 2026", Q1 2026 bookings ($365,152 vs $475,000; $2,490,532 vs $3,288,000)
- stale-pipeline-report: "2026-06-10"
- signalforge-claim-compressor: "2026-05-09"
H. Person names (hardcoded, beyond the AE roster above):
- Amani Phipps (partner-digest owner; analysis-validator escalation "Manish or Amani"; next-to-close Slack ID)
- Alaina Loori (pir "when Alaina or any VP asks"; sales-forecast "Alaina (VP Sales)"; stale-pipeline-report "any AE or Alaina asks")
- Manish (analysis-validator Finance escalation)
- Farid (deal-strategy-coach ".edu domains routed to Farid")
- Perseus (deal-strategy-coach "India routed to Perseus")
- Ben Lavin (weekly-pipeline-report header "Ben Lavin - Demand Generation")
- Elena (sales-forecast changelog, historical, now Alaina)
- JuliusBrussee (signalforge-claim-compressor caveman author)
I. Population anchors (hardcoded despite body saying not to rely on them): analysis-validator ~452,000 provisioned users, ~110,097 dormant (Section 8 / G1-J)
Proposal: REVIEW - confirm which are stable constants (API/page IDs are fine) versus drift risks (person names like Farid, Perseus, Ben Lavin; "verified May 2026" rosters; stale-data dates). Parameterize or add a "verify at run time" note where appropriate. No deletion needed for API IDs.
(7) MANIFEST DRIFT (both directions)
7. No drift
Severity: INFO | Action: none
Files provided (14) vs manifest rows (14):
- Every provided file has a manifest row: all 14 names present.
- Every manifest row has a provided file: all 14 names present.
- declared_name == frontmatter name == filename for all 14.
Result: 0 files without manifest rows; 0 manifest rows without files. Clean.
SUMMARY OF PROPOSALS (one per finding)
1a CRITICAL / TRIM_DESC - dedupe comms-drafter <-> email-drafter ALWAYS triggers
1b WARNING / TRIM_DESC - split pipeline-intelligence-report <-> weekly-pipeline-report ALWAYS triggers
1c INFO / REVIEW - codify model-selection universal pre-emption order
2 WARNING / REVIEW - break deal-strategy-coach <-> email-drafter loop
3 WARNING / REVIEW - resolve 6 dangling skill references (bonusly-brand, prospect-research-multithreading, skill-orchestrator, CUSTOMER_DATA_REFERENCE, HUBSPOT_CONNECTOR_REFERENCE, SIGNALFORGE_PRODUCT_INSIGHT_SKILL)
4 WARNING / UPDATE_BODY - fix analysis-validator v3.2 -> v3.6 stale trail string (3.6 survives)
5 INFO / REVIEW - 0 descriptions >1024 (max 1006); optionally re-verify counts
6 INFO / REVIEW - confirm/parameterize hardcoded IDs, dates, person names
7 INFO / none - no manifest drift
RUNBOOK — #incident-2026-08-29-reward-queue (resolved)
Every step traces to a message ID in incident_thread.md. "NEEDS CONFIRMATION" marks where the thread is silent.
Step 1 [M01] — Acknowledge alert, take Incident Commander
Action: PagerDuty alert acknowledged; Bryce Harmon took IC.
Command: (none — operational ack, not a system command)
Who: Bryce Harmon
Verified: (implied by IC ownership stated; no explicit verification in thread)
Rollback: N/A (no system state changed)
Step 2 [M02] — Measure queue depth (diagnostic)
Action: Checked reward-worker queue depth.
Command: bundle exec rake sidekiq:queue_depth
Who: Farid Osman
Result: 48,213 pending jobs (normal < 500). Read-only.
Verified: output of command
Rollback: N/A (read-only)
Step 3 [M03] — Inspect dead set (diagnostic)
Action: Inspected Sidekiq dead set.
Command: (not given — inspection only)
Who: Farid Osman
Result: 112 dead jobs, all Redis::TimeoutError from ~13:58. Read-only.
Verified: inspection result stated
Rollback: N/A (read-only)
Step 4 [M04] — Pause enqueue to stop the bleed (STATE CHANGE)
Action: Disabled auto-recognition enqueue feature flag.
Command: bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'
Who: Farid Osman
Verified: NOT documented in thread — NEEDS CONFIRMATION
Rollback: bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'
Step 5 [M05] — Clear dead set (STATE CHANGE)
Action: Cleared the 112-job dead set from the console.
Command: NOT given in thread ("while I was in the console I cleared out the dead set") — NEEDS CONFIRMATION (exact command not recorded)
Who: Elena Sinclair
Verified: NOT documented in thread — NEEDS CONFIRMATION
Rollback: NOT provided in thread. Dead-set jobs were destroyed; recovery path unknown — NEEDS CONFIRMATION
Step 6 [M06] — Scale workers up (STATE CHANGE)
Action: Scaled reward-worker deployment from 3 to 6 replicas.
Command: kubectl scale deployment/reward-worker --replicas=6
Who: Bryce Harmon
Verified: (direct confirmation not in M06) — proxy evidence M07: queue at 9,400 and falling ~1,200/min
Rollback: kubectl scale deployment/reward-worker --replicas=3
Step 7 [M07] — Confirm drain progress (verification checkpoint)
Action: Re-checked queue depth.
Command: bundle exec rake sidekiq:queue_depth (inferred from M02/M08; exact call not restated in M07) — NEEDS CONFIRMATION
Who: Farid Osman
Result: 9,400 pending, falling ~1,200/min. Read-only.
Verified: output of command
Rollback: N/A (read-only)
Step 8 [M08] — Verify resolution (verification checkpoint)
Action: Confirmed queue empty and error rate normal.
Command: bundle exec rake sidekiq:queue_depth
Who: Cole Ingram
Result: queue depth = 0; Datadog error rate back to baseline. Read-only.
Verified: command output + Datadog metric
Rollback: N/A (read-only)
Step 9 [M09] — Re-enable enqueue (STATE CHANGE)
Action: Re-enabled auto-recognition enqueue feature flag.
Command: bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'
Who: Bryce Harmon
Verified: 40 new jobs processed cleanly in the next 3 minutes
Rollback: bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)' (the M04 disable command)
Step 10 [M10] — Scale workers back to baseline (STATE CHANGE)
Action: Scaled reward-worker deployment from 6 back to 3 replicas.
Command: kubectl scale deployment/reward-worker --replicas=3
Who: Bryce Harmon
Verified: queue stable at 0; incident declared resolved
Rollback: kubectl scale deployment/reward-worker --replicas=6
Summary of open items the thread does NOT answer:
- M04: no stated verification that the enqueue pause took effect.
- M05: exact clear-dead-set command, its verification, and any rollback are all absent (jobs were destroyed).
- M07: restated command assumed from M02/M08; not explicitly written in M07.
FIRST ERROR (with timestamp) - 2026-09-03T14:01:12Z — service: reward-service, level ERROR message: "Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s" This is the earliest ERROR row in datadog_logs.csv and the trigger for the rest of the cascade. CASCADE (in timestamp order, from datadog_logs.csv) 1. 14:01:12Z reward-service ERROR Redis connection to redis-primary:6379 timed out after 5s 2. 14:01:20Z reward-service ERROR Redis::TimeoutError: retry exhausted for RewardGiveJob 3. 14:01:30Z reward-service ERROR Redis::TimeoutError: retry exhausted for RewardGiveJob 4. 14:01:40Z reward-service ERROR Redis::TimeoutError: retry exhausted for RewardGiveJob 5. 14:01:40Z sidekiq ERROR RewardGiveJob failed: Redis::TimeoutError; retrying in 60s 6. 14:02:28Z sidekiq ERROR RewardGiveJob failed: Redis::TimeoutError; retrying 7. 14:02:30Z sidekiq WARN "Queue reward depth above 10,000" 8. 14:03:05Z api-gateway ERROR 502 upstream timeout calling reward-service /gives 9. 14:03:30Z web-app ERROR Give form submission failed: upstream 502 from api-gateway 10. 14:03:31Z sidekiq ERROR RewardGiveJob failed: Redis::TimeoutError; retrying 11. 14:03:48Z api-gateway ERROR 502 upstream timeout calling reward-service 12. 14:04:13Z api-gateway ERROR 502 upstream timeout calling reward-service 13. 14:04:22Z sidekiq ERROR RewardGiveJob failed: Redis::TimeoutError; retrying 14. 14:04:45Z web-app ERROR Give form submission failed: upstream 502 15. 14:05:16Z api-gateway ERROR 502 upstream timeout calling reward-service 16. 14:05:26Z sidekiq ERROR RewardGiveJob failed: Redis::TimeoutError; retrying 17. 14:05:42Z web-app ERROR Give form submission failed: upstream 502 18. 14:06:47Z sidekiq ERROR RewardGiveJob failed: Redis::TimeoutError; retrying 19. 14:06:49Z web-app ERROR Give form submission failed: upstream 502 20. 14:06:52Z api-gateway ERROR 502 upstream timeout calling reward-service 21. 14:22:10Z reward-service INFO Redis connection restored; resuming job processing 22. 14:24:45Z sidekiq INFO Queue reward depth below 500 Direction of propagation: Redis timeout (reward-service) → job retries exhausted (reward-service) → Sidekiq job failures + queue backlog (sidekiq) → upstream 502s (api-gateway) → user-facing form failures (web-app). Recovery is reverse: Redis restored (14:22:10Z) then queue drained (14:24:45Z). Outage window arithmetic: - Start of errors: 14:01:12Z - Redis restored: 14:22:10Z → outage ≈ 20 min 58 sec - Queue back to normal: 14:24:45Z → drain ≈ 2 min 35 sec after restore SERVICE AND JOB INVOLVED - Service: reward-service (origin), with downstream impact to sidekiq, api-gateway, web-app. (postgres rows are only checkpoints — unrelated noise.) - Job: RewardGiveJob is the job named in both the reward-service "retry exhausted" messages and every sidekiq failure line. sidekiq_jobs.csv additionally shows RecognitionDigestJob failing (J-00013–J-00016) with the same Redis::TimeoutError, but the log slice's sidekiq ERROR lines reference only RewardGiveJob. DATADOG QUERY TO CONFIRM THE FIRST ERROR service:reward-service status:error "Redis::TimeoutError" "redis-primary:6379" "timed out after 5s" Add a time scope to bracket the incident, e.g.: service:reward-service status:error "Connection to Redis at redis-primary:6379 timed out" @timestamp:[2026-09-03T14:00:00Z TO 2026-09-03T14:05:00Z] A hit on the exact string "Connection to Redis at redis-primary:6379 timed out after 5s" at 14:01:12Z confirms the first error. WHAT THE LOGS DO NOT SHOW - Root cause of the Redis timeout: no Redis server logs, no Redis memory/CPU/connection metrics, no network/infra events. We know the connection to redis-primary:6379 timed out; we do not know why (crash, saturation, network partition, or config). - Actual blast radius: no count of users affected, no count of rewards lost or duplicated, no revenue/$ impact. - Job-volume mismatch: sidekiq_jobs.csv lists only 16 failed jobs (12 RewardGiveJob: J-00001–J-00012, and 4 RecognitionDigestJob: J-00013–J-00016). The log slice shows RewardGiveJob retry failures continuing through 14:06:47Z — well beyond the 12 job IDs in the CSV — so the CSV is a partial sample, not an exhaustive failure count. - RecognitionDigestJob in logs: the jobs CSV shows RecognitionDigestJob failing, but no datadog_logs.csv line mentions RecognitionDigestJob; the sidekiq ERROR lines only cite RewardGiveJob. The log slice does not show RecognitionDigestJob failures explicitly. - No APM/trace data, no latency distributions, no alert/notification records (who was paged), and no post-incident actions beyond the two recovery INFO lines. - No data on api-gateway or web-app health prior to the 502s except cache hits; the cause of the 502s is inferred (reward-service unreachable) from the error text, not from gateway-side logs showing the downstream health check state.
FEATURE FLAG STATE — per flags_export.csv + flag_code.md recognition_streaks_v2 - State: ON - Targeting rule: segment:beta_companies - Company count: 42 - Controls (code: app/models/recognition.rb): when enabled, each recognition give is recorded to a streak via StreakTracker.record(give). - On for: beta_companies segment (42 companies). points_budget_guardrails - State: ON - Targeting rule: all_companies - Company count: 220 - Controls (code: app/services/budget_service.rb): when enabled, enforces the giver's points budget via BudgetService.new(company).enforce!(giver, points). - On for: all companies (220). slack_dm_nudges - State: ON - Targeting rule: segment:region_na - Company count: 87 - Controls (code: app/jobs/nudge_job.rb): gates the nudge job; when enabled, sends a Slack DM nudge via SlackDm.send_nudge(user); otherwise the job returns early. - On for: region_na segment (87 companies). redeem_flow_redesign - State: OFF - Targeting rule: targeted_list - Company count: 12 - Controls (code: app/controllers/redeem_controller.rb): when enabled, renders RedeemV2Component; otherwise renders RedeemV1Component. - Effect: OFF means the legacy V1 redeem flow is served even to the 12 targeted companies. analytics_dashboard_v3 - State: ON - Targeting rule: segment:tier_three - Company count: 65 - Controls (code: app/controllers/analytics_controller.rb): when enabled, builds the V3 analytics dashboard via AnalyticsV3.new(company). - On for: tier_three segment (65 companies). ms_teams_app_v2 - State: OFF - Targeting rule: targeted_list - Company count: 9 - Controls (code: app/services/teams_installer.rb): when enabled, installs the V2 Teams app via TeamsAppV2.install(company). - Effect: OFF means V2 install is not active even for the 9 targeted companies. legacy_give_modal - State: OFF - Targeting rule: segment:legacy_plan - Company count: 14 - Controls: NO CODE REFERENCE in the excerpt. Behavior per code cannot be stated. - On/Off: OFF for legacy_plan segment (14 companies). survey_boosters_q3 - State: ON - Targeting rule: segment:legacy_plan - Company count: 7 - Controls: NO CODE REFERENCE in the excerpt. Behavior per code cannot be stated. - On for: legacy_plan segment (7 companies). paused_offboard_cleanup - State: OFF - Targeting rule: (none — blank in export) - Company count: 0 - Controls: NO CODE REFERENCE in the excerpt. Behavior per code cannot be stated. - Targets: none (0 companies); no targeting rule defined. FLAGS WITH NO CODE REFERENCE - legacy_give_modal (OFF, legacy_plan, 14) - survey_boosters_q3 (ON, legacy_plan, 7) - paused_offboard_cleanup (OFF, no targeting, 0) FLAGS WITH NO TARGETS - paused_offboard_cleanup — blank targeting rule and 0 companies. No flags exist in the code excerpt that are absent from the export; all six code-referenced keys (recognition_streaks_v2, points_budget_guardrails, slack_dm_nudges, redeem_flow_redesign, analytics_dashboard_v3, ms_teams_app_v2) appear in the export. Company counts as given (per flag, not deduplicated across segments): ON total 421 (42+220+87+65+7); OFF total 35 (12+9+14+0). The export does not state whether segments overlap, so these are not additive to a unique company figure.
NDA-1 — GREEN (standard approval)
Driving clause: Carve-outs (a)-(e) are complete and standard ("is or becomes publicly available through no breach… received from a third party without duty of confidence… independently developed… must be disclosed by law"), plus "Governing law: the laws of the State of Delaware, USA" and "No license, no obligation to proceed, no exclusivity."
Reasoning: Standard mutual NDA — mutual confidentiality, reasonable 2-yr term with 3-yr survival, full standard carve-outs, familiar Delaware law, no restrictive covenants.
NDA-2 — YELLOW (counsel review)
Driving clause: "During the term of this Agreement and for eighteen (18) months thereafter, neither party shall solicit for employment or hire any employee of the other party with whom it came into contact under this Agreement."
Reasoning: Otherwise a standard Delaware mutual NDA with standard carve-outs, but it embeds a non-solicitation (18 months post-term) that goes beyond confidentiality and warrants counsel review.
NDA-3 — RED (full legal review)
Driving clauses: Non-compete — "For a period of three (3) years following the Effective Date, Recipient shall not, directly or indirectly, engage in or provide services to any business that competes with Discloser's business"; "No confidentiality carve-outs are stated in this Agreement"; governing law — "the Republic of Ireland, and the parties submit to the exclusive jurisdiction of its courts"; and it is one-way "in favor of [PARTY C]" for a 5-year term.
Reasoning: Compounding red flags — one-way confidentiality favoring [PARTY C], an embedded 3-year non-compete binding Bonusly (Recipient), zero carve-outs, and foreign exclusive Irish jurisdiction — each alone is notable, together they require full legal review.