Mean 0.944 · 29/40 perfect tests · $7.35 total · each card: the question → the correct answer (gold) → this model's actual answer
Definitions
- DS2+ deal: stage in {DS2, DS3, DS4, DS5}.
- Why-buys compliant (DS2+ only): why_buys is substantive = LONG(n) OR (length ≥ 15 characters AND not a placeholder like “tbd”, “n/a”, “see notes”).
- Missing DS1 timestamp: t_ds1 is blank.
- Regressed timestamps: any earlier-stage entry timestamp is later than a later-stage timestamp (e.g., t_ds2 > t_ds3).
Why-buys hygiene (DS2+)
- Overall non-compliant % = noncompliant_ds2plus / total_ds2plus
- = 101 / 124
- = 81.4516129% (≈ 81.45%)
- By owner (using owners.csv names)
- Farid Osman: 1 / 1 = 100.00% non-compliant
- Cole Ingram: 19 / 22 = 86.3636364% (≈ 86.36%) non-compliant
- Bryce Harmon: 15 / 18 = 83.3333333% (≈ 83.33%) non-compliant
- Dana Mercer: 18 / 22 = 81.8181818% (≈ 81.82%) non-compliant
- Alex Franklin: 48 / 61 = 78.6885246% (≈ 78.69%) non-compliant
DS1 timestamp completeness (all deals)
- Count with no DS1 timestamp (blank t_ds1) = 0
Stage timestamp regression (all deals)
- Count that regressed (out-of-order stage entry timestamps) = 0
Three process fixes
1) Enforce a hard gate on stage movement: block moving a deal into DS2+ unless why_buys is substantive (≥15 chars) and not a placeholder.
2) Require DS1 entry timestamp on deal creation / DS1 entry (make t_ds1 system-populated and non-editable; or validation rule preventing save without it).
3) Lock down stage timestamp ordering: system-populate stage-entry timestamps and prevent manual backdating that can create non-monotonic sequences; add an automated audit report to flag any future out-of-order timestamps immediately.
Deals resolved to an owner name (owner_id match found in owners.csv): - 156 deals resolved (156/156) Deals whose owner_id has no match in owners.csv: - 0 (none) Owner_ids in deals_open.csv that map to archived/deactivated owners (archived=true): - none (owners.csv shows archived=true for Gavin Porter (1520255671) and Hugo Lindqvist (77260721), but those owner_ids do not appear in deals_open.csv) Total pipeline amount per resolved owner (sum of amount across their deals): Bryce Harmon (owner_id=119337721), 35 deals - total = 24000 + 19656 + 13500 + 7000 + 2520 + 240000 + 99000 + 72000 + 70000 + 63600 + 45000 + 1 + 21000 + 23400 + 13680 + 5502 + 8160 + 1 + 11400 + 1 + 36000 + 31500 + 6000 + 10800 + 30275 + 17400 + 12600 + 18000 + 37440 + 18828 + 2880 + 36000 + 20880 + 10920 + 25200 = 1054144 Dana Mercer (owner_id=83155923), 24 deals - total = 11250 + 10500 + 9000 + 9000 + 5400 + 4800 + 4600 + 1920 + 15000 + 4200 + 18900 + 27000 + 43875 + 20000 + 60000 + 8100 + 16250 + 3150 + 5000 + 2100 + 23400 + 5400 + 7350 + 25000 = 341195 Alex Franklin (owner_id=84342457), 67 deals - total = 14850 + 13770 + 11200 + 9000 + 6360 + 5400 + 3240 + 2484 + 1920 + 1080 + 7200 + 19000 + 2880 + 1400 + 4800 + 1632 + 10000 + 9300 + 2700 + 2160 + 1800 + 3600 + 3840 + 15000 + 1968 + 4000 + 3600 + 4800 + 3120 + 2520 + 9000 + 2400 + 62000 + 5400 + 5100 + 16700 + 4400 + 1620 + 2600 + 7200 + 18000 + 17000 + 8316 + 8100 + 18000 + 12600 + 24000 + 15000 + 9000 + 7200 + 3780 + 16200 + 7200 + 4680 + 1800 + 18000 + 2730 + 2400 + 3060 + 18000 + 12000 + 1800 + 4400 + 31200 + 7200 + 1600 + 60000 = 624310 Cole Ingram (owner_id=83155924), 22 deals - total = 2760 + 1330 + 7225.4 + 3360 + 5616 + 2700 + 7781.2 + 6947.5 + 40000 + 12168 + 2480.4 + 11116 + 11193 + 1875 + 31750 + 32175 + 4779.88 + 3334.8 + 58529.25 + 4140 + 18000 + 18900 = 288161.43 Farid Osman (owner_id=716654662), 7 deals - total = 1249 + 1 + 1 + 1 + 2880 + 1 + 1 = 4134 Elena Sinclair (owner_id=701163055), 1 deal - total = 2100 = 2100 Arithmetic check (grand total across resolved owners): - 1054144 + 341195 + 624310 + 288161.43 + 4134 + 2100 = 2314044.43
(a) Orphan gong rows (hs_deal_id has NO match in deals_open.deal_id) - Count = 30 - Arithmetic: 67 gong rows total − 37 matched rows = 30 orphan rows - Sample orphan deal_alias values (from gong_calls_by_deal_90d.csv): - Deal-8FA85D - Deal-8FC3F9 - Deal-3B7945 - Deal-42B265 - Deal-9CCC42 - Deal-36EA09 - Deal-9A43B4 - Deal-605F3C - Deal-E2D34B - Deal-D84A2D (b) Duplicate conversation keys (calls_90d > distinct_conversation_keys) - Count = 0 - Arithmetic: number of gong rows where (calls_90d − distinct_conversation_keys) > 0 = 0 (c) DS3+ open deals: share with at least one logged call - DS3+ open deals count = 85 (stages DS3, DS4, DS5 in deals_open.csv) - DS3+ open deals with ≥1 logged call (deal_id appears in gong_calls_by_deal_90d.csv) = 25 - Share = 25 / 85 = 0.2941176471 = 29.41176471% - Arithmetic: 25 ÷ 85 × 100 = 29.41176471%
```sql
WITH cohort AS (
SELECT
COMPANY_ID,
DATE_TRUNC('MONTH', FIRST_SUB_PAYMENT_DATE) AS first_customer_month,
/* Catalog does not provide an event-level "giver" table; use the provided M1_USERS metric.
Also: do NOT apply any "exclude deleted givers" filter to historical giving counts per catalog rule. */
M1_USERS AS unique_givers,
M1_GIVES AS recognition_count,
DATE_TRUNC('MONTH', FIRST_SUB_PAYMENT_DATE) AS month_start,
DATEADD(MONTH, 1, DATE_TRUNC('MONTH', FIRST_SUB_PAYMENT_DATE)) AS month_end
-- Use PRODUCTION.PLG.COMPANY_COHORT_SUMMARY because it is the only catalog table with first customer date (FIRST_SUB_PAYMENT_DATE) and month-1 giving metrics (M1_*).
FROM PRODUCTION.PLG.COMPANY_COHORT_SUMMARY
WHERE FIRST_SUB_PAYMENT_DATE IS NOT NULL
),
redemptions_first_month AS (
SELECT
c.COMPANY_ID,
COUNT(*) AS successful_redemption_count
-- Use cohort CTE to define each company's first calendar month window based on FIRST_SUB_PAYMENT_DATE.
FROM cohort c
-- Use PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2 because it is the documented source for redemption counts; apply STATE='succeeded' per business rule.
LEFT JOIN PRODUCTION.DEPRECATED_RECOGNITION.REDEMPTION_RECORDS_V2 r
ON r.COMPANY_ID = c.COMPANY_ID
AND r.STATE = 'succeeded'
AND r.CREATED_AT >= c.month_start
AND r.CREATED_AT < c.month_end
GROUP BY c.COMPANY_ID
)
SELECT
c.COMPANY_ID,
c.first_customer_month,
c.unique_givers,
c.recognition_count,
COALESCE(rfm.successful_redemption_count, 0) AS successful_redemption_count
-- Use cohort CTE as the per-company spine for "first calendar month as a customer".
FROM cohort c
-- Join in succeeded redemptions computed from the documented redemption events table.
LEFT JOIN redemptions_first_month rfm
ON rfm.COMPANY_ID = c.COMPANY_ID
;
```
DEALS (owner, stage, amount, close date, why-buys)
- Missing data: no deals extract was provided, so I cannot:
- report deal field completeness %
- identify which deals are missing owner/stage/amount/close date/why-buys
- compute “10 fixes with the most pipeline amount at stake” (amounts not provided)
If you share deals.csv (deal_alias, company_alias, owner, stage, amount, close_date, why_buys), I can produce the deal completeness + top-10-by-$ list.
============================================================
COMPANIES — completeness (n=34 rows)
Required fields: industry, employee_count, hq_country
Completeness % per field (arithmetic shown)
- industry: 34 filled / 34 total = 34/34 = 100.00%
- employee_count: 25 / 34 = 73.53%
- hq_country: 28 / 34 = 82.35%
Missing values (exact aliases)
- Missing employee_count (9):
C-EC3025, C-96039F, C-44EA29, C-D04904, C-B23205, C-60C75F, C-7BBDFA, C-50D386, C-93C8BF
- Missing hq_country (6):
C-2D1F1B, C-D73B89, C-44EA29, C-D04904, C-2C60E5, C-EE9FFB
Enrichment coverage (ZoomInfo export match by domain)
- 25 enriched domains / 34 company domains = 25/34 = 73.53%
- Companies without enrichment row (9):
C-BA969B, C-332637, C-93C8BF, C-EE9FFB, C-C9BB20, C-0A092931, C-0A092932, C-0A092933, C-0A092934
Fill missing company fields ONLY where enrichment has a matching row
- employee_count fills available from enrichment (8 of the 9 missing employee_count):
- C-EC3025 (ec3025.com): employee_count = 400 (from zi_employee_count)
- C-96039F (96039f.com): employee_count = 400
- C-44EA29 (44ea29.com): employee_count = 400
- C-D04904 (d04904.com): employee_count = 400
- C-B23205 (b23205.com): employee_count = 400
- C-60C75F (60c75f.com): employee_count = 400
- C-7BBDFA (7bbdfa.com): employee_count = 400
- C-50D386 (50d386.com): employee_count = 400
- employee_count cannot be filled (no enrichment match):
- C-93C8BF (93c8bf.com): missing employee_count, and no zoominfo_enrichment.csv row for 93c8bf.com
- hq_country fills: none possible from the provided enrichment rows (the relevant zi_hq_country values are blank where CRM is blank, or enrichment row is missing)
Where CRM and enrichment disagree (list both; recommend a source)
Recommendation logic (no invented facts): use enrichment for standardized taxonomy/canonical country strings (reduces “US” vs “USA” vs “United States” fragmentation); keep CRM value if it is an intentionally-curated internal segmentation field, but then store separately (e.g., crm_industry vs zi_industry).
Disagreements found (field-level):
1) C-66D1FC (66d1fc.com)
- industry: CRM=tech vs ZI=Computer Software → recommend ZI for reporting taxonomy
- hq_country: CRM=US vs ZI=United States → recommend ZI for canonical country
2) C-950043 (950043.com)
- hq_country: CRM=US vs ZI=United States → recommend ZI
3) C-EC3025 (ec3025.com)
- industry: CRM=Technology vs ZI=Computer Software → recommend ZI
- hq_country: CRM=USA vs ZI=United States → recommend ZI
4) C-96039F (96039f.com)
- hq_country: CRM=USA vs ZI=United States → recommend ZI
5) C-44EA29 (44ea29.com)
- industry: CRM=tech vs ZI=Computer Software → recommend ZI
6) C-92D97D (92d97d.com)
- industry: CRM=Technology vs ZI=Computer Software → recommend ZI
7) C-D04904 (d04904.com)
- industry: CRM=Technology vs ZI=Computer Software → recommend ZI
8) C-77A95A (77a95a.com)
- industry: CRM=Technology vs ZI=Computer Software → recommend ZI
- hq_country: CRM=US vs ZI=United States → recommend ZI
9) C-AA8DDA (aa8dda.com)
- industry: CRM=Technology vs ZI=Computer Software → recommend ZI
10) C-B23205 (b23205.com)
- hq_country: CRM=US vs ZI=United States → recommend ZI
11) C-E51FB7 (e51fb7.com)
- hq_country: CRM=USA vs ZI=United States → recommend ZI
12) C-D0662E (d0662e.com)
- hq_country: CRM=US vs ZI=United States → recommend ZI
13) C-B25F40 (b25f40.com)
- industry: CRM=Technology vs ZI=Computer Software → recommend ZI
14) C-60C75F (60c75f.com)
- industry: CRM=tech vs ZI=Computer Software → recommend ZI
15) C-425E2A (425e2a.com)
- industry: CRM=Tech vs ZI=Computer Software → recommend ZI
- hq_country: CRM=USA vs ZI=United States → recommend ZI
16) C-2D7423 (2d7423.com)
- hq_country: CRM=USA vs ZI=United States → recommend ZI
Duplicate company clusters (shared domain)
Note: “name variants” cannot be assessed because companies.csv has no company name field; only alias+domain.
Clusters:
- Domain cluster: acme-corp.com
- Members:
- C-0A092931: industry=Technology, employee_count=500, hq_country=US
- C-0A092932: industry=tech, employee_count=510, hq_country=USA
- Survivor (tie-break rule: both equally complete → choose lower alias): C-0A092931
- Fix: merge C-0A092932 → C-0A092931; normalize industry/country strings (tech→Technology or map to a controlled picklist; US/USA→one canonical)
- Domain cluster: globex.io
- Members:
- C-0A092933: industry=SaaS, employee_count=200, hq_country=US
- C-0A092934: industry=Technology, employee_count=200, hq_country=US
- Survivor (both equally complete → choose lower alias): C-0A092933
- Fix: merge C-0A092934 → C-0A092933; decide controlled industry value (SaaS vs Technology) via defined taxonomy rules
============================================================
CONTACTS — completeness + data quality (n=52 rows)
Required fields: email, title, persona
Completeness % per field (arithmetic shown)
- email (non-empty): 52/52 = 100.00%
- title: 39/52 = 75.00%
- persona: 37/52 = 71.15%
Email validity + domain consistency (additional quality checks)
- Valid emails: 48 valid / 52 total = 48/52 = 92.31%
- Invalid emails (4):
- CT-0010 (C-66D1FC): email=user0@
- CT-0080 (C-92D97D): email=user0@
- CT-0081 (C-92D97D): email=user1@
- CT-0192 (C-425E2A): email=user2@
- Domain mismatches (email domain vs contact domain), among valid emails:
- 1 mismatch / 48 valid = 1/48 = 2.08%
- CT-0011 (C-66D1FC): email=user1@other-domain.com vs domain=66d1fc.com
- Contact domain vs company domain mismatches: 0 (0/52)
Missing titles (13 contacts)
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
Missing personas (15 contacts)
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
============================================================
PROPOSED FIXES (no invented values)
Companies
1) Backfill employee_count from zoominfo_enrichment.csv where missing and matched (8 updates listed above).
2) Standardize hq_country values (US vs USA vs United States) using a controlled picklist; recommend “United States” if you adopt ZoomInfo canonical strings (but do not overwrite blanks unless you have a value).
3) Standardize industry values (tech/Tech/Technology/Computer Software/SaaS/health care/Healthcare) via controlled picklist + mapping; recommend using zi_industry for consistent reporting, while optionally retaining CRM’s value as a separate “segment” field if it’s intentionally curated.
4) Enforce required fields at create/update: industry, employee_count, hq_country (with “Unknown” as an explicit allowed value if you prefer, but that value is not present in your data today).
5) De-dupe companies by domain: merge the two domain clusters (acme-corp.com, globex.io) into survivors above; re-point related contacts/deals to survivor.
Contacts
6) Add validation rule: email must match regex and cannot end with “@” (prevents CT-0010/CT-0080/CT-0081/CT-0192 patterns).
7) Add warning/flag when email domain != company domain (captures CT-0011) for review (contractor/agency vs bad data).
8) Enforce required title + persona (or require at least one of them at creation) to improve routing and sequencing.
9) Standardize persona picklist (values observed: HR admin, champion, economic buyer) and require one selection.
Deals (blocked by missing file)
10) Cannot propose the “10 fixes with the most pipeline amount at stake” without deal amount + deal issues. Provide deals extract to rank fixes by $.
============================================================
TOP 10 FIXES WITH MOST PIPELINE AMOUNT AT STAKE
Blocked: deals data (including amount) was not provided, so I cannot calculate or rank by pipeline amount at stake.
deal_alias,primary_category,side Deal-DB0AAC,timing,buyer Deal-F7F635,competitor,buyer Deal-AC944F,other,unknown Deal-214060,other,unknown Deal-91A056,timing,buyer Deal-29326C,timing,buyer Deal-5DB9B0,other,unknown Deal-831B7B,timing,buyer Deal-F97C37,product gap,Bonusly Deal-13E9CF,no decision,buyer Deal-39E25C,timing,buyer Deal-7ED004,pricing,buyer Deal-21B045,other,unknown Deal-B3ABED,timing,buyer Deal-422BA6,product gap,Bonusly Deal-ED9AE7,pricing,buyer Deal-988493,other,unknown Deal-381C8C,competitor,buyer Deal-F308CA,other,unknown Deal-F1E8A6,competitor,buyer Deal-B6AC09,timing,buyer Deal-70F704,other,unknown Deal-E6E80A,timing,buyer Deal-B038F0,timing,buyer Deal-4664E1,other,unknown Deal-175756,timing,buyer Deal-E74A73,no decision,buyer Deal-DDAB52,competitor,buyer Deal-ACE061,competitor,buyer Deal-BB78F3,timing,buyer Deal-D48E0B,other,unknown Deal-15DA99,timing,buyer Deal-F4AF5D,timing,buyer Deal-79B7A1,timing,buyer Deal-583ADB,other,unknown Deal-8E27DA,product gap,Bonusly Deal-2D2F8D,competitor,buyer Deal-E0441F,other,unknown Deal-7CB44D,other,unknown Deal-0F96AA,competitor,buyer Deal-1BCA50,competitor,buyer Deal-7CC678,competitor,buyer Deal-FAC17C,no decision,buyer Deal-242273,product gap,Bonusly Deal-50E5D8,no decision,buyer Deal-A2C349,product gap,Bonusly Deal-9F176A,timing,buyer Deal-7B2236,pricing,buyer Deal-AFA56C,other,unknown Deal-C7156E,competitor,buyer Deal-C33D91,pricing,buyer Deal-9048EB,product gap,Bonusly Deal-5E64CE,pricing,buyer Deal-8A0992,competitor,buyer Deal-D0C698,competitor,buyer Deal-69CF3D,timing,buyer Deal-ECBF89,timing,buyer Deal-3618CC,product gap,Bonusly Deal-EECC02,competitor,buyer Deal-5AD03E,competitor,buyer Deal-D1A623,timing,buyer Deal-413C56,no decision,buyer Deal-47F1A1,competitor,buyer Deal-BF2A98,competitor,buyer Deal-2A292B,no decision,buyer Deal-D1AABF,other,unknown Deal-FEDBCB,no decision,buyer Deal-1E7DA9,competitor,buyer Deal-2BBA21,other,unknown Deal-286F9C,competitor,buyer Deal-7FBAC6,no decision,buyer Deal-369281,competitor,buyer Deal-386F6E,other,unknown Deal-9FCD0D,competitor,buyer Deal-55867E,timing,buyer Deal-DAFB82,pricing,buyer Deal-2FEDDB,no decision,buyer Deal-64B19A,competitor,buyer Deal-3F86A0,other,unknown Deal-096750,other,unknown Deal-F325A5,no decision,buyer Deal-ABD14C,no decision,buyer Deal-79E61A,other,unknown Deal-8A119B,pricing,buyer Deal-AE7C4E,other,unknown Deal-DAB4F1,other,unknown Deal-B4B50F,other,unknown Deal-981AD4,product gap,Bonusly Deal-DC77FE,product gap,Bonusly Deal-5885B9,other,unknown SUMMARY (N=90) 1) Category counts (arithmetic shown) - competitor: 21 - pricing: 7 - no decision: 11 - timing: 19 - product gap: 9 - champion left: 0 - other: 23 Check: 21 + 7 + 11 + 19 + 9 + 0 + 23 = 90 2) Side split (arithmetic shown) - buyer: 58 (competitor 21 + pricing 7 + no decision 11 + timing 19 = 58) - Bonusly: 9 (product gap 9) - unknown: 23 (other 23) Check: 58 + 9 + 23 = 90 3) Structured closed_lost_tag clearly disagrees with free-text reason (count) - 12 deals 4) Two patterns most worth acting on (from tag + free-text only) - Pattern A: “Other” = unresponsive / no contact / MIA dominates outcomes (23 deals classified as other/unknown). Examples of free-text: “unresponsive” / “No response.” / “Ignored…” (e.g., Deal-AC944F, Deal-214060, Deal-F308CA, Deal-4664E1, Deal-2BBA21). - Pattern B: Timing deferrals are very common (19 timing deals) and often explicitly ask for a planned reconnect in 2027/next year / “On Hold”. Examples: Deal-91A056 (“reconnect early in 2027”), Deal-175756 (“on hold until 2027”), Deal-E6E80A (“pushed into early 2027”), Deal-69CF3D (“On Hold”), Deal-ECBF89 (“On Hold for now”).
{"tier_counts":{"LOCK":3,"ACTION":15,"BUILD":70,"REVIVE":5,"WATCH":60,"RISKY":3},"tier_examples":{"LOCK":["Deal-D348E1","Deal-C26D20","Deal-403845"],"ACTION":["Deal-25F752","Deal-E53952","Deal-5408B0"],"BUILD":["Deal-C6FE92","Deal-D73B89","Deal-93C8BF"],"REVIVE":["Deal-2D1F1B","Deal-F0EBBB","Deal-3EED2C"],"WATCH":["Deal-66D1FC","Deal-950043","Deal-EC3025"],"RISKY":["Deal-7BBDFA","Deal-4A13AD","Deal-FD9F4E"]},"risky_deals":["Deal-FD9F4E","Deal-7BBDFA","Deal-4A13AD"],"lock_violations":0,"pipeline_shape":"As-of=2026-09-04. Total open deals=156 (=3+15+70+5+60+3). Forecast mix: COMMIT=11, BEST_CASE=40, PIPELINE=105 (sum=156). Engagement: meetings_30d>0 for 55, meetings_30d=0 for 101 (55+101=156). Stage: DS4-DS5=24, DS1-DS3=132 (24+132=156). COMMIT with meetings_30d=0: 6 of 11 (6/11)."}
[
{
"transcript_id": "TX-001",
"deal_alias": "Deal-CFE7F4",
"why_buys": [
"Automating anniversary and birthday awards so HR can keep up"
],
"pain_points": [
"HR team of three cannot keep up with manual tracking",
"Tracking in a spreadsheet leads to people slipping through the cracks"
],
"stakeholders": [
"Alex Franklin",
"Prospect (VP People)",
"Prospect (HR Admin)"
],
"budget_signal": "We have about $40k earmarked for engagement tools this fiscal year.",
"timeline_signal": "Ideally we would have this live before open enrollment in November.",
"competitor_mentioned": "Achievers",
"next_step": "Security review on September 12 (prospect agreed: \"Yes — let's do the security review on September 12.\")",
"objections": [
"Need SSO and audit logs for IT to sign off",
"Achievers was too heavy for a team our size (prior evaluation concern)"
],
"confidence": "high"
},
{
"transcript_id": "TX-002",
"deal_alias": "Deal-70BB30",
"why_buys": [
"Tie recognition to retention for the hourly workforce"
],
"pain_points": [
"Regretted turnover for the hourly workforce is over 30%"
],
"stakeholders": [
"Alex Franklin",
"Prospect (Head of Total Rewards)",
"Prospect (CFO)"
],
"budget_signal": "Finance has approved a $25k pilot budget for this quarter.",
"timeline_signal": "We want a decision by end of September.",
"competitor_mentioned": null,
"next_step": "Rep to send pilot agreement; prospect agreed they will route it to legal this week (\"Yes — send the pilot agreement and we'll route it to legal this week.\")",
"objections": [
"Integration with Workday has to be rock solid (\"that's my one condition\")"
],
"confidence": "high"
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why_buys": [
"Make recognition visible across 12 retail locations"
],
"pain_points": [
"Recognition is not visible across the 12 retail locations",
"Store managers have zero budget autonomy for on-the-spot recognition today"
],
"stakeholders": [
"Alex Franklin",
"Prospect (People Ops Manager)"
],
"budget_signal": null,
"timeline_signal": "There's no rush on our side until Q1.",
"competitor_mentioned": "Bucketlist",
"next_step": "Schedule a call with the CEO; prospect agreed and will send two times (\"Yes, let's schedule a call with our CEO — I'll send two times.\")",
"objections": [
"The CEO has to be sold first — she decides anything people-related"
],
"confidence": "medium"
},
{
"transcript_id": "TX-004",
"deal_alias": "Deal-180D02",
"why_buys": [
"Consolidate three separate recognition tools into one"
],
"pain_points": [
"Paying for three tools and none of them talk to the HRIS"
],
"stakeholders": [
"Alex Franklin",
"Prospect (VP People)",
"Prospect (IT Security Lead)"
],
"budget_signal": "If it's under $15k annually, I can approve it without going to the board.",
"timeline_signal": "Procurement cycle runs six to eight weeks minimum.",
"competitor_mentioned": null,
"next_step": null,
"objections": [
"Procurement cycle runs six to eight weeks minimum",
"Security review took three months for our last vendor (hesitation)"
],
"confidence": "low"
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why_buys": [
"Automate service milestones",
"Get analytics on recognition equity across departments"
],
"pain_points": [
"Night-shift teams feel invisible",
"Night-shift engagement scores run 20 points lower",
"Exec team is skeptical after a failed rollout two years ago"
],
"stakeholders": [
"Alex Franklin",
"Prospect (HR Director)",
"Prospect (People Ops Coordinator)"
],
"budget_signal": "We have $12k approved under our engagement line.",
"timeline_signal": "We need this running before our January all-hands.",
"competitor_mentioned": "Nectar",
"next_step": "Rep to present to exec team on October 2 (prospect agreed: \"Yes — come present to our exec team on October 2.\")",
"objections": [
"They are mid-pilot with Nectar, so you'd need to beat that experience",
"Exec team is skeptical after a failed rollout two years ago"
],
"confidence": "high"
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why_buys": [
"Cut the admin time on service awards"
],
"pain_points": [
"Spends five hours a month ordering and shipping plaques"
],
"stakeholders": [
"Alex Franklin",
"Prospect (HR Manager)"
],
"budget_signal": "Budget isn't the issue — time is.",
"timeline_signal": "Our fiscal year resets in February, so a Q1 start is realistic.",
"competitor_mentioned": null,
"next_step": "Rep to send one-page overview; prospect agreed they will forward it to their COO this week (\"Yes — send the one-page overview and I'll forward it to our COO this week.\")",
"objections": [
"Comparing this against just doing it internally",
"COO usually prefers building things in-house"
],
"confidence": "medium"
}
]
1) Deal-547B2B — $11,200 Why it’s close: Slack (2026-09-04) says “redlines came back clean this morning, the signing page is out” and their VP People said they’re “signing tomorrow.” CRM also has it at DS5/COMMIT with close_date 2026-09-11. What’s left: Signature (they’ve already moved past redlines; signing is the remaining step per Slack). 2) Deal-403845 — $9,000 Why it’s close: CRM shows DS5/COMMIT with close_date 2026-09-11. Slack (2026-09-04) says “the order form is with their finance team,” indicating it’s in final internal approval/signature routing. What’s left: Finance team approval + signed order form returned (per Slack). 3) Deal-A2B47C — $6,360 Why it’s close: CRM shows DS5/COMMIT with close_date 2026-09-11. Slack (2026-09-04) says it’s “still warm, just normal legal-review pace,” which is late-stage versus earlier-stage deals. What’s left: Legal review completion and then signature (Slack indicates legal is the gating item).
Candidates (prospect voice only) 1) Deal-EC3025 — Amount: missing (not provided) Prospect quote: “We need SCIM user provisioning — our security team will not approve any tool that requires manual account management.” Product-docs check: “SCIM user provisioning … NOT currently listed as supported capabilities.” Classification: REAL GAP (requested capability is explicitly not listed as supported) 2) Deal-D0D6B5 — Amount: missing (not provided) Prospect quote: “Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us.” Product-docs check: “ADP Workforce Now integrations are NOT currently listed as supported capabilities.” Supported HRIS list is Workday, BambooHR, Gusto, Rippling (Pro+). Classification: REAL GAP (requested integration is explicitly not listed as supported) 3) Deal-CFE7F4 — Amount: missing (not provided) Prospect quote: “I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?” Product-docs check: “Custom report builder” is Enterprise-only. Classification: PLAN GATE (capability exists, but only on Enterprise; question is about current plan access) 4) Deal-84DBA6 — Amount: missing (not provided) Prospect quote: “We turned on the Slack integration in July, but half our managers still haven't given a single recognition — nobody ever trained them on it.” Product-docs check: Slack integration is supported on “all plans.” Classification: ROLLOUT/ENABLEMENT ISSUE (capability is supported; issue is adoption/training, not product functionality) Summary (real gaps only) - SCIM user provisioning gap — Deal-EC3025 — Amount missing Prospect: “We need SCIM user provisioning — our security team will not approve any tool that requires manual account management.” - ADP Workforce Now integration gap — Deal-D0D6B5 — Amount missing Prospect: “Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us.” Arithmetic: real gaps = 2 (Deal-EC3025, Deal-D0D6B5).
Bryce Harmon Deal-2D1F1B | stage=DS1 | amount=240000 | days since last contact = 81 (2026-09-05 - 2026-06-16 = 81) Deal-66D1FC | stage=DS1 | amount=99000 | days since last contact = 16 (2026-09-05 - 2026-08-20 = 16) Deal-950043 | stage=DS1 | amount=70000 | days since last contact = 19 (2026-09-05 - 2026-08-17 = 19) Deal-B23205 | stage=DS1 | amount=45000 | days since last contact = 16 (2026-09-05 - 2026-08-20 = 16) Deal-7BBDFA | stage=DS3 | amount=37440 | days since last contact = 46 (2026-09-05 - 2026-07-21 = 46) Deal-332637 | stage=DS2 | amount=36000 | days since last contact = 9 (2026-09-05 - 2026-08-27 = 9) Deal-1BEEBF | stage=DS1 | amount=31500 | days since last contact = 19 (2026-09-05 - 2026-08-17 = 19) Deal-C5658B | stage=DS1 | amount=23400 | days since last contact = 16 (2026-09-05 - 2026-08-20 = 16) Deal-40522D | stage=DS3 | amount=21000 | days since last contact = 19 (2026-09-05 - 2026-08-17 = 19) Deal-F0EBBB | stage=DS3 | amount=11400 | days since last contact = 24 (2026-09-05 - 2026-08-12 = 24) Deal-E25A09 | stage=DS1 | amount=6000 | days since last contact = 9 (2026-09-05 - 2026-08-27 = 9) Deal-C9C286 | stage=DS2 | amount=5502 | days since last contact = 9 (2026-09-05 - 2026-08-27 = 9) Deal-012CB1 | stage=DS1 | amount=1 | days since last contact = 23 (2026-09-05 - 2026-08-13 = 23) Summary (Bryce Harmon): 13 stale deals; total stale amount = 240000 + 99000 + 70000 + 45000 + 37440 + 36000 + 31500 + 23400 + 21000 + 11400 + 6000 + 5502 + 1 = 626243.00 Dana Mercer Deal-44EA29 | stage=DS2 | amount=60000 | days since last contact = 10 (2026-09-05 - 2026-08-26 = 10) Deal-E51FB7 | stage=DS2 | amount=43875 | days since last contact = 12 (2026-09-05 - 2026-08-24 = 12) Deal-B42F46 | stage=DS1 | amount=27000 | days since last contact = 19 (2026-09-05 - 2026-08-17 = 19) Deal-BA3DDC | stage=DS3 | amount=23400 | days since last contact = 15 (2026-09-05 - 2026-08-21 = 15) Deal-9DDE86 | stage=DS2 | amount=20000 | days since last contact = 15 (2026-09-05 - 2026-08-21 = 15) Deal-215CCA | stage=DS3 | amount=18900 | days since last contact = 17 (2026-09-05 - 2026-08-19 = 17) Deal-5EED42 | stage=DS3 | amount=16250 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-57887A | stage=DS2 | amount=15000 | days since last contact = 8 (2026-09-05 - 2026-08-28 = 8) Deal-B7EBD1 | stage=DS5 | amount=9000 | days since last contact = 16 (2026-09-05 - 2026-08-20 = 16) Deal-3974EB | stage=DS4 | amount=9000 | days since last contact = 8 (2026-09-05 - 2026-08-28 = 8) Deal-F40F04 | stage=DS2 | amount=8100 | days since last contact = 15 (2026-09-05 - 2026-08-21 = 15) Deal-87DDD1 | stage=DS1 | amount=5000 | days since last contact = 19 (2026-09-05 - 2026-08-17 = 19) Deal-F336B6 | stage=DS3 | amount=4200 | days since last contact = 15 (2026-09-05 - 2026-08-21 = 15) Deal-0660B4 | stage=DS4 | amount=1920 | days since last contact = 16 (2026-09-05 - 2026-08-20 = 16) Summary (Dana Mercer): 14 stale deals; total stale amount = 60000 + 43875 + 27000 + 23400 + 20000 + 18900 + 16250 + 15000 + 9000 + 9000 + 8100 + 5000 + 4200 + 1920 = 261645.00 Alex Franklin Deal-CC08D1 | stage=DS1 | amount=24000 | days since last contact = 16 (2026-09-05 - 2026-08-20 = 16) Deal-E73427 | stage=DS3 | amount=18000 | days since last contact = 10 (2026-09-05 - 2026-08-26 = 10) Deal-885F45 | stage=DS2 | amount=9300 | days since last contact = 12 (2026-09-05 - 2026-08-24 = 12) Deal-C2FF3C | stage=DS1 | amount=8316 | days since last contact = 10 (2026-09-05 - 2026-08-26 = 10) Deal-0D2F7A | stage=DS3 | amount=5100 | days since last contact = 12 (2026-09-05 - 2026-08-24 = 12) Deal-6C60D4 | stage=DS3 | amount=4800 | days since last contact = 12 (2026-09-05 - 2026-08-24 = 12) Deal-13FEBD | stage=DS2 | amount=4680 | days since last contact = 12 (2026-09-05 - 2026-08-24 = 12) Deal-9D0060 | stage=DS3 | amount=3840 | days since last contact = 12 (2026-09-05 - 2026-08-24 = 12) Deal-690476 | stage=DS2 | amount=3600 | days since last contact = 18 (2026-09-05 - 2026-08-18 = 18) Deal-C6D97A | stage=DS4 | amount=3240 | days since last contact = 8 (2026-09-05 - 2026-08-28 = 8) Deal-EE195F | stage=DS3 | amount=3120 | days since last contact = 8 (2026-09-05 - 2026-08-28 = 8) Deal-278DEC | stage=DS3 | amount=2700 | days since last contact = 8 (2026-09-05 - 2026-08-28 = 8) Deal-635B8E | stage=DS3 | amount=2600 | days since last contact = 18 (2026-09-05 - 2026-08-18 = 18) Deal-6883F3 | stage=DS1 | amount=2400 | days since last contact = 16 (2026-09-05 - 2026-08-20 = 16) Deal-4A13AD | stage=DS3 | amount=2160 | days since last contact = 26 (2026-09-05 - 2026-08-10 = 26) Deal-F67D31 | stage=DS2 | amount=1800 | days since last contact = 8 (2026-09-05 - 2026-08-28 = 8) Deal-5FDCE4 | stage=DS3 | amount=1600 | days since last contact = 12 (2026-09-05 - 2026-08-24 = 12) Deal-BA571A | stage=DS4 | amount=1080 | days since last contact = 18 (2026-09-05 - 2026-08-18 = 18) Summary (Alex Franklin): 18 stale deals; total stale amount = 24000 + 18000 + 9300 + 8316 + 5100 + 4800 + 4680 + 3840 + 3600 + 3240 + 3120 + 2700 + 2600 + 2400 + 2160 + 1800 + 1600 + 1080 = 102336.00 Cole Ingram Deal-D04904 | stage=DS2 | amount=58529.25 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-B25F40 | stage=DS3 | amount=40000 | days since last contact = 8 (2026-09-05 - 2026-08-28 = 8) Deal-813836 | stage=DS2 | amount=32175 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-1BA595 | stage=DS2 | amount=31750 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-CFE1E8 | stage=DS3 | amount=18000 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-CD47A6 | stage=DS2 | amount=12168 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-627646 | stage=DS3 | amount=11193 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-FF809F | stage=DS2 | amount=7781.2 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-AF932D | stage=DS2 | amount=7225.4 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-A71728 | stage=DS2 | amount=6947.5 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-8BC9F5 | stage=DS2 | amount=5616 | days since last contact = 10 (2026-09-05 - 2026-08-26 = 10) Deal-175395 | stage=DS3 | amount=4779.88 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-481E24 | stage=DS3 | amount=4140 | days since last contact = 10 (2026-09-05 - 2026-08-26 = 10) Deal-C7F9BF | stage=DS2 | amount=3360 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-2F3A66 | stage=DS3 | amount=3334.8 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-342E96 | stage=DS2 | amount=2700 | days since last contact = 24 (2026-09-05 - 2026-08-12 = 24) Deal-E568D5 | stage=DS3 | amount=1875 | days since last contact = 11 (2026-09-05 - 2026-08-25 = 11) Deal-FD9F4E | stage=DS5 | amount=1330 | days since last contact = 10 (2026-09-05 - 2026-08-26 = 10) Summary (Cole Ingram): 18 stale deals; total stale amount = 58529.25 + 40000 + 32175 + 31750 + 18000 + 12168 + 11193 + 7781.2 + 7225.4 + 6947.5 + 5616 + 4779.88 + 4140 + 3360 + 3334.8 + 2700 + 1875 + 1330 = 252905.03 Open deals missing from engagements_by_deal_90d.csv (no last_email/last_call/last_meeting provided; days-since-last-contact cannot be computed from the engagements table): Deal-3EED2C | Alex Franklin | stage=DS2 | amount=7200 | days since last contact = UNKNOWN (no engagement row) Deal-57FF13 | Elena Sinclair | stage=DS1 | amount=2100 | days since last contact = UNKNOWN (no engagement row)
Snapshot date: 2026-09-05
“Last 30 days” window used for DS2 entry counts: 2026-08-06 to 2026-09-05 (inclusive)
Note on data scope: engagement totals are computed by joining engagements_by_deal_90d.csv to deals_open.csv on deal_id (so only deals present in deals_open.csv are included).
PER REP (owner)
Gavin Porter (owner_id=1520255671)
- Activities (30d): emails 0, calls 0, meetings 0
- Total activities = 0 + 0 + 0 = 0
- Mix: emails 0/0 = 0.00%, calls 0/0 = 0.00%, meetings 0/0 = 0.00% (total is 0)
- DS2 entries (30d): 0
- Activities per DS2 entry: N/A (0 DS2 entries)
Hugo Lindqvist (owner_id=77260721)
- Activities (30d): emails 0, calls 0, meetings 0
- Total activities = 0 + 0 + 0 = 0
- Mix: emails 0/0 = 0.00%, calls 0/0 = 0.00%, meetings 0/0 = 0.00% (total is 0)
- DS2 entries (30d): 0
- Activities per DS2 entry: N/A (0 DS2 entries)
Bryce Harmon (owner_id=119337721)
- Activities (30d): emails 158, calls 0, meetings 43
- Total activities = 158 + 0 + 43 = 201
- Mix:
- Emails share = 158/201 = 78.61%
- Calls share = 0/201 = 0.00%
- Meetings share = 43/201 = 21.39%
- DS2 entries (30d): 4
- Activities per DS2 entry = 201 / 4 = 50.25
Dana Mercer (owner_id=83155923)
- Activities (30d): emails 84, calls 18, meetings 11
- Total activities = 84 + 18 + 11 = 113
- Mix:
- Emails share = 84/113 = 74.34%
- Calls share = 18/113 = 15.93%
- Meetings share = 11/113 = 9.73%
- DS2 entries (30d): 1
- Activities per DS2 entry = 113 / 1 = 113.00
Alex Franklin (owner_id=84342457)
- Activities (30d): emails 307, calls 36, meetings 41
- Total activities = 307 + 36 + 41 = 384
- Mix:
- Emails share = 307/384 = 79.95%
- Calls share = 36/384 = 9.38%
- Meetings share = 41/384 = 10.68%
- DS2 entries (30d): 18
- Activities per DS2 entry = 384 / 18 = 21.33
Cole Ingram (owner_id=83155924)
- Activities (30d): emails 96, calls 14, meetings 1
- Total activities = 96 + 14 + 1 = 111
- Mix:
- Emails share = 96/111 = 86.49%
- Calls share = 14/111 = 12.61%
- Meetings share = 1/111 = 0.90%
- DS2 entries (30d): 2
- Activities per DS2 entry = 111 / 2 = 55.50
Farid Osman (owner_id=716654662)
- Activities (30d): emails 38, calls 0, meetings 34
- Total activities = 38 + 0 + 34 = 72
- Mix:
- Emails share = 38/72 = 52.78%
- Calls share = 0/72 = 0.00%
- Meetings share = 34/72 = 47.22%
- DS2 entries (30d): 1
- Activities per DS2 entry = 72 / 1 = 72.00
Elena Sinclair (owner_id=701163055)
- Activities (30d): emails 0, calls 0, meetings 0
- Total activities = 0 + 0 + 0 = 0
- Mix: emails 0/0 = 0.00%, calls 0/0 = 0.00%, meetings 0/0 = 0.00% (total is 0)
- DS2 entries (30d): 0
- Activities per DS2 entry: N/A (0 DS2 entries)
EFFICIENCY RANKING (lowest activities per DS2 entry = most efficient; only reps with DS2 entries > 0)
1) Alex Franklin — 384 activities / 18 DS2 entries = 21.33
2) Bryce Harmon — 201 / 4 = 50.25
3) Cole Ingram — 111 / 2 = 55.50
4) Farid Osman — 72 / 1 = 72.00
5) Dana Mercer — 113 / 1 = 113.00
Most efficient rep: Alex Franklin (21.33 activities per DS2 entry)
Highest-volume rep (most total activities): Alex Franklin (384 total activities)
Do they differ? No (same rep: Alex Franklin).
QTD scorecard — AE: Alex Franklin — as of 2026-09-05 (Quarter: 2026-Q3; quota snapshot dated 2026-09-05) 1) Bookings vs quota (QTD; excludes closed-won before 2026-07-01) - QTD bookings (closed-won 2026-07-01 through 2026-09-05): = 40000 (Deal-A1C3E5) + 20000 (Deal-F2C7D8) + 35000 (Deal-B7D2F4) + 21000 (Deal-C9E1A6) + 12000 (Deal-A8B4D6) + 11000 (Deal-D4B8C2) + 6500 (Deal-E6F3A9) + 4500 (Deal-C5D9E2) = 150000 - Quota (2026-Q3, snapshot 2026-09-05): 200000 - Attainment % = 150000 / 200000 = 0.75 = 75.0% - Remaining to quota = 200000 − 150000 = 50000 2) New vs expansion split (QTD bookings) - New: 113500 across 5 wins Arithmetic: 40000 + 35000 + 21000 + 11000 + 6500 = 113500 - Expansion: 36500 across 3 wins Arithmetic: 20000 + 12000 + 4500 = 36500 - Check: 113500 + 36500 = 150000 total bookings 3) Active pipeline by stage (status=open; as of 2026-09-05 snapshot not explicitly provided beyond current rows) - DS1: 284621 - DS2: 353760 - DS3: 552705 - DS4: 23574 - DS5: 45730 - Total active pipeline = 284621 + 353760 + 552705 + 23574 + 45730 = 1260390 4) Rolling 90-day DS2-to-won rate (as of 2026-09-05) Definition used (from provided fields only): cohort of deals with entered_ds2 in the last 90 days (2026-06-07 to 2026-09-05) that are closed (won or lost) by 2026-09-05. - Wins in cohort: 8 - Losses in cohort: 27 - DS2-to-won rate = 8 / (8 + 27) = 8 / 35 = 0.228571… = 22.86% 5) Win + loss counts (QTD) with top loss reason - Wins QTD (closed-won 2026-07-01 to 2026-09-05): 8 - Losses QTD (closed-lost 2026-07-01 to 2026-09-05): 27 - Top loss reason (by count, QTD losses): “Lost- Timing (1 year or more)” = 13 of 27 - “Lost- Timing (1 year or more)”: 13 - “MIA”: 5 - “Competitor”: 5 - “Lost DM”: 2 - “Feature Request”: 1 (Note: 13+5+5+2+1 = 26; the remaining 1 loss reason in the file is “Lost- Does not fit ICP (write in notes)” = 1.) 6) Activity volume by type — last 30 days (from ae_engagements.csv; summed across all Alex Franklin deal_ids provided) - Emails (30d): 807 - Calls (30d): 112 - Meetings (30d): 128 - Notes (30d): 50 Three coaching observations (grounded in the numbers above) 1) Conversion issue from DS2 to outcomes: DS2-to-won is 22.86% (8 wins vs 27 losses in the 90-day DS2 cohort). Coaching focus: tighten DS2 exit criteria and deal qualification to reduce the 27-loss denominator. 2) Losses are dominated by timing: “Lost- Timing (1 year or more)” is 13/27 QTD losses = 48.15% (13 ÷ 27). Coaching focus: earlier timeline validation + mutual action plans to disqualify/park “1 year+” timing before it consumes late-stage cycles. 3) Pipeline is heavily mid-stage with relatively little late-stage: DS3 is 552705 of 1260390 total = 43.85% (552705 ÷ 1260390), while DS4+DS5 combined are 23574+45730 = 69304 (69304 ÷ 1260390 = 5.50%). Coaching focus: push DS3->DS4 progression (next-step commitments) to build more near-term, late-stage coverage.
Data gaps (can’t be filled from provided files): - “Open” status is not provided in deal_contacts.csv (I treated every deal in deal_contacts.csv as in-scope). - Deal amount and deal stage are not provided in either file (so I cannot report amount/stage, or truly pick “most valuable persona given the stage” from data alone). - “Last 60 days” needs an as-of date; none is provided. I used 2026-09-14 (this session date) as-of. Active window arithmetic: - cutoff = as-of − 60 days = 2026-09-14 − 60 days = 2026-07-16 - Active contact = (is_former = false) AND (last_engaged_date ≥ 2026-07-16) Default used for “most valuable persona to add” due to missing stage data: - If economic buyer missing → economic buyer - Else (if economic buyer present) → pick a missing persona that has an on-file unengaged contact, if any; otherwise “cannot determine (stage missing)” FLAGGED DEALS (single-threaded <2 active contacts OR under-threaded <3 active contacts OR all active contacts in one persona) 1) Deal-36C33F (C-077A0E) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-4FE556] = 1 - personas present (active): IT security - personas missing: economic buyer, champion, HR admin, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: CT-1DB73E (Chief People Officer, economic buyer) 2) Deal-F9A08A (C-0D15DF) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-931B10] = 1 - personas present (active): champion - personas missing: economic buyer, HR admin, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: CT-697541 (Chief People Officer, economic buyer) 3) Deal-5408B0 (C-2AE3AA) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-D33AE4, CT-8742FD] = 2 - personas present (active): champion, HR admin - personas missing: economic buyer, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: CT-07FA76 (Chief People Officer, economic buyer) 4) Deal-D0D6B5 (C-32918E) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-87CED4, CT-DE6D7C, CT-FD70B2] = 3 - personas present (active): champion - personas missing: economic buyer, HR admin, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: CT-1FA4DB (Chief People Officer, economic buyer) 5) Deal-5BFE3B (C-535D36) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-57123B, CT-5CE757] = 2 - personas present (active): champion - personas missing: economic buyer, HR admin, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: none on file 6) Deal-C6D97A (C-5A8FC2) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-223DDC, CT-B03555, CT-4E8A2B] = 3 - personas present (active): champion - personas missing: economic buyer, HR admin, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: none on file 7) Deal-885F45 (C-5E8EFB) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-51C81E, CT-D9A0E8] = 2 - personas present (active): economic buyer, champion - personas missing: HR admin, IT security, finance - most valuable persona to add given stage: IT security (stage missing; selected because an on-file unengaged IT security contact exists) - on-file unengaged contact who fits: CT-B3F25D (IT Security Lead, IT security) 8) Deal-FCBE5B (C-737030) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-4A5317] = 1 - personas present (active): champion - personas missing: economic buyer, HR admin, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: none on file 9) Deal-92D97D (C-E23238) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-01F5B4] = 1 - personas present (active): HR admin - personas missing: economic buyer, champion, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: none on file 10) Deal-50D386 (C-EB10E4) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-AA41B2, CT-B9C35B] = 2 - personas present (active): champion, HR admin - personas missing: economic buyer, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: CT-A1C4B3 (Chief People Officer, economic buyer) 11) Deal-EC3025 (C-FDD0C7) - amount: missing from provided files - stage: missing from provided files - active contact count arithmetic: [CT-047C54] = 1 - personas present (active): champion - personas missing: economic buyer, HR admin, IT security, finance - most valuable persona to add given stage: economic buyer (stage missing; default applied) - on-file unengaged contact who fits: CT-6827DB (Chief People Officer, economic buyer)
What Alex Franklin leads with in the first five minutes (10 calls; TT-001 to TT-010) 1) Outcome-led customer story (8/10 = 8 ÷ 10 = 0.80 = 80%) - “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.” 2) Agenda-setting (1/10 = 1 ÷ 10 = 0.10 = 10%) - “I put together a short agenda — security review first, then pricing.” 3) Pricing-first (1/10 = 1 ÷ 10 = 0.10 = 10%) - “You asked for straight pricing last time, so let's start there.” 4) Early competitive positioning (1/10 = 1 ÷ 10 = 0.10 = 10%) - “And unlike Workhuman, our pricing includes the full rewards catalog with no extra margin.” Three most common objections + how he handles them (by frequency across 10 calls) 1) “Budget locked until next fiscal year” (4/10 = 4 ÷ 10 = 0.40 = 40%) - Objection: “Honestly, budget is locked until next fiscal year — I can't add a new line item right now.” - His handle: “Totally fair. Most teams fund this out of turnover savings — that retailer saved about $210k in avoided backfills, which is how their finance team signed off.” 2) “Revisit next quarter / too busy” (3/10 = 3 ÷ 10 = 0.30 = 30%) - Objection: “This is good, but can we revisit it next quarter? Open enrollment starts in October and we're underwater.” - His handle: “Makes sense. What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?” 3) “We already do recognition (spreadsheet + gift cards)” (3/10 = 3 ÷ 10 = 0.30 = 30%) - Objection: “We already do recognition with a spreadsheet and quarterly gift cards — why would we change?” - His handle: “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.” How often a concrete next step is agreed (rate) - Concrete next step agreed in 7 of 10 calls. - Arithmetic: 7/10 = 7 ÷ 10 = 0.70 = 70% - Example agreement line (appears in those 7 calls): “Yes, Thursday at 2pm works — send the invite and I'll bring our HRIS manager.” Every competitor a prospect raised (from transcripts; prospect-spoken only) 1) Awardco (raised in Deal-547B2B) - “We're also in late talks with Awardco — their rewards catalog looks bigger than yours.” 2) Kudos (raised in Deal-EDC141) - “How are you different from Kudos? Our CEO used them at her last company.” Two coaching notes 1) The opener is highly repeated (same “400-person retailer…18%” story in 8/10 calls); test a second proof-point opener so prospects don’t feel like they’re getting a script. 2) When “committee” blocks progress (e.g., Deal-403845, Deal-84DBA6), the transcript shows acknowledgment but not a scheduled path forward; add a standard “committee-ready” next step (e.g., a time-boxed prep/work session) to keep momentum instead of ending on “leave it with you.”
Q3 2026 forecast window (close_date in [2026-07-01, 2026-09-30]) COMMIT (100% weight) - Count (inside quarter): 7 deals - Total COMMIT = 11200 (Deal-547B2B) + 9000 (Deal-B7EBD1) + 9000 (Deal-403845) + 6360 (Deal-A2B47C) + 5400 (Deal-2465CE) + 2520 (Deal-A5E80A) + 1249 (Deal-499BF6) = 44729 BEST_CASE (35% weight) - Count (inside quarter): 24 deals - Total BEST_CASE = 38935 (Deal-2D7423) + 24000 (Deal-25F752) + 19656 (Deal-E53952) + 16250 (Deal-5EED42) + 11116 (Deal-FA32A0) + 10800 (Deal-FC22A3) + 10500 (Deal-944310) + 9890 (Deal-5195DB) + 9720 (Deal-180D02) + 9000 (Deal-3974EB) + 7200 (Deal-5D8CEE) + 3840 (Deal-9D0060) + 3780 (Deal-46988D) + 3600 (Deal-357C30) + 3240 (Deal-C6D97A) + 3150 (Deal-DAF1D9) + 3120 (Deal-EE195F) + 3060 (Deal-55164C) + 2916 (Deal-001FF4) + 2760 (Deal-7B3B0F) + 2484 (Deal-F9A08A) + 2100 (Deal-8952F0) + 1920 (Deal-1FC049) + 528 (Deal-87412C) = 203565 PIPELINE (0% weight) - Count (inside quarter): 23 deals - Total contribution to forecast: 0 Weighted forecast (Q3 only) - Weighted forecast = 100%*COMMIT + 35%*BEST_CASE = 44729 + 0.35*203565 = 44729 + 71247.75 = 115976.75 Counts of deals inside the quarter (by category) - COMMIT: 7 - BEST_CASE: 24 - PIPELINE: 23 Excluded deals (outside the quarter: close_date > 2026-09-30) - Excluded count: 32 deals - Excluded total amount = 43875 (Deal-E51FB7) + 18000 (Deal-B936FE) + 17000 (Deal-D9A12F) + 13770 (Deal-D348E1) + 10800 (Deal-4062CF) + 9000 (Deal-293AF3) + 9000 (Deal-034D49) + 7920 (Deal-E0ADD8) + 7690 (Deal-9F2E43) + 7500 (Deal-FCBE5B) + 7200 (Deal-712010) + 5700 (Deal-6691E0) + 5400 (Deal-C61CF7) + 5400 (Deal-600CD9) + 5400 (Deal-A92065) + 5400 (Deal-1D532E) + 5160 (Deal-48B656) + 4800 (Deal-E531A6) + 4400 (Deal-D1E6C2) + 4300 (Deal-D9E112) + 4000 (Deal-5AD94B) + 3600 (Deal-901332) + 3600 (Deal-47AE31) + 3600 (Deal-15D24F) + 3300 (Deal-766C74) + 2400 (Deal-ED725A) + 1800 (Deal-8AD4A5) + 1800 (Deal-D7E999) + 1680 (Deal-ED13B0) + 1600 (Deal-5FDCE4) + 1400 (Deal-7FA0C3) + 1080 (Deal-F5A622) = 227575 Excluded deals list (alias | forecast_category | close_date | amount) - Deal-E51FB7 | PIPELINE | 2026-10-01 | 43875 - Deal-B936FE | PIPELINE | 2026-10-09 | 18000 - Deal-D9A12F | PIPELINE | 2026-10-15 | 17000 - Deal-D348E1 | COMMIT | 2026-10-15 | 13770 - Deal-4062CF | PIPELINE | 2026-10-15 | 10800 - Deal-293AF3 | PIPELINE | 2026-10-09 | 9000 - Deal-034D49 | PIPELINE | 2026-10-15 | 9000 - Deal-E0ADD8 | PIPELINE | 2026-10-15 | 7920 - Deal-9F2E43 | PIPELINE | 2026-10-08 | 7690 - Deal-FCBE5B | PIPELINE | 2026-10-07 | 7500 - Deal-712010 | PIPELINE | 2026-10-15 | 7200 - Deal-6691E0 | PIPELINE | 2026-10-15 | 5700 - Deal-C61CF7 | BEST_CASE | 2026-10-09 | 5400 - Deal-600CD9 | PIPELINE | 2026-10-02 | 5400 - Deal-A92065 | PIPELINE | 2026-10-15 | 5400 - Deal-1D532E | PIPELINE | 2026-10-15 | 5400 - Deal-48B656 | BEST_CASE | 2026-10-15 | 5160 - Deal-E531A6 | PIPELINE | 2026-10-15 | 4800 - Deal-D1E6C2 | PIPELINE | 2026-10-09 | 4400 - Deal-D9E112 | PIPELINE | 2026-10-09 | 4300 - Deal-5AD94B | PIPELINE | 2026-10-15 | 4000 - Deal-901332 | BEST_CASE | 2026-10-15 | 3600 - Deal-47AE31 | BEST_CASE | 2026-10-09 | 3600 - Deal-15D24F | BEST_CASE | 2026-10-09 | 3600 - Deal-766C74 | PIPELINE | 2026-10-14 | 3300 - Deal-ED725A | BEST_CASE | 2026-10-08 | 2400 - Deal-8AD4A5 | BEST_CASE | 2026-10-07 | 1800 - Deal-D7E999 | PIPELINE | 2026-10-15 | 1800 - Deal-ED13B0 | PIPELINE | 2026-10-09 | 1680 - Deal-5FDCE4 | BEST_CASE | 2026-10-01 | 1600 - Deal-7FA0C3 | PIPELINE | 2026-10-01 | 1400 - Deal-F5A622 | BEST_CASE | 2026-10-08 | 1080 Top 5 BEST_CASE deals by amount (inside quarter only) 1) Deal-2D7423: 38935 (close_date 2026-09-30) 2) Deal-25F752: 24000 (close_date 2026-09-25) 3) Deal-E53952: 19656 (close_date 2026-09-30) 4) Deal-5EED42: 16250 (close_date 2026-09-30) 5) Deal-FA32A0: 11116 (close_date 2026-09-25) ## Data quality Most deals have blank owner, so unattended reporting can’t reliably attribute forecast coverage or enforce owner-level hygiene. why_buys_chars is 0 for most deals, indicating missing “why_buys” detail that would normally support stage/category confidence. There is at least one COMMIT in DS1 (Deal-A5E80A), which suggests forecast_category/stage misalignment risk. Amounts include at least one fractional value (Deal-42326B = 2480.4) with no currency/rounding rules provided, which can break rollups if systems assume integers.
2x2 activation-signal cohorts (N=220 companies; retained at 24 months := current_status = active) 1) Both signals (m1_users >= 5 AND m1_redemptions >= 1) - Cohort size: 47 - Retained @24m: 31 - 24m retention rate: 31 / 47 = 0.659574... = 65.96% 2) Givers-only (m1_users >= 5 AND m1_redemptions = 0) - Cohort size: 49 - Retained @24m: 23 - 24m retention rate: 23 / 49 = 0.469387... = 46.94% 3) Redemption-only (m1_users < 5 AND m1_redemptions >= 1) - Cohort size: 29 - Retained @24m: 9 - 24m retention rate: 9 / 29 = 0.310344... = 31.03% 4) Neither signal (m1_users < 5 AND m1_redemptions = 0) - Cohort size: 95 - Retained @24m: 38 - 24m retention rate: 38 / 95 = 0.4 = 40.00% Excluded from denominator - 0 companies excluded. - Why: every row in the extract has non-missing m1_users, m1_redemptions, and current_status, so every company can be bucketed and evaluated for 24m retention per your definition. Single signal with the largest retention lift (vs “neither” baseline) - Baseline (“neither”) retention: 40.00% - “Givers-only” retention: 46.94% → lift = 46.94% − 40.00% = +6.94 percentage points - “Redemption-only” retention: 31.03% → lift = 31.03% − 40.00% = −8.97 percentage points => Largest (positive) lift: givers signal (m1_users >= 5). What this does and does not prove - Does: In this extract, companies with both early signals have higher observed 24m retention (65.96%) than givers-only (46.94%), redemption-only (31.03%), and neither (40.00%). - Does not: Prove causality (that increasing m1_users to 5+ and/or getting a redemption will cause higher 24m retention). This is an association in one cohort extract, with no controls for confounders (e.g., tier, ARR, integrations, industry, country) and no experiment/quasi-experiment design shown in the provided data.
ARR reconciliation (as of 2026-09-05) Note: neither file contains an “as_of” date field; this uses the provided current statuses/values. 1) Totals (CRM vs Billing) Billing ARR (active subscriptions only; Billing ARR = MRR x 12): - Sum active MRR = 50,394.94 - Billing ARR total = 50,394.94 x 12 = 604,739.28 CRM ARR (company_arr.csv): - CRM ARR total = sum(hubspot_arr) across 39 company_alias rows = 603,581.76 Variance (CRM - Billing): - Variance = 603,581.76 - 604,739.28 = -1,157.52 (CRM is lower than Billing by 1,157.52) 2) Variance decomposition (must sum exactly to -1,157.52) Bucket A — Status mismatch (CRM shows ARR, but billing has no ACTIVE subscription; only CANCELLED seen): - C-0C8323BF: 4,905.24 - 0.00 = +4,905.24 - C-0DC4FB8C: 8,253.24 - 0.00 = +8,253.24 Status mismatch subtotal = 4,905.24 + 8,253.24 = +13,158.48 Bucket B — Missing records (exists on one side only; excluding status-mismatch cases) - Missing in billing (CRM-only, no subscription record at all in chargebee_subscriptions.csv): - C-0D5BBE3A: 16,497.24 - 0.00 = +16,497.24 - Missing in CRM (billing-only, active subscription exists but no company_arr row): - C-21629AA4: 0.00 - 28,449.24 = -28,449.24 Missing records subtotal = +16,497.24 + (-28,449.24) = -11,952.00 Bucket C — Rounding - No diffs attributable purely to rounding at the cent level in the remaining mismatches Rounding subtotal = 0.00 Bucket D — Other (present on both sides but amounts differ; not status mismatch; not missing) - C-0F7269D7: 24,396.00 - 26,796.00 = -2,400.00 - C-0D66DF9E: 23,200.00 - 23,184.00 = +16.00 - C-14D70CE0: 18,200.00 - 18,180.00 = +20.00 Other subtotal = (-2,400.00) + 16.00 + 20.00 = -2,364.00 Check bucket sum: +13,158.48 + (-11,952.00) + 0.00 + (-2,364.00) = -1,157.52 (matches variance exactly) 3) Mismatched accounts (each mismatch + suggested owner) A) Status mismatch (billing cancelled; CRM still has ARR) - C-0C8323BF - CRM hubspot_arr = 4,905.24 - Billing active ARR = 0.00 (only cancelled subscription present: SUB-000E) - Diff (CRM - Billing) = +4,905.24 - Suggested owner: RevOps (CRM ARR owner) + Billing Ops/CS Ops (validate cancel timing vs CRM ARR) - C-0DC4FB8C - CRM hubspot_arr = 8,253.24 - Billing active ARR = 0.00 (only cancelled subscription present: SUB-000F) - Diff (CRM - Billing) = +8,253.24 - Suggested owner: RevOps (CRM ARR owner) + Billing Ops/CS Ops B) Missing records - C-0D5BBE3A (missing in billing file) - CRM hubspot_arr = 16,497.24 - Billing active ARR = 0.00 (no subscription row provided for this company_alias) - Diff (CRM - Billing) = +16,497.24 - Suggested owner: Billing Ops (verify subscription exists / mapping) + RevOps (company_alias mapping) - C-21629AA4 (missing in CRM file) - CRM hubspot_arr = 0.00 (no company_arr row) - Billing active ARR = 2,370.77 x 12 = 28,449.24 (SUB-0004 is active) - Diff (CRM - Billing) = -28,449.24 - Suggested owner: RevOps (CRM data owner; create/match company record) + Billing Ops (confirm correct company_alias) C) Other (amount mismatch with records on both sides) - C-0F7269D7 - CRM hubspot_arr = 24,396.00 - Billing active ARR = 2,233.00 x 12 = 26,796.00 - Diff (CRM - Billing) = -2,400.00 - Suggested owner: RevOps + Billing Ops (pricing/MRR vs CRM ARR logic mismatch) - C-0D66DF9E - CRM hubspot_arr = 23,200.00 - Billing active ARR = 1,932.00 x 12 = 23,184.00 - Diff (CRM - Billing) = +16.00 - Suggested owner: RevOps (CRM rounding/ARR calc) + Billing Ops (billing amount check) - C-14D70CE0 - CRM hubspot_arr = 18,200.00 - Billing active ARR = 1,515.00 x 12 = 18,180.00 - Diff (CRM - Billing) = +20.00 - Suggested owner: RevOps + Billing Ops 4) Business rule check: term_months != 12 ⇒ cf_agreement_end_date must be populated Violations (term_months not 12 and cf_agreement_end_date blank): - SUB-0002 (C-1794A52C): term_months = 24, cf_agreement_end_date = blank - SUB-0019 (C-22170CA1): term_months = 36, cf_agreement_end_date = blank Non-violations (examples where term != 12 but date is populated, included for completeness from provided data): - SUB-000C (C-0DB48281): term_months = 24, cf_agreement_end_date = 2027-11-30 - SUB-001A (C-0FC4DBB8): term_months = 36, cf_agreement_end_date = 2027-11-30
Computed as simple average across the 30 company_alias rows each month (equal-weight). KVMs (2026-08 vs 2026-07): - Giving rate: 0.6027 vs 0.6023; Δ=0.6027133−0.6022967=+0.0004167; Δ%=+0.0004167/0.6022967=+0.0692% (up) - Redemptions per user: 1.7302 vs 1.7300; Δ=1.7301633−1.7299833=+0.0001800; Δ%=+0.0001800/1.7299833=+0.0104% (up) - 1:1 meetings engagement: 0.4472 vs 0.4469; Δ=0.4471767−0.4468867=+0.0002900; Δ%=+0.0002900/0.4468867=+0.0649% (up) - Pulse check engagement: 0.5086 vs 0.6006; Δ=0.5086100−0.6005867=−0.0919767; Δ%=−0.0919767/0.6005867=−15.3145% (down) Largest relative move: pulse check engagement (−15.3145%). Driver: size_band enterprise (plan_tier is only tier_three, so plan_tier driver not supported). Enterprise pulse avg 0.54998→0.27428 (Δ=−0.27570; Δ%=−50.1291%), dominating the overall drop. | KVM | 2026-08 | 2026-07 | Abs Δ | Rel Δ | Dir | |---|---:|---:|---:|---:|---| | giving_rate | 0.6027 | 0.6023 | +0.0004 | +0.0692% | up | | redemptions_per_user | 1.7302 | 1.7300 | +0.0002 | +0.0104% | up | | one_to_one_engagement | 0.4472 | 0.4469 | +0.0003 | +0.0649% | up | | pulse_engagement | 0.5086 | 0.6006 | −0.0920 | −15.3145% | down |
Last completed month: 2026-08 (max month present in redemptions_ytd.csv is 2026-08) Redemption (YTD through 2026-08, inclusive) - Redemption count: 378 - Spend (USD): 27,884.00 - Unique redeemers: 233 - Redemptions per redeemer: 378 / 233 = 1.6223… ≈ 1.62 Provider mix (% of spend; sums to 100.00%) - custom: 10,873 / 27,884 = 38.99% - Tremendous: 8,540 / 27,884 = 30.63% - Snappy: 5,241 / 27,884 = 18.80% - TangoCard: 3,230 / 27,884 = 11.58% Sum check: 38.99% + 30.63% + 18.80% + 11.58% = 100.00% Top 5 countries by redemptions (count) 1) US: 244 2) CA: 24 3) AU: 21 4) GB: 17 5) NL: 17
Churn-save offer qualifiers (must pass R1+R2+R3) 1) C-0B0F1BAB - Amount at stake (churn_save_eligible_amount): 5494.00 - Play: executive touch - Signals: - R1: health_score 38 < 60 - R2: churn_save_eligible_amount 5494.00 > 0 - R3: renewal_date 2026-09-23 is (2026-09-23 − 2026-09-05) = 18 days (<= 120) - Play signal: champion_active=false 2) C-0E9C27D1 - Amount at stake: 41235.00 - Play: usage revival - Signals: - R1: health_score 39 < 60 - R2: churn_save_eligible_amount 41235.00 > 0 - R3: renewal_date 2026-09-24 is (2026-09-24 − 2026-09-05) = 19 days (<= 120) - Play signal: usage_trend_3m=flat - Usage arithmetic: seats_used/seats = 134/157 = 85.4% 3) C-0F6C0F34 - Amount at stake: 49707.00 - Play: executive touch - Signals: - R1: health_score 51 < 60 - R2: churn_save_eligible_amount 49707.00 > 0 - R3: renewal_date 2026-10-03 is (2026-10-03 − 2026-09-05) = 28 days (<= 120) - Play signal: champion_active=false 4) C-0B360C78 - Amount at stake: 35748.00 - Play: commercial concession - Signals: - R1: health_score 57 < 60 - R2: churn_save_eligible_amount 35748.00 > 0 - R3: renewal_date 2026-10-28 is (2026-10-28 − 2026-09-05) = 53 days (<= 120) - Play signal: usage_trend_3m=growing AND champion_active=true 5) C-0D3278C7 - Amount at stake: 17602.00 - Play: usage revival - Signals: - R1: health_score 54 < 60 - R2: churn_save_eligible_amount 17602.00 > 0 - R3: renewal_date 2026-11-12 is (2026-11-12 − 2026-09-05) = 68 days (<= 120) - Play signal: usage_trend_3m=declining - Usage arithmetic: seats_used/seats = 126/380 = 33.2% 6) C-0B827671 - Amount at stake: 25365.00 - Play: usage revival - Signals: - R1: health_score 56 < 60 - R2: churn_save_eligible_amount 25365.00 > 0 - R3: renewal_date 2026-11-14 is (2026-11-14 − 2026-09-05) = 70 days (<= 120) - Play signal: usage_trend_3m=declining - Usage arithmetic: seats_used/seats = 113/202 = 55.9% 7) C-0CEF69FD - Amount at stake: 32621.00 - Play: executive touch - Signals: - R1: health_score 53 < 60 - R2: churn_save_eligible_amount 32621.00 > 0 - R3: renewal_date 2026-11-21 is (2026-11-21 − 2026-09-05) = 77 days (<= 120) - Play signal: champion_active=false 8) C-0CA21961 - Amount at stake: 16829.00 - Play: usage revival - Signals: - R1: health_score 58 < 60 - R2: churn_save_eligible_amount 16829.00 > 0 - R3: renewal_date 2026-12-28 is (2026-12-28 − 2026-09-05) = 114 days (<= 120) - Play signal: usage_trend_3m=flat - Usage arithmetic: seats_used/seats = 84/325 = 25.8% Total amount at stake (qualified churn-save eligible amount) - Arithmetic: 5494.00 + 41235.00 + 49707.00 + 35748.00 + 17602.00 + 25365.00 + 32621.00 + 16829.00 = 224601.00 Accounts that look at risk (R1) but do NOT qualify (fail R2 and/or R3) 1) C-0BC71BDD - At-risk signal: health_score 55 < 60 (R1) - Not qualified because: fails R2 (churn_save_eligible_amount 0.00 is not > 0) 2) C-0BE96399 - At-risk signal: health_score 54 < 60 (R1) - Not qualified because: fails R2 (churn_save_eligible_amount 0.00 is not > 0) 3) C-10A56B0F - At-risk signal: health_score 54 < 60 (R1) - Not qualified because: fails R2 (churn_save_eligible_amount 0.00 is not > 0) 4) C-0F876796 - At-risk signal: health_score 47 < 60 (R1) - Not qualified because: fails R3 (renewal_date 2027-02-06 is (2027-02-06 − 2026-09-05) = 154 days, which is > 120) 5) C-0F6694C3 - At-risk signal: health_score 43 < 60 (R1) - Not qualified because: - fails R2 (churn_save_eligible_amount 0.00 is not > 0) - fails R3 (renewal_date 2027-03-21 is (2027-03-21 − 2026-09-05) = 197 days, > 120) 6) C-0BA71F12 - At-risk signal: health_score 52 < 60 (R1) - Not qualified because: fails R3 (renewal_date 2027-04-11 is (2027-04-11 − 2026-09-05) = 218 days, > 120) (Note: R2 passes because churn_save_eligible_amount 6824.00 > 0, but R3 fails.) 7) C-0FCCD2DF - At-risk signal: health_score 43 < 60 (R1) - Not qualified because: - fails R2 (churn_save_eligible_amount 0.00 is not > 0) - fails R3 (renewal_date 2027-04-23 is (2027-04-23 − 2026-09-05) = 230 days, > 120)
Expansion kit — C-0DDFC9A7 1) Seat coverage (licensed over headcount) - Licensed seats = 150 - Headcount = 400 - Seat coverage = 150 / 400 = 0.375 = 37.5% 2) Usage health (2 lines, from provided usage) - Monthly active users rose from 88 (2026-03) to 126 (2026-08): +38 users; arithmetic: 126 − 88 = 38 (+43.18%); arithmetic: (126/88 − 1)×100 = 43.18%. - Latest month utilization vs licenses: 126 / 150 = 0.84 = 84.0% of licensed seats active (2026-08). 3) Headroom at current per-seat rate (seats + ARR) - Current ARR = 9000.00 - Current licensed seats = 150 - Per-seat rate = 9000.00 / 150 = 60.00 ARR per seat - Seat headroom to full headcount coverage = 400 − 150 = 250 seats - ARR headroom at $60/seat = 250 × 60.00 = 15000.00 - Total ARR if fully covered at same rate = 9000.00 + 15000.00 = 24000.00 4) Who replied + can they buy? - Replied: Maria S., People Operations Coordinator - Can buy? No — per reply: “I’m not the right person for purchasing decisions… sit with Dana R., our VP People.” 5) Right buyer from contacts - Dana R., VP People (buyer per Maria S.’s reply) 6) Reply email (<150 words; cite 1 real usage fact) Subject: Re: Bonusly usage numbers + next steps Hi Maria, Thanks for the quick reply — and great to hear the team loves Bonusly. Appreciate you pointing me to Dana R. If it’s helpful, one usage datapoint: monthly active users increased to 126 in 2026-08 (up from 88 in 2026-03). Would you be open to introducing me to Dana? If you prefer, I can send over a short usage snapshot for her first, and we can keep it lightweight. Thanks again, Cole
Account: C-0D284E42 (signup_date = 2026-08-11) 1) What is complete (only where a field shows it) - Slack integration connected: COMPLETE - Evidence: integration_slack = 2026-08-12 - HRIS integration connected: NOT complete / no data - Evidence: integration_hris is blank - Allowance set: COMPLETE - Evidence: allowance_set = 2026-08-13 - Admins added: COMPLETE (at least some admins added) - Evidence: admins_added = 2 - First recognition given: COMPLETE - Evidence: first_recognition_at = 2026-08-15 14:22 - First redemption: NOT complete / no data - Evidence: first_redemption_at is blank 2) What is not complete (and what’s missing) - HRIS integration: integration_hris date is missing (blank). - First redemption: first_redemption_at timestamp is missing (blank). 3) Early engagement signals (from onboarding_usage.csv) Time window provided: 2026-08-11 to 2026-09-04 (25 days) - Active givers growth: - Start (2026-08-11): 3 - End (2026-09-04): 15 - Net change = 15 − 3 = +12 active givers - % change = (12 / 3) * 100 = 400.0% - Average active givers per day: - Total active_givers across all days = 214 - Average = 214 / 25 = 8.56 - Early vs recent trend: - First 7 days values: [3, 3, 4, 4, 5, 4, 7] → sum = 30 → avg = 30 / 7 = 4.2857 - Last 7 days values: [11, 13, 11, 13, 13, 15, 15] → sum = 91 → avg = 91 / 7 = 13.0 - High-engagement frequency: - Days with active_givers ≥ 10: 10 days (from 2026-08-26 through 2026-09-04) - Peak active_givers = 15 on 2 days: 2026-09-03 and 2026-09-04 4) Three things to cover on the mid-onboarding call (based strictly on what’s missing + usage signals) 1. HRIS integration plan and owner - Because integration_hris is blank (not connected / not recorded). 2. Drive first redemption to completion - Because first_redemption_at is blank (no first redemption recorded yet). 3. Convert strong giving momentum into a repeatable rollout motion - Usage shows active_givers rising (3 → 15; last-7-day avg 13.0 vs first-7-day avg 4.2857), so align next steps to sustain/grow participation while confirming the current setup that’s already in place (Slack connected, allowance set, 2 admins, first recognition sent).
90-day renewal risk brief (data limits: no company names provided; “company” below = account_alias) Decision rule for renewal date used (per account): - If is_multi_year=true (Chargebee): use Chargebee cb_renewal_date because ChurnZero renewal dates are known to be wrong for multi-year contracts. - If is_multi_year=false: cz_renewal_date and cb_renewal_date agree for every account here; use Chargebee (same date). Renewals (sorted by date used) 1) Company: C-0B7D2C30 CSM: Dana Mercer | ARR: 65901.00 Date used: 2026-09-15 (Chargebee; is_multi_year=true, term_months=36) DISAGREEMENT: CZ=2026-09-10 vs CB=2026-09-15 Seat utilization: 274/476 = 57.6% 3-month usage trend (active users): 97→94→84 (-13; -13.4%) Risk: High — Seat utilization is 274/476 = 57.6% and last-3-month active users are 97→94→84 (-13; -13.4%). 2) Company: C-0BCDB8C2 CSM: Cole Ingram | ARR: 54427.00 Date used: 2026-09-18 (Chargebee; is_multi_year=true, term_months=36) DISAGREEMENT: CZ=2027-09-18 vs CB=2026-09-18 Seat utilization: 232/424 = 54.7% 3-month usage trend (active users): 127→118→110 (-17; -13.4%) Risk: High — Seat utilization is 232/424 = 54.7% and last-3-month active users are 127→118→110 (-17; -13.4%). 3) Company: C-0D2AB865 CSM: Elena Sinclair | ARR: 38022.00 Date used: 2026-09-22 (Chargebee; is_multi_year=true, term_months=24) DISAGREEMENT: CZ=2026-09-10 vs CB=2026-09-22 Seat utilization: 250/407 = 61.4% 3-month usage trend (active users): 125→117→109 (-16; -12.8%) Risk: High — Seat utilization is 250/407 = 61.4% and last-3-month active users are 125→117→109 (-16; -12.8%). 4) Company: C-0BBE3E60 CSM: Dana Mercer | ARR: 30993.00 Date used: 2026-09-26 (Chargebee; is_multi_year=true, term_months=24) DISAGREEMENT: CZ=2027-09-26 vs CB=2026-09-26 Seat utilization: 74/114 = 64.9% 3-month usage trend (active users): 39→35→33 (-6; -15.4%) Risk: High — Seat utilization is 74/114 = 64.9% and last-3-month active users are 39→35→33 (-6; -15.4%). 5) Company: C-0F5D2323 CSM: Cole Ingram | ARR: 90647.00 Date used: 2026-09-29 (Chargebee; is_multi_year=true, term_months=24) DISAGREEMENT: CZ=2026-09-10 vs CB=2026-09-29 Seat utilization: 111/390 = 28.5% 3-month usage trend (active users): 20→21→18 (-2; -10.0%) Risk: High — Seat utilization is 111/390 = 28.5% and last-3-month active users are 20→21→18 (-2; -10.0%). 6) Company: C-0EC6999D CSM: Elena Sinclair | ARR: 79419.00 Date used: 2026-10-03 (CZ=2026-10-03 and CB=2026-10-03 agree; is_multi_year=false) Seat utilization: 31/112 = 27.7% 3-month usage trend (active users): 17→16→15 (-2; -11.8%) Risk: High — Seat utilization is 31/112 = 27.7% and last-3-month active users are 17→16→15 (-2; -11.8%). 7) Company: C-0B20DB64 CSM: Dana Mercer | ARR: 21770.00 Date used: 2026-10-07 (CZ=2026-10-07 and CB=2026-10-07 agree; is_multi_year=false) Seat utilization: 214/378 = 56.6% 3-month usage trend (active users): 294→298→294 (+0; +0.0%) Risk: Medium — Seat utilization is 214/378 = 56.6% and last-3-month active users are 294→298→294 (+0; +0.0%). 8) Company: C-0BBC4E7A CSM: Cole Ingram | ARR: 56374.00 Date used: 2026-10-10 (CZ=2026-10-10 and CB=2026-10-10 agree; is_multi_year=false) Seat utilization: 228/337 = 67.7% 3-month usage trend (active users): 142→141→139 (-3; -2.1%) Risk: Medium — Seat utilization is 228/337 = 67.7% and last-3-month active users are 142→141→139 (-3; -2.1%). 9) Company: C-0FD551AB CSM: Elena Sinclair | ARR: 48815.00 Date used: 2026-10-14 (CZ=2026-10-14 and CB=2026-10-14 agree; is_multi_year=false) Seat utilization: 210/376 = 55.9% 3-month usage trend (active users): 123→122→126 (+3; +2.4%) Risk: Medium — Seat utilization is 210/376 = 55.9% and last-3-month active users are 123→122→126 (+3; +2.4%). 10) Company: C-0F9F8F13 CSM: Dana Mercer | ARR: 46230.00 Date used: 2026-10-18 (CZ=2026-10-18 and CB=2026-10-18 agree; is_multi_year=false) Seat utilization: 199/352 = 56.5% 3-month usage trend (active users): 185→185→182 (-3; -1.6%) Risk: Medium — Seat utilization is 199/352 = 56.5% and last-3-month active users are 185→185→182 (-3; -1.6%). 11) Company: C-0BC34584 CSM: Cole Ingram | ARR: 16740.00 Date used: 2026-10-22 (CZ=2026-10-22 and CB=2026-10-22 agree; is_multi_year=false) Seat utilization: 327/494 = 66.2% 3-month usage trend (active users): 104→104→106 (+2; +1.9%) Risk: Medium — Seat utilization is 327/494 = 66.2% and last-3-month active users are 104→104→106 (+2; +1.9%). 12) Company: C-0B7A7546 CSM: Elena Sinclair | ARR: 35062.00 Date used: 2026-10-25 (CZ=2026-10-25 and CB=2026-10-25 agree; is_multi_year=false) Seat utilization: 182/205 = 88.8% 3-month usage trend (active users): 64→65→63 (-1; -1.6%) Risk: Low — Seat utilization is 182/205 = 88.8% and last-3-month active users are 64→65→63 (-1; -1.6%). 13) Company: C-0B369871 CSM: Dana Mercer | ARR: 85128.00 Date used: 2026-10-29 (CZ=2026-10-29 and CB=2026-10-29 agree; is_multi_year=false) Seat utilization: 317/422 = 75.1% 3-month usage trend (active users): 326→330→333 (+7; +2.1%) Risk: Low — Seat utilization is 317/422 = 75.1% and last-3-month active users are 326→330→333 (+7; +2.1%). 14) Company: C-0B144C78 CSM: Cole Ingram | ARR: 30899.00 Date used: 2026-11-02 (CZ=2026-11-02 and CB=2026-11-02 agree; is_multi_year=false) Seat utilization: 169/224 = 75.4% 3-month usage trend (active users): 101→101→106 (+5; +5.0%) Risk: Low — Seat utilization is 169/224 = 75.4% and last-3-month active users are 101→101→106 (+5; +5.0%). 15) Company: C-0FC4DBB8 CSM: Elena Sinclair | ARR: 94732.00 Date used: 2026-11-05 (CZ=2026-11-05 and CB=2026-11-05 agree; is_multi_year=false) Seat utilization: 356/464 = 76.7% 3-month usage trend (active users): 189→191→193 (+4; +2.1%) Risk: Low — Seat utilization is 356/464 = 76.7% and last-3-month active users are 189→191→193 (+4; +2.1%). 16) Company: C-0D5BBE3A CSM: Dana Mercer | ARR: 39740.00 Date used: 2026-11-09 (CZ=2026-11-09 and CB=2026-11-09 agree; is_multi_year=false) Seat utilization: 85/102 = 83.3% 3-month usage trend (active users): 88→90→91 (+3; +3.4%) Risk: Low — Seat utilization is 85/102 = 83.3% and last-3-month active users are 88→90→91 (+3; +3.4%). 17) Company: C-0FB9D5AF CSM: Cole Ingram | ARR: 63158.00 Date used: 2026-11-13 (CZ=2026-11-13 and CB=2026-11-13 agree; is_multi_year=false) Seat utilization: 144/199 = 72.4% 3-month usage trend (active users): 173→173→176 (+3; +1.7%) Risk: Low — Seat utilization is 144/199 = 72.4% and last-3-month active users are 173→173→176 (+3; +1.7%). 18) Company: C-0B344485 CSM: Elena Sinclair | ARR: 64384.00 Date used: 2026-11-16 (CZ=2026-11-16 and CB=2026-11-16 agree; is_multi_year=false) Seat utilization: 224/287 = 78.0% 3-month usage trend (active users): 238→240→244 (+6; +2.5%) Risk: Low — Seat utilization is 224/287 = 78.0% and last-3-month active users are 238→240→244 (+6; +2.5%). 19) Company: C-0CB2C1B4 CSM: Dana Mercer | ARR: 40628.00 Date used: 2026-11-20 (CZ=2026-11-20 and CB=2026-11-20 agree; is_multi_year=false) Seat utilization: 386/473 = 81.6% 3-month usage trend (active users): 47→48→49 (+2; +4.3%) Risk: Low — Seat utilization is 386/473 = 81.6% and last-3-month active users are 47→48→49 (+2; +4.3%). 20) Company: C-22170CA1 CSM: Cole Ingram | ARR: 45646.00 Date used: 2026-11-24 (CZ=2026-11-24 and CB=2026-11-24 agree; is_multi_year=false) Seat utilization: 251/294 = 85.4% 3-month usage trend (active users): 143→148→146 (+3; +2.1%) Risk: Low — Seat utilization is 251/294 = 85.4% and last-3-month active users are 143→148→146 (+3; +2.1%). Disagreements flagged (all are multi-year in Chargebee): - C-0B7D2C30: CZ 2026-09-10 vs CB 2026-09-15 - C-0BCDB8C2: CZ 2027-09-18 vs CB 2026-09-18 - C-0D2AB865: CZ 2026-09-10 vs CB 2026-09-22 - C-0BBE3E60: CZ 2027-09-26 vs CB 2026-09-26 - C-0F5D2323: CZ 2026-09-10 vs CB 2026-09-29 Totals - Total ARR renewing (all 20 renewals listed): 1048715.00 Arithmetic: 65901.00 + 54427.00 + 38022.00 + 30993.00 + 90647.00 + 79419.00 + 21770.00 + 56374.00 + 48815.00 + 46230.00 + 16740.00 + 35062.00 + 85128.00 + 30899.00 + 94732.00 + 39740.00 + 63158.00 + 64384.00 + 40628.00 + 45646.00 = 1048715.00 - ARR at risk (Medium + High): 549338.00 Arithmetic: High (359409.00) + Medium (189929.00) = 549338.00
Total tickets in file: 80 Ranked by ARR exposure (ARR affected = sum of ARR for DISTINCT accounts in the theme) 1) HRIS provisioning/sync failures (new hires not created) — broad pattern - Count: 12 - Share: 12/80 = 0.15 = 15.0% - Distinct accounts: 3 (C-0B2213A9, C-0F6C0F34, C-0DDFC9A7) - ARR affected (distinct-account sum): 36,000 + 30,000 + 48,000 = 114,000 - Two ticket ids: IC-460059, IC-460055 - Recommendation (1 line): Add HRIS sync health checks + exception reporting (missed hires), and make provisioning failures impossible to “silently succeed.” 2) Rewards redemption & checkout failures (gift cards, spinning checkout) — broad pattern - Count: 18 - Share: 18/80 = 0.225 = 22.5% - Distinct accounts: 7 (C-0CEF69FD, C-0B827671, C-0FCCD2DF, C-0F876796, C-14264ABD, C-0D9CA315, C-0B0F1BAB) - ARR affected (distinct-account sum): 8,900 + 10,700 + 9,600 + 8,700 + 11,000 + 9,600 + 10,300 = 68,800 - Two ticket ids: IC-460025, IC-460030 - Recommendation (1 line): Harden redemption checkout with timeouts/retries + idempotency so “spin forever / deduct points / no code” cannot happen. 3) Billing/invoice correctness (seat count, tier pricing) — single-account concentration (but high ARR) - Count: 16 - Share: 16/80 = 0.20 = 20.0% - Distinct accounts: 1 (C-0E9C27D1) - ARR affected (distinct-account sum): 52,000 = 52,000 - Two ticket ids: IC-460071, IC-460069 - Recommendation (1 line): Implement strict seat/tier change controls (approval + audit trail) and an automated invoice validation check before issuing charges. 4) Recognition/points ledger issues (missing points, balance not updating) — broad pattern - Count: 20 - Share: 20/80 = 0.25 = 25.0% - Distinct accounts: 9 (C-0D3278C7, C-0BF20542, C-0D0B047C, C-0BE96399, C-0D284E42, C-0D6CC8E3, C-21FEBCBB, C-0DD0626C, C-0B2895EF) - ARR affected (distinct-account sum): 3,500 + 4,500 + 4,500 + 2,700 + 3,400 + 4,200 + 2,900 + 2,500 + 2,900 = 31,100 - Two ticket ids: IC-460004, IC-460016 - Recommendation (1 line): Add ledger reconciliation + customer-visible posting status so “delivered recognition” and “points balance” can’t diverge without detection. 5) Slack integration reliability (posting, auth, slash command, toggles) — broad pattern - Count: 14 - Share: 14/80 = 0.175 = 17.5% - Distinct accounts: 4 (C-0B843542, C-10A56B0F, C-0BA71F12, C-8C2E8F00) - ARR affected (distinct-account sum): 4,400 + 5,400 + 3,900 + 5,200 = 18,900 - Two ticket ids: IC-460041, IC-460047 - Recommendation (1 line): Stabilize Slack auth + settings persistence (toggle resets / re-auth not sticking) and add automated monitoring for slash command + posting failures.
Prospect C-82AF3719 fields: industry=Technology; size_band=Mid-Market; use_case=employee_recognition; region=NA-West. Ranking method: similarity score = industry_match + size_band_match + use_case_match + region_match (each match = 1, mismatch = 0). All three below tie at 3/4. 1) C-64171065 (has_case_study=true) - Matching fields: industry=Technology; size_band=Mid-Market; use_case=employee_recognition - Non-match: region=NA-East (prospect is NA-West) - Arithmetic: 1 (industry) + 1 (size_band) + 1 (use_case) + 0 (region) = 3 2) C-11C31562 (has_case_study=true) - Matching fields: size_band=Mid-Market; use_case=employee_recognition; region=NA-West - Non-match: industry=Manufacturing (prospect is Technology) - Arithmetic: 0 (industry) + 1 (size_band) + 1 (use_case) + 1 (region) = 3 3) C-A13C193D (has_case_study=true) - Matching fields: industry=Technology; size_band=Mid-Market; region=NA-West - Non-match: use_case=retention (prospect is employee_recognition) - Arithmetic: 1 (industry) + 1 (size_band) + 0 (use_case) + 1 (region) = 3
Trailing 6 months window used: 2026-03 through 2026-08 (inclusive), because channel_spend.csv provides those 6 months. PAID CHANNELS (2026-03..2026-08) 1) paid_search - Spend = 6000*6 = 36000 - SQMs = 40 (count of contacts_first_touch.csv rows where channel=paid_search) - SQOs = 18 (count where channel=paid_search AND sqo_date present) - Cost per SQM = 36000 / 40 = 900 - Cost per SQO = 36000 / 18 = 2000 - SQM-to-SQO rate = 18 / 40 = 0.45 - Pipeline amount = 720000 - Arithmetic: all non-zero pipeline rows in paid_search are 40000 each; 18 SQOs * 40000 = 720000 - Pipeline per dollar = 720000 / 36000 = 20.0 2) webinars - Spend = 1500*6 = 9000 - SQMs = 12 - SQOs = 5 - Cost per SQM = 9000 / 12 = 750 - Cost per SQO = 9000 / 5 = 1800 - SQM-to-SQO rate = 5 / 12 = 0.4166666667 - Pipeline amount = 60000 - Arithmetic: 5 SQOs * 12000 = 60000 - Pipeline per dollar = 60000 / 9000 = 6.6666666667 3) linkedin_ads - Spend = 4000*6 = 24000 - SQMs = 25 - SQOs = 8 - Cost per SQM = 24000 / 25 = 960 - Cost per SQO = 24000 / 8 = 3000 - SQM-to-SQO rate = 8 / 25 = 0.32 - Pipeline amount = 96000 - Arithmetic: 8 SQOs * 12000 = 96000 - Pipeline per dollar = 96000 / 24000 = 4.0 4) paid_social - Spend = 3000*6 = 18000 - SQMs = 0 - SQOs = 0 - Cost per SQM = undefined (spend > 0 and SQMs = 0) - Cost per SQO = undefined (SQOs = 0) - SQM-to-SQO rate = undefined (SQMs = 0) - Pipeline amount = 0 - Pipeline per dollar = 0 / 18000 = 0.0 ORGANIC CHANNELS (2026-03..2026-08) 1) organic_search - Volume = 30 (count of contacts_first_touch.csv rows where channel=organic_search) - SQO rate = 10 / 30 = 0.3333333333 - Pipeline amount = 90000 - Arithmetic: 10 SQOs * 9000 = 90000 2) referral - Volume = 15 - SQO rate = 6 / 15 = 0.4 - Pipeline amount = 48000 - Arithmetic: 6 SQOs * 8000 = 48000 DATA QUALITY FLAG: SQO date precedes SQM date (should not happen) - CT-000044 (channel=linkedin_ads): sqm_date=2026-07-23, sqo_date=2026-07-18, pipeline_amount=12000 - CT-000041 (channel=linkedin_ads): sqm_date=2026-06-14, sqo_date=2026-06-09, pipeline_amount=12000 REALLOCATION RECOMMENDATION (based only on this 6-month sample) - Pause/reallocate paid_social budget immediately: 18000 spend produced 0 SQMs (core efficiency metrics undefined) and 0 pipeline. - Reallocate the majority of that freed spend to paid_search: - Highest pipeline per dollar (20.0) and largest sample (40 SQMs, 18 SQOs). - Keep (or slightly increase) a smaller test allocation to webinars: - Best cost per SQO (1800) but much smaller sample (5 SQOs), and pipeline per dollar (6.67) is far below paid_search. - Reduce linkedin_ads until the SQO-before-SQM tracking issue is fixed and performance improves: - Highest cost per SQO (3000) and lowest paid pipeline per dollar (4.0) among channels that actually generated SQOs. Confidence (driven by sample sizes of SQOs in this window) - paid_search: medium-high confidence (18 SQOs / 40 SQMs is a meaningful sample here). - webinars: low-medium confidence (5 SQOs / 12 SQMs). - linkedin_ads: medium confidence on directionally weaker efficiency, but tracking anomalies (2 SQOs with sqo_date < sqm_date) reduce confidence in exact rates/costs. - paid_social: high confidence it is currently non-performing (0 SQMs on spend).
Battlecard — Rivally (updated using only provided data) 1) One-line positioning - Rivally is a points-based employee recognition product with an engaging recognition feed, plus a lightweight engagement survey add-on (“Rivally Pulse”), with an emphasis on EU readiness (EU data residency, multi-language for EU teams). (S02, S06, S12, S15) 2) Pricing (with source + date; newer source wins; note conflicts) - Current list price (pricing page): “Recognition Starter” is $7 per user/month with annual billing required (2026-08-12). (S17) - Prior pricing page snapshots (older, conflicting with current): $5 per user/month with annual billing required (2026-01-20; 2026-04-01). Likely outdated vs the 2026-08-12 update. (S03, S08, S17) - Field quote (not list price; may reflect deal-specific terms): $6.50/user/mo quoted to a 500-seat prospect on an annual term (2026-06-02). Conflicts with list pricing; treat as a specific quote, not the published rate. (S13, S17) - Field quote with discounting detail (deal-specific): prospect reports $7/user/mo list with a 15% discount for a 3-year term (2026-08-14). (S18) - Rivally Pulse pricing approach: Pulse is “priced as add-on, not bundled” (2026-09-01); no per-seat or $ amount provided. (S23) 3) Where they win - Fast setup + “Slack integration worked out of the box” (mid-market reviewer). (S04) - EU enterprise / distributed EU teams: multi-language support praised. (S12) - EU data residency positioned/available: pitched in a deal context and later announced GA. (S05, S15) - Support responsiveness praised: “under 4 hours.” (S22) - Microsoft Teams app v2 in public preview (could matter for Teams-first orgs). (S19) - Recognition feed engagement is a consistent positive. (S02, S16) 4) Where we win - Analytics/reporting depth: Rivally analytics and dashboards described as limited/basic vs more enterprise-grade tools. (S02, S07) - Identity + provisioning / enterprise admin: Rivally “lacks SCIM provisioning” and manual user management is painful. (S10) - Admin tooling: “admin tooling lags peers” + admin console lacks bulk recognition editing. (S16, S24) - Data portability / migration risk: migration off Rivally was hard; analytics exports are CSV-only. (S20) - Rewards catalog coverage in EMEA: “thinner than US catalog.” (S14) - Deal-proof point (single data point): an 800-seat prospect picked Bonusly over Rivally citing analytics depth. (S25) 5) Objections and responses (use only sourced competitor facts; no rep opinions) - Objection: “Rivally looks simpler/faster to roll out.” - Response: Rivally is described as quick to set up and Slack-ready (S04); confirm whether the prospect also needs SCIM and stronger admin controls, since Rivally is reported to lack SCIM and have weaker admin tooling (S10, S16, S24). - Objection: “Rivally is better for EU needs.” - Response: Rivally does appear strong for distributed EU teams and multi-language, and has EU data residency GA (S12, S15). Confirm whether rewards catalog depth in EMEA matters, since EMEA catalog is described as thinner than US (S14). - Objection: “Rivally’s analytics are good enough.” - Response: Multiple reviews characterize analytics/reporting as limited/basic and exports as CSV-only; plus one deal explicitly chose Bonusly citing analytics depth. (S02, S07, S20, S25) - Objection: “Rivally is cheaper.” - Response: Published price increased to $7/user/mo annual billed (S17) vs prior $5 (S03, S08). A $6.50 quote and a 15% discount for 3-year are reported in deal notes (S13, S18); treat pricing as variable and confirm which tier/add-ons (Pulse is an add-on, not bundled). (S13, S17, S18, S23) 6) Recent changes (chronological) - Raised Series C: $40M led by Northgate Ventures (2025-11-04). (S01) - Launched “Rivally Pulse” lightweight engagement survey add-on (2026-03-05). (S06) - European expansion leadership hire: ex-Workday VP EMEA to lead expansion (2026-05-09). (S11) - Opened Dublin office; EU data residency generally available (2026-07-01). (S15) - Pricing page updated: Recognition Starter now $7/user/mo annual billing required (2026-08-12). (S17) - Microsoft Teams app v2 public preview (2026-08-20). (S19) - Pulse exits beta; priced as add-on, not bundled (2026-09-01). (S23) 7) Our 12-month win/loss record vs Rivally (arithmetic shown) Source limitation: deals_with_competitor.csv provides no snippet_id field, so I cannot attach snippet IDs to these facts. Per your rule (“Cite a snippet id for every factual claim”), treat this entire section as UNVERIFIED for citation compliance, even though it is computed directly from the provided deals_with_competitor.csv. - Window present in file: 2025-09 through 2026-08 inclusive (12 months). (UNVERIFIED: no snippet_id in deals_with_competitor.csv) - Counts: - Total deals vs Rivally in window = 20 (UNVERIFIED) - Wins = 13 (UNVERIFIED) - Losses = 7 (UNVERIFIED) - Arithmetic: - Wins = 13 - Losses = 7 - Total = 13 + 7 = 20 (UNVERIFIED: no snippet_id in deals_with_competitor.csv) Month breakdown (wins, losses, total) (UNVERIFIED: no snippet_id in deals_with_competitor.csv) - 2025-09: 1 win, 1 loss, total 2 - 2025-10: 2 wins, 0 losses, total 2 - 2025-11: 1 win, 1 loss, total 2 - 2025-12: 1 win, 1 loss, total 2 - 2026-01: 2 wins, 0 losses, total 2 - 2026-02: 2 wins, 0 losses, total 2 - 2026-03: 1 win, 1 loss, total 2 - 2026-04: 0 wins, 2 losses, total 2 - 2026-05: 0 wins, 1 loss, total 1 - 2026-06: 1 win, 0 losses, total 1 - 2026-07: 1 win, 0 losses, total 1 - 2026-08: 1 win, 0 losses, total 1 Old card items that are now UNVERIFIED (cannot be re-sourced from snippets) or contradicted - “Rivally lacks a Slack integration.” → Contradicted by a review saying Slack integration worked out of the box. Mark old claim UNVERIFIED/incorrect. (S04) - “Rivally was acquired by WorkHuman in 2025.” → No supporting snippet. UNVERIFIED. (no snippet_id available) - “Pricing starts at $5 per user/month…” → Was true as of earlier pricing pages, but pricing page now shows $7; update required. (S03, S08, S17) - “Strong in EU enterprise with multi-language support.” → Verified by EU enterprise review praising multi-language support. (S12) - “Positioning: points-based recognition for mid-market.” → Points-based recognition feed is supported; “mid-market” supported by a mid-market reviewer context. (S02, S04)
Per-sequence metrics (using step 1 sent as the sequence “sent” denominator): New Logo Nurture - Sent: 500 - Open rate: (210+160+120)/500 = 490/500 = 98.0% - Reply rate: (42+30+18)/500 = 90/500 = 18.0% - Meeting rate: (12+9+6)/500 = 27/500 = 5.4% - Weakest step (reply/sent): step 3 = 18/428 = 4.21% Expansion Nurture - Sent: 300 - Open rate: (130+340+95)/300 = 565/300 = 188.3% (invalid; see tracking errors) - Reply rate: (22+25+12)/300 = 59/300 = 19.67% - Meeting rate: (5+4+3)/300 = 12/300 = 4.0% - Weakest step (reply/sent): step 3 = 12/275 = 4.36% Cold Outbound - HR Leaders - Sent: 600 - Open rate: (240+175+130)/600 = 545/600 = 90.83% - Reply rate: (5+2+1)/600 = 8/600 = 1.33% - Meeting rate: (0+0+0)/600 = 0/600 = 0.0% - Weakest step (reply/sent): step 3 = 1/590 = 0.17% Cold Outbound - People Ops - Sent: 400 - Open rate: (150+110+80)/400 = 340/400 = 85.0% - Reply rate: (14+9+6)/400 = 29/400 = 7.25% - Meeting rate: (3+2+1)/400 = 6/400 = 1.5% - Weakest step (reply/sent): step 3 = 6/377 = 1.59% Tracking errors (opened > sent): - Expansion Nurture step 2: opened 340 > sent 300 (also drives the 188.3% “open rate” above 100%) Audience overlap between sequences (same contact_key in multiple sequences): - Cold Outbound - HR Leaders AND Cold Outbound - People Ops (11): CT-000849, CT-000884, CT-000890, CT-001103, CT-001105, CT-001130, CT-001153, CT-001217, CT-001255, CT-001258, CT-001345 - Expansion Nurture AND New Logo Nurture (2): CT-000301, CT-000624 Failure mode for <2% reply: - Cold Outbound - HR Leaders: high opens (545/600) but very low replies (8/600) and 0 meetings → the issue is post-open (message/offer/CTA mismatch), not getting seen. One change per weak sequence + priority: 1) Expansion Nurture (data integrity): fix step 2 open tracking (opened must not exceed sent; ensure unique-open logic). 2) Cold Outbound - HR Leaders (performance): change step 1 CTA to a single low-friction yes/no question to drive replies. 3) Cold Outbound - People Ops (step 3 weak at 1.59%): replace step 3 with a new angle/offer (current step 3 underperforms prior steps).
Weekly marketing goals update — Q3-2026 (days elapsed: 66 of 92; pace factor = 66/92 = 0.71739) SQMs - QTD actual: 230 - Target: 300 - Delta: 230 − 300 = −70 - Pace: ON (expected QTD = 300 × (66/92) = 300 × 0.71739 = 215.22; actual 230 ≥ 215.22) SQOs - QTD actual: 84 - Target: 120 - Delta: 84 − 120 = −36 - Pace: BEHIND (expected QTD = 120 × (66/92) = 120 × 0.71739 = 86.09; actual 84 < 86.09) DS2s - QTD actual: 40 - Target: 75 - Delta: 40 − 75 = −35 - Pace: BEHIND (expected QTD = 75 × (66/92) = 75 × 0.71739 = 53.80; actual 40 < 53.80) closed-lost MIA rate - QTD actual: 0.20 (closed_lost_mia_rate = closed_lost_mia / closed_lost_total = 5 / 25 = 0.20) - Target: 0.10 - Delta: 0.20 − 0.10 = +0.10 - Pace: BEHIND (lower is better; actual 0.20 > target 0.10) same_quarter_closes - QTD actual: 10 - Target: 20 - Delta: 10 − 20 = −10 - Pace: BEHIND (expected QTD = 20 × (66/92) = 20 × 0.71739 = 14.35; actual 10 < 14.35) active pipeline coverage against target - QTD actual: 3,000,000 - Target: 4,000,000 - Delta: 3,000,000 − 4,000,000 = −1,000,000 - Coverage: 3,000,000 / 4,000,000 = 0.75 (75%) - Pace: ON (expected QTD = 4,000,000 × (66/92) = 4,000,000 × 0.71739 = 2,869,565.22; actual 3,000,000 ≥ 2,869,565.22) What moved this week - Not determinable from the provided data: marketing_qtd.csv is a single QTD snapshot with no prior-week QTD values or weekly deltas, so I can’t quantify week-over-week movement. From the current snapshot only: SQMs and active_pipeline are on pace versus time elapsed, while SQOs, DS2s, and same_quarter_closes are behind pace; the closed-lost MIA rate is 0.20 (5/25), above the 0.10 target.
Decision: plan Q3 on weighted forecast $115,976.75 (COMMIT $44,729 + 35% x BEST_CASE $203,565 = $71,247.75). Scope: 54/86 deals close in-quarter (COMMIT 7, BEST_CASE 24, PIPELINE 23 at 0); 32 deals worth $227,575 are excluded for close dates after 2026-09-30, incl COMMIT Deal-D348E1 $13,770 (2026-10-15). Caveat: why-buys is empty on 71/86 deals, including all 7 COMMIT in-quarter, so the COMMIT number lacks documented rationale.
Subject: Next steps on the 150-seat pricing? Hi there — circling back on Deal-0D2F7A. On Aug 5, I emailed a recap of the July 28 demo along with pricing for 150 seats, and I haven’t heard back yet. Could we book a quick 15-minute check-in to confirm whether you want to move forward and what the next step is on your side? If yes, please reply with a couple of times that work this week. Thanks, Alex Franklin
Marketing: We generated 46 SQMs vs a 52 SQM target (46/52 = 88.46% of goal; shortfall = 52 − 46 = 6). Webinars contributed 18 of 46 SQMs (18/46 = 39.13%), and paid search held at $150 cost per SQM. Sales: We converted 14 SQOs and set 9 DS2 meetings (9/14 = 64.29% DS2s per SQO), created $310,000 in new pipeline, and logged 3 same-quarter closes. CS: We saved 2 renewals, team NPS moved to 61, and we’re carrying 3 open red-flag accounts into next week. PLG: We added 412 new signups with 31% activation (412 × 0.31 = 127.72 activated; extract doesn’t specify rounding rules), and 38 companies hit the “aha” moment of 10 recognition gives.
Partner digest — period 2026-08-24 to 2026-09-04 (from partner_slack.md export) Apex Rewards Co (active): Co-webinar locked for 09-15; 2 sourced opps (Slack: both in DS1; UTM Source = Partner). Partner-sourced pipeline (from partner_deals.csv): 2 deals, $275,000. Arithmetic: $180,000 (Deal-DDAAF2) + $95,000 (Deal-2CF33E) = $275,000. HRCloud Partners (active): Integration referral cleared security review; opp moved to DS2 (Slack: one sourced opp this period). Partner-sourced pipeline (from partner_deals.csv): 1 deal, $140,000. Arithmetic: $140,000 (Deal-F1CDA5) = $140,000. CultureBridge (active): Lunch-and-learn produced 2 sourced opps (Slack: both early stage). Partner-sourced pipeline (from partner_deals.csv): 2 deals, $135,000. Arithmetic: $60,000 (Deal-096E1D) + $75,000 (Deal-067213) = $135,000. WorkWell Group (active): No sourced deals this period; planning call booked for 09-09 (Slack). Partner-sourced pipeline (from partner_deals.csv): 0 deals, $0. Recogniq (quiet): Partner-sourced pipeline (from partner_deals.csv): 0 deals, $0. KudosWave (quiet): Partner-sourced pipeline (from partner_deals.csv): 0 deals, $0. PeopleFirst Advisors (quiet): Partner-sourced pipeline (from partner_deals.csv): 0 deals, $0. TotalPerk (quiet): Partner-sourced pipeline (from partner_deals.csv): 0 deals, $0.
Q1: Is customer data encrypted at rest? If so, how? Yes. Customer data is encrypted at rest using AES-256. (Excerpt: [P1]) Q2: Is data encrypted in transit? Yes. Data in transit is encrypted with TLS 1.2 or higher. (Excerpt: [P1]) Q3: Do you hold a SOC 2 report, and can we obtain a copy? Yes. Bonusly maintains a SOC 2 Type II report (renewed annually) and makes it available to prospects under NDA. (Excerpt: [P2]) Q4: How long is customer data retained after contract termination? Customer data is retained for the duration of the contract plus 90 days, then deleted from production systems. Post-termination retention arithmetic: 0 days after contract end + 90 days = 90 days after contract termination. (Excerpt: [P3]) Q5: Where is your subprocessor list published and how are changes notified? The subprocessor list is maintained at trust.bonusly.com. Customers receive 30 days notice before a new subprocessor is added. (Excerpt: [P4]) Q6: Do you support SAML single sign-on? Yes. SAML 2.0 SSO is available on the Enterprise plan. (Excerpt: [P5]) Q7: What is your production backup schedule and retention? Production databases are backed up daily. Backups are encrypted and retained for 35 days. (Excerpt: [P6]) Q8: Do you hold an ISO 27001 certification? Unanswerable from the provided excerpts; ISO 27001 is not addressed in [P1]-[P8]. The document that would answer this is an ISO 27001 certificate (and/or an ISO scope statement) or a trust portal compliance page explicitly stating ISO 27001 certification. (Excerpts reviewed: [P1]-[P8]) Q9: What is your contractual uptime SLA percentage? Unanswerable from the provided excerpts; uptime SLA is not addressed in [P1]-[P8]. The document that would answer this is your Master Subscription Agreement and/or the Service Level Agreement section specifying uptime percentage. (Excerpts reviewed: [P1]-[P8]) Q10: Will you sign a HIPAA Business Associate Agreement? Unanswerable from the provided excerpts; HIPAA/BAA is not addressed in [P1]-[P8]. The document that would answer this is a HIPAA/BAA policy statement and/or a standard BAA legal addendum for review. (Excerpts reviewed: [P1]-[P8])
FINDINGS F01 — CRITICAL — MERGE ALWAYS-trigger overlap/duplication: comms-drafter vs email-drafter. Evidence: both descriptions explicitly trigger on “write me an email”, “draft a follow-up”, “help me reply”, “review/rewrite this”, “what should I say”, “bump email”, “contract nudge”, and broadly “any customer/prospect-facing email”. Proposal: merge into a single skill (either keep comms-drafter as umbrella and absorb email-drafter, or vice versa) to eliminate double-routing on the same user prompts. F02 — CRITICAL — TRIM_DESC ALWAYS-trigger overlap/duplication: pipeline-intelligence-report vs weekly-pipeline-report. Evidence: pipeline-intelligence-report triggers on “run the pipeline report”, “pipeline update”, “what’s the pipeline look like”; weekly-pipeline-report triggers on “run the pipeline update”, “do the pipeline report”, “update the pipeline”, “what does pipeline look like”, “give me this week’s numbers”. Proposal: trim weekly-pipeline-report’s trigger phrases to only unambiguous “weekly pipeline performance update / weekly pipeline report” language, and remove the generic “pipeline report / pipeline update / what does pipeline look like” phrasing that duplicates pipeline-intelligence-report. F03 — WARNING — REVIEW Possible circular routing chain (cross-skill handoff loop): deal-strategy-coach ↔ email-drafter. Evidence: - deal-strategy-coach: “When producing manager emails… use the email-drafter skill…” - email-drafter: “If the user needs strategic deal coaching… use deal-strategy-coach instead.” Proposal: review and add a single explicit “combined case” routing rule (strategy + draft) so an orchestrator doesn’t bounce indefinitely between the two. F04 — WARNING — REVIEW Dangling delegation/skill dependencies referenced but not present in the provided manifest/skill set: bonusly-brand. Evidence: comms-drafter and email-drafter both instruct “apply the bonusly-brand skill”; deal-strategy-coach also references bonusly-brand. Proposal: review whether bonusly-brand exists outside this provided set; if not, add it to the manifest/skill set or remove/soften the hard dependency in bodies. F05 — WARNING — REVIEW Dangling delegation/skill dependencies referenced but not present in the provided manifest/skill set: prospect-research-multithreading. Evidence: comms-drafter (“invoke prospect-research-multithreading first”), email-drafter (“invoke prospect-research-multithreading… first”), deal-strategy-coach (“Invoke prospect-research-multithreading whenever…”). Proposal: review whether prospect-research-multithreading exists elsewhere; if not, add it or adjust bodies to an alternative workflow. F06 — WARNING — REVIEW Dangling delegation targets referenced by analysis-validator but not present in the provided manifest/skill set: bonusly-data-questions, bonusly-product-questions, bonusly-business-reporting-questions, bonusly-rewards-questions, bonusly-ppp-questions, bonusly-feature-flag-questions, bonusly-deal-desk-questions, bonusly-datadog-questions. Evidence: analysis-validator §12.4 “Specialist Skill Reference for Validation” lists these as delegation targets. Proposal: review whether these skills exist in another registry; if not, add them or replace the delegation table with non-skill references. F07 — WARNING — REVIEW Dangling org-skill/file dependencies referenced but not present in the provided manifest/skill set: signalforge-reports (and linked files under /mnt/skills/organization/signalforge-reports/…). Evidence: pipeline-intelligence-report Phase 5 “MANDATORY PRE-BUILD STEPS” and weekly-pipeline-report Step 4 both require reading those paths. Proposal: review whether those org skills/files exist in the runtime; if not, either add them to the managed skill set or make the dependency optional with a fallback. F08 — INFO — REVIEW Version conflict check: none detected in provided data. Evidence: manifest has one row per declared_name and each provided SKILL.md frontmatter name matches its file’s declared_name; no duplicate skill names or parallel versions provided. Proposal: no action beyond routine review. F09 — INFO — REVIEW Manifest description length threshold (>1,024 chars): 0. Arithmetic: 14 manifest rows total. Count(description_chars > 1024) = 0. So 0/14 exceed 1,024. Proposal: no action. F10 — INFO — REVIEW Manifest drift (both directions): none detected within the provided set. Arithmetic: - Provided skill files listed in prompt: 14 - Manifest rows: 14 - Files with no manifest row = 14 − 14 = 0 - Manifest rows with no file = 14 − 14 = 0 Proposal: no action. F11 — WARNING — REVIEW Hardcoded page IDs / workspace IDs / user IDs / dates / person names: partner-digest. Evidence includes: - Confluence IDs: cloudId 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f; spaceId 1958248479; folderId 2286616609; canonical page link with id 2286321666. - Slack user mention: from:<@U03QLMBL7AR> - Person name: Amani Phipps. - Multiple hardcoded dates in examples (May 19, 2026; June 2, 2026; May 16, 2026). Proposal: review whether these identifiers are intended constants; if not, parameterize them (e.g., config variables) to avoid brittleness. F12 — WARNING — REVIEW Hardcoded page IDs / dates / person names: signalforge-feedback. Evidence includes: - Confluence page IDs: 2295136266; spaceId 2232811524; cloudId 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f; parent 2234417154; build log page 2247295002. Proposal: review and parameterize IDs if this is meant to run in multiple environments/spaces. F13 — WARNING — REVIEW Hardcoded person names / owner IDs / dates: analysis-validator. Evidence includes: - Person names: Manish, Amani, Alaina Loori, Shealagh Coughlin, Ben Castelli, multiple AE/CSM/RevOps names (e.g., Dana Mercer, Gavin Porter, etc.). - Hardcoded dates: Created April 26, 2026; Last Updated May 9, 2026; numerous “as of May 2026” references. - Hardcoded IDs: stage IDs table; multiple HubSpot owner IDs. Proposal: review whether roster + IDs should be dynamically resolved (to avoid staleness) vs intentionally frozen as a “known-good mapping” artifact. F14 — WARNING — REVIEW Hardcoded page URL, pricing year, names/IDs, and dated constants: deal-strategy-coach. Evidence includes: - Confluence page URL: AE Excellence Playbook link. - Pricing section labeled “Pricing — 2026” with hardcoded price table values. - Multiple stage probability constants and other hardcoded reference data. Proposal: review which constants should be centrally sourced (single source of truth) to prevent drift when pricing/roster/stages change. F15 — WARNING — REVIEW Hardcoded owner IDs and names: pipeline-intelligence-report. Evidence includes: - “AE owner IDs (verified May 2026)” list with specific IDs. - HubSpot org ID 1973303 in URL patterns. Proposal: review whether owner resolution should be dynamic (like stale-pipeline-report’s explicit rule) or whether this is a deliberate fixed roster. F16 — WARNING — REVIEW Hardcoded dates and performance numbers: weekly-pipeline-report. Evidence includes: - Person name in title: “Ben Lavin”. - Hardcoded spreadsheet IDs: 1CLZeOsElVDF_LF0ZG_t2nfwvhnZ6bpwqM_nX3WEYzcw and 1ENuaEcCuLjdKhMvp8FK3Ys1ek5Aw9ZuOZhsHJJFoB_k. - Hardcoded quarter window text: “Q2 (April 1 – June 30, 2026; total ≈ 64–65)”. - Hardcoded Q1 2026 context numbers (Sales Bookings Actual $365,152 vs $475,000; Pipeline Addition Actual $2,490,532 vs $3,288,000). Proposal: review and parameterize quarter/date assumptions and move the static Q1 context figures out of the skill body (or explicitly label them as historical-only and non-operative). F17 — WARNING — REVIEW Hardcoded Confluence IDs and Q2 framing: sales-forecast. Evidence includes: - Confluence IDs: cloudId 73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f; spaceId 2232811524; parent page ID 2232582148. - Changelog references “Q2-specific” and multiple hardcoded date references (e.g., “Q3 2026 Forecast Intelligence — July 9, 2026” example). - Hardcoded Q1 2026 context numbers embedded in Step 2B. Proposal: review and ensure all quarter/date logic is computed at runtime and historical stats are not treated as live baselines.
RUNBOOK — #incident-2026-08-29-reward-queue (resolved) Source: incident_thread.md messages [M01]–[M10]. Every step below traces to at least one message ID. 1) Acknowledge alert + assign Incident Commander (IC) - Trace: [M01] - Who ran it: Bryce Harmon - Exact action taken: “PagerDuty alert fired for reward-worker queue depth > 10k. Acknowledging, taking IC.” - Success verification: Not explicitly stated in-thread (needs confirmation). - Rollback (state change?): N/A (no rollback mentioned). 2) Measure current reward-worker queue depth - Trace: [M02] - Who ran it: Farid Osman - Exact command: `bundle exec rake sidekiq:queue_depth` - Output/observation recorded: reward queue = 48,213 pending jobs; normal is under 500. - Success verification: Command produced a numeric queue depth (48,213) [M02]. - Arithmetic shown: - Pending jobs = 48,213. - “Normal under 500” is a threshold only; exact normal value not provided, so difference vs normal cannot be computed precisely. 3) Check Sidekiq dead set and characterize failures - Trace: [M03] - Who ran it: Farid Osman - Exact action taken: “Dead set has 112 jobs, all Redis::TimeoutError from around 13:58.” - Success verification: Not explicitly stated how this was queried (needs confirmation of exact command/UI used). - Arithmetic shown: - Dead set jobs = 112. 4) Stop new enqueueing (feature flag disable) to “stop the bleed” (STATE CHANGE) - Trace: [M04] - Who ran it: Farid Osman - Exact command: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` - Success verification: Not explicitly verified at the time of disable (needs confirmation). Later resolution steps include queue draining and stable processing, but no direct “flag is disabled” check is shown. - Rollback (as stated in-thread): `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` [M04] 5) Clear Sidekiq dead set (STATE CHANGE) - Trace: [M05] - Who ran it: Elena Sinclair - Exact action taken: “While I was in the console I cleared out the dead set.” - Success verification: Not explicitly stated in-thread (needs confirmation). - Rollback: Not provided in-thread (needs confirmation). 6) Scale up reward-worker deployment from 3 to 6 replicas (STATE CHANGE) - Trace: [M06] - Who ran it: Bryce Harmon - Exact command: `kubectl scale deployment/reward-worker --replicas=6` (was 3) - Success verification: Subsequent queue depth update shows the queue falling [M07]. - Rollback (as stated in-thread): `kubectl scale deployment/reward-worker --replicas=3` [M06] 7) Monitor queue depth trend during drain - Trace: [M07] - Who ran it: Farid Osman - Exact action taken: “Queue depth down to 9,400 and falling ~1,200/min.” - Success verification: Implied by observed queue depth and rate [M07]; exact measurement command not repeated here (needs confirmation whether `bundle exec rake sidekiq:queue_depth` was re-run). - Arithmetic shown: - Queue depth reduced from 48,213 [M02] to 9,400 [M07]. - Reduction = 48,213 − 9,400 = 38,813 jobs. - Drain rate observed (given): ~1,200 jobs/min (approximate; not computed in-thread). 8) Verify queue depth is fully drained and overall error rate is back to baseline - Trace: [M08] - Who ran it: Cole Ingram - Exact command: `bundle exec rake sidekiq:queue_depth` - Output/observation recorded: returns 0. - Additional verification: “Error rate in Datadog back to baseline.” - Success verification: queue_depth=0 + Datadog error rate baseline [M08]. - Arithmetic shown: - Queue depth = 0. 9) Re-enable enqueueing (feature flag enable) (STATE CHANGE) - Trace: [M09] - Who ran it: Bryce Harmon - Exact command: `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` - Success verification (as stated in-thread): “Verified 40 new jobs processed cleanly in the next 3 minutes.” - Arithmetic shown: - Jobs processed = 40 over 3 minutes. - Processing rate = 40 ÷ 3 = 13.333… jobs/min (derived from stated counts/timing). - Rollback: - Not explicitly labeled as rollback in-thread for this re-enable step (needs confirmation). - The corresponding disable command does appear earlier: `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` [M04] (needs confirmation this is the intended rollback for re-enable). 10) Scale reward-worker deployment back down to 3 replicas and confirm stability (STATE CHANGE) - Trace: [M10] - Who ran it: Bryce Harmon - Exact command: `kubectl scale deployment/reward-worker --replicas=3` - Success verification (as stated in-thread): “Queue stable at 0. Incident resolved.” - Arithmetic shown: - Queue depth referenced as stable at 0 (no new numeric command output shown in [M10]; last explicit command output was 0 in [M08]). - Rollback: - Not explicitly stated in-thread for this scale-down step (needs confirmation). - A prior scale-up command exists: `kubectl scale deployment/reward-worker --replicas=6` [M06] (needs confirmation this would be used as rollback if scale-down caused issues).
First error (earliest ERROR + timestamp) - 2026-09-03T14:01:12Z — service=reward-service — ERROR Message: “Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s” Service involved: reward-service Job involved: not named on this line (job name appears in the next error) Cascade (in order, from the slice) 1) 2026-09-03T14:01:12Z — reward-service Redis connection timeout to redis-primary:6379 after 5s. 2) 2026-09-03T14:01:20Z — reward-service “Redis::TimeoutError: retry exhausted for RewardGiveJob” Job involved: RewardGiveJob 3) 2026-09-03T14:01:30Z — reward-service retry exhausted for RewardGiveJob (repeats) 4) 2026-09-03T14:01:40Z — reward-service retry exhausted for RewardGiveJob (repeats) 5) 2026-09-03T14:01:40Z — sidekiq “RewardGiveJob failed: Redis::TimeoutError; retrying in 60s” Service involved: sidekiq Job involved: RewardGiveJob 6) 2026-09-03T14:02:28Z — sidekiq “RewardGiveJob failed: Redis::TimeoutError; retrying” (continues) 7) 2026-09-03T14:02:30Z — sidekiq WARN “Queue reward depth above 10,000” (backlog signal) 8) 2026-09-03T14:03:05Z — api-gateway ERROR “502 upstream timeout calling reward-service /gives” Downstream service implicated: reward-service endpoint /gives Arithmetic from first Redis error to first 502: - 14:03:05 − 14:01:12 = 1 minute 53 seconds 9) 2026-09-03T14:03:30Z — web-app ERROR “Give form submission failed: upstream 502 from api-gateway” User-facing symptom surfaces in web-app. 10) 2026-09-03T14:03:31Z onward — sidekiq/api-gateway/web-app Repeating pattern: - sidekiq: RewardGiveJob failed; retrying - api-gateway: 502 upstream timeout calling reward-service - web-app: give submission failed due to upstream 502 Recovery signals - 2026-09-03T14:22:10Z — reward-service — INFO “Redis connection restored; resuming job processing” Arithmetic from first Redis error to restore: - 14:22:10 − 14:01:12 = 20 minutes 58 seconds - 2026-09-03T14:24:45Z — sidekiq — INFO “Queue reward depth below 500” Arithmetic from first Redis error to queue <500: - 14:24:45 − 14:01:12 = 23 minutes 33 seconds Datadog query to confirm the first error - service:reward-service level:ERROR "Redis::TimeoutError: Connection to Redis" "redis-primary:6379" What the logs do not show (explicitly missing from provided data) - No Redis service logs (so no direct evidence of Redis CPU/memory/latency, failover, or restarts). - No root cause for the Redis timeout (network vs Redis overload vs DNS vs connection pool exhaustion is not shown). - No explicit job_id linkage in datadog_logs.csv tying a specific failure line to sidekiq_jobs.csv job_ids (e.g., J-00005, etc.). - No counts/volumes: how many requests failed, how many jobs retried total, or exact queue depth values (only “above 10,000” and “below 500” thresholds). - No latency metrics or durations for reward-service requests besides the Redis timeout “after 5s”. - No confirmation of when the first Sidekiq job actually started failing relative to the first Redis timeout beyond the timestamps shown (and no worker host/container identifiers). - No customer/company/deal context (none present in these files).
recognition_streaks_v2 - Controls (per code): when enabled, calls `StreakTracker.record(give)` in `app/models/recognition.rb` (records recognition streak activity for a “give”). - State: on - Targeting rules: segment:beta_companies - Targets on (from export): beta_companies segment - Company count (must match export): 42 (given in export; arithmetic: 42 companies) points_budget_guardrails - Controls (per code): when enabled, runs `BudgetService.new(company).enforce!(giver, points)` in `app/services/budget_service.rb` (enforces points budget guardrails during giving). - State: on - Targeting rules: all_companies - Targets on (from export): all companies - Company count (must match export): 220 (given in export; arithmetic: 220 companies) slack_dm_nudges - Controls (per code): when enabled, `SlackDm.send_nudge(user)` runs in `app/jobs/nudge_job.rb` (sends Slack DM nudges); job returns early unless enabled. - State: on - Targeting rules: segment:region_na - Targets on (from export): region_na segment - Company count (must match export): 87 (given in export; arithmetic: 87 companies) redeem_flow_redesign - Controls (per code): in `app/controllers/redeem_controller.rb`, when enabled renders `RedeemV2Component`; when not enabled renders `RedeemV1Component`. - State: off - Targeting rules: targeted_list - Targets (from export): targeted_list exists, but flag is off - Company count (must match export): 12 (given in export; arithmetic: 12 companies in the targeted list) analytics_dashboard_v3 - Controls (per code): when enabled, sets `@dashboard = AnalyticsV3.new(company)` in `app/controllers/analytics_controller.rb` (enables Analytics V3 dashboard object). - State: on - Targeting rules: segment:tier_three - Targets on (from export): tier_three segment - Company count (must match export): 65 (given in export; arithmetic: 65 companies) ms_teams_app_v2 - Controls (per code): when enabled, runs `TeamsAppV2.install(company)` in `app/services/teams_installer.rb` (installs Teams App V2). - State: off - Targeting rules: targeted_list - Targets (from export): targeted_list exists, but flag is off - Company count (must match export): 9 (given in export; arithmetic: 9 companies in the targeted list) legacy_give_modal - Controls (per code excerpt): no code reference found in the provided `flag_code.md` excerpt. - State: off - Targeting rules: segment:legacy_plan - Targets (from export): legacy_plan segment - Company count (must match export): 14 (given in export; arithmetic: 14 companies) - Note: “no code reference” (in the provided excerpt) survey_boosters_q3 - Controls (per code excerpt): no code reference found in the provided `flag_code.md` excerpt. - State: on - Targeting rules: segment:legacy_plan - Targets on (from export): legacy_plan segment - Company count (must match export): 7 (given in export; arithmetic: 7 companies) - Note: “no code reference” (in the provided excerpt) paused_offboard_cleanup - Controls (per code excerpt): no code reference found in the provided `flag_code.md` excerpt. - State: off - Targeting rules: (blank / none provided) - Targets: none (company_count is 0) - Company count (must match export): 0 (given in export; arithmetic: 0 companies) - Note: both “no code reference” (in the provided excerpt) and “no targets” (0 companies; no targeting_rules)
NDA-1 — GREEN (standard approval) Driving clause: “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.” + “Governing law: the laws of the State of Delaware, USA.” Reasoning (one line): Mutual NDA with explicit standard carve-outs, standard Delaware governing law, and no non-solicit/non-compete/exclusivity language (“No license, no obligation to proceed, no exclusivity.”). NDA-2 — YELLOW (counsel review) Driving clause: “Non-solicitation: ‘During the term of this Agreement and for eighteen (18) months thereafter, neither party shall solicit for employment or hire any employee of the other party with whom it came into contact under this Agreement.’” Reasoning (one line): Embedded employee non-solicit/hire restriction extending 18 months post-term (18/12 = 1.5 years) is a material non-confidentiality obligation that typically needs counsel review for scope (e.g., “came into contact”) and enforceability. NDA-3 — RED (full legal review) Driving clause: “Non-compete: ‘For a period of three (3) years following the Effective Date, Recipient shall not, directly or indirectly, engage in or provide services to any business that competes with Discloser’s business.’” + “No confidentiality carve-outs are stated in this Agreement.” + “Governing law: ‘…laws of the Republic of Ireland… exclusive jurisdiction…’” Reasoning (one line): One-way NDA in favor of [PARTY C] with a 3-year non-compete (3 years), no confidentiality carve-outs at all, and Ireland governing law with exclusive jurisdiction is high-risk/non-standard and requires full legal review.