Mean 0.962 · 31/36 perfect tests · $0.26 total · 36/40 tests completed — remaining tests discarded from study (endpoint timeouts after dedicated retries) · modalities in: text, image, video, audio · out: text · each card: the prompt → the correct answer (gold) → this model's actual answer
Modalities in means what you can send this model: text, images, files, video, or audio. Modalities out means what it can send back. Bench tasks feed text extracts, so modalities do not change the score. They are here so you know what this model can handle in real work.
OWNER RESOLUTION — deals_open.csv × owners.csv
Method: left-join deals.owner_id → owners.owner_id on exact string match; no name guessed for any unmatched id. Computed with Python/Decimal over the two files as given (156 data rows parsed, 0 rows with blank owner_id, 0 rows with malformed field count that affected owner_id or amount).
1) DEALS RESOLVED
156 of 156 (100%). Note: deals_open.csv contains no owner_name column at all, so every deal needed resolution via owner_id.
2) DEALS WHOSE OWNER_ID HAS NO MATCH IN owners.csv
None. Zero unmatched.
Distinct owner_ids present in deals: 119337721 (35 deals), 84342457 (67), 83155923 (24), 83155924 (22), 716654662 (7), 701163055 (1) — all six exist in owners.csv.
3) OWNER IDs MAPPING TO ARCHIVED/DEACTIVATED OWNERS
None of the deal owner_ids map to an archived owner.
The owners table has exactly two archived=true rows — Gavin Porter (1520255671) and Hugo Lindqvist (77260721) — and neither id appears anywhere in deals_open.csv. All six owners carrying open pipeline are archived=false.
4) TOTAL PIPELINE AMOUNT PER RESOLVED OWNER
Arithmetic shown as stage subtotals (count/amount), then the sum:
Bryce Harmon (119337721, active)
DS1 17 deals/645,497 + DS2 7/168,091 + DS3 7/176,400 + DS4 3/50,656 + DS5 1/13,500
= 35 deals, 1,054,144
Alex Franklin (84342457, active)
DS1 6/53,516 + DS2 15/197,800 + DS3 36/303,690 + DS4 5/23,574 + DS5 5/45,730
= 67 deals, 624,310
Dana Mercer (83155923, active)
DS1 2/32,000 + DS2 5/146,975 + DS3 9/105,750 + DS4 5/37,470 + DS5 3/19,000
= 24 deals, 341,195
Cole Ingram (83155924, active)
DS2 11/187,152.35 + DS3 9/96,919.08 + DS4 1/2,760 + DS5 1/1,330
= 22 deals, 288,161.43
Farid Osman (716654662, active)
DS1 6/2,885 + DS2 1/1,249
= 7 deals, 4,134
Elena Sinclair (701163055, active)
DS1 1/2,100
= 1 deal, 2,100
Check: 35+67+24+22+7+1 = 156 deals; 1,054,144 + 624,310 + 341,195 + 288,161.43 + 4,134 + 2,100 = 2,314,044.43 total open pipeline.
Data caveats (stated, not guessed):
- Deal-57FF13 (owner 701163055, amount 2,100) has a short/malformed trailing field set in the source row; owner_id and amount parsed correctly, other fields after entered_current_stage are unreliable.
- No owner-name data exists in deals_open.csv, so resolution relies entirely on the owner_id join.
Checked both files (67 gong rows, 156 deals_open rows; 67 distinct gong deal ids, 156 distinct deal ids — no repeated ids in either file). (a) ORPHANS — 30 of 67 gong rows Arithmetic: gong ids not present in deals_open = 67 − 37 matched = 30 (44.8% of gong rows). Sample aliases (all from gong_calls_by_deal_90d.csv): Deal-8FA85D (60251290957, 46 calls), Deal-8FC3F9 (60251649055, 24 calls), Deal-42B265 (61227242540, 21 calls), Deal-B038F0 (54322940958, 5 calls), Deal-AC944F (63327490589, 5 calls), Deal-C00480 (62533691004, 4 calls). Pattern: 16 of the 30 orphans sit in one id block, 60250446726–60251705714 (Deal-9A43B4, Deal-8FA85D, Deal-36EA09, Deal-605F3C, Deal-E2D34B, Deal-76821A, Deal-D84A2D, Deal-228783, Deal-9897FA, Deal-344163, Deal-5592CC, Deal-DECCF3, Deal-51EA1A, Deal-7C4130, Deal-3B6668, Deal-8FC3F9/3B7945 — i.e. all Deal-8*/Deal-3* 6025-series ids). None of these 30 ids appear anywhere in deals_open. (b) DUPLICATE CONVERSATION KEYS — 0 Arithmetic: rows where calls_90d > distinct_conversation_keys = 0. In fact all 67 rows have calls_90d == distinct_conversation_keys exactly, so there is no within-row duplication and no excess-call signal. Also 0 duplicate hs_deal_id rows (67 rows / 67 distinct ids). Caveat: the same conversation key appearing under two different deals cannot be detected from this data — the file only carries a per-deal distinct count, not the keys themselves. That check is not possible with what was provided. (c) DS3+ OPEN DEALS WITH ≥1 LOGGED CALL — 25 / 85 = 29.4% Arithmetic: - Stage mix of the 156 open deals: DS1 32, DS2 39, DS3 61, DS4 14, DS5 10. - DS3 or later = 61 + 14 + 10 = 85. - Of those 85, present in gong with calls_90d ≥ 1 = 25 (DS3 12, DS4 6, DS5 7). - 25 ÷ 85 = 0.2941 → 29.4%. Inverse: 60 of 85 DS3+ deals have zero logged calls (70.6%). With-call examples: Deal-C6FE92 (DS3, 11 calls), Deal-F9A3C1 (DS3, 9), Deal-5408B0 (DS4, 8), Deal-B7EBD1 (DS5, 8), Deal-D348E1 (DS5, 8). No-call examples: Deal-F0EBBB (DS3), Deal-7BBDFA (DS3), Deal-403845 (DS5), Deal-FD9F4E (DS5). Notes on missing/limited data: gong_owner_id was not used (Gong user id, not a HubSpot owner id — no join attempted). deals_open carries no call fields, so "has a logged call" is defined solely as "deal id appears in the 90-day gong table with calls_90d ≥ 1." Whether a call predates a deal's current-stage entry cannot be checked from this data either (gong rows are deal-level aggregates with first/last call dates only).
```sql
-- NOT COMPLETABLE WITH THE CATALOG AS PROVIDED — required sources are missing.
-- (Stating the gaps rather than inventing tables/columns.)
--
-- MISSING #1: there is no recognition / giving EVENT table in the catalog.
-- No table exposes giver id, recognition id, recipient company id, or giving date,
-- so "unique givers" and "recognition count" per customer per first calendar month
-- cannot be computed from any listed table.
-- Closest listed table: PRODUCTION.PLG.COMPANY_COHORT_SUMMARY — but M1_GIVES is a
-- pre-aggregated month-1 metric (cohort-relative, not first *calendar* month),
-- self-serve only, with no unique-giver measure and no documented company id column.
--
-- MISSING #2: PRODUCTION.DEPERCATED... / PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2
-- documents only STATE ('succeeded' = count it). No columns are documented for
-- company/customer key or event timestamp, so it cannot be scoped to a first
-- calendar month or joined per company as given.
--
-- MISSING #3: no documented "customer start date" keyed to a company id
-- (FIRST_SUB_PAYMENT_DATE exists but sits in COMPANY_COHORT_SUMMARY with no id column;
-- PRODUCTION.CHARGEBEE.SUBSCRIPTIONS has CURRENT_TERM_START but no company key listed).
--
-- RULES THAT WOULD APPLY once the giving/recognition event table and its columns are supplied:
-- * Do NOT apply the deleted-giver filter to historical giving counts (understates history).
-- * Redemptions: STATE = 'succeeded' ONLY, from REDEMPTION_RECORDS_V2 (schema name says
-- DEPRECATED; catalog says confirm before finance-grade reliance).
-- * First calendar month = DATE_TRUNC('month', MIN(customer_start_date)) per company,
-- then filter events to that month; COUNT(DISTINCT giver), COUNT(*), COUNT(redemptions).
-- * Tables explicitly avoided: HUBSPOT_HUB_1973303.V2_LIVE.OBJECTS_DEALS (unpopulated),
-- PRODUCTION.HUBSPOT.DEALS (stale, last sync 2023-03),
-- PRODUCTION.HUBSPOT.GONG_HUBSPOT_MAP_FAST (retired).
-- * Every FROM/JOIN would carry a comment justifying the table choice.
--
-- No query is emitted because emitting one would require inventing a giving-event table
-- and undocumented column names.
```
Audit complete. All figures below are computed from the three provided files (34 company rows, 52 contact rows, 25 enrichment rows), written to /tmp/crm_audit/ for verification.
=============================================================
0. MISSING INPUT — DEALS EXTRACT NOT PROVIDED
=============================================================
The provided files are companies.csv, contacts.csv, zoominfo_enrichment.csv. No deals file exists in the extract or on disk.
- owner, stage, amount, close date, why-buys: 0 deal rows provided → completeness not computable (not 0%, undefined — there is nothing to measure).
- No amount field exists anywhere in the provided data, so "pipeline amount at stake" cannot be computed for any fix. Section 6 ranks by an explicit proxy instead and says so.
=============================================================
1. COMPLETENESS PER FIELD
=============================================================
COMPANIES (n = 34)
domain 34/34 = 100.0%
industry 34/34 = 100.0%
employee_count 25/34 = 73.5% missing 9: C-EC3025, C-96039F, C-44EA29, C-D04904,
C-B23205, C-60C75F, C-7BBDFA, C-50D386, C-93C8BF
hq_country 28/34 = 82.4% missing 6: C-2D1F1B, C-D73B89, C-44EA29, C-D04904,
C-2C60E5, C-EE9FFB
CONTACTS (n = 52)
email present 52/52 = 100.0%
email valid syntax 48/52 = 92.3% (4 broken — see section 4)
email domain-consistent 47/52 = 90.4% (1 mismatch — see section 4)
title 39/52 = 75.0% missing 13: 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
persona 37/52 = 71.2% missing 15: 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
DEALS: no rows → owner/stage/amount/close date/why-buys all undefined.
COVERAGE CONTEXT (not field completeness, but relevant)
enrichment match rate: 25/34 company rows = 73.5% (25/32 distinct domains = 78.1%)
companies with zero contacts: 14/34 = 41.2% (12 distinct domains)
companies with contacts: 20; 2 of those have only 1 contact (C-950043, C-31ED2A)
=============================================================
2. DUPLICATE COMPANY CLUSTERS
=============================================================
companies.csv has NO company-name column (only company_alias codes), so name-variant
matching is impossible on this extract. Clustering below is by shared domain only.
Cluster A — acme-corp.com (2 rows, NO enrichment row)
C-0A092931 industry=Technology emp=500 hq=US
C-0A092932 industry=tech emp=510 hq=USA
Survivor: C-0A092931 (canonical industry casing "Technology" vs variant "tech").
Unresolved conflict: employee_count 500 vs 510 — both listed, no source exists
(acme-corp.com absent from enrichment). Recommend manual verification; do not write
either value as truth. hq US vs USA = same value, format only.
Cluster B — globex.io (2 rows, NO enrichment row)
C-0A092933 industry=SaaS emp=200 hq=US
C-0A092934 industry=Technology emp=200 hq=US
Survivor: C-0A092933 (emp and hq agree; lowest ID).
Unresolved conflict: industry SaaS vs Technology — both listed, no source. Recommend
manual verification; do not auto-pick.
No other clusters. The remaining 30 rows each have a unique domain. Look-alikes with
distinct domains (7bbdfa.com vs 50d386.com — both "health care"/Canada; 2d1f1b.com vs
2d7423.com; 77a95a.com vs aa8dda.com — both 1500 employees) are NOT duplicates: different
domains, no name evidence.
=============================================================
3. WHAT THE ENRICHMENT EXPORT CAN AND CANNOT FILL
=============================================================
FILLED ONLY WHERE A MATCHING ENRICHMENT ROW EXISTS:
employee_count — 8 of 9 blanks fillable, all ZI value = 400:
C-EC3025 (ec3025.com) 400 | C-96039F (96039f.com) 400 | C-44EA29 (44ea29.com) 400 |
C-D04904 (d04904.com) 400 | C-B23205 (b23205.com) 400 | C-60C75F (60c75f.com) 400 |
C-7BBDFA (7bbdfa.com) 400 | C-50D386 (50d386.com) 400
NOT fillable: C-93C8BF (93c8bf.com has no enrichment row) — leave blank.
hq_country — 0 of 6 blanks fillable:
ZI row exists but ZI value also blank: C-2D1F1B (2d1f1b.com), C-D73B89 (d73b89.com),
C-44EA29 (44ea29.com), C-D04904 (d04904.com), C-2C60E5 (2c60e5.com)
No ZI row at all: C-EE9FFB (ee9ffb.com)
These 6 gaps cannot be closed from this export — do not invent values.
industry — 0 blanks, so no fills needed.
CRM vs ENRICHMENT DISAGREEMENTS (both values present):
(a) industry — 10 substantive conflicts, recommend ZOOMINFO as source:
C-66D1FC: CRM "tech" vs ZI "Computer Software"
C-EC3025: CRM "Technology" vs ZI "Computer Software"
C-44EA29: CRM "tech" vs ZI "Computer Software"
C-92D97D: CRM "Technology" vs ZI "Computer Software"
C-D04904: CRM "Technology" vs ZI "Computer Software"
C-77A95A: CRM "Technology" vs ZI "Computer Software"
C-AA8DDA: CRM "Technology" vs ZI "Computer Software"
C-B25F40: CRM "Technology" vs ZI "Computer Software"
C-60C75F: CRM "tech" vs ZI "Computer Software"
C-425E2A: CRM "Tech " (trailing space) vs ZI "Computer Software"
Rationale: the CRM's three spellings (tech/Tech/Technology) all sit exactly where ZI has
one canonical value, and 0 CRM/ZI industry conflicts appear in any other category — the
disagreement is CRM taxonomy drift, not a factual dispute. The other 15 covered rows
agree exactly (Retail, Finance, Healthcare, Manufacturing, health care): no change.
(b) employee_count — 0 conflicts. 17 rows have both values; all 17 match exactly
(e.g., C-77A95A 1500=1500, C-B25F40 120=120). No action beyond the 8 fills above.
(c) hq_country — 0 substantive conflicts, 10 format-only variants:
CRM "US"/"USA" vs ZI "United States" on C-66D1FC, C-950043, C-EC3025, C-96039F,
C-77A95A, C-B23205, C-E51FB7, C-D0662E, C-425E2A, C-2D7423.
Same country, different format. Recommend ZI format ("United States") as canonical
standardization; no factual value changes.
(d) Conflicts with NO available source (both listed, recommend manual verification):
C-0A092931/C-0A092932 employee_count 500 vs 510
C-0A092933/C-0A092934 industry SaaS vs Technology
Rows with no enrichment row (cannot be validated or filled): ba969b.com, 332637.com,
93c8bf.com, ee9ffb.com, c9bb20.com, acme-corp.com (2 rows), globex.io (2 rows)
= 9 rows / 7 domains.
=============================================================
4. INVALID EMAILS AND DOMAIN MISMATCHES
=============================================================
INVALID (4 — all lack a domain part, pattern "userN@"):
CT-0010 C-66D1FC user0@
CT-0080 C-92D97D user0@
CT-0081 C-92D97D user1@
CT-0192 C-425E2A user2@
DOMAIN MISMATCH (1 — valid syntax, wrong domain):
CT-0011 C-66D1FC email=user1@other-domain.com but contact.domain=66d1fc.com
and companies.domain for C-66D1FC = 66d1fc.com
Clean checks (no issues found): contact.domain matches companies.domain on all 52 rows;
every contact.company_alias resolves to a company; no duplicate contact_key values.
=============================================================
5. PROPOSED FIXES (WHAT CHANGES, WHAT STAYS BLANK)
=============================================================
1. Write 8 employee_count values from enrichment (all = 400). Leave C-93C8BF blank.
2. Leave all 6 hq_country blanks blank — enrichment has no value for any of them.
3. Normalize 10 industry values to ZI "Computer Software"; leave the other 15 untouched.
4. Normalize 10 hq_country format variants to "United States" (format only).
5. Merge cluster A into survivor C-0A092931; merge cluster B into survivor C-0A092933;
flag the 2 intra-cluster conflicts for manual review (no source to resolve them).
6. Repair or suppress 4 invalid emails; re-source 1 mismatched-domain contact (CT-0011).
7. Backfill 13 titles and 15 personas — no source in the provided files, so these must
come from a source not supplied here. Do not infer them.
8. Enrich the 9 company rows / 7 domains with no enrichment match (includes both
duplicate-cluster domains and the 2 unfilled gaps: C-93C8BF, C-EE9FFB).
9. Create contacts for the 14 companies with zero contacts (12 distinct domains).
10. Add a company_name column to the extract — without it, name-variant dedupe cannot be
run at all (this is a schema gap, not a value gap).
=============================================================
6. TOP 10 FIXES BY PIPELINE AMOUNT AT STAKE
=============================================================
CANNOT BE RANKED BY AMOUNT: no deals extract was provided, so no amount, stage, owner,
close date, or why-buys value exists anywhere in the data. Any dollar figure here would
be invented. Ranking below uses the stated proxy — distinct company domains affected
(pipeline attaches to companies; no deal→company mapping exists to do better):
rank domains records fix
1 12 15 contact persona missing (71.2% complete)
2 12 14 companies with zero contacts (41.2% of all companies)
3 10 13 contact title missing (75.0% complete)
4 10 10 industry conflict CRM vs ZoomInfo
5 9 9 employee_count blank (8 fillable from enrichment)
6 7 9 no enrichment row (validation impossible)
7 6 6 hq_country blank (0 fillable — manual research only)
8 3 4 invalid emails (user0@, user0@, user1@, user2@)
9 2 4 duplicate cluster rows (acme-corp.com, globex.io)
10 1 1 email domain mismatch (CT-0011)
To rank these by real pipeline amount, supply the deals extract (deal_id, company_alias,
owner, stage, amount, close_date, why_buys) and the same list re-cuts as
sum(amount) per affected domain.
```json
[
{
"transcript_id": "TX-001",
"deal_alias": "Deal-CFE7F4",
"why-buys": [
"Automating anniversary and birthday awards — stated by Prospect (VP People)"
],
"pain_points": [
"HR team of three cannot keep up with anniversary/birthday awards manually — Prospect (VP People)",
"Everything tracked in a spreadsheet and people slip through the cracks — Prospect (HR Admin)"
],
"stakeholders": ["Prospect (VP People)", "Prospect (HR Admin)"],
"budget_signal": "$40k earmarked for engagement tools this fiscal year (prospect-stated, VP People)",
"timeline_signal": "Live before open enrollment in November (prospect-stated); security review agreed for September 12",
"competitor_mentioned": "Achievers — raised by prospect: looked at last year, 'too heavy for a team our size'",
"next_step": "Security review on September 12 — explicitly agreed ('Yes — let's do the security review on September 12')",
"objections": [
"Need SSO and audit logs for IT to sign off — Prospect (HR Admin)"
],
"confidence": "high — every field backed by a direct prospect statement"
},
{
"transcript_id": "TX-002",
"deal_alias": "Deal-70BB30",
"why-buys": [
"Tie recognition to retention for the hourly workforce — stated by Prospect (Head of Total Rewards)"
],
"pain_points": [
"Regretted turnover among hourly workforce is over 30% — Prospect (Head of Total Rewards)"
],
"stakeholders": ["Prospect (Head of Total Rewards)", "Prospect (CFO)"],
"budget_signal": "$25k pilot budget approved by finance for this quarter (prospect-stated, CFO)",
"timeline_signal": "Decision wanted by end of September (prospect-stated, CFO); pilot budget scoped to this quarter",
"competitor_mentioned": "None — prospect stated 'You're the first vendor we've had a real demo with'; no competitor named",
"next_step": "Rep sends pilot agreement; prospect routes it to legal this week — explicitly agreed ('Yes — send the pilot agreement...')",
"objections": [
"Integration with Workday 'has to be rock solid — that's my one condition' — Prospect (CFO)"
],
"confidence": "high — all fields prospect-sourced; note Workday line is a stated condition, listed as objection/requirement"
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why-buys": [
"Make recognition visible across 12 retail locations — stated by Prospect (People Ops Manager)"
],
"pain_points": [
"Store managers have zero budget autonomy for on-the-spot recognition today — Prospect (People Ops Manager)"
],
"stakeholders": ["Prospect (People Ops Manager)", "CEO (named as required approver, not on call)"],
"budget_signal": null,
"timeline_signal": "'No rush on our side until Q1' (prospect-stated); CEO call to be scheduled",
"competitor_mentioned": "Bucketlist — raised by prospect: CEO used it at her last company and liked it",
"next_step": "Call with the CEO to be scheduled; prospect will send two times — explicitly agreed ('Yes, let's schedule a call with our CEO')",
"objections": [
"No urgency until Q1 — Prospect (People Ops Manager)",
"CEO must be sold first; she decides anything people-related — Prospect (People Ops Manager)"
],
"confidence": "high — budget_signal is null because the only pricing figure ($8 per employee per month) was stated by the rep, Alex Franklin, not the prospect"
},
{
"transcript_id": "TX-004",
"deal_alias": "Deal-180D02",
"why-buys": [
"Consolidate three separate recognition tools into one — stated by Prospect (VP People)"
],
"pain_points": [
"Paying for three tools and none of them talk to the HRIS — Prospect (VP People)"
],
"stakeholders": ["Prospect (VP People)", "Prospect (IT Security Lead)", "CFO (referenced as needed approver, not on call)"],
"budget_signal": "Under $15k annually can be approved without going to the board (prospect-stated approval threshold, VP People; no confirmed budget amount)",
"timeline_signal": "Procurement cycle runs six to eight weeks minimum; last vendor's security review took three months (prospect-stated, IT Security Lead)",
"competitor_mentioned": "None — no competitor named by the prospect",
"next_step": null,
"objections": [
"Security review took three months for last vendor — 'that's my hesitation' — Prospect (IT Security Lead)",
"Six-to-eight-week minimum procurement cycle — Prospect (IT Security Lead)",
"CFO follow-up not committed: 'Maybe — I need to check her calendar, no promises' — Prospect (VP People)"
],
"confidence": "high — next_step is null because no step was explicitly agreed; the only commitment offered was 'I'll follow up,' which is the rep's own statement"
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why-buys": [
"Automate service milestones — stated by Prospect (HR Director)",
"Analytics on recognition equity across departments — stated by Prospect (HR Director)"
],
"pain_points": [
"Night-shift teams feel invisible; their engagement scores run 20 points lower — Prospect (People Ops Coordinator)"
],
"stakeholders": ["Prospect (HR Director)", "Prospect (People Ops Coordinator)", "Exec team (presentation audience, not on call)"],
"budget_signal": "$12k approved under the engagement line (prospect-stated, HR Director)",
"timeline_signal": "Running before the January all-hands (prospect-stated); exec presentation set for October 2",
"competitor_mentioned": "Nectar — raised by prospect: 'mid-pilot with Nectar right now, so you'd need to beat that experience'",
"next_step": "Rep presents to the exec team on October 2 — explicitly agreed ('Yes — come present to our exec team on October 2')",
"objections": [
"Exec team is skeptical after a failed rollout two years ago — Prospect (HR Director)",
"Currently mid-pilot with Nectar; must beat that experience — Prospect (HR Director)"
],
"confidence": "high — all fields prospect-sourced"
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why-buys": [
"Cut the admin time on service awards — stated by Prospect (HR Manager)"
],
"pain_points": [
"Personally spends five hours a month ordering and shipping plaques — Prospect (HR Manager)"
],
"stakeholders": ["Prospect (HR Manager)", "COO (named as audience for the one-pager, not on call)"],
"budget_signal": "'Budget isn't the issue — time is' (prospect-stated; no dollar amount given)",
"timeline_signal": "Fiscal year resets in February, so a Q1 start is realistic (prospect-stated); one-pager to be forwarded to COO this week",
"competitor_mentioned": "None external — prospect stated 'Nobody else — we're comparing this against just doing it internally'",
"next_step": "Rep sends one-page overview; prospect forwards it to the COO this week — explicitly agreed ('Yes — send the one-page overview...')",
"objections": [
"COO usually prefers building things in-house — Prospect (HR Manager)"
],
"confidence": "high — budget_signal reflects a prospect statement that budget is not the constraint; no amount was ever prospect-stated, so no figure recorded"
}
]
```
Notes on exclusions (fields deliberately left null, per your rules):
- TX-003 budget_signal: the $8/employee/month figure came from Alex Franklin — rep-sourced, excluded.
- TX-004 next_step: the CFO follow-up was "Maybe... no promises" — not explicitly agreed; rep's "I'll follow up" is rep-sourced.
- TX-002 competitor: no competitor was named by the prospect, only the absence of other demos.
**Three closest to signature:** **1. Deal-547B2B — $11,200** (Alex Franklin, DS5/COMMIT, close 2026-09-11) Why: Slack (Alex, 09-04 09:12) — redlines came back clean, signing page is out, their VP People said they're signing next day; called "signature-imminent." Left: buyer's signature only. **2. Deal-403845 — $9,000** (CRM owner: Alex Franklin, DS5/COMMIT, close 2026-09-11) Why: Slack (Dana Mercer, 09-04 10:02) — "moving fine on my side — the order form is with their finance team." Left: finance-team approval/signature. Data discrepancy: Dana claims it, CRM lists Alex Franklin as owner. **3. Deal-A2B47C — $6,360** (Alex Franklin, DS5/COMMIT, close 2026-09-11) Why: Slack (Alex, 09-04 09:44) — "still warm, just normal legal-review pace." Left: completion of legal review, then signature. Arithmetic: 11,200 + 9,000 + 6,360 = **$26,560** total. Excluded: Deal-2465CE (Slack: champion left, procurement frozen — Dana pulling from commit, now Q4). Deal-D348E1 is warm but close date 2026-10-15. Deal-B7EBD1 ($9,000, COMMIT, 2026-09-10) has no Slack status — data missing on its real progress.
Product-gap candidates: 5 transcript lines reviewed, 2 qualify as real gaps. REAL GAPS 1. SCIM user provisioning Quote: "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." — Prospect (IT Security Lead) Deal: Deal-EC3025 | Amount: not provided in the data Classification: REAL GAP. Docs state: "SCIM user provisioning and ADP Workforce Now integrations are NOT currently listed as supported capabilities." Not a tier difference — absent from all plans. 2. ADP Workforce Now integration Quote: "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us." — Prospect (HRIS Manager) Deal: Deal-D0D6B5 | Amount: not provided in the data Classification: REAL GAP. Same docs line: ADP not a supported capability. The HRIS list is Workday, BambooHR, Gusto, Rippling only. EXCLUDED FROM SUMMARY - Deal-CFE7F4 — "I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?" → PLAN GATE. Custom report builder is Enterprise-tier per docs; capability exists, prospect's plan doesn't include it. - Deal-84DBA6 — "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." → ROLLOUT/ENABLEMENT ISSUE. Slack integration is on all plans and functioning; the failure is manager training. - Deal-36C33F — mobile app gap → EXCLUDED as prospect voice: the line was raised by Alex Franklin (rep), not the prospect. Rep language does not count. Data gaps: no deal amounts or ARR figures appear in either file, so amounts cannot be cited for any deal, including the two real gaps.
## Method (arithmetic shown) - Snapshot: 2026-09-05. 30-day window = 2026-09-05 − 30d = **2026-08-06 through 2026-09-05** (inclusive). - Activities per rep = sum of `emails_30d + calls_30d + meetings_30d` across all deals owned by that rep in `engagements_by_deal_90d.csv`, joined to `deals_open.csv` on `deal_id`. `notes_90d` excluded (asked-for mix is emails/calls/meetings only). - DS2 count = deals whose `t_ds2` falls in the window. - Efficiency ratio = total activities ÷ DS2 entries (lower = more efficient). ## Per-rep results | Rep (owner_id) | Emails | Calls | Meetings | Total | Mix E / C / M | DS2 entries (30d) | Activities per DS2 entry | |---|---|---|---|---|---|---|---| | Alex Franklin (84342457) | 307 | 36 | 41 | 384 | 79.9% / 9.4% / 10.7% | 18 | 384 ÷ 18 = **21.33** | | Bryce Harmon (119337721) | 162 | 0 | 43 | 205 | 79.0% / 0.0% / 21.0% | 4 | 205 ÷ 4 = **51.25** | | Cole Ingram (83155924) | 96 | 14 | 1 | 111 | 86.5% / 12.6% / 0.9% | 2 | 111 ÷ 2 = **55.50** | | Farid Osman (716654662) | 38 | 0 | 34 | 72 | 52.8% / 0.0% / 47.2% | 1 | 72 ÷ 1 = **72.00** | | Dana Mercer (83155923) | 84 | 18 | 11 | 113 | 74.3% / 15.9% / 9.7% | 1 | 113 ÷ 1 = **113.00** | | Elena Sinclair (701163055) | n/a | n/a | n/a | n/a | n/a | 0 | undefined (0 DS2) | Sample arithmetic: Franklin 307 + 36 + 41 = 384; mix = 307/384 = 79.9%, 36/384 = 9.4%, 41/384 = 10.7%. Harmon 162 + 0 + 43 = 205; 162/205 = 79.0%, 43/205 = 21.0%. DS2 entries counted (window 2026-08-06 → 2026-09-05): - Alex Franklin (18): Deal-403845, Deal-1FC049, Deal-3EED2C, Deal-7FA0C3, Deal-E531A6, Deal-5296C9, Deal-36C33F, Deal-EE195F, Deal-F436DA, Deal-317E6F, Deal-D1E6C2, Deal-D9A72E, Deal-CA5E44, Deal-4F775F, Deal-898FC5, Deal-46988D, Deal-E73427, Deal-92D97D - Bryce Harmon (4): Deal-25F752, Deal-D73B89, Deal-CA7DC0, Deal-1CCE5C - Cole Ingram (2): Deal-1BA595, Deal-42326B - Farid Osman (1): Deal-499BF6 - Dana Mercer (1): Deal-57887A - Elena Sinclair (0) ## Efficiency ranking (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 Elena Sinclair unranked: 0 DS2 entries, ratio undefined. **Most efficient rep: Alex Franklin (21.33 activities per DS2 entry).** **Highest-volume rep: Alex Franklin (384 total activities).** They do not differ — the same rep holds both. ## Data gaps (explicit) - Elena Sinclair: her only deal in the snapshot, Deal-57FF13, has no row in `engagements_by_deal_90d.csv`, so her activity totals cannot be computed from this data (not the same as a verified zero). It also has a blank `t_ds2`, hence 0 DS2 entries. - Deal-3EED2C (Alex Franklin) has no row in the engagements table; it is counted as a DS2 entry but contributes 0 activities. - `engagements_by_deal_90d.csv` contains no rows unmatched to a deal; every other deal in `deals_open.csv` has an engagements row. - DS2 counts cover only deals still present in `deals_open.csv`; deals that entered DS2 in the window and closed/were removed before the snapshot are not in this data. - Gavin Porter (1520255671) and Hugo Lindqvist (77260721) are marked archived and appear in no deals or engagement rows; excluded. - Per-rep activity figures come from pre-aggregated `*_30d` columns in the engagements file; the underlying per-activity dates are not provided, so individual activities cannot be re-windowed against 2026-08-06 → 2026-09-05.
All figures below computed from the three provided files (reproduced verbatim at /tmp/qtd_ae/). Quarter = 2026-Q3 (2026-07-01 → 2026-09-30); snapshot = 2026-09-05.
QTD SCORECARD — ALEX FRANKLIN — as of 2026-09-05
1. BOOKINGS VS QUOTA
Quota (quota.csv, 2026-Q3): $200,000
Closed-won with close_date in Q3 (8 deals):
Deal-A1C3E5 2026-07-15 $40,000
Deal-F2C7D8 2026-07-24 $20,000
Deal-B7D2F4 2026-07-31 $35,000
Deal-C9E1A6 2026-08-12 $21,000
Deal-A8B4D6 2026-08-19 $12,000
Deal-D4B8C2 2026-08-21 $11,000
Deal-E6F3A9 2026-09-02 $6,500
Deal-C5D9E2 2026-09-03 $4,500
Bookings = 40,000+20,000+35,000+21,000+12,000+11,000+6,500+4,500 = $150,000
Excluded (closed-won dated before the quarter): Deal-B3E6F1, 2026-06-20, $24,000
Attainment = 150,000 / 200,000 = 75.0% (gap = $50,000)
2. NEW VS EXPANSION SPLIT (closed-won QTD only; deal_type is blank on all lost/open rows)
New: 5 deals = 40,000+35,000+21,000+11,000+6,500 = $113,500 = 113,500/150,000 = 75.7%
Expansion: 3 deals = 20,000+12,000+4,500 = $36,500 = 36,500/150,000 = 24.3%
(113,500 + 36,500 = 150,000 ✓)
3. 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
Total: 125 deals, $1,260,390 (284,621+353,760+552,705+23,574+45,730 = 1,260,390 ✓)
Of that, deals with close_date on/before 2026-09-30: 22 deals, $109,363 (DS2 $5,760 / DS3 $69,399 / DS4 $7,644 / DS5 $26,560).
4. ROLLING 90-DAY DS2-TO-WON RATE
Window = 2026-06-07 → 2026-09-05 (90 days back from snapshot), cohort = deals with entered_ds2 in window: 111 deals.
Outcomes: 8 won, 27 lost, 76 still open (8+27+76 = 111 ✓)
Closed-cohort rate = 8 / (8+27) = 8/35 = 22.9%
Variant counting open deals as not-yet-won = 8/111 = 7.2%
(The 76 open cohort members are in flight; stated explicitly because the data gives no disposition for them.)
5. WINS AND LOSSES (Q3 close dates)
Wins: 8
Losses: 27 — all 27 loss rows carry close dates 2026-07-29 → 2026-09-02, i.e. all inside Q3
Win:loss on closed deals = 8:27; win rate = 8/35 = 22.9%
Loss dollars = $329,272 vs won $150,000
Loss reasons (count, dollars):
Lost- Timing (1 year or more) 13 $184,681 ← TOP (13/27 = 48.1%)
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
6. ACTIVITY VOLUME — LAST 30 DAYS
Source columns are per-deal *_30d aggregates (no timestamps in the file), summed across all 161 deal rows:
Emails: 807 (73.6% of 1,097)
Calls: 112 (10.2%)
Meetings: 128 (11.7%)
Notes: 50 (4.6%)
Total: 1,097 touches
DATA GAPS (explicit): no company names — only deal aliases; no deal_type on lost/open rows, so new vs expansion covers wins only; activity file has no per-event dates, only 30-day rollups; quota file contains only 2026-Q3; no stage-at-close field for won/lost deals (only entered_ds2).
THREE COACHING OBSERVATIONS
1. The $50,000 gap is real but narrowable: attainment is 75.0% with 25 days left, and only $109,363 of open pipeline ($1,260,390 total = 25.2x the gap, but just 2.2x when filtered to close dates inside Q3) is dated to land this quarter. Late stage is thin — DS4+DS5 = 10 deals / $69,304 with averages of $4,715 (DS4) and $9,146 (DS5) — so closing the gap needs roughly 6+ of the 22 Q3-dated deals to convert, not one hero deal.
2. Losses are a qualification problem, not a competitive one: 27 losses ($329,272) against 8 wins ($150,000), with "Lost- Timing (1 year or more)" alone at 13/27 (48.1%, $184,681); adding MIA (5), Lost DM (2) and "Lost- Does not fit ICP" (1) puts 21/27 = 77.8% of losses on timing/disengagement/fit, while Competitor accounts for only 5 (18.5%, $49,020). Discovery and disqualification work — not battlecards — is where the win rate (8/35 = 22.9% DS2-to-won, closed cohort) moves.
3. Activity is email-skewed and late-stage follow-through is slow: 807 of 1,097 touches (73.6%) are emails versus 112 calls (10.2%) and only 50 notes (4.6%), and 7 losses totaling $63,771 are MIA/Lost DM — the exact pattern a call-heavy, multi-threaded motion attacks. Meanwhile 16 open deals worth $167,318 have sat past DS2 for more than 120 days (e.g. Deal-F9A08A in DS4 since 2025-11-24, 285 days; Deal-547B2B in DS5 since 2026-04-10), and median DS3 age is 65 days — a pipeline-hygiene cadence should be the weekly coaching checkpoint.
MISSING DATA (stated up front) - amount: no amount column exists in either file — not available for any deal. - stage: no stage column exists — (a) I cannot verify any deal is open, (b) "most valuable persona given the stage" cannot be computed. Every persona recommendation below is based only on the persona gap and is labeled as such. - Activity cutoff arithmetic: today = 2026-09-24 (day-of-year 267). 267 − 60 = day 207 = 2026-07-26. Active = last_engaged_date >= 2026-07-26 AND is_former = false. SCREEN: 14 deals total → 11 flagged, 3 pass (Deal-84DBA6: 3 active / 3 personas; Deal-4B0BEB: 4 active / 4 personas; Deal-D348E1: 5 active / 5 personas). ===================================================================== FLAGGED DEALS (11) ===================================================================== 1) Deal-EC3025 | company C-FDD0C7 amount: not in data | stage: not in data Arithmetic: 2 contact rows − 1 former (CT-F2C1AE, economic buyer, is_former=true) = 1 active → single-threaded (<2) Active contact count: 1 Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Most valuable persona to add: economic buyer (no active EB; stage unavailable so this is gap-based only) On-file unengaged fit: CT-6827DB, Chief People Officer, economic buyer 2) Deal-92D97D | company C-E23238 amount: not in data | stage: not in data Arithmetic: 2 rows; CT-A902AE champion last engaged 2026-06-01 (115 days > 60) = inactive → 1 active → single-threaded (<2) Active contact count: 1 Personas present: HR admin Personas missing: economic buyer, champion, IT security, finance Most valuable persona to add: economic buyer (gap-based only; champion also lapsed) On-file unengaged fit: none on file 3) Deal-50D386 | company C-EB10E4 amount: not in data | stage: not in data Arithmetic: 2 rows, both in-window, none former = 2 active → under-threaded (<3) Active contact count: 2 Personas present: champion, HR admin Personas missing: economic buyer, IT security, finance Most valuable persona to add: economic buyer (no active EB; gap-based only) On-file unengaged fit: CT-A1C4B3, Chief People Officer, economic buyer 4) Deal-D0D6B5 | company C-32918E amount: not in data | stage: not in data Arithmetic: 3 rows, all in-window (2026-09-02, 2026-08-19, 2026-08-07), none former = 3 active → count OK, but all 3 are champion → under-threaded (single persona) Active contact count: 3 Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Most valuable persona to add: economic buyer (gap-based only) On-file unengaged fit: CT-1FA4DB, Chief People Officer, economic buyer 5) Deal-5BFE3B | company C-535D36 amount: not in data | stage: not in data Arithmetic: 2 rows, both in-window, none former = 2 active → under-threaded (<3); also single persona Active contact count: 2 Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Most valuable persona to add: economic buyer (gap-based only) On-file unengaged fit: none on file 6) Deal-36C33F | company C-077A0E amount: not in data | stage: not in data Arithmetic: 3 rows − 2 former (CT-405B45 champion, CT-86B22F economic buyer; both also within 60d but is_former=true) = 1 active → single-threaded (<2) Active contact count: 1 Personas present: IT security Personas missing: economic buyer, champion, HR admin, finance Most valuable persona to add: economic buyer (prior EB is former; gap-based only — champion also former) On-file unengaged fit: CT-1DB73E, Chief People Officer, economic buyer 7) Deal-885F45 | company C-5E8EFB amount: not in data | stage: not in data Arithmetic: 2 rows, both in-window, none former = 2 active → under-threaded (<3) Active contact count: 2 Personas present: economic buyer, champion Personas missing: HR admin, IT security, finance Most valuable persona to add: IT security (EB and champion already active, so the highest-consequence open gap is security; gap-based only, no stage) On-file unengaged fit: CT-B3F25D, IT Security Lead, IT security 8) Deal-FCBE5B | company C-737030 amount: not in data | stage: not in data Arithmetic: 1 row, in-window, not former = 1 active → single-threaded (<2) Active contact count: 1 Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Most valuable persona to add: economic buyer (gap-based only) On-file unengaged fit: none on file 9) Deal-5408B0 | company C-2AE3AA amount: not in data | stage: not in data Arithmetic: 2 rows, both in-window, none former = 2 active → under-threaded (<3) Active contact count: 2 Personas present: champion, HR admin Personas missing: economic buyer, IT security, finance Most valuable persona to add: economic buyer (no active EB; gap-based only) On-file unengaged fit: CT-07FA76, Chief People Officer, economic buyer 10) Deal-C6D97A | company C-5A8FC2 amount: not in data | stage: not in data Arithmetic: 3 rows, all in-window (2026-08-31, 2026-08-20, 2026-08-05), none former = 3 active → count OK, but all 3 are champion → under-threaded (single persona) Active contact count: 3 Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Most valuable persona to add: economic buyer (gap-based only) On-file unengaged fit: none on file 11) Deal-F9A08A | company C-0D15DF amount: not in data | stage: not in data Arithmetic: 2 rows; CT-913581 economic buyer last engaged 2026-06-20 (96 days > 60, not former) = inactive → 1 active → single-threaded (<2) Active contact count: 1 Personas present: champion Personas missing: economic buyer, HR admin, IT security, finance Most valuable persona to add: economic buyer (lapsed EB; gap-based only) On-file unengaged fit: CT-697541, Chief People Officer, economic buyer
REP: Alex Franklin — last 10 calls (TT-001 through TT-010, 2026-07-28 to 2026-09-03) 1. LEAD IN THE FIRST FIVE MINUTES - 8/10 calls (80%) open at minute 0 with the identical retail proof 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, TT-002, TT-003, TT-005, TT-006, TT-007, TT-008, TT-010) - Two exceptions: TT-004 leads with a short agenda (security review, then pricing); TT-009 leads with pricing because the prospect asked for it last time. - TT-005 also adds a rep-raised Workhuman pricing comparison at minute 2 — before the prospect named any competitor. - The provided lines contain no rep-asked discovery question before minute 4 in any call; whether discovery happened but was not captured is not knowable from this data. 2. THREE MOST COMMON OBJECTIONS AND HOW THEY'RE HANDLED 13 objection utterances total across 10 calls (4 + 3 + 3 + 2 + 1). #1 — Budget locked until next fiscal year: 4 calls (TT-001, TT-003, TT-006, TT-010). Same answer all 4 times: "Totally fair. Most teams fund this out of turnover savings — that retailer saved about $210k in avoided backfills, which is how their finance team signed off." #2 — Timing: revisit next quarter / open enrollment conflict: 3 calls (TT-002, TT-005, TT-008). Same answer all 3 times: "Makes sense. What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?" #3 — Status quo: existing spreadsheet + gift cards: 3 calls (TT-004, TT-007, TT-009). Same answer all 3 times: "Spreadsheets work until they scale — the difference is automation: milestones fire without HR lifting a finger, and you get analytics on who is being recognized." (Next most common, outside the top three: budget-committee gate, 2 calls — TT-004, TT-010; "no urgency / need to think," 1 call — TT-007. #2 and #3 are tied at 3 each.) 3. CONCRETE NEXT-STEP AGREEMENT RATE - Rep asked for a concrete next step at minute 14 in 7/10 calls: "Should we lock the next step — a working session with your team this week?" - Accepted: 7 (TT-001, TT-002, TT-003, TT-005, TT-006, TT-008, TT-009) → 7/10 = 70% of calls end with an agreed next step. When asked, acceptance is 7/7 = 100% (identical acceptance line in all 7: Thursday 2pm, HRIS manager attending). - No next step was requested in TT-004, TT-007, TT-010 → 3/10 = 30% of calls ended with no scheduled action. 4. COMPETITORS RAISED BY PROSPECTS - Awardco — TT-003 (Deal-547B2B), minute 4: "We're also in late talks with Awardco — their rewards catalog looks bigger than yours." - Kudos — TT-007 (Deal-EDC141), minute 4: "How are you different from Kudos? Our CEO used them at her last company." - No other competitor appears in any prospect line in these 10 transcripts. Workhuman appears only in the rep's own line (TT-005, Deal-C61CF7, minute 2), so it is not prospect-raised. - Data missing: no competitor information exists outside these 10 transcripts (no notes on lost deals or stage data were provided). COACHING NOTES 1. You concede the closing moment without a fallback ask. When the primary close was refused — committee gate (TT-004 minute 12, TT-010 minute 12) and no-urgency (TT-007 minute 15) — the call ends with nothing scheduled: 3/10 calls (30%) exit with zero next step, while every call where you did ask got a yes (7/7). Pre-load a smaller ask for those branches (send the agenda plus a 15-minute hold) instead of leaving it with the prospect. 2. Every response is verbatim: the same opener in 8/10 calls, the same budget answer 4/4, the same timing answer 3/3, the same status-quo answer 3/3. One-size-fits-all delivery also showed up as an unprompted Workhuman comparison at minute 2 of TT-005, putting a competitor in the prospect's head before she raised one. Anchor the opener and the savings figure to the specific prospect's headcount and industry rather than the shared 400-person retailer story.
Q3 2026 FORECAST (quarter = 2026-07-01 to 2026-09-30; extract pulled 2026-09-05)
COMMIT total (inside quarter): $44,729
7 deals: Deal-547B2B 11,200 + Deal-B7EBD1 9,000 + Deal-403845 9,000 + Deal-A2B47C 6,360
+ Deal-2465CE 5,400 + Deal-A5E80A 2,520 + Deal-499BF6 1,249 = 44,729
BEST_CASE total (inside quarter): $203,565
24 deals: 38,935 + 24,000 + 19,656 + 16,250 + 11,116 + 10,800 + 10,500 + 9,890 + 9,720
+ 9,000 + 7,200 + 3,840 + 3,780 + 3,600 + 3,240 + 3,150 + 3,120 + 3,060 + 2,916
+ 2,760 + 2,484 + 2,100 + 1,920 + 528 = 203,565
Weighted forecast = (1.00 x 44,729) + (0.35 x 203,565)
= 44,729 + 71,247.75
= $115,976.75
Counts inside the quarter (54 deals, $449,931.40 total):
COMMIT 7 deals $44,729.00 (weight 100%)
BEST_CASE 24 deals $203,565.00 (weight 35%)
PIPELINE 23 deals $201,637.40 (weight 0%)
Check: 44,729 + 203,565 + 201,637.40 = 449,931.40
Excluded for close date outside the quarter: 32 deals, $227,575 total (all close 2026-10-01 through 2026-10-15; none fall before 2026-07-01).
Includes the one COMMIT exclusion, Deal-D348E1 at 13,770 (close 2026-10-15), and BEST_CASE exclusions Deal-C61CF7 5,400, Deal-48B656 5,160, Deal-901332 3,600, Deal-47AE31 3,600, Deal-15D24F 3,600, Deal-ED725A 2,400, Deal-8AD4A5 1,800, Deal-5FDCE4 1,600, Deal-F5A622 1,080.
Check: 449,931.40 (inside) + 227,575 (excluded) = 677,506.40 = sum of all 86 rows.
Top 5 BEST_CASE deals inside the quarter:
1. Deal-2D7423 $38,935 DS3 close 2026-09-30
2. Deal-25F752 $24,000 DS4 close 2026-09-25
3. Deal-E53952 $19,656 DS4 close 2026-09-30
4. Deal-5EED42 $16,250 DS3 close 2026-09-30
5. Deal-FA32A0 $11,116 DS3 close 2026-09-25
(Next: Deal-FC22A3 $10,800 — no tie at rank 5.)
## Data quality
The owner field is blank on 85 of 86 rows (only Deal-C9C286 shows Bryce Harmon), so no rep-level rollup, accountability, or sandbagging check is possible, and why_buys_chars is 0 on 71 of 86 rows, meaning most deals carry no qualification evidence behind their stage. Forecast category contradicts stage in both directions — Deal-A5E80A (DS1) and Deal-499BF6 (DS2) are tagged COMMIT while DS5 Deal-C61CF7 is BEST_CASE — so the category is not derived consistently from stage. Close dates cluster hard on boundaries (17 rows on 2026-09-30, 14 on 2026-10-15, and 32 of 86 rows fall outside the quarter despite this being a Q3 pull), which suggests placeholder rather than rep-committed dates. Deal-42326B carries a fractional amount of 2480.4 amid otherwise whole-dollar values, implying mixed currency or unrounded data, and no deals have close dates before 2026-08-28, so July and most of August are unrepresented and cannot be distinguished from missing rows.
ANALYSIS: activation hypothesis on plg_company_cohort_2023.csv (220 companies, signups 2023-01 through 2023-07)
RULES APPLIED
- Signal A (givers): m1_users >= 5. Signal B (redemption): m1_redemptions >= 1.
- Retained at 24 months: current_status == 'active' (per your instruction). 'cancelled' and 'non_renewing' = not retained.
- Every row falls into exactly one of four cells; 47+49+29+95 = 220.
THE 2x2 (cohort size and 24-month retention rate)
BOTH signals (m1_users>=5 AND m1_redemptions>=1)
31 active / 47 = 66.0% (31/47 = 0.6596)
GIVERS-ONLY (m1_users>=5, m1_redemptions=0)
23 active / 49 = 46.9% (23/49 = 0.4694)
REDEMPTION-ONLY (m1_users<5, m1_redemptions>=1)
9 active / 29 = 31.0% (9/29 = 0.3103)
NEITHER (m1_users<5, m1_redemptions=0)
38 active / 95 = 40.0% (38/95 = 0.4000)
TOTAL
101 active / 220 = 45.9% (31+23+9+38 = 101; 47+49+29+95 = 220)
Gaps vs the neither baseline:
both vs neither: 66.0% - 40.0% = +26.0 pp
givers-only vs neither: 46.9% - 40.0% = +6.9 pp
redemption-only vs neither: 31.0% - 40.0% = -9.0 pp
EXCLUSIONS FROM THE DENOMINATOR: 0. None excluded.
- All 220 rows have non-empty current_status, m1_users, and m1_redemptions (verified; 0 rows missing any required field).
- All signup_month values are 2023-01..2023-07, i.e. all are 25+ months old under your stated premise, so none excluded for cohort age.
- Blank fields that do exist — 22 blank industry_group, 16 blank country — do not enter this computation, so they cause no exclusion.
- Classification note (not an exclusion): 3 rows carry current_status = 'non_renewing' and are counted as NOT retained, since only 'active' meets your retention rule: C-0B2078FB (neither cell), C-0A96134F (redemption-only), C-0BEAF685 (redemption-only).
LARGEST SINGLE-SIGNAL LIFT: the givers signal (m1_users >= 5).
- Single-signal cells vs neither: givers-only +6.9 pp (46.9% vs 40.0%); redemption-only -9.0 pp (31.0% vs 40.0%). Givers wins by 6.9 - (-9.0) = 15.9 pp.
- Marginal check (same conclusion): any 5+ givers = (31+23)/(47+49) = 56/96 = 58.3%... computed as 56.2% on active counts 54/96 vs <5 givers (9+38)/(29+95) = 47/124 = 37.9%, lift +18.3 pp. Any redemption = (31+9)/76 = 40/76 = 52.6% vs no redemption (23+38)/144 = 61/144 = 42.4%, lift +10.3 pp. Givers > redemption on both framings.
WHAT THIS DOES PROVE
- A descriptive association in this extract: the both-signals group has the highest 24-month retention (66.0% vs 40.0% for neither, +26.0 pp), and the two signals are not interchangeable — carrying 5+ givers alone sits above the neither baseline (+6.9 pp) while carrying a redemption alone sits below it (-9.0 pp). The simple ordering "both > one signal > neither" does NOT hold: redemption-only (31.0%) is worse than neither (40.0%).
- It confirms the arithmetic claim that both signals jointly identify a higher-retaining subgroup, and it quantifies the gap on this cohort.
WHAT THIS DOES NOT PROVE
- Not causation: no randomization or intervention; nothing shows that driving givers or redemptions would change retention.
- Strong confounder visible in this data: product_tier. All 97 tier_two companies are cancelled (0 active), while tier_three/tier_alpha are 101 active of 123. Tier mix differs by cell — tier_two is 13/47 (27.7%) in "both" but 49/95 (51.6%) in "neither" — so part of the +26.0 pp is tier composition, not activation. Restricting to tier_three+alpha only, the ordering changes again: givers-only 23/24 = 95.8%, both 31/34 = 91.2%, neither 38/46 = 82.6%, redemption-only 9/19 = 47.4%. Neither version of the table shows "both" on top once tier is held constant.
- Small cells / no significance testing: redemption-only is n=29 (9 retained) and the within-tier cells drop to n=19-46, so these rates are noisy; I ran no hypothesis tests and am not reporting p-values or confidence intervals.
- Other uncontrolled differences in this extract: current_arr_usd, industry_group, country, has_slack/has_ms_teams/has_hris, and signup_month all vary across cells and were not adjusted for.
- Measurement limits: m1_redemptions >= 1 is a very low bar (in the redemption-only cell, 19 of 29 companies have exactly 1 redemption and m1_users ranges 0-4), so "redemption signal" there may reflect trivial redemption rather than real activation. Also 'active' is a binary end-state snapshot — no churn timing, expansion/contraction, or revenue retention — and this is a single 2023 signup vintage, so it does not generalize to other cohorts without re-testing.
File written for reproduction: /private/tmp/plg_company_cohort_2023.csv (verbatim copy of the provided extract; 220 data rows parsed).
RECONCILIATION: CRM COMPANY ARR vs BILLING SUBSCRIPTION ARR — as of 2026-09-05 Scope note: neither file contains an owner field or a status field on the CRM side, so "suggested owner" below is functional-role assignment, not data from the files. DEFINITIONS USED - Billing ARR per subscription = mrr x 12 (per stated rule; term length does not change the calculation) - Billing total = sum over ACTIVE subscriptions only. Cancelled subs carry historical MRR but do not count toward current ARR — this is what makes the "status mismatch" bucket meaningful. Alternative all-statuss figure is shown at the end. - Variance = CRM total - Billing total TOTALS CRM total (39 companies, sum of hubspot_arr): 603,581.76 Billing total (37 active subs; 39 subs - 2 cancelled, sum of mrr x 12): 604,739.28 Variance: 603,581.76 - 604,739.28 = -1,157.52 (CRM is 1,157.52 BELOW billing) DECOMPOSITION (sums exactly to -1,157.52) 1. Status mismatch: +13,158.48 Cancelled in billing, ARR still live in CRM: - C-0C8323BF (SUB-000E, cancelled): CRM 4,905.24 vs billing active 0.00 -> +4,905.24 (408.77 x 12 = 4,905.24, matches CRM exactly, so the CRM value was never zeroed out) - C-0DC4FB8C (SUB-000F, cancelled): CRM 8,253.24 vs billing active 0.00 -> +8,253.24 (687.77 x 12 = 8,253.24, same pattern) 2. Missing records: -11,952.00 (net of one gap on each side) - C-0D5BBE3A: in CRM only, 16,497.24, no subscription record -> +16,497.24 - C-21629AA4: in billing only (SUB-0004, active), no CRM company record: 2,370.77 x 12 = 28,449.24 -> -28,449.24 Net: 16,497.24 - 28,449.24 = -11,952.00 3. Rounding (small residuals <=0.11% of account ARR): +36.00 - C-0D66DF9E (SUB-0005): CRM 23,200.00 vs 1,932.00 x 12 = 23,184.00 -> +16.00 - C-14D70CE0 (SUB-0008): CRM 18,200.00 vs 1,515.00 x 12 = 18,180.00 -> +20.00 (Both residuals are exact whole dollars, so "rounding" here means small value drift, not float precision — cause not determinable from these files.) 4. Other: -2,400.00 - C-0F7269D7 (SUB-0006, active): CRM 24,396.00 vs 2,233.00 x 12 = 26,796.00 -> -2,400.00 (8.96% gap, both sides active — cause not determinable from these files) Check: 13,158.48 + (-11,952.00) + 36.00 + (-2,400.00) = -1,157.52 ✓ equals variance exactly The other 33 matched accounts reconcile to the cent (CRM = mrr x 12 exactly). MISMATCHED ACCOUNTS + SUGGESTED OWNER - C-0C8323BF (SUB-000E) — status mismatch, +4,905.24 — RevOps (CRM lifecycle/status sync) - C-0DC4FB8C (SUB-000F) — status mismatch, +8,253.24 — RevOps (CRM lifecycle/status sync) - C-0D5BBE3A — missing record, +16,497.24, CRM company with no subscription — RevOps data quality (CRM admin) - C-21629AA4 (SUB-0004) — missing record, -28,449.24, active sub with no CRM company — RevOps data quality (CRM admin) with Billing ops - C-0D66DF9E (SUB-0005) — rounding, +16.00 — RevOps analytics - C-14D70CE0 (SUB-0008) — rounding, +20.00 — RevOps analytics - C-0F7269D7 (SUB-0006) — other, -2,400.00 — RevOps + Billing ops (joint review) BUSINESS RULE: term != 12 months requires cf_agreement_end_date populated Violations (2): - SUB-0002, C-1794A52C, term 24, cf_agreement_end_date empty - SUB-0019, C-22170CA1, term 36, cf_agreement_end_date empty Compliant non-12-month subs: SUB-000C (24, 2027-11-30), SUB-001A (36, 2027-11-30). All other 35 subs are 12-month terms, so the rule does not apply to them. ALTERNATIVE if billing ARR includes cancelled subs (literal MRR x 12 across all 39 subs): Billing total = 617,897.76; Variance = 603,581.76 - 617,897.76 = -14,316.00 Buckets: status mismatch 0.00 (cancelled ARR appears on both sides), missing records -11,952.00, rounding +36.00, other -2,400.00 -> sums to -14,316.00 ✓ MISSING DATA (stated explicitly, not inferred) - No owner/assignee field in either file (owners above are role-based suggestions) - No effective dates, prior MRR, or amendment history — cause of the -2,400.00 (C-0F7269D7) and the +16.00/+20.00 residuals cannot be determined from these files - No CRM status field — cancelled-in-CRM cannot be verified directly, only inferred from billing status - cf_agreement_end_date is empty for all 12-month subs, so it cannot be cross-checked against term for them
2026-08 vs 2026-07, simple mean across the 30 aliases (n=30 each month); relative change = (Aug−Jul)/Jul. | KVM | 2026-07 | 2026-08 | Abs Δ | Rel Δ | Direction | |---|---|---|---|---|---| | Giving rate | 0.6023 | 0.6027 | +0.0004 | +0.07% | up (flat) | | Redemptions per user | 1.7300 | 1.7302 | +0.0002 | +0.01% | up (flat) | | 1:1 meetings engagement | 0.4469 | 0.4472 | +0.0003 | +0.06% | up (flat) | | Pulse check engagement | 0.6006 | 0.5086 | −0.0920 | −15.31% | down | Largest relative move: pulse check engagement, −15.31%. Driver: size_band, not plan_tier — every row is tier_three, so plan_tier cannot vary. Enterprise pulse fell 0.5500 → 0.2743 (−0.2757, −50.13%) across its 10 aliases (all 10 roughly halved); smb −0.22%, mid_market +0.21%. Enterprise's 10/30 weight accounts for −0.0919 of the −0.0920 total pulse move. Data missing: user counts, so means are unweighted; no revenue/churn fields.
REDEMPTION SECTION — YTD 2026 through last completed month Last completed month: August 2026 (2026-08). Data runs 2026-01-01 → 2026-08-31; September 2026 is partial and excluded. Scope: all 378 rows in redemptions_ytd.csv fall on or before 2026-08-31, so no rows were dropped. REDemptions & SPEND - Redemption count: 378 - Spend: $27,846.00 (sum of amount_usd, all 378 rows) REDEEMERS - Unique redeemers: 235 (distinct user_key) - Redemptions per redeemer: 378 ÷ 235 = 1.61 PROVIDER MIX (% of spend; sums to 100.0) - custom: $10,873.00 → 10,873.00 ÷ 27,846.00 = 39.047% → 39.1* - Tremendous: $8,505.00 → 8,505.00 ÷ 27,846.00 = 30.543% → 30.5 - Snappy: $5,238.00 → 5,238.00 ÷ 27,846.00 = 18.811% → 18.8 - TangoCard: $3,230.00 → 3,230.00 ÷ 27,846.00 = 11.600% → 11.6 - Total: $10,873 + $8,505 + $5,238 + $3,230 = $27,846 ✓ - *One-decimal shares otherwise round to 99.9; the residual 0.1pp is assigned to the largest-remainder provider (custom, 39.047%→39.1) so shares sum to exactly 100.0. TOP 5 COUNTRIES BY REDEMPTION COUNT 1. US — 244 2. CA — 24 3. AU — 21 4. GB — 17 (tied) 5. NL — 17 (tied) (SG 12 is 6th.) Notes: providers present in the data are exactly custom, Tremendous, Snappy, TangoCard — no others. No redemption records are missing a country or provider. Data limitations: the file has no invoice/state fields, so no fulfilled/approved filter could be applied; all rows are taken as given.
ELIGIBILITY EVALUATION — churnzero_accounts.csv vs eligibility_rules.csv Snapshot: 2026-09-05 R3 cutoff: 2026-09-05 + 120 days = 2027-01-03 (Sep 25 + Oct 31 + Nov 30 + Dec 31 = 117 days -> 2027-01-01 is day 118, so day 120 = 2027-01-03) Rules applied: R1 health_score < 60 AND R2 churn_save_eligible_amount > 0 AND R3 renewal_date <= 2027-01-03. At-risk set (R1) = 15 accounts (health < 60). All 15 have renewal dates after the snapshot, so no expired-renewal edge case exists. QUALIFYING ACCOUNTS (8) — amount at stake + play + justifying signal Play-mapping caveat: eligibility_rules.csv contains ONLY R1-R3. No play-assignment rules are documented in either file. The mapping below is analyst-derived from the signals present in churnzero_accounts.csv (champion_active, usage_trend_3m, seats_used/seats) using this stated precedence: 1. champion_active = false -> executive touch (no relationship to leverage) 2. usage_trend_3m = declining OR seats_used/seats < 60% -> usage revival 3. otherwise -> commercial concession (usage healthy, champion engaged; commercial terms are the remaining lever) 1. C-0F6C0F34 — $49,707 R1: 51 < 60 OK | R2: 49,707 > 0 OK | R3: 2026-10-03 = day 28 OK Play: EXECUTIVE TOUCH — signal: champion_active = false (usage growing, 308/395 = 78.0% seats used — not a usage problem) ARR context: 86,741 2. C-0E9C27D1 — $41,235 R1: 39 < 60 OK | R2: 41,235 > 0 OK | R3: 2026-09-24 = day 19 OK Play: COMMERCIAL CONCESSION — signals: champion_active = true AND usage_trend_3m = flat with 134/157 = 85.4% seats used (no usage or relationship signal fires) Most urgent in cohort: lowest health (39), renewal in 19 days. 3. C-0B360C78 — $35,748 R1: 57 < 60 OK | R2: 35,748 > 0 OK | R3: 2026-10-28 = day 53 OK Play: COMMERCIAL CONCESSION — signals: champion_active = true AND usage growing, 246/327 = 75.2% seats used ARR context: 60,427 4. C-0CEF69FD — $32,621 R1: 53 < 60 OK | R2: 32,621 > 0 OK | R3: 2026-11-21 = day 77 OK Play: EXECUTIVE TOUCH — signal: champion_active = false (usage growing, 97/136 = 71.3% seats used) 5. C-0B827671 — $25,365 R1: 56 < 60 OK | R2: 25,365 > 0 OK | R3: 2026-11-14 = day 70 OK Play: USAGE REVIVAL — signals: usage_trend_3m = declining AND 113/202 = 55.9% seats used (< 60%) (champion_active = true, so no exec-touch trigger) 6. C-0D3278C7 — $17,602 R1: 54 < 60 OK | R2: 17,602 > 0 OK | R3: 2026-11-12 = day 68 OK Play: USAGE REVIVAL — signals: usage_trend_3m = declining AND 126/380 = 33.2% seats used (champion_active = true) 7. C-0CA21961 — $16,829 R1: 58 < 60 OK | R2: 16,829 > 0 OK | R3: 2026-12-28 = day 114 OK (inside cutoff by 6 days) Play: USAGE REVIVAL — signal: 84/325 = 25.8% seats used (weakest penetration in cohort), trend flat (champion_active = true) 8. C-0B0F1BAB — $5,494 R1: 38 < 60 OK | R2: 5,494 > 0 OK | R3: 2026-09-23 = day 18 OK Play: EXECUTIVE TOUCH — signal: champion_active = false (flat usage, 238/363 = 65.6% seats used — does not clear the <60% usage trigger) Most urgent by clock: renewal in 18 days. TOTAL AMOUNT AT STAKE (churn_save_eligible_amount) 49,707 + 41,235 + 35,748 + 32,621 + 25,365 + 17,602 + 16,829 + 5,494 = 90,942 + 35,748 = 126,690 126,690 + 32,621 = 159,311 159,311 + 25,365 = 184,676 184,676 + 17,602 = 202,278 202,278 + 16,829 = 219,107 219,107 + 5,494 = $224,601.00 By play: Executive touch: 49,707 + 32,621 + 5,494 = $87,822 (C-0F6C0F34, C-0CEF69FD, C-0B0F1BAB) Usage revival: 25,365 + 17,602 + 16,829 = $59,796 (C-0B827671, C-0D3278C7, C-0CA21961) Commercial conces.: 35,748 + 41,235 = $76,983 (C-0B360C78, C-0E9C27D1) Check: 87,822 + 59,796 + 76,983 = 224,601 OK ARR of the 8-account cohort (context, not the save amount): 86,741 + 72,088 + 60,427 + 15,391 + 31,501 + 75,093 + 79,324 + 33,815 = $454,380 (86,741+72,088=158,829; +60,427=219,256; +15,391=234,647; +31,501=266,148; +75,093=341,241; +79,324=420,565; +33,815=454,380) AT-RISK (R1: health < 60) BUT NOT QUALIFYING — 7 accounts Fails R2 only (health < 60, renewal inside 120d, but eligible amount = $0): C-0BC71BDD — health 55, renewal 2026-10-27 (day 52), eligible $0.00 C-0BE96399 — health 54, renewal 2026-10-29 (day 54), eligible $0.00 C-10A56B0F — health 54, renewal 2026-12-12 (day 98), eligible $0.00 Fails R3 only (health < 60, eligible > 0, but renewal beyond 2027-01-03): C-0F876796 — health 47, eligible $19,958, renewal 2027-02-06 = day 154 (34 days past cutoff) C-0BA71F12 — health 52, eligible $6,824, renewal 2027-04-11 = day 218 Fails R2 and R3: C-0F6694C3 — health 43, eligible $0.00, renewal 2027-03-21 = day 197 C-0FCCD2DF — health 43, eligible $0.00, renewal 2027-04-23 = day 230 These 7 carry $26,782 in churn_save_eligible_amount that is NOT actionable under R3 as written (19,958 + 6,824 = 26,782 from the two R3-only failures). The other 15 accounts all have health_score >= 60, so they fail R1 (and all also have eligible amount = $0, failing R2). None show declining usage trends, so none signal at-risk status outside R1. DATA GAPS (stated explicitly) - No play-assignment rules exist in either file. Play mapping above is analyst-derived from documented columns using stated precedence; it is not a documented rule. - No offer-sizing or discount-band rules exist; "amount at stake" is taken directly from churn_save_eligible_amount (R2's field), with ARR shown separately as context. - The day-120 boundary (2027-01-03) is not exercised by any account, so inclusive/exclusive treatment of R3 does not change results. - No renewal dates precede the 2026-09-05 snapshot.
EXPANSION KIT — C-0DDFC9A7 (all figures from the three provided files only) SEAT COVERAGE - 150 licensed / 400 headcount = 0.375 → 37.5% coverage - 62.5% of headcount is unlicensed: 400 − 150 = 250 seats USAGE HEALTH (two lines) 1. Upward and consistent: users_2026_03 88 → users_2026_08 126 = +38 users, +43.2% (38 ÷ 88), with no down months (monthly deltas: +7, +7, +8, +8, +8). 2. Strong license utilization: 126 ÷ 150 = 84.0% of licensed seats active in Aug; 150 − 126 = 24 licensed seats (16%) not yet adopted. HEADROOM (per-seat rate derived: 9,000.00 ÷ 150 = $60.00 per seat, period not stated in file — "ARR" label implies annual) - Seats to full headcount: 400 − 150 = 250 seats → 250 × $60 = $15,000 ARR upside (potential total 9,000 + 15,000 = $24,000) - Seats already paid but inactive: 24 seats × $60 = $1,440 of contracted ARR not yet used by an active user WHO REPLIED / CAN THEY BUY - Maria S., People Operations Coordinator, last_engaged 2026-09-02 (matches the reply date). - No — she says explicitly: "I'm not the right person for purchasing decisions here. Budget and seat expansion sit with Dana R." She can sponsor the intro (offered). RIGHT BUYER - Dana R., VP People — named in the reply as the decision-maker; last_engaged 2026-05-18 (≈3.5 months before the reply). Maria adds a warm hook: Dana "has been asking about our usage numbers lately." - Not Sam K., Office Manager (last_engaged 2025-11-03); no buying signal in data. REPLY EMAIL (107 words, one real usage fact cited) Subject: RE: Growing your team's recognition program Hi Maria, Thanks for the quick reply - and great to hear the feed is staying busy. One number from our side: monthly active users went from 88 in March to 126 in August, so your team is now using 84% of its 150 licensed seats. That's exactly the trend worth putting in front of Dana, and I'd welcome the intro you offered. Since she's been asking about usage numbers, I can send a one-screen usage snapshot first so the conversation starts with data rather than a pitch. Would a short intro email work, or would you prefer I send you the snapshot to forward? Best, Cole MISSING DATA (not in the files): billing period for current_arr; explicit definition of the users_2026_0X columns (treated as monthly active users, consistent with Maria's reply — inference, labeled); Dana R.'s contact details; contract/discount terms.
CSM PRE-CALL BRIEF — C-0D284E42 (signup 2026-08-11, day 24 as of 2026-09-04) COMPLETE (each backed by a data field) - Slack integration: connected 2026-08-12 — 1 day after signup (08-12 − 08-11) - Allowance set: 2026-08-13 — 2 days after signup (08-13 − 08-11) - Admins added: count field = 2. Marked complete on presence of the value 2; no timestamp field exists, so when they were added is unknown. - First recognition: 2026-08-15 14:22 — 4 days after signup (08-15 − 08-11) NOT COMPLETE - HRIS integration: field empty. No date, no connection. - First redemption: field empty. 24 days elapsed since signup, 20 days since first recognition (09-04 − 08-15), zero redemptions recorded. EARLY ENGAGEMENT SIGNALS (onboarding_usage.csv, 2026-08-11 → 2026-09-04, 25 days) - Active givers: 3 on day 1 → 15 on 09-04. Growth 15 − 3 = 12, or 15/3 = 5.0x (+400%). - Weekly averages (sum ÷ 7, or ÷ 4 for partial week): - W1 08-11→08-17: 3+3+4+4+5+4+7 = 30 → 30/7 = 4.3 - W2 08-18→08-24: 5+7+6+9+8+9+9 = 53 → 53/7 = 7.6 - W3 08-25→08-31: 9+11+10+10+11+13+11 = 75 → 75/7 = 10.7 - W4 09-01→09-04: 13+13+15+15 = 56 → 56/4 = 14.0 - Trajectory: 4.3 → 7.6 → 10.7 → 14.0, no down week. - Peak 15 (09-03, 09-04); minimum 3 (signup day). Total giver-days = 30+53+75+56 = 214. - Read: giving habit is compounding every week. Adoption is not the problem — completion is. THE THREE THINGS TO COVER ON THE CALL 1. HRIS integration — still not connected (empty field, day 24). Ask what's blocking (IT/security review?) and get a date. 2. Redemption — zero redemptions 20 days after first recognition. The give→redeem loop is unproven. Walk through how to redeem live; ask if anyone has tried and hit friction. 3. Admin depth — only 2 admins (count field, no date). With givers at 15 and climbing, ask whether 2 admins is intentional and whether to add more owners so the program doesn't depend on them. DATA NOT AVAILABLE (flagging as missing, not assumed) - HRIS status date, redemption date, admin-added date (no such fields) - Total employee/user headcount — can't compute % of company participating - Recognition volume after the first (only first_recognition_at exists) - Giver identity/role — can't tell if the 15 givers overlap with the 2 admins - Call date itself: brief computed through 2026-09-04, the last usage row; any days after that have no data.
90-DAY RENEWAL RISK BRIEF — as of 2026-09-24 Window: 2026-09-24 → 2026-12-23 (90 days from today). All 20 accounts' trusted dates fall 2026-09-15 → 2026-11-24. DATE-RESOLUTION RULE (applied per account) - Chargebee (cb_renewal_date) is trusted when is_multi_year = true, because ChurnZero is known wrong on multi-year contracts. - ChurnZero (cz_renewal_date) is trusted when term_months = 12 (ChurnZero's known defect doesn't apply), and for those 15 accounts both systems carry identical dates, so nothing is at stake. - Result: 5 of 20 accounts disagree; 100% of disagreements are multi-year accounts. All 15 single-year accounts agree exactly (verified field-by-field). RISK RUBRIC (fixed before rating; both inputs shown below) - HIGH: 3-month active-user change ≤ -5%, OR seat utilization < 35%. - MEDIUM: otherwise, if 3-month change is flat (-5% to +5%) AND utilization < 70%. - LOW: otherwise (flat with utilization ≥ 70%, or positive 3-month change). 3-month trend = 2026-06 → 2026-07 → 2026-08 (Jun→Aug % change). Utilization = seats_used/seats (ChurnZero). RENEWALS, IN DATE ORDER (util = seats_used/seats; 3mo = Jun→Jul→Aug actives) DATE USED | ALIAS | CSM | ARR | DATE SRC | UTIL | 3MO TREND | RISK — evidence 2026-09-15 | C-0B7D2C30 | Dana Mercer | $65,901 | Chargebee (DIS) | 274/476=57.6% | 97→94→84 (-13.4%) | HIGH — active users fell 97→84 in 3 months (-45.8% over 12m, 155→84). 2026-09-18 | C-0BCDB8C2 | Cole Ingram | $54,427 | Chargebee (DIS) | 232/424=54.7% | 127→118→110 (-13.4%) | HIGH — active users fell 127→110 in 3 months (-45.0% over 12m, 200→110). 2026-09-22 | C-0D2AB865 | Elena Sinclair | $38,022 | Chargebee (DIS) | 250/407=61.4% | 125→117→109 (-12.8%) | HIGH — active users fell 125→109 in 3 months (-45.2% over 12m, 199→109). 2026-09-26 | C-0BBE3E60 | Dana Mercer | $30,993 | Chargebee (DIS) | 74/114=64.9% | 39→35→33 (-15.4%) | HIGH — active users fell 39→33 in 3 months (-47.6% over 12m, 63→33). 2026-09-29 | C-0F5D2323 | Cole Ingram | $90,647 | Chargebee (DIS) | 111/390=28.5% | 20→21→18 (-10.0%) | HIGH — only 28.5% of 390 seats used (111) while actives sit in a flat 17–21 band over 12m. 2026-10-03 | C-0EC6999D | Elena Sinclair | $79,419 | ChurnZero (agree) | 31/112=27.7% | 17→16→15 (-11.8%) | HIGH — worst-in-set utilization at 27.7% (31/112 seats) with actives flat at 15 over 12m. 2026-10-07 | C-0B20DB64 | Dana Mercer | $21,770 | ChurnZero (agree) | 214/378=56.6% | 294→298→294 (0.0%) | MEDIUM — usage perfectly flat (294→294, 12m 293→294) but 43% of seats unused. 2026-10-10 | C-0BBC4E7A | Cole Ingram | $56,374 | ChurnZero (agree) | 228/337=67.7% | 142→141→139 (-2.1%) | MEDIUM — flat-to-eroding usage (142→139) leaves 109 of 337 seats unused at renewal. 2026-10-14 | C-0FD551AB | Elena Sinclair | $48,815 | ChurnZero (agree) | 210/376=55.9% | 123→122→126 (+2.4%) | MEDIUM — stable usage but only 55.9% of seats used, a right-sizing exposure on 205 open seats. 2026-10-18 | C-0F9F8F13 | Dana Mercer | $46,230 | ChurnZero (agree) | 199/352=56.5% | 185→185→182 (-1.6%) | MEDIUM — 12m usage flat (182→182) with 43.5% of seats unused. 2026-10-22 | C-0BC34584 | Cole Ingram | $16,740 | ChurnZero (agree) | 327/494=66.2% | 104→104→106 (+1.9%) | MEDIUM — usage stable but 167 of 494 seats unused (33.8% slack). 2026-10-25 | C-0B7A7546 | Elena Sinclair | $35,062 | ChurnZero (agree) | 182/205=88.8% | 64→65→63 (-1.6%) | LOW — highest utilization in set (88.8%) with 12m usage up 58→63. 2026-10-29 | C-0B369871 | Dana Mercer | $85,128 | ChurnZero (agree) | 317/422=75.1% | 326→330→333 (+2.1%) | LOW — growing every quarter (12m 289→333, +15.2%) at 75.1% utilization. 2026-11-02 | C-0B144C78 | Cole Ingram | $30,899 | ChurnZero (agree) | 169/224=75.4% | 101→101→106 (+5.0%) | LOW — fastest 3-month growth in set (+5.0%) on 12m growth of 90→106 (+17.8%). 2026-11-05 | C-0FC4DBB8 | Elena Sinclair | $94,732 | ChurnZero (agree) | 356/464=76.7% | 189→191→193 (+2.1%) | LOW — largest ARR in set rising steadily (12m 168→193, +14.9%) at 76.7% utilization. 2026-11-09 | C-0D5BBE3A | Dana Mercer | $39,740 | ChurnZero (agree) | 85/102=83.3% | 88→90→91 (+3.4%) | LOW — 12m usage up 76→91 (+19.7%, strongest in set) at 83.3% utilization. 2026-11-13 | C-0FB9D5AF | Cole Ingram | $63,158 | ChurnZero (agree) | 144/199=72.4% | 173→173→176 (+1.7%) | LOW — no down months (12m 154→176, +14.3%) with 72.4% utilization. 2026-11-16 | C-0B344485 | Elena Sinclair | $64,384 | ChurnZero (agree) | 224/287=78.0% | 238→240→244 (+2.5%) | LOW — consistent growth (12m 211→244, +15.6%) at 78.0% utilization. 2026-11-20 | C-0CB2C1B4 | Dana Mercer | $40,628 | ChurnZero (agree) | 386/473=81.6% | 47→48→49 (+4.3%) | LOW — 12m usage up 43→49 (+14.0%) with only 18.4% seat slack. 2026-11-24 | C-22170CA1 | Cole Ingram | $45,646 | ChurnZero (agree) | 251/294=85.4% | 143→148→146 (+2.1%) | LOW — 12m usage up 130→146 (+12.3%) at 85.4% utilization. DISAGREEMENTS (all 5; all multi-year; Chargebee used in every case) 1. C-0B7D2C30 — ChurnZero 2026-09-10 vs Chargebee 2026-09-15, term 36mo. Chose 2026-09-15. 5-day gap; both already elapsed as of 2026-09-24. 2. C-0BCDB8C2 — ChurnZero 2027-09-18 vs Chargebee 2026-09-18, term 36mo. Chose 2026-09-18. ChurnZero is 364 days late; trusting it would drop this $54,427 renewal out of the 90-day window entirely. 3. C-0D2AB865 — ChurnZero 2026-09-10 vs Chargebee 2026-09-22, term 24mo. Chose 2026-09-22. ChurnZero is 12 days early (identical month/day pattern as C-0B7D2C30, suggesting ChurnZero anchored to a non-renewal date). 4. C-0BBE3E60 — ChurnZero 2027-09-26 vs Chargebee 2026-09-26, term 24mo. Chose 2026-09-26. ChurnZero is 365 days late (full year) and would hide this renewal from the window. 5. C-0F5D2323 — ChurnZero 2026-09-10 vs Chargebee 2026-09-29, term 24mo. Chose 2026-09-29. ChurnZero is 19 days early; largest of the five at $90,647. Aggregate disagreement impact: had ChurnZero alone been trusted, only 15 accounts totaling $768,725 would appear in the window vs 20 totaling $1,048,715 — the two 2027 dates hide $85,420 (C-0BCDB8C2 + C-0BBE3E60), and the 2026-09-10 dates understate timing by 5–19 days on $194,570. DATE-ELAPSED FLAG (needs confirmation; not resolvable from provided data) Trusted dates before today (2026-09-24): C-0B7D2C30 (2026-09-15, $65,901), C-0BCDB8C2 (2026-09-18, $54,427), C-0D2AB865 (2026-09-22, $38,022) = $158,350. Whether these renewed, auto-renewed, or lapsed is not determinable from the three files; they are all rated HIGH regardless. TOTALS Total ARR renewing (20 accounts, 2026-09-15 → 2026-11-24): HIGH 6 accounts: $359,409 = 65,901 + 54,427 + 38,022 + 30,993 + 90,647 + 79,419 MEDIUM 5 accounts: $189,929 = 21,770 + 56,374 + 48,815 + 46,230 + 16,740 LOW 9 accounts: $499,377 = 35,062 + 85,128 + 30,899 + 94,732 + 39,740 + 63,158 + 64,384 + 40,628 + 45,646 TOTAL 20 accounts: $1,048,715 (check: 359,409 + 189,929 + 499,377 = 1,048,715) ✓ ARR at risk: Strict (HIGH only): $359,409 = 34.3% of $1,048,715 (359,409 ÷ 1,048,715 = 0.3427) With MEDIUM: $549,338 = 52.4% (549,338 ÷ 1,048,715 = 0.5238) Forward-looking only (17 accounts still ahead of today): $890,365 total, of which HIGH = $201,059 (359,409 − 158,350 elapsed). DATA GAPS (stated, not inferred) - No contract start dates, no renewal outcomes, no health scores, no support/CSAT, no expansion or downgrade data — ratings rest only on seat utilization, usage trend, and date proximity. - ChurnZero cannot be independently corroborated: Chargebee agrees with it only where term_months = 12, so the trust rule relies solely on the stated multi-year defect. - seats_used (ChurnZero) and monthly active_users (usage file) never match (e.g., C-0B7D2C30: 274 seats used vs 84 active in 2026-08); neither metric is defined in the files, so utilization and trend are reported as-given from their respective sources and are not reconciled. - Chargebee shows term lengths but no start dates, so its dates cannot be recomputed from raw inputs — accepted as authoritative for multi-year by the stated rule only.
QUARTER SUPPORT-TICKET THEMES — 80 tickets, 24 distinct accounts, $284,800 distinct-account ARR (Jun 1 – Aug 29, 2026) Method: grouped by body_text (tags ignored — they contradict the text, e.g. IC-460020 tagged "billing" is a points-not-arriving ticket; IC-460059 tagged "how-to" is an HRIS provisioning failure). Count share = theme tickets / 80. ARR exposure = sum of ARR of DISTINCT accounts touching the theme, counted once per theme regardless of ticket volume (accounts can appear in more than one theme, so column doesn't sum to $284,800). Ranked by ARR exposure, not volume. === RANKED BY ARR EXPOSURE === 1. HRIS PROVISIONING FAILURES — BROAD (3 accounts, all large) Count: 12 | Share: 12/80 = 15.0% | Distinct accounts: 3 | ARR: $36,000 + $48,000 + $30,000 = $114,000 Accounts: C-0B2213A9, C-0DDFC9A7, C-0F6C0F34 Ticket IDs: IC-460059, IC-460062 Rec: Treat silent provisioning-sync failure (logs show no errors) as a P0 — add sync-completeness alerting and reconcile June–August skipped hires before renewal conversations. 2. INVOICE / BILLING ERRORS — SINGLE-ACCOUNT CONCENTRATION (not noise) Count: 16 | Share: 16/80 = 20.0% | Distinct accounts: 1 | ARR: $52,000 Account: C-0E9C27D1 only (all 16 tickets, every one of 4 sub-bodies) Ticket IDs: IC-460071, IC-460069 Rec: One-account escalation, not a platform pattern — exec-level account review: refund/credit the over-billed seats (200 vs 150), fix tier price, and stop the third recurring seat-count error before renewal. 3. CHECKOUT / REDEMPTION FAILURES — BROAD (5 accounts) Count: 13 | Share: 13/80 = 16.25% | Distinct accounts: 5 | ARR: $10,700 + $8,900 + $8,700 + $9,600 + $11,000 = $48,900 Accounts: C-0B827671, C-0CEF69FD, C-0F876796, C-0FCCD2DF, C-14264ABD Ticket IDs: IC-460025, IC-460038 Rec: Fix the redemption path end-to-end (checkout timeout + gift-card email delivery) — one systemic defect spanning 5 accounts over the full quarter. 4. POINTS DEDUCTED, GIFT-CARD ORDER ERRORED — BROAD (4 accounts, direct financial harm) Count: 5 | Share: 5/80 = 6.25% | Distinct accounts: 4 | ARR: $10,300 + $9,600 + $8,700 + $9,600 = $38,200 Accounts: C-0B0F1BAB, C-0D9CA315, C-0F876796, C-0FCCD2DF Ticket IDs: IC-460024, IC-460037 Rec: Add atomic rollback/compensation so points are never deducted without a fulfilled order; auto-refund affected balances. 5. POINTS NOT CREDITED — BROAD, HIGHEST VOLUME, LOWEST ARR/TICKET Count: 20 | Share: 20/80 = 25.0% | Distinct accounts: 9 | ARR: $2,900 + $2,700 + $4,500 + $4,500 + $3,400 + $3,500 + $4,200 + $2,500 + $2,900 = $31,100 Accounts: C-0B2895EF, C-0BE96399, C-0BF20542, C-0D0B047C, C-0D284E42, C-0D3278C7, C-0D6CC8E3, C-0DD0626C, C-21FEBCBB Ticket IDs: IC-460004, IC-460016 Rec: Highest-volume defect and broadest footprint (9 of 24 accounts) — instrument the points-ledger posting pipeline; volume, not ARR, makes this the top operational priority. 6. SLACK INTEGRATION FAILURES — BROAD (4 accounts, all small) Count: 14 | Share: 14/80 = 17.5% | Distinct accounts: 4 | ARR: $4,400 + $3,900 + $5,400 + $5,200 = $18,900 Accounts: C-0B843542, C-0BA71F12, C-10A56B0F, C-8C2E8F00 Ticket IDs: IC-460047, IC-460051 Rec: Fix OAuth re-auth persistence and sync-toggle reset; lowest ARR exposure, so backlog behind themes 1–5. === BROAD vs SINGLE-ACCOUNT === - Broad patterns (3+ accounts): HRIS (3), redemption (5), gift-card-deducted (4), points-not-credited (9), Slack (4). - Single-account: invoice/billing — 16 tickets, 100% C-0E9C27D1. Rank #2 on ARR ($52,000) but it is one renewal-risk account, not a platform defect. Do not read its 20% volume share as a company-wide billing problem. - Cross-theme accounts (context, not double-counted): C-0FCCD2DF and C-0F876796 appear in both redemption themes. - Data limits: no ticket-level severity/CSAT or time-to-resolution fields; ARR is account-level and duplicated across an account's tickets, so "ARR affected" is exposure, not loss. Whether these tickets are duplicates of the same root incident cannot be determined from body_text alone.
Ranking computed from the two files only. All 8 rows with has_case_study=true scored; the 17 rows with has_case_study=false are excluded before scoring (never named). SCORING METHOD (stated assumption — not given in data) Equal weight, 1 point per matching field, max 4: industry, size_band, use_case, region. Prospect C-82AF3719 = Technology | Mid-Market | employee_recognition | NA-West ARITHMETIC (case-study rows only) ``` alias ind size use_case region score C-64171065 1 1 1 0 3/4 (misses region: NA-East) C-A13C193D 1 1 0 1 3/4 (misses use_case: retention) C-11C31562 0 1 1 1 3/4 (misses industry: Manufacturing) C-CD4829A7 1 1 0 0 2/4 C-9D69D147 0 1 0 1 2/4 C-FEFCC020 0 0 0 0 0/4 C-11209339 0 0 0 0 0/4 C-0CE315B2 0 0 0 0 0/4 ``` TOP 3 (three-way tie at 3/4; separated from next-best 2/4 by one field) Tie broken by which single field is missed, least-material first: region (geography doesn't change the proof point) > use_case (same problem, different vertical) > industry (proof of value exists but not for their vertical). 1. C-64171065 — matches industry=Technology, size_band=Mid-Market, use_case=employee_recognition; missed region=NA-East (prospect NA-West). Strongest: identical on 3 fields including exact use case. 2. C-A13C193D — matches industry=Technology, size_band=Mid-Market, region=NA-West; missed use_case=retention (prospect employee_recognition). Same vertical, same size, same region. 3. C-11C31562 — matches size_band=Mid-Market, use_case=employee_recognition, region=NA-West; missed industry=Manufacturing (prospect Technology). Same problem solved in-region, different vertical. EXPLICIT DATA GAPS - customers.csv carries no case-study URL, content, metrics, or quotes — only the has_case_study boolean. I cannot cite outcomes or attributable results for any of the three. - No field weights were provided; the 1 point/field and the tie-break order above are my assumptions, labeled as such. A use_case-heavy weighting would reorder #1/#3 (C-11C31562 would tie at 3 with use_case+size+region... no — it stays 3/4 under any weighting since one field misses either way; only the ordering shifts). - Neither file contains billing data or contact names, so none is used or disclosed. - No Enterprise-size customer with a case study exists in this set, so no size-band match above Mid-Market is available.
Data checks complete. All arithmetic below is computed from the two files only.
================================================================
SCOPE
================================================================
Trailing 6 months = 2026-03 through 2026-08. Spend file covers exactly those 6 months; all 122 contact rows have sqm_date within 2026-03-01..2026-08-28 and no sqo_date falls outside the window. No duplicate contact_key values.
Channel classification (driven by channel_spend.csv):
- Paid = paid_search, linkedin_ads, paid_social, webinars (appear in spend file)
- Organic = organic_search, referral (zero spend rows; spend = $0)
Total spend = 36,000 + 24,000 + 18,000 + 9,000 = $87,000
================================================================
PAID CHANNELS
================================================================
paid_search — spend $36,000 (6 x $6,000)
SQMs 40, SQOs 18
cost/SQM = 36,000 / 40 = $900.00
cost/SQO = 36,000 / 18 = $2,000.00
SQM-to-SQO = 18 / 40 = 45.0% (95% CI 30.7–60.2%)
pipeline = $720,000
pipeline/$ = 720,000 / 36,000 = $20.00
linkedin_ads — spend $24,000 (6 x $4,000)
SQMs 25, SQOs 8
cost/SQM = 24,000 / 25 = $960.00
cost/SQO = 24,000 / 8 = $3,000.00
SQM-to-SQO = 8 / 25 = 32.0% (95% CI 17.2–51.6%)
pipeline = $96,000
pipeline/$ = 96,000 / 24,000 = $4.00
webinars — spend $9,000 (6 x $1,500)
SQMs 12, SQOs 5
cost/SQM = 9,000 / 12 = $750.00
cost/SQO = 9,000 / 5 = $1,800.00
SQM-to-SQO = 5 / 12 = 41.7% (95% CI 19.3–68.0%)
pipeline = $60,000
pipeline/$ = 60,000 / 9,000 = $6.67
paid_social — spend $18,000 (6 x $3,000)
SQMs 0, SQOs 0
cost/SQM = UNDEFINED (spend > 0, SQMs = 0)
cost/SQO = UNDEFINED (SQOs = 0)
SQM-to-SQO = UNDEFINED (0 / 0)
pipeline = $0
pipeline/$ = 0 / 18,000 = $0.00 (numerator is genuinely zero, so this one is defined)
PAID TOTAL
spend $87,000, SQMs 77, SQOs 31, pipeline $876,000
cost/SQM = 87,000 / 77 = $1,129.87
cost/SQO = 87,000 / 31 = $2,806.45
SQM-to-SQO = 31 / 77 = 40.3% (95% CI 30.0–51.4%)
pipeline/$ = 876,000 / 87,000 = $10.07
================================================================
ORGANIC CHANNELS (zero spend)
================================================================
organic_search: volume 30 SQMs, SQOs 10
SQO rate = 10 / 30 = 33.3% (95% CI 19.2–51.2%)
pipeline = $90,000
referral: volume 15 SQMs, SQOs 6
SQO rate = 6 / 15 = 40.0% (95% CI 19.8–64.3%)
pipeline = $48,000
ORGANIC TOTAL
volume 45 SQMs, SQOs 16, pipeline $138,000
SQO rate = 16 / 45 = 35.6% (95% CI 23.2–50.2%)
Paid 40.3% vs organic 35.6%: difference = 4.7pp, SE = 9.1pp,
95% CI on the difference = -13.1pp to +22.5pp → NOT statistically distinguishable.
================================================================
DATE-ORDER FLAGS (SQO date precedes SQM date)
================================================================
2 rows, both linkedin_ads:
CT-000044 sqm_date 2026-07-23, sqo_date 2026-07-18 (SQO 5 days before SQM)
CT-000041 sqm_date 2026-06-14, sqo_date 2026-06-09 (SQO 5 days before SQM)
These 2 rows carry $12,000 pipeline each ($24,000 total) and count toward linkedin_ads SQOs. Excluding them: linkedin_ads would be 8→6 SQOs, 32.0%→24.0% rate, cost/SQO $3,000→$4,000, pipeline $96,000→$72,000, pipeline/$ $4.00→$3.00.
Also noted (not a violation): CT-000007 has sqm_date = sqo_date = 2026-03-28, same-day conversion.
================================================================
DATA GAPS / CAVEATS (explicit)
================================================================
1. paid_social has $18,000 of spend and zero rows in contacts_first_touch.csv. Either it produced no SQMs, or its SQMs are missing/unattributed in this file. The file alone cannot distinguish those.
2. pipeline_amount is a single fixed value per channel for every SQO: paid_search $40,000 (18/18), linkedin_ads $12,000 (8/8), webinars $12,000 (5/5), organic_search $9,000 (10/10), referral $8,000 (6/6). No variance. Therefore "pipeline per dollar" is mechanically = SQO count x fixed value / spend; it re-encodes conversion rate and assumed deal size, not observed deal value.
3. No closed-won, revenue, or deal-stage data is provided — nothing here supports win-rate or ACV conclusions.
4. Contacts are first-touch only; multi-touch credit is not available in this file.
================================================================
REALLOCATION RECOMMENDATION
================================================================
Move paid_social's $18,000 (6 months, $3,000/mo) to paid_search, with a smaller slice to webinars. Rationale on observed numbers:
- paid_search is the strongest performer on every paid metric: lowest cost/SQO among scaled channels ($2,000 vs $3,000 linkedin_ads), highest SQM-to-SQO (45.0%), highest pipeline/$ ($20.00).
- webinars is the cheapest SQM ($750) and cheapest SQO ($1,800) in the set, but on only 12 SQMs / 5 SQOs — too thin to scale aggressively on this evidence.
- linkedin_ads is the most expensive SQO ($3,000) with the lowest paid conversion rate (32.0%), and it holds both date-integrity flags. Do not increase it.
- paid_social returned 0 SQMs on $18,000 in this dataset. Zero-attributed is the only fact available; before treating it as proven waste, confirm it is not an attribution gap in contacts_first_touch.csv.
Suggested split: $12,000 → paid_search, $6,000 → webinars, per 6-month cycle.
CONFIDENCE: LOW overall. Sample sizes are small and the ranking is fragile:
- paid_search n=40 SQMs / 18 SQOs — its 45% rate CI is 30.7–60.2%, overlapping webinars (19.3–68.0%) and linkedin_ads (17.2–51.6%).
- webinars n=12 / 5 and linkedin_ads n=25 / 8: their CIs overlap almost completely; the $1,800 vs $3,000 cost/SQO gap could reverse with a handful of different outcomes.
- organic total n=45 / 16; referral n=15 / 6 is the thinnest cell.
- The paid-vs-organic rate gap (4.7pp) is not significant at 95%.
- Only high-confidence statements: the spend figures themselves, paid_social's 0 SQMs as recorded, and the 2 date-order violations.
- Confidence that paid_search is at least not the worst paid channel: moderate. Confidence in the precise ranking of linkedin_ads vs webinars: low. Recommend re-running after 2–3 more months before locking the split.
BATTLECARD: Rivally — updated 2026-09-24 Sources: competitor_snippets.csv (S01–S25), deals_with_competitor.csv, existing_battlecard.md Rule applied: pricing = newest source wins; rep opinions (S09, S21) excluded from factual claims; every claim cites a snippet id; win/loss cites deal aliases (the deals file carries no snippet ids). --- ONE-LINE POSITIONING Points-based recognition feed (S02), fast to stand up (S04), expanding into EU (S11, S15) and adding a lightweight engagement-survey add-on, Rivally Pulse (S06, S23). --- PRICING (source + date; newer source wins) - Current: $7 per user/month, annual billing required — pricing page, 2026-08-12 (S17). This is the newest pricing-page source and supersedes the old card. - Conflict: pricing page showed $5 per user/month, annual billing, on 2026-01-20 (S03) and still showed $5 on 2026-04-01 (S08). Newer source wins → $7 (S17). Implied increase: $7 − $5 = $2/user/mo, +40%, between 2026-04-01 and 2026-08-12. - Reported quotes from call notes (not published prices): $6.50/user/mo, annual term, quoted to a 500-seat prospect (S13, 2026-06-02); $7/user/mo list with a 15% discount offered for a 3-year term (S18, 2026-08-14). 15% off $7 = $5.95/user/mo effective, per S18. - Rivally Pulse: priced as a separate add-on, not bundled — press, 2026-09-01 (S23). No dollar amount for Pulse exists in the data. - No pricing data in the provided files for any other Rivally tier, seat minimums, or non-annual billing. --- WHERE THEY WIN (review/press facts only; no rep opinions) - Recognition feed: points-based feed praised (S02); feed described as engaging (S16). - Time-to-value: setup took under a week and Slack integration worked out of the box, mid-market reviewer (S04). - EU strength: strong for distributed EU teams with multi-language support praised (S12); EU data residency generally available (S15); Dublin office opened (S15); hired ex-Workday VP EMEA to lead European expansion (S11). - Support: response time under 4 hours praised (S22). - Teams: Microsoft Teams app v2 in public preview (S19). - Surveys: Rivally Pulse launched as an add-on (S06), exited beta priced separately (S23). - Balance sheet: $40M Series C led by Northgate Ventures (S01, 2025-11-04). --- WHERE WE WIN Their product gaps, all review-sourced: - Analytics depth: limited analytics noted (S02); reporting dashboards basic vs. enterprise tools (S07); admin tooling lags peers (S16). - Enterprise admin: lacks SCIM provisioning, manual user management called painful (S10); admin console still lacks bulk recognition editing (S24, 2026-09-02). - Exit friction: migration off Rivally was hard because analytics exports are CSV-only (S20). - EMEA rewards: catalog in EMEA thinner than the US catalog (S14). Direct deal evidence: - 800-seat prospect picked Bonusly over Rivally citing analytics depth (S25, 2026-09-03). Win/loss: 13 wins, 7 losses, 65% win rate over the 20 deals in the file (arithmetic in the record section below). --- OBJECTIONS AND RESPONSES 1. "Rivally is cheaper — $5 a seat." Response: their own pricing page was $5 on 2026-01-20 (S03) and 2026-04-01 (S08), but shows $7 as of 2026-08-12 (S17). A $6.50 quote on 500 seats annual was reported mid-year (S13); a 15% 3-year discount off $7 list was reported (S18). Use the $7 page price as current (S17). 2. "Rivally has no Slack integration." (old-card claim) Response: do not use. A reviewer reports Slack integration worked out of the box (S04, 2026-02-02). This claim is retracted as contradicted. 3. "They cover EU residency and multi-language." Response: concede — EU data residency is GA (S15), Dublin office (S15), EMEA leadership hire (S11), multi-language praised (S12). Counter: EMEA rewards catalog is thinner than the US catalog (S14). 4. "Setup is fast." Response: concede — under a week reported (S04). Counter with scale/admin gaps: no SCIM (S10), no bulk recognition editing (S24), admin tooling lags peers (S16). 5. "Rivally Pulse gives them surveys." Response: it is an add-on priced separately, not bundled (S23); launched 2026-03-05 (S06). No Pulse price exists in our data — do not quote one. 6. "Their support responds in hours." Response: concede — under 4 hours praised (S22). No support claim of ours exists in the provided data. 7. "Their reporting is good enough." Response: dashboards basic (S07), analytics limited (S02), exports CSV-only and migration painful (S20). Our 800-seat win turned on analytics depth (S25). Not usable as objections/responses: Bryce Harmon's opinion that Rivally's UI is clunky, explicitly unverified against the product (S09); Elena Sinclair's opinion that Rivally is discounting aggressively, explicitly unconfirmed (S21). Rep opinion, not competitor fact. --- RECENT CHANGES (newest first) - 2026-09-01 — Rivally Pulse exits beta; priced as an add-on, not bundled (S23). - 2026-08-20 — Microsoft Teams app v2 enters public preview (S19). - 2026-08-12 — Pricing page updated: Recognition Starter $5 → $7 per user/month, annual billing (S17; prior $5 at S08, 2026-04-01). - 2026-07-01 — Dublin office opens; EU data residency announced generally available (S15). - 2026-05-09 — Hired ex-Workday VP EMEA to lead European expansion (S11). - 2026-03-05 — Launched Rivally Pulse, lightweight engagement-survey add-on (S06). - 2025-11-04 — Series C: $40M led by Northgate Ventures (S01). --- OUR 12-MONTH WIN/LOSS RECORD VS. RIVALLY Source: deals_with_competitor.csv (no snippet ids in that file — cited by deal alias). Window covered by the data: 2025-09 through 2026-08, 12 monthly buckets. All 20 rows are competitor = Rivally. Wins (13): Deal-A9FD43 (2025-10), Deal-7AA785 (2025-11), Deal-44C524 (2025-12), Deal-0D0CD6 (2026-01), Deal-D5B790 (2026-02), Deal-5C636E (2026-03), Deal-67BE14 (2026-06), Deal-1B6969 (2026-07), Deal-F03E7B (2026-08), Deal-072E31 (2025-09), Deal-F65C8F (2025-10), Deal-E46EAB (2026-01), Deal-1D2392 (2026-02). Losses (7): Deal-7767F5 (2025-09), Deal-5645A5 (2026-04), Deal-C6FFAA (2026-05), Deal-D263E0 (2025-11), Deal-935746 (2025-12), Deal-9066A6 (2026-03), Deal-72A02F (2026-04). Arithmetic: 13 + 7 = 20 total; 13 / 20 = 0.65 → 65% win rate. Half-split trend: - 2025-09 → 2026-02 (12 deals): 9 wins / 3 losses = 9/12 = 75%. - 2026-03 → 2026-08 (8 deals): 4 wins / 4 losses = 4/8 = 50%. - Check: 9 + 4 = 13 wins; 3 + 4 = 7 losses; 12 + 8 = 20 total. Monthly: 2025-09 1W/1L · 2025-10 2W · 2025-11 1W/1L · 2025-12 1W/1L · 2026-01 2W · 2026-02 2W · 2026-03 1W/1L · 2026-04 0W/2L · 2026-05 0W/1L · 2026-06 1W · 2026-07 1W · 2026-08 1W. Caveat: rows are month-grained only. A strict trailing-12-months-from-2026-09-24 window starts 2025-09-24, and the two 2025-09 rows (Deal-7767F5, Deal-072E31) cannot be placed on either side of that line with the data given. Stated window = the full file, 2025-09 to 2026-08. No deal-size, ARR, pipeline, or stage data exists in the provided files — none reported. --- OLD CARD AUDIT - "Positioning: points-based recognition for mid-market." → points-based recognition re-sourced (S02). "Mid-market" as their target segment: UNVERIFIED — no snippet states Rivally's positioning targets mid-market (S04 only shows a mid-market reviewer exists). - "Pricing: starts at $5 per user/month, annual billing (as of 2026-01)." → re-sourced but superseded: $5 at 2026-01-20 (S03) and 2026-04-01 (S08); current $7 at 2026-08-12 (S17). - "Rivally lacks a Slack integration." → CONTRADICTED (S04). Retracted. - "Rivally was acquired by WorkHuman in 2025." → UNVERIFIED. No snippet supports an acquisition. S01 (2025-11-04) reports Rivally announcing its own $40M Series C led by Northgate Ventures; the provided data does not reconcile that with an acquisition claim. - "Strong in EU enterprise with multi-language support." → VERIFIED (S12), reinforced by S11 and S15. Data explicitly missing (stated, not invented): Bonusly-side product/pricing claims, seat counts or deal values, competitor customer counts, Pulse pricing, any source for the WorkHuman acquisition, and any re-source for mid-market positioning.
PER SEQUENCE (totals / sent)
New Logo Nurture: sent 1,386 | open 490/1,386 = 35.4% | reply 90/1,386 = 6.5% | meetings 27/1,386 = 2.0% (27/90 = 30% of replies). Weakest step: step 3 (reply 18/428 = 4.2%; open 28.0%).
Expansion Nurture: sent 875 | open 565/875 = 64.6% (unusable, see tracking error; excluding step 2: 225/575 = 39.1%) | reply 59/875 = 6.7% | meetings 12/875 = 1.4% (12/59 = 20.3%). Weakest step: step 3 (reply 12/275 = 4.4%).
Cold Outbound - HR Leaders: sent 1,785 | open 545/1,785 = 30.5% | reply 8/1,785 = 0.45% | meetings 0/1,785 = 0%. Weakest step: step 3 (reply 1/590 = 0.17%).
Cold Outbound - People Ops: sent 1,163 | open 340/1,163 = 29.2% | reply 29/1,163 = 2.5% | meetings 6/1,163 = 0.52% (6/29 = 20.7%). Weakest step: step 3 (reply 6/377 = 1.59%).
TRACKING ERROR: Expansion Nurture step 2 - opened 340 > sent 300 (113.3%). Only violation; its sequence open rate is inflated until fixed.
AUDIENCE OVERLAP: 23 of 940 unique contacts (963 rows, no exact dupes) sit in two sequences each: 21 in "Cold Outbound - HR Leaders" + "Cold Outbound - People Ops" - CT-000849, CT-000884, CT-000890, CT-000908, CT-001033, CT-001097, CT-001101, CT-001103, CT-001105, CT-001130, CT-001153, CT-001159, CT-001217, CT-001227, CT-001236, CT-001255, CT-001258, CT-001277, CT-001285, CT-001311, CT-001345; 2 in "Expansion Nurture" + "New Logo Nurture" - CT-000301, CT-000624.
FAILURE MODE under 2% reply: only "Cold Outbound - HR Leaders" at sequence level (0.45%). Opens are healthy (30.5%) but just 8/545 = 1.5% of openers reply and meetings = 0, so this is not a deliverability/subject-line problem - it is post-open message-to-offer and buyer-fit failure. ("Cold Outbound - People Ops" step 3 = 1.59% is also under 2% at step level.)
ONE CHANGE PER WEAK SEQUENCE:
- Cold Outbound - HR Leaders: rewrite step 1's ask into one specific, low-friction CTA tied to an HR-leader outcome. FIX FIRST - largest volume (1,785 sends), zero meetings.
- Cold Outbound - People Ops: replace step 3 (1.59% reply, 0.27% meetings) with a re-ask referencing step-1 interest.
WEEKLY MARKETING GOALS UPDATE — Q3-2026 (2026-07-01 → 2026-09-30)
Source: marketing_qtd.csv, targets.csv, quarter_meta.csv (nothing else used)
Pace basis: 66 / 92 days elapsed = 71.7% of quarter.
Pace benchmark per metric = target x 66/92.
```
METRIC QTD ACTUAL TARGET DELTA % OF TARGET PACE BENCHMARK PACE
SQMs 230 300 -70 76.7% 300x66/92 = 215.2 AHEAD (+14.8)
SQOs 84 120 -36 70.0% 120x66/92 = 86.1 BEHIND (-2.1, marginal)
DS2s 40 75 -35 53.3% 75x66/92 = 53.8 BEHIND (-13.8)
Closed-lost MIA rate 5/25 = 20.0% <=10% +10.0 pp 2.0x target n/a (rate, not flow) BEHIND
Same-quarter closes 10 20 -10 50.0% 20x66/92 = 14.3 BEHIND (-4.3)
Active pipeline cover. $3,000,000 $4,000,000 -$1,000,000 75.0% 4,000,000x66/92 AHEAD (+$130,435)*
= $2,869,565
```
Arithmetic shown:
- SQMs: 230 - 300 = -70; 230/300 = 76.7% vs 71.7% elapsed → ahead. Benchmark 300 x 66/92 = 215.2; 230 - 215.2 = +14.8.
- SQOs: 84 - 120 = -36; 84/120 = 70.0% vs 71.7% → marginally behind. Benchmark 86.1; 84 - 86.1 = -2.1.
- DS2s: 40 - 75 = -35; 40/75 = 53.3% vs 71.7% → behind. Benchmark 53.8; 40 - 53.8 = -13.8.
- MIA rate: 5 / 25 = 0.200 = 20.0%; target 0.10; delta = 20.0% - 10.0% = +10.0 pp (lower is better → behind). Rate is 2.0x the allowed level.
- Same-quarter closes: 10 - 20 = -10; 10/20 = 50.0% vs 71.7% → behind. Benchmark 14.3; 10 - 14.3 = -4.3.
- Active pipeline: 3,000,000 - 4,000,000 = -1,000,000; 3,000,000/4,000,000 = 75.0% vs 71.7% → ahead of linear pace. Benchmark 2,869,565; 3,000,000 - 2,869,565 = +130,435.
* Caveat: active pipeline is a point-in-time stock, not an accumulating flow, so a linear-days pace test is only an approximation; the durable read is 75.0% of the $4,000,000 target with 71.7% of the quarter gone.
WHAT MOVED THIS WEEK
Cannot be stated from these files: only QTD totals were provided — there is no prior-week snapshot, so no week-over-week delta for any metric is computable, and I will not invent one. On current-quarter standing alone: SQMs are the sole flow metric ahead of pace (230 vs 215.2 benchmark, +14.8) and account for most of the top-of-funnel; SQOs are essentially flat to pace (-2.1, statistically marginal at this scale); the mid- and bottom-funnel are the drag — DS2s at 53.3% of target (-13.8 vs pace) and same-quarter closes at 50.0% of target (-4.3 vs pace) both sit roughly 18-22 pp behind elapsed time; closed-lost MIA rate is 20.0% against a <=10% target (5 of 25 closed-lost deals), double the allowed level; active pipeline sits at 75.0% of target, the only other metric above the 71.7% pace line. Net: demand generation is on track, conversion and close timing are not.
MISSING DATA (stated explicitly, not estimated)
1. Prior-week values for all six metrics — required for a true "what moved this week" paragraph.
2. The closed-lost MIA rate here uses closed_lost_mia / closed_lost_total = 5/25. If the intended metric is the MIA + No Decision rate, the numerator file lacks the "Doing nothing/Not a priority/Cost" tag count — rate would be >= 20.0%, not exactly 20.0%.
3. No deal- or company-level rows were provided, so no aliases are cited and no segment/stage breakdowns are possible.
Q3 weighted forecast is 115,977: 44,729 COMMIT plus 71,248 (35% of 203,565 BEST_CASE), PIPELINE at zero. Caveat: all 7 in-quarter COMMIT deals have empty why-buys and 85 of 86 deals have no owner, so the number cannot be validated or rolled up by rep. Treat it as directional, not bankable.
**Subject: Follow-up — 150-seat pricing from the July 28 demo** Hi — following up on my August 5 email with pricing for 150 seats, sent right after our July 28 demo where your team responded strongly to the automated milestone awards and the points catalog. I want to make sure it didn't get buried. One ask: could we take 20 minutes this week or next to walk through the pricing and see if it fits the recognition budget you own? If the timing is off, just say so and I'll follow up later. Best, Alex Franklin (87 words. References ENG-00001 / ENG-00002 only; single ask — a 20-minute pricing call. Recipient name not in the data, so left as-is.)
Week of 2026-08-31 GTM digest: **Marketing** — Marketing brought in 46 SQMs against a target of 52 for the week (46 − 52 = −6 short of plan, ~88% of target). The webinar channel punched above its weight, delivering 18 of those 46 SQMs — nearly 40% of weekly volume from a single channel. Paid search efficiency held steady at a cost per SQM of $150. **Sales** — Sales converted 14 SQOs and set 9 DS2 meetings, with new pipeline created of $310,000 for the week. Same-quarter close count landed at 3, keeping near-term momentum in the books alongside the pipeline being built. **CS** — CS saved 2 renewals this week and moved Team NPS to 61. Looking ahead, 3 open red-flag accounts are heading into next week — a short, focused list to get in front of early. **PLG** — PLG added 412 new signups with activation at 31% (412 × 0.31 ≈ 128 activated signups). On the product side, 38 companies reached the aha moment of 10 recognition gives — the clearest signal yet that the core habit is taking root. Data note: figures are stated as extracted from week_extracts.md; activation count is arithmetic from the two provided PLG numbers.
PARTNER DIGEST — period 2026-08-24 to 2026-09-04 Sources: partner_roster.csv, partner_slack.md, partner_deals.csv PARTNER-SOURCED PIPELINE (from partner_deals.csv) Deal rows with utm_source = Partner: 5 180,000 + 95,000 + 140,000 + 60,000 + 75,000 = 550,000 Total: 5 deals, $550,000 ACTIVE PARTNERS (status = active) 1. Apex Rewards Co — 2 deals, $275,000 180,000 (Deal-DDAAF2) + 95,000 (Deal-2CF33E) = 275,000 Slack 2026-08-25: co-webinar locked for 09-15; two sourced opps this week, both in DS1, logged with UTM Source = Partner. 2. HRCloud Partners — 1 deal, $140,000 140,000 (Deal-F1CDA5) = 140,000 Slack 2026-08-27: integration referral closed the security review, opp moved to DS2; one sourced opp this period. 3. CultureBridge — 2 deals, $135,000 60,000 (Deal-096E1D) + 75,000 (Deal-067213) = 135,000 Slack 2026-08-29: lunch-and-learn produced two sourced opps, both early stage. 4. WorkWell Group — 0 deals, $0 No rows in partner_deals.csv. Slack 2026-09-02: no sourced deals this period; wants to restart the joint playbook in Q4, planning call booked for 09-09. QUIET PARTNERS (status = quiet) — one line each - Recogniq: quiet — no deal rows and no Slack messages provided for this period. - KudosWave: quiet — no deal rows and no Slack messages provided for this period. - PeopleFirst Advisors: quiet — no deal rows and no Slack messages provided for this period. - TotalPerk: quiet — no deal rows and no Slack messages provided for this period. RECONCILIATION Deal count: 2 + 1 + 2 + 0 (active) + 0 (quiet) = 5 = 5 rows in partner_deals.csv Amount: 275,000 + 140,000 + 135,000 + 0 + 0 = 550,000 = sum of all 5 deal rows All 8 roster partners appear exactly once; 4 active, 4 quiet. DATA GAPS (stated, not filled) - No stage, close-date, or owner fields exist in partner_deals.csv; DS1/DS2 stage references come only from Slack text. - No deal or Slack records were provided for the four quiet partners — "quiet" reflects absence of provided records, not confirmed zero activity.
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, available to prospects under NDA. [P2] Q4 — Customer data is retained for the duration of the contract plus 90 days after termination, after which it is deleted from production systems. [P3] Q5 — The subprocessor list is published at trust.bonusly.com. Customers receive 30 days' notice before a new subprocessor is added. [P4] Q6 — Yes. SAML 2.0 single sign-on is supported, along with SCIM user provisioning; both are available on the Enterprise plan. [P5] Q7 — Production databases are backed up daily. Backups are encrypted and retained for 35 days. [P6] Q8 — Unanswerable from these excerpts. The excerpts mention SOC 2 Type II [P2] but nothing about ISO 27001. The Trust portal's certifications page (or a certification register document) would answer this. Q9 — Unanswerable from these excerpts. No uptime SLA percentage appears in any excerpt. The MSA / service level agreement document would answer this. Q10 — Unanswerable from these excerpts. No mention of HIPAA or BAA willingness appears in any excerpt. A BAA template or legal/compliance policy document would answer this.
RECONCILIATION — 14 skill files vs skill_manifest.csv. Findings only, one proposal each, nothing rewritten.
=====================================================================
(1) DUPLICATE ALWAYS-TRIGGER PHRASES
=====================================================================
F1 [CRITICAL] [TRIM_DESC] — comms-drafter vs email-drafter
Six trigger phrases are claimed verbatim by both descriptions:
"write me an email" · "draft a follow-up" · "help me reply" ·
"what should I say" · "bump email" · "contract nudge"
Plus the same paste-an-email-for-feedback trigger. Both are blanket-scoped
("whenever ANYONE ... needs to write" / "whenever anyone asks ... of any kind"),
so every email ask matches two ALWAYS skills with no tiebreaker.
Proposal: TRIM_DESC on comms-drafter — delete the six shared email phrases and
the paste-email-for-feedback clause, reserving comms-drafter for partner,
Intercom/support, QBR, renewal and channel copy; email-drafter keeps email.
F2 [WARNING] [TRIM_DESC] — pipeline-intelligence-report vs weekly-pipeline-report
Shared/indistinguishable phrases: "pipeline update" (PIR: "pipeline update";
WPR: "run the pipeline update"), "what's the pipeline look like" vs
"what does pipeline look like". Both also say NEVER answer pipeline questions
inline without running — so both claim the same always-on mandate.
Proposal: TRIM_DESC on weekly-pipeline-report — scope its trigger set to its
own artifact ("weekly pipeline report", SQM/SQO/DS2 metrics, bookings MTD,
"this week's numbers") and drop generic "pipeline update" phrasing, since
pipeline-intelligence-report declares itself the master scoring skill.
Note (no action): next-to-close already de-conflicts itself against
pipeline-intelligence-report with an explicit "Do not use
pipeline-intelligence-report for this" carve-out.
=====================================================================
(2) CIRCULAR DELEGATION CHAIN
=====================================================================
F3 [WARNING] [UPDATE_BODY] — chain: deal-strategy-coach <-> email-drafter
comms-drafter -> deal-strategy-coach ("use deal-strategy-coach")
deal-strategy-coach -> email-drafter ("use the email-drafter skill" for
manager-to-prospect emails)
email-drafter -> deal-strategy-coach ("point them to the
deal-strategy-coach skill")
Two-node cycle; comms-drafter feeds into it. Every other delegation in the
set is one-way (pipeline-intelligence-report -> closed-lost-analysis;
analysis-validator -> bonusly-* specialists; claim-compressor -> validator).
Proposal: UPDATE_BODY on email-drafter — make its lane marker a terminal
hand-off ("route strategy asks to deal-strategy-coach; do not return the
session to this skill"), leaving deal-strategy-coach -> email-drafter as the
only edge.
=====================================================================
(3) DANGLING DELEGATION TARGETS (not in the manifest or file set)
=====================================================================
F4 [CRITICAL] [REVIEW] — 16 referenced targets with no manifest row and no file:
Mandated-step breakers:
skill-orchestrator (analysis-validator §11; signalforge-feedback activation
checklist requires registration as terminal step)
bonusly-brand (Step 0 of comms-drafter and email-drafter; exclusion rule in
signalforge-claim-compressor; sales-forecast brand rule)
prospect-research-multithreading (comms-drafter x2, email-drafter x2,
deal-strategy-coach handoff)
analysis-validator §12.4 specialist delegation (8): bonusly-data-questions
(also cited in G1-J), bonusly-product-questions,
bonusly-business-reporting-questions, bonusly-rewards-questions,
bonusly-ppp-questions, bonusly-feature-flag-questions,
bonusly-deal-desk-questions, bonusly-datadog-questions
analysis-validator §11 cascading files (3): CUSTOMER_DATA_REFERENCE,
HUBSPOT_CONNECTOR_REFERENCE, SIGNALFORGE_PRODUCT_INSIGHT_SKILL
Other: signalforge-reports (absolute /mnt/skills/organization/ path read by
pipeline-intelligence-report and weekly-pipeline-report), caveman
(signalforge-claim-compressor integration section)
Proposal: REVIEW — verify each of the 16 against the full library; either add
manifest rows for the ones that exist or delete the invocation, in priority
order skill-orchestrator, bonusly-brand, prospect-research-multithreading.
=====================================================================
(4) VERSION CONFLICTS
=====================================================================
F5 [WARNING] [UPDATE_BODY] — analysis-validator version string
Body/changelog declare v3.6 (May 9, 2026); pipeline-intelligence-report
footer cites "Analysis Validator v3.6"; but the Validation Trail template in
§7 hardcodes "Validator: analysis-validator v3.2".
Survivor: v3.6 (2 of 3 references already agree).
Proposal: UPDATE_BODY — replace the v3.2 literal in the trail template with
the live version token.
F6 [WARNING] [UPDATE_BODY] — deal-stage model
deal-strategy-coach defines 6 stages DS0–DS5 (DS0 Discovery Booked) with no
HubSpot IDs; analysis-validator §12.2, pipeline-intelligence-report,
next-to-close and stale-pipeline-report all define 5 stages DS1–DS5 bound
to IDs 150582536 / 150582537 / 150582538 / 150582539 / 1175632767.
Probabilities agree (DS1 10, DS2 30, DS3 50, DS4 80, DS5 90); the delta is
DS0, which has no queryable ID.
Survivor: the ID-mapped DS1–DS5 model (4 skills, and it is the query
contract every pull uses).
Proposal: UPDATE_BODY on deal-strategy-coach — align its table to the
ID-mapped DS1–DS5 and mark DS0 as a pre-pipeline, untracked state.
F7 [INFO] [UPDATE_BODY] — model-selection registry staleness
last_checked: 2026-05-19, with an in-body rule requiring self-update if
more than 14 days have passed. Today is 2026-09-25: 12 + 30 + 31 + 31 + 25
= 129 days past, 115 over the 14-day gate.
Survivor: the skill itself (registry needs refresh, not removal).
Proposal: UPDATE_BODY — run the documented self-update and refresh
last_checked before any model recommendation is issued.
=====================================================================
(5) MANIFEST DESCRIPTIONS EXCEEDING 1,024 CHARACTERS
=====================================================================
Count = 0.
description_chars values: 656, 897, 996, 792, 965, 676, 945, 1004, 1006,
962, 1006, 708, 762, 656. Max = 1,006 (pipeline-intelligence-report and
signalforge-claim-compressor). 1,024 − 1,006 = 18 chars of headroom.
No finding.
=====================================================================
(6) HARDCODED PAGE IDS, DATES, PERSON NAMES IN BODIES
=====================================================================
F8 [WARNING] [UPDATE_BODY] — concentrated in 9 of 14 files:
Page/document IDs:
partner-digest: cloudId 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f, spaceId
1958248479, folder 2286616609, pages 2286321666, 2265382925, 2236940297,
2237825028, 2239365136, 2238283777; Slack user U03QLMBL7AR
sales-forecast: spaceId 2232811524, parent 2232582148, cloudId
73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f
signalforge-feedback: page 2295136266, space 2232811524, parent 2234417154,
Build Log 2247295002
weekly-pipeline-report: spreadsheet IDs 1CLZeOsElVDF_LF0ZG_t2nfwvhnZ6bpwqM_nX3WEYzcw
and 1ENuaEcCuLjdKhMvp8FK3Ys1ek5Aw9ZuOZhsHJJFoB_k
deal-strategy-coach: playbook page 2257879045
pipeline-intelligence-report / next-to-close / stale-pipeline-report:
HubSpot org 1973303 in URL patterns (stable constant, lower risk)
Dates:
analysis-validator: April 26 2026 (created), May 4 2026 (roster,
CALL_SPOTLIGHT_BRIEF removal, CLOSEDWON confirmed), May 9 2026 (last
updated + 6 changelog rows), "March 28, 2023" (stale DEALS), "May 2026"
universe ranges
model-selection: 2026-05-19 (last_checked/changelog), April 14 2026,
knowledge cutoffs
partner-digest: May 16/19 2026, June 2 2026 examples
sales-forecast: April 27 2026, "July 9, 2026" title example
weekly-pipeline-report: "April 1 – June 30, 2026", "Q1 2026 context (static)"
closed-lost-analysis: "May 2026" sample, "May 4–12" rep vacation,
"March 28, 2023"
stale-pipeline-report: 5/7, 5/15, 5/19 examples; claim-compressor and
signalforge-feedback: changelog/date literals
Person names:
analysis-validator §12.3: 19 named people with HubSpot owner IDs (Alaina
Loori 82535637, Bryce Harmon 119337721, Hugo Lindqvist 77260721, Dana
Mercer 83155923, Alex Franklin 84342457, Cole Ingram 83155924, Gavin
Porter 1520255671, plus 7 CSMs, Shealagh Coughlin, Ben Castelli, Amani
Phipps, John Thomas, Yasmin Wahid) + Finance escalation names Manish/Amani
pipeline-intelligence-report: 5 AEs with owner IDs — omits Hugo Lindqvist,
so its "verified May 2026" roster is already 5 names vs the Core 6 in
analysis-validator (concrete drift evidence)
weekly-pipeline-report: "Ben Lavin" (H1 title and Step 3)
sales-forecast: Alaina, Elena (changelog); stale-pipeline-report: Alaina
signalforge-feedback: example titles "Gavin Porter Rep Diagnostic",
"Lowe's Conversation Analysis"; claim-compressor: JuliusBrussee handle
partner-digest: Amani Phipps, Kelli, Jen Lee, Hani, Bryce, Sara
Notably clean: comms-drafter, email-drafter, next-to-close (no names/dates/IDs
beyond the org constant).
Proposal: UPDATE_BODY — strip the two mutable classes (person rosters with
owner IDs, dated roster/"as of" stamps) into runtime resolution, following
the pattern stale-pipeline-report Phase 2 already mandates ("Never hardcode
rep names or owner IDs"); leave stable publish destinations (Confluence
folder/page IDs) in place as config.
=====================================================================
(7) MANIFEST DRIFT, BOTH DIRECTIONS
=====================================================================
Files with no manifest row: 0.
Manifest rows with no file: 0.
Arithmetic: 14 files provided, 14 manifest rows; set equality holds, and all
14 declared_name values match their frontmatter name: 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.
Two-way diff = {0, 0}.
F9 [INFO] [REVIEW] — no row/file drift, but the manifest is silently narrower
than the skill graph: the 16 targets in F3/F4 are invoked by manifest skills
and appear in neither direction of the diff.
Proposal: REVIEW — declare manifest scope explicitly (this set only) or add
rows for the referenced skills so future drift checks can detect their loss.
RUNBOOK — #incident-2026-08-29-reward-queue (resolved) Source: incident_thread.md only. Nothing added beyond the thread. STEP 1 — Acknowledge alert, take IC [M01] Action: Acknowledged PagerDuty alert (reward-worker queue depth > 10k), took IC. Actor: Bryce Harmon Verification: Alert fired and was acknowledged (M01 itself); no independent verification documented. Rollback: Not documented — needs confirmation. STEP 2 — Measure queue depth [M02] Action: `bundle exec rake sidekiq:queue_depth` Actor: Farid Osman Result: 48,213 pending jobs; normal reported as under 500. Verification: Command output (M02). Read-only — no rollback needed. STEP 3 — Inspect dead set [M03] Action: Reported dead set contents: 112 jobs, all Redis::TimeoutError from around 13:58. Actor: Farid Osman Verification: Inspection command not shown in thread — needs confirmation. Read-only — no rollback needed. STEP 4 — Pause enqueue [M04] (state change) Action: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` Actor: Farid Osman Verification: No direct flag-state verification recorded — needs confirmation. (Queue improvement in M07/M08 is not proof of this flag's state.) Rollback (as documented in M04): `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` STEP 5 — Clear dead set [M05] (state change, destructive) Action: Cleared out the dead set via the console (exact command not given). Actor: Elena Sinclair Verification: No independent verification recorded — needs confirmation. Rollback: Not documented — needs confirmation. Thread gives no command or reversal for this step. STEP 6 — Scale workers up [M06] (state change) Action: `kubectl scale deployment/reward-worker --replicas=6` (was 3) Actor: Bryce Harmon Verification: No direct replica-count verification recorded — needs confirmation. M07/M08 are later queue observations, not isolated proof of this action. Rollback (as documented in M06): `kubectl scale deployment/reward-worker --replicas=3` STEP 7 — Progress check [M07] Actor: Farid Osman Report: Queue depth 9,400 and falling ~1,200/min. Note: Measurement command not shown — needs confirmation. Reported result, not direct verification of any prior step. STEP 8 — Verify recovery [M08] Action: `bundle exec rake sidekiq:queue_depth` Actor: Cole Ingram Result: Returns 0. Error rate in Datadog reported back to baseline. Verification: Direct command output for queue depth (M08); Datadog error rate is a reported observation. Read-only — no rollback needed. STEP 9 — Re-enable enqueue [M09] (state change) Action: `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` Actor: Bryce Harmon Verification: 40 new jobs processed cleanly in the next 3 minutes (M09). Rollback: Not documented — needs confirmation. Thread does not document an approved reversal for this step. STEP 10 — Scale workers back down [M10] (state change) Action: `kubectl scale deployment/reward-worker --replicas=3` Actor: Bryce Harmon Verification: Queue stable at 0; incident resolved (M10). Direct replica-count verification not recorded — needs confirmation. Rollback: Not documented — needs confirmation. Thread does not document an approved reversal for this step. Gaps requiring confirmation (all traceable to the thread): - M03 inspection command (exact command not shown) - M04 flag state never directly verified - M05 dead-set clear: exact command, verification, and rollback all absent - M06/M10 replica count never directly verified - M07 measurement command not shown - M09 and M10 rollbacks not documented No new metrics calculated; all numbers reproduced as reported (48,213; <500; 112; 9,400; ~1,200/min; 0; 40 jobs / 3 min; replicas 3→6→3).
FIRST ERROR
2026-09-03T14:01:12Z — service: reward-service, level: ERROR, message: "Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s". This is the first non-INFO line in datadog_logs.csv; everything before it (13:55:13Z–13:59:30Z) is INFO.
CASCADE, IN ORDER
1. 14:01:12Z reward-service — Redis::TimeoutError connecting to redis-primary:6379 (5s timeout). Origin point.
2. 14:01:20Z, 14:01:30Z, 14:01:40Z reward-service — "Redis::TimeoutError: retry exhausted for RewardGiveJob" (3 lines).
3. 14:01:40Z sidekiq — "RewardGiveJob failed: Redis::TimeoutError; retrying in 60s" (same timestamp as step 2's last line; also 14:01:40Z, so ordering within that second is not determinable).
4. 14:01:46Z–14:01:57Z sidekiq_jobs.csv — first job-record failures: J-00005 (14:01:46Z), J-00001 (14:01:51Z), J-00003 (14:01:54Z), J-00006 (14:01:55Z), J-00002 (14:01:56Z), J-00004 (14:01:57Z) = 6 RewardGiveJob failures in an 11-second span. First failed job is 34s after the first error (14:01:12 → 14:01:46).
5. 14:02:28Z sidekiq — "RewardGiveJob failed: Redis::TimeoutError; retrying".
6. 14:02:30Z sidekiq WARN — "Queue reward depth above 10,000" (78s after first error: 14:01:12 → 14:02:30).
7. 14:02:36Z sidekiq_jobs.csv — J-00013 RecognitionDigestJob fails (14:02:36Z), then J-00014 (14:03:15Z), J-00015 (14:04:55Z), J-00016 (14:05:50Z) = 4 RecognitionDigestJob failures. Failure spreads beyond RewardGiveJob.
8. 14:02:51Z–14:02:58Z sidekiq_jobs.csv — second RewardGiveJob cluster: J-00007 (14:02:51Z), J-00011 (14:02:51Z), J-00008 (14:02:56Z), J-00010 (14:02:57Z), J-00012 (14:02:57Z), J-00009 (14:02:58Z) = 6 more, in a 7-second span. RewardGiveJob total = 6 + 6 = 12.
9. 14:03:05Z api-gateway — "502 upstream timeout calling reward-service /gives" (113s after first error). First downstream impact.
10. 14:03:30Z web-app — "Give form submission failed: upstream 502 from api-gateway" (138s = 2m18s after first error). First user-facing failure.
11. 14:03:31Z–14:06:52Z — repeating cycle of sidekiq retries (14:03:31Z, 14:04:22Z, 14:05:26Z, 14:06:47Z), api-gateway 502s (14:03:48Z, 14:04:13Z, 14:05:16Z, 14:06:52Z), and web-app give-form failures (14:04:45Z, 14:05:42Z, 14:06:49Z). Log-side total: 19 ERROR lines + 1 WARN line.
12. Last error in slice: 14:06:52Z api-gateway 502. Error span 14:01:12Z → 14:06:52Z = 5m40s.
13. 14:10:56Z–14:20:59Z — only postgres INFO "checkpoint complete" lines (6 of them); no reward-service, sidekiq, api-gateway, or web-app lines. Silent gap from last error (14:06:52Z) to recovery line (14:22:10Z) = 15m18s.
14. 14:22:10Z reward-service INFO — "Redis connection restored; resuming job processing" (20m58s after first error).
15. 14:24:45Z sidekiq INFO — "Queue reward depth below 500" (22m15s after the >10,000 warning at 14:02:30Z).
SERVICE AND JOB INVOLVED
- Origin service: reward-service; failing dependency: redis-primary:6379 (no logs from a redis service appear in the slice).
- Worker: sidekiq.
- Primary job: RewardGiveJob — 12 of 16 rows in sidekiq_jobs.csv (J-00001 through J-00012), all error Redis::TimeoutError.
- Secondary job: RecognitionDigestJob — 4 of 16 rows (J-00013 through J-00016), all error Redis::TimeoutError. 12 + 4 = 16 total.
- Downstream services (consequence, not origin): api-gateway (502 on reward-service /gives), web-app (give form submissions). postgres appears only as INFO.
DATADOG QUERY CONFIRMING THE FIRST ERROR
service:reward-service status:error "Redis::TimeoutError" "redis-primary:6379"
Time range: 2026-09-03T14:01:00Z to 2026-09-03T14:02:00Z (UTC).
Expected single confirming hit at 14:01:12Z with message "Connection to Redis at redis-primary:6379 timed out after 5s", followed by the 14:01:20Z/14:01:30Z/14:01:40Z retry-exhausted lines. Attribute-name note: the CSV columns are timestamp/service/level/message; if the Datadog index uses `level` instead of `status`, substitute `level:error`. Field names beyond those four columns are not given in the data, so that substitution is unverified.
WHAT THE LOGS DO NOT SHOW
- Root cause of the Redis timeout: no redis service logs, no latency/CPU/memory/network/deployment/ failover events anywhere in the slice, and no WARN or ERROR of any kind before 14:01:12Z.
- What happened during 14:06:52Z–14:22:10Z: only postgres INFO checkpoints; no evidence of a restart, deploy, failover, or manual remediation. "Redis connection restored" is asserted with no stated cause or actor.
- Exact queue depth: only thresholds are logged ("above 10,000", "below 500") — no exact depth, no drain rate, no backlog size.
- Impact counts: no number of failed give-form submissions, no affected user or reward count, no retry-success count. Depth below 500 at 14:24:45Z is not zero, and no line confirms the 16 failed jobs eventually succeeded.
- Causal linkage: no trace IDs, request IDs, or job IDs join datadog_logs.csv to sidekiq_jobs.csv — ordering is temporal only, not proven causation.
- Completeness of sidekiq_jobs.csv: no queue name, no retry count, no payload, no backtrace; 16 rows may be a sample, not the full failure set.
- Pre-onset health: no signal between 13:59:30Z (last INFO before the gap) and 14:01:12Z — a 1m42s window with no log lines — so the onset time of the underlying Redis degradation is unknown; 14:01:12Z is only the first observed error.
- Whether 14:06:52Z is truly the last error or the end of the slice's coverage.
9 flags in the export; 6 have code references, 3 do not. Counts below are exactly as exported (per-flag, not deduplicated — a company can appear in multiple flags). FLAG-BY-FLAG recognition_streaks_v2 — state: on - Controls (app/models/recognition.rb): when enabled for a company, `StreakTracker.record(give)` runs — streak tracking on give actions. - Targeting: segment:beta_companies - Companies: 42 points_budget_guardrails — state: on - Controls (app/services/budget_service.rb): when enabled, `BudgetService.new(company).enforce!(giver, points)` — enforces per-giver points budget limits. - Targeting: all_companies - Companies: 220 (export's stated count for the all-companies segment) slack_dm_nudges — state: on - Controls (app/jobs/nudge_job.rb): job returns early unless enabled; when on, `SlackDm.send_nudge(user)` — Slack DM nudges. - Targeting: segment:region_na - Companies: 87 redeem_flow_redesign — state: off - Controls (app/controllers/redeem_controller.rb): on → `render RedeemV2Component`; off → `render RedeemV1Component`. So the 12 listed companies are currently on V1. - Targeting: targeted_list - Companies: 12 analytics_dashboard_v3 — state: on - Controls (app/controllers/analytics_controller.rb): when on, `@dashboard = AnalyticsV3.new(company)` — v3 analytics dashboard. - Targeting: segment:tier_three - Companies: 65 ms_teams_app_v2 — state: off - Controls (app/services/teams_installer.rb): when on, `TeamsAppV2.install(company)` — Teams app v2 install. Currently off, so no installs triggered for the listed targets. - Targeting: targeted_list - Companies: 9 NO CODE REFERENCE in the excerpt (3 flags) — what they control is not determinable from the provided files: legacy_give_modal — state: off; targeting: segment:legacy_plan; companies: 14. No code excerpt references this flag. survey_boosters_q3 — state: on; targeting: segment:legacy_plan; companies: 7. No code excerpt references this flag. paused_offboard_cleanup — state: off; targeting: (empty in export); companies: 0. No code excerpt reference AND no targeting rules and zero target companies. ARITHMETIC Flags by state: on = 5 (recognition_streaks_v2, points_budget_guardrails, slack_dm_nudges, analytics_dashboard_v3, survey_boosters_q3); off = 4 (redeem_flow_redesign, ms_teams_app_v2, legacy_give_modal, paused_offboard_cleanup). 5 + 4 = 9 total ✓ matches export rows. Sum of company_count, flags on: 42 + 220 + 87 + 65 + 7 = 421. Sum of company_count, flags off: 12 + 9 + 14 + 0 = 35. Sum all rows: 421 + 35 = 456. These are per-flag sums only — the export provides no way to deduplicate overlapping companies, so 456 is not a unique-company count. Coverage: 6 of 9 flags have code references (6/9); 3 of 9 have none (3/9). Flags with zero targets: 1 (paused_offboard_cleanup). Flags with empty targeting_rules: 1 (paused_offboard_cleanup). Not determinable from provided data: total company universe (all_companies = 220 is stated, but no export field confirms 220 is the full universe), segment membership definitions, and what the 3 code-unreferenced flags do.
TRIAGE
NDA-1 — [PARTY A] and Bonusly: GREEN
Reasoning: Mutual, properly balanced, and complete — no embedded restrictive covenants, standard carve-outs present, ordinary term and forum.
- Driver (cl. 3): "Carve-outs: information that (a) is or becomes publicly available through no breach, (b) was known prior to disclosure, (c) is received from a third party without duty of confidence, (d) is independently developed, or (e) must be disclosed by law or court order." — all five customary carve-outs present.
- Term check: 2-year term, "obligations survive for three (3) years after termination" — ordinary. Governing law (cl. 4): "the laws of the State of Delaware, USA" — standard for a US counterparty. No non-solicit, non-compete, exclusivity, or license issues (cl. 5 expressly disclaims exclusivity).
NDA-2 — [PARTY B] and Bonusly: YELLOW
Reasoning: Everything else is standard, but a non-solicit is buried in clause 4 of a confidentiality agreement and should be scoped/limited by counsel before signing.
- Driver (cl. 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." — embedded non-solicitation (with a hire ban, i.e., not just no-cold-contact).
- Mitigating: 18 months is shorter than NDA-3's covenant and is limited to employees "with whom it came into contact under this Agreement," not the whole workforce. Carve-outs (cl. 2) are complete ("publicly available, previously known, third-party receipt, independent development, legally required disclosure"), governing law (cl. 3) is "the laws of the State of Delaware, USA," and term (cl. 1) is 3 years.
NDA-3 — [PARTY C] and Bonusly: RED
Reasoning: Non-mutual, no carve-outs, a 3-year non-compete, and foreign exclusive-forum governing law — multiple full-legal-review triggers in one agreement.
- Driver (cl. 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." — embedded non-compete, broad ("directly or indirectly... any business that competes"), running against Bonusly as Recipient for 3 years.
- Driver (cl. 1): "One-way confidentiality in favor of [PARTY C]" + "No confidentiality carve-outs are stated in this Agreement" (cl. 4) — Bonusly discloses with zero protection for its own information and no public-domain/independent-development/legally-required-disclosure outs, over a "five (5) years" term (cl. 1) — the longest of the three (5 yrs vs 2 yrs NDA-1, 3 yrs NDA-2; arithmetic: 5 > 3 > 2).
- Driver (cl. 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" — unusual foreign governing law and exclusive jurisdiction, vs Delaware in NDA-1 and NDA-2.
Summary: GREEN 1 (NDA-1) · YELLOW 1 (NDA-2) · RED 1 (NDA-3).