Mean 0.965 · 34/40 perfect tests · $0.34 total · each card: the question → the correct answer (gold) → this model's actual answer
Verified with a scripted pass over all 156 deals (both counts re-checked programmatically, not eyeballed). == DEFINITIONS == - DS2+ population: deals at stage DS2–DS5. n = 124 of 156 open deals. - Why-buys compliant: why_buys is 15+ chars and not a placeholder (tbd, n/a, see notes). A value shown as LONG(n) = text present but display-truncated → compliant. Empty = non-compliant. - No-DS1: t_ds1 field empty. - Regressed: among a deal's non-empty stage-entry timestamps, an earlier-stage timestamp is later than a later-stage one (e.g., t_ds2 > t_ds3). == WHY-BUYS NON-COMPLIANCE (DS2+) == Overall: 101 / 124 = 81.5% (23 compliant, all LONG(n) truncated entries: 124 − 23 = 101) By owner: - Alex Franklin: 48/61 = 78.7% - Cole Ingram: 19/22 = 86.4% - Dana Mercer: 18/22 = 81.8% - Bryce Harmon: 15/18 = 83.3% - Farid Osman: 1/1 = 100.0% (Cross-check: 48+19+18+15+1 = 101; 61+22+22+18+1 = 124) == OTHER METRICS == - Deals with no DS1 timestamp: 0 - Deals that regressed (out-of-order stage timestamps): 0 Note: every non-compliant case is a blank why_buys — no short text or placeholder strings exist in this extract, so the 81.5% is pure field-emptying, not low-effort entries. == THREE PROCESS FIXES == 1. Gate-forward validation: make why_buys a required field (min 15 chars) at the DS1→DS2 stage transition in the CRM, so advancing is blocked, not just audited. 2. Weekly hygiene SLA report to owner managers, scoped to only two numbers: blank why_buys on DS2+ deals, and blank why_buys on any deal in a forecast category of COMMIT or BEST_CASE — with a 3-business-day fix window before the deal is recategorized to Pipeline. 3. Backfill campaign before next forecast call: 101 open DS2+ deals need why-buys written from existing meeting notes (23 already have substantive text — surface those as exemplars); forecast edits disallowed for DS2+ deals still blank at call time.
Owner resolution for deals_open.csv (156 deal rows) against owners.csv (8 owners): **Deals resolved: 156 of 156** Every owner_id in the deals file appears in the owners table. **Owner ids with no match in owners table: 0** (none to list — no name-guessing was needed) **Owner ids mapping to archived/deactivated owners: none** The owners table has two archived entries — Gavin Porter (1520255671) and Hugo Lindqvist (77260721) — but neither id appears on any deal row, so no open deal resolves to an archived owner. **Total pipeline amount per resolved owner** (sum of `amount` grouped by owner_id → name): | Owner (owner_id) | Deals | Pipeline | |---|---|---| | Bryce Harmon (119337721) | 35 | 1,054,144.00 | | Alex Franklin (84342457) | 67 | 624,310.00 | | Dana Mercer (83155923) | 24 | 341,195.00 | | Cole Ingram (83155924) | 22 | 288,161.43 | | Farid Osman (716654662) | 7 | 4,134.00 | | Elena Sinclair (701163055) | 1 | 2,100.00 | | **Total** | **156** | **2,314,044.43** | Arithmetic checks: - Deal counts: 35 + 67 + 24 + 22 + 7 + 1 = 156 ✓ (equals row count) - Owner totals: 1,054,144 + 624,310 = 1,678,454; + 341,195 = 2,019,649; + 288,161.43 = 2,307,810.43; + 4,134 = 2,311,944.43; + 2,100 = 2,314,044.43 - Farid Osman detail: 1,249 (Deal-499BF6) + 2,880 (Deal-8BA24E) + 1 + 1 + 1 + 1 + 1 (five $1 placeholder deals: Deal-03BA69, Deal-117863, Deal-F17780, Deal-2B39B0, Deal-8FDCD2) = 4,134 - Elena Sinclair detail: Deal-57FF13 alone = 2,100 - Cole Ingram includes 19 non-integer amounts (e.g., Deal-D04904 at 58,529.25, Deal-175395 at 4,779.88); fractional cents sum to .43 Data notes: no inventing — the $1 amounts on Deal-012CB1, Deal-483B2D, Deal-3795AD (Bryce Harmon) and Farid Osman's five $1 rows are taken verbatim from the extract and inflate those owners' totals only nominally.
Integrity check results (a) Orphan gong rows — deal id has NO match in deals_open - gong rows: 67. Matched to deals_open: 37. Orphans: 67 − 37 = 30 (30/67 = 44.8%) - Sample orphan aliases: Deal-8FA85D (46 calls), Deal-8FC3F9 (24), Deal-3B7945 (21), Deal-42B265 (21), Deal-9CCC42 (17), Deal-36EA09 (17), Deal-9A43B4 (14), Deal-605F3C (12), Deal-E2D34B (11), Deal-76821A (11) - Supporting signal from the data: 25 of the 30 orphans have calls_with_ds2_date = 0 and calls_with_sqo_date = 0 (no HubSpot stage-date linkage at all), and several have last_call dates outside a 90-day window (e.g., Deal-42B265 last_call 2026-11-25, Deal-9CCC42 2026-11-27, Deal-8FA85D 2026-11-05) — consistent with these being calls mapped to deals that are no longer in the open default pipeline (or a broken id mapping). The remaining 5 orphans do carry ds2/sqo dates: Deal-3F86A0, Deal-422BA6, Deal-B038F0, Deal-AC944F, Deal-38CA53. (b) Duplicate conversation keys (calls_90d > distinct_conversation_keys) - Count: 0. In every one of the 67 rows, calls_90d == distinct_conversation_keys, so this check cannot flag duplicates at the row level. - Also checked: no hs_deal_id and no deal_alias appears more than once in the gong table. - Limitation: the file is aggregated per deal, so the same conversation key shared across two different deal rows would not be detectable from this data. (c) Open deals at DS3 or later with at least one logged call - DS3+ open deals in deals_open: 85 (DS3 = 61, DS4 = 14, DS5 = 10) - Of those, matched to a gong row with calls ≥ 1: 25 (DS3 = 12, DS4 = 6, DS5 = 7) - Share = 25 / 85 = 29.4%. The other 60 DS3+ deals have no logged call in the 90-day gong table (e.g., Deal-2D1F1B is excluded as DS1; DS3+ without calls include Deal-F0EBBB, Deal-FC22A3, Deal-7BBDFA, Deal-9AAE5F, Deal-403845, Deal-2465CE, Deal-FD9F4E).
```sql
-- =====================================================================
-- First calendar month as a customer, per company:
-- unique givers | recognition count | successful redemption count
-- Customer month anchor: FIRST_SUB_PAYMENT_DATE (first paid month).
--
-- DATA GAPS IN THE CATALOG, stated explicitly rather than invented:
-- 1. UNIQUE GIVERS is NOT COMPUTABLE from this catalog. There is no
-- giver-level events table and no givers dimension anywhere in the
-- excerpt. M1_USERS counts users, not givers, so it is NOT used as a
-- proxy; the column is returned as NULL instead of a fabricated number.
-- 2. PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2 is the
-- documented redemption-events source (STATE = 'succeeded' only), but
-- the catalog documents only its STATE column — no company key, event
-- date, or giver key are given. Joining it per company/month would
-- require inventing columns, so M1_REDEMPTIONS is used as the fallback;
-- flag that whether M1_REDEMPTIONS is already 'succeeded'-only is
-- UNVERIFIED in the catalog notes.
-- 3. COMPANY_COHORT_SUMMARY is documented as "one row per self-serve
-- company"; its primary-key column NAME is not listed in the excerpt.
-- COMPANY_ID below is that assumed key — verify against the live
-- schema before running.
-- 4. The catalog does not define whether M1_* is anchored to signup,
-- activation, or first payment, so the M1 bucket may not align exactly
-- with the first CALENDAR month computed from FIRST_SUB_PAYMENT_DATE.
-- 5. Coverage caveat: PRODUCTION.PLG.COMPANY_COHORT_SUMMARY is self-serve
-- companies only; customers outside self-serve have no recognition
-- source in this catalog.
--
-- BUSINESS-RULE COMPLIANCE:
-- - The documented "exclude deleted givers" filter is deliberately NOT
-- applied to the historical giving count (it understates history); no
-- archived/deleted join is made to any giving metric.
-- - Avoided sources: HUBSPOT_HUB_1973303.V2_LIVE.OBJECTS_DEALS (exists but
-- UNPOPULATED), PRODUCTION.HUBSPOT.DEALS (STALE, last sync 2023-03),
-- PRODUCTION.HUBSPOT.GONG_HUBSPOT_MAP_FAST (RETIRED) — none carry
-- recognition data and all are barred by the catalog notes anyway.
-- =====================================================================
SELECT
cohort.COMPANY_ID, -- assumed key; see note 3
DATE_TRUNC('MONTH', cohort.FIRST_SUB_PAYMENT_DATE)
AS FIRST_CUSTOMER_MONTH, -- first calendar month as a paying customer
CAST(NULL AS NUMBER)
AS UNIQUE_GIVERS, -- see note 1: not derivable, not fabricated
cohort.M1_GIVES
AS RECOGNITION_COUNT, -- deleted-giver exclusion intentionally NOT applied
cohort.M1_REDEMPTIONS
AS SUCCESSFUL_REDEMPTION_COUNT -- 'succeeded'-only status unverified; see note 2
FROM
-- COMPANY_COHORT_SUMMARY: the only table in the provided catalog carrying
-- per-company giving aggregates (M1_GIVES, M1_REDEMPTIONS) alongside the
-- first-payment date needed to define "first calendar month as a customer".
-- REDEMPTION_RECORDS_V2 skipped as a join input (only STATE documented — no
-- company/date keys; see note 2). HubSpot engagement/Gong tables skipped:
-- they log EMAIL/CALL/MEETING/NOTE/TASK activity, not recognition gives.
PRODUCTION.PLG.COMPANY_COHORT_SUMMARY AS cohort
WHERE
cohort.FIRST_SUB_PAYMENT_DATE IS NOT NULL -- company is actually a customer
ORDER BY
cohort.COMPANY_ID;
```
AUDIT RESULT — note upfront: no deals file was provided. Only companies.csv (34 rows), contacts.csv (52 rows), and zoominfo_enrichment.csv (25 rows) are in this extract, so deal-level completeness (owner, stage, amount, close date, why-buys) cannot be measured, and no dollar amounts exist anywhere in the supplied data.
DEALS (owner, stage, amount, close date, why-buys)
- Not auditable: 0% complete by inspection — no deals.csv present. Every check below is company/contact-level.
FIELD COMPLETENESS (arithmetic shown)
companies.csv (n = 34):
- industry: 34/34 = 100.0% present — but values are non-canonical: {Technology 9, Retail 5, tech 4, "Tech " 4, Healthcare 4, Manufacturing 3, Finance 2, "health care" 2, SaaS 1}. 16 of 34 use a variant spelling of tech/healthcare.
- employee_count: 25/34 = 73.5% present; missing 9 (34 − 25 = 9)
- hq_country: 28/34 = 82.4% present; missing 6 (34 − 28 = 6). Variants: US 9, USA 6, "United States" 2, Canada 8, UK 3 — three spellings for the US.
contacts.csv (n = 52):
- email: 52/52 = 100.0% non-empty, but 4 are syntactically invalid (below), so valid-email = 48/52 = 92.3%
- title: 39/52 = 75.0%; missing 13
- persona: 37/52 = 71.2%; missing 15
Coverage: 20/34 companies (58.8%) have at least one contact; 14 companies (C-2C60E5, C-2D7423, C-332637, C-50D386, C-7BBDFA, C-93C8BF, C-B97B4E, C-BA969B, C-C9BB20, C-EE9FFB, C-0A092931, C-0A092932, C-0A092933, C-0A092934) have zero contacts.
INVALID EMAILS (4)
- CT-0010 (C-66D1FC): user0@ — no domain
- CT-0080 (C-92D97D): user0@ — no domain
- CT-0081 (C-92D97D): user1@ — no domain
- CT-0192 (C-425E2A): user2@ — no domain
DOMAIN MISMATCH (1)
- CT-0011 (C-66D1FC): user1@other-domain.com vs company domain 66d1fc.com. Likely a free/personal address — verify or replace.
DUPLICATE COMPANY CLUSTERS (2)
1. acme-corp.com: C-0A092931 (Technology, 500, US) + C-0A092932 (tech, 510, USA). Survivor: C-0A092931 (lower alias sorts first and 500 is the rounder, more likely-reviewed figure; both defensible). Merge C-0A092932 into it. Note 500 vs 510 is a real value conflict inside the merge.
2. globex.io: C-0A092933 (SaaS, 200, US) + C-0A092934 (Technology, 200, US). Survivor: C-0A092933 (first alias; "SaaS" is the more specific industry). Merge C-0A092934 in.
No name-variant clusters detectable — aliases are hashes, so only shared-domain detection works here.
ENRICHMENT APPLIED (matching row in zoominfo_enrichment.csv only)
Fillable employee_count (7 of the 9 missing — never invented):
- C-EC3025 → 400; C-96039F → 400; C-44EA29 → 400; C-D04904 → 400; C-B23205 → 400; C-60C75F → 400; C-7BBDFA → 400; C-50D386 → 400 (that is 8; recount: C-EC3025, C-96039F, C-44EA29, C-D04904, C-B23205, C-60C75F, C-7BBDFA, C-50D386 = 8 rows).
- NOT fillable: C-93C8BF (no enrichment row for 93c8bf.com).
- Post-fill employee_count: 33/34 = 97.1%.
Fillable hq_country: 0 — every missing-country company either has a blank zi_hq_country (C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5) or no row (C-EE9FFB). hq_country stays 28/34 = 82.4%.
CRM vs enrichment disagreements
- No hard value conflicts: on all 25 matched domains, employee_count and country agree wherever both are populated (e.g., C-66D1FC 900/US vs 900/United States; C-E51FB7 1500/USA vs 1500/United States).
- Taxonomy disagreement only: CRM industry "tech"/"Technology"/"Tech " (17 rows) vs zi "Computer Software"; CRM "health care" (C-7BBDFA, C-50D386) vs zi "health care" (agrees) but other CRM rows say "Healthcare". Recommendation: adopt CRM canonical set {Technology→Computer Software mapping} or standardize on one taxonomy; for the acme-corp merge the real conflict is CRM-internal (500 vs 510) — recommend the survivor row C-0A092931's 500 pending source check.
10 FIXES MOST VALUABLE TO PIPELINE
(No dollar amounts exist in this extract, so "amount at stake" cannot be quantified — I will not invent it. Ranked instead by deals exposed: every deal on a duplicate or contactless company is at risk, and deal volume per company is unknown.)
1. Obtain/receive a deals.csv — owner, stage, amount, close date, why-buys are 0% auditable today; this blocks the money-weighted half of the audit.
2. Merge C-0A092932 → C-0A092931 (acme-corp.com) and C-0A092934 → C-0A092933 (globex.io); split deals/contacts across duplicates silently under-report pipeline per company.
3. Reconcile acme-corp employee_count 500 vs 510 during the merge with the data owner.
4. Fix 4 invalid emails (CT-0010, CT-0080, CT-0081, CT-0192) — unreachable champions/economic buyers on C-66D1FC, C-92D97D, C-425E2A.
5. Investigate CT-0011 (user1@other-domain.com) — contact hygiene risk on C-66D1FC, which otherwise has 3 duplicate "VP People/champion" contacts suggesting messy import.
6. Backfill 8 missing employee_counts from ZoomInfo (C-EC3025, C-96039F, C-44EA29, C-D04904, C-B23205, C-60C75F, C-7BBDFA, C-50D386) — segmentation/ICP sizing feeds deal scoring.
7. Source hq_country for the 6 unknowns (C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5, C-EE9FFB) — enrichment is blank too; territory/quote compliance depends on it.
8. Normalize industry and country to one controlled vocabulary (tech/Tech /Technology → Computer Software; USA/United States → US; "health care" → Healthcare).
9. Add contacts to the 14 contactless companies — any open deal there has no champion, no economic buyer, no why-buys capture path.
10. Close the 13 missing titles and 15 missing personas (priority: C-92D97D, C-AA8DDA, C-D04904, C-B25F40, which each lack a reachable persona-tagged contact).
CLASSIFICATION (90 deals, all rows classified; categories mutually exclusive, one primary each)
```
Deal-DB0AAC timing buyer | tag: Timing; text: put on pause
Deal-F7F635 competitor unknown | tag: Competitor; "another direction", no vendor named
Deal-AC944F no decision buyer | MIA / unresponsive
Deal-214060 no decision buyer | MIA / unresponsive
Deal-91A056 timing buyer | reconnect early 2027
Deal-29326C timing buyer | "Timing"
Deal-5DB9B0 other Bonusly | ICP tag; "Spam." = our filtering call, not a loss reason
Deal-831B7B timing buyer | look again in new year
Deal-F97C37 competitor Bonusly | other vendor had more diversified offerings
Deal-13E9CF no decision buyer | "Not a budget issue" — deprioritized; tag says Doing nothing/Cost, but text explicitly excludes cost
Deal-39E25C timing buyer | reconnect next year
Deal-7ED004 pricing buyer | did not get budget approval
Deal-21B045 no decision buyer | MIA
Deal-B3ABED timing buyer | revisit Q2, budget for 2028
Deal-422BA6 competitor Bonusly | lost on ADP TotalSource PEO preference — product/partnership gap
Deal-ED9AE7 pricing unknown | "Timing, budget, authority" — multi-factor; budget approval framing
Deal-988493 no decision buyer | MIA
Deal-381C8C competitor unknown | "not moving forward", no reason yet
Deal-F308CA no decision buyer | no contact since April
Deal-F1E8A6 competitor unknown | no reason given
Deal-B6AC09 timing buyer | revisiting in 2027
Deal-70F704 no decision buyer | MISMATCH: tag Lost DM; text = only wanted anniversary automation, then MIA
Deal-E6E80A timing buyer | pushed to early 2027
Deal-B038F0 timing buyer | pushed to early 2027
Deal-4664E1 no decision buyer | no contact after intro
Deal-175756 timing buyer | on hold until 2027
Deal-E74A73 no decision buyer | testing points manually first
Deal-DDAB52 competitor Bonusly | Rippl: more at same cost, no FX friction
Deal-ACE061 competitor unknown | "different direction"; HeyTaco suspected, unconfirmed
Deal-BB78F3 timing buyer | still interested, survey actions first
Deal-D48E0B no decision buyer | MIA
Deal-15DA99 timing buyer | bring back up early 2027
Deal-F4AF5D timing buyer | early next year
Deal-79B7A1 timing buyer | "Timing"
Deal-583ADB no decision buyer | MIA
Deal-8E27DA no decision buyer | MISMATCH: tag Feature Request; text = bought swag-only, didn't want R&R
Deal-2D2F8D competitor unknown | "different direction", no detail
Deal-E0441F no decision Bonusly | stale, inherited from departed rep, no contact either side
Deal-7CB44D no decision buyer | no contact since demo
Deal-0F96AA competitor unknown | RFP elimination, no reason
Deal-1BCA50 competitor Bonusly | budget/gift-card details + stakeholder committed elsewhere
Deal-7CC678 competitor unknown | "nothing specific provided"
Deal-FAC17C no decision buyer | no exec IT approval on contract
Deal-242273 competitor Bonusly | rivals digitized internal points currency, on-site spend
Deal-50E5D8 no decision buyer | leadership pause
Deal-A2C349 competitor Bonusly | stayed with Awardco + surveying
Deal-9F176A timing buyer | paused, end of year
Deal-7B2236 pricing Bonusly | budget + wants simpler/cheaper for Kudos board
Deal-AFA56C no decision buyer | unresponsive
Deal-C7156E competitor unknown | "selected another vendor", no detail
Deal-C33D91 pricing buyer | budget cuts
Deal-9048EB product gap Bonusly | MISMATCH: tag MIA; text = bad fit, multiple feature gaps
Deal-5E64CE timing buyer | Nectar exit fee, term runs to Oct 2027, will return
Deal-8A0992 competitor Bonusly | Canadian provider alignment
Deal-D0C698 competitor buyer | incumbent preference: Kudos again
Deal-69CF3D timing buyer | on hold
Deal-ECBF89 timing buyer | on hold
Deal-3618CC product gap Bonusly | MISMATCH: tag Lost DM; text = "Wanted Surveys"
Deal-EECC02 competitor unknown | "another direction"
Deal-5AD03E pricing buyer | MISMATCH: tag Competitor; text = "wanted more defined budget access"
Deal-D1A623 timing buyer | "timing"
Deal-413C56 no decision buyer | back-to-school priority, CEO not ready
Deal-47F1A1 competitor buyer | staying with WorkTango 12 months
Deal-BF2A98 competitor buyer | just deployed HiThrive
Deal-2A292B no decision buyer | build internally
Deal-D1AABF no decision buyer | no response
Deal-FEDBCB no decision buyer | reconnect year-end, low engagement
Deal-1E7DA9 competitor unknown | "selected another platform"
Deal-2BBA21 no decision buyer | no contact since intro
Deal-286F9C competitor unknown | "not a good fit", no vendor named
Deal-7FBAC6 no decision buyer | leadership pause (again)
Deal-369281 competitor Bonusly | uses what's in Paylocity
Deal-386F6E no decision buyer | no response
Deal-9FCD0D competitor Bonusly | Canadian company = CEO requirement
Deal-55867E timing buyer | tag Timing; "not at this time"
Deal-DAFB82 pricing buyer | budget reallocated, not before 2028
Deal-2FEDDB timing buyer | tag Doing nothing/Cost; text = unsure on timing
Deal-64B19A competitor unknown | "likely stayed with Motivosity" — unconfirmed
Deal-3F86A0 no decision buyer | unresponsive
Deal-096750 no decision buyer | ignored four revival attempts
Deal-F325A5 champion left buyer | layoffs + change in leadership
Deal-ABD14C competitor unknown | "not interested in our program" — no reason; weakest call, could be no-decision
Deal-79E61A no decision buyer | unresponsive
Deal-8A119B pricing buyer | didn't get approval
Deal-AE7C4E no decision buyer | unresponsive
Deal-DAB4F1 no decision buyer | unresponsive
Deal-B4B50F no decision buyer | unresponsive
Deal-981AD4 product gap Bonusly | doesn't fit UI, not UK focused
Deal-DC77FE competitor Bonusly | customization: label points as dollars (price NOT a factor)
Deal-5885B9 no decision buyer | MIA
```
SUMMARY — category counts (n=90)
```
no decision 31
competitor 26
timing 21
pricing 7
product gap 3
champion left 1
other 1 (Deal-5DB9B0, "Spam.")
```
Side split
```
buyer 60 ($719,322 of $1,267,945 total, ~57%)
Bonusly 16 ($309,407, ~24%)
unknown 14 ($239,216, ~19%)
```
Tag vs. free-text disagreements: 5
Deal-70F704 (Lost DM → actually MIA/no decision), Deal-8E27DA (Feature Request → didn't want R&R at all), Deal-9048EB (MIA → real feature-gap bad fit), Deal-3618CC (Lost DM → "Wanted Surveys" = product gap), Deal-5AD03E (Competitor → budget access = pricing). Borderline, not counted: Deal-13E9CF (Cost tag but text says "not a budget issue") and Deal-2FEDDB / Deal-ED9AE7 (multi-factor text).
TWO PATTERNS WORTH ACTING ON
1. Tag hygiene is broken on ~1 in 5 competitor losses and hides the real loss causes. 13 of 26 competitor deals have zero vendor/reason detail ("Went another direction", "Nothing specific provided", "we have selected another platform"), and 4 of the 5 tag/text disagreements are structured tags masking actionable causes — a lost survey capability (Deal-3618CC), feature gaps logged as MIA (Deal-9048EB), and a pricing loss filed as Competitor (Deal-5AD03E). Where detail DOES exist, the competitor losses cluster tightly: breadth/customization vs. price (Deal-DDAB52 Rippl "more at same cost", Deal-DC77FE point-labeling, Deal-F97C37 "diversified offerings", Deal-242273 points-currency digitization + on-site spend), PEO/HRIS bundling (Deal-422BA6 ADP TotalSource, Deal-369281 Paylocity), incumbents (WorkTango, HiThrive, Awardco, Kudos, Motivosity), and non-price country fit (Deal-8A0992, Deal-9FCD0D Canadian provider). Making win/loss reason and vendor-name mandatory on Competitor closes, and enforcing tag accuracy on Lost DM, is the highest-leverage fix.
2. "MIA/no decision" is the biggest single bucket (31 deals, $297K) and it's mostly a premature-discipline problem, not a market problem. Nearly all are unresponsive-after-intro or "ignored N outreach" closes with only 2–3 contacts, and the biggest of them carry real dollars (Deal-0F96AA $76,800, Deal-7CB44D $31,860, Deal-F308CA $30,321, Deal-B4B50F $21,060). Compounding this, a further 21 timing losses ($265K) are explicit future-dated "come back in 2027/2028" — a revive pipeline being closed rather than managed. Two actions: (a) tighten cadence/multi-threading before MIA close (most had the same 3 contacts, 3 owners dominate), and (b) route "reconnect next year" deals into a scheduled-nurture queue instead of closed-lost. Note Deal-E0441F and Deal-9048EB show rep-departure handoff decay as a specific MIA sub-cause.
```json
{
"tier_counts": {"LOCK": 3, "ACTION": 12, "BUILD": 11, "REVIVE": 2, "WATCH": 116, "RISKY": 12},
"tier_examples": {
"LOCK": ["Deal-D348E1", "Deal-C26D20", "Deal-403845"],
"ACTION": ["Deal-C6FE92", "Deal-25F752", "Deal-944310"],
"BUILD": ["Deal-93C8BF", "Deal-1CCE5C", "Deal-4F775F"],
"REVIVE": ["Deal-2D1F1B", "Deal-F0EBBB"],
"WATCH": ["Deal-66D1FC", "Deal-950043", "Deal-D73B89"],
"RISKY": ["Deal-547B2B", "Deal-B7EBD1", "Deal-7BBDFA"]
},
"risky_deals": ["Deal-547B2B", "Deal-B7EBD1", "Deal-A2B47C", "Deal-2465CE", "Deal-584EE5", "Deal-0660B4", "Deal-FD9F4E", "Deal-BA571A", "Deal-7BBDFA", "Deal-4A13AD", "Deal-690476", "Deal-635B8E"],
"lock_violations": 0,
"pipeline_shape": "156 deals tiered (3+12+11+2+116+12=156). The pipeline is bottom-heavy: ~74% (116) sit in WATCH, mostly DS1-DS2 PIPELINE rows with zero meetings_30d, including four $60K+ unqualified whales (Deal-2D1F1B at $240K, Deal-66D1FC, Deal-EC3025, Deal-92D97D). Committed coverage is thin: only 3 LOCKs (all DS5, ~$36.3K combined = 13,770+13,500+9,000), while 12 RISKY deals (~$55.2K) carry COMMIT/BEST_CASE forecasts with zero 30-day meetings — notably Deal-547B2B ($11.2K, closes 2026-09-11, last meeting 2026-07-27) and Deal-7BBDFA ($37.4K, 45+ days stale). The 11 BUILDs are the live upside: PIPELINE-category deals with active meetings (e.g., Deal-93C8BF $36K/3 mtgs, Deal-1CCE5C $20.9K/3 mtgs). Deal-57FF13 has no row in engagements_by_deal_90d and a blank last_contacted_field, so it was treated as zero-engagement WATCH."
}
```
Method note: tiers applied in fixed priority — RISKY = COMMIT with 0 meetings_30d, or BEST_CASE with 0 meetings and last activity >14 days; LOCK = DS4/DS5 + COMMIT + ≥1 meeting + contact ≤14 days + ≥3 contacts; ACTION = mid/late-stage with forecast ≥BEST_CASE and ≥1 recent meeting; BUILD = PIPELINE-category with meetings and depth; REVIVE = >21 days silent on material/high-forecast deals. All 156 deal rows were joined to engagement data (155 matches; Deal-57FF13 missing) and tier counts sum exactly to the total.
```json
[
{
"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 manually with anniversary/birthday awards",
"Everything tracked in a spreadsheet, 'people slip through the cracks'"
],
"stakeholders": [
"Prospect (VP People)",
"Prospect (HR Admin)"
],
"budget_signal": "About $40k earmarked for engagement tools this fiscal year (stated by VP People)",
"timeline_signal": "Live before open enrollment in November (stated by VP People)",
"competitor_mentioned": "Achievers — 'looked at Achievers last year, but it was too heavy for a team our size' (raised by VP People)",
"next_step": "Security review with IT lead on September 12 (explicitly agreed by VP People)",
"objections": [
"Need SSO and audit logs for IT to sign off (raised by HR Admin)"
],
"confidence": "High — prospect-stated budget, prospect-stated deadline, competitor already evaluated, and a dated next step agreed by the prospect"
},
{
"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 over 30% in the hourly workforce"
],
"stakeholders": [
"Prospect (Head of Total Rewards)",
"Prospect (CFO)"
],
"budget_signal": "$25k pilot budget approved for this quarter (stated by CFO)",
"timeline_signal": "Decision by end of September (stated by CFO)",
"competitor_mentioned": null,
"next_step": "CFO to receive pilot agreement and route it to legal this week (explicitly agreed by CFO)",
"objections": [
"Integration with Workday 'has to be rock solid — that's my one condition' (CFO)"
],
"confidence": "High — approved budget, hard decision date, both economic and functional buyers present, pilot agreement accepted; note Head of Total Rewards said 'You're the first vendor we've had a real demo with' (no competitor named)"
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why_buys": [
"Make recognition visible across 12 retail locations",
"Give store managers budget autonomy for on-the-spot recognition (they 'have zero' today)"
],
"pain_points": [
"Recognition not visible across the 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 on our side until Q1' (stated by People Ops Manager)",
"competitor_mentioned": "Bucketlist — 'My CEO used Bucketlist at her last company and liked it' (raised by People Ops Manager)",
"next_step": "Call with the CEO to be scheduled; People Ops Manager to send two times (explicitly agreed)",
"objections": [
"No urgency until Q1",
"'The CEO has to be sold first — she decides anything people-related' (decision gate)"
],
"confidence": "Low-Medium — no prospect-stated budget, prospect-stated low urgency, and the decision-maker (CEO) is not in the room; positive signal is the agreed CEO call. CEO is named as the economic decision-maker but is not on the speaker list."
},
{
"transcript_id": "TX-004",
"deal_alias": "Deal-180D02",
"why_buys": [
"Consolidate three separate recognition tools into one",
"Get tools that integrate with the HRIS"
],
"pain_points": [
"Paying for three tools and 'none of them talk to our HRIS'"
],
"stakeholders": [
"Prospect (VP People)",
"Prospect (IT Security Lead)"
],
"budget_signal": "Authority threshold: 'If it's under $15k annually, I can approve it without going to the board' (stated by VP People); no committed spend amount stated",
"timeline_signal": "Procurement cycle runs 6–8 weeks minimum (stated by IT Security Lead); no prospect-stated go-live date",
"competitor_mentioned": null,
"next_step": null,
"objections": [
"Security review took three months for their last vendor — 'that's my hesitation' (IT Security Lead)",
"Long procurement cycle (6–8 weeks minimum)",
"VP People declined to commit to the CFO follow-up: 'Maybe — I need to check her calendar, no promises'"
],
"confidence": "Medium — clear pain and a stated self-approval threshold, but no committed budget figure, no agreed next step, and IT/procurement friction called out by the prospect"
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why_buys": [
"Automate service milestones",
"Analytics on recognition equity across departments"
],
"pain_points": [
"Night-shift teams 'feel invisible' — engagement scores run 20 points lower",
"Service milestones handled manually today (implied by the ask to automate them)"
],
"stakeholders": [
"Prospect (HR Director)",
"Prospect (People Ops Coordinator)"
],
"budget_signal": "$12k approved under their engagement line (stated by HR Director)",
"timeline_signal": "Running before the January all-hands (stated by HR Director)",
"competitor_mentioned": "Nectar — 'We're mid-pilot with Nectar right now, so you'd need to beat that experience' (raised by HR Director)",
"next_step": "Present directly to the exec team on October 2 (explicitly agreed by HR Director)",
"objections": [
"Exec team is 'skeptical after a failed rollout two years ago'",
"Must beat the in-flight Nectar pilot experience"
],
"confidence": "Medium-High — approved budget and dated exec next step, but an active incumbent pilot (Nectar) and a skeptical exec team are prospect-stated risks"
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why_buys": [
"Cut the admin time on service awards"
],
"pain_points": [
"HR Manager personally spends five hours a month ordering and shipping plaques"
],
"stakeholders": [
"Prospect (HR Manager)"
],
"budget_signal": null,
"timeline_signal": "Q1 start is realistic — fiscal year resets in February (stated by HR Manager)",
"competitor_mentioned": "No external vendor ('Nobody else'); prospect-stated alternative being compared: 'just doing it internally'",
"next_step": "HR Manager to receive the one-page overview and forward it to the COO this week (explicitly agreed)",
"objections": [
"'Budget isn't the issue — time is' — no budget validated, cost framing deflected",
"'Our COO usually prefers building things in-house'"
],
"confidence": "Medium — quantified personal pain and a realistic Q1 window, but no stated budget and the COO (not on the call) is a prospect-flagged build-in-house blocker"
}
]
```
Notes on extraction discipline:
- Deal-CFE7F4's $40k, Deal-70BB30's $25k, Deal-530B50's absence of budget, Deal-180D02's $15k approval threshold, Deal-F8767A's $12k, and Deal-EE195F's null budget are all taken only from prospect utterances; the rep's pricing statements (e.g., "$8 per employee per month" in Deal-530B50, "I can flex on pricing" in Deal-EE195F) were excluded per the rules.
- Deal-530B50's CEO and Deal-EE195F's COO are referenced by prospects but absent from the speaker list, so they are not listed as stakeholders.
**1. Deal-547B2B — $11,200** (Alex Franklin, DS5/COMMIT, CRM close 2026-09-11) - Why close: Slack 09-04 — redlines came back clean, signing page is out, their VP People said they're signing tomorrow. The only deal with a stated signature date. - What's left: counterparty signature. **2. Deal-403845 — $9,000** (DS5/COMMIT, CRM close 2026-09-11) - Why close: Slack — "moving fine," order form with their finance team, i.e. past legal, one step from signature. - What's left: finance sign-off, then signature. - Data caveat: CRM lists owner as Alex Franklin, but Dana Mercer says it's "on my side" in Slack — owner field needs reconciling. **3. Deal-B7EBD1 — $9,000** (Dana Mercer, DS5/COMMIT, CRM close 2026-09-10) - Why close: earliest close date in the file, DS5/COMMIT, and no adverse Slack signal. - What's left: unclear — no Slack evidence either way. Weakest of the three on evidence; Deal-A2B47C ($6,360, DS5/COMMIT, Slack-confirmed "still warm") is the alternative pick, but it's mid legal-review pace, not order-form stage. Top-3 amount: 11,200 + 9,000 + 9,000 = $29,200. Explicitly excluded: Deal-2465CE ($5,400, CRM COMMIT) — Slack shows the CRM is stale: champion left, procurement froze new vendors, Dana is pulling it out of commit to Q4. CRM-only analysis would wrongly rank it #2.
CANDIDATE-BY-CANDIDATE REVIEW (5 candidates: TG-001 to TG-005) TG-001 — Deal-EC3025 (amount: NOT PROVIDED in data) Prospect quote: "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." Classification: REAL GAP. The docs state "SCIM user provisioning and ADP Workforce Now integrations are NOT currently listed as supported capabilities." The capability does not exist at any tier, so this is not a plan gate. TG-002 — Deal-D0D6B5 (amount: NOT PROVIDED in data) Prospect quote: "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us." Classification: REAL GAP. Docs list HRIS support as Workday, BambooHR, Gusto, Rippling only, and explicitly note ADP Workforce Now is not a supported capability. Prospect, not the rep, raised it. TG-003 — Deal-CFE7F4 (amount: NOT PROVIDED in data) Prospect quote: "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. The custom report builder exists but is Enterprise-only per the tier table. The missing capability is packaging/access, not product. Not a product gap. TG-004 — Deal-84DBA6 (amount: NOT PROVIDED in data) Prospect quote: "We turned on the Slack integration in July, but half our managers still haven't given a single recognition — nobody ever trained them on it." Classification: ROLLOUT/ENABLEMENT ISSUE. Slack integration is supported on all plans per the docs; the failure is manager training, not product. Not a product gap. TG-005 — Deal-36C33F (amount: NOT PROVIDED in data) Prospect line: "Good to know. The web version should be fine for our office staff for now." Classification: EXCLUDED — no gap raised by the prospect. The mobile-app limitation was introduced by the rep (Alex Franklin: "we don't have a native mobile app for hourly workers yet"), and rep language does not count as prospect voice. The prospect explicitly accepted the web version. DATA MISSING: Deal amounts are not present anywhere in transcripts_gaps.csv or product_docs.md. Deals are identified by alias only; I am not inventing amounts. SUMMARY — TRUE PRODUCT GAPS RAISED BY PROSPECTS IN ACTIVE DEALS 1. Deal-EC3025 — SCIM user provisioning. Prospect security team will block approval without it. Confirmed unsupported at every tier per docs. 2. Deal-D0D6B5 — ADP Workforce Now integration. Prospect calls it a dealbreaker; docs confirm ADP is not among supported HRIS integrations. Arithmetic: 5 candidates reviewed; 2 real gaps + 1 plan gate + 1 rollout/enablement + 1 rep-originated exclusion = 5. (2+1+1+1=5 ✓)
STALE OPEN DEALS — no email, call, or meeting on/after 2026-08-29 (7 days before snapshot 2026-09-05). Recency = max(last_email, last_call, last_meeting) from engagements_by_deal_90d.csv. 65 of 156 open deals are stale. BRYCE HARMON (119337721) — 13 stale ``` Deal-2D1F1B DS1 PIPELINE 240,000 last 2026-06-16 81 days Deal-66D1FC DS1 PIPELINE 99,000 last 2026-08-20 16 days Deal-950043 DS1 PIPELINE 70,000 last 2026-08-17 19 days Deal-B23205 DS1 PIPELINE 45,000 last 2026-08-20 16 days Deal-7BBDFA DS3 BEST_CASE 37,440 last 2026-07-21 46 days Deal-332637 DS2 PIPELINE 36,000 last 2026-08-27 9 days Deal-1BEEBF DS1 PIPELINE 31,500 last 2026-08-17 19 days Deal-C5658B DS1 PIPELINE 23,400 last 2026-08-20 16 days Deal-40522D DS3 PIPELINE 21,000 last 2026-08-17 19 days Deal-F0EBBB DS3 PIPELINE 11,400 last 2026-08-12 24 days Deal-E25A09 DS1 PIPELINE 6,000 last 2026-08-27 9 days Deal-C9C286 DS2 PIPELINE 5,502 last 2026-08-27 9 days Deal-012CB1 DS1 PIPELINE 1 last 2026-08-13 23 days ``` Sum: 240,000+99,000+70,000+45,000+37,440+36,000+31,500+23,400+21,000+11,400+6,000+5,502+1 = 626,243 DANA MERCER (83155923) — 14 stale ``` Deal-44EA29 DS2 PIPELINE 60,000 last 2026-08-26 10 days Deal-E51FB7 DS2 PIPELINE 43,875 last 2026-08-24 12 days Deal-B42F46 DS1 PIPELINE 27,000 last 2026-08-17 19 days Deal-BA3DDC DS3 BEST_CASE 23,400 last 2026-08-21 15 days Deal-9DDE86 DS2 PIPELINE 20,000 last 2026-08-21 15 days Deal-215CCA DS3 BEST_CASE 18,900 last 2026-08-19 17 days Deal-5EED42 DS3 BEST_CASE 16,250 last 2026-08-25 11 days Deal-57887A DS2 PIPELINE 15,000 last 2026-08-28 8 days Deal-B7EBD1 DS5 COMMIT 9,000 last 2026-08-20 16 days Deal-3974EB DS4 BEST_CASE 9,000 last 2026-08-28 8 days Deal-F40F04 DS2 PIPELINE 8,100 last 2026-08-21 15 days Deal-87DDD1 DS1 PIPELINE 5,000 last 2026-08-17 19 days Deal-F336B6 DS3 BEST_CASE 4,200 last 2026-08-21 15 days Deal-0660B4 DS4 BEST_CASE 1,920 last 2026-08-20 16 days ``` Sum: 261,645 COLE INGRAM (83155924) — 18 stale ``` Deal-D04904 DS2 PIPELINE 58,529.25 last 2026-08-25 11 days Deal-B25F40 DS3 PIPELINE 40,000.00 last 2026-08-28 8 days Deal-813836 DS2 PIPELINE 32,175.00 last 2026-08-25 11 days Deal-1BA595 DS2 PIPELINE 31,750.00 last 2026-08-25 11 days Deal-CFE1E8 DS3 PIPELINE 18,000.00 last 2026-08-25 11 days Deal-CD47A6 DS2 PIPELINE 12,168.00 last 2026-08-25 11 days Deal-627646 DS3 PIPELINE 11,193.00 last 2026-08-25 11 days Deal-FF809F DS2 PIPELINE 7,781.20 last 2026-08-25 11 days Deal-AF932D DS2 PIPELINE 7,225.40 last 2026-08-25 11 days Deal-A71728 DS2 PIPELINE 6,947.50 last 2026-08-25 11 days Deal-8BC9F5 DS2 PIPELINE 5,616.00 last 2026-08-26 10 days Deal-175395 DS3 PIPELINE 4,779.88 last 2026-08-25 11 days Deal-481E24 DS3 PIPELINE 4,140.00 last 2026-08-26 10 days Deal-C7F9BF DS2 PIPELINE 3,360.00 last 2026-08-25 11 days Deal-2F3A66 DS3 PIPELINE 3,334.80 last 2026-08-25 11 days Deal-342E96 DS2 PIPELINE 2,700.00 last 2026-08-12 24 days Deal-E568D5 DS3 PIPELINE 1,875.00 last 2026-08-25 11 days Deal-FD9F4E DS5 COMMIT 1,330.00 last 2026-08-26 10 days ``` Sum: 252,905.03 ALEX FRANKLIN (84342457) — 19 stale ``` Deal-CC08D1 DS1 PIPELINE 24,000 last 2026-08-20 16 days Deal-E73427 DS3 PIPELINE 18,000 last 2026-08-26 10 days Deal-885F45 DS2 PIPELINE 9,300 last 2026-08-24 12 days Deal-C2FF3C DS1 PIPELINE 8,316 last 2026-08-26 10 days Deal-3EED2C DS2 PIPELINE 7,200 last none n/a* Deal-0D2F7A DS3 PIPELINE 5,100 last 2026-08-24 12 days Deal-6C60D4 DS3 PIPELINE 4,800 last 2026-08-24 12 days Deal-13FEBD DS2 PIPELINE 4,680 last 2026-08-24 12 days Deal-9D0060 DS3 BEST_CASE 3,840 last 2026-08-24 12 days Deal-690476 DS2 BEST_CASE 3,600 last 2026-08-18 18 days Deal-C6D97A DS4 BEST_CASE 3,240 last 2026-08-28 8 days Deal-EE195F DS3 BEST_CASE 3,120 last 2026-08-28 8 days Deal-278DEC DS3 PIPELINE 2,700 last 2026-08-28 8 days Deal-635B8E DS3 BEST_CASE 2,600 last 2026-08-18 18 days Deal-6883F3 DS1 PIPELINE 2,400 last 2026-08-20 16 days Deal-4A13AD DS3 BEST_CASE 2,160 last 2026-08-10 26 days Deal-F67D31 DS2 PIPELINE 1,800 last 2026-08-28 8 days Deal-5FDCE4 DS3 BEST_CASE 1,600 last 2026-08-24 12 days Deal-BA571A DS4 BEST_CASE 1,080 last 2026-08-18 18 days ``` Sum: 109,536 ELENA SINCLAIR (701163055) — 1 stale ``` Deal-57FF13 DS1 PIPELINE 2,100 last none n/a* ``` Sum: 2,100 * Deal-3EED2C and Deal-57FF13 have no row in engagements_by_deal_90d.csv at all — zero logged email/call/meeting, so they count as stale, but days-since-last-contact cannot be computed. Data missing. FARID OSMAN (716654662) — 0 stale (all 6 of his open deals have an engagement on/after 2026-08-29). Gavin Porter and Hugo Lindqvist own no open deals. PER-OWNER ROLLUP ``` Owner Stale deals Stale amount Alex Franklin 19 109,536.00 Cole Ingram 18 252,905.03 Dana Mercer 14 261,645.00 Bryce Harmon 13 626,243.00 Elena Sinclair 1 2,100.00 Farid Osman 0 0.00 TOTAL 65 1,252,429.03 ``` Check: 626,243 + 261,645 + 252,905.03 + 109,536 + 2,100 = 1,252,429.03 Two data-quality flags worth noting: (1) several engagements rows carry last_meeting dates after the 2026-09-05 snapshot (e.g. Deal-3795AD 2026-10-02, Deal-927338 2026-09-17) — treated as logged activity, so those deals were classified fresh; (2) last_contacted_field was ignored per instruction and does in fact diverge from the engagements table on multiple deals.
Last-30-day rep activity vs. DS2 entry — snapshot 2026-09-05, window 2026-08-06 through 2026-09-05 (t_ds2 >= 2026-08-06) Data caveat (no facts invented): 3 deals have no row in engagements_by_deal_90d.csv and contribute zero activity — Deal-3EED2C (Alex), Deal-627646 (Cole), Deal-57FF13 (Elena). Elena Sinclair's only deal is Deal-57FF13, so her activity totals are unmeasurable, not truly zero. PER REP (emails / calls / meetings summed over that rep's deals; mix = share of rep total) 1) Alex Franklin (84342457) — 67 open deals emails=307, calls=36, meetings=41, total=384 mix: 307/384=79.9% e | 36/384=9.4% c | 41/384=10.7% m DS2 entries in window: 18 (Deal-403845, Deal-1FC049, Deal-3EED2C, Deal-7FA0C3, Deal-E531A6, Deal-5296C9, Deal-36C33F, Deal-EE195F, Deal-F436DA, Deal-317E6F, Deal-D1E6C2, Deal-D9A72E, Deal-CA5E44, Deal-4F775F, Deal-898FC5, Deal-46988D, Deal-E73427, Deal-92D97D) activities per DS2: 384/18 = 21.33 2) Bryce Harmon (119337721) — 35 open deals emails=162, calls=0, meetings=43, total=205 mix: 162/205=79.0% e | 0/205=0.0% c | 43/205=21.0% m DS2 entries: 4 (Deal-25F752, Deal-D73B89, Deal-CA7DC0, Deal-1CCE5C) 205/4 = 51.25 3) Cole Ingram (83155924) — 22 open deals emails=92, calls=14, meetings=1, total=107 mix: 92/107=86.0% e | 14/107=13.1% c | 1/107=0.9% m DS2 entries: 2 (Deal-42326B, Deal-1BA595) 107/2 = 53.50 4) Dana Mercer (83155923) — 24 open deals emails=84, calls=18, meetings=11, total=113 mix: 84/113=74.3% e | 18/113=15.9% c | 11/113=9.7% m DS2 entries: 1 (Deal-57887A) 113/1 = 113.00 5) Farid Osman (716654662) — 7 open deals emails=38, calls=0, meetings=34, total=72 mix: 38/72=52.8% e | 0/72=0.0% c | 34/72=47.2% m DS2 entries: 1 (Deal-499BF6) 72/1 = 72.00 6) Elena Sinclair (701163055) — 1 open deal (Deal-57FF13) No engagement row exists; ratios undefined. Excluded from ranking. EFFICIENCY RANK (activities per DS2 entry, lowest = most efficient) 1. Alex Franklin — 21.33 2. Bryce Harmon — 51.25 3. Cole Ingram — 53.50 4. Farid Osman — 72.00 5. Dana Mercer — 113.00 Most efficient rep: Alex Franklin (21.33 activities per DS2 entry). Highest-volume rep: Alex Franklin (384 total activities). They do NOT differ — the same rep tops both. Note: Alex also has by far the most DS2 entries (18 of 26 team-wide), so his ratio benefits from a larger denominator; reps with 1–2 DS2 entries (Dana, Farid, Cole) have highly volatile ratios. No causal attribution implied.
QTD SCORECARD — Alex Franklin — as of 2026-09-05 (Q3 FY26: Jul 1–Sep 30; 67 of 92 days elapsed, 25 days left) 1) BOOKINGS vs QUOTA Quota: 200,000 (quota.csv, 2026-Q3) QTD bookings: 150,000 → Attainment: 150,000 / 200,000 = 75.0% Arithmetic: 40,000 + 20,000 + 35,000 + 21,000 + 12,000 + 11,000 + 6,500 + 4,500 = 150,000 Excluded per rule: Deal-B3E6F1 (CLOSED_WON 24,000, close 2026-06-20) — dated before Jul 1. Gap to quota: 200,000 − 150,000 = 50,000 Pace check: straight-line needs 150,000/67 = 2,239/day; he's at time pace or ahead (75.0% booked at 72.8% of quarter elapsed). 2) NEW vs EXPANSION (of QTD bookings) New: 40,000 + 35,000 + 21,000 + 11,000 + 6,500 = 113,500 (75.7%) — Deal-A1C3E5, Deal-B7D2F4, Deal-C9E1A6, Deal-D4B8C2, Deal-E6F3A9 Expansion: 20,000 + 12,000 + 4,500 = 36,500 (24.3%) — Deal-F2C7D8, Deal-A8B4D6, Deal-C5D9E2 Note: deal_type is populated only on closed-won rows; open/lost deals have it blank, so this split cannot be computed for pipeline. 3) ACTIVE PIPELINE BY STAGE (status=open, all close dates) DS1: 20 deals 284,621 DS2: 28 deals 353,760 DS3: 67 deals 552,705 DS4: 5 deals 23,574 DS5: 5 deals 45,730 Total: 125 deals 1,260,390 (coverage = 1,260,390 / 200,000 = 6.3x quota) In-quarter subset: only 21 open deals totaling 108,088 have close dates between Sep 6–Sep 30. One open deal already past-dated: Deal-7A2454 (DS3, 1,275, close 2026-09-04). 4) ROLLING 90-DAY DS2-TO-WON (entered_ds2 between 2026-06-07 and 2026-09-05) Deals entering DS2: 111 → won: 8 | lost: 27 | still open: 76 DS2-to-won rate (all entrants): 8 / 111 = 7.2% DS2-to-won rate (resolved only): 8 / (8 + 27) = 22.9% 5) WINS AND LOSSES (closed Jul 1 – Sep 5) Won: 8 deals, 150,000 (avg 18,750) Lost: 27 deals, 329,272 (avg 12,195) 329,272 = 7,200+8,000+7,200+4,300+8,400+25,200+15,600+24,000+11,520+7,200+19,600+3,600+25,000+21,000+14,931+5,760+2,340+24,000+8,400+2,340+11,700+40,001+3,360+4,320+6,300+10,800+7,200 Win rate: 8/(8+27) = 22.9% by count; 150,000/(150,000+329,272) = 31.3% by dollars Loss reasons (count, amount): Lost- Timing (1 year or more): 13 deals, 184,681 ← TOP REASON Competitor: 5 deals, 49,020 MIA: 5 deals, 45,831 Lost DM: 2 deals, 17,940 Feature Request: 1 deal, 21,000 Lost- Does not fit ICP: 1 deal, 10,800 6) ACTIVITY — LAST 30 DAYS (ae_engagements.csv across all 125 open + 27 lost + 9 won-history deals) Emails: 807 | Calls: 112 | Meetings: 128 | Notes: 50 | Total touches: 1,097 Per-deal averages: Closed-won deals (9): 11.0 emails, 3.7 calls, 2.8 mtgs each Lost deals (27): 4.0 emails, 0.9 calls, 0.5 mtgs each Open pipeline (125): 4.8 emails, 0.4 calls, 0.7 mtgs each DATA MISSING / LIMITS: no quota pacing target by week; deal_type blank on open/lost rows; no prior-quarter DS2 baseline to trend the conversion rate; engagement file gives no dates, only 30-day totals. COACHING OBSERVATIONS 1. Timing is the quota threat, not deal size. "Lost- Timing (1 year or more)" is 13 of 27 losses (48%) and 184,681 of 329,272 lost dollars (56%). Average lost deal is 12,195 vs 18,750 won — he's bleeding mid-size deals to "someday." These need date-driven close plans or displacement out of the commit-critical path before DS3. 2. The 90-day DS2 cohort converts at 7.2% (8 of 111 won) with 76 of 111 still unresolved — the funnel is wide and slow. To close the 50,000 gap in 25 days he needs 50,000/108,088 = 46% win rate on all in-quarter pipeline, roughly double his 22.9% resolved rate. The math says convert the late stages (DS5: 45,730 in 5 deals incl. Deal-547B2B at 11,200 and Deal-403845 at 9,000) rather than farm DS1/DS2. 3. Activity mix diverges from what actually wins. Overall ratio is 7.2 emails per call (807/112), but his 9 wins averaged 11 emails, 3.7 calls and 2.8 meetings per deal, while the 125 open deals sit at 4.8 emails, 0.43 calls, 0.72 meetings. The touch pattern that preceded every Q3 closed-won is largely absent from current pipeline — shift the next 25 days from email volume to call/meeting cadence on the ~26 deals in DS4/DS5 and near-dated DS3.
Flagged 11 of 14 deals. Two fields you asked for are not in the provided data: **amount** and **stage** — no file contains them, so they cannot be reported or inferred, and "most valuable persona given the stage" is therefore answered on generic deal-coverage logic (economic buyer first when absent; otherwise the missing persona that gates a late-stage close), not on actual stage. Also, no open/closed field was provided — all 14 deals are treated as open, per scope. Method / arithmetic - Reference date: today, 2026-09-06 (no as-of date given in the data). 60-day cutoff = 2026-07-08. Active = `is_former=false` AND `last_engaged_date >= 2026-07-08`. - Flag rule: active contacts < 3, OR all active contacts share one persona. - Checked sensitivity to a 2026-09-03 reference (latest date in file): no deal's flag status changes. MISSING DATA — deal_contacts.csv has no amount or stage column; unengaged_contacts.csv lists only 9 of 14 companies. --- **1. Deal-EC3025** (C-FDD0C7) — amount: not in data · stage: not in data - Active: 1 of 2 rows — CT-047C54 (champion, 2026-09-02); CT-F2C1AE (economic buyer, 2026-08-15) excluded as `is_former=true` - Present: champion · Missing: economic buyer, HR admin, IT security, finance - Add: economic buyer (single-threaded champion; CT-F2C1AE was the EB and departed) - Unengaged on file: CT-6827DB (Chief People Officer, economic buyer) **2. Deal-92D97D** (C-E23238) — amount/stage: not in data - Active: 1 of 2 — CT-01F5B4 (HR admin, 2026-08-28); CT-A902AE (champion, 2026-06-01 = 97 days ago, > 60) - Present: HR admin · Missing: economic buyer, champion, IT security, finance - Add: economic buyer - Unengaged on file: none on file **3. Deal-50D386** (C-EB10E4) — amount/stage: not in data - Active: 2 of 2 — CT-AA41B2 (champion, 2026-09-01), CT-B9C35B (HR admin, 2026-08-25) - Present: champion, HR admin · Missing: economic buyer, IT security, finance - Add: economic buyer - Unengaged on file: CT-A1C4B3 (Chief People Officer, economic buyer) **4. Deal-D0D6B5** (C-32918E) — amount/stage: not in data - Active: 3 of 3 (CT-87CED4 2026-09-02, CT-DE6D7C 2026-08-19, CT-FD70B2 2026-08-07) — but **all one persona: champion** → under-threaded - Missing: economic buyer, HR admin, IT security, finance - Add: economic buyer - Unengaged on file: CT-1FA4DB (Chief People Officer, economic buyer) **5. Deal-5BFE3B** (C-535D36) — amount/stage: not in data - Active: 2 of 2, both champion (CT-57123B 2026-08-31, CT-5CE757 2026-08-12) — <3 and single-persona - Present: champion · Missing: economic buyer, HR admin, IT security, finance - Add: economic buyer - Unengaged on file: none on file **6. Deal-36C33F** (C-077A0E) — amount/stage: not in data - Active: 1 of 3 — CT-4FE556 (IT security, 2026-08-15); CT-405B45 and CT-86B22F both `is_former=true` - Present: IT security · Missing: economic buyer, champion, HR admin, finance - Add: economic buyer — worst-threaded deal on file: the only active contact is IT security, no champion and no EB remain - Unengaged on file: CT-1DB73E (Chief People Officer, economic buyer) **7. Deal-885F45** (C-5E8EFB) — amount/stage: not in data - Active: 2 of 2 — CT-51C81E (economic buyer, 2026-08-26), CT-D9A0E8 (champion, 2026-08-11) - Present: economic buyer, champion · Missing: HR admin, IT security, finance - Add: with EB+champion already covered, the close-gating gap is IT security (then finance); stage unavailable to confirm - Unengaged on file: CT-B3F25D (IT Security Lead, IT security) — the only unengaged record that fits a missing persona **8. Deal-FCBE5B** (C-737030) — amount/stage: not in data - Active: 1 of 1 — CT-4A5317 (champion, 2026-08-29) - Present: champion · Missing: economic buyer, HR admin, IT security, finance - Add: economic buyer - Unengaged on file: none on file **9. Deal-5408B0** (C-2AE3AA) — amount/stage: not in data - Active: 2 of 2 — CT-D33AE4 (champion, 2026-09-01), CT-8742FD (HR admin, 2026-08-18) - Present: champion, HR admin · Missing: economic buyer, IT security, finance - Add: economic buyer - Unengaged on file: CT-07FA76 (Chief People Officer, economic buyer) **10. Deal-C6D97A** (C-5A8FC2) — amount/stage: not in data - Active: 3 of 3 (CT-223DDC 2026-08-31, CT-B03555 2026-08-20, CT-4E8A2B 2026-08-05) — **all champion** → under-threaded - Missing: economic buyer, HR admin, IT security, finance - Add: economic buyer - Unengaged on file: none on file **11. Deal-F9A08A** (C-0D15DF) — amount/stage: not in data - Active: 1 of 2 — CT-931B10 (champion, 2026-09-03); CT-913581 (economic buyer, 2026-06-20 = 78 days ago, > 60) - Present: champion · Missing: economic buyer, HR admin, IT security, finance - Add: economic buyer — re-engage CT-913581 first, it's a lapse not a gap - Unengaged on file: CT-697541 (Chief People Officer, economic buyer) --- Not flagged (3/14): **Deal-84DBA6** (3 active, personas: champion, economic buyer, IT security), **Deal-4B0BEB** (4 active, 4 personas), **Deal-D348E1** (5 active, all 5 personas). Recoverable-threading note: Deal-EC3025, Deal-50D386, Deal-D0D6B5, Deal-36C33F, Deal-5408B0 and Deal-F9A08A all have an on-file economic buyer to activate; Deal-92D97D, Deal-5BFE3B, Deal-FCBE5B and Deal-C6D97A have nothing on file and need net-new prospecting.
OPENING (FIRST 5 MINUTES)
- 8 of 10 calls (TT-001, TT-002, TT-003, TT-005, TT-006, TT-007, TT-008, TT-010) lead with the same customer-proof stat at minute 0:
"Quick one to kick off: a 400-person retailer we work with cut regretted turnover 18% in two quarters after automating milestone awards, and I wanted to walk you through exactly how they did it."
- TT-004 (Deal-403845) leads with an agenda frame:
"I put together a short agenda — security review first, then pricing."
- TT-009 (Deal-1E2498) leads with a pricing callback:
"You asked for straight pricing last time, so let's start there."
- Additional first-5-minute content: TT-005 includes a rep-introduced Workhuman comparison at minute 2.
TOP THREE OBJECTIONS AND HOW HE HANDLES THEM
Counts: budget lock 4 (TT-001, TT-003, TT-006, TT-010); revisit next quarter/open enrollment 3 (TT-002, TT-005, TT-008); spreadsheet status quo 3 (TT-004, TT-007, TT-009).
1. Budget locked until next fiscal year — reframes funding source to turnover savings, same line all 4 times:
"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 (open enrollment) — counters with a scoped 90-day pilot, identical all 3 times:
"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 doing recognition with spreadsheets/gift cards — answers automation + analytics, identical all 3 times:
"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
- Concrete next step agreed (working session confirmed with a date/time) in 7 of 10 calls: TT-001, TT-002, TT-003, TT-005, TT-006, TT-008, TT-009. Example (TT-001, Prospect, min 15):
"Yes, Thursday at 2pm works — send the invite and I'll bring our HRIS manager."
- No next step in 3 of 10: TT-004 ("Understood — I'll leave it with you."), TT-007 ("Fair enough."), TT-010 ("Understood, thanks for the candor.").
- Rate: 7 ÷ 10 = 70%.
COMPETITORS RAISED BY PROSPECTS
- Awardco (TT-003, Deal-547B2B, Prospect, min 4):
"We're also in late talks with Awardco — their rewards catalog looks bigger than yours."
- Kudos (TT-007, Deal-EDC141, Prospect, min 4):
"How are you different from Kudos? Our CEO used them at her last company."
- Workhuman was raised only by the rep (TT-005, min 2), not by a prospect, so it is excluded from this list.
COACHING NOTES
1. The three no-close calls (TT-004, TT-007, TT-010) all died at committee/urgency objections, where his response was pure concession ("I'll leave it with you", "Fair enough"). On calls where budget-locked was followed by a committee or no-urgency push (TT-010, TT-007), he has a proven pattern elsewhere — the 90-day pilot or any calendar-dated micro-step — and should always land one before ending; note his next-step ask ("Should we lock the next step — a working session with your team this week?") never even appears in those three calls.
2: The minute-0 proof story is verbatim identical across 8 calls, and so is every rebuttal line. It's consistent, but it reads as scripted — vary the stat to the account's context (e.g., he reused the retailer/backfill-savings framing even where the objection was timing, not budget) and stop opening TT-004-style security/pricing-agenda calls with a generic agenda that never gets followed on.
Q3 2026 FORECAST (quarter = 2026-07-01 to 2026-09-30; extract 2026-09-05) IN-QUARTER DEAL COUNTS - COMMIT: 7 deals - BEST_CASE: 24 deals - PIPELINE: 23 deals (weighted at 0% — informational only) COMMIT TOTAL (inside quarter) 11,200 (Deal-547B2B) + 9,000 (Deal-B7EBD1) + 9,000 (Deal-403845) + 6,360 (Deal-A2B47C) + 5,400 (Deal-2465CE) + 2,520 (Deal-A5E80A) + 1,249 (Deal-499BF6) = 44,729 BEST_CASE TOTAL (inside quarter) 38,935 + 24,000 + 19,656 + 16,250 + 11,116 + 10,800 + 10,500 + 9,890 + 9,720 + 9,000 + 7,200 + 3,840 + 3,780 + 3,600 + 3,240 + 3,150 + 3,120 + 3,060 + 2,916 + 2,760 + 2,484 + 2,100 + 1,920 + 528 = 203,565 WEIGHTED FORECAST = 1.00 × COMMIT + 0.35 × BEST_CASE = 44,729 + 0.35 × 203,565 = 44,729 + 71,247.75 = 115,976.75 EXCLUDED — CLOSE DATE OUTSIDE THE QUARTER (all dates after 2026-09-30) - Count: 32 deals, total 227,575 - COMMIT: 1 deal, 13,770 (Deal-D348E1, 2026-10-15) - 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) - PIPELINE: 22 deals, 185,565 - Check: 13,770 + 28,240 + 185,565 = 227,575 TOP 5 BEST_CASE DEALS (inside quarter, by amount) 1. Deal-2D7423 — 38,935 (2026-09-30, DS3) 2. Deal-25F752 — 24,000 (2026-09-25, DS4) 3. Deal-E53952 — 19,656 (2026-09-30, DS4) 4. Deal-5EED42 — 16,250 (2026-09-30, DS3) 5. Deal-FA32A0 — 11,116 (2026-09-25, DS3) Top 5 subtotal: 38,935 + 24,000 + 19,656 + 16,250 + 11,116 = 109,957 (54.0% of the in-quarter BEST_CASE pool: 109,957 / 203,565). ## Data quality Owner is blank on 85 of 86 rows and why_buys is empty (0 chars) on 71 rows, so forecast-category labels have almost no attribution or buying-rationale backing. Stage/category contradictions directly distort the math: Deal-A5E80A (DS1) and Deal-499BF6 (DS2) are marked COMMIT and are thus weighted at 100%, while Deal-C61CF7 sits at DS5 yet only BEST_CASE. Dates are unreliable: 17 of the 24 in-quarter BEST_CASE deals close exactly on 2026-09-30 (a 38,935 Deal-2D7423 alone is 19.1% of the BEST_CASE pool), and four still-open deals have close dates already past the 2026-09-05 extract (Deal-31AD2C, Deal-333EBB, Deal-57FF13, Deal-7A2454), so any unattended re-run would silently shift which quarter these land in.
Cohort: 220 companies (all signup months 2023-01 through 2023-07). Signals: m1_users >= 5 ("givers") and m1_redemptions >= 1 ("redemption"). Retained = current_status == 'active'.
FULL 2x2
```
Cell n Retained Rate (arithmetic)
Both signals 47 31 31/47 = 65.96% -> 66.0%
Givers-only 49 23 23/49 = 46.94% -> 46.9%
Redemption-only 29 9 9/29 = 31.03% -> 31.0%
Neither 95 38 38/95 = 40.00%
Total 220 101 101/220 = 45.91%
```
EXCLUSIONS
None. Every one of the 220 rows falls into exactly one cell (47+49+29+95 = 220) and every row has the two m1 fields needed. Note on treatment, not exclusion: the 3 'non_renewing' companies (C-0A96134F and C-0BEAF685 in redemption-only; C-0B2078FB in neither) are counted as NOT retained, per the stated definition that only current_status = 'active' means retained.
VERDICT ON THE HYPOTHESIS
Partially supported. Both-signals (66.0%) beats givers-only (+19.1 pts: 66.0 − 46.9) and beats neither (+26.0 pts: 66.0 − 40.0). But redemption-only (31.0%) is the WORST cell — 9.0 pts BELOW neither (40.0). The hypothesis's assumption that "one signal" cells would behave alike fails: a redemption without 5+ givers is a negative, not a half-positive. Both-vs-rest pooled comparison: 31/47 = 66.0% vs 70/173 = 40.5%, a +25.5 pt gap.
LARGEST SINGLE SIGNAL: unique givers (m1_users >= 5).
- Marginal lift: 5+ givers -> 54/96 = 56.2%; <5 givers -> 47/124 = 37.9%; lift = +18.3 pts.
- Redemption marginal lift: >=1 redemption -> 40/76 = 52.6%; 0 redemptions -> 61/144 = 42.4%; lift = +10.2 pts.
- Conditional check: adding givers to redemption-only companies moves 9/29 = 31.0% -> 31/47 = 66.0% (+35.0 pts), while adding redemptions to neither companies moves 38/95 = 40.0% -> 9/29 = 31.0% (−9.0 pts). Givers dominate on every cut.
WHAT THIS DOES AND DOES NOT PROVE
Proves: within this extract, the both-signals group has the highest observed 24-month retention (66.0%), and no single-signal group comes close to it. The pattern is consistent with the activation hypothesis for the givers leg.
Does not prove:
- Causality. m1_users, m1_gives and m1_redemptions are proxies for early engagement — a company that was already going to stick around is the one that shows up, recruits 5+ users, and redeems. The signal is partly a restatement of the outcome (selection/reverse causation).
- The "stacking" story. Redemption-only underperforming neither (31.0% vs 40.0%) means the two signals are not independent positive doses; a lone redemption in a <5-giver account is confounded with something else (the redemption data shows anomalies like C-F0A562FF with 0 users / 10 redemptions and C-0D78BCB2 with 1 user / 18 redemptions, suggesting definitional noise in the redemption field).
- It is not controlled: product_tier tracks status mechanically in this extract (every cancelled company has current_arr_usd = 0), and no adjustment was made for signup month, industry, country, or integrations. Cell sizes are small — 9/29 and 31/47 leave room for noise — and no significance test was requested or run beyond the raw rates above.
- The 25+ months-old premise was taken as given per your framing; signup months 2023-01..2023-07 are consistent with it but the extract contains no "as-of" date to independently verify.
All arithmetic below was computed directly from the two files. ## 1. Totals (as of 2026-09-05) | Source | Calculation | Total ARR | |---|---|---| | Billing (Chargebee) | Σ(mrr × 12) across all 39 subscriptions, incl. cancelled | **$617,897.76** | | CRM (HubSpot) | Σ hubspot_arr across all 39 company records | **$603,581.76** | | **Variance (Billing − CRM)** | 617,897.76 − 603,581.76 | **+$14,316.00** | ## 2. Bucket decomposition — sums exactly to +$14,316.00 | Bucket | Accounts | Amount (Billing − CRM) | |---|---|---| | Status mismatch | C-0C8323BF, C-0DC4FB8C | $0.00 (see note) | | Rounding | C-0D66DF9E (−16.00), C-14D70CE0 (−20.00) | −$36.00 | | Missing records | C-21629AA4 (+28,449.24), C-0D5BBE3A (−16,497.24) | +$11,952.00 | | Other | C-0F7269D7 | +$2,400.00 | | **Total** | | **+14,316.00** ✓ | Check: 11,952.00 + 2,400.00 − 36.00 + 0.00 = 14,316.00 ✓ Note on status mismatch: both cancelled subs reconcile to the penny (408.77×12 = 4,905.24 = CRM; 687.77×12 = 8,253.24 = CRM), so they contribute $0 to the variance — but they inflate **both** totals by a combined $13,158.48 of dead ARR that should be removed on both sides. ## 3. Mismatched accounts | Account | Sub | Billing ARR | CRM ARR | Diff | Issue | Suggested owner | |---|---|---|---|---|---|---| | C-21629AA4 | SUB-0004 | 1,436.77… → 28,449.24¹ | none | +28,449.24 | Sub with no CRM company record — create/merge | RevOps CRM data steward | | C-0D5BBE3A | none | none | 16,497.24 | −16,497.24 | CRM record with no subscription | Billing ops (Chargebee) | | C-0F7269D7 | SUB-0006 | 2233.00×12 = 26,796.00 | 24,396.00 | +2,400.00 | Exactly 200.00/mo gap — likely an amendment/downsize not reflected in one system | Account owner + deal desk | | C-0D66DF9E | SUB-0005 | 1932.00×12 = 23,184.00 | 23,200.00 | −16.00 | CRM rounded up | RevOps data hygiene | | C-14D70CE0 | SUB-0008 | 1515.00×12 = 18,180.00 | 18,200.00 | −20.00 | CRM rounded up | RevOps data hygiene | | C-0C8323BF | SUB-000E | 4,905.24 | 4,905.24 | 0.00 | Cancelled yet CRM still carries ARR | RevOps + account owner (churn true-up) | | C-0DC4FB8C | SUB-000F | 8,253.24 | 8,253.24 | 0.00 | Cancelled yet CRM still carries ARR | RevOps + account owner | ¹ 2,370.77 × 12 = 28,449.24. Owner names are not present in either file — suggested owners above are functional roles, not people from the data. ## 4. Business rule violations (term ≠ 12 months requires cf_agreement_end_date) Non-12-month subs: SUB-0002 (24), SUB-000C (24), SUB-0019 (36), SUB-001A (36). **Violations (2):** - SUB-0002 — C-1794A52C, 24-month term, cf_agreement_end_date blank - SUB-0019 — C-22170CA1, 36-month term, cf_agreement_end_date blank Compliant: SUB-000C (2027-11-30), SUB-001A (2027-11-30).
Core KVMs (unweighted mean across all 30 company-months; every company is tier_three, so plan_tier has no variance — comparison is simple-average July vs August): ``` KVM Jul Aug Abs Rel Dir Giving rate 0.6023 0.6027 +0.0004 +0.07% flat/up Redemptions per user 1.7300 1.7302 +0.0002 +0.01% flat 1:1 meetings engagement 0.4469 0.4472 +0.0003 +0.06% flat Pulse check engagement 0.6006 0.5086 -0.0920 -15.31% DOWN ``` Arithmetic: e.g. pulse July mean = sum of 30 July values / 30 = 18.0168/30 = 0.6006; August = 15.2580/30 = 0.5086; change = -0.0920; -0.0920/0.6006 = -15.31%. Giving, redemptions, and 1:1 are each within ±0.1% — effectively flat. Largest relative move: pulse check engagement, -15.31%. Driving segment: size_band = enterprise, unambiguously. Enterprise band pulse fell 0.5500 → 0.2743 (-50.1%) — all 10 enterprise companies dropped (e.g. C-0B2895EF 0.5619→0.2864; C-0D0B047C 0.5398→0.2619; C-0BA71F12 0.5588→0.2723). SMB (-0.2%: 0.6588→0.6573) and mid_market (+0.2%: 0.5930→0.5942) were flat, so non-enterprise explains none of the move. plan_tier cannot drive it since all rows are tier_three. Caveat: the data shows a uniform ~50% halving concentrated only in enterprise, with no other KVM moving — consistent with an instrumentation or survey-coverage artifact rather than behavior; the file itself does not say which.
REDEMPTION SECTION — Weekly Rewards Report (YTD through last completed month) Last completed month: **August 2026 (2026-08)** — the latest month in the data is 2026-08, with the final redemption dated 2026-08-31T11:53:00. All figures below cover redeemed_at from 2026-01-01 through 2026-08-31 (every row in the file falls in this window). Headline metrics - Redemption count: 378 - Total spend: $27,846.00 - Unique redeemers: 235 distinct user_key values - Redemptions per redeemer: 378 ÷ 235 = 1.61 Provider mix (% of spend) — shares sum to 100.00% | Provider | Count | Spend | % of spend | |------------|-------|-------------|------------| | custom | 37 | $10,873.00 | 39.05% | | Tremendous | 192 | $8,505.00 | 30.54% | | Snappy | 59 | $5,238.00 | 18.81% | | TangoCard | 90 | $3,230.00 | 11.60% | | Total | 378 | $27,846.00 | 100.00% | Arithmetic check: 10,873 + 8,505 + 5,238 + 3,230 = 27,846 ✓ Share check: 10,873/27,846 = 39.05%; 8,505/27,846 = 30.54%; 5,238/27,846 = 18.81%; 3,230/27,846 = 11.60%; sum = 100.00% ✓ Top 5 countries by redemptions | Rank | Country | Redemptions | Spend (context) | |------|---------|-------------|-----------------| | 1 | US | 244 | $18,547.00 | | 2 | CA | 24 | $2,286.00 | | 3 | AU | 21 | $1,606.00 | | 4 | GB | 17 | $944.00 | | 4 | NL | 17 | $1,122.00 | Note: GB and NL are tied at 17 redemptions each, sharing 4th place (next: SG with 12). US accounts for 244/378 = 64.6% of redemptions. August-only context: 48 redemptions, $3,536.00 spend.
**ELIGIBILITY SCREEN** (all three rules must hold; snapshot 2026-09-05, R3 cutoff = 2026-09-05 + 120 days = 2027-01-03) 8 of 30 accounts qualify (R1 health<60 ∧ R2 eligible amount>0 ∧ R3 renewal ≤ 2027-01-03): | Account | Health | Renewal (days out) | At stake (churn-save eligible $) | ARR | Play | Justifying signal | |---|---|---|---|---|---|---| | C-0F6C0F34 | 51 | 2026-10-03 (28d) | 49,707.00 | 86,741.00 | Executive touch | champion_active=false despite growing usage (308/395 = 78% seat utilization) — adoption is fine, the relationship gap is; largest stake, 28 days out | | C-0E9C27D1 | 39 | 2026-09-24 (19d) | 41,235.00 | 75,093.00 | Commercial concession | High utilization (134/157 = 85%), usage flat, champion true — usage isn't the problem; health 39 with renewal in 19 days points to commercials | | C-0B360C78 | 57 | 2026-10-28 (53d) | 35,748.00 | 60,427.00 | Commercial concession | Usage growing (246/327 = 75% utilized), champion active, yet health still 57 — the objection is not adoption or sponsorship | | C-0CEF69FD | 53 | 2026-11-21 (77d) | 32,621.00 | 79,324.00 | Executive touch | champion_active=false with growing usage (97/136 = 71%) — needs exec-level sponsorship rebuild | | C-0B827671 | 56 | 2026-11-14 (70d) | 25,365.00 | 72,088.00 | Usage revival | usage_trend_3m=declining with 113/202 = 56% utilization, health 56 | | C-0D3278C7 | 54 | 2026-11-12 (68d) | 17,602.00 | 33,815.00 | Usage revival | Declining trend + 126/380 = 33% utilization — heaviest under-adoption among qualifiers despite active champion | | C-0CA21961 | 58 | 2026-12-28 (114d) | 16,829.00 | 31,501.00 | Usage revival | Flat usage at 84/325 = 26% utilization — worst seat waste in the qualifier set | | C-0B0F1BAB | 38 | 2026-09-23 (18d) | 5,494.00 | 15,391.00 | Executive touch | champion_active=false, health 38 (worst in file), renewal in 18 days, usage flat at 238/363 = 66% — no owner to run any other play through; exec touch first | Note: the rules file documents eligibility (R1–R3) only — it contains no documented play-assignment logic, so plays above are inferred from the usage/utilization/champion signals shown. **Arithmetic — total at stake:** 49,707 + 41,235 + 35,748 + 32,621 + 25,365 + 17,602 + 16,829 + 5,494 = 49,707+41,235 = 90,942; +35,748 = 126,690; +32,621 = 159,311; +25,365 = 184,676; +17,602 = 202,278; +16,829 = 219,107; +5,494 = **$224,601.00 total churn-save eligible** (across $454,380.00 ARR). **At-risk-looking accounts that do NOT qualify:** Fails R3 (renewal beyond 120 days), everything else passes: - C-0F876796 — health 47, declining, eligible amount 19,958.00, but renewal 2027-02-06 = 154 days out - C-0BA71F12 — health 52, declining, eligible amount 6,824.00, but renewal 2027-04-11 = 218 days out Fails R2 (churn_save_eligible_amount = 0.00 — no save budget documented, health <60 otherwise): - C-0F6694C3 — health 43, declining, renewal 2027-03-21 - C-0FCCD2DF — health 43, flat, renewal 2027-04-23 - C-0BC71BDD — health 55, flat, renewal 2026-10-27 (in window, but $0 eligible) - C-0BE96399 — health 54, declining, renewal 2026-10-29 (in window, but $0 eligible) - C-10A56B0F — health 54, declining, renewal 2026-12-12 (in window, but $0 eligible) All remaining 15 accounts have health_score ≥ 60 and fail R1 (not at risk per the documented threshold).
SEAT COVERAGE - Licensed seats: 150 | Headcount: 400 → coverage = 150 / 400 = 37.5% of employees - Active users (Aug 2026): 126 → 126 / 150 = 84.0% of licensed seats in use; 24 seats unused vs. 274 employees without seats USAGE HEALTH (two lines) - Active users climbed every month: 88 → 95 → 102 → 110 → 118 → 126 (Mar–Aug), +38 users = 126 − 88 = +43.2% over 5 months, avg (126 − 88) / 5 = +7.6 users/month. - At +7.6 users/month, the 24 remaining seats (150 − 126) are consumed in ~24 / 7.6 ≈ 3.2 months — the account hits its seat cap around Dec 2026 on organic growth alone. HEADROOM AT CURRENT PER-SEAT RATE - Per-seat rate: $9,000 / 150 seats = $60/seat/year - Seat headroom to full headcount: 400 − 150 = 250 seats - ARR headroom: 250 × $60 = $15,000 (potential total: 400 × $60 = $24,000 = $15,000 + $9,000 current) WHO REPLIED / BUYING AUTHORITY - Maria S., People Operations Coordinator (replied 2026-09-02). She cannot buy: states explicitly "I'm not the right person for purchasing decisions... Budget and seat expansion sit with Dana R., our VP People." She offered an introduction. RIGHT BUYER - Dana R., VP People — named by Maria as holding budget and seat-expansion authority. Note: her last engagement was 2026-05-18, ~3.5 months cold. Maria reports Dana "has been asking about our usage numbers lately," so route through Maria's warm intro. REPLY EMAIL (~120 words) Subject: RE: Growing your team's recognition program Hi Maria, Great to hear the feed is busy — your monthly active users have grown from 88 in March to 126 in August, which is exactly the kind of trajectory Dana would want to see. Yes, an introduction to Dana would help a lot. Happy to keep it low-pressure: I can send a short summary of the usage numbers and what the next seat tier would look like, and you can forward whatever's useful. No need for a call until Dana wants one. Thanks for flagging this — and I appreciate you offering to make the connection. Best, Cole Data gaps: no per-seat rate contract detail beyond implied ARR/seats, no procurement or renewal-date fields — all figures above derive solely from the provided files.
CALL PREP — C-0D284E42 (signup 2026-08-11; data through 2026-09-04, day 25) COMPLETE (evidence field in parentheses) - Slack connected — integration_slack = 2026-08-12 (day 2 after signup) - Allowance set — allowance_set = 2026-08-13 (day 3) - Admins added — admins_added = 2 (count field; no target admin count in data to judge sufficiency) - First recognition given — first_recognition_at = 2026-08-15 14:22 (day 5) NOT COMPLETE (field present but empty — marked not-done, not "unknown") - HRIS integration — integration_hris is blank - First redemption — first_redemption_at is blank Data not in either file (do not assume): seat count/total users, which HRIS they run, redemption balance minimums, allowance amount. EARLY ENGAGEMENT SIGNALS (active_givers) - Start 3 (08-11) → 15 (09-03, 09-04): (15-3)/3 = +400% vs day 1 - Weekly averages: Wk1 (08-11..17) 4.29 → Wk2 7.57 → Wk3 10.71 → Wk4 (09-01..04, partial) 14.00 - Wk1 sum 30/7 = 4.29; Wk2 53/7 = 7.57; Wk3 75/7 = 10.71; Wk4 56/4 = 14.00 - Week-over-week: 4.29 → 7.57 = +76%; 7.57 → 10.71 = +41%; 10.71 → 14.00 = +31% — growth is positive but decelerating - Flat at 15 on the last two days (09-03, 09-04) — possible plateau, watch it - Weekend activity is real, not a dead zone: 08-22 (Sat) = 8, 08-23 (Sun) = 9 - 15 active givers is ~7.5x the 2 admins, so recognition is spreading beyond the admin team — strong signal THREE THINGS TO COVER ON THE CALL 1. Zero redemptions after 22 days of live allowance — first_redemption_at is blank while allowance_set = 2026-08-13 (09-04 minus 08-13 = 22 days). Recognition is working; redemption is not. Diagnose: catalog contents, points minimums vs. what early givers' recipients actually hold, and whether anyone knows redemptions exist. This is the #1 agenda item. 2. HRIS not connected — integration_hris blank. Ask which system they use and what's blocking it (IT/security approval, data mapping). Without it, allowance automation and user provisioning likely stay manual. 3. Convert the giver momentum before it plateaus — 3 → 15 active givers, but week-over-week growth is decelerating (+76% → +41% → +31%) and the last two days are flat at 15. On the call, name the top givers driving the 15 and agree on one activation motion (e.g., manager nominations for wave 2) for the next 2 weeks; confirm the 2 admins (admins_added = 2) are enough to run it. Tone note for the call: lead with the recognition growth (verified above), then the redemption gap — the 20+ day stretch of giving with no redeeming is the churn risk if balances feel stuck.
90-DAY RENEWAL RISK BRIEF — as of 2026-09-06 (window: 2026-09-06 → 2026-12-05) Data note: no legal company names exist in the inputs; accounts are cited by alias only. No health scores, contract start dates, or owner notes were provided — ratings derive solely from renewal dates, ARR, seats, and 12-month active-user history. 1) SYSTEM OF RECORD — ADJUDICATION Rule applied: for every account where the systems agree, use that date. For every multi-year account (is_multi_year=true), trust Chargebee — ChurnZero is a known-bad source on multi-year terms, and the data shows its signature: 3 accounts collapsed onto one stale date (2026-09-10) and 2 pushed out exactly 12 months. Chargebee is the billing system of record and carries term_months; all 15 single-year accounts match across systems to the day, which corroborates Chargebee as the reconciling source. ALL DISAGREEMENTS (5 of 20 accounts — all multi-year): Alias ChurnZero Chargebee Delta Date used C-0B7D2C30 2026-09-10 2026-09-15 5 days 2026-09-15 (CB; stale-CZ cluster) C-0BCDB8C2 2027-09-18 2026-09-18 +365 days 2026-09-18 (CB; year-shift bug) C-0D2AB865 2026-09-10 2026-09-22 12 days 2026-09-22 (CB; stale-CZ cluster) C-0BBE3E60 2027-09-26 2026-09-26 +365 days 2026-09-26 (CB; year-shift bug) C-0F5D2323 2026-09-10 2026-09-29 19 days 2026-09-29 (CB; stale-CZ cluster) Material impact of the adjudication: trusting ChurnZero on C-0BCDB8C2 and C-0BBE3E60 would wrongly drop $85,420 ARR (54,427 + 30,993) out of this 90-day window. 2) RENEWAL BOOK (sorted by date used) Rubric — HIGH: seat utilization <40% OR 3-mo usage decline >=10%. MEDIUM: utilization 40-70%. LOW: utilization >70% with flat/rising usage. Trend = Jun 2026 → Aug 2026 active users. C-0B7D2C30 | Dana Mercer | $65,901 | 2026-09-15 | util 57.6% (274/476) | -13.4% (97→84) | HIGH Usage fell 13.4% in 3 months and 45.8% over 12 (155→84) while paying for 476 seats. C-0BCDB8C2 | Cole Ingram | $54,427 | 2026-09-18 | util 54.7% (232/424) | -13.4% (127→110) | HIGH Steady month-over-month erosion of 45.0% over 12 months (200→110) with ChurnZero hiding this renewal in 2027. C-0D2AB865 | Elena Sinclair | $38,022 | 2026-09-22 | util 61.4% (250/407) | -12.8% (125→109) | HIGH Down 12.8% in 3 months and 45.2% over 12 (199→109) — structural disengagement, not noise. C-0BBE3E60 | Dana Mercer | $30,993 | 2026-09-26 | util 64.9% (74/114) | -15.4% (39→33) | HIGH Steepest trend in the book: -15.4% in 3 months, -47.6% over 12 (63→33), and CZ misdates it a year out. C-0F5D2323 | Cole Ingram | $90,647 | 2026-09-29 | util 28.5% (111/390) | -10.0% (20→18)* | HIGH Largest near-term renewal on a book where only 111 of 390 seats are used and ~18 people show up monthly (*flat within 17–21 band; the rating rides on utilization). C-0EC6999D | Elena Sinclair | $79,419 | 2026-10-03 | util 27.7% (31/112) | -11.8% (17→15)* | HIGH Worst utilization in the book — 31 of 112 seats provisioned, 15 active users, and flat 12 months (15→15) gives no adoption story to renew against (*within its 14–17 noise band). C-0B20DB64 | Dana Mercer | $21,770 | 2026-10-07 | util 56.6% (214/378) | 0.0% (294→294) | MEDIUM Fully stable usage (293–298 band all year) but 43% of licensed seats sit unprovisioned at renewal. C-0BBC4E7A | Cole Ingram | $56,374 | 2026-10-10 | util 67.7% (228/337) | -2.1% (142→139) | MEDIUM Flat, sticky usage (139–142 band) but soft utilization just under the 70% line. C-0FD551AB | Elena Sinclair | $48,815 | 2026-10-14 | util 55.9% (210/376) | +2.4% (123→126) | MEDIUM Modest growth (122→127 range) yet nearly half of 376 seats unused — right-sizing conversation ahead. C-0F9F8F13 | Dana Mercer | $46,230 | 2026-10-18 | util 56.5% (199/352) | -1.6% (185→182) | MEDIUM Rock-solid usage inside an 181–185 band, but 153 provisioned seats idle at the renewal table. C-0BC34584 | Cole Ingram | $16,740 | 2026-10-22 | util 66.2% (327/494) | +1.9% (104→106) | MEDIUM Growth is real but tiny in absolute terms: +2 users against 167 unprovisioned seats. C-0B7A7546 | Elena Sinclair | $35,062 | 2026-10-25 | util 88.8% (182/205) | -1.6% (64→63) | LOW Best utilization on the book (88.8%) with usage up 8.6% over 12 months (58→63). C-0B369871 | Dana Mercer | $85,128 | 2026-10-29 | util 75.1% (317/422) | +2.1% (326→333) | LOW Largest account in the book, growing steadily from 289 to 333 users (+15.2% y/y) at 75.1% seat use. C-0B144C78 | Cole Ingram | $30,899 | 2026-11-02 | util 75.4% (169/224) | +5.0% (101→106) | LOW Strongest 3-month growth in the book (+5.0%, 90→106 over the year) with healthy 75.4% seat use. C-0FC4DBB8 | Elena Sinclair | $94,732 | 2026-11-05 | util 76.7% (356/464) | +2.1% (189→193) | LOW Biggest ARR line renewing; 14.9% y/y user growth (168→193) and 76.7% utilization. C-0D5BBE3A | Dana Mercer | $39,740 | 2026-11-09 | util 83.3% (85/102) | +3.4% (88→91) | LOW 83.3% seat utilization and 19.7% y/y growth — expansion candidate, not a churn risk. C-0FB9D5AF | Cole Ingram | $63,158 | 2026-11-13 | util 72.4% (144/199) | +1.7% (173→176) | LOW Consistent 12-month climb (154→176, +14.3%) at 72.4% seat use. C-0B344485 | Elena Sinclair | $64,384 | 2026-11-16 | util 78.0% (224/287) | +2.5% (238→244) | LOW Monotonic growth all year (211→244, +15.6%) with 78.0% utilization. C-0CB2C1B4 | Dana Mercer | $40,628 | 2026-11-20 | util 81.6% (386/473) | +4.3% (47→49) | LOW 81.6% of seats provisioned; active users stable at 43–50 (+14.0% y/y). C-22170CA1 | Cole Ingram | $45,646 | 2026-11-24 | util 85.4% (251/294) | +2.1% (143→146) | LOW 85.4% utilization with 12.3% y/y user growth to close out the window. 3) TOTALS ARR renewing in 90 days (all 20 accounts, adjudicated dates): 65,901+54,427+38,022+30,993+90,647+79,419+21,770+56,374+48,815+46,230+16,740+35,062+85,128+30,899+94,732+39,740+63,158+64,384+40,628+45,646 = $1,048,715 HIGH risk (6): 65,901+54,427+38,022+30,993+90,647+79,419 = $359,409 (34.3% of renewing ARR) MEDIUM (5): 21,770+56,374+48,815+46,230+16,740 = $189,929 (18.1%) LOW (9): 1,048,715 − 359,409 − 189,929 = $499,377 (47.6%) ARR at risk (HIGH) = $359,409. If MEDIUM right-sizing exposure is included, $359,409 + $189,929 = $549,338 (52.4% of the quarter's renewing book). The September cluster alone — C-0B7D2C30, C-0BCDB8C2, C-0D2AB865, C-0BBE3E60, C-0F5D2323 = $279,990, all five misdated in ChurnZero — needs outreach this week.
**Q3 SUPPORT TICKET SYNTHESIS — 80 tickets (IC-460001–IC-460080), classified by body text; tags ignored and found unreliable (e.g., IC-460059 "HRIS provisioning" tagged `how-to`; IC-460016 points bug tagged `feedback`)**
RANKED BY ARR EXPOSURE (ARR = sum of distinct accounts' ARR, counted once per account; no account appears in two themes):
---
**1. HRIS provisioning failures — new hires not created**
- Count: 12/80 = 15.0% | Distinct accounts: 3 | ARR: 36,000 + 30,000 + 48,000 = **$114,000**
- Sample tickets: IC-460059 (C-0B2213A9), IC-460060 (C-0DDFC9A7)
- Recommendation: Sev-1 engineering fix on the HRIS sync (silent skip — "provisioning log shows no errors") plus a backfill/reconciliation, before these three enterprise accounts hit renewal.
**2. Redemption / gift-card fulfillment failures**
- Count: 18/80 = 22.5% | Distinct accounts: 7 | ARR: 8,900 + 10,700 + 9,600 + 8,700 + 11,000 + 9,600 + 10,300 = **$68,800**
- Sample tickets: IC-460025 (C-0CEF69FD), IC-460024 (C-0FCCD2DF)
- Recommendation: Fix checkout hang + gift-card email delivery, and auto-refund points when an order errors after deduction (IC-460024 pattern).
**3. Invoice/billing errors — seat counts and renewal tier pricing** ⚠ single-account
- Count: 16/80 = 20.0% | Distinct accounts: 1 (C-0E9C27D1, all 16) | ARR: **$52,000**
- Sample tickets: IC-460069, IC-460078 (both C-0E9C27D1)
- Recommendation: Assign a finance/CS owner to reissue the erroneous invoices and correct the renewal tier price — "third invoice in a row" (IC-460071) means the standard support loop has failed this account.
**4. Recognition points not posting / balance missing**
- Count: 20/80 = 25.0% (highest volume) | Distinct accounts: 9 | ARR: 3,500 + 4,500 + 4,500 + 2,700 + 3,400 + 4,200 + 2,900 + 2,500 + 2,900 = **$31,100**
- Sample tickets: IC-460004 (C-0D3278C7), IC-460016 (C-0BF20542)
- Recommendation: Audit the points-award pipeline (delivered-but-not-credited = write-path failure) and run a one-time balance reconciliation across affected accounts.
**5. Slack integration breakage — sync toggle, auth, slash commands**
- Count: 14/80 = 17.5% | Distinct accounts: 4 | ARR: 4,400 + 5,400 + 3,900 + 5,200 = **$18,900**
- Sample tickets: IC-460041 (C-0B843542), IC-460049 (C-10A56B0F)
- Recommendation: Fix OAuth token persistence ("re-auth does not stick") and the self-resetting sync toggle; add an integration health-check alert.
Totals: 20 + 18 + 16 + 14 + 12 = 80 tickets ✓ | $114,000 + 68,800 + 52,000 + 31,100 + 18,900 = **$284,800 ARR touched**, across 24 distinct accounts (9+7+1+4+3).
---
**Broad patterns vs. single-account noise:**
- Genuine fleet-wide issues: #2 redemption (7 accounts), #4 points (9 accounts), #1 HRIS (3 accounts but $114K — concentrated among the three biggest non-E9C accounts: 48K, 36K, 30K).
- Single-account escalation, not noise: #3 billing is 100% C-0E9C27D1 ($52K) — highest ARR-per-account; treat as an exec-sponsored remediation, not a product theme.
- Repeat-ticket inflation to watch: C-14264ABD filed the identical text 3x (IC-460038/460029/460034) inside #2; C-0E9C27D1's 16 tickets collapse to 2 underlying issues (seat count, tier price). By distinct account, #4 points posting (9 accts) is the second-broadest pattern after redemption (7 accts) — volume rank (#4 first) ≠ ARR rank (#1 first).
Prospect C-82AF3719: Technology | Mid-Market | employee_recognition | NA-West Method: only customers with has_case_study=true are eligible (8 of 25 qualify). Scored each on exact field matches across the 4 similarity dimensions. Top 3: 1. C-11C31562 — 3/4 match Fields driving match: size_band=Mid-Market, use_case=employee_recognition, region=NA-West Differs on: industry (Manufacturing vs Technology) 2. C-64171065 — 3/4 match Fields driving match: industry=Technology, size_band=Mid-Market, use_case=employee_recognition Differs on: region (NA-East vs NA-West) 3. C-A13C193D — 3/4 match Fields driving match: industry=Technology, size_band=Mid-Market, region=NA-West Differs on: use_case (retention vs employee_recognition) Tie-break note: all three score 3/4. Ranked by which field differs — same use case is the strongest social-proof signal (C-11C31562, C-64171065 above C-A13C193D), then same industry (C-64171065 above C-A13C193D). Near-miss for reference: C-CD4829A7 (Technology, Mid-Market; differs on use_case=retention and region=NA-East) scored 2/4 and ranks 4th. No billing data or contact names exist in the provided files; none included.
CHANNEL PERFORMANCE — TRAILING 6 MONTHS (2026-03 through 2026-08) Data: 4 paid channels in channel_spend.csv; 122 unique contacts in contacts_first_touch.csv, all SQM dates in window. Unpaid channels present: organic_search, referral. === PAID === paid_search - Spend: 6 × 6,000 = $36,000 - SQMs: 40 | SQOs: 18 - Cost/SQM: 36,000 / 40 = $900.00 - Cost/SQO: 36,000 / 18 = $2,000.00 - SQM→SQO: 18 / 40 = 45.0% - Pipeline: 18 × 40,000 = $720,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 = 32.0% - Pipeline: 8 × 12,000 = $96,000 - Pipeline/$: 96,000 / 24,000 = 4.00 - If the 2 anomalous rows below are excluded: 6 SQOs, $72,000 pipeline → cost/SQO $4,000, rate 6/25 = 24.0%, pipeline/$ 3.00 paid_social - Spend: 6 × 3,000 = $18,000 - SQMs: 0 | SQOs: 0 | Pipeline: $0 - Cost/SQM, cost/SQO, SQM→SQO rate: UNDEFINED (denominator is zero — spend with no recorded SQMs, not a 0% rate). Likely an attribution gap or a channel producing nothing; the data cannot distinguish which. 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 = 41.7% - Pipeline: 5 × 12,000 = $60,000 - Pipeline/$: 60,000 / 9,000 = 6.67 Paid totals: spend 36,000 + 24,000 + 18,000 + 9,000 = $87,000; pipeline $876,000; blended pipeline/$ = 876,000 / 87,000 = 10.07 (or 876,000 / 69,000 = 12.70 excluding paid_social's undefined rows). === ORGANIC (no spend recorded — cost metrics n/a) === organic_search - Volume: 30 SQMs | SQOs: 10 - SQO rate: 10 / 30 = 33.3% - Pipeline: 10 × 9,000 = $90,000 referral (also in the file, unpaid — reported separately since it is neither paid nor organic_search) - Volume: 15 SQMs | SQOs: 6 - SQO rate: 6 / 15 = 40.0% - Pipeline: 6 × 8,000 = $48,000 Organic combined (organic_search + referral): 45 SQMs, 16 SQOs (35.6%), $138,000 pipeline at $0 recorded spend. === DATE ANOMALIES (SQO precedes SQM) === - CT-000044 (linkedin_ads): SQM 2026-07-23, SQO 2026-07-18, $12,000 - CT-000041 (linkedin_ads): SQM 2026-06-14, SQO 2026-06-09, $12,000 Both are counted in linkedin_ads figures above; excluding them moves linkedin_ads from 4.00 to 3.00 pipeline/$ as shown. These $24,000 of pipeline may belong to a different (earlier) touch or reflect a data-entry error. === REALLOCATION RECOMMENDATION === 1. paid_social ($18,000): pause and investigate first. Zero SQMs against real spend means either broken first-touch tracking or a dead channel. If tracking checks out clean, move the $18,000 out entirely. 2. linkedin_ads ($24,000): worst efficiency of any measuring channel — $3,000/SQO and 4.00 pipeline/$ (3.00 if you honor the anomalies as suspect), plus both data-integrity failures live here. Cut roughly half ($8,000–$12,000) rather than killing it outright, since 8 SQOs is not noise. 3. Redeploy to paid_search and webinars: paid_search at 20.00 pipeline/$ is the clear leader; webinars at 6.67 pipeline/$ and the lowest cost/SQM ($750) is the value pick. A concrete move: +$15,000 to paid_search, +$5,000 to webinars, funded by paid_social pause and linkedin_ads trim. 4. Protect organic_search and referral — $138,000 pipeline with no spend line; whatever supports them (content, partner program) is free leverage and should not be cut. === CONFIDENCE === - paid_search: MODERATE. n=40 SQMs; 45.0% ±~15pp (95% normal-approx: sqrt(.45×.55/40)=7.9pp SE). But every SQO is exactly $40,000, so pipeline/$ rests on a uniform-deal assumption; one misattributed deal swings ~$40k (~1.1 pipeline/$ per $36k spent). - webinars: LOW-MODERATE. Best cost/SQM but only 12 SQMs / 5 SQOs; SE on the rate ≈ 14pp, and pipeline/$ is 5 deals deep. - linkedin_ads: LOW-MODERATE on efficiency (n=25, SE ≈ 9pp), but the 2 anomalous rows make its true standing somewhere between 3.00 and 4.00 pipeline/$. - paid_social: NO CONFIDENCE possible — undefined is the finding. Recommendation #1 is explicitly a measurement fix, not a verdict. - The 6-month window truncates lag: SQOs take 0–21 days here, so late-August SQMs (e.g., 18 of the 40 paid_search SQMs are Jun–Aug) may not have converted yet, biasing recent-month rates down. Rankings (paid_search > webinars > linkedin_ads) hold under all scenarios I can construct from this data; magnitudes do not.
# Battlecard: Rivally — updated 2026-09-06 ## One-line positioning Points-based recognition for mid-market, with engagement surveys as a paid add-on (S02, S04, S06, S23). ## Pricing - Current list: **$7 per user/month, Recognition Starter, annual billing required** — pricing page, 2026-08-12 (S17). - Supersedes prior list of $5/user/mo (pricing page 2026-01-20, S03; still $5 as of 2026-04-01, S08). Conflict resolution: newer source (S17) wins; list moved from $5 to $7 between April and August 2026. - Quoted-price datapoints (call notes, not public list): $6.50/user/mo to a 500-seat prospect, 2026-06-02 (S13); $7 list with 15% off for a 3-year term, 2026-08-14 (S18). - Rivally Pulse: priced as a paid add-on, not bundled (press, 2026-09-01, S23). ## Where they win (sourced) - Recognition feed engagement — praised by reviewers (S02, S16). - Fast setup, Slack works out of the box (S04). - EU posture: multi-language support praised by EU enterprise reviewer (S12); Dublin office and EU data residency GA (S15); pitched EU data residency in an active evaluation (S05); ex-Workday VP EMEA hired to lead European expansion (S11). - Support: response time under 4 hours (S22). - Microsoft Teams app v2 in public preview (S19). ## Where we win (sourced) - Analytics depth: decisive factor in a 2026-09-03 loss-for-them, 800-seat prospect picked Bonusly citing analytics depth (S25). - Reporting: their analytics called "limited" (S02); dashboards "basic compared to enterprise tools" (S07). - Admin/enterprise tooling: lacks SCIM, manual user management painful (S10); admin tooling lags peers (S16); no bulk recognition editing (S24). - Switching friction: migration off Rivally hard due to CSV-only analytics exports (S20) — use in lock-in rebuttal. - EMEA rewards catalog thinner than US (S14). ## Objections and responses - "Rivally is cheaper." Their public list is $7/user/mo as of 2026-08-12 (S17), up from $5 in January (S03); discount evidence is limited to one quoted deal at 15% off for 3 years (S18). Note: we have no data on our own price — do not claim a price advantage without one. - "Rivally has EU data residency / is built for EU." True and GA (S15, S12) — counter on their EU-side gaps: thin EMEA rewards catalog (S14), no SCIM (S10). - "Rivally covers surveys too." Pulse is a separate paid add-on, not bundled (S23). - "Rivally support is faster." Only one review supports this (S22); no counter-data available — say so rather than invent one. - "Setup risk if we switch away from them." Their CSV-only exports made migrations hard (S20) — flip this into our migration-support story. ## Recent changes - 2025-11-04: $40M Series C led by Northgate Ventures (S01). - 2026-03-05: Pulse engagement survey add-on launched (S06); exits beta as a paid add-on 2026-09-01 (S23). - 2026-05-09: ex-Workday VP EMEA hired for European expansion (S11). - 2026-07-01: Dublin office; EU data residency GA (S15). - 2026-08-12: list price raised $5 → $7 (S08 → S17). - 2026-08-20: Teams app v2 public preview (S19). ## 12-month win/loss record vs Rivally (from deals_with_competitor.csv; no snippet ids apply) Window 2025-09 through 2026-08 (all 20 deals in the file fall inside it). - Wins (13): Deal-A9FD43, Deal-7AA785, Deal-44C524, Deal-0D0CD6, Deal-D5B790, Deal-5C636E, Deal-67BE14, Deal-1B6969, Deal-F03E7B, Deal-072E31, Deal-F65C8F, Deal-E46EAB, Deal-1D2392. - Losses (7): Deal-7767F5, Deal-5645A5, Deal-C6FFAA, Deal-D263E0, Deal-935746, Deal-9066A6, Deal-72A02F. - Arithmetic: 20 total − 7 losses = 13 wins. Win rate = 13/20 = 65%. ## Excluded as non-factual (rep opinion, per instruction) - S09 (Bryce Harmon: UI "clunky" — not verified against the product). - S21 (Elena Sinclair: "discounting aggressively" — rep opinion, not confirmed). ## Old-card audit - "Points-based recognition for mid-market" — kept, re-sourced (S02, S04). - "Starts at $5/user/month" — superseded, see Pricing (S17). - "Rivally lacks a Slack integration" — REMOVED, contradicted: Slack integration worked out of the box (S04). - "Acquired by WorkHuman in 2025" — UNVERIFIED: no snippet supports it; S01/S11 reference a funding round and a hire, not an acquisition. Strike from the field. - "Strong in EU enterprise with multi-language support" — kept, re-sourced (S12, S15).
Rates below are per-email (replied/sent per step); sequence rollups use the step-1 cohort (replies/step-1 sent). NEW LOGO NURTURE — 1,386 sent, 490 opened, 90 replied, 27 meetings. Open 42.0/34.9/28.0%; reply 8.40/6.55/4.21%; mtg 2.40/1.97/1.40%. Cohort: reply 90/500=18.0%, mtg 27/500=5.4%. Weakest: step 3. EXPANSION NURTURE — 875 sent, 565 opened, 59 replied, 12 meetings. Open 43.3/[bad]/34.5%; reply 7.33/8.33/4.36%; mtg 1.67/1.33/1.09%. Cohort: reply 59/300=19.7%, mtg 12/300=4.0%. Weakest: step 3. COLD OUTBOUND – HR LEADERS — 1,785 sent, 545 opened, 8 replied, 0 meetings. Open 40.0/29.4/22.0%; reply 0.83/0.34/0.17%; mtg 0/0/0. Cohort reply 8/600=1.33%. Weakest: step 3. COLD OUTBOUND – PEOPLE OPS — 1,163 sent, 340 opened, 29 replied, 6 meetings. Open 37.5/28.5/21.2%; reply 3.50/2.33/1.59%; mtg 0.75/0.52/0.27%. Cohort: reply 29/400=7.25%, mtg 6/400=1.5%. Weakest: step 3. TRACKING ERRORS - Expansion Nurture step 2: opened 340 > sent 300 (113%). Inflated opens poison the denominator — reply/open reads 7.4% vs step 1's 16.9%. Excluding step 2, sequence open = 225/575 = 39.1%. - Sequences 2–3 have "sent" only 8–14% below step 1 despite nurture logic that should suppress openers/repliers — suggests sent is being re-stated as full list size, not actual recipients. Verify before trusting decay curves. AUDIENCE OVERLAP (963 membership rows, 940 unique keys) - HR Leaders ∩ People Ops: 21 contacts (e.g., CT-000849, CT-000884, CT-001105, CT-001255, CT-001345) — double-contacting the same people from two cold sequences. - Expansion ∩ New Logo: 2 contacts (CT-000301, CT-000624) — an expansion account in new-logo motion is a segmentation contradiction. FAILURE MODE <2% REPLY — HR Leaders only: opens are healthy (240/600=40%) but reply/open is 2.1% and meetings are literally 0/600. People read and dismiss — wrong offer or wrong HR title relevance, not a deliverability/subject-line problem. ONE CHANGE PER WEAK SEQUENCE - HR Leaders: stop and re-scope the offer/ICP (it's a message-person mismatch; no copy tweak on step 3 fixes 0 meetings). - People Ops: replace step 2–3 asks with a direct calendar link/low-friction CTA — reply/open is 9.3% but only 6/400=1.5% meetings; the ask, not the interest, is breaking. FIX FIRST: HR Leaders — 1,785 emails burned at 0 meetings vs People Ops' 6.
Pace basis: days_elapsed / days_in_quarter = 66 / 92 = 71.7% of Q3-2026 elapsed. 26 days remaining. A metric is "ahead" if QTD actual exceeds its even-pace expectation (target x 0.717). METRIC QTD ACTUAL TARGET DELTA EXPECTED@71.7% PACE SQMs 230 300 -70 215.2 AHEAD (230 > 215.2; 76.7% of target achieved) SQOs 84 120 -36 86.1 BEHIND (84 < 86.1; 70.0%) — marginal miss DS2s 40 75 -35 53.8 BEHIND (40 < 53.8; 53.3%) — significant closed_lost_mia 5 / closed_lost_total 25 = 5/25 = 20.0% target closed_lost_mia_rate <= 10% +10.0 pts over AHEAD OF TARGET IN THE BAD DIRECTION (rate 2x ceiling; lower_better, so "behind") same_quarter_closes 10 20 -10 14.3 BEHIND (10 < 14.3; 50.0%) active_pipeline 3,000,000 4,000,000 -1,000,000 2,869,565 AHEAD of even-pace line (3.0M > 2.87M; 75.0% of target) — note this is a stock (point-in-time) figure, so it only shows "ahead" if compared to a pro-rated end-of-quarter target; the real bar is 4.0M at quarter close. Rate-metric detail (closed_lost_mia_rate = 20.0% vs 10% ceiling): even if zero new MIA closed-losses land the rest of the quarter, you need closed_lost_total >= 50 (i.e., +25 non-MIA closed-losses) to dilute to 5/50 = 10%. At current closed_lost_total pace (25/66 = 0.38/day, projecting ~35 by quarter end), 5/35 = 14.3% — still above target. Hitting the ceiling on a volume basis: to land at 10% with projected total, allowed MIA = 0.10 x ~35 = ~3.5, i.e., you are ~1.5–2 MIA deals over. End-of-quarter projections at current run rates: - SQMs: 230/66 = 3.48/day x 92 = ~320 -> finishes above 300 - SQOs: 84/66 = 1.27/day x 92 = ~117 -> finishes just under 120; needs 36 in 26 days = 1.38/day - DS2s: 40/66 = 0.61/day x 92 = ~56 vs 75; needs 35 in 26 days = 1.35/day, 2.2x current rate - same_quarter_closes: 10/66 = 0.15/day x 92 = ~14 vs 20; needs 10 in 26 days - active_pipeline: needs +1,000,000 by 2026-09-30 What moved this week: the source files contain only QTD snapshots — there is no prior-week actual anywhere in marketing_qtd.csv, so literal week-over-week movement cannot be computed from the provided data and any "this week" delta would be invented. What the data does say about the quarter's shape: SQMs are carrying the funnel at 3.48/day and will overshoot 300 if held, but conversion is leaking downstream — SQOs are pace-negative on that volume (84 vs 86.1 expected), DS2s are the worst gap (40 vs 53.8 expected, requiring a 2.2x step-up), and only 10 of 20 same_quarter_closes are banked with 26 days left, meaning closes are aging out of Q3-2026. The clearest red flag is quality-of-close, not volume: 5 of 25 closed-losses are MIA, a 20.0% rate against a 10% ceiling, and the arithmetic shows it cannot be diluted to target at current closed-loss volume. Pipeline at 3.0M against a 4.0M bar is the cushion, but DS2 velocity has to roughly double from it.
Q3 weighted forecast is 115,976.75: 44,729 COMMIT plus 35% of 203,565 BEST_CASE, PIPELINE at zero. Caveat: all 7 in-quarter COMMIT deals have Why-buys blank, so the committed 44,729 has no documented reason to buy. Before publishing, re-verify commit and re-qualify the 32 deals (227,575) with October close dates.
Deal-0D2F7A — follow-up draft (from Alex Franklin): Subject: Re: July 28 demo recap + 150-seat pricing Hi [First name], At the July 28 demo, your team liked the automated milestone awards and the points catalog — the pieces that replace the manual birthday and anniversary tracking you mentioned on our discovery call. I sent pricing for 150 seats on August 5; I'd love to make sure it landed. Could we grab 15 minutes this week to walk through the quote together? If the timing isn't right, even a quick reply with a better date helps. Best, Alex Franklin Word count: greeting 2 + body 75 + sign-off 3 = 80 words (< 120). Note: the contact's name isn't in the provided data, hence the bracketed placeholder — the history identifies the champion only as "VP People." Everything else is drawn directly from ENG-00001–00003: the referenced prior touch is the July 28 demo (and the unanswered Aug 5 pricing email), and the single ask is a 15-minute walkthrough of the quote.
**Weekly GTM Digest — Week of 2026-08-31** **Marketing** Solid demand-gen energy from the marketing crew: 46 SQMs in the books against a target of 52 — a 6 short of goal (52 − 46), said straight so we can sprint at it next week. The webinar channel led the pack, delivering 18 of those 46 SQMs, which earns it plenty of recognition. Paid search stayed disciplined, with cost per SQM holding steady at $150. Steady efficiency, a strong webinar pull, and a clear gap to close — that's a week worth celebrating and building on. **Sales** The sales team kept the pipeline engine warm: 14 SQOs converted and 9 DS2 meetings set. The week's new pipeline created landed at $310,000, and the scoreboard also shows 3 same-quarter closes — wins that crossed the line fast enough to get their flowers immediately. Big applause for the hustle: conversion activity, meeting volume, pipeline dollars, and closes all tell a good story this week. **CS** Customer Success came through where it counts most: 2 renewals saved this week. When a customer chooses to stay, that's a recognition moment all by itself. Team NPS moved to 61, reflecting goodwill the team keeps compounding. And eyes wide open: 3 red-flag accounts remain open heading into next week — they're on the board, they've got attention, and they're first up on the win list for the week ahead. **PLG** Product-led love is spreading: 412 new signups walked through the door, and activation came in at 31 percent. The stat that makes this feel most like Bonusly? 38 companies reached the aha moment of 10 recognition gives. That's nearly 40 teams discovering what happens when people start celebrating each other out loud. The flywheel is spinning — feed it more wins, and more good karma. *(~300 words. All figures sourced directly from week_extracts.md; no external facts added.)*
PARTNER DIGEST — 2026-08-24 to 2026-09-04 PERIOD TOTAL: 5 partner-sourced deals, $550,000 Arithmetic: 180,000 + 95,000 + 140,000 + 60,000 + 75,000 = 550,000 ACTIVE PARTNERS Apex Rewards Co — 2 deals, $275,000 Deal-DDAAF2 $180,000 + Deal-2CF33E $95,000 = $275,000 Co-webinar locked for 09-15; Slack reports both opps at DS1. HRCloud Partners — 1 deal, $140,000 Deal-F1CDA5 $140,000 Integration referral closed security review; opp moved to DS2. CultureBridge — 2 deals, $135,000 Deal-096E1D $60,000 + Deal-067213 $75,000 = $135,000 Sourced via lunch-and-learn; both reported early stage. WorkWell Group — 0 deals, $0 No sourced deals this period; planning call booked 09-09, joint playbook restart targeted for Q4. QUIET PARTNERS Recogniq — quiet; no Slack activity or deals recorded this period. KudosWave — quiet; no Slack activity or deals recorded this period. PeopleFirst Advisors — quiet; no Slack activity or deals recorded this period. TotalPerk — quiet; no Slack activity or deals recorded this period. RECONCILIATION & DATA NOTES - All 5 rows in partner_deals.csv carry utm_source = Partner; none excluded. Partner totals (2/1/2/0 deals) match each partner's own Slack claims exactly. - Sum check: 275,000 + 140,000 + 135,000 + 0 = 550,000 ✓ - Stage data (DS1, DS2, early stage) comes from Slack only — partner_deals.csv has no stage column. - Deal amounts are the only dollar figures in the data; no win rates, dates-per-stage, or owner fields were provided. - For the four quiet partners, the roster supplies status only — no activity detail exists to report.
Q1 — Yes. All customer data is encrypted at rest using AES-256. [P1] Q2 — Yes. Data in transit is encrypted with TLS 1.2 or higher. [P1] Q3 — Yes. Bonusly maintains a SOC 2 Type II report, renewed annually. Available to prospects under NDA. [P2] Q4 — Customer data is retained for the duration of the contract plus 90 days, after which it is deleted from production systems. [P3] Q5 — Subprocessor list is published at trust.bonusly.com. Customers receive 30 days notice before a new subprocessor is added. [P4] Q6 — Yes. SAML 2.0 single sign-on is available on the Enterprise plan (SCIM user provisioning is included on the same plan). [P5] Q7 — Production databases are backed up daily. Backups are encrypted and retained for 35 days. [P6] Q8 — Unanswerable from the provided excerpts. No ISO 27001 certification is mentioned; [P2] covers SOC 2 Type II only. This would be answered by a certifications/compliance page on the trust portal or the security whitepaper — do not infer that absence of mention equals absence of certification. Q9 — Unanswerable from the provided excerpts. No uptime commitment or SLA percentage appears in any excerpt. This would be in the Master Services Agreement / Service Level Agreement (or the signed contract addendum), not the trust-portal policy excerpts. Q10 — Unanswerable from the provided excerpts. HIPAA and BAAs are not addressed. This would be covered by a HIPAA compliance statement or BAA addendum from the trust portal or the legal/terms documentation.
Reconciliation complete. 14 manifest rows, 14 skill files, all bodies read. Findings below; one proposal each. No rewrites made.
═══════════════════════════════════════════════════════
(1) ALWAYS-TRIGGER PHRASE OVERLAPS
═══════════════════════════════════════════════════════
F1 — [CRITICAL] [MERGE] comms-drafter ↔ email-drafter
Duplicated literal trigger phrases (quoted in both descriptions):
"write me an email," "draft a follow-up," "what should I say,"
"bump email," "contract nudge," pasted-message-feedback ("review this email" /
"a rewrite, or a rating"), plus identical coverage lists: "renewal and expansion
emails, QBR follow-ups, onboarding check-ins" vs "renewal or expansion emails,
QBR follow-ups, check-in emails, onboarding emails."
Corroboration in bodies: the same contract-follow-up tone benchmark paragraph
("Thanks for the update... Happy to make this easy on your end.") appears verbatim
in both. email-drafter's scope is a strict subset of comms-drafter except the
Gmail-signature retrieval block. Two ALWAYS-claiming writers on identical phrases
= nondeterministic routing. Proposal: merge email-drafter into comms-drafter,
preserving the signature-retrieval section and the no-markdown rule.
F2 — [CRITICAL] [REVIEW] pipeline-intelligence-report ↔ weekly-pipeline-report
Near-identical trigger pairs: "run the pipeline report" vs "generate the pipeline
report"; "pipeline update" vs "run the pipeline update"; "what's the pipeline look
like" vs "what does pipeline look like"; both claim "any variation." Both produce
SignalForge pipeline HTML from the same HubSpot+SNowflake sources, so neither body's
"No Slack / no Confluence vs 10-tab" distinction prevents trigger collision.
Proposal: redraw lane markers — weekly-pipeline-report scoped to its cadence +
target-vs-actual metrics vocabulary ("SQM/SQO/DS2 metrics, bookings MTD"), PIR
scoped to scored/tiered asks — and strip the colliding generic phrases.
F3 — [WARNING] [REVIEW] next-to-close ↔ pipeline-intelligence-report
Contradictory instructions embedded in descriptions, not just overlap:
next-to-close: "Do not use pipeline-intelligence-report for this... Delegate to
pipeline-intelligence-report if the user wants the full scored pipeline."
PIR: "Master pipeline scoring skill — never answer pipeline questions inline
without running it." "which deals are most likely to close" is simultaneously a
pipeline question (PIR claims all) and a shortlist ask (next-to-close).
Proposal: bound PIR's master clause to full-pipeline requests; keep next-to-close.
F4 — [WARNING] [TRIM_DESC] Three-way close-likelihood overlap
"which deals are most likely to close" (next-to-close) ≈ "asks which deals are
likely to close" (deal-strategy-coach) ≈ "what do we think we're going to close"
(sales-forecast). Three skills claim the same ask at three different scopes
(deal list / rep coaching / quarter number).
Proposal: trim the phrase from deal-strategy-coach and sales-forecast descriptions.
F5 — [WARNING] [UPDATE_BODY] Stacked unconditional gates
Four skills claim "ALWAYS… every" over the same events: model-selection ("start of
every task, without exception"), analysis-validator ("after every SignalForge
quantitative analysis… Never skip"), signalforge-claim-compressor ("ALWAYS trigger
for: SignalForge reports, intelligence reports, pipeline updates"),
signalforge-feedback ("absolute final step after any… output"). The validator and
feedback bodies declare the intended order (pull → analysis → validator →
compressor → feedback → publish), but the descriptions read as input triggers, so
"pipeline update" matches both the workers (F2) and the compressor.
Proposal: add an explicit ordering/precedence block to each of the four descriptions.
═══════════════════════════════════════════════════════
(2) CIRCULAR DELEGATION
═══════════════════════════════════════════════════════
F6 — [WARNING] [REVIEW] Cycle named: deal-strategy-coach → email-drafter →
deal-strategy-coach
Edge 1: deal-strategy-coach, "Manager-to-prospect email frameworks": "use the
`email-drafter` skill which automatically retrieves your Gmail signature."
Edge 2: email-drafter description + lane marker: "For deal strategy, diagnosis, or
coaching (not email drafting), use deal-strategy-coach instead."
A request that is both (coach's own trigger: "draft a manager email"; stalled-deal
email) satisfies one skill's inbound delegation and the other's outbound redirect
— ping-pong risk. comms-drafter's marker ("this skill drafts, that skill diagnoses")
shows the intended non-cycle direction. Proposal: break the loop by making
deal-strategy-coach's email step a pure handoff (or fold into the F1 merge).
No other cycles found; the F3 pair is a steer conflict, not a closed loop.
═══════════════════════════════════════════════════════
(3) DANGLING DELEGATION TARGETS (no file, no manifest row)
═══════════════════════════════════════════════════════
F7 — [CRITICAL] [REVIEW] analysis-validator §12.4 delegates to eight skills, none
present in the manifest or file set: `bonusly-data-questions`,
`bonusly-product-questions`, `bonusly-business-reporting-questions`,
`bonusly-rewards-questions`, `bonusly-ppp-questions`, `bonusly-feature-flag-questions`,
`bonusly-deal-desk-questions`, `bonusly-datadog-questions`. §12.4 mandates delegation
("always delegate to specialist skill"), and G1-J sources the canonical CTE from
`bonusly-data-questions` — the mandatory validator can fail or improvise at these steps.
F8 — [CRITICAL] [REVIEW] `prospect-research-multithreading` — invoked by three skills:
deal-strategy-coach (entire "Cross-skill handoff" section, "always offer the handoff"),
email-drafter ("invoke prospect-research-multithreading in Contact Lookup mode first"),
comms-drafter (same). Not in manifest.
F9 — [WARNING] [REVIEW] `skill-orchestrator` — referenced in analysis-validator §11
cascading-files check and signalforge-feedback Activation Checklist ("Skill registered
in skill-orchestrator as a terminal step"). Not in manifest.
F10 — [INFO] [REVIEW] `bonusly-brand` (comms-drafter Step 0, email-drafter,
sales-forecast Step 3, signalforge-claim-compressor) and `caveman`
(signalforge-claim-compressor comparison table). Plausibly organization-published
skills living outside this manifest — same unresolved category as F7–F8. Proposal:
confirm existence against the org library; otherwise verify and remove the references.
═══════════════════════════════════════════════════════
(4) VERSION CONFLICTS
═══════════════════════════════════════════════════════
F11 — [WARNING] [UPDATE_BODY] analysis-validator: header/footer "Version: 3.6" vs
validation-trail template line "Validator: analysis-validator v3.2" (§7) — every
published trail would self-report the superseded version. Survivor: v3.6 (changelog
top entry, and pipeline-intelligence-report's footer hardcodes "Analysis Validator
v3.6"). Action: correct the trail template.
F12 — [WARNING] [UPDATE_BODY] sales-forecast: changelog v1.1 (April 27, 2026) states
"Quarter-agnostic (Q2 → current quarter throughout)", but body retains v1.0 state:
"STEP 1A — HubSpot: Open Q2 Deals", Tab 6 "Q2 Narrative", and business-day math
pinned to Q2 elsewhere. Survivor: v1.1; action: purge residual Q2 hardcoding.
F13 — [INFO] [REVIEW] pipeline-intelligence-report: front matter "v6 · May 2026" vs
body heading "## v4 Component Vocabulary" — ambiguous whether skill or design-system
version; plus v6 uses a `version:` front-matter key no other skill uses.
F14 — [INFO] [UPDATE_BODY] pipeline-intelligence-report footer template hardcodes
"Analysis Validator v3.6" — a cross-skill version pin that will silently rot (see
also F23 below for the sales-forecast "current date" example).
═══════════════════════════════════════════════════════
(5) DESCRIPTIONS EXCEEDING 1,024 CHARACTERS
═══════════════════════════════════════════════════════
F15 — [INFO] Count = 0.
Declared set: {656, 897, 996, 792, 965, 676, 945, 1004, 1006, 962, 1006, 708, 762, 656};
N = 14 rows; max = 1,006. 1,006 < 1,024 → zero exceed. I also recomputed each
description length from the folded YAML bodies: 13/14 match the declared value
exactly; deal-strategy-coach computes 793 vs declared 792 (±1, apostrophe-escape
ambiguity — flag, not drift). None computed > 1,024 either.
F16 — [INFO] [TRIM_DESC] Headroom risk: four rows within 28 chars of the cap —
signalforge-claim-compressor 1,006, pipeline-intelligence-report 1,006,
partner-digest 1,004, comms-drafter 996 (cap − 1,006 = 18 chars worst case).
Any added trigger phrase trips them; trim proactively.
═══════════════════════════════════════════════════════
(6) HARDCODED PAGE IDS / DATES / PERSON NAMES IN BODIES
═══════════════════════════════════════════════════════
F17 — [CRITICAL] [UPDATE_BODY] pipeline-intelligence-report "AE owner IDs (verified
May 2026)": Bryce Harmon 119337721, Dana Mercer 83155923, Cole Ingram 83155924,
Alex Franklin 84342457, Gavin Porter 1520255671 — 5 AEs hardcoded in a skill whose
own Non-Negotiable #1 is "No hardcoded deal counts, ARR figures, or tier totals —
ever," and contradicted by stale-pipeline-report's "Never hardcode rep names or
owner IDs. The AE roster changes." Worse: analysis-validator §12.3 declares "Core 6
AEs… must include all six IDs" including Hugo Lindqvist 77260721 — a cross-skill
roster conflict (5 vs 6). Proposal: resolve against `HubSpot:search_owners` live.
F18 — [WARNING] [REVIEW] analysis-validator: §12.3 GTM roster — 19 named people with
HubSpot owner IDs ("Updated May 4, 2026"); "Manish or Amani" (G1-K and §10); dates
"April 26, 2026", "May 9, 2026", "May 4, 2026", "March 28, 2023", "as of May 2026";
example IDs 83155923/"Dana Mercer", 1520255671/"Gavin Porter". Section 8 explicitly
renounces hardcoded anchors ("Do not use hardcoded figures") while §12 is a frozen
snapshot — roster will silently decay.
F19 — [WARNING] [REVIEW] partner-digest: Confluence folder ID 2286616609, Space ID
1958248479, Cloud ID 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f, page URLs 2265382925,
2236940297, 2237825028, 2239365136, 2238283777, 2286321666; Slack user
`from:<@U03QLMBL7AR>` ("Amani's threads"); person names "Amani Phipps (RevOps /
Partnerships)", Kelli, Jen Lee, Hani, Bryce, Sara; dates "May 19, 2026", "June 2,
2026", "May 16, 2026", "Q2/Q3 2026"; fixed partner roster ("update this list"
acknowledged).
F20 — [WARNING] [UPDATE_BODY] weekly-pipeline-report: person identity "Ben Lavin ·
Demand Generation" (title) and "presented in chat for Ben's review"; spreadsheet IDs
1CLZeOsElVDF_LF0ZG_t2nfwvhnZ6bpwqM_nX3WEYzcw and 1ENuaEcCuLjdKhMvp8FK3Ys1ek5Aw9ZuOZhsHJJFoB_k;
Q2 pinning "Q2 (April 1 – June 30, 2026; total ≈ 64–65)"; frozen financials
"Q1 2026 context (static): … $365,152 vs. $475,000 plan (77%) … $2,490,532 vs.
$3,288,000 forecast (76%)" — stale by definition each year.
F21 — [WARNING] [UPDATE_BODY] stale-pipeline-report: Slack channel #revops-team +
ID C0561C1JCPJ; "Don't query all 97 deals serially" — a hardcoded deal count inside
the skill whose Phase 7 mandates live counts; "Alaina"; dates "on 5/15", "from 5/19";
owner IDs 55483190, 1973303 (org id), stage IDs.
F22 — [WARNING] [REVIEW] deal-strategy-coach: Confluence page id 2257879045
("AE+Excellence+Playbook+April+2026"); full "Pricing — 2026" table (proposal/floor
by tier) and 30-sec pricing constants; person names "Farid" (.edu routing) and
"Perseus" (India routing); stats "200+ Gong calls and 370+ resolved deals",
"employees average 5 recognitions/month", "5.6:1"; "last 6 months" comps rule anchored
to today — acceptable, but the whole "Hardcoded reference data" block is a decay risk
itself (org ID 1973303 also appears in next-to-close and pipeline-intelligence-report
deal URL patterns — INFO, marked "verify at run time").
F23 — [WARNING] [UPDATE_BODY] sales-forecast: Space ID 2232811524, Cloud ID
73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f, Parent page ID 2232582148, space key
"SignalForg"; "Alaina / VP Sales view"; "e.g. Q3 2026 Forecast Intelligence — July 9,
2026"; changelog date "April 27, 2026".
F24 — [INFO] [REVIEW] signalforge-feedback: Page ID 2295136266, parent 2234417154,
Build Log "ID: 2247295002", Space 2232811524, Cloud ID 73fe98de-…, "Gavin Porter Rep
Diagnostic", "Q2 Pipeline Review", "May 16"-style references via claim-compressor.
F25 — [WARNING] [UPDATE_BODY] closed-lost-analysis: named-account/date loss examples
("Softheon", "Estee Lauder: 7+ day delay", "LIFTOFF, Nestlé", "Ozinga", "MinIO: rep
vacation May 4–12", "Aurora Innovation", "GCash", "Ethos Cannabis", "StickerYou",
"demo on 4/13"), frozen stats "In the 30-deal AI-field sample from May 2026: 10 of 10",
"17% of losses", "8% stated budget; 14%+", "field confirmed May 2026" — presented as
permanent taxonomy despite the skill's own "Known System State (dynamic)" section.
F26 — [WARNING] [REVIEW] model-selection: `last_checked: 2026-05-19` with its own rule
"more than 14 days past last_checked → run self-update before any recommendation."
Today is 2026-09-06: 2026-05-19 → +12 (rest of May) +30 +31 +31 +6 = 110 days — the
registry is 96 days past its own freshness limit; pricing/model IDs are stale until
re-checked.
F27 — [INFO] [REVIEW] signalforge-claim-compressor: illustrative entities "Felix
Construction", "$15K TCV", "Panopto", "Schneider Downs", "AI co-worker", date
"2026-05-09" — examples, low risk, listed for completeness.
═══════════════════════════════════════════════════════
(7) MANIFEST DRIFT — BOTH DIRECTIONS
═══════════════════════════════════════════════════════
F28 — [INFO] Rows with no file: 0. Files with no manifest row: 0.
14 manifest rows vs 14 presented .SKILL.md files; declared_name matches filename in
all 14 cases; set difference in both directions = empty. description_chars
reproduces (F15, one ±1 ambiguity). Caveat: body_lines (1429, 543, 276, 590, 258,
254, 106, 386, 536, 259, 203, 197, 295, 194; sum = 5,736) were not independently
re-counted from the presented text — unverified, not flagged.
F29 — [WARNING] [REVIEW] Referenced support files with no manifest rows (drift in
the "file exists only inside a body" sense): sales-forecast declares five
(`references/data-sources.md`, `references/report-structure.md`, `references/cadence.md`,
`references/report-template.html`, `references/TEMPLATE_README.md`);
weekly-pipeline-report declares two (`references/report-spec.md`, `references/queries.md`);
pipeline-intelligence-report declares `/mnt/skills/organization/signalforge-reports/SKILL.md`,
`DESIGN-SYSTEM.md`, `signalforge.css`, `reports.html`, `brand-lockup.html` and notes
`references/html-spec.md` as "deprecated as of May 2026" (a path implying it may still
carry a row elsewhere). None are presented or rowed — mandatory reads ("MANDATORY
PRE-BUILD STEPS", "Read these before executing") cannot be verified against the
manifest. Proposal: add manifest rows for every existing referenced file and delete
references to files that no longer exist (html-spec.md first).
═══════════════════════════════════════════════════════
TALLY — 29 findings: CRITICAL 5 (F1, F2, F7, F8, F17) · WARNING 16 · INFO 8.
Actions: MERGE 1 · UPDATE_BODY 9 · REVIEW 15 · TRIM_DESC 2 (counting F16's combined
trim; F15/F28 are no-action reports) · DELETE_SKILL 0 — no finding justifies outright
deletion; email-drafter is the merge candidate, not a delete.
Missing-data disclosures: actual reference files and the org skill library
(/mnt/skills/organization/) were not provided, so F7–F10 and F29 are "cannot confirm
existence," not confirmed-absent; body_lines unverified (F28).
RUNBOOK — reward-worker queue saturation (derived from #incident-2026-08-29-reward-queue, resolved in 52m50s: M01 14:02:10Z → M10 14:55:00Z) STEP 1 — Acknowledge alert, name IC Action: PagerDuty alert fired for reward-worker queue depth > 10k; acknowledged and took IC. Who: Bryce Harmon [M01, 14:02:10Z] Verify: n/a (read-only/organizational) Rollback: n/a — no state change STEP 2 — Measure queue depth (baseline diagnostic) Action/command: `bundle exec rake sidekiq:queue_depth` Who: Farid Osman [M02, 14:04:33Z] Finding: 48,213 pending vs normal under 500 Verify: n/a — this command is the verify step for 7 and 8 Rollback: n/a — read-only STEP 3 — Inspect dead set Action: Checked dead set: 112 jobs, all Redis::TimeoutError from around 13:58. Who: Farid Osman [M03, 14:06:02Z] NEEDS CONFIRMATION: thread does not record the command/tool used to inspect the dead set. Rollback: n/a — presumed read-only; if any command mutated state, it is not documented STEP 4 — Pause enqueue (state change) Action/command: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` Who: Farid Osman [M04, 14:08:45Z] Rollback (given in thread): `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` — actually executed as rollback/restore at M09 Verify: not stated as an explicit check. Indirect evidence it took effect: enqueue window stayed open only while flag off (14:08:45Z–14:49:10Z = 40m25s) and depth fell (STEP 7). NEEDS CONFIRMATION: no command shown to verify flag state; no command shown to verify flag disablement itself. NEEDS CONFIRMATION: thread never says whether auto-recognition events received during the pause were backfilled or lost. STEP 5 — Clear the dead set (state change; under-documented) Action: Elena Sinclair, in the console, "cleared out the dead set." Who: Elena Sinclair [M05, 14:15:20Z] NEEDS CONFIRMATION: exact command not in thread. NEEDS CONFIRMATION: no verification of the clear appears anywhere in the thread. NEEDS CONFIRMATION: rollback not in thread. The 112 Redis::TimeoutError jobs (from STEP 3) were removed; whether they were discarded, drained, or backed up is not stated. If discarded, no rollback exists. STEP 6 — Scale workers 3 → 6 (state change) Action/command: `kubectl scale deployment/reward-worker --replicas=6` (was 3) Who: Bryce Harmon [M06, 14:21:07Z] Rollback (given in thread): `kubectl scale deployment/reward-worker --replicas=3` Verify: depth falling — STEP 7. Arithmetic: 48,213 (14:04:33) → 9,400 (14:33:41) = 38,813 jobs in 29m08s (29.13 min) ≈ 1,332 jobs/min average, consistent with Farid's reported ~1,200/min instantaneous. Projected zero from 14:33:41 at ~1,200/min: 9,400 ÷ 1,200 ≈ 7.8 min → ~14:41; actual zero verified 14:47:55, within observation margin. STEP 7 — Monitor drain Action: Observed queue depth 9,400 and falling ~1,200/min. Who: Farid Osman [M07, 14:33:41Z] NEEDS CONFIRMATION: command not restated; presumably `bundle exec rake sidekiq:queue_depth` from STEP 2, but the thread does not say. Rollback: n/a — read-only STEP 8 — Verify full recovery Action/command: `bundle exec rake sidekiq:queue_depth` → returned 0; Datadog error rate back to baseline. Who: Cole Ingram [M08, 14:47:55Z] Rollback: n/a — read-only verification STEP 9 — Re-enable enqueue (restore step for STEP 4; state change) Action/command: `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` Who: Bryce Harmon [M09, 14:49:10Z] Rollback: re-run the STEP 4 disable command (in thread verbatim, not framed as a rollback): `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` Verify: 40 new jobs processed cleanly in the next 3 minutes (per M09). NEEDS CONFIRMATION: command used to observe the 40 jobs is not stated. STEP 10 — Scale workers back down 6 → 3 (restore to pre-incident state) Action/command: `kubectl scale deployment/reward-worker --replicas=3` Who: Bryce Harmon [M10, 14:55:00Z] Verify: queue stable at 0; incident declared resolved. Rollback: re-scale to 6 (STEP 6 command) — not written in the thread as a rollback, but it is the documented inverse. STATE-CHANGE MATRIX - Step 4 disable flag — rollback documented (M04), exercised at M09 - Step 5 clear dead set — command, verification, and rollback all missing → needs confirmation - Step 6 scale up — rollback documented (M06), exercised at M10 as planned scale-down - Step 9 enable flag — restores pre-incident state; rollback is step 4's command - Step 10 scale down — restores pre-incident state UNDOCUMENTED IN THREAD (do not assume): the dead-set inspection and clear commands, any dead-set backup/retry of the 112 failed jobs, backfill of enqueues during the 40m25s pause, the monitoring command behind M07, and the verification method for the 40 post-reopen jobs.
SEQUENCED FAILURE ANALYSIS — datadog_logs.csv + sidekiq_jobs.csv (all times 2026-09-03 UTC)
1. FIRST ERROR
2026-09-03T14:01:12Z — service reward-service, level ERROR:
"Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s"
Everything earlier in the slice (13:55:13–13:59:30) is INFO only.
2. CASCADE, IN ORDER
- 14:01:12 — reward-service: Redis timeout to redis-primary:6379 after 5s (root trigger visible in logs)
- 14:01:20 / 14:01:30 / 14:01:40 — reward-service: "Redis::TimeoutError: retry exhausted for RewardGiveJob" (x3)
- 14:01:40 — sidekiq: "RewardGiveJob failed: Redis::TimeoutError; retrying in 60s" (first sidekiq ERROR; retries repeat at 14:02:28, 14:03:31, 14:04:22, 14:05:26, 14:06:47)
- 14:02:30 — sidekiq WARN: "Queue reward depth above 10,000" (78 s after first error)
- 14:03:05 — api-gateway: "502 upstream timeout calling reward-service /gives" (first user-facing failure; 113 s after first error; repeats 14:03:48, 14:04:13, 14:05:16, 14:06:52)
- 14:03:30 — web-app: "Give form submission failed: upstream 502 from api-gateway" (repeats 14:04:45, 14:05:42, 14:06:49)
- 14:22:10 — reward-service INFO: "Redis connection restored; resuming job processing"
- 14:24:45 — sidekiq INFO: "Queue reward depth below 500"
Sidekiq job table corroborates: J-00001–J-00012 RewardGiveJob failed 14:01:46–14:02:58, J-00013–J-00016 RecognitionDigestJob failed 14:02:36–14:05:50, all Redis::TimeoutError.
Arithmetic:
- Line counts: reward-service ERROR 4 + sidekiq ERROR 6 + api-gateway ERROR 5 + web-app ERROR 4 = 19 ERROR lines, plus 1 sidekiq WARN.
- Job failures: 12 RewardGiveJob + 4 RecognitionDigestJob = 16.
- Error burst: 14:01:12 to 14:06:52 = 5 min 40 s (340 s) of visible errors.
- Full outage window: 14:01:12 to recovery at 14:22:10 = 20 min 58 s; queue drain confirmed 2 min 35 s later at 14:24:45.
3. SERVICE AND JOB INVOLVED
Originating service: reward-service (dependency: Redis at redis-primary:6379). Propagation path: reward-service -> sidekiq -> api-gateway -> web-app. Primary job: RewardGiveJob; secondary job: RecognitionDigestJob (appears only in sidekiq_jobs.csv, never in the log lines).
4. DATADOG QUERY TO CONFIRM THE FIRST ERROR
Search logs sorted ascending (or "earliest first") over 14:00:00Z–14:02:00Z:
service:reward-service level:error "Redis::TimeoutError" "redis-primary:6379"
Expected result: a single hit at 14:01:12Z preceding the "retry exhausted" lines at 14:01:20+. A broader variant to prove nothing errored earlier in the window:
level:error service:(reward-service OR sidekiq OR api-gateway OR web-app) AND @timestamp:[2026-09-03T13:55:00 TO 2026-09-03T14:01:12]
— which should return zero hits, confirming 14:01:12 is the first error.
5. WHAT THE LOGS DO NOT SHOW
- Root cause of the Redis timeout itself: there are zero log lines from redis-primary (or any Redis host) — failover, memory eviction, network partition, and client saturation are all indistinguishable here.
- Whether the 16 failed jobs ever completed: after "Redis connection restored" at 14:22:10 there are no success or dead-letter lines for J-00001–J-00016, so it is unknown whether gives/digests were retried, lost, or double-applied.
- Actual queue depth: only thresholds are logged ("> 10,000", "< 500"); no peak number, enqueue rate, or drain rate.
- True user impact: the slice contains 5 api-gateway 502 lines and 4 web-app failure lines, but this looks like a sampled log extract — total 502 count, affected user count, and affected reward amounts cannot be derived.
- Any linkage between specific failed jobs (J-000xx) and specific failed form submissions — no trace IDs, request IDs, hosts, environments, or user identifiers exist in either file.
- RecognitionDigestJob never appears in datadog_logs.csv despite 4 failures in sidekiq_jobs.csv — a logging coverage gap.
- What happened between 14:06:52 and 14:22:10: errors simply stop appearing; whether the outage silently continued, was mitigated by someone, or resolved itself is not shown. postgres lines in that span are routine "checkpoint complete" INFO entries.
**Nine flags in flags_export.csv; 6 of them appear in the flag_code.md excerpt.** Per flag (state / targeting / company count / what the code does): 1. recognition_streaks_v2 — on — segment:beta_companies — 42 companies. Code (app/models/recognition.rb): gates `StreakTracker.record(give)` — records recognition streaks for beta companies. 2. points_budget_guardrails — on — all_companies — 220 companies. Code (app/services/budget_service.rb): gates `BudgetService.new(company).enforce!(giver, points)` — enforces point budgets. The only flag targeting all companies. 3. slack_dm_nudges — on — segment:region_na — 87 companies. Code (app/jobs/nudge_job.rb): gates `SlackDm.send_nudge(user)`; the job exits early when disabled (`return unless ...`). 4. redeem_flow_redesign — off — targeted_list — 12 companies. Code (app/controllers/redeem_controller.rb): two-path flag — renders RedeemV2Component when enabled, RedeemV1Component otherwise. Data gap: state is "off" yet a 12-company targeted_list exists; the export does not say whether those 12 are opted in ahead of the global switch. 5. analytics_dashboard_v3 — on — segment:tier_three — 65 companies. Code (app/controllers/analytics_controller.rb): sets `@dashboard = AnalyticsV3.new(company)` when enabled; no else branch in the excerpt, so what the remaining 220 − 65 = 155 companies see is not determinable from the data given. 6. ms_teams_app_v2 — off — targeted_list — 9 companies. Code (app/services/teams_installer.rb): gates `TeamsAppV2.install(company)`. Same off-but-12/9-targeted ambiguity as redeem_flow_redesign (here: 9 companies listed while the flag reads off). 7. legacy_give_modal — off — segment:legacy_plan — 14 companies. **No code reference in the excerpt** — the data does not establish what it controls. 8. survey_boosters_q3 — on — segment:legacy_plan — 7 companies. **No code reference in the excerpt** — it is switched on for 7 companies, but nothing in the provided code consumes it. 9. paused_offboard_cleanup — off — no targeting rule (field empty) — 0 companies. **No code reference.** The only flag with zero targets; internally consistent (off, empty rules, 0 companies). Aggregates and checks: - On: 5 (recognition_streaks_v2, points_budget_guardrails, slack_dm_nudges, analytics_dashboard_v3, survey_boosters_q3). Off: 4 (redeem_flow_redesign, ms_teams_app_v2, legacy_give_modal, paused_offboard_cleanup). 5 + 4 = 9 = rows in the export. - Flags with no code reference: 3 — legacy_give_modal, survey_boosters_q3, paused_offboard_cleanup. Referenced: 6. - Flags with no targets: 1 — paused_offboard_cleanup. - Sum of company counts: 42 + 220 + 87 + 12 + 65 + 9 + 14 + 7 + 0 = 456, but this is not a unique-company total — segments overlap and all_companies (220) presumably includes the segment members. One discrepancy to flag: segment:legacy_plan carries two different counts — 14 companies under legacy_give_modal vs 7 under survey_boosters_q3 (14 − 7 = 7). The export gives no rule explaining why the same segment yields different company counts for these two flags.
**NDA-1 — [PARTY A] and Bonusly: GREEN (standard approval)**
All standard terms — mutual, short term, full carve-outs including independent development, no embedded restrictions, and a mainstream US governing law: "Term: two (2) years from the Effective Date; obligations survive for three (3) years after termination" and "Carve-outs: information that (a) is or becomes publicly available through no breach, (b) was known prior to disclosure, (c) is received from a third party without duty of confidence, (d) is independently developed, or (e) must be disclosed by law or court order."
**NDA-2 — [PARTY B] and Bonusly: YELLOW (counsel review)**
Body terms are clean, but clause 4 embeds an 18-month post-term no-hire/non-solicit — an employment restriction disguised in an NDA that can constrain Bonusly recruiting after the evaluation ends: "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."
**NDA-3 — [PARTY C] and Bonusly: RED (full legal review)**
Three independent red flags stack: an open-ended 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"), zero confidentiality carve-outs ("No confidentiality carve-outs are stated in this Agreement"), and offshore exclusive jurisdiction ("the laws of the Republic of Ireland, and the parties submit to the exclusive jurisdiction of its courts") — compounded by a one-way 5-year term favoring [PARTY C].
Note: data provided covers only these three files; no other NDA terms, party identities, or Bonusly playbook standards were available to check against (e.g., whether an 18-month non-solicit is within Bonusly's acceptable range could shift NDA-2 to GREEN with a waiver).