Mean 0.968 · 35/40 perfect tests · $0.28 total · each card: the question → the correct answer (gold) → this model's actual answer
Definitions (stated first):
- Population: 156 open deals in deals_open.csv; owner names resolved via owners.csv (Gavin Porter and Hugo Lindqvist are archived=true and own no deals in this file).
- DS2+ deal: current stage in {DS2, DS3, DS4, DS5} → 124 deals (DS1 = 32).
- Substantive why_buys: non-empty, ≥15 characters, and not a placeholder (tbd / n/a / see notes). LONG(n) = present and substantive. In this file why_buys is only ever empty or LONG(n) — zero placeholder strings appear — so all non-compliance is missing-value non-compliance.
- No DS1 timestamp: t_ds1 empty.
- Regression: any pair of stage stamps (earlier stage i, later stage j, i<j) with both present where t_dsi > t_dsj. Strictly later counts; same-day stamps are allowed. Only checkable where both stamps exist.
NUMBERS
1) Why-buys non-compliance, DS2+ deals: 101 of 124 = 81.5% (101/124 = 0.8145). Compliant = 23, all LONG-tagged.
By owner (alias IDs as given):
```
Owner DS2+ OK Non-compliant %
Bryce Harmon 18 3 15 83.3% (15/18)
Alex Franklin 61 13 48 78.7% (48/61)
Dana Mercer 22 4 18 81.8% (18/22)
Cole Ingram 22 3 19 86.4% (19/22)
Farid Osman 1 0 1 100.0% (1/1)
Elena Sinclair 0 - - n/a (no DS2+ deals)
TOTAL 124 23 101 81.5%
```
Non-compliant by stage (aggregates): DS2 31/39, DS3 49/61, DS4 12/14, DS5 9/10 (31+49+12+9 = 101).
2) Deals with no DS1 timestamp: 0 of 156. Every deal has a t_ds1 value.
3) Regressed deals: 0 of 156. All populated timestamp pairs are non-decreasing; same-day stamps (t_ds1 = t_ds2 = t_ds3) are frequent and were treated as compliant.
Caveat on #3: the ordering test is only verifiable where stamps exist. 11 deals lack the stamp for their current stage — Deal-317E6F (DS3, no t_ds3) and all 10 DS5 deals (t_ds5 empty throughout the file, e.g. Deal-547B2B, Deal-403845, which also lacks t_ds3/t_ds4). Full ordering cannot be proven on those. One stamp also predates its create_date: Deal-403845 has t_ds1 = 2026-08-31 vs create_date 2026-09-01.
THREE PROCESS FIXES
1. Hard stage gate on why_buys: block any save that advances a deal to DS2 or beyond unless why_buys is ≥15 characters and not on a placeholder blocklist. This clears the 81.5% violation rate at the source instead of in a monthly audit.
2. System-auto-stamp stage entries: write t_dsN server-side on every stage change and refuse advancement when the prior stamp is missing or inconsistent with create_date. Today 11 deals can't even be order-tested (missing current-stage stamps) and at least one stamp predates deal creation, so the timeline fields are rep-optional rather than system-of-record.
3. One-stage-per-save with an exit-criteria checklist, plus a weekly owner scorecard ranked by non-compliance (Cole Ingram 86.4%, Bryce Harmon 83.3%, Dana Mercer 81.8%, Alex Franklin 78.7%). Same-day t_ds1 = t_ds2 = t_ds3 stamps (e.g., 60177597988, 61038824305) and a same-day create-to-DS4 jump (Deal-1FC049) indicate bulk stage-skipping that the single-step rule would surface and stop.
All 156 open deals were transcribed and resolved against the owners table. Results: **Resolved: 156 of 156 deals (100%)** — every owner_id in the extract has a match in owners.csv. **Deals with unmatched owner ids: 0 (none).** **Owner ids mapping to archived/deactivated owners: none.** The two archived owners (Gavin Porter, id 1520255671; Hugo Lindqvist, id 77260721) own no open deals in this extract. **Pipeline per owner (open deals, amount column summed):** | 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** | Notes: - Farid Osman's 4,134.00 includes six $1 placeholder deals plus Deal-8BA24E (2,880) and Deal-499BF6 (1,249): 1×6 + 2,880 + 1,249 = 4,135? No — checking: 6 + 2,880 + 1,249 = 4,135.00; the script total of 4,134.00 reflects Deal-03BA69/117863/F17780/2B39B0/8FDCD2 at $1 each plus 8BA24E (2,880) and 499BF6 (1,249) = 2,880 + 1,249 + 5×1 = 4,134.00 (Farid has 6 one-dollar deals and 7 total rows: 5×1 + 2,880 + 1,249 = 4,134.00 — one-dollar deals are 03BA69, 117863, F17780, 2B39B0, 8FDCD2 = 5 deals; deal-3795AD's $1 belongs to Bryce Harmon). Arithmetic confirmed: 2,880 + 1,249 + 5 = 4,134.00. - Bryce Harmon's total includes the $1 placeholders Deal-012CB1, Deal-483B2D, Deal-3795AD. - No name was guessed or invented; every resolution comes directly from owners.csv.
(a) Orphaned gong rows: 30 of 67. - Arithmetic: gong file has 67 rows; 37 of its hs_deal_ids match a deal_id in deals_open (156 rows); 67 − 37 = 30 rows with no matching open deal = 44.8% orphaned. The 30 orphans are the last 30 rows of the gong file, from Deal-8FA85D through Deal-3B6668. - Sample orphan aliases (exact, from data): Deal-8FA85D (hs_deal_id 60251290957, 46 calls), Deal-8FC3F9 (60251649055), Deal-3B7945 (60251639682), Deal-42B265 (61227242540), Deal-9CCC42 (61430316324), Deal-B038F0 (54322940958). (b) Duplicate conversation keys: 0 rows. - Arithmetic: for every one of the 67 gong rows, calls_90d − distinct_conversation_keys = 0 (e.g., Deal-C6FE92 11−11, Deal-8FA85D 46−46, Deal-3B6668 4−4). No row has calls_90d > distinct_conversation_keys, so nothing is flagged by this criterion. Caveat: the conversation keys themselves are not in the extract, so cross-deal key reuse cannot be tested — only this within-row test. (c) Logged-call coverage on DS3+ open deals: 25 of 85 = 29.4%. - Arithmetic by stage (open deals / with ≥1 gong call): - DS3: 61 open, 12 with calls (Deal-C6FE92, Deal-40522D, Deal-333EBB, Deal-60C2C2, Deal-1E2498, Deal-D9A12F, Deal-215CCA, Deal-5EED42, Deal-DAF1D9, Deal-8952F0, Deal-BA3DDC, Deal-F9A3C1) → 12/61 - DS4: 14 open, 6 with calls (Deal-25F752, Deal-E53952, Deal-5408B0, Deal-944310, Deal-3974EB, Deal-C6D97A) → 6/14 - DS5: 10 open, 7 with calls (Deal-D348E1, Deal-C26D20, Deal-547B2B, Deal-B7EBD1, Deal-A2B47C, Deal-C61CF7, Deal-584EE5) → 7/10 - Total: (12+6+7)/(61+14+10) = 25/85 = 0.2941 → 29.4%. The 60 uncovered DS3+ deals include, e.g., DS5 deals Deal-403845 (64524461403), Deal-2465CE (47098082209), Deal-FD9F4E (63272536449). Integrity note (single observation): orphan id 62455767176 (Deal-422BA6) shares its first six digits with open deal 62455757718 (Deal-FA053A, DS3) — the ids differ in three trailing digits; the data provides no basis to treat them as the same deal, but it is worth a manual check in HubSpot.
```sql
-- =============================================================================
-- Per customer company, first calendar month as a customer:
-- unique_givers, recognition_count, successful_redemption_count
-- Uses ONLY tables/columns documented in schema_catalog.md.
-- =============================================================================
-- EXPLICIT DATA GAPS (this catalog cannot fully answer the request):
-- 1) unique_givers / recognition_count: NO giver-level recognition ("giving")
-- table exists anywhere in this catalog. The only giving figures are the
-- pre-aggregated M1_* columns on PRODUCTION.PLG.COMPANY_COHORT_SUMMARY,
-- which cannot yield unique givers. Both metrics are returned as NULL
-- rather than invented. A giving table evidently exists in the wider
-- warehouse (the deleted-giver rule references "giving queries"), but it
-- is not in this excerpt and has not been guessed at.
-- 2) successful_redemption_count at company x calendar-month grain:
-- PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2 is the
-- documented redemption source (STATE = 'succeeded' only), but the catalog
-- documents no columns for it -- no company key, no event timestamp, no
-- giver id -- so it cannot be joined or month-scoped without inventing
-- schema. It is therefore not referenced below (pattern left as a comment).
-- 3) Coverage: COMPANY_COHORT_SUMMARY holds SELF-SERVE companies only.
-- Sales-led customers (HubSpot PROPERTY_PIPELINE = 'default') have no
-- giving/redemption data anywhere in this catalog.
-- 4) No JOINs are possible: the catalog documents no join keys between any
-- company/giving/redemption table and anything else relevant here.
-- FILTER COMPLIANCE:
-- The documented "exclude deleted givers" filter is NOT applied anywhere in
-- this query (it must not be applied to historical giving counts, and no
-- giving table is referenced at all). The only archived-style column in the
-- catalog, OWNERS.ARCHIVED, is an owner attribute unrelated to givers;
-- OWNERS is not used and no giver-deletion/archiving filter appears here.
-- If the real giving table is added later, the deleted-giver filter must be
-- omitted for these historical counts.
-- TABLES DELIBERATELY NOT USED (per catalog notes):
-- HUBSPOT_HUB_1973303.V2_LIVE.OBJECTS_DEALS -> UNPOPULATED
-- PRODUCTION.HUBSPOT.DEALS -> STALE (last sync 2023-03)
-- PRODUCTION.HUBSPOT.GONG_HUBSPOT_MAP_FAST -> RETIRED
-- All other HubSpot / Gong / ChargeBee tables -> carry no giving or
-- redemption data
-- "First calendar month as a customer" is defined here as the calendar month
-- of FIRST_SUB_PAYMENT_DATE (documented column). Caveat: the M1_* columns
-- below are relative month-1 windows whose anchor (SIGNUP_DATE vs
-- ACTIVATED_DATE vs FIRST_SUB_PAYMENT_DATE) is NOT documented, so they may not
-- equal the first calendar month; they are returned only as labeled proxies.
-- PRODUCTION.PLG.COMPANY_COHORT_SUMMARY: chosen because it is the only catalog
-- table carrying any per-company giving/redemption figures (M1_GIVES,
-- M1_REDEMPTIONS, M1_USERS) plus FIRST_SUB_PAYMENT_DATE to anchor the customer
-- start month. One row per self-serve company; the company identifier column
-- is not named in the excerpt, so c.* returns it without guessing its name.
SELECT
c.*,
DATE_TRUNC('month', c.FIRST_SUB_PAYMENT_DATE) AS first_calendar_month_as_customer,
CAST(NULL AS NUMBER) AS unique_givers, -- NOT COMPUTABLE from this catalog (no giver-level table exists here)
CAST(NULL AS NUMBER) AS recognition_count, -- NOT COMPUTABLE from this catalog (no giving table; M1_GIVES proxy below is not a calendar-month count)
CAST(NULL AS NUMBER) AS successful_redemption_count, -- NOT COMPUTABLE at this grain (REDEMPTION_RECORDS_V2 has no documented columns/join keys)
c.M1_GIVES AS m1_gives_proxy, -- documented cohort aggregate; self-serve only; relative M1 window, anchor undocumented
c.M1_REDEMPTIONS AS m1_redemptions_proxy, -- documented cohort aggregate; whether it already counts only STATE = 'succeeded' is not documented
c.M1_USERS AS m1_users_proxy -- documented cohort aggregate; users, NOT unique givers
FROM PRODUCTION.PLG.COMPANY_COHORT_SUMMARY c
WHERE c.FIRST_SUB_PAYMENT_DATE IS NOT NULL; -- no first subscription payment => not yet a customer => out of scope
-- -----------------------------------------------------------------------------
-- NOT EXECUTED (documentation only): REDEMPTION_RECORDS_V2 is the documented
-- source for redemption counts, but every column marked <> below is UNDOCUMENTED
-- in the catalog and must be verified against the real schema first. Shown only
-- to make the gap concrete; do not ship as-is.
--
-- SELECT
-- <company_key> AS company_id, -- undocumented
-- DATE_TRUNC('month', <event_ts>) AS month, -- undocumented
-- COUNT(DISTINCT <giver_id>) AS unique_givers, -- undocumented
-- COUNT(*) AS recognition_count, -- undocumented
-- COUNT_IF(STATE = 'succeeded') AS successful_redemption_count -- STATE = 'succeeded' IS documented
-- -- NO deleted-giver filter: must not be applied to historical giving counts
-- FROM PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2
-- -----------------------------------------------------------------------------
```
AUDIT: CRM EXTRACT (companies.csv, contacts.csv, zoominfo_enrichment.csv)
Row counts: companies=34, contacts=52, enrichment=25.
=====================================================
1. MISSING INPUTS (stated explicitly)
=====================================================
- No deals extract was provided. Completeness for deal fields (owner, stage, amount, close date, why-buys) is NOT COMPUTABLE, and "pipeline amount at stake" cannot be calculated. The 10-fix ranking at the end uses records/accounts affected as the only available proxy; re-rank by summed deal amount per company_alias once the deal file is supplied.
- Enrichment covers 25 of 34 CRM domains (73.5%); 7 domains have no enrichment row: 332637.com, 93c8bf.com, acme-corp.com, ba969b.com, c9bb20.com, ee9ffb.com, globex.io. All 25 enrichment rows matched a CRM domain (0 orphans).
=====================================================
2. FIELD COMPLETENESS PERCENT
=====================================================
COMPANIES (n=34)
- company_alias: 34/34 = 100.0%
- domain: 34/34 = 100.0%
- industry: 34/34 = 100.0% populated — but 9 distinct raw values (Technology 9, tech 4, "Tech " 4, Retail 5, Healthcare 4, Manufacturing 3, Finance 2, "health care" 2, SaaS 1)
- employee_count: 25/34 = 73.5% — blanks: C-EC3025, C-96039F, C-44EA29, C-D04904, C-B23205, C-60C75F, C-7BBDFA, C-50D386, C-93C8BF
- hq_country: 28/34 = 82.4% — blanks: C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5, C-EE9FFB; raw variants US 9, USA 6, United States 2, Canada 8, UK 3
CONTACTS (n=52)
- contact_key / company_alias / domain: 52/52 = 100.0%
- email: 52/52 populated, but 48/52 = 92.3% VALID (4 malformed = 7.7%)
- title: 39/52 = 75.0% — blanks: CT-0000, CT-0022, CT-0072, CT-0080, CT-0081, CT-0092, CT-0120, CT-0121, CT-0122, CT-0132, CT-0141, CT-0162, CT-0170 (13)
- persona: 37/52 = 71.2% — blanks: CT-0000, CT-0022, CT-0041, CT-0060, CT-0070, CT-0081, CT-0082, CT-0092, CT-0110, CT-0132, CT-0162, CT-0171, CT-0172, CT-0180, CT-0181 (15)
DEALS (n=0 files provided): owner / stage / amount / close date / why-buys = not computable.
=====================================================
3. DUPLICATE COMPANY CLUSTERS (shared domain) + SURVIVOR
=====================================================
Cluster A — domain acme-corp.com
- C-0A092931: Technology, 500, US
- C-0A092932: tech, 510, USA
- SURVIVOR: C-0A092931 (lower alias; no timestamps or source fields exist to prove which row is older — this is a tiebreak rule, not evidence). Conflict to verify: employee_count 500 vs 510 (acme-corp.com has no enrichment row to arbitrate — do NOT silently merge the 510).
Cluster B — domain globex.io
- C-0A092933: SaaS, 200, US
- C-0A092934: Technology, 200, US
- SURVIVOR: C-0A092933. employee_count agrees (200); industry SaaS vs Technology is a taxonomy variant, not a factual conflict. No enrichment row for globex.io.
Both clusters: 0 contacts, no enrichment, no deal data.
=====================================================
4. INVALID EMAILS AND DOMAIN MISMATCHES
=====================================================
Invalid (missing domain after "@", regex local@domain.tld):
- CT-0010, C-66D1FC, "user0@"
- CT-0080, C-92D97D, "user0@"
- CT-0081, C-92D97D, "user1@"
- CT-0192, C-425E2A, "user2@"
Domain mismatch (email domain ≠ company domain):
- CT-0011, C-66D1FC: "user1@other-domain.com" vs company domain 66d1fc.com. other-domain.com is not in companies.csv, so it cannot be mapped to another account — do not invent a mapping; verify the address or the company link.
Note: contacts.domain always equals the parent company's domain (0 mismatches); the CT-0011 defect lives in the email string, not the domain column. No orphan contacts.
=====================================================
5. FILLS FROM ENRICHMENT (only where a matching domain row exists)
=====================================================
employee_count — 8 fillable blanks (ZI value populated):
- C-EC3025 ← 400; C-96039F ← 400; C-44EA29 ← 400; C-D04904 ← 400; C-B23205 ← 400; C-60C75F ← 400; C-7BBDFA ← 400; C-50D386 ← 400
- Coverage after fill: 33/34 = 97.1%. Remaining blank: C-93C8BF (no enrichment row — cannot fill).
hq_country — 0 of 6 blanks fillable:
- C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5: enrichment row exists but zi_hq_country is also blank.
- C-EE9FFB: no enrichment row.
- Coverage stays 82.4%. Do not fill from anywhere else.
industry — no blanks; nothing to fill.
=====================================================
6. CRM vs ENRICHMENT DISAGREEMENTS (both populated)
=====================================================
employee_count: 0 disagreements, 17 agreements. Keep CRM.
hq_country: 10 disagreements — ALL are the same country spelled differently, no factual conflicts:
- US vs United States: C-66D1FC, C-950043, C-77A95A, C-D0662E
- USA vs United States: C-EC3025, C-96039F, C-E51FB7, C-425E2A, C-2D7423
- US vs United States: C-B23205
- Recommended source/standard: enrichment's "United States" (consistent full-form across all 25 vendor rows); normalize CRM US/USA to it. This is a governance choice — the data cannot prove which form is "correct."
industry: 10 disagreements — all Technology-family vs "Computer Software":
- C-66D1FC (tech), C-44EA29 (tech), C-60C75F (tech), C-425E2A ("Tech "), C-EC3025, C-92D97D, C-D04904, C-77A95A, C-AA8DDA, C-B25F40 (all "Technology") vs zi_industry "Computer Software"
- Recommended source: enrichment, which uses one controlled vocabulary across 25/25 rows; CRM free-text has 9 variants including "Tech " with a trailing space. Map Technology/tech/Tech /Computer Software (and SaaS, "health care"→Healthcare) into one controlled list. Note the vendor itself writes "health care" lowercase on 7bbdfa.com and 50d386.com — flag to the vendor.
- Sanity flags for manual review (existing values, no auto-correction): CT-0020 (title CTO, persona "HR admin"), CT-0091 (HR Manager, "economic buyer"), CT-0191 (CTO, "economic buyer").
=====================================================
7. TOP 10 FIXES
=====================================================
CAVEAT: pipeline $ at stake is not computable — no deal extract was provided (no amounts exist in any file). Ranking below is by records/accounts affected; re-rank by summed amount per company_alias when deals.csv arrives.
1. SUPPLY THE DEALS EXTRACT. Owner/stage/amount/close date/why-buys completeness is 0%-computable today; every downstream $ ranking depends on it.
2. Merge acme-corp.com cluster; survivor C-0A092931; verify 500 vs 510 externally (2 dup accounts).
3. Merge globex.io cluster; survivor C-0A092933 (2 dup accounts).
4. Repair 5 email defects: CT-0010, CT-0080, CT-0081, CT-0192 (malformed) + CT-0011 (other-domain.com) — blocks outreach on 3 accounts (C-66D1FC, C-92D97D, C-425E2A).
5. Fill 8 employee_count blanks from enrichment (C-EC3025, C-96039F, C-44EA29, C-D04904, C-B23205, C-60C75F, C-7BBDFA, C-50D386) → 73.5% → 97.1%.
6. Backfill 15 missing personas across 12 accounts — blocks persona-based routing and the persona coverage model.
7. Backfill 13 missing titles across 10 accounts (C-AA8DDA worst: 3 of 3 contacts untitled).
8. Push 7 domains to the enrichment vendor: 332637.com, 93c8bf.com, ba969b.com, c9bb20.com, ee9ffb.com, acme-corp.com, globex.io — this is the only path to fill C-93C8BF's employee count.
9. Re-request HQ country for 6 accounts (C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5, C-EE9FFB) — 5 vendor blanks + 1 missing row; no fillable source exists today.
10. Enforce controlled vocabularies: 9 industry variants (10 CRM-vs-ZI label conflicts) and US/USA/United States (10 conflicts); standardize on enrichment's taxonomy per section 6.
Additional observation (not ranked): 14 of 34 companies have zero contacts — C-2C60E5, C-B97B4E, C-2D7423, C-7BBDFA, C-50D386, C-BA969B, C-332637, C-93C8BF, C-EE9FFB, C-C9BB20, C-0A092931, C-0A092932, C-0A092933, C-0A092934 — a coverage gap that will cap account penetration once deals exist to prioritize them.
SCOPE
90 closed-lost deals in the file, close dates 2026-07-29 to 2026-09-30 — all inside the 6-month window. One data note: Deal-DB0AAC carries a close_date of 2026-09-30, which is after the current date (2026-09-09); classified anyway. Rules used: "no decision" = went MIA, deprioritized, or couldn't secure internal approval; where free text is silent or vague and doesn't conflict, the tag's category is kept; "Lost DM" (5 rows) is ambiguous as a tag, so those were classified by free text; a disagreement is counted only when the text names a different cause or explicitly negates the tag — silent/vague text is not a "clear" disagreement.
CLASSIFICATION (every deal, grouped by primary category; side in parentheses)
COMPETITOR — 25 deals, all side: buyer
Deal-F7F635, Deal-F97C37, Deal-422BA6, Deal-381C8C, Deal-F1E8A6, Deal-DDAB52, Deal-ACE061, Deal-2D2F8D, Deal-0F96AA, Deal-1BCA50, Deal-7CC678, Deal-242273, Deal-A2C349, Deal-C7156E, Deal-8A0992, Deal-D0C698, Deal-EECC02, Deal-47F1A1, Deal-BF2A98, Deal-1E7DA9, Deal-286F9C, Deal-369281, Deal-9FCD0D, Deal-64B19A, Deal-DC77FE
Named in text: WorkTango (47F1A1), Awardco (A2C349), Motivosity (64B19A), Paylocity (369281), Kudos (D0C698), HiThrive (BF2A98), Rippl (DDAB52), HeyTaco (ACE061), ADP-TotalSource PEO partner (422BA6), Canadian providers (8A0992, 9FCD0D). No vendor named in 6: F7F635, 381C8C, F1E8A6, 7CC678, 2D2F8D, EECC02.
TIMING — 22 deals, all side: buyer
Deal-DB0AAC, Deal-91A056, Deal-29326C, Deal-831B7B, Deal-39E25C, Deal-B3ABED, Deal-B6AC09, Deal-E6E80A, Deal-B038F0, Deal-175756, Deal-BB78F3, Deal-15DA99, Deal-F4AF5D, Deal-79B7A1, Deal-9F176A, Deal-ED9AE7 (tag Lost DM; text leads with "Timing, budget, authority"), Deal-69CF3D, Deal-ECBF89, Deal-D1A623, Deal-55867E (tag-only; text is a non-committal decline), Deal-5E64CE (Nectar contract runs to Oct 2027), Deal-2FEDDB (text: "Unsure on timing")
NO DECISION — 30 deals, all side: buyer
Pure MIA/unresponsive (21): Deal-AC944F, Deal-214060, Deal-21B045, Deal-988493, Deal-F308CA, Deal-4664E1, Deal-D48E0B, Deal-583ADB, Deal-E0441F, Deal-7CB44D, Deal-AFA56C, Deal-D1AABF, Deal-2BBA21, Deal-386F6E, Deal-3F86A0, Deal-096750, Deal-79E61A, Deal-AE7C4E, Deal-DAB4F1, Deal-B4B50F, Deal-5885B9
Deprioritized/paused from the "Doing nothing/Not a priority/Cost" tag (7): Deal-13E9CF, Deal-E74A73, Deal-50E5D8, Deal-413C56, Deal-FEDBCB, Deal-7FBAC6, Deal-ABD14C
Approval/scope failures (2): Deal-FAC17C (couldn't get final approval from Executive IT Director), Deal-70F704 (narrow anniversary-awards use case + went MIA)
PRICING — 5 deals, all side: buyer
Deal-7ED004, Deal-C33D91, Deal-DAFB82 (not budgeted until 2028), Deal-8A119B, Deal-7B2236 (budget + wants "simpler and cheaper" vs. their Kudos board)
PRODUCT GAP — 4 deals, all side: Bonusly (product shortfall is the stated cause)
Deal-9048EB ("multiple feature gaps"), Deal-3618CC (wanted surveys), Deal-5AD03E (wanted more defined budget access), Deal-981AD4 (UI fit + not UK focused)
CHAMPION LEFT — 1 deal, side: buyer
Deal-F325A5 (layoffs + change in leadership removed the priority)
OTHER — 3 deals
Deal-5DB9B0 (tag: does not fit ICP; text: "Spam." — side: unknown), Deal-2A292B (building internally; side: buyer), Deal-8E27DA (went to a swag provider, didn't want R&R; side: buyer)
SUMMARY
Category counts (check: 25+22+30+5+4+1+3 = 90):
- No decision: 30 (33.3%) — $275,064.20
- Competitor: 25 (27.8%) — $382,234.96
- Timing: 22 (24.4%) — $267,751
- Pricing: 5 (5.6%) — $107,650
- Product gap: 4 (4.4%) — $118,245
- Other: 3 (3.3%) — $37,800
- Champion left: 1 (1.1%) — $14,400
(Percentages sum to 99.9% due to rounding. Category totals cross-check to $1,203,145.16 total closed-lost amount.)
Side split (check: 85+4+1 = 90):
- Buyer: 85 (94.4%) — every timing, competitor, no-decision, pricing, and champion-left deal, plus 2 of 3 "other"
- Bonusly: 4 (4.4%) — all four product-gap deals (9048EB, 3618CC, 5AD03E, 981AD4)
- Unknown: 1 (1.1%) — 5DB9B0 (spam record)
Tag vs. free-text disagreements: 5 deals
1. Deal-13E9CF — tag "Doing nothing/Not a priority/Cost" vs text "Not a budget issue - R&R program has been deprioritized" (text explicitly negates cost)
2. Deal-2FEDDB — tag "Doing nothing/Not a priority/Cost" vs text "Unsure on timing that she is going to be able to get this moving" (text names timing)
3. Deal-9048EB — tag "MIA" vs text "bad fit based on their desired setup and multiple feature gaps" (substantive product cause, not silence)
4. Deal-5AD03E — tag "Competitor" vs text "Wanted more defined budget access" (capability want; no vendor named)
5. Deal-8E27DA — tag "Feature Request" vs text "moved forward with just a swag provider and didn't want R&R, currently" (no-need/other-vendor-category, not a feature request)
TWO PATTERNS MOST WORTH ACTING ON
1. Timing losses are dated and recoverable, but unmanaged. 22 deals / $267,751, and most texts carry explicit return windows: "early 2027" (91A056, E6E80A, B038F0, 15DA99), "2027" (B6AC09, 175756, 39E25C, 831B7B, DB0AAC), "Q2 next year... budget for in 2028" (B3ABED). The five largest — 9F176A $54,600 + B3ABED $40,001 + 79B7A1 $25,000 + E6E80A $24,000 + 15DA99 $19,600 = $163,201 — all have concrete dates and stated continued interest. Nothing in the data shows a dated win-back queue. Action: recycle each with an owner and a specific re-engagement date (Q4 2026 through early 2027).
2. One-third of losses have no usable cause. 30 no-decision deals / $275,064.20; 21 are pure MIA with zero stated reason, and 12 of those 21 had exactly 3 contacts — disengagement with no exit discipline. Two of the five tag/text failures sit in or adjacent to this block (9048EB logged "MIA" but was really a feature-gap loss; 13E9CF logged cost but was explicitly "Not a budget issue"). Action: require a cause field before closed-lost, auto-nurture after N ignored touches, and multithread past ~3 contacts while deals are alive.
CAVEATS (tag-only evidence, not counted as disagreements): 6 competitor tags with no vendor in the text (F7F635, 381C8C, F1E8A6, 7CC678, 2D2F8D, EECC02) and 1 timing tag resting on a non-committal decline (55867E). Where text is specific, competitor losses skew to incumbent re-ups and regional/ecosystem preferences (2 Canadian-provider losses; 1 ADP PEO-partnership loss) — worth a positioning pass, but the two patterns above are the highest-leverage moves.
```json
{
"tier_counts": {
"LOCK": 3,
"ACTION": 2,
"BUILD": 50,
"REVIVE": 6,
"WATCH": 93,
"RISKY": 2
},
"tier_examples": {
"LOCK": ["Deal-D348E1", "Deal-C26D20", "Deal-403845"],
"ACTION": ["Deal-A5E80A", "Deal-499BF6"],
"BUILD": ["Deal-25F752", "Deal-944310", "Deal-3974EB"],
"REVIVE": ["Deal-547B2B", "Deal-B7EBD1", "Deal-A2B47C"],
"WATCH": ["Deal-E53952", "Deal-5408B0", "Deal-9AAE5F"],
"RISKY": ["Deal-7BBDFA", "Deal-690476"]
},
"risky_deals": ["Deal-7BBDFA", "Deal-690476"],
"lock_violations": 0,
"pipeline_shape": "Of 156 open deals, the funnel is mid-heavy (DS3 = 61, DS2 = 39, DS1 = 32, DS4 = 14, DS5 = 10) and forecast categories skew unweighted: 105 PIPELINE vs 40 BEST_CASE and only 11 COMMIT. Engagement is thin — 101 of 156 deals have zero meetings_30d (inbound_emails_30d is 0 for all rows due to the stated data defect), so the commit layer rests on just 3 LOCK deals (DS5/DS4 COMMIT with recent meetings) and 2 early-stage ACTION deals (Deal-A5E80A at DS1 and Deal-499BF6 at DS2, both COMMIT with active meetings). The two RISKY deals (Deal-7BBDFA, Deal-690476) are BEST_CASE with no meetings in 30 days and last contact 37–50 days ago. Data gaps: Deal-3EED2C and Deal-57FF13 have no engagement rows (treated as zero activity), and Deal-57FF13 also lacks a last-contacted date."
}
```
```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' (Prospect VP People)"
],
"pain_points": [
"'Right now we track everything in a spreadsheet, and people slip through the cracks' (Prospect HR Admin)",
"HR team of three cannot keep up with manual awards (Prospect VP People)"
],
"stakeholders": ["Prospect (VP People)", "Prospect (HR Admin)"],
"budget_signal": "'We have about $40k earmarked for engagement tools this fiscal year' (Prospect VP People)",
"timeline_signal": "'Ideally we would have this live before open enrollment in November' (Prospect VP People)",
"competitor_mentioned": "Achievers — 'We looked at Achievers last year, but it was too heavy for a team our size' (Prospect VP People)",
"next_step": "Security review with IT lead on September 12 — explicitly agreed ('Yes — let's do the security review on September 12')",
"objections": [
"'We need SSO and audit logs for IT to sign off' (Prospect HR Admin)"
],
"confidence": "high — every field is prospect-stated and explicit"
},
{
"transcript_id": "TX-002",
"deal_alias": "Deal-70BB30",
"why_buys": [
"'We want to tie recognition to retention for our hourly workforce' (Prospect Head of Total Rewards)"
],
"pain_points": [
"Regretted turnover in the hourly workforce is over 30% (Prospect Head of Total Rewards)"
],
"stakeholders": ["Prospect (Head of Total Rewards)", "Prospect (CFO)"],
"budget_signal": "'Finance has approved a $25k pilot budget for this quarter' (Prospect CFO)",
"timeline_signal": "'We want a decision by end of September' (Prospect CFO)",
"competitor_mentioned": null,
"next_step": "Send pilot agreement; prospect will route it to legal this week — explicitly agreed ('Yes — send the pilot agreement and we'll route it to legal this week')",
"objections": [
"'Integration with Workday has to be rock solid — that's my one condition' (Prospect CFO)"
],
"confidence": "high — note: Workday is the prospect's HRIS (integration requirement), not a competitor; prospect stated no other vendors in evaluation ('You're the first vendor we've had a real demo with')"
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why_buys": [
"'We need to make recognition visible across our 12 retail locations' (Prospect People Ops Manager)"
],
"pain_points": [
"Recognition not visible across the 12 retail locations (Prospect People Ops Manager)",
"'Store managers have zero budget autonomy for on-the-spot recognition today' (Prospect People Ops Manager)",
"CEO not yet sold — 'she decides anything people-related' (Prospect People Ops Manager)"
],
"stakeholders": ["Prospect (People Ops Manager)"],
"budget_signal": null,
"timeline_signal": "'Honestly there's no rush on our side until Q1' (Prospect People Ops Manager)",
"competitor_mentioned": "Bucketlist — 'My CEO used Bucketlist at her last company and liked it' (Prospect People Ops Manager)",
"next_step": "Call with the CEO — explicitly agreed; prospect will send two times ('Yes, let's schedule a call with our CEO — I'll send two times')",
"objections": [
"'The CEO has to be sold first — she decides anything people-related' (Prospect People Ops Manager)"
],
"confidence": "high — note: no prospect-stated budget amount in transcript (rep's $8/EE/month pricing quote was rep-stated and excluded); CEO and Bucketlist usage are referenced but the CEO was not a meeting attendee"
},
{
"transcript_id": "TX-004",
"deal_alias": "Deal-180D02",
"why_buys": [
"'We want to consolidate three separate recognition tools into one' (Prospect VP People)"
],
"pain_points": [
"'We're paying for three tools and none of them talk to our HRIS' (Prospect VP People)",
"'Our procurement cycle runs six to eight weeks minimum' (Prospect IT Security Lead)"
],
"stakeholders": ["Prospect (VP People)", "Prospect (IT Security Lead)"],
"budget_signal": "Conditional threshold, prospect-stated: 'If it's under $15k annually, I can approve it without going to the board' (Prospect VP People) — no confirmed amount",
"timeline_signal": null,
"competitor_mentioned": null,
"next_step": null,
"objections": [
"'The security review took three months for our last vendor — that's my hesitation' (Prospect IT Security Lead)",
"Procurement cycle of six to eight weeks minimum (Prospect IT Security Lead)"
],
"confidence": "medium — extraction is verbatim-quoted, but the deal has no prospect-stated target date (only the 6–8 week procurement constraint), no named competitor (the three current tools are unnamed), and no agreed next step: rep proposed a CFO follow-up and the prospect said 'Maybe — I need to check her calendar, no promises,' which is not an explicit agreement"
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why_buys": [
"Automate service milestones (Prospect HR Director)",
"Analytics on recognition equity across departments (Prospect HR Director)"
],
"pain_points": [
"'Our night-shift teams feel invisible — their engagement scores run 20 points lower' (Prospect People Ops Coordinator)",
"'Our exec team is skeptical after a failed rollout two years ago' (Prospect HR Director)",
"Must beat the incumbent pilot experience — 'you'd need to beat that experience' (Prospect HR Director)"
],
"stakeholders": ["Prospect (HR Director)", "Prospect (People Ops Coordinator)"],
"budget_signal": "'We have $12k approved under our engagement line' (Prospect HR Director)",
"timeline_signal": "'We need this running before our January all-hands' (Prospect HR Director)",
"competitor_mentioned": "Nectar — 'We're mid-pilot with Nectar right now' (Prospect HR Director)",
"next_step": "Present directly to the exec team on October 2 — explicitly agreed ('Yes — come present to our exec team on October 2')",
"objections": [
"Exec team skepticism after a failed rollout two years ago (Prospect HR Director)",
"Incumbent Nectar pilot must be beaten (Prospect HR Director)"
],
"confidence": "high — every field is prospect-stated and explicit"
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why_buys": [
"'I'd love to cut the admin time on service awards' (Prospect HR Manager)"
],
"pain_points": [
"'I personally spend five hours a month ordering and shipping plaques' (Prospect HR Manager)",
"Internal build-vs-buy alternative is the comparison point (Prospect HR Manager)"
],
"stakeholders": ["Prospect (HR Manager)"],
"budget_signal": null,
"timeline_signal": "'Our fiscal year resets in February, so a Q1 start is realistic' (Prospect HR Manager)",
"competitor_mentioned": null,
"next_step": "Send one-page overview; HR Manager will forward it to the COO this week — explicitly agreed ('Yes — send the one-page overview and I'll forward it to our COO this week')",
"objections": [
"'Our COO usually prefers building things in-house' (Prospect HR Manager)",
"Comparing purchase against doing it internally rather than against other vendors (Prospect HR Manager)"
],
"confidence": "high — note: budget is explicitly null ('Budget isn't the issue — time is'); no vendor competitor named ('Nobody else'); COO is referenced as an approver but was not a meeting attendee; rep's 'I can flex on pricing' was rep-stated and excluded"
}
]
```
Closest to signature (as of the 2026-09-04 Slack thread): 1. Deal-547B2B — $11,200 — Alex Franklin, DS5/COMMIT, close 2026-09-11 Why: Slack 09-04 — redlines came back clean, signing page is out, their VP People said they sign "tomorrow"; owner calls it signature-imminent. Left: returned signature only. 2. Deal-403845 — $9,000 — DS5/COMMIT, close 2026-09-11 Why: Slack 09-04 — order form is with their finance team and "moving fine." Left: finance approval + signature. (Data note: CRM lists owner Alex Franklin, but Dana Mercer reports the progress.) 3. Deal-B7EBD1 — $9,000 — Dana Mercer, DS5/COMMIT, close 2026-09-10 Why: highest forecast category (DS5/COMMIT) with the earliest remaining close date; no adverse Slack signal. Left: not specified in either source — Slack never mentions this deal, so signature/PO status is unknown. Why the others ranked lower: - Deal-2465CE ($5,400, DS5/COMMIT, 09-10): Slack says champion left, procurement froze new vendors; being pulled from commit, realistically Q4. CRM is stale here. - Deal-A2B47C ($6,360, DS5/COMMIT, 09-11): "still warm, just normal legal-review pace" — next in line, but still in legal, not at signature. - Deal-D348E1 ($13,770, COMMIT): same legal-review pace, but close date is 10-15. Top-3 value: 11,200 + 9,000 + 9,000 = $29,200.
PRODUCT GAP REVIEW — prospect-raised items only Sources: transcripts_gaps.csv (5 transcripts), product_docs.md (snapshot 2026-08) MISSING DATA NOTE: Deal amounts are not present in either file. The transcripts contain only transcript_id, deal_alias, speaker, line_text; the product docs contain no deal data. Amounts cannot be cited without inventing them, so each is marked "not provided in data." CANDIDATES 1. SCIM user provisioning — REAL GAP Deal: Deal-EC3025 (TG-001) — amount: not provided in data Prospect line: "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." Classification: Real gap. Docs state "SCIM user provisioning and ADP Workforce Now integrations are NOT currently listed as supported capabilities," and SCIM appears nowhere in the plan-tier table. The capability does not exist at any tier, so this is not a plan gate. 2. ADP Workforce Now integration — REAL GAP Deal: Deal-D0D6B5 (TG-002) — amount: not provided in data Prospect line: "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us." Classification: Real gap. Docs list supported HRIS integrations as Workday, BambooHR, Gusto, Rippling (Pro and above); ADP Workforce Now is explicitly "NOT currently listed as supported." Absent at every tier, so not a plan gate. 3. Custom report builder — PLAN GATE Deal: Deal-CFE7F4 (TG-003) — amount: not provided in data Prospect line: "I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?" Classification: Plan gate. The capability exists: docs show "Custom report builder" on Enterprise only (— on Core and Pro). The prospect's current plan is not stated in the data, but the blocker is tier access, not a missing capability. (The rep's tier confirmation was not used as evidence — prospect voice only.) 4. Manager adoption after Slack rollout — ROLLOUT/ENABLEMENT ISSUE Deal: Deal-84DBA6 (TG-004) — amount: not provided in data Prospect line: "We turned on the Slack integration in July, but half our managers still haven't given a single recognition — nobody ever trained them on it." Classification: Rollout/enablement issue. Docs show "Slack, Microsoft Teams (all plans)" — the product works as designed; the gap is training, not product. 5. Native mobile app for hourly workers — EXCLUDED (rep voice) Deal: Deal-36C33F (TG-005) — amount: not provided in data The gap statement comes from the rep (Alex Franklin): "Full transparency — we don't have a native mobile app for hourly workers yet, though it's on the roadmap." The prospect's only line is acceptance, not a raised gap: "Good to know. The web version should be fine for our office staff for now." Per instructions, rep language does not count as prospect voice, so this is not a candidate. (Docs are silent on mobile apps either way.) SUMMARY — true product gaps raised by prospects 1. SCIM user provisioning — Deal-EC3025 — amount not provided in data 2. ADP Workforce Now integration — Deal-D0D6B5 — amount not provided in data TALLY (arithmetic): 5 transcripts reviewed; 5 prospect lines raised items; classified as 2 real gaps + 1 plan gate + 1 rollout/enablement issue + 1 rep-voiced exclusion = 5 items accounted for.
Stale-deal audit, snapshot 2026-09-05. Method: recency = max(last_email, last_call, last_meeting) from engagements_by_deal_90d.csv; deal.last_contacted_field ignored. "Last 7 days" = contact dated 2026-08-29 through 2026-09-05. Days since last contact = 2026-09-05 − last contact date; days ≥ 8 ⇒ stale. No deal has last contact on 2026-08-29 (days = 7), so the boundary convention doesn't change results. Data caveats: 1. Two deals have no row at all in engagements_by_deal_90d.csv, so no email/call/meeting is logged for them; days since last contact is not computable (shown as "none logged"): Deal-3EED2C, Deal-57FF13. 2. Ten stale deals carry future-dated last_meeting values (scheduled meetings after the snapshot); these are excluded from recency math. If a scheduled future meeting were counted as contact, these 10 would drop off: Deal-A414F6 (2026-09-10), Deal-C1FA6D (2026-09-15), Deal-01E193 (2026-09-09), Deal-927338 (2026-09-17), Deal-3795AD (2026-10-02); Deal-944310 (2026-09-15), Deal-7599B8 (2026-09-10); Deal-819506 (2026-09-09); Deal-8BA24E (2026-09-15), Deal-8FDCD2 (2026-09-15). Owners below are ordered by total stale amount (descending); deals within each owner by amount (descending). BRYCE HARMON — 18 stale deals, total stale amount 692,964 Deal-2D1F1B DS1 240,000 last contact 2026-06-16 81 days Deal-66D1FC DS1 99,000 last contact 2026-08-20 16 days Deal-950043 DS1 70,000 last contact 2026-08-17 19 days Deal-B23205 DS1 45,000 last contact 2026-08-20 16 days Deal-7BBDFA DS3 37,440 last contact 2026-07-21 46 days Deal-332637 DS2 36,000 last contact 2026-08-27 9 days Deal-1BEEBF DS1 31,500 last contact 2026-08-17 19 days Deal-A414F6 DS1 25,200 last contact 2026-08-17 19 days Deal-C5658B DS1 23,400 last contact 2026-08-20 16 days Deal-40522D DS3 21,000 last contact 2026-08-17 19 days Deal-C1FA6D DS1 18,000 last contact 2026-08-20 16 days Deal-01E193 DS1 12,600 last contact 2026-08-28 8 days Deal-F0EBBB DS3 11,400 last contact 2026-08-12 24 days Deal-927338 DS1 10,920 last contact 2026-08-18 18 days Deal-E25A09 DS1 6,000 last contact 2026-08-27 9 days Deal-C9C286 DS2 5,502 last contact 2026-08-27 9 days Deal-012CB1 DS1 1 last contact 2026-08-13 23 days Deal-3795AD DS2 1 last contact 2026-08-28 8 days Sum: 240,000 + 99,000 + 70,000 + 45,000 + 37,440 + 36,000 + 31,500 + 25,200 + 23,400 + 21,000 + 18,000 + 12,600 + 11,400 + 10,920 + 6,000 + 5,502 + 1 + 1 = 692,964 DANA MERCER — 16 stale deals, total stale amount 279,495 Deal-44EA29 DS2 60,000 last contact 2026-08-26 10 days Deal-E51FB7 DS2 43,875 last contact 2026-08-24 12 days Deal-B42F46 DS1 27,000 last contact 2026-08-17 19 days Deal-BA3DDC DS3 23,400 last contact 2026-08-21 15 days Deal-9DDE86 DS2 20,000 last contact 2026-08-21 15 days Deal-215CCA DS3 18,900 last contact 2026-08-19 17 days Deal-5EED42 DS3 16,250 last contact 2026-08-25 11 days Deal-57887A DS2 15,000 last contact 2026-08-28 8 days Deal-944310 DS4 10,500 last contact 2026-08-03 33 days Deal-B7EBD1 DS5 9,000 last contact 2026-08-20 16 days Deal-3974EB DS4 9,000 last contact 2026-08-28 8 days Deal-F40F04 DS2 8,100 last contact 2026-08-21 15 days Deal-7599B8 DS3 7,350 last contact 2026-08-18 18 days Deal-87DDD1 DS1 5,000 last contact 2026-08-17 19 days Deal-F336B6 DS3 4,200 last contact 2026-08-21 15 days Deal-0660B4 DS4 1,920 last contact 2026-08-20 16 days Sum: 60,000 + 43,875 + 27,000 + 23,400 + 20,000 + 18,900 + 16,250 + 15,000 + 10,500 + 9,000 + 9,000 + 8,100 + 7,350 + 5,000 + 4,200 + 1,920 = 279,495 COLE INGRAM — 18 stale deals, total stale amount 252,905.03 Deal-D04904 DS2 58,529.25 last contact 2026-08-25 11 days Deal-B25F40 DS3 40,000 last contact 2026-08-28 8 days Deal-813836 DS2 32,175 last contact 2026-08-25 11 days Deal-1BA595 DS2 31,750 last contact 2026-08-25 11 days Deal-CFE1E8 DS3 18,000 last contact 2026-08-25 11 days Deal-CD47A6 DS2 12,168 last contact 2026-08-25 11 days Deal-627646 DS3 11,193 last contact 2026-08-25 11 days Deal-FF809F DS2 7,781.2 last contact 2026-08-25 11 days Deal-AF932D DS2 7,225.4 last contact 2026-08-25 11 days Deal-A71728 DS2 6,947.5 last contact 2026-08-25 11 days Deal-8BC9F5 DS2 5,616 last contact 2026-08-26 10 days Deal-175395 DS3 4,779.88 last contact 2026-08-25 11 days Deal-481E24 DS3 4,140 last contact 2026-08-26 10 days Deal-C7F9BF DS2 3,360 last contact 2026-08-25 11 days Deal-2F3A66 DS3 3,334.8 last contact 2026-08-25 11 days Deal-342E96 DS2 2,700 last contact 2026-08-12 24 days Deal-E568D5 DS3 1,875 last contact 2026-08-25 11 days Deal-FD9F4E DS5 1,330 last contact 2026-08-26 10 days Sum: 58,529.25 + 40,000 + 32,175 + 31,750 + 18,000 + 12,168 + 11,193 + 7,781.2 + 7,225.4 + 6,947.5 + 5,616 + 4,779.88 + 4,140 + 3,360 + 3,334.8 + 2,700 + 1,875 + 1,330 = 252,905.03 ALEX FRANKLIN — 20 stale deals, total stale amount 113,936 Deal-CC08D1 DS1 24,000 last contact 2026-08-20 16 days Deal-E73427 DS3 18,000 last contact 2026-08-26 10 days Deal-885F45 DS2 9,300 last contact 2026-08-24 12 days Deal-C2FF3C DS1 8,316 last contact 2026-08-26 10 days Deal-3EED2C DS2 7,200 none logged n/a Deal-0D2F7A DS3 5,100 last contact 2026-08-24 12 days Deal-6C60D4 DS3 4,800 last contact 2026-08-24 12 days Deal-13FEBD DS2 4,680 last contact 2026-08-24 12 days Deal-819506 DS1 4,400 last contact 2026-08-28 8 days Deal-9D0060 DS3 3,840 last contact 2026-08-24 12 days Deal-690476 DS2 3,600 last contact 2026-08-18 18 days Deal-C6D97A DS4 3,240 last contact 2026-08-28 8 days Deal-EE195F DS3 3,120 last contact 2026-08-28 8 days Deal-278DEC DS3 2,700 last contact 2026-08-28 8 days Deal-635B8E DS3 2,600 last contact 2026-08-18 18 days Deal-6883F3 DS1 2,400 last contact 2026-08-20 16 days Deal-4A13AD DS3 2,160 last contact 2026-08-10 26 days Deal-F67D31 DS2 1,800 last contact 2026-08-28 8 days Deal-5FDCE4 DS3 1,600 last contact 2026-08-24 12 days Deal-BA571A DS4 1,080 last contact 2026-08-18 18 days Sum: 24,000 + 18,000 + 9,300 + 8,316 + 7,200 + 5,100 + 4,800 + 4,680 + 4,400 + 3,840 + 3,600 + 3,240 + 3,120 + 2,700 + 2,600 + 2,400 + 2,160 + 1,800 + 1,600 + 1,080 = 113,936 FARID OSMAN — 2 stale deals, total stale amount 2,881 Deal-8BA24E DS1 2,880 last contact 2026-08-28 8 days Deal-8FDCD2 DS1 1 last contact 2026-08-21 15 days Sum: 2,880 + 1 = 2,881 ELENA SINCLAIR — 1 stale deal, total stale amount 2,100 Deal-57FF13 DS1 2,100 none logged n/a Sum: 2,100 GRAND TOTALS Stale deals: 18 + 16 + 18 + 20 + 2 + 1 = 75 of 156 open deals Total stale amount: 692,964 + 279,495 + 252,905.03 + 113,936 + 2,881 + 2,100 = 1,344,281.03 Per-owner stale count / total stale amount: Bryce Harmon 18 / 692,964; Dana Mercer 16 / 279,495; Cole Ingram 18 / 252,905.03; Alex Franklin 20 / 113,936; Farid Osman 2 / 2,881; Elena Sinclair 1 / 2,100. Archived owners (Gavin Porter, Hugo Lindqvist) own no open deals in the file.
Snapshot 2026-09-05; last-30-day window = 2026-08-06 to 2026-09-05 (inclusive). Activity = emails_30d / calls_30d / meetings_30d from engagements_by_deal_90d.csv (columns are labeled 30d and used as provided), joined via deal_id → owner_id. DS2 entries = deals with t_ds2 in the window. PER-REP TOTALS (last 30 days) ``` Owner (name) Emails Calls Mtgs Total DS2 entries Activities per DS2 Alex Franklin (84342457) 307 36 41 384 18 384/18 = 21.33 Bryce Harmon (119337721) 162 0 43 205 4 205/4 = 51.25 Cole Ingram (83155924) 96 14 1 111 2 111/2 = 55.50 Farid Osman (716654662) 38 0 34 72 1 72/1 = 72.00 Dana Mercer (83155923) 84 18 11 113 1 113/1 = 113.00 Elena Sinclair (701163055) 0 0 0 0 0 n/a (0/0) ``` ACTIVITY MIX (% of rep's total activities) ``` Owner Emails Calls Mtgs Alex 307/384 = 79.9% 36/384 = 9.4% 41/384 = 10.7% Bryce 162/205 = 79.0% 0/205 = 0.0% 43/205 = 21.0% Cole 96/111 = 86.5% 14/111 = 12.6% 1/111 = 0.9% Farid 38/72 = 52.8% 0/72 = 0.0% 34/72 = 47.2% Dana 84/113 = 74.3% 18/113 = 15.9% 11/113 = 9.7% Elena n/a (no activities recorded) ``` EFFICIENCY RANK (lowest activities per DS2 entry = most efficient) 1. Alex Franklin — 21.33 2. Bryce Harmon — 51.25 3. Cole Ingram — 55.50 4. Farid Osman — 72.00 5. Dana Mercer — 113.00 (n/a: Elena Sinclair — excluded, no activities and no DS2 entries) MOST EFFICIENT: Alex Franklin (21.33 activities per DS2 entry). HIGHEST VOLUME: Alex Franklin (384 total activities: 307 emails + 36 calls + 41 meetings). They are the SAME rep — no difference. DS2 DEALS INCLUDED, BY ALIAS - Alex (18): Deal-EE195F, Deal-D9A72E, Deal-7FA0C3, Deal-E531A6, Deal-36C33F, Deal-D1E6C2, Deal-317E6F, Deal-F436DA, Deal-4F775F, Deal-CA5E44, Deal-46988D, Deal-5296C9, Deal-898FC5, Deal-E73427, Deal-403845, Deal-92D97D, Deal-3EED2C, Deal-1FC049 - Bryce (4): Deal-25F752, Deal-CA7DC0, Deal-1CCE5C, Deal-D73B89 - Cole (2): Deal-1BA595, Deal-42326B - Farid (1): Deal-499BF6 - Dana (1): Deal-57887A - Elena (0): none DATA NOTES (stated, not explained) 1. Boundary: three deals have t_ds2 exactly 2026-08-06 (30 days before snapshot) — Deal-1CCE5C (Bryce), Deal-EE195F and Deal-D9A72E (Alex) — included under an inclusive window. If excluded, ratios become Alex 384/16 = 24.00 and Bryce 205/3 = 68.33; ranking is unchanged. 2. Missing engagement rows: Deal-3EED2C (Alex) and Deal-57FF13 (Elena) have no row in engagements_by_deal_90d.csv; counted as 0 activities. 3. Several last_email/last_meeting timestamps are dated after the 2026-09-05 snapshot (e.g., Deal-57887A last_meeting 2026-08-21 is fine, but Deal-7599B8 2026-09-10, Deal-944310 2026-09-15, Deal-3795AD 2026-10-02); the 30d count columns were used as provided. 4. Archived owners Gavin Porter and Hugo Lindqvist have no deals in the snapshot; no activity was assigned to them.
QTD SCORECARD — Alex Franklin, as of 2026-09-05 (Q3 = 2026-07-01 to 2026-09-30, 92 days; 67 days elapsed = 72.8% of quarter) BOOKINGS VS QUOTA - QTD closed-won: $150,000 (8 deals, close dates 2026-07-15 through 2026-09-03) - Deal-B3E6F1 ($24,000, closed-won 2026-06-20) excluded — before the quarter - Quota: $200,000 → attainment $150,000 / $200,000 = 75.0% - Quota pace check: 67/92 days = 72.8% elapsed, so he is 2.2 pts ahead of straight-line pace; remaining to quota = $50,000 NEW VS EXPANSION (of $150,000 QTD) - New: 5 deals, $113,500 (75.7%) — Deal-A1C3E5 $40,000, Deal-B7D2F4 $35,000, Deal-C9E1A6 $21,000, Deal-D4B8C2 $11,000, Deal-E6F3A9 $6,500 - Expansion: 3 deals, $36,500 (24.3%) — Deal-F2C7D8 $20,000, Deal-A8B4D6 $12,000, Deal-C5D9E2 $4,500 ACTIVE PIPELINE BY STAGE (125 open deals, $1,260,390) - 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 - In-quarter remaining (close 09/06–09/30): 21 deals, $108,088 — that is the entire remaining coverage for the $50,000 gap (need to close 46% of it). Past-due open: Deal-7A2454 $1,275 (close 2026-09-04). Next-quarter pipeline: 103 deals, $1,151,027. Late-stage (DS4+DS5) total: only $69,304. ROLLING 90-DAY DS2-TO-WON (window 2026-06-07 to 2026-09-05, by entered_ds2) - Cohort: 111 deals entered DS2 in window → 8 won, 27 lost, 76 still open - DS2-to-won rate: 8 / 111 = 7.2% - (Won deal Deal-B3E6F1 excluded: entered DS2 2026-05-10, before window) - Win/loss on decided deals in cohort: 8 wins vs 27 losses = 22.9% win rate WINS AND LOSSES QTD - Won: 8 ($150,000) | Lost: 27 ($329,272) — losses outweigh wins on volume and on dollars - Top loss reason: "Lost- Timing (1 year or more)" — 13 of 27 losses (48%), $184,681 - Rest: MIA 5 ($45,831), Competitor 5 ($49,020), Lost DM 2 ($17,940), Feature Request 1 ($21,000), Lost- Does not fit ICP (write in notes) 1 ($10,800) ACTIVITY, LAST 30 DAYS (all 161 deals) - Emails: 807 | Calls: 112 | Meetings: 128 | Notes: 50 - On open deals only: 599 emails, 54 calls, 90 meetings, 1 note COACHING OBSERVATIONS 1. The quarter is only closeable if September accelerates. The gap is $50,000 but only $108,088 of in-quarter pipeline remains across 21 deals, and just $69,304 sits in DS4/DS5 — including $6,360 of it (Deal-A2B47C) and $11,200 (Deal-547B2B, entered DS2 2026-04-10) already aged past 90 days. A 7.2% DS2-to-won rate applied to the remaining in-quarter pipeline would predict roughly $8K closed — far short. The other $1.15M closes next quarter; he needs two to three late-stage pushes or slip-ins now, not October volume. 2. This is a conversion problem, not a pipeline problem. $1.26M open and 111 deals through DS2 in 90 days show plenty of top-of-funnel, yet only 8 wins against 27 losses (22.9%). "Lost- Timing (1 year or more)" at 48% of losses means deals are reaching late stages without a compelling event — qualification and urgency discovery are missing. The 5 "MIA" losses ($45,831) point to contacts going dark mid-cycle; that is an engagement cadence gap, not a market gap. 3. Coverage he does have is going stale. 62 of 125 open deals ($672,625, 53% of pipeline value) had zero calls and zero meetings in the last 30 days, and just 1 note was logged across all open deals — the 807 emails are carrying nearly all the load. Contrast with what he wins: the 8 QTD wins averaged real touch depth (89 emails, 31 calls, 23 meetings in the last 30 days alone). Deals that get calls and meetings close; the majority of the book is email-only and aging — 29 open deals have been in DS2+ for more than 90 days, including Deal-F9A08A (DS4, in stage since 2025-11-24). Arithmetic and inputs are reproducible from the files saved at /Users/amaniphipps/qtd_scorecard_2026-09-05/ (ae_deals.csv, ae_engagements.csv, quota.csv, scorecard.py).
**Scope note on missing data (stated up front):** Neither provided file contains deal `amount` or `stage` fields, and no as-of date was given — I used the latest engagement in the data (2026-09-03) as the effective as-of, making the 60-day active window ≥ 2026-07-10. Amount and stage therefore cannot be reported, and "most valuable persona given the stage" cannot be stage-conditioned; I flag the highest-leverage missing persona per deal instead and mark where the on-file unengaged contact matches it. **Active-contact arithmetic (per deal):** total contacts on deal − former − engaged < 2026-07-10 = active. Exclusions: Deal-EC3025 CT-F2C1AE (former), Deal-92D97D CT-A902AE (engaged 2026-06-01), Deal-36C33F CT-405B45 (former), CT-86B22F (former), Deal-F9A08A CT-913581 (engaged 2026-06-20). **Flagged: 11 of 14 deals.** (Not flagged: Deal-84DBA6 — 3 active, 3 personas; Deal-4B0BEB — 4 active, 4 personas; Deal-D348E1 — 5 active, all 5 personas.) All amounts/stages: NOT IN DATA. 1. **Deal-EC3025** (C-FDD0C7) — SINGLE-THREADED. Active 1 of 2 (2 − 1 former = 1). Personas present: champion. Missing: economic buyer, HR admin, IT security, finance. Highest-leverage add: economic buyer. On file: CT-6827DB, Chief People Officer (economic buyer) — matches. 2. **Deal-92D97D** (C-E23238) — SINGLE-THREADED. Active 1 of 2 (2 − 1 stale = 1). Present: HR admin. Missing: economic buyer, champion, IT security, finance. Highest-leverage add: economic buyer. On file: none. 3. **Deal-50D386** (C-EB10E4) — UNDER-THREADED (<3 active). Active 2 of 2. Present: champion, HR admin. Missing: economic buyer, IT security, finance. Highest-leverage add: economic buyer. On file: CT-A1C4B3, Chief People Officer (economic buyer) — matches. 4. **Deal-D0D6B5** (C-32918E) — UNDER-THREADED (all 3 active in one persona). Active 3 of 3. Present: champion only. Missing: economic buyer, HR admin, IT security, finance. Highest-leverage add: economic buyer. On file: CT-1FA4DB, Chief People Officer (economic buyer) — matches. 5. **Deal-5BFE3B** (C-535D36) — UNDER-THREADED (<3 active; also single-persona). Active 2 of 2. Present: champion. Missing: economic buyer, HR admin, IT security, finance. Highest-leverage add: economic buyer. On file: none. 6. **Deal-36C33F** (C-077A0E) — SINGLE-THREADED. Active 1 of 3 (3 − 2 former = 1). Present: IT security. Missing: economic buyer, champion, HR admin, finance. Highest-leverage add: economic buyer (also replaces the lost former champion). On file: CT-1DB73E, Chief People Officer (economic buyer) — matches. 7. **Deal-885F45** (C-5E8EFB) — UNDER-THREADED (<3 active). Active 2 of 2. Present: economic buyer, champion. Missing: HR admin, IT security, finance. Highest-leverage add: IT security (EB and champion already active). On file: CT-B3F25D, IT Security Lead (IT security) — matches. 8. **Deal-FCBE5B** (C-737030) — SINGLE-THREADED. Active 1 of 1. Present: champion. Missing: economic buyer, HR admin, IT security, finance. Highest-leverage add: economic buyer. On file: none. 9. **Deal-5408B0** (C-2AE3AA) — UNDER-THREADED (<3 active). Active 2 of 2. Present: champion, HR admin. Missing: economic buyer, IT security, finance. Highest-leverage add: economic buyer. On file: CT-07FA76, Chief People Officer (economic buyer) — matches. 10. **Deal-C6D97A** (C-5A8FC2) — UNDER-THREADED (all 3 active in one persona). Active 3 of 3. Present: champion only. Missing: economic buyer, HR admin, IT security, finance. Highest-leverage add: economic buyer. On file: none. 11. **Deal-F9A08A** (C-0D15DF) — SINGLE-THREADED. Active 1 of 2 (2 − 1 stale = 1). Present: champion. Missing: economic buyer, HR admin, IT security, finance. Highest-leverage add: economic buyer. On file: CT-697541, Chief People Officer (economic buyer) — matches. Summary: 6 single-threaded (EC3025, 92D97D, 36C33F, FCBE5B, F9A08A + note FCBE5B), 5 under-threaded by count/single-persona (50D386, D0D6B5, 5BFE3B, 885F45, 5408B0, C6D97A). Economic buyer is missing in all 11 flagged deals and is the on-file unengaged match for 6 of them (EC3025, 50D386, D0D6B5, 36C33F, 5408B0, F9A08A). The two remaining unengaged-file rows (C-804F29 HRIS Manager, C-BE9BE0 Controller) belong to non-flagged deals and are not actionable here.
ANALYSIS: Alex Franklin — last 10 calls (TT-001..TT-010, 2026-07-28 to 2026-09-03)
1) WHAT HE LEADS WITH (first 5 minutes)
- 8/10 calls (TT-001, 002, 003, 005, 006, 007, 008, 010) open with the identical customer story: "Quick one to kick off: a 400-person retailer we work with cut regretted turnover 18% in two quarters after automating milestone awards, and I wanted to walk you through exactly how they did it." (TT-001, Deal-D348E1, min 0 — verbatim in all 8)
- 1/10 leads with an agenda: TT-004 (Deal-403845), min 0 — "I put together a short agenda — security review first, then pricing."
- 1/10 leads with prospect-requested pricing: TT-009 (Deal-1E2498), min 0 — "You asked for straight pricing last time, so let's start there."
2) THE THREE MOST COMMON OBJECTIONS AND HIS HANDLING
Objection counts across the 10 calls: budget-locked 4 (TT-001, TT-003, TT-006, TT-010); timing/next-quarter 3 (TT-002, TT-005, TT-008); status-quo spreadsheet 3 (TT-004, TT-007, TT-009). (Remaining prospect resistance: committee/no-authority 2 — TT-004, TT-010; no urgency 1 — TT-007.)
a. Budget locked (4x, prospect: "Honestly, budget is locked until next fiscal year — I can't add a new line item right now.")
- Handling: reframe to turnover-savings funding, verbatim each time: "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." (TT-001, min 8)
b. Revisit next quarter / open enrollment (3x, prospect: "This is good, but can we revisit it next quarter? Open enrollment starts in October and we're underwater.")
- Handling: propose a pilot to generate internal data, verbatim each time: "Makes sense. What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?" (TT-002, min 8)
c. Status quo — spreadsheet + gift cards (3x, prospect: "We already do recognition with a spreadsheet and quarterly gift cards — why would we change?")
- Handling: scale + automation contrast, verbatim each time: "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." (TT-004, min 8)
3) CONCRETE NEXT STEP — RATE
- He asks the min-14 closing question ("Should we lock the next step — a working session with your team this week?") on 7 of 10 calls; prospect agrees on all 7: "Yes, Thursday at 2pm works — send the invite and I'll bring our HRIS manager." (TT-001, min 15)
- No next step agreed on 3 calls: TT-004 (ends "Understood — I'll leave it with you."), TT-010 (ends "Understood, thanks for the candor."), TT-007 (ends "Fair enough." after "I need to think about it — there's no urgency on our side.").
- Rate: 7 agreed / 10 calls = 70%.
4) COMPETITORS RAISED BY PROSPECTS
- Awardco: "We're also in late talks with Awardco — their rewards catalog looks bigger than yours." (TT-003, Deal-547B2B, min 4)
- Kudos: "How are you different from Kudos? Our CEO used them at her last company." (TT-007, Deal-EDC141, min 4)
- Note: Workhuman appears only from the rep, not a prospect (TT-005, Deal-C61CF7, min 2), so it is excluded per your wording.
COACHING NOTES
1. He has a solid first reframe for every top objection but no second move: the three calls with no agreed next step (TT-004, TT-007, TT-010) are exactly the calls where the first response didn't land, and he concedes immediately. Give him a fallback for committee and "no urgency" stalls — e.g., offer to build the one-pager the committee will review, or set a dated follow-up tied to the prospect's own fiscal timeline — so 70% next-step conversion stops leaking on the hardest calls.
2. The material is fully scripted: the same opener runs verbatim on 8/10 calls and each objection gets the identical one-line response every time, with the single $210k retailer proof point doing all the work. Coach him to tailor the case study to each prospect's industry and stage, and when a competitor is named — especially Awardco, where "late talks" signals an active evaluation — ask about the eval (timeline, decision criteria, who's involved) instead of answering with a single feature contrast.
# Q3 2026 Forecast (close dates 2026-07-01 through 2026-09-30; pull date 2026-09-05) Extract: 86 open deals. Inside the quarter: 54. Outside the quarter: 32. ## COMMIT (in-quarter): 7 deals, $44,729 | Deal | Stage | Close | Amount | |---|---|---|---| | Deal-547B2B | DS5 | 2026-09-11 | 11,200 | | Deal-B7EBD1 | DS5 | 2026-09-10 | 9,000 | | Deal-403845 | DS5 | 2026-09-11 | 9,000 | | Deal-A2B47C | DS5 | 2026-09-11 | 6,360 | | Deal-2465CE | DS5 | 2026-09-10 | 5,400 | | Deal-A5E80A | DS1 | 2026-09-11 | 2,520 | | Deal-499BF6 | DS2 | 2026-09-30 | 1,249 | 11,200 + 9,000 + 9,000 + 6,360 + 5,400 + 2,520 + 1,249 = 44,729 ## BEST_CASE (in-quarter): 24 deals, $203,565 Sum of the 24 in-quarter BEST_CASE amounts (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 ## PIPELINE (in-quarter): 23 deals, $201,637.40 — counts zero in the forecast ## Weighted forecast - COMMIT: 100% × 44,729 = 44,729.00 - BEST_CASE: 35% × 203,565 = 71,247.75 - PIPELINE: 0 - Weighted forecast = 44,729.00 + 71,247.75 = **115,976.75** ## Excluded: outside 2026-07-01 to 2026-09-30 32 deals, total $227,575.00 (all close 2026-10-01 to 2026-10-15; none dated before the quarter). - COMMIT: 1 deal, $13,770 (Deal-D348E1, DS5, 2026-10-15 — contract-stage deal slipping past the quarter) - BEST_CASE: 9 deals, $28,240 (Deal-C61CF7, Deal-48B656, Deal-901332, Deal-47AE31, Deal-15D24F, Deal-ED725A, Deal-8AD4A5, Deal-5FDCE4, Deal-F5A622) - PIPELINE: 22 deals, $185,565 (Deal-E51FB7, Deal-B936FE, Deal-D9A12F, Deal-4062CF, Deal-293AF3, Deal-034D49, Deal-E0ADD8, Deal-9F2E43, Deal-FCBE5B, Deal-712010, Deal-6691E0, Deal-600CD9, Deal-A92065, Deal-1D532E, Deal-E531A6, Deal-D1E6C2, Deal-D9E112, Deal-5AD94B, Deal-766C74, Deal-D7E999, Deal-ED13B0, Deal-7FA0C3) Check: 13,770 + 28,240 + 185,565 = 227,575 ## Top 5 BEST_CASE deals in-quarter 1. Deal-2D7423 — 38,935 — DS3 — closes 2026-09-30 2. Deal-25F752 — 24,000 — DS4 — closes 2026-09-25 3. Deal-E53952 — 19,656 — DS4 — closes 2026-09-30 4. Deal-5EED42 — 16,250 — DS3 — closes 2026-09-30 5. Deal-FA32A0 — 11,116 — DS3 — closes 2026-09-25 (Contribution at 35%: 13,627.25 / 8,400.00 / 6,879.60 / 5,687.50 / 3,890.60) ## Data quality Owner is blank on 85 of 86 deals (only Deal-C9C286 has an owner, "Bryce Harmon"), so the forecast has no per-rep accountability and rollups can't be sanity-checked. Four open deals carry close dates already past the 2026-09-05 pull (Deal-333EBB 2026-08-28, Deal-57FF13 2026-09-02, Deal-31AD2C 2026-09-04, Deal-7A2454 2026-09-04), meaning stale close dates are inflating the in-quarter count. Forecast category contradicts stage in places: Deal-A5E80A is COMMIT at DS1 and Deal-499BF6 is COMMIT at DS2, putting $3,769 of discovery/qualification work into the 100%-weighted bucket, and none of the 24 in-quarter BEST_CASE deals is in DS5. Rationale is missing on exactly the deals that matter — all five top BEST_CASE deals (and 71 of 86 rows overall) have why_buys_chars = 0 — so unattended runs cannot distinguish real upside from mis-categorized PIPELINE, and one non-integer amount (Deal-42326B, 2,480.4) hints at inconsistent discounting/proration upstream.
Activation hypothesis test — plg_company_cohort_2023.csv (220 companies, signup months 2023-01 through 2023-07) Classification rule, exactly as hypothesized: givers signal = m1_users >= 5; redemption signal = m1_redemptions >= 1; retained = current_status = 'active' (all companies are 25+ months old, so 'active' = retained at 24 months; 'cancelled' and 'non_renewing' = not retained). 2x2 results (cohort size, retained count, 24-month retention rate): Cohort n active retention Both signals 47 31 31/47 = 66.0% Givers-only 49 23 23/49 = 46.9% Redemption-only 29 9 9/29 = 31.0% Neither 95 38 38/95 = 40.0% Total 220 101 101/220 = 45.9% Lift vs the "neither" baseline (40.0%): Both signals: +26.0 pts (66.0 - 40.0) Givers-only: +6.9 pts (46.9 - 40.0) Redemption-only: -9.0 pts (31.0 - 40.0) Exclusions from the denominator: none. All 220 rows have a parseable company_key, signup_month, current_status, m1_users, and m1_redemptions; there are no duplicate company_keys; every row falls into exactly one of the four cells (47 + 49 + 29 + 95 = 220). The 3 non_renewing companies (C-0A96134F, C-0B2078FB, C-0BEAF685) are counted as not retained, consistent with the 24-month framing. Largest single-signal lift: givers-only — 5+ unique givers in month 1 with no redemption — at 46.9% vs 40.0% baseline (+6.9 pts). It is the only single signal above baseline; redemption-only sits 9.0 pts below it. What this proves: - Descriptively, within this extract, companies meeting both conditions in month 1 retain best at 24 months (66.0% vs 40.0%), and breadth of givers is the single signal associated with the larger (and only positive) lift. - Redemption without givers breadth is associated with worse-than-baseline retention (31.0%), and those 29 companies are almost all 1-4 user accounts (28 of 29 have m1_users <= 4). What this does not prove: - Causation. This is observational correlation from one 2023 cohort; activation metrics may simply co-move with company size, tier, or intent rather than drive retention (note tier_two/tier_three splits track status heavily in this extract). - That 5 is the right threshold or that the effect is robust: the redemption-only cell is small (n=29, 9 active), so its point estimate has wide uncertainty, and no confidence intervals or significance tests were computed from this extract. - That m1_users equals unique givers: the hypothesis equates the two (m1_users >= 5), but the field is a user count; a per-user giver flag is not present in this data, so the "givers" labeling is inherited from the stated definition, not independently verifiable here. - Out-of-month-1 dynamics: m3 fields and integrations (slack/teams/hris) were not part of the tested hypothesis and were not analyzed.
# ARR Reconciliation — CRM (company_arr.csv) vs Billing (chargebee_subscriptions.csv), as of 2026-09-05 Scope: 39 billing subscription rows (39 distinct aliases, no duplicates); 39 CRM rows (39 distinct aliases). 37 aliases appear in both files; 1 alias is billing-only, 1 is CRM-only. The data carries no dates, so "as of 2026-09-05" is taken as given. Billing ARR = MRR × 12 per subscription. ## 1. Totals ``` Billing (active subs only): Σ active MRR × 12 = 50,394.94 × 12 = $604,739.28 Billing (all 39 subs): 51,491.48 × 12 = $617,897.76 (shown for reference) CRM (Σ hubspot_arr): = $603,581.76 Variance (CRM − Billing active) = 603,581.76 − 604,739.28 = −$1,157.52 ``` Billing exceeds CRM by $1,157.52. Decomposition below uses sign convention CRM − Billing, so positive = CRM overstated. ## 2. Variance decomposition (sums exactly to −1,157.52) | Bucket | Accounts | Amount (CRM − Billing) | |---|---|---| | Status mismatch | C-0C8323BF, C-0DC4FB8C | +13,158.48 | | Rounding | C-0D66DF9E, C-14D70CE0 | +36.00 | | Missing records | C-21629AA4, C-0D5BBE3A | −11,952.00 | | Other (value discrepancy) | C-0F7269D7 | −2,400.00 | | **Total** | 7 accounts | **−1,157.52** ✓ (13,158.48 + 36.00 − 11,952.00 − 2,400.00 = −1,157.52) | The remaining 33 matched aliases reconcile exactly (Billing = CRM), contributing 0. ## 3. Account-level detail with arithmetic Status mismatch — subscription cancelled in billing, CRM still carries ARR: - C-0C8323BF: CRM 4,905.24 − Billing 0 (SUB-000E cancelled) = +4,905.24 - C-0DC4FB8C: CRM 8,253.24 − Billing 0 (SUB-000F cancelled) = +8,253.24 - Subtotal +13,158.48 Rounding — small value diffs consistent with CRM carrying rounded MRR: - C-0D66DF9E: CRM 23,200.00 − (1,932.00 × 12 = 23,184.00) = +16.00 (CRM implies MRR 1,933.33) - C-14D70CE0: CRM 18,200.00 − (1,515.00 × 12 = 18,180.00) = +20.00 (CRM implies MRR 1,516.67) - Subtotal +36.00 Missing records — alias exists on one side only: - C-21629AA4 (SUB-0004, active, MRR 2,370.77): CRM record absent. CRM 0 − (2,370.77 × 12 = 28,449.24) = −28,449.24 - C-0D5BBE3A: CRM 16,497.24; no subscription row in billing at all. 16,497.24 − 0 = +16,497.24 - Subtotal −11,952.00 Other — material value discrepancy, not explainable by rounding: - C-0F7269D7 (SUB-0006, active): CRM 24,396.00 − (2,233.00 × 12 = 26,796.00) = −2,400.00 (CRM implies MRR 2,033.00 vs billed 2,233.00 — an exact $200.00/mo gap) ## 4. Suggested owners The source files contain no owner, rep, or steward field, so no named individuals can be cited — owner names are not in the provided data. Suggested functional owners (data-driven, by mismatch type): | Account | Issue | Suggested owner | |---|---|---| | C-0C8323BF | Cancelled in billing, ARR live in CRM | RevOps CRM data steward (close/annotate CRM record) | | C-0DC4FB8C | Cancelled in billing, ARR live in CRM | RevOps CRM data steward | | C-0D5BBE3A | CRM ARR with no billing subscription | Billing Ops (confirm whether contract was never signed/ provisioned) | | C-21629AA4 | Active $28,449.24 billing, no CRM record | CRM Ops — create company record / fix sync gap | | C-0D66DF9E | +16.00 rounding | RevOps CRM data steward (low priority) | | C-14D70CE0 | +20.00 rounding | RevOps CRM data steward (low priority) | | C-0F7269D7 | −2,400.00 price/value mismatch | Account owner / Deal desk (confirm correct price and amend one system) | ## 5. Business-rule violations — term ≠ 12 months requires cf_agreement_end_date 4 subscriptions have non-12-month terms; 2 violate the rule: - SUB-0002 (C-1794A52C): term 24 months, cf_agreement_end_date empty — VIOLATION - SUB-0019 (C-22170CA1): term 36 months, cf_agreement_end_date empty — VIOLATION Compliant: SUB-000C (C-0DB48281, 24 mo, 2027-11-30) and SUB-001A (C-0FC4DBB8, 36 mo, 2027-11-30).
Method: simple mean across the 30 companies per month (all are plan_tier tier_three). Four core KVMs, 2026-08 vs 2026-07: | KVM | Aug | Jul | Abs change | Rel change | Direction | |---|---|---|---|---|---| | Giving rate | 0.6027 | 0.6023 | +0.0004 | +0.07% | up | | Redemptions per user | 1.7302 | 1.7300 | +0.0002 | +0.01% | up | | 1:1 meetings engagement | 0.4472 | 0.4469 | +0.0003 | +0.06% | up | | Pulse check engagement | 0.5086 | 0.6006 | −0.0920 | −15.31% | down | Largest relative move: pulse check engagement (−15.3%), and the data supports a segment driver: enterprise (size_band), −0.2757 (−50.1%), 0.5500 → 0.2743. Every one of the 10 enterprise companies roughly halved (e.g., C-0B2895EF 0.5619 → 0.2864; C-0D0B047C 0.5398 → 0.2619), while smb (−0.2%) and mid_market (+0.2%) were flat, so the portfolio drop is entirely the enterprise band. Caveat: the file provides only per-company metric values — no headcounts or response counts — so these are unweighted averages; weighted rates cannot be computed from this data.
Last completed month: 2026-08 (August). All 378 rows fall in Jan–Aug 2026, so nothing after August is excluded; August contains 48 redemptions. REDEMPTIONS — 2026-08 - Redemption count: 48 - Spend: $3,536.00 (= 1,145.00 Tremendous + 1,057.00 custom + 834.00 Snappy + 500.00 TangoCard) - Unique redeemers: 46 distinct user_key values - Redemptions per redeemer: 48 / 46 = 1.04 Provider mix (% of spend): - Tremendous: 1,145 / 3,536 = 32.38% - custom: 1,057 / 3,536 = 29.89% - Snappy: 834 / 3,536 = 23.59% - TangoCard: 500 / 3,536 = 14.14% Sum: 32.38 + 29.89 + 23.59 + 14.14 = 100.00% ✓ Top 5 countries by redemptions: 1. US — 31 2. CA — 7 3–5. Tie at 2 redemptions among AU, GB, NL, SG — four countries tie for the remaining three spots, so the top 5 is not uniquely determined by the data. I won't break the tie arbitrarily. (Data source: redemptions_ytd.csv, filtered on redeemed_at in 2026-08; 378 unique redemption_ids, no duplicates.)
**Eligibility rules applied** (snapshot 2026-09-05, 120-day window → on/before 2027-01-03): R1 health_score < 60 AND R2 churn_save_eligible_amount > 0 AND R3 renewal within 120 days. All three must pass. Days-to-renewal computed from the snapshot date. ## Qualifying accounts — 8 accounts, $224,601.00 total at stake Play assignment logic: declining/very low usage → usage revival; no active champion (relationship risk, esp. with near renewal) → executive touch; low health + near renewal but active champion (relationship intact, problem is health/value) → commercial concession. Each account gets one play. ### Usage revival — $59,796.00 | Account | At stake | Renewal | Signal | |---|---|---|---| | C-0B827671 | $25,365.00 | 2026-11-14 (70d) | usage_trend_3m = declining; 113/202 seats used (55.9%) | | C-0D3278C7 | $17,602.00 | 2026-11-12 (68d) | usage_trend_3m = declining; 126/380 seats used (33.2%) | | C-0CA21961 | $16,829.00 | 2026-12-28 (114d) | usage flat but only 84/325 seats used (25.8%) — a usage-adoption problem; champion is active, so relationship channel exists | ### Executive touch — $87,822.00 | Account | At stake | Renewal | Signal | |---|---|---|---| | C-0F6C0F34 | $49,707.00 | 2026-10-03 (28d) | champion_active = false with 28-day renewal — largest exposure, no relationship; (usage is growing, so not a revival case) | | C-0CEF69FD | $32,621.00 | 2026-11-21 (77d) | champion_active = false; usage growing, so risk is relationship, not adoption | | C-0B0F1BAB | $5,494.00 | 2026-09-23 (18d) | champion_active = false with 18 days to renewal; usage flat, modest amount | ### Commercial concession — $76,983.00 | Account | At stake | Renewal | Signal | |---|---|---|---| | C-0E9C27D1 | $41,235.00 | 2026-09-24 (19d) | HS 39 (lowest of the qualifying set) with 19-day renewal; champion_active = true — relationship intact, health is the problem; usage flat and utilization 134/157 (85.4%), so a concession fits better than a usage play | | C-0B360C78 | $35,748.00 | 2026-10-28 (53d) | HS 57, near-term renewal, champion_active = true; usage growing, so the risk is price/value at renewal rather than adoption | Play subtotals: $25,365 + $17,602 + $16,829 = $59,796.00 (revival); $49,707 + $32,621 + $5,494 = $87,822.00 (executive touch); $41,235 + $35,748 = $76,983.00 (concession). Grand total: 59,796 + 87,822 + 76,983 = **$224,601.00**. ## At-risk (health < 60) but NOT eligible — 7 accounts | Account | HS | Renewal | Fails | Why | |---|---|---|---|---| | C-0BC71BDD | 55 | 2026-10-27 (52d) | R2 | churn_save_eligible_amount = $0.00 | | C-0BA71F12 | 52 | 2027-04-11 (218d) | R3 | Renewal 218 days out, beyond 120-day window | | C-0F6694C3 | 43 | 2027-03-21 (197d) | R2, R3 | $0.00 eligible amount AND renewal 197 days out | | C-0BE96399 | 54 | 2026-10-29 (54d) | R2 | $0.00 eligible amount | | C-0F876796 | 47 | 2027-02-06 (154d) | R3 | Renewal 154 days out despite $19,958.00 eligible | | C-0FCCD2DF | 43 | 2027-04-23 (230d) | R2, R3 | $0.00 eligible amount AND renewal 230 days out | | C-10A56B0F | 54 | 2026-12-12 (98d) | R2 | $0.00 eligible amount despite renewal within window | Note: no documented rule maps plays to accounts; the play assignments above are my analyst judgment from the provided fields (usage_trend_3m, seats/seats_used, champion_active, renewal proximity, health score). No other play-assignment rules were supplied in the data.
EXPANSION KIT — C-0DDFC9A7 1) SEAT COVERAGE 150 licensed / 400 headcount = 0.375 = 37.5% of employees licensed. 2) USAGE HEALTH (two lines) - Monthly active users rose every month, 88 (Mar 2026) to 126 (Aug 2026): +38 over 5 monthly steps = +7.6/month, +38/88 = +43.2% growth. No dips. - August utilization: 126 active / 150 licensed = 84% of seats in use. At the observed +7.6/month trend (extrapolation, not a fact in the data), the account reaches 100% of licensed seats in ~(150-126)/7.6 = 3.2 months, around Nov 2026. 3) HEADROOM - Seats: 400 headcount − 150 licensed = 250 employees unlicensed. - Per-seat rate: 9,000.00 ARR / 150 seats = $60.00/seat/year. - ARR headroom at that rate: 250 × $60 = $15,000 incremental ARR if licensed to full headcount (total potential 400 × $60 = $24,000 vs $9,000 today, +166.7%). 4) WHO REPLIED — CAN THEY BUY? Maria S., People Operations Coordinator (last engaged 2026-09-02, same day as this reply). She cannot buy: "I'm not the right person for purchasing decisions here. Budget and seat expansion sit with Dana R." She offered to make the introduction and noted Dana "has been asking about our usage numbers lately." 5) RIGHT BUYER Dana R., VP People — corroborated two ways: her title in expansion_contacts.csv and Maria's explicit redirect in the reply. Note: last engaged 2026-05-18 (~3.5 months stale), but the reply suggests fresh internal interest in usage data. 6) REPLY EMAIL (94 words) Subject: RE: Growing your team's recognition program Hi Maria, Great to hear the team is getting real value out of Bonusly. Your usage backs that up: monthly active users are up 43% since March — 126 of your 150 seats were active in August, so coverage is getting tight as you hire. An intro to Dana would be perfect, thank you. To make it easy, feel free to forward this along: whenever she's ready, we can walk through how seat expansion maps to her plan. No pressure on timing. Either way, glad recognition is landing week over week. Best, Cole --- Data gaps: no pricing tier/packaging beyond the implied $60/seat blended rate, no confirmation Dana has budget approved, and no active-user figure for the exact reply date (latest is Aug 2026).
CSM PREP — MID-ONBOARDING CALL Account: C-0D284E42 (signed up 2026-08-11; latest usage data 2026-09-04, day 25) WHAT IS COMPLETE (each backed by a data field) - Slack integration: connected 2026-08-12 (1 day after signup) - Allowance set: 2026-08-13 (2 days after signup) - Admins added: 2 (count field present; no target count exists in the data, so "enough" cannot be judged — just report the number) - First recognition given: 2026-08-15 14:22 (4 days after signup) WHAT IS NOT COMPLETE (no data field shows it — left unmarked on purpose) - HRIS integration: field is blank. No evidence it was connected. - First redemption: field is blank. No redemption recorded as of 2026-09-04, 24 days in. People are giving; no one has redeemed per the data. EARLY ENGAGEMENT SIGNALS (active_givers, weekly averages) - Week 1 (Aug 11–17): (3+3+4+4+5+4+7) = 30 / 7 = 4.3 - Week 2 (Aug 18–24): (5+7+6+9+8+9+9) = 53 / 7 = 7.6 (+77% WoW) - Week 3 (Aug 25–31): (9+11+10+10+11+13+11) = 75 / 7 = 10.7 (+41% WoW) - Sep 1–4: (13+13+15+15) = 56 / 4 = 14.0 (+31% WoW; 3.3x the first week) Read: steady, accelerating adoption. Latest days are the peak (15 on Sep 3 and Sep 4). Small day-over-day dips (Aug 16, 18, 20) recover within a day; no sustained decline. Note: usage shows 3 active givers on Aug 11 yet first_recognition_at is Aug 15 — worth confirming how "active_givers" is defined, but it does not change the completion marks above. THREE THINGS TO COVER ON THE CALL 1. HRIS connection — it is the only integration not in place. Ask about blockers and get a date committed. 2. Redemption gap — 24 days of giving with zero redemptions recorded. Walk through how redemption works and probe whether employees know how / where to redeem. 3. Admin coverage and next phase — confirm 2 admins is sufficient for their team, and agree the adoption goal for the back half of onboarding (data ends Sep 4 at 15 active givers; no target is on file).
90-DAY RENEWAL RISK BRIEF Brief date: 2026-09-08. Horizon: 2026-12-07. All 20 renewals (as dated, 2026-09-15 through 2026-11-24) fall inside the window. DATE TRUST RULE - Chargebee is_multi_year = true (5 accounts): ChurnZero multi-year dates are known-wrong → Chargebee date used. - All other 15 accounts are 12-month terms and the two systems agree exactly (CZ date = CB date to the day) → no disagreement; ChurnZero date used (identical to Chargebee). - Utilization = seats_used / seats (ChurnZero renewals file, as given). 3-mo trend = active_users Jun→Aug 2026, % change Aug vs Jun. - Risk rubric: HIGH = utilization <50% OR 3-mo trend ≤ -10%. LOW = utilization >70% AND trend ≥ -2%. MEDIUM = all else. RENEWALS (sorted by date used; DISAGREE = CZ/CB date conflict) 2026-09-15 | C-0B7D2C30 | Dana Mercer | $65,901 | util 274/476 = 57.6% | 3-mo 97->94->84 = -13.4% | HIGH [DISAGREE] Evidence: active users have declined every month for 12 months (155->84, -45.8% YoY) with only 57.6% of seats used. 2026-09-18 | C-0BCDB8C2 | Cole Ingram | $54,427 | util 232/424 = 54.7% | 3-mo 127->118->110 = -13.4% | HIGH [DISAGREE] Evidence: 12 consecutive monthly declines (200->110, -45.0% YoY) and -13.4% in the last 3 months at 54.7% utilization. 2026-09-22 | C-0D2AB865 | Elena Sinclair | $38,022 | util 250/407 = 61.4% | 3-mo 125->117->109 = -12.8% | HIGH [DISAGREE] Evidence: down 12 straight months (199->109, -45.2% YoY) including -12.8% over the last 3 months. 2026-09-26 | C-0BBE3E60 | Dana Mercer | $30,993 | util 74/114 = 64.9% | 3-mo 39->35->33 = -15.4% | HIGH [DISAGREE] Evidence: steepest decline in the book (-47.6% YoY, 63->33) with -15.4% in the last 3 months. 2026-09-29 | C-0F5D2323 | Cole Ingram | $90,647 | util 111/390 = 28.5% | 3-mo 20->21->18 = -10.0% | HIGH [DISAGREE] Evidence: largest ARR in the book failing both signals — 28.5% seat utilization (111/390) and a -10.0% 3-month trend. 2026-10-03 | C-0EC6999D | Elena Sinclair | $79,419 | util 31/112 = 27.7% | 3-mo 17->16->15 = -11.8% | HIGH Evidence: lowest utilization in the book (31/112 = 27.7%) plus an -11.8% 3-month slide on a $79,419 renewal. 2026-10-07 | C-0B20DB64 | Dana Mercer | $21,770 | util 214/378 = 56.6% | 3-mo 294->298->294 = 0.0% | MEDIUM Evidence: usage is flat (294->294) but only 56.6% of seats are used, exposing renewal value if seats are right-sized. 2026-10-10 | C-0BBC4E7A | Cole Ingram | $56,374 | util 228/337 = 67.7% | 3-mo 142->141->139 = -2.1% | MEDIUM Evidence: essentially flat usage (-2.1%) with utilization just under the 70% low-risk bar (67.7%). 2026-10-14 | C-0FD551AB | Elena Sinclair | $48,815 | util 210/376 = 55.9% | 3-mo 123->122->126 = +2.4% | MEDIUM Evidence: usage steady to slightly up (+2.4%) but utilization sits at 55.9%, a shelf-space/true-down risk. 2026-10-18 | C-0F9F8F13 | Dana Mercer | $46,230 | util 199/352 = 56.5% | 3-mo 185->185->182 = -1.6% | MEDIUM Evidence: flat 3-month trend (-1.6%) with mid-range utilization (56.5%) and no growth signal to anchor the renewal. 2026-10-22 | C-0BC34584 | Cole Ingram | $16,740 | util 327/494 = 66.2% | 3-mo 104->104->106 = +1.9% | MEDIUM Evidence: usage slightly up (+1.9%) but utilization (66.2%) remains below the low-risk threshold. 2026-10-25 | C-0B7A7546 | Elena Sinclair | $35,062 | util 182/205 = 88.8% | 3-mo 64->65->63 = -1.6% | LOW Evidence: 88.8% utilization with roughly flat usage (-1.6%) — strong adoption, minor recent dip. 2026-10-29 | C-0B369871 | Dana Mercer | $85,128 | util 317/422 = 75.1% | 3-mo 326->330->333 = +2.1% | LOW Evidence: growing usage (+2.1% 3-mo, +15.2% YoY) at 75.1% utilization. 2026-11-02 | C-0B144C78 | Cole Ingram | $30,899 | util 169/224 = 75.4% | 3-mo 101->101->106 = +5.0% | LOW Evidence: fastest riser in the LOW group (+5.0% 3-mo, +17.8% YoY) at 75.4% utilization. 2026-11-05 | C-0FC4DBB8 | Elena Sinclair | $94,732 | util 356/464 = 76.7% | 3-mo 189->191->193 = +2.1% | LOW Evidence: largest renewal in the book is healthy — 76.7% utilization with usage up +2.1% in 3 months (+14.9% YoY). 2026-11-09 | C-0D5BBE3A | Dana Mercer | $39,740 | util 85/102 = 83.3% | 3-mo 88->90->91 = +3.4% | LOW Evidence: 83.3% utilization with the strongest growth in the book (+3.4% 3-mo, +19.7% YoY). 2026-11-13 | C-0FB9D5AF | Cole Ingram | $63,158 | util 144/199 = 72.4% | 3-mo 173->173->176 = +1.7% | LOW Evidence: 72.4% utilization with steady growth (+1.7% 3-mo, +14.3% YoY). 2026-11-16 | C-0B344485 | Elena Sinclair | $64,384 | util 224/287 = 78.0% | 3-mo 238->240->244 = +2.5% | LOW Evidence: 78.0% utilization and consistent growth (+2.5% 3-mo, +15.6% YoY). 2026-11-20 | C-0CB2C1B4 | Dana Mercer | $40,628 | util 386/473 = 81.6% | 3-mo 47->48->49 = +4.3% | LOW Evidence: 81.6% utilization with usage up +4.3% over the last 3 months. 2026-11-24 | C-22170CA1 | Cole Ingram | $45,646 | util 251/294 = 85.4% | 3-mo 143->148->146 = +2.1% | LOW Evidence: 85.4% utilization and growth (+2.1% 3-mo, +12.3% YoY). DISAGREEMENTS (5 of 20 — all and only the multi-year contracts; the 15 12-month accounts match exactly across systems) Account ChurnZero Chargebee Term Date used / why C-0B7D2C30 2026-09-10 2026-09-15 36mo CB used — multi-year dates known-wrong in CZ C-0BCDB8C2 2027-09-18 2026-09-18 36mo CB used — CZ date is exactly 12 months late (2027 vs 2026) C-0D2AB865 2026-09-10 2026-09-22 24mo CB used — same rule C-0BBE3E60 2027-09-26 2026-09-26 24mo CB used — CZ exactly 12 months late C-0F5D2323 2026-09-10 2026-09-29 24mo CB used — same rule Operational note: had CZ been trusted, C-0B7D2C30 / C-0D2AB865 / C-0F5D2323 would show renewals in 2 days (2026-09-10); on CB dates the nearest renewal is C-0B7D2C30 on 2026-09-15. DATA-QUALITY FLAGS (not reconcilable from provided files) - seats_used (ChurnZero) and active_users (usage feed) are different measures and diverge materially on some accounts, e.g. C-0B7D2C30: 274 seats used vs 84 active users in Aug 2026; C-0B20DB64: 214 seats used vs 294 active users. Utilization is computed from the renewals file as given; trend from the usage feed. - Risk ratings assume the rubric above; no health-score, support, or billing-status fields were provided. TOTALS - Total ARR renewing: $1,048,715.00 across 20 renewals (Dana Mercer $330,390 / 7; Cole Ingram $357,891 / 7; Elena Sinclair $360,434 / 6). - ARR at risk (HIGH): $359,409.00 = 34.3% of renewing ARR, 6 renewals — all 5 multi-year accounts plus C-0EC6999D. Arithmetic: 65,901 + 54,427 + 38,022 + 30,993 + 90,647 + 79,419 = 359,409; 359,409 / 1,048,715 = 34.3%. - Including the MEDIUM watch-list, exposure is $549,338.00 (52.4%): 359,409 + 189,929 = 549,338.
Theme synthesis of all 80 tickets (Jun 1 – Aug 29, 2026). Tags were ignored per instruction — e.g., invoice complaints tagged "how-to"/"bug" — and themes were assigned from body text only. All 80 tickets map to exactly 5 distinct body-text families; no orphan texts, so 5 themes. Portfolio ARR in file: 24 distinct accounts, sum = $284,800 (each account appears in exactly one theme; verified no overlap). Ranking below is by ARR exposure, not ticket volume. === RANKED BY ARR EXPOSURE === 1. HRIS PROVISIONING FAILURES — BROAD PATTERN (enterprise) Count: 12 tickets (15.0% of 80) | Distinct accounts: 3 (C-0B2213A9, C-0DDFC9A7, C-0F6C0F34) ARR: 36,000 + 48,000 + 30,000 = $114,000 (40.0% of 284,800) Tickets: IC-460062, IC-460053 Recommendation: Treat as P1 outage — new-hire provisioning is silently failing with no log errors; escalate to engineering for the three enterprise accounts. Note: C-0B2213A9 alone filed 7 of 12; pattern spans all 3 accounts regardless. 2. REDEMPTION / GIFT-CARD CHECKOUT FAILURES — BROAD PATTERN Count: 18 tickets (22.5%) | Distinct accounts: 7 (C-14264ABD, C-0B827671, C-0B0F1BAB, C-0D9CA315, C-0FCCD2DF, C-0CEF69FD, C-0F876796) ARR: 11,000 + 10,700 + 10,300 + 9,600 + 9,600 + 8,900 + 8,700 = $68,800 (24.2%) Tickets: IC-460025, IC-460038 Recommendation: Add a checkout/gift-card-ordering status page + retry-safe ordering (points must not deduct on failed orders) before renewal season. 3. INVOICE SEAT-COUNT AND RENEWAL-PRICING ERRORS — SINGLE-ACCOUNT NOISE (highest volume concentration) Count: 16 tickets (20.0%) | Distinct accounts: 1 (C-0E9C27D1 — every ticket) ARR: $52,000 (18.3%) Tickets: IC-460071, IC-460078 Recommendation: Escalate to named-executive remediation for C-0E9C27D1: reissue invoices at 150-seat tier, refund the tier-price delta, and halt the "how-to/bug" tag churn masking this as scattered tickets. Classified as single-account noise, not a broad pattern — zero other accounts report billing issues. 4. POINTS NOT POSTING TO BALANCES — BROAD PATTERN (high volume, low ARR) Count: 20 tickets (25.0% — highest volume) | Distinct accounts: 9 (C-0D0B047C, C-0D3278C7, C-0D284E42, C-0D6CC8E3, C-0BF20542, C-0BE96399, C-21FEBCBB, C-0B2895EF, C-0DD0626C) ARR: 4,500 + 3,500 + 3,400 + 4,200 + 4,500 + 2,700 + 2,900 + 2,900 + 2,500 = $31,100 (10.9%) Tickets: IC-460004, IC-460007 Recommendation: Build a balance-reconciliation job that detects and backfills stuck recognition deliveries automatically; 9 SMB accounts × ~3 tickets each is a churn-risk grinding pattern. 5. SLACK INTEGRATION BREAKAGE (sync, re-auth, slash commands) — BROAD PATTERN, mostly one account Count: 14 tickets (17.5%) | Distinct accounts: 4 (C-10A56B0F, C-8C2E8F00, C-0B843542, C-0BA71F12) ARR: 5,400 + 5,200 + 4,400 + 3,900 = $18,900 (6.6%) Tickets: IC-460047, IC-460046 Recommendation: Fix token refresh/re-auth persistence in the Slack app and harden slash-command error handling; lowest ARR exposure but a core-workflow failure for daily users. === BROAD vs NOISE SUMMARY === - Broad patterns: HRIS (3 accounts), Redemption (7), Points (9), Slack (4) — recurring issues across independent accounts with identical symptom text. - Single-account noise: Theme 3 is entirely C-0E9C27D1 (16 tickets = 20% of all volume from one account); within themes, C-0B2213A9 (7 HRIS tickets) and C-0BA71F12 (6 Slack tickets) are repeat filers, not independent corroboration. - ARR share arithmetic: 114,000/284,800 = 40.0%; 68,800/284,800 = 24.2%; 52,000/284,800 = 18.3%; 31,100/284,800 = 10.9%; 18,900/284,800 = 6.6% (sums to 100.0%). - Ticket counts: 12 + 18 + 16 + 20 + 14 = 80 ✓ Missing data note: the file contains ARR per account but no renewal dates, CSAT, or resolution timestamps — churn-risk prioritization beyond ARR exposure cannot be computed from what was provided.
Prospect C-82AF3719: Technology, Mid-Market, employee_recognition, NA-West. Screen — of 25 customers, only 8 have has_case_study=true; scored each on 4 matching fields (industry, size_band, use_case, region): - C-FEFCC020 (Education, Enterprise, wellness, NA-East): 0/4 - C-11209339 (Manufacturing, SMB, peer_milestones, APAC): 0/4 - C-9D69D147 (Financial Services, Mid-Market ✓, retention, NA-West ✓): 2/4 - C-11C31562 (Manufacturing, Mid-Market ✓, employee_recognition ✓, NA-West ✓): 3/4 - C-CD4829A7 (Technology ✓, Mid-Market ✓, retention, NA-East): 2/4 - C-0CE315B2 (Education, SMB, wellness, EMEA): 0/4 - C-64171065 (Technology ✓, Mid-Market ✓, employee_recognition ✓, NA-East): 3/4 - C-A13C193D (Technology ✓, Mid-Market ✓, retention, NA-West ✓): 3/4 Three customers tie at 3/4. Tie-break: use_case weighted highest (it's the story social proof tells), then industry, then size_band, then region — so the ranking is by which single field is missed, least-damaging miss first. Rank 1 — C-64171065 (3/4) Matches: industry (Technology), size_band (Mid-Market), use_case (employee_recognition). Misses only region (NA-East vs NA-West). Why first: only match that shares both industry and use case with the prospect. Rank 2 — C-11C31562 (3/4) Matches: size_band (Mid-Market), use_case (employee_recognition), region (NA-West). Misses industry (Manufacturing vs Technology). Rank 3 — C-A13C193D (3/4) Matches: industry (Technology), size_band (Mid-Market), region (NA-West). Misses use_case (retention vs employee_recognition) — ranked last because a different use case weakens the product-relevance of the proof. Notes: - All three ranked customers have has_case_study=true in customers.csv; no customer without a case study is named. - The provided files contain no billing data or contact names, so none are included. - Region is the only field no rank-1 candidate matches exactly; if NA-West locality matters more to you than industry, swap ranks 1 and 2 — the top-3 set is unchanged.
# Channel Performance — Trailing 6 Months (2026-03 through 2026-08) Window check: both files cover 2026-03 to 2026-08; contact SQM dates span 2026-03-01 to 2026-08-28. All arithmetic below uses monthly spend × 6 and the 122 contact rows (no duplicate contact_keys). ## Paid channels | Channel | Spend | SQMs | SQOs | $/SQM | $/SQO | SQM→SQO | Pipeline | Pipeline/$ | |---|---|---|---|---|---|---|---|---| | paid_search | $36,000 (6×$6,000) | 40 | 18 | $900.00 | $2,000.00 | 45.0% | $720,000 | $20.00 | | linkedin_ads | $24,000 (6×$4,000) | 25 | 8 | $960.00 | $3,000.00 | 32.0% | $96,000 | $4.00 | | webinars | $9,000 (6×$1,500) | 12 | 5 | $750.00 | $1,800.00 | 41.7% | $60,000 | $6.67 | | paid_social | $18,000 (6×$3,000) | 0 | 0 | UNDEFINED | UNDEFINED | UNDEFINED | $0 | UNDEFINED | Arithmetic examples: paid_search $/SQM = 36,000/40 = $900; $/SQO = 36,000/18 = $2,000; pipeline/$ = 720,000/36,000 = $20.00. Webinars $/SQO = 9,000/5 = $1,800; pipeline/$ = 60,000/9,000 = $6.67. paid_social has $18,000 of spend and zero SQM/SQO rows in the contacts file, so cost per SQM, cost per SQO, SQM→SQO rate, and pipeline per dollar are **undefined (division by zero), not zero**. Pipeline is $0 only in the sense that no attributed contacts exist — this is a measurement/attribution gap, not proven zero performance. ## Organic channels (no spend rows in channel_spend.csv) | Channel | Volume | SQO rate | Pipeline | |---|---|---|---| | organic_search | 30 | 33.3% (10/30) | $90,000 (10×$9,000) | | referral | 15 | 40.0% (6/15) | $48,000 (6×$8,000) | | Organic combined | 45 | 35.6% (16/45) | $138,000 | Cost per SQM/SQO and pipeline per dollar cannot be computed for organic — the spend file contains no rows for organic_search or referral. "$3–5K pipeline per volume" style ROI on zero spend is not computable here, only volume and conversion. ## Data-quality flags: SQO date precedes SQM date - CT-000041 — channel linkedin_ads — SQM 2026-06-14, SQO 2026-06-09 (SQO 5 days before SQM) — pipeline $12,000 - CT-000044 — channel linkedin_ads — SQM 2026-07-23, SQO 2026-07-18 (SQO 5 days before SQM) — pipeline $12,000 Both flags are in linkedin_ads: 2 of its 8 SQOs (25%) have impossible date sequences. If both were excluded, linkedin_ads becomes 6 SQOs, $72,000 pipeline, $4,000/SQO, 24.0% rate, $3.00 pipeline/$. No other channel has flags. ## Data caveats - pipeline_amount is uniform per channel (paid_search $40,000; linkedin_ads and webinars $12,000; organic_search $9,000; referral $8,000) — looks like a fixed convention, not observed deal sizes. - First-touch attribution only; pipeline, not closed-won revenue. No stage or loss data provided. ## Reallocation recommendation 1. Shift budget toward paid_search — best on every paid metric: $20.00 pipeline/$, $2,000/SQO, 45% conversion. It carries 71% of attributed pipeline ($720K of $1.014M) on 48% of spend. 2. Hold or modestly increase webinars — cheapest SQM ($750) and SQO ($1,800) with $6.67 pipeline/$, but n=12 is small; scale carefully. 3. Pause paid_social pending an attribution fix — $18,000/6 months with zero traceable contacts. The metrics are undefined, not bad; either the tracking is broken or spend is truly orphaned. Do not treat this as evidence the channel can't work; treat it as unmeasurable. 4. Do not reallocate away from linkedin_ads yet — fix the date hygiene first. Its $4.00 pipeline/$ looks weak, but 2 of 8 SQOs are flagged, and even the clean reading ($3.00–$4.00/$) rests on ~6 usable conversions. Re-audit attribution, then re-judge in a quarter. ## Confidence by sample size - paid_search: MODERATE-HIGH — n=40 SQMs, 18 SQOs, consistent across all 6 months. - organic_search: MODERATE — n=30, 10 SQOs, but no spend data means no efficiency denominator. - referral: LOW-MODERATE — n=15, 6 SQOs; wide intervals around 40%. - webinars: LOW-MODERATE — n=12, 5 SQOs; one extra/missing conversion swings rate ±8pts. - linkedin_ads: LOW — n=25, 8 SQOs, 2 with data-quality flags (effective n≈6); rates unstable. - paid_social: NONE — zero sample; metrics undefined. Any conclusion about it would be invented. Overall: direction (paid_search strongest paid channel, paid_social unmeasured) is trustworthy; the fine ratios for linkedin_ads, webinars, and referral are not, given single-digit SQO counts.
# Battlecard: Rivally (updated 2026-09-08) Sources: competitor_snippets.csv, deals_with_competitor.csv, existing_battlecard.md. Rep-opinion call notes (S09, S21) are excluded throughout. **Positioning (one line):** Points-based recognition platform with an engaging points feed [S02, S16], rooted in mid-market [S04], now pushing into EU enterprise with multi-language support and EU data residency [S12, S15]. **Pricing (newest source wins)** - Current list: $7/user/month, Recognition Starter, annual billing required — pricing page, 2026-08-12 [S17]. - Conflict noted: pricing pages on 2026-01-20 [S03] and 2026-04-01 [S08] showed $5/user/month for the same tier. S17 supersedes; the increase occurred between 2026-04-01 and 2026-08-12. - Deal mentions: $6.50/user/mo quoted to a 500-seat prospect, annual term, 2026-06-02 [S13]; prospect-reported $7 list with 15% discount for a 3-year term, 2026-08-14 (secondhand, corroborates S17) [S18]. The $6.50 quote predates the $7 page and can't be attributed to either list. - Rivally Pulse is priced as a separate add-on, not bundled; no price given [S23]. - Not in data: our list price — no list-vs-list comparison possible. **Where they win** - Engaging points-based recognition feed [S02, S16]. - Fast deployment: mid-market setup under a week, Slack worked out of the box [S04]. - EU: multi-language support praised by EU enterprise [S12]; EU data residency GA + Dublin office [S15]; EU data residency pitched live in a deal [S05]. - Support responsiveness under 4 hours [S22]. **Where we win** - Analytics depth: limited analytics [S02], basic dashboards vs enterprise tools [S07], CSV-only exports [S20]; an 800-seat prospect chose Bonusly over Rivally citing analytics depth [S25]. - Admin/IT fit: no SCIM provisioning, manual user management [S10]; admin tooling lags peers [S16]; no bulk recognition editing [S24]. - EMEA rewards catalog thinner than US catalog [S14]. **Objections and responses** (grounded only in cited data) 1. "Rivally is cheaper / will discount." — List is $7 annual [S17]; discounting appears in deal mentions: 15% for 3-year term [S18], $6.50 quote [S13]. Response: compare total cost including admin and reporting burden; multi-year lock-in plus CSV-only exports raises future exit cost [S18, S20]. 2. "Rivally is stronger for EU / has data residency." — Concede the investment is real [S15, S12]. Counter: EMEA rewards catalog is thinner than US [S14] — compare catalog coverage if reward choice matters. 3. "Their feed is more engaging." — Concede [S02, S16]; pivot to analytics: basic dashboards [S07], CSV-only exports [S20], 800-seat analytics-depth win [S25]. 4. "Their support answers in under 4 hours." — Do not contest; no data on our SLA in the provided files. Pivot to ongoing admin load: no SCIM [S10], no bulk editing [S24]. 5. Incumbent: "Switching off Rivally is painful." — True per buyer reports: CSV-only exports made migration hard [S20]. Scope migration effort early; we have no data on our migration tooling. **Recent changes** - 2025-11-04: $40M Series C led by Northgate Ventures [S01]. - 2026-03-05: launched Rivally Pulse, lightweight engagement survey add-on [S06]. - 2026-05-09: hired ex-Workday VP EMEA to lead European expansion [S11]. - 2026-07-01: opened Dublin office; EU data residency GA [S15]. - 2026-08-12: Recognition Starter list $5 → $7/user/mo [S17 vs S03, S08]. - 2026-08-20: Microsoft Teams app v2 in public preview [S19]. - 2026-09-01: Pulse exits beta; priced as add-on, not bundled [S23]. **Our 12-month win/loss record vs Rivally, 2025-09 → 2026-08 (deals_with_competitor.csv)** - 20 deals: 13 wins, 7 losses → 65% win rate. - Arithmetic: wins 1+2+1+1+2+2+1+0+0+1+1+1 = 13; losses 1+0+1+1+0+0+1+2+1+0+0+0 = 7; 13/20 = 65%. - Trend: H1 (Sep 2025–Feb 2026) 9W–3L = 75%; H2 (Mar–Aug 2026) 4W–4L = 50%; losses cluster Mar–May 2026 (three straight). Overlap with their Pulse launch [S06] and EMEA expansion [S11] is timing only — no causal claim is supported. - Loss reasons: none recorded in the provided data. - Post-window signal: Sep 2026 deal mention, 800-seat prospect chose Bonusly citing analytics depth [S25] (not in the 20-deal tally). **Corrections from the old card** - "Lacks a Slack integration" — CONTRADICTED by 2026-02-02 review; removed [S04]. - "Acquired by WorkHuman in 2025" — UNVERIFIED: no snippet mentions WorkHuman or any acquisition; only funding fact is the Nov 2025 Series C [S01]. Do not use. - "$5/user/mo (as of 2026-01)" — superseded by $7 [S17]. - "Points-based recognition, mid-market" — re-verified [S02, S04], extended with EU enterprise push [S12, S15]. - "Strong in EU enterprise with multi-language" — re-verified [S12], updated with GA residency [S15]. **Data gaps:** our pricing, SLA, and migration tooling; Rivally loss reasons; net-effective pricing beyond the two deal mentions [S13, S18]; seat counts for the 20 tracked deals.
**Sequence performance (totals across steps)** | Sequence | Sent | Open | Reply | Meeting | |---|---|---|---|---| | New Logo Nurture | 1,386 | 490 = 35.4% | 90 = 6.49% | 27 = 1.95% | | Expansion Nurture | 875 | 565 = 64.6%* | 59 = 6.74% | 12 = 1.37% | | Cold Outbound - HR Leaders | 1,785 | 545 = 30.5% | 8 = 0.45% | 0 = 0.00% | | Cold Outbound - People Ops | 1,163 | 340 = 29.2% | 29 = 2.49% | 6 = 0.52% | *inflated — see tracking error. **Weakest step per sequence** (step 3 is weakest everywhere; reply rates: New Logo 18/428 = 4.21%; Expansion 12/275 = 4.36%; HR Leaders 1/590 = 0.17%; People Ops 6/377 = 1.59%). **Tracking error:** Expansion Nurture step 2 shows opened 340 > sent 300 (113%). Every rate on that step is unreliable; the 64.6% sequence open rate is overstated. Correct numerator unknown from this data. **Failure mode, under 2% reply:** - Cold Outbound - HR Leaders (0.45%): opens exist (40.0% step 1) but replies don't — a copy/relevance failure, not deliverability. Only 1 meeting ever, zero on 600 step-1 sends. - Cold Outbound - People Ops (2.49% overall, but step 3 at 1.59%): open rates decay 37.5% → 21.2% across steps; late-stage steps go unread. **Audience overlap** (940 unique contacts in file): 21 contacts sit in both Cold Outbound - HR Leaders and Cold Outbound - People Ops (e.g. CT-001217, CT-001153, CT-001227); 2 sit in both New Logo Nurture and Expansion Nurture (CT-000301, CT-000624). Cold lists are also being double-touched across the two cold sequences. Separately, unique contacts per sequence (New Logo 299, Expansion 157, HR 290, People Ops 217) don't reconcile with sent counts (500/300/600/400) — the audience file appears to be a sample; membership totals as given don't match send volume. **One change per weak sequence:** - New Logo Nurture: rewrite step 3 (open 28.0%, reply 4.21% — steepest decay). - Expansion Nurture: fix step 2 open tracking before any copy change. - Cold Outbound - HR Leaders: rebuild step 1 messaging/offer (reply 0.83% at 600 sends). - Cold Outbound - People Ops: rewrite step 3 (open 21.2%, reply 1.59%). **Fix first:** Cold Outbound - HR Leaders — 0.45% reply, 0 meetings on 1,785 sends; largest waste, worst yield.
MARKETING GOALS UPDATE — Q3-2026 (day 66 of 92; 71.7% elapsed, 26 days remain) ``` Metric QTD actual Target Delta vs target % of target Linear pace (66/92) Pace verdict SQMs 230 300 -70 76.7% 215.2 AHEAD (+14.8) SQOs 84 120 -36 70.0% 86.1 BEHIND (-2.1) DS2s 40 75 -35 53.3% 53.8 BEHIND (-13.8) Closed-lost MIA rate 20% (5/25) <=10% +10 pts (worse) 2.0x ceiling n/a (rate) OFF TARGET Same-quarter closes 10 20 -10 50.0% 14.3 BEHIND (-4.3) Active pipeline $3,000,000 $4,000,000 -$1,000,000 75.0% $2,869,565 AHEAD (+$130,435) ``` Arithmetic: - Elapsed share: 66 / 92 = 0.7174 (71.7%). Linear expected-to-date = target x 0.7174: SQMs 300 x 0.7174 = 215.2 | SQOs 120 x 0.7174 = 86.1 | DS2s 75 x 0.7174 = 53.8 | closes 20 x 0.7174 = 14.3 | pipeline $4,000,000 x 0.7174 = $2,869,565. - MIA rate = closed_lost_mia / closed_lost_total = 5 / 25 = 0.20 (20%) vs 0.10 target. Delta = 0.20 - 0.10 = +0.10 (10 pts in the wrong direction; lower_better). It is a rate, not a cumulative count, so no linear pacing applies — it must hold under 10% all quarter and currently fails at every point. - Pipeline coverage vs target = $3,000,000 / $4,000,000 = 0.75x (75%), vs 71.7% of the quarter elapsed. - Required run-rates over the remaining 26 days (vs current QTD daily pace = QTD actual / 66): SQMs (300-230)/26 = 2.7/day vs 230/66 = 3.5/day (achievable at current pace) SQOs (120-84)/26 = 1.38/day vs 84/66 = 1.27/day (slightly above current) DS2s (75-40)/26 = 1.35/day vs 40/66 = 0.61/day (needs ~2.2x current pace) Same-quarter closes (20-10)/26 = 0.38/day vs 10/66 = 0.15/day (needs ~2.5x current pace) Pipeline $1,000,000/26 = $38.5K/day vs $3,000,000/66 = $45.5K/day (achievable at current build rate) What moved this week: The data provided is cumulative QTD only — there is no prior-week snapshot or weekly series in the files, so I cannot isolate what specifically moved this week, and I won't guess. At the quarter level, the picture is: SQMs (230 vs 215.2 expected) and active pipeline ($3.0M vs $2.87M expected) are the two metrics running ahead of pace, while SQOs are marginally behind (-2.1). The pressure points are DS2s (40 of 75, needing a 2.2x acceleration to hit target) and same-quarter closes (10 of 20, needing 2.5x), with closed-lost MIA rate sitting at double its ceiling (20% vs 10%) — a standing miss rather than a pacing issue. With 26 days left, SQMs and pipeline can land on current trajectory; DS2s and closes require step-change weeks to close the gap.
Q3 weighted forecast is 115,976.75: 44,729 COMMIT + 0.35 x 203,565 (71,247.75), PIPELINE weighted at zero. 32 deals worth 227,575 are dated October, including COMMIT Deal-D348E1 (13,770, 2026-10-15) and 9 BEST_CASE worth 28,240, so decide now whether to pull those dates in or re-baseline. Caveat: all 7 in-quarter COMMIT deals have empty why-buys, so the 44,729 base has no documented reason to buy behind it.
Subject: Following up — pricing for your 150 seats Hi [Name], Circling back on my note from August 5, which included the recap of our July 28 demo and pricing for 150 seats. Since the automated milestone awards and the points catalog stood out to your team, I'd be glad to walk through the pricing, answer any questions, or talk through what a rollout could look like next to the manual birthday and anniversary tracking you have today. Do you have 15 minutes this week or next for a quick call? Best, Alex Franklin --- (78 words. Referenced touch: the 2026-08-05 email with the demo recap and 150-seat pricing. Ask: a 15-minute call. Recipient name not in the data, so a placeholder is used — the VP People is unnamed in the history.)
WEEKLY GTM DIGEST — Week of 2026-08-31 Marketing came in at 46 SQMs against a weekly target of 52 — 46/52 ≈ 88.5% attainment, a 6-SQM gap to close. The webinar channel did the heavy lifting, delivering 18 of those 46 SQMs (18/46 ≈ 39% of the week's total). On the efficiency side, paid search held steady at $150 cost per SQM, so the focus for next week is volume, not cost. Sales converted 14 SQOs and set 9 DS2 meetings, creating $310,000 in new pipeline for the week. The team also logged 3 same-quarter closes — momentum on both the creation and conversion sides of the funnel. Next week's story to watch: how those DS2 meetings progress into the pipeline line. CS saved 2 renewals this week and moved team NPS to 61 — a healthy signal that customers are feeling the love. Three open red-flag accounts head into next week, so that's where attention goes first: save the flags, keep the NPS climbing. PLG added 412 new signups with activation at 31% (0.31 × 412 ≈ 128 activated users). 38 companies reached the aha moment of 10 recognition gives — that's 38/412 ≈ 9% of the week's signups experiencing the core value moment. The gap between 31% activation and 9% aha-reach is the optimization opportunity: more signups to 10 gives faster means more teams hooked on recognition. --- Arithmetic shown: Marketing attainment 46/52 ≈ 88.5%; webinar share 18/46 ≈ 39%; PLG activated 0.31 × 412 ≈ 128; aha reach 38/412 ≈ 9.2%. All other figures (target 52, $150 CPSQM, 14 SQOs, 9 DS2, $310,000 pipeline, 3 closes, 2 renewals saved, NPS 61, 3 red-flag accounts, 412 signups, 31% activation, 38 aha companies) are stated directly in the extracts. No data was available beyond the week of 2026-08-31, so no trend or period-over-period comparisons are included.
PARTNER DIGEST — 2026-08-24 to 2026-09-04 HEADLINE Partner-sourced pipeline: 5 deals, 550,000 total. Arithmetic: 180,000 + 95,000 + 140,000 + 60,000 + 75,000 = 550,000. Deal count: 5 rows in partner_deals.csv, all utm_source = Partner. ACTIVE PARTNERS Apex Rewards Co — 2 sourced deals, 275,000 (180,000 + 95,000). Deals: Deal-DDAAF2 (180,000), Deal-2CF33E (95,000). Status: co-webinar locked for 09-15. Both opps in DS1 per Slack (08-25) and logged with UTM Source = Partner, consistent with the deal file. Slack count (2 sourced opps) matches deal-file count (2). HRCloud Partners — 1 sourced deal, 140,000. Deals: Deal-F1CDA5 (140,000). Status: integration referral closed the security review and moved to DS2 (08-27). Slack count (1 sourced opp) matches deal-file count (1). CultureBridge — 2 sourced deals, 135,000 (60,000 + 75,000). Deals: Deal-096E1D (60,000), Deal-067213 (75,000). Status: lunch-and-learn produced both opps; both early stage per Slack (08-29). Slack count (2 sourced opps) matches deal-file count (2). WorkWell Group — 0 sourced deals, 0. Status: no sourced deals this period (09-02). Wants to restart the joint playbook in Q4; planning call booked for 09-09. QUIET PARTNERS Recogniq — No sourced deals or period activity in the available data. KudosWave — No sourced deals or period activity in the available data. PeopleFirst Advisors — No sourced deals or period activity in the available data. TotalPerk — No sourced deals or period activity in the available data. RECONCILIATION Slack-sourced opp count: 2 (Apex) + 1 (HRCloud) + 2 (CultureBridge) + 0 (WorkWell) = 5, matching the 5 deal rows. All 5 deals carry utm_source = Partner, consistent with Slack logging notes. DATA NOTES - Amounts are shown exactly as given in partner_deals.csv; currency/denomination is not specified in the data. - The deal file has no date or stage columns; period attribution and stage detail (DS1, DS2, "early stage") come from the Slack export only. - Slack covers 2026-08-24 to 2026-09-04; the digest period reflects that window.
Q1. Yes. 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. A copy is 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. The current subprocessor list is maintained 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 also available on that plan). [P5] Q7. Production databases are backed up daily; backups are encrypted and retained for 35 days. [P6] Q8. Unanswerable from the excerpts. The excerpts state no ISO 27001 certification and do not address it. This would be answered by the company's certification/compliance documentation (e.g., the certifications section of the trust portal or a security whitepaper). [excerpts P1-P8] Q9. Unanswerable from the excerpts. No uptime SLA percentage is stated. This would be answered by the service agreement (MSA) or SLA addendum. [excerpts P1-P8] Q10. Unanswerable from the excerpts. No statement on HIPAA Business Associate Agreements. This would be answered by the company's legal/contract terms (e.g., a DPA or HIPAA compliance documentation). [excerpts P1-P8]
Reconciliation complete. 15 findings: 1 CRITICAL (circular chain), 3 CRITICAL (dangling targets), 10 WARNING, 1 INFO. Arithmetic below uses only the manifest and skill bodies provided.
---
## 1. ALWAYS-trigger phrase overlap / duplication — WARNING · MERGE
**Finding:** `comms-drafter` and `email-drafter` duplicate each other on five verbatim ALWAYS triggers and ~15 shared scenario phrases:
| Shared trigger phrase | comms-drafter | email-drafter |
|---|---|---|
| "write me an email" | yes | yes |
| "draft a follow-up" | yes | yes |
| "help me reply" / "help me reply to this" | yes | yes |
| "what should I say" | yes | yes |
| "bump email" | yes | yes |
Overlapping scenario lists in both descriptions: outbound prospecting, follow-ups, post-demo recaps, pricing follow-up, contract follow-up, end-of-quarter pushes, renewal/expansion emails, QBR follow-ups, onboarding check-ins, pasted-message review. Each skill points to the other as a lane marker ("For deep deal strategy, use deal-strategy-coach — this skill drafts, that skill diagnoses" / "For deal strategy... use deal-strategy-coach instead"), so neither resolves the collision — both fire on the same asks.
Counting character overlap is not computable from the manifest alone (manifest gives only total description chars: 996 vs 965; per-phrase lengths are not provided — data gap, stated explicitly).
**Proposal — MERGE:** fold `email-drafter` into `comms-drafter` (comms-drafter is the superset: it covers everything email-drafter covers plus Intercom, partner, and broker channels). Gmail-signature and no-markdown-in-body rules move into comms-drafter. Rationale: one skill owns ALL external copy; the signature extraction block is execution detail, not a separate trigger surface. No description rewrite needed for the survivor (996 ≤ 1,024).
A second, narrower overlap — INFO: `weekly-pipeline-report` ("generate the pipeline report", "update the pipeline", "what does pipeline look like") vs `pipeline-intelligence-report` ("run the pipeline report", "pipeline update", "what's the pipeline look like"). "Pipeline report/update" collides; only the sentence "Delegate to pipeline-intelligence-report if the user wants the full scored pipeline instead" in next-to-close and PIR's "Master pipeline scoring skill" line attempt disambiguation — weekly-pipeline-report has no de-confliction clause.
**Proposal — TRIM_DESC (weekly-pipeline-report):** remove the generic "pipeline report/update" phrasings from its trigger list, keep the concrete disambiguators ("weekly pipeline performance update", SQM/SQO/DS2, bookings MTD, "mid-month pipeline check"), and add a one-line boundary: scored/tiered pipeline → pipeline-intelligence-report.
## 2. Circular delegation chain — CRITICAL · REVIEW
**Finding:** a two-skill cycle, both edges explicit in the bodies:
- `deal-strategy-coach` → `email-drafter`: "When drafting manager-to-prospect emails, use the `email-drafter` skill..."
- `email-drafter` → `deal-strategy-coach`: "For deal strategy, diagnosis, or coaching (not email drafting), use deal-strategy-coach instead." (also in the lane marker: "point them to the deal-strategy-coach skill")
A delegation that starts at deal-strategy-coach for a draft can bounce back for the diagnosis, which hands off again for the draft.
**Proposal — REVIEW:** name one skill the drafting owner (consistent with Finding 1: comms-drafter after the merge). Post-merge the cycle dissolves: deal-strategy-coach → comms-drafter (one-way), comms-drafter → deal-strategy-coach (one-way). If the merge is rejected, make deal-strategy-coach→email-drafter one-directional and strip the strategy handoff from email-drafter to a pointer-only note.
## 3. Dangling delegation targets — CRITICAL · REVIEW (×3) + WARNING · REVIEW (×1)
**Finding:** named delegation targets that do not exist in this manifest (14 rows enumerated above; none of the following appear):
| Dangling target | Referenced by | Count of distinct references |
|---|---|---|
| `prospect-research-multithreading` | comms-drafter (×2), email-drafter (×2), deal-strategy-coach (§Cross-skill handoff, "Invoke prospect-research-multithreading whenever...") | 5 |
| `bonusly-brand` | comms-drafter (Step 0: "apply the `bonusly-brand` skill"), email-drafter ("apply the bonusly-brand org skill"), sales-forecast ("Always reference `bonusly-brand` skill"), signalforge-claim-compressor ("use bonusly-brand for those") | 4 |
| `skill-orchestrator` | analysis-validator (§11 step 3), signalforge-feedback (Activation Checklist: "registered in skill-orchestrator") | 2 |
| 8 × `bonusly-*-questions` specialist skills | analysis-validator §12.4 table: `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` | 8 (one row each) |
Also referenced but not resolvable as manifest skills (separate class — file references, not skill delegations): `signalforge-reports` (org skill; 3 path refs in pipeline-intelligence-report, 1 in weekly-pipeline-report), `caveman` (named in claim-compressor §Relationship, explicitly labeled a concept origin, not a delegation), `/mnt/skills/...` absolute paths (environment-dependent). The `bonusly-*` set and signalforge-reports may exist outside this manifest — if so, this finding downgrades to INFO; if they don't, each is a dangling reference.
**Proposals — one per finding:**
1. `prospect-research-multithreading` — REVIEW: 3 skills depend on it for the unknown-recipient and multithreading steps; either import it into the set or replace the invokes with the inline contact-lookup steps those skills already describe.
2. `bonusly-brand` — REVIEW: 4 skills gate their Step 0 / voice on it; import it or inline the pillars (comms-drafter already inlines Vibrant/Real/Progressive — replicate that).
3. `skill-orchestrator` — REVIEW: both references are coordination metadata, not runtime delegation; remove the rows or attach the orchestrator config.
4. `bonusly-*-questions` ×8 — WARNING · REVIEW: if these org skills exist outside the manifest, add manifest rows (fixes drift direction B for 8 skills at once); if not, replace §12.4 delegation with the inline validation queries.
## 4. Version conflict — WARNING · UPDATE_BODY
**Finding:** `analysis-validator` carries two version claims for the same file, both dated May 9, 2026:
- Header: `**Version:** 3.6`, `**Last Updated:** May 9, 2026 (v3.6 — G2-F: ID Resolution...)`
- Changelog rows, newest-first order: `3.6 | May 9, 2026 | G2-F...` then `3.5 | May 9, 2026 | G1-L...` then `3.4 ...` — i.e., 3.5 is listed chronologically *after* 3.6 despite being the older release.
Which survives: **3.6**. The body substantiates 3.6 (G1-A through G1-L and G2-A through G2-F are all defined in §2–§4; the trail template in §7 references G2-F and "Validator: analysis-validator v3.2" — itself a third stale version string, noted below). 3.5 is fully contained in 3.6's body; nothing is lost by dropping it.
**Proposal — UPDATE_BODY:** delete the `3.5` changelog row (and fix the §7 trail template's "v3.2" → "v3.6"); keep the header `Version: 3.6`. Nothing is rewritten beyond removing the superseded row and the stale template string.
## 5. Descriptions exceeding 1,024 characters — INFO
**Finding:** **zero (0)**.
| Skill | Manifest desc chars | > 1,024? |
|---|---|---|
| signalforge-claim-compressor | 1,006 | no |
| pipeline-intelligence-report | 1,006 | no |
| partner-digest | 1,004 | no |
| comms-drafter | 996 | no |
| sales-forecast | 962 | no |
| email-drafter | 965 | no |
| closed-lost-analysis | 897 | no |
| next-to-close | 945 | no |
| deal-strategy-coach | 792 | no |
| stale-pipeline-report | 762 | no |
| signalforge-feedback | 708 | no |
| model-selection | 676 | no |
| analysis-validator | 656 | no |
| weekly-pipeline-report | 656 | no |
**Proposal — none.** No TRIM_DESC required on size grounds. (The TRIM_DESC in Finding 1's second proposal is trigger-overlap-driven, not size-driven.)
## 6. Hardcoded page IDs, dates, and person names in skill bodies — WARNING · UPDATE_BODY (grouped proposals)
**Hardcoded IDs (page/space/record/channel/spreadsheet/owner/stage):**
| Skill | Hardcoded items |
|---|---|
| partner-digest | Confluence cloudId `73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f`; spaceId `1958248479`; folder ID `2286616609`; canonical page IDs `2265382925`, `2236940297`, `2237825028`, `2239365136`, `2238283777`; canonical digest page `2286321666`; Slack user ID `U03QLMBL7AR` |
| signalforge-feedback | Page ID `2295136266`; spaceId `2232811524`; cloudId `73fe98de-...`; parent page `2234417154`; Build Log page `2247295002` |
| sales-forecast | spaceId `2232811524`; cloudId `73fe98de-...`; parent page `2232582148` |
| pipeline-intelligence-report | HubSpot org ID `1973303` (in URL template); stage IDs `150582536`–`150582539`, `1175632767`; AE owner IDs: Bryce Harmon `119337721`, Dana Mercer `83155923`, Cole Ingram `83155924`, Alex Franklin `84342457`, Gavin Porter `1520255671` (labeled "verified May 2026" — a snapshot, contradicting its own live-pull non-negotiable) |
| weekly-pipeline-report | stage-derived property names `hs_v2_date_entered_150582536` / `_150582537`; spreadsheet IDs `1CLZeOsElVDF_LF0ZG_t2nfwvhnZ6bpwqM_nX3WEYzcw`, `1ENuaEcCuLjdKhMvp8FK3Ys1ek5Aw9ZuOZhsHJJFoB_k` |
| stale-pipeline-report | stage IDs (same five); Slack channel ID `C0561C1JCPJ`; HubSpot org `1973303` in link template; stale pipeline URL `https://app.hubspot.com/contacts/1973303/deal/{id}` |
| next-to-close | stage IDs (same five); HubSpot org `1973303` in link template |
| analysis-validator | stage IDs (§12.2, same five); full GTM roster owner IDs (~18 people, §12.3); population anchors "~452,000 provisioned / ~110,097 dormant" (self-labeled "re-verify each session" — drift risk acknowledged in-body) |
| deal-strategy-coach | Playbook Confluence URL containing space slug `SignalForg` and page ID `2257879045` |
**Hardcoded dates:** analysis-validator ("May 4, 2026", "May 9, 2026", "March 28, 2023", "April 26, 2026", "May 2026" ranges); model-selection (`last_checked: 2026-05-19` — self-gating, acceptable); partner-digest ("May 16, 2026", "May 19, 2026", "June 2, 2026", "Q2/Q3 2026"); pipeline-intelligence-report ("March 2023", "May 2026"); closed-lost-analysis ("May 2026", "in the 30-deal AI-field sample from May 2026"); sales-forecast changelog ("April 27, 2026", "July 9, 2026"); signalforge-claim-compressor ("2026-05-09"); stale-pipeline-report changelog ("2026-06-10").
**Hardcoded person names:** analysis-validator §12.3 full roster (Bryce Harmon, Hugo Lindqvist, Dana Mercer, Alex Franklin, Cole Ingram, Gavin Porter; Colleen Perry, Ellie Barton, Ashley Reyer, Megan Franz, Elena Sinclair, Youssef Elkhateeb, Amanda Czenkus; Alaina Loori, Shealagh Coughlin; Ben Castelli; Amani Phipps, John Thomas, Yasmin Wahid) plus escalation names "Manish or Amani" (§3 G1-K, §10); sales-forecast ("Alaina" twice, changelog "Elena → Alaina"); weekly-pipeline-report (title "Ben Lavin · Demand Generation"; "presented... for Ben's review"; "If Ben confirms"); partner-digest ("Amani's threads", "Owner: Amani Phipps"); deal-strategy-coach ("routed to Perseus", "routed to Farid"); closed-lost-analysis (deal/company anecdotes: Softheon, Estee Lauder, MinIO, Aurora Innovation, GCash, LIFTOFF, Nestlé, Ozinga, Ethos Cannabis, StickerYou).
**Proposals — UPDATE_BODY, one per class (6 proposals):**
1. IDs in partner-digest / signalforge-feedback / sales-forecast — move to a shared `references/confluence-targets.md` lookup read at run time; keep one `[LIVE QUERY]` tag where the ID is a runtime parameter.
2. Owner IDs + roster in pipeline-intelligence-report and analysis-validator §12.3 — replace the pinned tables with a `HubSpot:search_owners` live resolution; keep stage IDs as the single §12.2 source of truth (they are system constants, but the DS1/DS2 mis-mapping warning shows why one canonical table must own them).
3. Stage IDs repeated in next-to-close, stale-pipeline-report, weekly-pipeline-report property names — replace with a pointer to analysis-validator §12.2 ("do not redefine, just reuse" — next-to-close already uses this pattern for the signal table; extend it to stages).
4. Dates — convert fixed calendar claims ("as of May 2026", "~452K/~110K anchors", "confirmed May 2026") to `[LIVE QUERY]`-tagged runtime checks; keep changelog dates (those are legitimate release history).
5. Person names in operational logic — replace name-keyed routing ("escalate to Manish or Amani", "present to Ben", "if Ben confirms") with role-keyed routing ("escalate to Finance owner per roster", "present for requester review"); weekly-pipeline-report additionally renames its title from a person to the function ("Weekly Pipeline Report · Demand Gen").
6. Closed-lost-analysis anecdote names — no action; they are cited evidence, not configuration. ( Listed for completeness; no UPDATE_BODY proposed.)
## 7. Manifest drift, both directions
**Direction A — files with no manifest row: none.** Every provided file (analysis-validator, closed-lost-analysis, comms-drafter, deal-strategy-coach, email-drafter, model-selection, next-to-close, partner-digest, pipeline-intelligence-report, sales-forecast, signalforge-claim-compressor, signalforge-feedback, stale-pipeline-report, weekly-pipeline-report) has exactly one matching row, and every row's `declared_name` matches its frontmatter `name`. 14 rows = 14 files.
**Direction B — manifest rows with no file: none.** All 14 rows resolve to a provided file. No 404 rows.
Cross-checking declared metadata against the bodies (drift *within* matched rows, not row drift):
| Check | Result |
|---|---|
| `description_chars` vs actual YAML description | All 14 consistent within ±3 chars (boundaries rounded) — no mismatch |
| `body_lines` vs actual line counts | No row off by more than rounding; **no verifiable mismatch** |
| Version conflict rows | analysis-validator 3.5/3.6 (Finding 4); pipeline-intelligence-report v6 matches its header; all others single-version — clean |
**Proposal — none** for row-level drift in either direction. The within-row metadata (version header vs changelog) is covered by Finding 4's UPDATE_BODY.
---
## Consolidated proposal list
| # | Skill(s) | Severity | Action |
|---|---|---|---|
| 1 | comms-drafter + email-drafter | WARNING | MERGE — email-drafter into comms-drafter (5 verbatim trigger collisions) |
| 2 | weekly-pipeline-report | WARNING | TRIM_DESC — generic "pipeline report/update" triggers; add boundary line to pipeline-intelligence-report |
| 3 | deal-strategy-coach ↔ email-drafter | CRITICAL | REVIEW — circular delegation chain; resolve via #1 or make one-way |
| 4 | comms-drafter, email-drafter, deal-strategy-coach | CRITICAL | REVIEW — dangling target `prospect-research-multithreading` (5 refs) |
| 5 | comms-drafter, email-drafter, sales-forecast, signalforge-claim-compressor | CRITICAL | REVIEW — dangling target `bonusly-brand` (4 refs) |
| 6 | analysis-validator, signalforge-feedback | CRITICAL | REVIEW — dangling target `skill-orchestrator` (2 refs) |
| 7 | analysis-validator | WARNING | REVIEW — 8 `bonusly-*-questions` targets unresolvable in this manifest; add rows or inline §12.4 |
| 8 | analysis-validator | WARNING | UPDATE_BODY — delete changelog row 3.5 (v3.6 survives; also fix §7 template "v3.2") |
| 9 | partner-digest, signalforge-feedback, sales-forecast | WARNING | UPDATE_BODY — Confluence/space/cloud IDs → shared reference file |
| 10 | pipeline-intelligence-report, analysis-validator | WARNING | UPDATE_BODY — owner-ID roster + "~452K/~110K" anchors → live resolution |
| 11 | next-to-close, stale-pipeline-report, weekly-pipeline-report | WARNING | UPDATE_BODY — stage IDs → pointer to analysis-validator §12.2 |
| 12 | analysis-validator, partner-digest, pipeline-intelligence-report, closed-lost-analysis, sales-forecast, model-selection | WARNING | UPDATE_BODY — fixed dates → `[LIVE QUERY]` runtime checks (changelog dates kept) |
| 13 | analysis-validator, sales-forecast, weekly-pipeline-report, partner-digest, deal-strategy-coach | WARNING | UPDATE_BODY — person-keyed routing → role-keyed routing |
| 14 | analysis-validator, pipeline-intelligence-report, sales-forecast | WARNING | UPDATE_BODY — HubSpot org ID `1973303` + Slack channel IDs → config reference |
| 15 | (all) | INFO | Row drift: 0 files without rows, 0 rows without files, 0 descriptions > 1,024 — no action |
Data gaps stated explicitly: (a) per-phrase character counts for the Finding-1 overlap are not derivable from the manifest (only total description chars are given); (b) the `bonusly-*`, `bonusly-brand`, `prospect-research-multithreading`, `skill-orchestrator`, and `signalforge-reports` targets may exist as org skills outside this manifest — the CRITICAL rating assumes the manifest is the complete skill set, per the instruction to reconcile "against its manifest"; (c) `body_lines` was spot-verified for internal consistency, not line-counted against source files, since no row showed a discrepancy.
The file isn't on disk, so every claim below is verified directly against the thread text as provided in the prompt. All ten messages are accounted for; nothing has been added.
RUNBOOK — reward-worker queue backlog
Source: #incident-2026-08-29-reward-queue (resolved), messages M01–M10. Every step cites its message. Steps that changed state are marked [STATE CHANGE]. Baselines and trigger are stated first because later steps verify against them.
TRIGGER AND BASELINES (from thread)
- Alert condition: PagerDuty alert for reward-worker queue depth > 10,000 [M01]
- Normal queue depth: under 500 [M02]
- Normal worker replica count: 3 [M06, "was 3"]
- Feature-flag normal state: auto_recognition_enqueue enabled (inferred from M04 disabling it and M09 re-enabling it to close — the thread never shows a pre-incident check of the flag; needs confirmation)
STEP 1 — Acknowledge and take IC [M01]
- Action: Acknowledge the PagerDuty alert.
- Who: Bryce Harmon.
- Command: none in thread.
- Success verified: not stated in thread beyond the acknowledgment itself.
- Rollback: N/A (no state changed).
STEP 2 — Measure queue depth and inspect the dead set [M02, M03]
- Action: Run `bundle exec rake sidekiq:queue_depth`; inspect Sidekiq dead set.
- Who: Farid Osman.
- Commands: `bundle exec rake sidekiq:queue_depth` [M02]. The dead-set inspection command is NOT in the thread — only its result ("Dead set has 112 jobs, all Redis::TimeoutError from around 13:58") [M03]. Needs confirmation.
- Success verified: output read as 48,213 pending jobs [M02]; dead set 112 jobs, all Redis::TimeoutError from ~13:58 [M03].
- Rollback: N/A (read-only, as far as the thread shows).
STEP 3 — Stop the influx: disable enqueue [STATE CHANGE] [M04]
- Action: Disable the auto-enqueue feature flag.
- Who: Farid Osman.
- Command: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'`
- Success verified: no per-step verification in the thread; the next depth reading (9,400 and falling) comes at M07, which reflects steps 3 and 4 combined.
- Rollback (stated in M04): `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` — actually executed later at M09.
STEP 4 — Clear the dead set [STATE CHANGE] [M05]
- Action: Clear the Sidekiq dead set (112 jobs, all Redis::TimeoutError from ~13:58 per M03).
- Who: Elena Sinclair.
- Command: NOT in the thread — only "While I was in the console I cleared out the dead set." Needs confirmation.
- Success verified: not stated as a separate check in the thread.
- Rollback: NOT stated in the thread. Whether the cleared jobs were requeued or discarded is unknown. Needs confirmation before reuse.
STEP 5 — Scale workers up [STATE CHANGE] [M06]
- Action: Increase reward-worker replicas from 3 to 6.
- Who: Bryce Harmon.
- Command: `kubectl scale deployment/reward-worker --replicas=6`
- Success verified: no per-step verification; queue depth 9,400 and falling ~1,200/min at M07 reflects steps 3–5 combined.
- Rollback (stated in M06): `kubectl scale deployment/reward-worker --replicas=3` — actually executed later at M10.
STEP 6 — Confirm the queue is draining [M07]
- Action: Re-run the depth check and read the trend.
- Who: Farid Osman.
- Command: implied `bundle exec rake sidekiq:queue_depth` (not restated in M07; the command is from M02). Needs confirmation.
- Success verified (thread): 9,400 pending, falling ~1,200/min.
- Derived arithmetic check: 48,213 (M02, 14:04:33Z) − 9,400 (M07, 14:33:41Z) = 38,813 jobs drained over 29 min 8 s ≈ 1,332/min — consistent with the reported ~1,200/min.
- Rollback: N/A (read-only).
STEP 7 — Independent verification of drain [M08]
- Action: Re-run depth check; check Datadog error rate.
- Who: Cole Ingram.
- Commands: `bundle exec rake sidekiq:queue_depth` (stated); the Datadog check command is not in the thread — only the result "Error rate in Datadog back to baseline." Needs confirmation.
- Success verified (thread): depth 0; Datadog error rate at baseline.
- Derived arithmetic: 9,400 (M07, 14:33:41Z) → 0 (M08, 14:47:55Z) = 9,400 jobs in ~14.2 min ≈ 660/min.
- Rollback: N/A (read-only).
STEP 8 — Restore enqueue [STATE CHANGE] [M09]
- Action: Re-enable the auto-enqueue feature flag.
- Who: Bryce Harmon.
- Command: `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'`
- Success verified (thread): 40 new jobs processed cleanly in the next 3 minutes.
- Rollback: not explicitly stated in M09; re-run the M04 disable command (`bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'`), which is the stated rollback direction from M04.
STEP 9 — Restore worker count and close [STATE CHANGE] [M10]
- Action: Scale reward-worker replicas back to baseline.
- Who: Bryce Harmon.
- Command: `kubectl scale deployment/reward-worker --replicas=3`
- Success verified (thread): "Queue stable at 0. Incident resolved."
- Rollback: not stated in the thread; the M06 command pair implies `kubectl scale deployment/reward-worker --replicas=6`, but the thread never performs it. Needs confirmation.
DRAIN-RATE SUMMARY (arithmetic from thread timestamps only)
- 14:04:33Z → 14:33:41Z: 48,213 → 9,400 (Δ 38,813; ≈1,332/min)
- 14:33:41Z → 14:47:55Z: 9,400 → 0 (Δ 9,400; ≈660/min)
- The thread does not attribute drain between steps 3, 4, and 5 — no depth readings exist between 14:08:45Z and 14:33:41Z.
ITEMS NEEDING CONFIRMATION BEFORE THIS RUNBOOK IS REUSED
1. Dead-set inspection command (M03) — result recorded, command not.
2. Dead-set clearing command and method (M05) — result recorded, command not.
3. Whether cleared dead-set jobs were discarded or requeued; no rollback exists for step 4.
4. Datadog check command/method (M08) — result recorded, command not.
5. Depth-check command at M07 is implied, not restated.
6. Rollback for step 9 (scale-up after close) — implied by M06, never executed in thread.
7. Pre-incident state of the auto_recognition_enqueue flag — inferred, never checked in thread.
WHAT THE THREAD DOES NOT CONTAIN (so the runbook does not claim it)
- Root cause of the Redis::TimeoutError failures (M03 shows the error class and ~13:58 onset; nothing confirms why).
- Any per-step verification for steps 3–5 individually; only combined queue metrics afterward.
- Timeline of when the queue first exceeded the 10k alert threshold relative to the 13:58 error onset.
FAILURE SEQUENCE 1. First error 2026-09-03T14:01:12Z — reward-service, ERROR: "Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s" Last normal activity before it: 13:59:30Z (reward-service "job enqueued"). Gap between last INFO and first error: 13:59:30 → 14:01:12 = 1m42s with no log entries. 2. Cascade in order (all from datadog_logs.csv) - 14:01:12Z reward-service ERROR — Redis connection timeout (5s) to redis-primary:6379 - 14:01:20Z, 14:01:30Z, 14:01:40Z reward-service ERROR — "retry exhausted for RewardGiveJob" (3 consecutive in-app retries) - 14:01:40Z sidekiq ERROR — RewardGiveJob failed: Redis::TimeoutError; retrying in 60s - 14:02:28Z sidekiq ERROR — RewardGiveJob failed; retrying - 14:02:30Z sidekiq WARN — "Queue reward depth above 10,000" (backlog forming) - 14:03:05Z api-gateway ERROR — first 502: "upstream timeout calling reward-service /gives" - 14:03:30Z web-app ERROR — first user-facing failure: "Give form submission failed: upstream 502 from api-gateway" - 14:03:31Z – 14:06:47Z sidekiq — 5 more RewardGiveJob retry-failure lines - 14:03:48Z – 14:06:52Z api-gateway — 4 more 502s - 14:04:45Z – 14:06:49Z web-app — 3 more 502 form failures - 14:06:52Z api-gateway 502 — last error in the slice - 14:22:10Z reward-service INFO — "Redis connection restored; resuming job processing" - 14:24:45Z sidekiq INFO — "Queue reward depth below 500" Durations: first error → last error = 14:01:12 → 14:06:52 = 5m40s. First error → Redis restored = 20m58s. Queue above 10,000 (14:02:30) → below 500 (14:24:45) = 22m15s to drain. Direction of propagation: reward-service/Redis → sidekiq retries → queue backlog → api-gateway 502s → web-app form failures. 3. Service and job involved - Service: reward-service, losing connectivity to Redis at redis-primary:6379. - Job: RewardGiveJob on the "reward" Sidekiq queue. - Collateral (from sidekiq_jobs.csv only): RecognitionDigestJob also failed with Redis::TimeoutError — 4 instances (J-00013..J-00016). Job totals: 12 RewardGiveJob (J-00001..J-00012) + 4 RecognitionDigestJob = 16 failed jobs, timestamps spanning 14:01:46Z → 14:05:50Z (4m04s). 4. Datadog query to confirm the first error service:reward-service status:error "Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s" Time range: 2026-09-03T13:59:00Z – 2026-09-03T14:05:00Z, sorted by timestamp ascending. First hit should be 14:01:12Z. If message attributes differ in Datadog, the fallback is: service:reward-service status:error (sort asc) and read the earliest entry. 5. What the logs do not show - Root cause of the Redis timeout: there are no redis-primary logs at all — no memory/eviction, failover, restart, or network events. The slice shows the symptom (timeout), not the cause. - What happened during the 1m42s gap (13:59:30–14:01:12Z) before the first error: no deploy, config change, traffic spike, or host event is present. - Whether the 16 failed jobs were eventually retried successfully: sidekiq_jobs.csv contains failures only; there are no success/completion lines for any job after 14:22:10Z. Job outcome after recovery is unknown. - Mapping between job_ids and log lines: 12 RewardGiveJob rows exist in the CSV but only 6 sidekiq failure log lines appear; the two sources cannot be joined 1:1. - Actual traffic volume: the 5 api-gateway 502s and 4 web-app failures are log entries, not a request count; absence of 502 logs after 14:06:52Z does not prove traffic recovered, and no logs exist between 14:06:52Z and 14:22:10Z except postgres checkpoints. - Intermediate queue depths: only two data points (above 10,000 at 14:02:30Z, below 500 at 14:24:45Z); the backlog curve in between is not shown. - Any alerting/on-call, monitor, or deploy events, and any business-level impact (who the affected gives/recognition items belonged to) — no such fields exist in either file.
Flag summary (9 flags in export; all counts exactly as listed in flags_export.csv) FLAGS WITH CODE REFERENCES (6) 1. recognition_streaks_v2 — ON, segment:beta_companies, 42 companies Controls: app/models/recognition.rb — when enabled, StreakTracker.record(give) runs, so a recognition "give" is recorded toward streaks. No code path shown when disabled. 2. points_budget_guardrails — ON, all_companies, 220 companies Controls: app/services/budget_service.rb — when enabled, BudgetService.new(company).enforce!(giver, points) runs, enforcing budget guardrails when a giver spends points. 3. slack_dm_nudges — ON, segment:region_na, 87 companies Controls: app/jobs/nudge_job.rb — when enabled, SlackDm.send_nudge(user) executes; when disabled, the job returns early and no nudge is sent. 4. redeem_flow_redesign — OFF, targeted_list, 12 companies Controls: app/controllers/redeem_controller.rb — enabled renders RedeemV2Component; disabled renders RedeemV1Component. 5. analytics_dashboard_v3 — ON, segment:tier_three, 65 companies Controls: app/controllers/analytics_controller.rb — when enabled, @dashboard is built with AnalyticsV3.new(company). No else branch is shown in the excerpt. 6. ms_teams_app_v2 — OFF, targeted_list, 9 companies Controls: app/services/teams_installer.rb — when enabled, TeamsAppV2.install(company) runs. FLAGS WITH NO CODE REFERENCE (3) 7. legacy_give_modal — OFF, segment:legacy_plan, 14 companies Not referenced in flag_code.md. What it controls cannot be determined from the provided excerpt. 8. survey_boosters_q3 — ON, segment:legacy_plan, 7 companies Not referenced in flag_code.md. What it controls cannot be determined from the provided excerpt. 9. paused_offboard_cleanup — OFF, no targeting rule, 0 companies Not referenced in flag_code.md, and the export lists no targeting rule and no companies. Fully dormant per the export. TARGETING / COVERAGE NOTES - The export does not name individual companies — only rule types and counts. "targeted_list" flags (redeem_flow_redesign, ms_teams_app_v2) reference explicit company lists that are not included in the provided files. - Segment flags on: beta_companies (42), region_na (87), tier_three (65), legacy_plan (7). all_companies: 220. - Anomaly worth flagging: three OFF flags still show non-zero counts (redeem_flow_redesign 12, ms_teams_app_v2 9, legacy_give_modal 14). The export does not define whether company_count for an OFF flag means companies in the target rule or companies with the flag actively enabled — that distinction cannot be resolved from the provided data. - Two flags target segment:legacy_plan with different counts (legacy_give_modal 14, survey_boosters_q3 7); the export does not explain the difference, and company overlap across any flags is unknowable from counts alone.
NDA-1 — [PARTY A]: **GREEN**
Mutual, 2-year term with 3-year survival, all five standard carve-outs intact, Delaware law, and no exclusivity — nothing off-market.
Driver: clause 5, "No license, no obligation to proceed, no exclusivity," confirming the deal is evaluation-only with no restrictive covenants.
NDA-2 — [PARTY B]: **YELLOW**
Substance is standard (mutual, 3-year term, standard carve-outs, Delaware), but an embedded mutual employment non-solicit with an 18-month post-termination tail is a covenant counsel should vet — enforceability varies by state and it exceeds a bare confidentiality exchange.
Driver: clause 4, "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]: **RED**
Four compounding problems: a broad 3-year non-compete on Recipient ("directly or indirectly... any business that competes" — no field or geographic limit), a 5-year one-way term in [PARTY C]'s favor, Irish governing law with exclusive foreign jurisdiction, and zero carve-outs (no public-domain, prior-knowledge, third-party, independent-development, or compelled-disclosure exceptions) — meaning even lawfully required disclosure would nominally breach.
Drivers: clause 2, "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," plus clause 3, "governed by and construed in accordance with the laws of the Republic of Ireland, and the parties submit to the exclusive jurisdiction of its courts," and the stated absence of any carve-outs.