Mean 0.931 · 30/40 perfect tests · $4.83 total · each card: the question → the correct answer (gold) → this model's actual answer
Definitions - DS2+ deals: deals whose current stage is DS2, DS3, DS4, or DS5. - Why-buys compliant: why_buys is present and substantive (either LONG(n) or a non-placeholder string ≥15 characters). Missing/blank or placeholder (e.g., tbd, n/a, see notes) is non-compliant. - DS1 timestamp missing: t_ds1 is null or blank. - Regressed: for a given deal, any later-stage timestamp (t_ds2–t_ds5) is dated earlier than an earlier-stage timestamp (t_ds1–t_ds4). Why-buys hygiene (DS2+ only) Arithmetic: - Total DS2+ deals = 124 - Non-compliant on why-buys = 101 - Percent non-compliant = 101 / 124 * 100 = 81.45% - Overall percent of DS2+ deals non-compliant on why-buys: - 81.45% By owner (DS2+ only) Percentages are non_compliant / total_DS2_plus * 100. - Dana Mercer (owner_id 83155923) - total_DS2_plus = 22 - non_compliant = 18 - percent_non_compliant = 18 / 22 * 100 = 81.82% - Cole Ingram (owner_id 83155924) - total_DS2_plus = 22 - non_compliant = 19 - percent_non_compliant = 19 / 22 * 100 = 86.36% - Alex Franklin (owner_id 84342457) - total_DS2_plus = 61 - non_compliant = 48 - percent_non_compliant = 48 / 61 * 100 = 78.69% - Bryce Harmon (owner_id 119337721) - total_DS2_plus = 18 - non_compliant = 15 - percent_non_compliant = 15 / 18 * 100 = 83.33% - Farid Osman (owner_id 716654662) - total_DS2_plus = 1 - non_compliant = 1 - percent_non_compliant = 1 / 1 * 100 = 100.00% DS1 timestamp hygiene Arithmetic: - Deals with missing t_ds1 = 0 - Count of deals with no DS1 timestamp: 0 Stage regression hygiene Logic applied: - For each deal, collect all non-null stage timestamps (t_ds1–t_ds5). - If any later stage’s date is earlier than a prior stage’s date, mark as regressed. Arithmetic: - Deals flagged as regressed = 0 - Count of deals that regressed: 0 Three process fixes 1) Enforce why-buys at stage change: - Make why_buys a required, non-placeholder field on any transition into DS2 or later (DS2–DS5) with a minimum-character rule (e.g., ≥15 chars) and explicit disallow list for placeholders (tbd, n/a, see notes). 2) In-line manager review of DS2+ hygiene: - Add a weekly pipeline hygiene review where managers pull a DS2+ view filtered for missing/non-compliant why-buys and send back specific deals (by deal_alias) to reps to fix before forecast meetings. 3) Embedded guidance in the CRM field: - Add helper text and a short in-field checklist in the why_buys description (e.g., “Must cover problem, impact, success metric; no ‘tbd’ or ‘see notes’”) and use a template/snippet so reps can quickly enter substantive why-buys instead of skipping the field.
Number of deals resolved to an owner name - 156 deals resolved - Arithmetic: TOTAL_DEALS 156 from file; RESOLVED_DEALS 156; UNMATCHED_OWNER_IDS []. Deals whose owner_id has no match in the owners table - None - UNMATCHED_OWNER_IDS [] (empty set) Owner_ids that map to archived/deactivated owners - None in this dataset - ARCHIVED_OWNER_IDS [] (no resolved deals tied to owner_id 1520255671 or 77260721) Total pipeline amount per resolved owner (owner_name → sum of amount) - Bryce Harmon: 1,054,144 - Dana Mercer: 341,195 - Alex Franklin: 624,310 - Cole Ingram: 288,161.43 - Farid Osman: 4,134 - Elena Sinclair: 2,100 Arithmetic notes (per owner, all from exact CSV sums) - Each OWNER_TOTAL is the sum of Decimal(amount) over all deals where deals_open.owner_id matches owners.owner_id and owners.owner_name is that owner.
a) Orphaned Gong rows (hs_deal_id not in deals_open): - Count: 30 - Sample deal_alias values (all from the data): Deal-8FA85D, Deal-8FC3F9, Deal-3B7945, Deal-42B265, Deal-9CCC42 b) Duplicate conversation keys (calls_90d > distinct_conversation_keys): - Count of rows with calls_90d > distinct_conversation_keys: 0 c) DS3+ open deals with at least one logged call: - Open deals at stage DS3, DS4, or DS5: 85 - Of those, deals that appear in gong_calls_by_deal_90d (i.e., have ≥1 call): 25 - Arithmetic: 25 / 85 = 0.294117647... ≈ 29.4% - So, about 29.4% of DS3+ open deals have at least one logged call in the last 90 days.
```sql
SELECT
c.COMPANY_ID,
c.M1_USERS AS unique_givers,
c.M1_GIVES AS recognition_count,
c.M1_REDEMPTIONS AS successful_redemption_count
FROM
-- One row per self-serve customer company; M1_* fields are defined as metrics for the first calendar month as a customer (cohort month 1), including gives and redemptions. Avoids stale/unpopulated HubSpot tables and uses the canonical PLG cohort view.
PRODUCTION.PLG.COMPANY_COHORT_SUMMARY AS c;
```
Deals (owner, stage, amount, close date, why-buys)
- No deals file was provided in the data you shared.
- Because there are 0 deal rows, I cannot:
- compute completeness per field (owner, stage, amount, close date, why-buys), or
- identify which fixes have the most pipeline amount at stake.
- Treat deal completeness and pipeline-weighted prioritization as “unknown / not computable” until the deals extract is available.
--------------------------------------------------
Companies – completeness and enrichment
Total companies: 34
Field completeness (non-blank values)
- industry: 34/34 = 100.0% complete
- Arithmetic: 34 ÷ 34 × 100 = 100.0%
- employee_count: 25/34 = 73.5% complete
- Arithmetic: 25 ÷ 34 ≈ 0.735 → 73.5%
- hq_country: 28/34 = 82.4% complete
- Arithmetic: 28 ÷ 34 ≈ 0.8235 → 82.4%
So:
- 9/34 companies are missing employee_count.
- 6/34 companies are missing hq_country.
- industry is fully populated but not standardized (e.g., “tech”, “Tech ”, “Technology”).
Duplicate company clusters (shared domain) and survivors
Clusters by shared domain:
1) Domain acme-corp.com
- Aliases: C-0A092931, C-0A092932
- Records:
- C-0A092931: domain=acme-corp.com, industry=Technology, employee_count=500, hq_country=US
- C-0A092932: domain=acme-corp.com, industry=tech, employee_count=510, hq_country=USA
- Survivor (recommended master): C-0A092931
- Rationale within this dataset: both have industry, employee_count, hq_country populated (3/3 core fields); picking C-0A092931 as the canonical alias and treating C-0A092932 as a duplicate avoids inventing a blended record.
2) Domain globex.io
- Aliases: C-0A092933, C-0A092934
- Records:
- C-0A092933: domain=globex.io, industry=SaaS, employee_count=200, hq_country=US
- C-0A092934: domain=globex.io, industry=Technology, employee_count=200, hq_country=US
- Survivor (recommended master): C-0A092933
- Rationale: both have industry, employee_count, hq_country populated; choosing C-0A092933 as survivor and treating C-0A092934 as duplicate keeps one alias per domain.
(There are no other domains with multiple company_alias rows.)
Missing company fields that can be filled from zoominfo_enrichment.csv
Rule applied: fill only when:
- company.domain exactly matches zoominfo_enrichment.domain, AND
- CRM value is blank, AND
- enrichment value is non-blank.
These meet that rule:
1) C-EC3025 (ec3025.com)
- Missing: employee_count (blank in CRM)
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
2) C-96039F (96039f.com)
- Missing: employee_count
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
3) C-44EA29 (44ea29.com)
- Missing: employee_count
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
4) C-D04904 (d04904.com)
- Missing: employee_count
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
5) C-B23205 (b23205.com)
- Missing: employee_count
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
6) C-60C75F (60c75f.com)
- Missing: employee_count
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
7) C-7BBDFA (7bbdfa.com)
- Missing: employee_count
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
8) C-50D386 (50d386.com)
- Missing: employee_count
- Enrichment: zi_employee_count=400
- Proposed fill: employee_count = 400
Company fields that are still missing and cannot be filled from enrichment (because enrichment is also blank) include:
- hq_country for:
- C-2D1F1B (2d1f1b.com) – zi_hq_country is blank
- C-D73B89 (d73b89.com) – zi_hq_country is blank
- C-2C60E5 (2c60e5.com) – zi_hq_country is blank
- C-EE9FFB (ee9ffb.com) – domain not present in enrichment
- plus any others where CRM and enrichment are both blank for that field.
CRM vs enrichment disagreements and recommended source
Rule applied:
- industry:
- Recommend using enrichment zi_industry (more specific and standardized, e.g., “Computer Software”) over free-form CRM values like “tech”, “Tech ”, or generic “Technology”.
- hq_country:
- Recommend using enrichment zi_hq_country where it uses the fully spelled-out country (“United States”), for consistency. Both are semantically the same, but enrichment is more standardized.
Disagreements (both sides non-empty and not equal):
1) C-66D1FC (66d1fc.com)
- Field: industry
- CRM: tech
- Enrichment: Computer Software
- Recommended source: enrichment (zi_industry = Computer Software)
- Field: hq_country
- CRM: US
- Enrichment: United States
- Recommended source: enrichment (zi_hq_country = United States)
2) C-950043 (950043.com)
- Field: hq_country
- CRM: US
- Enrichment: United States
- Recommended source: enrichment
3) C-EC3025 (ec3025.com)
- Field: industry
- CRM: Technology
- Enrichment: Computer Software
- Recommended source: enrichment
- Field: hq_country
- CRM: USA
- Enrichment: United States
- Recommended source: enrichment
4) C-96039F (96039f.com)
- Field: hq_country
- CRM: USA
- Enrichment: United States
- Recommended source: enrichment
5) C-44EA29 (44ea29.com)
- Field: industry
- CRM: tech
- Enrichment: Computer Software
- Recommended source: enrichment
6) C-92D97D (92d97d.com)
- Field: industry
- CRM: Technology
- Enrichment: Computer Software
- Recommended source: enrichment
7) C-D04904 (d04904.com)
- Field: industry
- CRM: Technology
- Enrichment: Computer Software
- Recommended source: enrichment
8) C-77A95A (77a95a.com)
- Field: industry
- CRM: Technology
- Enrichment: Computer Software
- Recommended source: enrichment
- Field: hq_country
- CRM: US
- Enrichment: United States
- Recommended source: enrichment
9) C-AA8DDA (aa8dda.com)
- Field: industry
- CRM: Technology
- Enrichment: Computer Software
- Recommended source: enrichment
10) C-B23205 (b23205.com)
- Field: hq_country
- CRM: US
- Enrichment: United States
- Recommended source: enrichment
11) C-E51FB7 (e51fb7.com)
- Field: hq_country
- CRM: USA
- Enrichment: United States
- Recommended source: enrichment
12) C-D0662E (d0662e.com)
- Field: hq_country
- CRM: US
- Enrichment: United States
- Recommended source: enrichment
13) C-B25F40 (b25f40.com)
- Field: industry
- CRM: Technology
- Enrichment: Computer Software
- Recommended source: enrichment
14) C-60C75F (60c75f.com)
- Field: industry
- CRM: tech
- Enrichment: Computer Software
- Recommended source: enrichment
15) C-425E2A (425e2a.com)
- Field: industry
- CRM: Tech
- Enrichment: Computer Software
- Recommended source: enrichment
- Field: hq_country
- CRM: USA
- Enrichment: United States
- Recommended source: enrichment
16) C-2D7423 (2d7423.com)
- Field: hq_country
- CRM: USA
- Enrichment: United States
- Recommended source: enrichment
--------------------------------------------------
Contacts – completeness and data quality
Total contacts: 52
Field completeness (non-blank values)
- email: 52/52 = 100.0% complete
- Arithmetic: 52 ÷ 52 × 100 = 100.0%
- title: 39/52 = 75.0% complete
- Arithmetic: 39 ÷ 52 ≈ 0.75 → 75.0%
- persona: 37/52 = 71.2% complete
- Arithmetic: 37 ÷ 52 ≈ 0.7115 → 71.2%
So:
- 13/52 contacts lack a title.
- 15/52 contacts lack a persona.
Invalid emails
Definition used: invalid if:
- email is non-blank but malformed (e.g., missing domain after “@” or missing local part).
Invalid emails found:
1) CT-0010
- email: user0@
- Reason: malformed address (missing domain part after @)
2) CT-0080
- email: user0@
- Reason: malformed address (missing domain part)
3) CT-0081
- email: user1@
- Reason: malformed address (missing domain part)
4) CT-0192
- email: user2@
- Reason: malformed address (missing domain part)
Email-domain vs contact-domain mismatches
Comparison: domain part of email vs contacts.domain.
1 mismatch:
1) CT-0011
- email: user1@other-domain.com
- email domain: other-domain.com
- contact domain: 66d1fc.com
- Issue: email domain does not match contact domain.
Contact-domain vs company-domain mismatches
Comparison: contacts.domain vs the domain on the associated company_alias in companies.csv.
Result:
- No mismatches found in the provided data.
- For all contacts, contacts.domain matches company.domain for the linked company_alias.
--------------------------------------------------
Proposed fixes (data-level), given the available data
Because there is no deals table, these are technical / data-completeness fixes only, not pipeline-weighted.
1) Companies – fill employee_count from enrichment where available
- Apply the following fills:
- C-EC3025: employee_count = 400
- C-96039F: employee_count = 400
- C-44EA29: employee_count = 400
- C-D04904: employee_count = 400
- C-B23205: employee_count = 400
- C-60C75F: employee_count = 400
- C-7BBDFA: employee_count = 400
- C-50D386: employee_count = 400
2) Companies – standardize industry using enrichment where it disagrees
- For all records listed under “industry” disagreements above (e.g., C-66D1FC, C-EC3025, C-44EA29, C-92D97D, C-D04904, C-77A95A, C-AA8DDA, C-B25F40, C-60C75F, C-425E2A), replace CRM industry with zi_industry (e.g., Computer Software).
3) Companies – standardize hq_country to enrichment where it disagrees
- For all records with hq_country disagreements (e.g., C-66D1FC, C-950043, C-EC3025, C-96039F, C-77A95A, C-B23205, C-E51FB7, C-D0662E, C-425E2A, C-2D7423), replace CRM hq_country with zi_hq_country (e.g., United States).
4) Companies – resolve duplicate alias clusters
- For acme-corp.com:
- Keep C-0A092931 as survivor; mark C-0A092932 as duplicate and merge any non-conflicting fields/relationships into the survivor without inventing values.
- For globex.io:
- Keep C-0A092933 as survivor; mark C-0A092934 as duplicate and merge relationships.
5) Companies – manually research remaining missing hq_country
- At minimum: C-2D1F1B, C-D73B89, C-2C60E5, C-EE9FFB where both CRM and enrichment are blank for hq_country.
- No fills can be done from zoominfo_enrichment.csv without adding new external data.
6) Contacts – correct malformed emails
- CT-0010 (user0@), CT-0080 (user0@), CT-0081 (user1@), CT-0192 (user2@):
- Need corrected full email addresses; cannot infer missing domains or local parts from current data.
7) Contacts – fix domain mismatch on CT-0011
- CT-0011 currently:
- email: user1@other-domain.com
- contact domain: 66d1fc.com
- Action needed: either:
- correct email to an address on 66d1fc.com, or
- correct contacts.domain and company_alias if this person truly belongs to other-domain.com.
- Current data is insufficient to choose; manual decision required.
8) Contacts – populate missing titles
- 13/52 titles are blank (25.0% missing).
- These require manual fill; there is no title field in zoominfo_enrichment.csv.
9) Contacts – populate missing personas
- 15/52 personas are blank (28.8% missing).
- Requires internal mapping or enrichment; not available in the provided data.
10) Deals – load deals extract and enforce required fields
- To complete the audit as requested and to prioritize by pipeline amount:
- You need a deals table with at least: owner, stage, amount, close_date, why_buys, and links to company_alias / contact_key.
- With that in place you can:
- compute completeness per deal field exactly as done for companies/contacts, and
- rank the above fixes by total pipeline amount touched.
--------------------------------------------------
“Top 10 fixes with the most pipeline amount at stake”
- This cannot be computed from the provided files because:
- There is no deals dataset, no amount field, and no linkage from these records to pipeline values.
- Therefore:
- I cannot state which 10 fixes have “the most pipeline amount at stake” without inventing numbers or relationships, which would violate your constraints.
- The 10 fixes listed immediately above are the highest-impact data-quality changes I can identify from the CRM and enrichment extracts alone, but they are not pipeline-weighted.
Per-deal classification (primary category, side)
Deal-DB0AAC timing buyer
Deal-F7F635 competitor buyer
Deal-AC944F no decision buyer
Deal-214060 no decision buyer
Deal-91A056 timing buyer
Deal-29326C timing buyer
Deal-5DB9B0 other Bonusly
Deal-831B7B timing buyer
Deal-F97C37 competitor buyer
Deal-13E9CF no decision buyer
Deal-39E25C timing buyer
Deal-7ED004 pricing buyer
Deal-21B045 no decision buyer
Deal-B3ABED timing buyer
Deal-422BA6 competitor buyer
Deal-ED9AE7 no decision buyer
Deal-988493 no decision buyer
Deal-381C8C competitor buyer
Deal-F308CA no decision buyer
Deal-F1E8A6 competitor buyer
Deal-B6AC09 timing buyer
Deal-70F704 no decision buyer
Deal-E6E80A timing buyer
Deal-B038F0 timing buyer
Deal-4664E1 no decision buyer
Deal-175756 timing buyer
Deal-E74A73 no decision buyer
Deal-DDAB52 competitor buyer
Deal-ACE061 competitor buyer
Deal-BB78F3 timing buyer
Deal-D48E0B no decision buyer
Deal-15DA99 timing buyer
Deal-F4AF5D timing buyer
Deal-79B7A1 timing buyer
Deal-583ADB no decision buyer
Deal-8E27DA product gap Bonusly
Deal-2D2F8D competitor buyer
Deal-E0441F no decision buyer
Deal-7CB44D no decision buyer
Deal-0F96AA competitor buyer
Deal-1BCA50 competitor buyer
Deal-7CC678 competitor buyer
Deal-FAC17C no decision buyer
Deal-242273 competitor buyer
Deal-50E5D8 no decision buyer
Deal-A2C349 competitor buyer
Deal-9F176A timing buyer
Deal-7B2236 pricing buyer
Deal-AFA56C no decision buyer
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 product gap Bonusly
Deal-D1A623 timing buyer
Deal-413C56 no decision buyer
Deal-47F1A1 competitor buyer
Deal-BF2A98 competitor buyer
Deal-2A292B competitor buyer
Deal-D1AABF no decision buyer
Deal-FEDBCB no decision buyer
Deal-1E7DA9 competitor buyer
Deal-2BBA21 no decision buyer
Deal-286F9C competitor buyer
Deal-7FBAC6 no decision buyer
Deal-369281 competitor buyer
Deal-386F6E no decision buyer
Deal-9FCD0D competitor buyer
Deal-55867E timing buyer
Deal-DAFB82 pricing buyer
Deal-2FEDDB timing buyer
Deal-64B19A competitor buyer
Deal-3F86A0 no decision buyer
Deal-096750 no decision buyer
Deal-F325A5 champion left buyer
Deal-ABD14C no decision buyer
Deal-79E61A no decision buyer
Deal-8A119B pricing buyer
Deal-AE7C4E no decision buyer
Deal-DAB4F1 no decision buyer
Deal-B4B50F no decision buyer
Deal-981AD4 product gap Bonusly
Deal-DC77FE competitor buyer
Deal-5885B9 no decision buyer
Summary
1) Category counts (with arithmetic)
timing: 20 deals
competitor: 26 deals
no decision: 31 deals
pricing: 6 deals
product gap: 5 deals
champion left: 1 deal
other: 1 deal
Check: 20 + 26 + 31 + 6 + 5 + 1 + 1
= 46 + 31 + 6 + 5 + 1 + 1
= 77 + 6 + 5 + 1 + 1
= 83 + 5 + 1 + 1
= 88 + 1 + 1
= 89 + 1
= 90 total deals
2) Side split (with arithmetic)
buyer: 84 deals
Bonusly: 6 deals
unknown: 0 deals
Check: 84 + 6 + 0 = 90 total deals
3) Deals where closed_lost_tag clearly disagrees with free-text
Count: 2 deals.
- Deal-3618CC
- closed_lost_tag: Lost DM
- free-text: “Wanted Surveys”
- Text points to a product/capability gap (surveys), not a decision-maker issue.
- Deal-9048EB
- closed_lost_tag: MIA
- free-text: “bad fit based on their desired setup and multiple feature gaps”
- Text points to product gaps/fit, not to prospect going missing.
4) Two patterns most worth acting on (based only on tag + text)
Pattern 1 – High “no decision / MIA / deprioritized” volume:
- No decision: 31 deals.
- Timing: 20 deals.
- Together: 31 + 20 = 51 out of 90 deals (~57%) did not clearly lose to a named competitor or explicit pricing objection; they stalled, went unresponsive, or were pushed out in time.
Pattern 2 – Concentrated Bonusly-side fit/product issues:
- 6 deals are classified on the Bonusly side (5 product gap + 1 ICP/other).
- Text for these cites misfit reasons like:
- “doesn’t fit UI and not UK focused”
- “wanted surveys”
- “wanted more defined budget access”
- “moved forward with just a swag provider and didn’t want R&R”
- “bad fit … multiple feature gaps”
- “Spam.” tagged as “Does not fit ICP”
- These point to a cluster of product/ICP issues (capabilities, regional fit, use-case mismatch, lead quality) that are sharply contrasted against the rest of the dataset, which is predominantly buyer-side (84 of 90 deals).
{
"tier_counts": {
"ACTION": 9,
"BUILD": 15,
"LOCK": 2,
"REVIVE": 65,
"RISKY": 35,
"WATCH": 30
},
"tier_examples": {
"ACTION": [
"Deal-25F752",
"Deal-D348E1",
"Deal-944310"
],
"BUILD": [
"Deal-3974EB",
"Deal-1CCE5C",
"Deal-FA053A"
],
"LOCK": [
"Deal-C26D20",
"Deal-403845"
],
"REVIVE": [
"Deal-6787C2",
"Deal-2D1F1B",
"Deal-66D1FC"
],
"RISKY": [
"Deal-E53952",
"Deal-5408B0",
"Deal-9AAE5F"
],
"WATCH": [
"Deal-D73B89",
"Deal-012CB1",
"Deal-523604"
]
},
"risky_deals": [
"Deal-E53952",
"Deal-5408B0",
"Deal-9AAE5F",
"Deal-547B2B",
"Deal-B7EBD1",
"Deal-A2B47C",
"Deal-2465CE",
"Deal-C61CF7",
"Deal-62D607",
"Deal-584EE5",
"Deal-C6D97A",
"Deal-7B3B0F",
"Deal-F9A08A",
"Deal-0660B4",
"Deal-FD9F4E",
"Deal-BA571A",
"Deal-FC22A3",
"Deal-7BBDFA",
"Deal-60C2C2",
"Deal-4A13AD",
"Deal-8AD4A5",
"Deal-15D24F",
"Deal-9D0060",
"Deal-690476",
"Deal-635B8E",
"Deal-ED725A",
"Deal-55164C",
"Deal-3BA5EA",
"Deal-5FDCE4",
"Deal-F336B6",
"Deal-5EED42",
"Deal-BA3DDC",
"Deal-7599B8",
"Deal-F9A3C1",
"Deal-FA32A0"
],
"lock_violations": 0,
"pipeline_shape": "There are 156 deals total; tier counts are ACTION 9 + BUILD 15 + LOCK 2 + REVIVE 65 + WATCH 30 + RISKY 35 = 156, so the pipeline is heavily skewed toward low-engagement REVIVE (65/156) and WATCH (30/156) segments with a large RISKY tail (35/156) where COMMIT/BEST_CASE forecasts lack meetings_30d, and only a small core of high-confidence ACTION/LOCK deals near close."
}
[
{
"transcript_id": "TX-001",
"deal_alias": "Deal-CFE7F4",
"why_buys": [
"The big win for us would be automating anniversary and birthday awards — our HR team of three cannot keep up with it manually."
],
"pain_points": [
"Our HR team of three cannot keep up with it manually.",
"Right now we track everything in a spreadsheet, and people slip through the cracks.",
"We looked at Achievers last year, but it was too heavy for a team our size."
],
"stakeholders": [
"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": "Yes — let's do the security review on September 12.",
"objections": [
"We looked at Achievers last year, but it was too heavy for a team our size.",
"One concern: we need SSO and audit logs for IT to sign off."
],
"confidence": "No explicit prospect-stated confidence signal."
},
{
"transcript_id": "TX-002",
"deal_alias": "Deal-70BB30",
"why_buys": [
"We want to tie recognition to retention for our hourly workforce — regretted turnover there is over 30%."
],
"pain_points": [
"Regretted turnover there is over 30%.",
"Integration with Workday has to be rock solid — that's my one condition."
],
"stakeholders": [
"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": "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": "No explicit prospect-stated confidence signal."
},
{
"transcript_id": "TX-003",
"deal_alias": "Deal-530B50",
"why_buys": [
"We need to make recognition visible across our 12 retail locations."
],
"pain_points": [
"Store managers have zero budget autonomy for on-the-spot recognition today."
],
"stakeholders": [
"Prospect (People Ops Manager)"
],
"budget_signal": "No prospect-stated budget signal.",
"timeline_signal": "Honestly there's no rush on our side until Q1.",
"competitor_mentioned": "Bucketlist",
"next_step": "Yes, let's schedule a call with our CEO — I'll send two times.",
"objections": [
"My CEO used Bucketlist at her last company and liked it.",
"The CEO has to be sold first — she decides anything people-related."
],
"confidence": "No explicit prospect-stated confidence signal."
},
{
"transcript_id": "TX-004",
"deal_alias": "Deal-180D02",
"why_buys": [
"We want to consolidate three separate recognition tools into one."
],
"pain_points": [
"We're paying for three tools and none of them talk to our HRIS."
],
"stakeholders": [
"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": "Our procurement cycle runs six to eight weeks minimum.",
"competitor_mentioned": null,
"next_step": null,
"objections": [
"The security review took three months for our last vendor — that's my hesitation."
],
"confidence": "No explicit prospect-stated confidence signal."
},
{
"transcript_id": "TX-005",
"deal_alias": "Deal-F8767A",
"why_buys": [
"Two things: automate service milestones, and give us analytics on recognition equity across departments."
],
"pain_points": [
"Our night-shift teams feel invisible — their engagement scores run 20 points lower.",
"Our exec team is skeptical after a failed rollout two years ago."
],
"stakeholders": [
"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": "Yes — come present to our exec team on October 2.",
"objections": [
"We're mid-pilot with Nectar right now, so you'd need to beat that experience.",
"Our exec team is skeptical after a failed rollout two years ago."
],
"confidence": "No explicit prospect-stated confidence signal."
},
{
"transcript_id": "TX-006",
"deal_alias": "Deal-EE195F",
"why_buys": [
"I'd love to cut the admin time on service awards."
],
"pain_points": [
"I personally spend five hours a month ordering and shipping plaques.",
"Budget isn't the issue — time is."
],
"stakeholders": [
"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": "Yes — send the one-page overview and I'll forward it to our COO this week.",
"objections": [
"Nobody else — we're comparing this against just doing it internally.",
"Fair warning, our COO usually prefers building things in-house."
],
"confidence": "No explicit prospect-stated confidence signal."
}
]
Deal-547B2B — amount $11,200 Why close: DS5/COMMIT in CRM. In Slack, redlines “came back clean,” the “signing page is out,” and their VP People said they are “signing tomorrow.” Explicitly called “signature-imminent.” What is left: Customer signs the already-sent signing page. Deal-403845 — amount $9,000 Why close: DS5/COMMIT in CRM. In Slack, “Deal-403845 is also moving fine… the order form is with their finance team,” indicating it is at internal finance approval. What is left: Finance team approval and execution of the order form. Deal-A2B47C — amount $6,360 Why close: DS5/COMMIT in CRM. In Slack, “Deal-D348E1 and Deal-A2B47C are both still warm, just normal legal-review pace,” so it is in active legal review with no blocks called out. Among these, it has an earlier close date (2026-09-11) than Deal-D348E1 (2026-10-15). What is left: Legal review completion and then customer signature. Arithmetic: DS5/COMMIT deals in CRM = 9. Slack marks Deal-2465CE as blocked → viable DS5/COMMIT = 9 − 1 = 8. From those 8, prioritize deals with positive Slack updates; pick top 3 by Slack signal and earliest close dates.
Candidates from prospect voice (only) with classifications 1) SCIM user provisioning - Prospect line: "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." - Speaker: Prospect (IT Security Lead) - Deal: Deal-EC3025 - Amount: Not provided in data - Classification: REAL PRODUCT GAP - Justification from product docs: - Docs list supported integrations: "Slack, Microsoft Teams... HRIS: Workday, BambooHR, Gusto, Rippling..." - Explicit note: "SCIM user provisioning ... are NOT currently listed as supported capabilities." - Prospect is asking for SCIM; docs confirm SCIM is not supported ⇒ true gap, not a plan gate or enablement issue. 2) ADP Workforce Now payroll integration - Prospect line: "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us." - Speaker: Prospect (HRIS Manager) - Deal: Deal-D0D6B5 - Amount: Not provided in data - Classification: REAL PRODUCT GAP - Justification from product docs: - Docs list HRIS integrations: "Workday, BambooHR, Gusto, Rippling (Pro and above)." - Explicit note: "ADP Workforce Now integrations are NOT currently listed as supported capabilities." - Prospect requires ADP Workforce Now; docs confirm no ADP integration ⇒ true gap. 3) Custom report combining recognition and turnover on current plan - Prospect line: "I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?" - Speaker: Prospect (VP People) - Deal: Deal-CFE7F4 - Amount: Not provided in data - Classification: PLAN GATE (not a product gap) - Justification from product docs: - Docs table: "Custom report builder" is only "yes" on Enterprise; Core and Pro are "—". - The rep confirms: "The custom report builder sits on our Enterprise tier." - Feature exists on Enterprise; limitation is plan level, not missing capability. 4) Slack integration adoption and manager training - Prospect line: "We turned on the Slack integration in July, but half our managers still haven't given a single recognition — nobody ever trained them on it." - Speaker: Prospect (People Ops Manager) - Deal: Deal-84DBA6 - Amount: Not provided in data - Classification: ROLLOUT / ENABLEMENT ISSUE (not a product gap) - Justification from product docs: - Docs: "Slack and Microsoft Teams integration | yes | yes | yes" (all plans). - Capability exists; issue is low manager adoption and lack of training. Note on mobile app comment - "Full transparency — we don't have a native mobile app for hourly workers yet, though it's on the roadmap." is rep language, not prospect voice. - Prospect response: "Good to know. The web version should be fine for our office staff for now." does not raise it as a blocker or unmet requirement. - Product docs excerpt does not mention mobile apps at all. - Per your instruction, rep language does not count as prospect voice, so no mobile-app gap is included. Arithmetic (issue counts, using only provided data) - Total distinct prospect-raised issues reviewed: 4 - Real product gaps: 2 (SCIM user provisioning; ADP Workforce Now integration) - Plan gates: 1 (custom report builder available only on Enterprise) - Rollout/enablement issues: 1 (Slack integration adoption / manager training) Summary: true product gaps (prospect-raised only) 1) SCIM user provisioning - Prospect: IT Security Lead - Deal: Deal-EC3025 - Amount: Not provided in data - Evidence: Docs explicitly state SCIM user provisioning is NOT a supported capability. 2) ADP Workforce Now integration - Prospect: HRIS Manager - Deal: Deal-D0D6B5 - Amount: Not provided in data - Evidence: Docs list HRIS integrations as Workday, BambooHR, Gusto, Rippling only and explicitly note ADP Workforce Now is NOT supported.
Snapshot date: 2026-09-05
Stale threshold: last email/call/meeting before 2026-08-29 (i.e., >7 days ago).
Owner: Bryce Harmon
Deals with no logged email/call/meeting in the last 7 days:
- Deal-2D1F1B | stage DS1 | amount 240000.00 | last_contact 2026-06-16 | days_since_last_contact 81
- Deal-66D1FC | stage DS1 | amount 99000.00 | last_contact 2026-08-20 | days_since_last_contact 16
- Deal-950043 | stage DS1 | amount 70000.00 | last_contact 2026-08-17 | days_since_last_contact 19
- Deal-B23205 | stage DS1 | amount 45000.00 | last_contact 2026-08-20 | days_since_last_contact 16
- Deal-7BBDFA | stage DS3 | amount 37440.00 | last_contact 2026-07-21 | days_since_last_contact 46
- Deal-332637 | stage DS2 | amount 36000.00 | last_contact 2026-08-27 | days_since_last_contact 9
- Deal-1BEEBF | stage DS1 | amount 31500.00 | last_contact 2026-08-17 | days_since_last_contact 19
- Deal-C5658B | stage DS1 | amount 23400.00 | last_contact 2026-08-20 | days_since_last_contact 16
- Deal-40522D | stage DS3 | amount 21000.00 | last_contact 2026-08-17 | days_since_last_contact 19
- Deal-F0EBBB | stage DS3 | amount 11400.00 | last_contact 2026-08-12 | days_since_last_contact 24
- Deal-E25A09 | stage DS1 | amount 6000.00 | last_contact 2026-08-27 | days_since_last_contact 9
- Deal-C9C286 | stage DS2 | amount 5502.00 | last_contact 2026-08-27 | days_since_last_contact 9
- Deal-012CB1 | stage DS1 | amount 1.00 | last_contact 2026-08-13 | days_since_last_contact 23
Owner subtotal: 13 stale deals; stale_amount = 240000.0 + 99000.0 + 70000.0 + 45000.0 + 37440.0 + 36000.0 + 31500.0 + 23400.0 + 21000.0 + 11400.0 + 6000.0 + 5502.0 + 1.0 = 626243.00
Owner: Dana Mercer
Deals with no logged email/call/meeting in the last 7 days:
- Deal-44EA29 | stage DS2 | amount 60000.00 | last_contact 2026-08-26 | days_since_last_contact 10
- Deal-E51FB7 | stage DS2 | amount 43875.00 | last_contact 2026-08-24 | days_since_last_contact 12
- Deal-B42F46 | stage DS1 | amount 27000.00 | last_contact 2026-08-17 | days_since_last_contact 19
- Deal-BA3DDC | stage DS3 | amount 23400.00 | last_contact 2026-08-21 | days_since_last_contact 15
- Deal-9DDE86 | stage DS2 | amount 20000.00 | last_contact 2026-08-21 | days_since_last_contact 15
- Deal-215CCA | stage DS3 | amount 18900.00 | last_contact 2026-08-19 | days_since_last_contact 17
- Deal-5EED42 | stage DS3 | amount 16250.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-57887A | stage DS2 | amount 15000.00 | last_contact 2026-08-28 | days_since_last_contact 8
- Deal-B7EBD1 | stage DS5 | amount 9000.00 | last_contact 2026-08-20 | days_since_last_contact 16
- Deal-3974EB | stage DS4 | amount 9000.00 | last_contact 2026-08-28 | days_since_last_contact 8
- Deal-F40F04 | stage DS2 | amount 8100.00 | last_contact 2026-08-21 | days_since_last_contact 15
- Deal-87DDD1 | stage DS1 | amount 5000.00 | last_contact 2026-08-17 | days_since_last_contact 19
- Deal-F336B6 | stage DS3 | amount 4200.00 | last_contact 2026-08-21 | days_since_last_contact 15
- Deal-0660B4 | stage DS4 | amount 1920.00 | last_contact 2026-08-20 | days_since_last_contact 16
Owner subtotal: 14 stale deals; stale_amount = 60000.0 + 43875.0 + 27000.0 + 23400.0 + 20000.0 + 18900.0 + 16250.0 + 15000.0 + 9000.0 + 9000.0 + 8100.0 + 5000.0 + 4200.0 + 1920.0 = 261645.00
Owner: Alex Franklin
Deals with no logged email/call/meeting in the last 7 days:
- Deal-CC08D1 | stage DS1 | amount 24000.00 | last_contact 2026-08-20 | days_since_last_contact 16
- Deal-E73427 | stage DS3 | amount 18000.00 | last_contact 2026-08-26 | days_since_last_contact 10
- Deal-885F45 | stage DS2 | amount 9300.00 | last_contact 2026-08-24 | days_since_last_contact 12
- Deal-C2FF3C | stage DS1 | amount 8316.00 | last_contact 2026-08-26 | days_since_last_contact 10
- Deal-0D2F7A | stage DS3 | amount 5100.00 | last_contact 2026-08-24 | days_since_last_contact 12
- Deal-6C60D4 | stage DS3 | amount 4800.00 | last_contact 2026-08-24 | days_since_last_contact 12
- Deal-13FEBD | stage DS2 | amount 4680.00 | last_contact 2026-08-24 | days_since_last_contact 12
- Deal-9D0060 | stage DS3 | amount 3840.00 | last_contact 2026-08-24 | days_since_last_contact 12
- Deal-690476 | stage DS2 | amount 3600.00 | last_contact 2026-08-18 | days_since_last_contact 18
- Deal-C6D97A | stage DS4 | amount 3240.00 | last_contact 2026-08-28 | days_since_last_contact 8
- Deal-EE195F | stage DS3 | amount 3120.00 | last_contact 2026-08-28 | days_since_last_contact 8
- Deal-278DEC | stage DS3 | amount 2700.00 | last_contact 2026-08-28 | days_since_last_contact 8
- Deal-635B8E | stage DS3 | amount 2600.00 | last_contact 2026-08-18 | days_since_last_contact 18
- Deal-6883F3 | stage DS1 | amount 2400.00 | last_contact 2026-08-20 | days_since_last_contact 16
- Deal-4A13AD | stage DS3 | amount 2160.00 | last_contact 2026-08-10 | days_since_last_contact 26
- Deal-F67D31 | stage DS2 | amount 1800.00 | last_contact 2026-08-28 | days_since_last_contact 8
- Deal-5FDCE4 | stage DS3 | amount 1600.00 | last_contact 2026-08-24 | days_since_last_contact 12
- Deal-BA571A | stage DS4 | amount 1080.00 | last_contact 2026-08-18 | days_since_last_contact 18
Owner subtotal: 18 stale deals; stale_amount = 24000.0 + 18000.0 + 9300.0 + 8316.0 + 5100.0 + 4800.0 + 4680.0 + 3840.0 + 3600.0 + 3240.0 + 3120.0 + 2700.0 + 2600.0 + 2400.0 + 2160.0 + 1800.0 + 1600.0 + 1080.0 = 102336.00
Owner: Cole Ingram
Deals with no logged email/call/meeting in the last 7 days:
- Deal-D04904 | stage DS2 | amount 58529.25 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-B25F40 | stage DS3 | amount 40000.00 | last_contact 2026-08-28 | days_since_last_contact 8
- Deal-813836 | stage DS2 | amount 32175.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-1BA595 | stage DS2 | amount 31750.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-CFE1E8 | stage DS3 | amount 18000.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-CD47A6 | stage DS2 | amount 12168.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-627646 | stage DS3 | amount 11193.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-FF809F | stage DS2 | amount 7781.20 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-AF932D | stage DS2 | amount 7225.40 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-A71728 | stage DS2 | amount 6947.50 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-8BC9F5 | stage DS2 | amount 5616.00 | last_contact 2026-08-26 | days_since_last_contact 10
- Deal-175395 | stage DS3 | amount 4779.88 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-481E24 | stage DS3 | amount 4140.00 | last_contact 2026-08-26 | days_since_last_contact 10
- Deal-C7F9BF | stage DS2 | amount 3360.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-2F3A66 | stage DS3 | amount 3334.80 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-342E96 | stage DS2 | amount 2700.00 | last_contact 2026-08-12 | days_since_last_contact 24
- Deal-E568D5 | stage DS3 | amount 1875.00 | last_contact 2026-08-25 | days_since_last_contact 11
- Deal-FD9F4E | stage DS5 | amount 1330.00 | last_contact 2026-08-26 | days_since_last_contact 10
Owner subtotal: 18 stale deals; stale_amount = 58529.25 + 40000.0 + 32175.0 + 31750.0 + 18000.0 + 12168.0 + 11193.0 + 7781.2 + 7225.4 + 6947.5 + 5616.0 + 4779.88 + 4140.0 + 3360.0 + 3334.8 + 2700.0 + 1875.0 + 1330.0 = 252905.03
Note on missing data (cannot compute days since last contact from engagements table, so these may be stale but are not included above):
Owner: Alex Franklin
- Deal-3EED2C | stage DS2 | amount 7200.00
Owner: Elena Sinclair
- Deal-57FF13 | stage DS1 | amount 2100.00
Per-rep metrics (last 30 days, based on engagements_by_deal_90d.csv joined to deals_open.csv): 1) Alex Franklin (owner_id 84342457) - Last-30-day activities: - Emails: 307 - Calls: 36 - Meetings: 41 - Total activities: 307 + 36 + 41 = 384 - Activity mix (percent of total activities): - Emails: 307 / 384 = 0.7995 → 79.95% - Calls: 36 / 384 = 0.0938 → 9.38% - Meetings: 41 / 384 = 0.1068 → 10.68% - Deals entering DS2 in last 30 days: - DS2 dates counted where 2026-08-06 ≤ t_ds2 ≤ 2026-09-05: 18 deals - Activities per DS2 entry: - 384 / 18 = 21.3333 → 21.33 activities per DS2 entry 2) Bryce Harmon (owner_id 119337721) - Last-30-day activities: - Emails: 162 - Calls: 0 - Meetings: 43 - Total activities: 162 + 0 + 43 = 205 - Activity mix: - Emails: 162 / 205 = 0.7902 → 79.02% - Calls: 0 / 205 = 0 → 0.00% - Meetings: 43 / 205 = 0.2098 → 20.98% - Deals entering DS2 in last 30 days: - DS2 dates counted where 2026-08-06 ≤ t_ds2 ≤ 2026-09-05: 4 deals - Activities per DS2 entry: - 205 / 4 = 51.25 activities per DS2 entry 3) Cole Ingram (owner_id 83155924) - Last-30-day activities: - Emails: 96 - Calls: 14 - Meetings: 1 - Total activities: 96 + 14 + 1 = 111 - Activity mix: - Emails: 96 / 111 ≈ 0.8649 → 86.49% - Calls: 14 / 111 ≈ 0.1261 → 12.61% - Meetings: 1 / 111 ≈ 0.0090 → 0.90% - Deals entering DS2 in last 30 days: - DS2 dates counted where 2026-08-06 ≤ t_ds2 ≤ 2026-09-05: 2 deals - Activities per DS2 entry: - 111 / 2 = 55.5 activities per DS2 entry 4) Farid Osman (owner_id 716654662) - Last-30-day activities: - Emails: 38 - Calls: 0 - Meetings: 34 - Total activities: 38 + 0 + 34 = 72 - Activity mix: - Emails: 38 / 72 ≈ 0.5278 → 52.78% - Calls: 0 / 72 = 0 → 0.00% - Meetings: 34 / 72 ≈ 0.4722 → 47.22% - Deals entering DS2 in last 30 days: - DS2 dates counted where 2026-08-06 ≤ t_ds2 ≤ 2026-09-05: 1 deal - Activities per DS2 entry: - 72 / 1 = 72.0 activities per DS2 entry 5) Dana Mercer (owner_id 83155923) - Last-30-day activities: - Emails: 84 - Calls: 18 - Meetings: 11 - Total activities: 84 + 18 + 11 = 113 - Activity mix: - Emails: 84 / 113 ≈ 0.7434 → 74.34% - Calls: 18 / 113 ≈ 0.1593 → 15.93% - Meetings: 11 / 113 ≈ 0.0973 → 9.73% - Deals entering DS2 in last 30 days: - DS2 dates counted where 2026-08-06 ≤ t_ds2 ≤ 2026-09-05: 1 deal - Activities per DS2 entry: - 113 / 1 = 113.0 activities per DS2 entry Efficiency ranking (lowest activities per DS2 entry = most efficient; only reps with at least 1 DS2 entry in last 30 days): 1) Alex Franklin (owner_id 84342457) - Activities per DS2 entry: 21.33 (384 total activities / 18 DS2 entries) 2) Bryce Harmon (owner_id 119337721) - Activities per DS2 entry: 51.25 (205 / 4) 3) Cole Ingram (owner_id 83155924) - Activities per DS2 entry: 55.5 (111 / 2) 4) Farid Osman (owner_id 716654662) - Activities per DS2 entry: 72.0 (72 / 1) 5) Dana Mercer (owner_id 83155923) - Activities per DS2 entry: 113.0 (113 / 1) Most efficient rep: - Alex Franklin (owner_id 84342457) with 21.33 activities per DS2 entry. Highest-volume rep (by total last-30-day activities): - Alex Franklin (owner_id 84342457) with 384 total activities. Do they differ? - No. The most efficient rep and the highest-volume rep are both Alex Franklin.
QTD SCORECARD – ALEX FRANKLIN (as of 2026-09-05, 2026-Q3) 1) QTD BOOKINGS VS QUOTA (2026-07-01 to 2026-09-05) Closed-won QTD deals (close_date ≥ 2026-07-01 and ≤ 2026-09-05): - Deal-A1C3E5: 40,000 (2026-07-15, new) - Deal-F2C7D8: 20,000 (2026-07-24, expansion) - Deal-B7D2F4: 35,000 (2026-07-31, new) - Deal-C9E1A6: 21,000 (2026-08-12, new) - Deal-A8B4D6: 12,000 (2026-08-19, expansion) - Deal-D4B8C2: 11,000 (2026-08-21, new) - Deal-E6F3A9: 6,500 (2026-09-02, new) - Deal-C5D9E2: 4,500 (2026-09-03, expansion) Note: Deal-B3E6F1 (24,000, 2026-06-20) is excluded as pre-quarter. Total QTD bookings: 40,000 + 20,000 + 35,000 + 21,000 + 12,000 + 11,000 + 6,500 + 4,500 = 150,000 Quota (quota.csv): = 200,000 Attainment %: 150,000 / 200,000 * 100 = 0.75 * 100 = 75.0% 2) NEW VS EXPANSION SPLIT (QTD BOOKINGS) New bookings (deal_type = “new”): - Deal-A1C3E5: 40,000 - Deal-B7D2F4: 35,000 - Deal-C9E1A6: 21,000 - Deal-D4B8C2: 11,000 - Deal-E6F3A9: 6,500 Sum new: 40,000 + 35,000 + 21,000 + 11,000 + 6,500 = 113,500 Expansion bookings (deal_type = “expansion”): - Deal-F2C7D8: 20,000 - Deal-A8B4D6: 12,000 - Deal-C5D9E2: 4,500 Sum expansion: 20,000 + 12,000 + 4,500 = 36,500 Check total: 113,500 (new) + 36,500 (expansion) = 150,000 (matches total QTD bookings) Share of bookings: - New % = 113,500 / 150,000 * 100 = 0.756666… * 100 ≈ 75.7% - Expansion % = 36,500 / 150,000 * 100 = 0.243333… * 100 ≈ 24.3% 3) ACTIVE PIPELINE BY STAGE (all open deals, any close_date) Open deals (status = “open”) grouped by stage, sum(amount): - DS1: 284,621 - DS2: 353,760 - DS3: 552,705 - DS4: 23,574 - DS5: 45,730 Total active pipeline: 284,621 + 353,760 + 552,705 + 23,574 + 45,730 = 1,260,390 Stage shares of total pipeline: - DS1 share % = 284,621 / 1,260,390 * 100 ≈ 22.6% - DS2 share % = 353,760 / 1,260,390 * 100 ≈ 28.1% - DS3 share % = 552,705 / 1,260,390 * 100 ≈ 43.9% - DS4 share % = 23,574 / 1,260,390 * 100 ≈ 1.9% - DS5 share % = 45,730 / 1,260,390 * 100 ≈ 3.6% 4) ROLLING 90-DAY DS2-TO-WON RATE (as of 2026-09-05) Window: - Snapshot date = 2026-09-05 - Window start = 2026-09-05 − 90 days = 2026-06-07 So we consider deals with entered_ds2 between 2026-06-07 and 2026-09-05 (inclusive). From those, we take only deals that have resolved by snapshot: - close_date ≤ 2026-09-05 - and (is_won = true OR status = “lost”) Counts (from code over ae_deals.csv): - Wins in window: 8 deals - Losses in window: 27 deals - Total resolved in window: 8 + 27 = 35 DS2-to-won rate: 8 / (8 + 27) * 100 = 8 / 35 * 100 ≈ 0.22857 * 100 = 22.9% 5) QTD WINS AND LOSSES + TOP LOSS REASON (2026-07-01 to 2026-09-05) Time filter: - close_date ≥ 2026-07-01 - close_date ≤ 2026-09-05 - and (is_won = true OR status = “lost”) QTD win count: - All 8 closed-won QTD deals listed in section 1 => Win count = 8 QTD loss count: - All closed_lost deals with close_date between 2026-07-29 and 2026-09-02 in ae_deals.csv => Loss count = 27 Loss reasons (QTD losses only): Value counts from data show “Lost- Timing (1 year or more)” is the most frequent, appearing 13 times across: - Deal-55867E - Deal-69CF3D - Deal-ECBF89 - Deal-15DA99 - Deal-F4AF5D - Deal-B038F0 - Deal-E6E80A - Deal-B3ABED - Deal-39E25C - Deal-29326C - Deal-5DB9B0 (other reason, so not in this bucket) - Deal-831B7B - plus additional rows flagged with loss_reason = “Lost- Timing (1 year or more)” up to a total of 13 occurrences. Summary: - QTD wins = 8 - QTD losses = 27 - Top loss reason by count: “Lost- Timing (1 year or more)” with 13 occurrences 6) ACTIVITY VOLUME BY TYPE – LAST 30 DAYS ae_engagements.csv provides 30-day activity metrics per deal_id. Summing each column across all rows: Emails (emails_30d): - Total emails_30d = 807 (807 = sum of the emails_30d column across all listed deals) Calls (calls_30d): - Total calls_30d = 112 (112 = sum of the calls_30d column) Meetings (meetings_30d): - Total meetings_30d = 128 (128 = sum of the meetings_30d column) Notes (notes_30d): - Total notes_30d = 50 (50 = sum of the notes_30d column) 7) COACHING OBSERVATIONS (GROUNDed IN THE NUMBERS) 1) Conversion from DS2 is a primary unlock: - Rolling 90-day DS2-to-won rate is 22.9% (8 wins / 35 resolved DS2+ deals). - QTD, there are 27 losses vs 8 wins, with “Lost- Timing (1 year or more)” as the top loss reason (13 occurrences). Coaching focus: tighten early qualification and next-step setting in DS2 so that long-horizon or low-intent deals are disqualified earlier, raising the DS2-to-won rate. 2) Heavy weighting toward new logos, with room to lean into expansions: - QTD bookings: 150,000 total at 75.0% attainment. - New = 113,500 (~75.7% of bookings); Expansion = 36,500 (~24.3%). Coaching focus: identify expansion patterns from wins (Deal-F2C7D8, Deal-A8B4D6, Deal-C5D9E2) and build a repeatable expansion play so expansion mix can trend higher without sacrificing new logo volume. 3) Pipeline is large but back-weighted to mid-stages: - Total active pipeline = 1,260,390, with DS3 alone at 552,705 (~43.9% of pipeline) and DS4+DS5 at only 23,574 + 45,730 = 69,304 (~5.5%). Coaching focus: prioritize a subset of DS3 opportunities for advancement (clear mutual plans, decision dates) to increase DS4/DS5 density and pull more deals into late stage where win rates and forecastability should be higher.
Assumptions and arithmetic (from provided data only) - “Active” = last_engaged_date within 60 days of the most recent engagement in the file AND is_former = false. - Max last_engaged_date in deal_contacts.csv = 2026-09-03. - 60-day window: 60 days before 2026-09-03 = 2026-09-03 − 60 days = 2026-07-05. - Active contacts are those with last_engaged_date ≥ 2026-07-05 and is_former = false. - The dataset does not include deal amount, stage, or open/closed status. I cannot filter by “open” or report amount/stage; for each deal I state that explicitly. Persona priority used to pick “most valuable persona to add” (since stage is missing in the data): economic buyer > champion > HR admin > IT security > finance, choosing the highest-priority persona that is currently missing on the deal. Below are all deals in deal_contacts.csv that are single-threaded (active_count < 2) or under-threaded (active_count < 3, or all active contacts share one persona). 1) Deal-36C33F (deal_id 63739413805, company C-077A0E) - Amount: not provided in data - Stage: not provided in data - Active contact count (arithmetic): • CT-4FE556 (IT security), last_engaged_date = 2026-08-15, is_former = false → 2026-08-15 ≥ 2026-07-05 → active • CT-405B45 (champion), last_engaged_date = 2026-08-10, is_former = true → former → NOT active • CT-86B22F (economic buyer), last_engaged_date = 2026-07-30, is_former = true → former → NOT active => active_count = 1 - Personas present (active): IT security - Personas missing: economic buyer, champion, HR admin, finance - Most valuable persona to add (by priority over missing): economic buyer - On-file unengaged contact at that company with that persona: • CT-1DB73E, title: Chief People Officer, persona: economic buyer - Threading classification: single-threaded (<2 active) and under-threaded (<3 active) 2) Deal-50D386 (deal_id 61055128146, company C-EB10E4) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-AA41B2 (champion), 2026-09-01, is_former = false → active • CT-B9C35B (HR admin), 2026-08-25, is_former = false → active => active_count = 2 - Personas present (active): champion, HR admin - Personas missing: economic buyer, IT security, finance - Most valuable persona to add: economic buyer (highest-priority missing) - On-file unengaged contact at that company with that persona: • CT-A1C4B3, title: Chief People Officer, persona: economic buyer - Threading classification: under-threaded (<3 active) 3) Deal-5408B0 (deal_id 60182332309, company C-2AE3AA) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-D33AE4 (champion), 2026-09-01, is_former = false → active • CT-8742FD (HR admin), 2026-08-18, is_former = false → active => active_count = 2 - Personas present (active): champion, HR admin - Personas missing: economic buyer, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: • CT-07FA76, title: Chief People Officer, persona: economic buyer - Threading classification: under-threaded (<3 active) 4) Deal-5BFE3B (deal_id 51674270311, company C-535D36) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-57123B (champion), 2026-08-31, is_former = false → active • CT-5CE757 (champion), 2026-08-12, is_former = false → active => active_count = 2 - Personas present (active): champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: none on file - Threading classification: • under-threaded (<3 active) • under-threaded (all active in one persona) 5) Deal-885F45 (deal_id 60686135564, company C-5E8EFB) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-51C81E (economic buyer), 2026-08-26, is_former = false → active • CT-D9A0E8 (champion), 2026-08-11, is_former = false → active => active_count = 2 - Personas present (active): economic buyer, champion - Personas missing: HR admin, IT security, finance - Most valuable persona to add: HR admin (first missing in priority list) - On-file unengaged contact at that company with that persona: none on file (Note: unengaged_contacts.csv has C-5E8EFB → CT-B3F25D (IT security), but that is IT security, not HR admin.) - Threading classification: under-threaded (<3 active) 6) Deal-92D97D (deal_id 59728118877, company C-E23238) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-01F5B4 (HR admin), 2026-08-28, is_former = false → active • CT-A902AE (champion), 2026-06-01, is_former = false but 2026-06-01 < 2026-07-05 cutoff → NOT active => active_count = 1 - Personas present (active): HR admin - Personas missing: economic buyer, champion, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: none on file - Threading classification: single-threaded (<2 active) and under-threaded (<3 active) 7) Deal-C6D97A (deal_id 62121783047, company C-5A8FC2) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-223DDC (champion), 2026-08-31, is_former = false → active • CT-B03555 (champion), 2026-08-20, is_former = false → active • CT-4E8A2B (champion), 2026-08-05, is_former = false → active => active_count = 3 - Personas present (active): champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: none on file - Threading classification: under-threaded (all active in one persona) 8) Deal-D0D6B5 (deal_id 60081655042, company C-32918E) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-87CED4 (champion), 2026-09-02, is_former = false → active • CT-DE6D7C (champion), 2026-08-19, is_former = false → active • CT-FD70B2 (champion), 2026-08-07, is_former = false → active => active_count = 3 - Personas present (active): champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: • CT-1FA4DB, title: Chief People Officer, persona: economic buyer - Threading classification: under-threaded (all active in one persona) 9) Deal-EC3025 (deal_id 61032318100, company C-FDD0C7) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-047C54 (champion), 2026-09-02, is_former = false → active • CT-F2C1AE (economic buyer), 2026-08-15, is_former = true → former → NOT active => active_count = 1 - Personas present (active): champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: • CT-6827DB, title: Chief People Officer, persona: economic buyer - Threading classification: single-threaded (<2 active) and under-threaded (<3 active) 10) Deal-F9A08A (deal_id 49757401138, company C-0D15DF) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-931B10 (champion), 2026-09-03, is_former = false → active • CT-913581 (economic buyer), 2026-06-20, is_former = false but 2026-06-20 < 2026-07-05 cutoff → NOT active => active_count = 1 - Personas present (active): champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: • CT-697541, title: Chief People Officer, persona: economic buyer - Threading classification: single-threaded (<2 active) and under-threaded (<3 active) 11) Deal-FCBE5B (deal_id 62639586615, company C-737030) - Amount: not provided in data - Stage: not provided in data - Active contact count: • CT-4A5317 (champion), 2026-08-29, is_former = false → active => active_count = 1 - Personas present (active): champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged contact at that company with that persona: none on file - Threading classification: single-threaded (<2 active) and under-threaded (<3 active)
Lead in first five minutes (pattern + example line)
- 9/10 calls start with the same turnover case study and milestone automation story.
Quote: "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."
- 1/10 call (TT-004, Deal-403845) starts with an agenda focused on security and pricing.
Quote: "I put together a short agenda — security review first, then pricing."
- 1/10 call (TT-009, Deal-1E2498) starts with a direct pricing anchor based on prior asks.
Quote: "You asked for straight pricing last time, so let's start there."
Most common objections and how they’re handled (with example lines)
Objection 1 – Budget locked / timing (4 occurrences)
- Prospect lines:
- "Honestly, budget is locked until next fiscal year — I can't add a new line item right now."
- "This is good, but can we revisit it next quarter? Open enrollment starts in October and we're underwater."
- Rep’s response pattern: Reframes funding via savings and/or suggests a scoped pilot to get internal data before planning.
Quotes:
- "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."
- "Makes sense. What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?"
Objection 2 – “We already do recognition with spreadsheet/gift cards” (3 occurrences)
- Prospect line:
- "We already do recognition with a spreadsheet and quarterly gift cards — why would we change?"
- Rep’s response pattern: Positions spreadsheets as non-scalable and differentiates on automation and analytics.
Quote:
- "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."
Objection 3 – Internal process / no urgency (3 occurrences)
- Prospect lines:
- "We need to see what the budget committee says before anything moves."
- "I need to think about it — there's no urgency on our side."
- "We'll have to wait for the committee — I can't commit to anything today."
- Rep’s response pattern: Acknowledges concern but often lets the thread drop without a concrete next step.
Quotes:
- "Understood — I'll leave it with you."
- "Fair enough."
- "Understood, thanks for the candor."
Concrete next step agreed – rate and examples
Definition used: a prospect explicitly agrees to a specific next-step meeting or action with timing.
Calls with agreed concrete next step:
- TT-001 (Deal-D348E1)
- TT-002 (Deal-5408B0)
- TT-003 (Deal-547B2B)
- TT-005 (Deal-C61CF7)
- TT-006 (Deal-60C2C2)
- TT-008 (Deal-D9A12F)
- TT-009 (Deal-1E2498)
Count with concrete next step: 7
Total calls: 10
Arithmetic: 7 / 10 = 0.7 → 70%
Example lines (prospect commitments):
- "Yes, Thursday at 2pm works — send the invite and I'll bring our HRIS manager."
- "Yes, Thursday at 2pm works — send the invite and I'll bring our HRIS manager." (repeated across multiple deals)
Calls without a concrete next step (3/10):
- TT-004 (Deal-403845): ends with "Understood — I'll leave it with you."
- TT-007 (Deal-EDC141): ends with "Fair enough."
- TT-010 (Deal-84DBA6): ends with "Understood, thanks for the candor."
Competitors raised by prospects (with exact quotes)
- Awardco
Quote: "We're also in late talks with Awardco — their rewards catalog looks bigger than yours."
- Kudos
Quote: "How are you different from Kudos? Our CEO used them at her last company."
- Workhuman (raised proactively by rep, not prospect, but mentioned in competitive context)
Quote: "And unlike Workhuman, our pricing includes the full rewards catalog with no extra margin."
Coaching notes (tied to the data)
1) When prospects cite internal process or “no urgency,” the calls often end without a next step (e.g., "Understood — I'll leave it with you." / "Fair enough."); coach Alex to consistently propose a lightweight follow-up (e.g., tentative date or async evaluation step) before accepting a soft no.
2) Competitor questions (Awardco, Kudos, Workhuman) are answered feature-functionally ("the difference is automation: milestones fire without HR lifting a finger, and you get analytics on who is being recognized."); coach Alex to follow these with an explicit customer outcome or proof (similar to his 400-person retailer story) to anchor differentiation in measurable impact.
Q3 2026 forecast (2026-07-01 to 2026-09-30 only)
1) Totals inside the quarter (by forecast category)
Inside-quarter deal counts:
- COMMIT: 7 deals
- BEST_CASE: 23 deals
- PIPELINE: 23 deals
Inside-quarter amounts:
- COMMIT total = 44,729
- From execute_code: COMMIT_TOTAL = 44729.0
- BEST_CASE total = 183,909
- From execute_code: BEST_TOTAL = 183909.0
- PIPELINE total (not counted in forecast, but for context) = 201,637.4
- From execute_code: PIPELINE portion of CAT_TOTALS = 201637.4
2) Weighted forecast calculation
Rule: 100% of COMMIT + 35% of BEST_CASE; PIPELINE = 0.
- COMMIT portion = 44,729
- BEST_CASE portion = 35% × 183,909
- 0.35 × 183,909 = (0.3 × 183,909) + (0.05 × 183,909)
- 0.3 × 183,909 = 55,172.7
- 0.05 × 183,909 = 9,195.45
- Sum = 55,172.7 + 9,195.45 = 64,368.15
Weighted forecast:
- Weighted forecast = 44,729 + 64,368.15 = 109,097.15
- This matches execute_code: WEIGHTED = 109097.15
3) Deal counts in each forecast category inside the quarter
- COMMIT: 7 deals
- BEST_CASE: 23 deals
- PIPELINE: 23 deals
(From execute_code: CAT_COUNTS = {'BEST_CASE': 23, 'PIPELINE': 23, 'COMMIT': 7})
4) Deals excluded for being outside the quarter
Definition: Q3 = 2026-07-01 to 2026-09-30 inclusive. Excluded = close_date < 2026-07-01 or close_date > 2026-09-30.
From execute_code:
- IN_Q_COUNT = 53
- OUT_Q_COUNT = 32
- OUT_TOTAL (sum of excluded deal amounts) = 227,575.0
So:
- Excluded deals (outside quarter): 32 deals
- Total amount of excluded deals: 227,575
5) Top 5 BEST_CASE deals by amount inside the quarter
From execute_code (filter forecast_category == BEST_CASE and 2026-07-01 ≤ close_date ≤ 2026-09-30, then sort by amount desc):
Top 5 BEST_CASE deals inside the quarter:
1) Deal-2D7423 — amount 38,935 — close_date 2026-09-30
2) Deal-25F752 — amount 24,000 — close_date 2026-09-25
3) Deal-5EED42 — amount 16,250 — close_date 2026-09-30
4) Deal-FA32A0 — amount 11,116 — close_date 2026-09-25
5) Deal-FC22A3 — amount 10,800 — close_date 2026-09-30
## Data quality
Owner is blank for almost all deals, so the forecast can’t be reliably attributed by rep or team and may hide ownership issues. Several deals have why_buys_chars = 0, meaning no substantive “why buy” notes, which makes forecast confidence hard to assess and vulnerable to sandbagging or happy-ears. Amounts are sometimes non-integer (e.g. Deal-42326B at 2,480.4), which may indicate inconsistent pricing units or proration that isn’t documented here. Finally, there is at least one open deal with a close date before the extract date (e.g. 2026-08-28 for Deal-333EBB) and many with close dates far beyond the quarter, so without automation to push slipped close dates forward the pipeline would look healthier than reality if this ran unattended.
2x2 cohort results (using only the provided file; every row included, no exclusions) Cohort definitions (based on first calendar month): - “Both signals”: m1_users ≥ 5 AND m1_redemptions ≥ 1 - “Givers-only”: m1_users ≥ 5 AND m1_redemptions = 0 - “Redemption-only”: m1_users < 5 AND m1_redemptions ≥ 1 - “Neither”: m1_users < 5 AND m1_redemptions = 0 current_status = 'active' is treated as “retained at 24 months” for this already-25+ month cohort. Cohort sizes and 24-month retention 1) Both signals - Count: 47 companies - Retained (current_status = 'active'): 31 - Retention rate = 31 / 47 = 0.6595744681 ≈ 66.0% 2) Givers-only - Count: 49 companies - Retained: 23 - Retention rate = 23 / 49 = 0.4693877551 ≈ 46.9% 3) Redemption-only - Count: 29 companies - Retained: 9 - Retention rate = 9 / 29 = 0.3103448276 ≈ 31.0% 4) Neither - Count: 95 companies - Retained: 38 - Retention rate = 38 / 95 = 0.4 = 40.0% Exclusions from denominator - Companies excluded: 0 - Reason: All rows have numeric m1_users and m1_redemptions, so every company in plg_company_cohort_2023.csv is included in exactly one of the four cohorts above. Single-signal with largest retention lift Compare each single-signal cohort to the “neither” baseline (40.0%): - Givers-only lift vs neither: 46.9% − 40.0% = 6.9 percentage points - Redemption-only lift vs neither: 31.0% − 40.0% = −9.0 percentage points (a retention drop, not a lift) The single signal with the largest retention lift is: - Having 5+ unique givers (m1_users ≥ 5) without an m1 redemption (“givers-only”). What this does and does not prove - What it does show (in this extract): - Companies with both activation signals (givers + redemption in month 1) retain best at 24 months (~66.0%) vs any one signal or neither (46.9%, 31.0%, 40.0% respectively). - Having 5+ unique givers alone is associated with higher 24-month retention than having neither signal (46.9% vs 40.0%) and much higher than redemption-only (31.0%). - What it does NOT prove: - It does not prove that early givers or redemptions cause higher retention; this is correlation only. - It does not control for product_tier, industry_group, geography, or company size (current_arr_usd) as potential confounders. - It does not prove that hitting these activation thresholds in month 1 will, by itself, improve retention for any given future customer; it only summarizes associations in this specific 2023 PLG cohort extract.
1) ARR totals as of 2026-09-05 Billing ARR (Chargebee, active subs only) - Definition: Billing ARR = MRR x 12, summed over status = active. - Example checks: - SUB-0001 (C-0BC46AD9): 1,436.77 x 12 = 17,241.24 - SUB-0005 (C-0D66DF9E): 1,932.00 x 12 = 23,184.00 - SUB-0015 (C-0FB9D5AF): 1,920.34 x 12 = 23,044.08 - Total Billing ARR = 604,739.28 CRM ARR (company_arr.csv) - Definition: CRM ARR = sum of hubspot_arr across all rows. - Example checks: - C-0BC46AD9: 17,241.24 - C-0D66DF9E: 23,200.00 - C-0FB9D5AF: 23,044.08 - Total CRM ARR = 603,581.76 Variance (CRM – Billing) - Variance = 603,581.76 – 604,739.28 - Variance = –1,157.52 (CRM ARR is 1,157.52 lower than Billing ARR) 2) Variance decomposition (sums exactly to –1,157.52) Buckets: - Status mismatch: +13,158.48 - Rounding: 0.00 - Missing records: –11,952.00 - Other: –2,364.00 Check: - 13,158.48 + 0.00 – 11,952.00 – 2,364.00 - = 13,158.48 – 11,952.00 – 2,364.00 - = 1,206.48 – 2,364.00 - = –1,157.52 (matches total variance) 2a) Status mismatch bucket (+13,158.48) Definition used: CRM shows ARR, but billing only has cancelled subscriptions (no active ARR). 1) C-0C8323BF - CRM ARR (hubspot_arr) = 4,905.24 - Billing: - SUB-000E: mrr = 408.77, term_months = 12, status = cancelled - Active billing ARR = 0.00 (cancelled is excluded from active ARR) - Difference = 4,905.24 – 0.00 = +4,905.24 - Bucket: Status mismatch - Suggested owner: RevOps / CRM owner (to align CRM ARR with cancelled billing status) 2) C-0DC4FB8C - CRM ARR (hubspot_arr) = 8,253.24 - Billing: - SUB-000F: mrr = 687.77, term_months = 12, status = cancelled - Active billing ARR = 0.00 - Difference = 8,253.24 – 0.00 = +8,253.24 - Bucket: Status mismatch - Suggested owner: RevOps / CRM owner Status mismatch bucket total: - 4,905.24 + 8,253.24 = 13,158.48 2b) Rounding bucket (0.00) Definition used: |CRM ARR – Billing ARR| ≤ 0.10. - No accounts fall into this range. - Rounding bucket total = 0.00 2c) Missing records bucket (–11,952.00) Definition used: account present in only one system (CRM-only or Billing-only), with difference attributed to missing record in the other system. 3) C-0D5BBE3A (CRM-only) - CRM ARR (hubspot_arr) = 16,497.24 - Billing: no subscription row for C-0D5BBE3A - Billing ARR = 0.00 - Difference = 16,497.24 – 0.00 = +16,497.24 - Bucket: Missing records (missing billing subscription) - Suggested owner: Billing/Finance (to create/confirm subscription) 4) C-21629AA4 (Billing-only) - Billing: - SUB-0004: mrr = 2,370.77, term_months = 12, status = active - Billing ARR = 2,370.77 x 12 = 28,449.24 - CRM: no row for C-21629AA4 - CRM ARR = 0.00 - Difference = 0.00 – 28,449.24 = –28,449.24 - Bucket: Missing records (missing CRM company/ARR) - Suggested owner: RevOps / CRM owner (to create company and ARR) Missing records bucket total: - +16,497.24 + (–28,449.24) - = –11,952.00 2d) Other bucket (–2,364.00) Definition used: accounts present in both systems with non-trivial numeric differences (>|0.10|) not explained by status or missing records. 5) C-0D66DF9E - Billing: SUB-0005, mrr = 1,932.00, term_months = 12, status = active - Billing ARR = 1,932.00 x 12 = 23,184.00 - CRM ARR = 23,200.00 - Difference = 23,200.00 – 23,184.00 = +16.00 - Bucket: Other (price/rounding config difference, but above rounding threshold) - Suggested owner: RevOps / Pricing (to align list price/discounts in CRM vs billing) 6) C-0F7269D7 - Billing: SUB-0006, mrr = 2,233.00, term_months = 12, status = active - Billing ARR = 2,233.00 x 12 = 26,796.00 - CRM ARR = 24,396.00 - Difference = 24,396.00 – 26,796.00 = –2,400.00 - Bucket: Other (material ARR misalignment) - Suggested owner: RevOps / Billing (joint review of contracted ARR vs invoiced MRR) 7) C-14D70CE0 - Billing: SUB-0008, mrr = 1,515.00, term_months = 12, status = active - Billing ARR = 1,515.00 x 12 = 18,180.00 - CRM ARR = 18,200.00 - Difference = 18,200.00 – 18,180.00 = +20.00 - Bucket: Other (ARR mis-keyed or outdated in CRM) - Suggested owner: RevOps / CRM owner Other bucket total: - +16.00 + (–2,400.00) + 20.00 - = 16.00 + 20.00 – 2,400.00 - = 36.00 – 2,400.00 - = –2,364.00 3) Summary list of all mismatched accounts (with suggested owner) 1) C-0C8323BF - CRM ARR = 4,905.24 - Billing ARR (active) = 0.00 (only cancelled sub) - Difference = +4,905.24 - Bucket: Status mismatch - Suggested owner: RevOps / CRM owner 2) C-0DC4FB8C - CRM ARR = 8,253.24 - Billing ARR (active) = 0.00 (only cancelled sub) - Difference = +8,253.24 - Bucket: Status mismatch - Suggested owner: RevOps / CRM owner 3) C-0D5BBE3A - CRM ARR = 16,497.24 - Billing ARR = 0.00 (no subscription) - Difference = +16,497.24 - Bucket: Missing records (missing billing sub) - Suggested owner: Billing/Finance 4) C-21629AA4 - CRM ARR = 0.00 (no company row) - Billing ARR = 28,449.24 (2,370.77 x 12) - Difference = –28,449.24 - Bucket: Missing records (missing CRM company/ARR) - Suggested owner: RevOps / CRM owner 5) C-0D66DF9E - CRM ARR = 23,200.00 - Billing ARR = 23,184.00 (1,932.00 x 12) - Difference = +16.00 - Bucket: Other - Suggested owner: RevOps / Pricing 6) C-0F7269D7 - CRM ARR = 24,396.00 - Billing ARR = 26,796.00 (2,233.00 x 12) - Difference = –2,400.00 - Bucket: Other - Suggested owner: RevOps / Billing 7) C-14D70CE0 - CRM ARR = 18,200.00 - Billing ARR = 18,180.00 (1,515.00 x 12) - Difference = +20.00 - Bucket: Other - Suggested owner: RevOps / CRM owner 4) Business rule check: term ≠ 12 months must have cf_agreement_end_date populated Subscriptions with term_months ≠ 12: 1) SUB-0002 - company_alias = C-1794A52C - term_months = 24 - status = active - cf_agreement_end_date = (blank) - VIOLATION (term ≠ 12 and cf_agreement_end_date is not populated) 2) SUB-000C - company_alias = C-0DB48281 - term_months = 24 - status = active - cf_agreement_end_date = 2027-11-30 - OK (term ≠ 12 and cf_agreement_end_date populated) 3) SUB-0019 - company_alias = C-22170CA1 - term_months = 36 - status = active - cf_agreement_end_date = (blank) - VIOLATION (term ≠ 12 and cf_agreement_end_date is not populated) 4) SUB-001A - company_alias = C-0FC4DBB8 - term_months = 36 - status = active - cf_agreement_end_date = 2027-11-30 - OK (term ≠ 12 and cf_agreement_end_date populated) Business-rule violations: - SUB-0002 (C-1794A52C) - SUB-0019 (C-22170CA1)
KVMs are account-averages across all rows for each month. Arithmetic (per KVM): - Giving rate: 2026-07 = 0.6023; 2026-08 = 0.6027 Abs change = 0.6027−0.6023 = +0.0004; Rel = 0.0004 / 0.6023 ≈ +0.07% (up slightly). - Redemptions/user: 2026-07 = 1.7300; 2026-08 = 1.7302 Abs = 1.7302−1.7300 = +0.0002; Rel = 0.0002 / 1.7300 ≈ +0.01% (flat/slightly up). - 1:1 engagement: 2026-07 = 0.4469; 2026-08 = 0.4472 Abs = 0.4472−0.4469 = +0.0003; Rel = 0.0003 / 0.4469 ≈ +0.06% (up slightly). - Pulse engagement: 2026-07 = 0.6006; 2026-08 = 0.5086 Abs = 0.5086−0.6006 = −0.0920; Rel = −0.0920 / 0.6006 ≈ −15.3% (down). Largest relative move: pulse_engagement (−15.3%). Data shows it is driven by the enterprise size_band, where pulse_engagement moves from 0.5500 to 0.2743 (abs −0.2757; −0.2757 / 0.5500 ≈ −50.1%). Table (averages, rounded): KVM 2026-07 2026-08 Abs change Rel change Direction giving_rate 0.6023 0.6027 +0.0004 +0.07% Up redemptions_per_user 1.7300 1.7302 +0.0002 +0.01% Up one_to_one_engagement 0.4469 0.4472 +0.0003 +0.06% Up pulse_engagement 0.6006 0.5086 -0.0920 -15.3% Down
Last completed month: 2026-08
Redemption count:
- 378 redemptions (rows in redemptions_ytd.csv through 2026-08)
Total spend:
- Provider spends:
- custom: 10,873.00
- Tremendous: 8,505.00
- Snappy: 5,238.00
- TangoCard: 3,230.00
- Total spend arithmetic:
10,873.00 + 8,505.00 + 5,238.00 + 3,230.00
= 19,378.00 + 5,238.00 + 3,230.00
= 24,616.00 + 3,230.00
= 27,846.00
- Total spend: 27,846.00 USD
Unique redeemers:
- 235 unique user_key values
Redemptions per redeemer:
- Arithmetic: 378 redemptions ÷ 235 unique redeemers
= 1.6085 (rounded)
- Redemptions per redeemer: 1.61
Provider mix (percent of spend; shares sum to 100.0%):
- custom
- Spend: 10,873.00
- % arithmetic: (10,873.00 ÷ 27,846.00) × 100
= 0.39046901 × 100
= 39.046901% ≈ 39.1%
- Reported share: 39.1%
- Tremendous
- Spend: 8,505.00
- % arithmetic: (8,505.00 ÷ 27,846.00) × 100
= 0.30542986 × 100
= 30.542986% ≈ 30.5%
- Reported share: 30.5%
- Snappy
- Spend: 5,238.00
- % arithmetic: (5,238.00 ÷ 27,846.00) × 100
= 0.18810601 × 100
= 18.810601% ≈ 18.8%
- Reported share: 18.8%
- TangoCard
- Spend: 3,230.00
- % arithmetic: (3,230.00 ÷ 27,846.00) × 100
= 0.11599512 × 100
= 11.599512% ≈ 11.6%
- Reported share: 11.6%
Provider share check (must sum to 100%):
- 39.1% + 30.5% + 18.8% + 11.6% = 100.0%
Top 5 countries by redemptions (by count):
- US: 244
- CA: 24
- AU: 21
- GB: 17
- NL: 17
ELIGIBLE AT‑RISK ACCOUNTS (MEET R1 + R2 + R3)
All of the following have:
- R1: health_score < 60
- R2: churn_save_eligible_amount > 0
- R3: renewal_date within 120 days of 2026‑09‑05
For each I assign a primary play and cite the signal.
1) C-0F6C0F34
- Amount at stake: 49,707.00 (churn_save_eligible_amount)
- Signals:
- Health score 51 (<60, at risk)
- Renewal 2026-10-03 → 28 days from 2026-09-05 (within 120 days)
- Usage_trend_3m = growing
- Utilization ≈ 308/395 ≈ 78.0%
- champion_active = false
- Recommended play: Executive touch
- Justification signal: Strong product usage (growing, 78% utilization) but champion_active=false indicates a relationship/visibility risk suited to senior outreach more than a usage or pricing issue.
2) C-0B827671
- Amount at stake: 25,365.00
- Signals:
- Health score 56
- Renewal 2026-11-14 → 70 days out
- Usage_trend_3m = declining
- Utilization ≈ 113/202 ≈ 55.9%
- champion_active = true
- Recommended play: Usage revival
- Justification signal: usage_trend_3m=declining and only ~56% seat utilization despite an active champion point to engagement decay; a usage-focused play is the best fit.
3) C-0B360C78
- Amount at stake: 35,748.00
- Signals:
- Health score 57
- Renewal 2026-10-28 → 53 days out
- Usage_trend_3m = growing
- Utilization ≈ 246/327 ≈ 75.2%
- champion_active = true
- Recommended play: Commercial concession
- Justification signal: High, growing usage and ~75% utilization with an active champion but still at-risk health suggests value/price friction rather than adoption; commercial concession fits that signal.
4) C-0B0F1BAB
- Amount at stake: 5,494.00
- Signals:
- Health score 38 (very low)
- Renewal 2026-09-23 → 18 days out
- Usage_trend_3m = flat
- Utilization ≈ 238/363 ≈ 65.6%
- champion_active = false
- Recommended play: Executive touch
- Justification signal: Very low health, imminent renewal, and champion_active=false together indicate an executive-level relationship risk that an executive touch play is designed to address.
5) C-0CA21961
- Amount at stake: 16,829.00
- Signals:
- Health score 58
- Renewal 2026-12-28 → 114 days out
- Usage_trend_3m = flat
- Utilization ≈ 84/325 ≈ 25.8% (very under‑utilized)
- champion_active = true
- Recommended play: Usage revival
- Justification signal: Extremely low utilization (~26%) and flat usage despite an active champion point clearly to adoption gaps; usage revival targets that problem.
6) C-0E9C27D1
- Amount at stake: 41,235.00
- Signals:
- Health score 39
- Renewal 2026-09-24 → 19 days out
- Usage_trend_3m = flat
- Utilization ≈ 134/157 ≈ 85.4%
- champion_active = true
- Recommended play: Commercial concession
- Justification signal: Very high utilization (~85%) and near-term renewal with low health suggest they use the product heavily but are unhappy with commercial terms/value; concession is the most aligned play.
7) C-0CEF69FD
- Amount at stake: 32,621.00
- Signals:
- Health score 53
- Renewal 2026-11-21 → 77 days out
- Usage_trend_3m = growing
- Utilization ≈ 97/136 ≈ 71.3%
- champion_active = false
- Recommended play: Executive touch
- Justification signal: Strong, growing usage and >70% utilization but champion_active=false point to stakeholder/relationship risk; executive touch addresses sponsor coverage.
8) C-0D3278C7
- Amount at stake: 17,602.00
- Signals:
- Health score 54
- Renewal 2026-11-12 → 68 days out
- Usage_trend_3m = declining
- Utilization ≈ 126/380 ≈ 33.2% (low)
- champion_active = true
- Recommended play: Usage revival
- Justification signal: Declining usage with only ~33% of seats used indicates shrinking engagement; usage revival directly targets low and worsening utilization.
TOTAL CHURN‑SAVE ELIGIBLE AMOUNT (ELIGIBLE AT‑RISK ACCOUNTS)
Per-account eligible amounts:
- C-0F6C0F34: 49,707
- C-0B827671: 25,365
- C-0B360C78: 35,748
- C-0B0F1BAB: 5,494
- C-0CA21961: 16,829
- C-0E9C27D1: 41,235
- C-0CEF69FD: 32,621
- C-0D3278C7: 17,602
Arithmetic:
49,707 + 25,365 + 35,748 + 5,494 + 16,829 + 41,235 + 32,621 + 17,602 = 224,601
Total amount at stake (eligible at-risk accounts): 224,601.00
AT‑RISK ACCOUNTS THAT DO NOT QUALIFY (FAIL R2 AND/OR R3)
These all satisfy R1 (health_score < 60) but fail at least one of R2 (eligible_amount > 0) or R3 (renewal within 120 days).
1) C-0BC71BDD
- Health score: 55 (at risk)
- churn_save_eligible_amount: 0.00 → fails R2
- Renewal: 2026-10-27 → 52 days from 2026-09-05 (within 120 days, passes R3)
- Reason not eligible: At risk but no churn-save eligible amount (fails R2).
2) C-0BA71F12
- Health score: 52
- churn_save_eligible_amount: 6,824.00 (passes R2)
- Renewal: 2027-04-11 → 218 days from 2026-09-05 (>120 days, fails R3)
- Reason not eligible: At risk with eligible amount, but renewal is >120 days out (fails R3).
3) C-0F6694C3
- Health score: 43
- churn_save_eligible_amount: 0.00 → fails R2
- Renewal: 2027-03-21 → 197 days out (>120 days, fails R3)
- Reason not eligible: At risk but both zero eligible amount (R2) and renewal beyond 120 days (R3) disqualify.
4) C-0BE96399
- Health score: 54
- churn_save_eligible_amount: 0.00 → fails R2
- Renewal: 2026-10-29 → 54 days out (passes R3)
- Reason not eligible: At risk with renewal inside window but no churn-save eligible amount (fails R2).
5) C-0F876796
- Health score: 47
- churn_save_eligible_amount: 19,958.00 (passes R2)
- Renewal: 2027-02-06 → 154 days out (>120 days, fails R3)
- Reason not eligible: At risk with eligible amount, but renewal is outside 120-day window (fails R3).
6) C-0FCCD2DF
- Health score: 43
- churn_save_eligible_amount: 0.00 → fails R2
- Renewal: 2027-04-23 → 230 days out (>120 days, fails R3)
- Reason not eligible: At risk but zero eligible amount and renewal too far out (fails R2 and R3).
7) C-10A56B0F
- Health score: 54
- churn_save_eligible_amount: 0.00 → fails R2
- Renewal: 2026-12-12 → 98 days out (passes R3)
- Reason not eligible: At risk with renewal in window but no churn-save eligible amount (fails R2).
Seat coverage (licensed over headcount) - Licensed_seats = 150 - Headcount = 400 - Coverage = 150 / 400 = 0.375 → 37.5% seat coverage vs headcount Usage health (2 lines, data-only) 1) Growth: monthly active users rose from 88 (2026-03) to 126 (2026-08). Absolute change = 126 - 88 = 38 users; % change = 38 / 88 ≈ 0.4318 → ~43.2% growth over 6 months. 2) Utilization: latest month (2026-08) utilization of licenses = 126 active users / 150 licensed seats = 0.84 → 84.0% of seats in active use. Headroom in seats and ARR at current per-seat rate - Current ARR = 9,000.00 - Licensed seats = 150 - ARR per seat = 9,000.00 / 150 = 60.00 ARR per seat - Latest active users (proxy for filled seats) = 126 - Seat headroom = 150 - 126 = 24 seats - ARR headroom at current per-seat rate = 24 * 60.00 = 1,440.00 incremental ARR Who replied and whether they can buy - Responder: Maria S., People Operations Coordinator. - Buying authority: Maria explicitly states she is not the right person for purchasing decisions; budget and seat expansion sit with Dana R., so Maria cannot buy. Right buyer from our contacts - Contact: Dana R. - Title: VP People. - From the reply: “Budget and seat expansion sit with Dana R., our VP People” and “she’s been asking about our usage numbers lately” → Dana R., VP People, is the right buyer. Reply email (<=150 words, includes one real usage fact) Subject: RE: Growing your team’s recognition program Hi Maria, Thanks so much for the quick reply and for sharing that the team loves Bonusly. I’m glad to see engagement trending up – for example, you had 126 active users in August, up from 88 in March. Since budget and seat expansion live with Dana, would you be open to connecting us so I can share a quick snapshot of how your usage compares to your 150 licensed seats and discuss options when it makes sense for her? Happy to send a short overview beforehand if that’s easier. Best, Cole
Account: C-0D284E42
1) What is complete (with data fields)
- Slack integration connected
- Field: integration_slack = 2026-08-12
- Interpretation: Slack integration is complete as of 2026-08-12.
- Allowance set
- Field: allowance_set = 2026-08-13
- Interpretation: Budget/allowance configuration is complete as of 2026-08-13.
- Admins added
- Field: admins_added = 2
- Interpretation: At least 2 admins are in the system. Marking “admins added” complete based on this count.
- First recognition given
- Field: first_recognition_at = 2026-08-15 14:22
- Interpretation: First recognition event is complete as of 2026-08-15 14:22.
- First redemption
- Field: first_redemption_at is empty (no value)
- Interpretation: First redemption is NOT complete; there is no recorded redemption yet.
2) What is not complete / missing
- HRIS integration
- Field: integration_hris is empty (no date)
- Interpretation: HRIS integration is NOT complete or there is no data to show it as complete.
- First redemption
- Field: first_redemption_at is empty
- Interpretation: No redemptions have occurred yet (or none are recorded).
3) Early engagement signals (using onboarding_usage.csv)
Data window: 2026-08-11 to 2026-09-04 (25 days).
Basic stats:
- Start-of-period active givers: 3 (on 2026-08-11)
- End-of-period active givers: 15 (on 2026-09-04)
- Absolute change:
- 15 (end) – 3 (start) = 12 additional active givers
- Percent change:
- 12 / 3 = 4
- 4 × 100% = 400% increase in daily active givers vs day 1
- Minimum active_givers in the period: 3
- Maximum active_givers in the period: 15
Ramp over time (first 7 vs last 7 days):
- First 7 days (2026-08-11 to 2026-08-17):
- Counts: 3, 3, 4, 4, 5, 4, 7
- Sum = 3+3+4+4+5+4+7 = 30
- Average = 30 / 7 ≈ 4.29 active givers/day
- Last 7 days (2026-08-29 to 2026-09-04):
- Counts: 11, 13, 11, 13, 13, 15, 15
- Sum = 11+13+11+13+13+15+15 = 91
- Average = 91 / 7 = 13.0 active givers/day
Signals:
- Strong early adoption growth:
- Daily active givers increased from 3 to 15 (400% increase).
- Average daily active givers rose from ≈4.29 in first 7 days to 13.0 in last 7 days.
- Consistent ongoing usage:
- There is an active_givers count for every day in the 25-day window; no zero-usage days are recorded.
- Engagement is concentrated on giving, not yet on redeeming:
- Multiple days with 10+ active givers, but first_redemption_at is still empty.
4) Three things to cover on the mid-onboarding call
1) Close the “earn → redeem” loop
- Context: first_recognition_at is populated, first_redemption_at is empty.
- Goal for the call: align on a plan to drive initial redemptions (e.g., internal comms, demos of the catalog, or incentives to redeem) so the program feels tangible, not just points-accumulation.
2) Confirm and schedule HRIS integration
- Context: integration_hris has no date; Slack integration is already complete.
- Goal for the call: understand their HRIS system and timeline, confirm whether they intend to integrate, and, if yes, agree on next steps/owner/date to complete integration_hris.
3) Expand beyond early adopters and admin enablement
- Context:
- admins_added = 2 (admins in place),
- active_givers trending up from an average of ≈4.29 to 13.0 per day, with a max of 15.
- Goal for the call: review who is currently active (by role/team, if they can share on the call), decide which next teams or locations to target, and align on an enablement plan that those 2 admins can help execute (e.g., trainings, launch moments) to continue scaling beyond the currently engaged group.
C-0B7D2C30
- CSM: Dana Mercer | ARR: 65,901
- Renewal date used: 2026-09-15 (Chargebee)
- DATE DISAGREEMENT: CZ=2026-09-10 vs CB=2026-09-15; Chargebee has term_months=36 and is_multi_year=true, and multi-year contracts are known to be wrong in ChurnZero, so I trust Chargebee.
- Seat utilization: 274/476 = 0.576 → 57.6%.
- 3-month usage trend (2026-06→07→08): 97→94→84; change = 84−97 = −13; percent change = −13/97 ≈ −13.4% → down.
- Risk: High — mid-range seat utilization (57.6%) combined with a 13-user, 13.4% decline over the last 3 months indicates sustained weakening engagement near renewal.
C-0BCDB8C2
- CSM: Cole Ingram | ARR: 54,427
- Renewal date used: 2026-09-18 (Chargebee)
- DATE DISAGREEMENT: CZ=2027-09-18 vs CB=2026-09-18; Chargebee has term_months=36 and is_multi_year=true, and multi-year contracts are known to be wrong in ChurnZero, so I trust Chargebee.
- Seat utilization: 232/424 = 0.5472 → 54.7%.
- 3-month usage trend (2026-06→07→08): 127→118→110; change = 110−127 = −17; percent change = −17/127 ≈ −13.4% → down.
- Risk: High — only ~54.7% of seats used and a 17-user (13.4%) drop over 3 months suggest material value erosion ahead of renewal.
C-0D2AB865
- CSM: Elena Sinclair | ARR: 38,022
- Renewal date used: 2026-09-22 (Chargebee)
- DATE DISAGREEMENT: CZ=2026-09-10 vs CB=2026-09-22; Chargebee has term_months=24 and is_multi_year=true, and multi-year contracts are known to be wrong in ChurnZero, so I trust Chargebee.
- Seat utilization: 250/407 ≈ 0.6143 → 61.4%.
- 3-month usage trend (2026-06→07→08): 125→117→109; change = 109−125 = −16; percent change = −16/125 = −12.8% → down.
- Risk: High — moderate utilization (61.4%) but a 16-user (12.8%) decline over 3 months signals sustained churn in active users before renewal.
C-0BBE3E60
- CSM: Dana Mercer | ARR: 30,993
- Renewal date used: 2026-09-26 (Chargebee)
- DATE DISAGREEMENT: CZ=2027-09-26 vs CB=2026-09-26; Chargebee has term_months=24 and is_multi_year=true, and multi-year contracts are known to be wrong in ChurnZero, so I trust Chargebee.
- Seat utilization: 74/114 ≈ 0.6491 → 64.9%.
- 3-month usage trend (2026-06→07→08): 39→35→33; change = 33−39 = −6; percent change = −6/39 ≈ −15.4% → down.
- Risk: High — decent utilization (64.9%) but a 6-user (15.4%) 3‑month decline on a small base shows a sharp proportional drop in engagement.
C-0F5D2323
- CSM: Cole Ingram | ARR: 90,647
- Renewal date used: 2026-09-29 (Chargebee)
- DATE DISAGREEMENT: CZ=2026-09-10 vs CB=2026-09-29; Chargebee has term_months=24 and is_multi_year=true, and multi-year contracts are known to be wrong in ChurnZero, so I trust Chargebee.
- Seat utilization: 111/390 ≈ 0.2846 → 28.5%.
- 3-month usage trend (2026-06→07→08): 20→21→18; change = 18−20 = −2; percent change = −2/20 = −10.0% → mixed/flat (small uptick then decline, net −10%).
- Risk: High — very low seat utilization (28.5%) plus a net 10% decline in active users over 3 months makes this a clear downsell/churn risk.
C-0EC6999D
- CSM: Elena Sinclair | ARR: 79,419
- Renewal date used: 2026-10-03 (CZ and Chargebee agree; single-year)
- CZ=2026-10-03 and CB=2026-10-03; Chargebee term_months=12 and is_multi_year=false, so I treat the aligned date as reliable.
- Seat utilization: 31/112 ≈ 0.2768 → 27.7%.
- 3-month usage trend (2026-06→07→08): 17→16→15; change = 15−17 = −2; percent change = −2/17 ≈ −11.8% → down.
- Risk: High — extremely low utilization (27.7%) with an 11.8% 3‑month drop in active users indicates weak product adoption at a relatively high ARR.
C-0B20DB64
- CSM: Dana Mercer | ARR: 21,770
- Renewal date used: 2026-10-07 (CZ and Chargebee agree; single-year)
- CZ=2026-10-07 and CB=2026-10-07; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 214/378 ≈ 0.5661 → 56.6%.
- 3-month usage trend (2026-06→07→08): 294→298→294; change = 294−294 = 0; percent change = 0/294 = 0.0% → mixed/flat.
- Risk: Low — over half the seats are used (56.6%) and 3‑month usage is flat with no net loss in active users.
C-0BBC4E7A
- CSM: Cole Ingram | ARR: 56,374
- Renewal date used: 2026-10-10 (CZ and Chargebee agree; single-year)
- CZ=2026-10-10 and CB=2026-10-10; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 228/337 ≈ 0.6766 → 67.7%.
- 3-month usage trend (2026-06→07→08): 142→141→139; change = 139−142 = −3; percent change = −3/142 ≈ −2.1% → down.
- Risk: Low — healthy utilization (67.7%) with only a small 2.1% 3‑month decline suggests stable value despite a mild downtick.
C-0FD551AB
- CSM: Elena Sinclair | ARR: 48,815
- Renewal date used: 2026-10-14 (CZ and Chargebee agree; single-year)
- CZ=2026-10-14 and CB=2026-10-14; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 210/376 ≈ 0.5596 → 55.9%.
- 3-month usage trend (2026-06→07→08): 123→122→126; change = 126−123 = +3; percent change = 3/123 ≈ 2.4% → mixed/flat (minor dip then recovery).
- Risk: Low — moderate utilization (55.9%) and slightly rising net usage (2.4%) point to steady engagement.
C-0F9F8F13
- CSM: Dana Mercer | ARR: 46,230
- Renewal date used: 2026-10-18 (CZ and Chargebee agree; single-year)
- CZ=2026-10-18 and CB=2026-10-18; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 199/352 ≈ 0.5653 → 56.5%.
- 3-month usage trend (2026-06→07→08): 185→185→182; change = 182−185 = −3; percent change = −3/185 ≈ −1.6% → down.
- Risk: Medium — utilization is only slightly above 56% and 3‑month usage is drifting down (−1.6%), indicating softening engagement that merits watch before renewal.
C-0BC34584
- CSM: Cole Ingram | ARR: 16,740
- Renewal date used: 2026-10-22 (CZ and Chargebee agree; single-year)
- CZ=2026-10-22 and CB=2026-10-22; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 327/494 ≈ 0.6619 → 66.2%.
- 3-month usage trend (2026-06→07→08): 104→104→106; change = 106−104 = +2; percent change = 2/104 ≈ 1.9% → up.
- Risk: Low — solid utilization (66.2%) with a slight upward trend in active users supports renewal.
C-0B7A7546
- CSM: Elena Sinclair | ARR: 35,062
- Renewal date used: 2026-10-25 (CZ and Chargebee agree; single-year)
- CZ=2026-10-25 and CB=2026-10-25; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 182/205 ≈ 0.8878 → 88.8%.
- 3-month usage trend (2026-06→07→08): 64→65→63; change = 63−64 = −1; percent change = −1/64 ≈ −1.6% → mixed/flat.
- Risk: Low — very high utilization (88.8%) with essentially flat 3‑month usage suggests strong embeddedness.
C-0B369871
- CSM: Dana Mercer | ARR: 85,128
- Renewal date used: 2026-10-29 (CZ and Chargebee agree; single-year)
- CZ=2026-10-29 and CB=2026-10-29; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 317/422 ≈ 0.7512 → 75.1%.
- 3-month usage trend (2026-06→07→08): 326→330→333; change = 333−326 = +7; percent change = 7/326 ≈ 2.1% → up.
- Risk: Low — strong utilization (75.1%) and a 2.1% 3‑month increase in active users support low renewal risk.
C-0B144C78
- CSM: Cole Ingram | ARR: 30,899
- Renewal date used: 2026-11-02 (CZ and Chargebee agree; single-year)
- CZ=2026-11-02 and CB=2026-11-02; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 169/224 ≈ 0.7545 → 75.4%.
- 3-month usage trend (2026-06→07→08): 101→101→106; change = 106−101 = +5; percent change = 5/101 ≈ 5.0% → up.
- Risk: Low — high utilization (75.4%) and a 5% 3‑month uplift in active users indicate healthy adoption.
C-0FC4DBB8
- CSM: Elena Sinclair | ARR: 94,732
- Renewal date used: 2026-11-05 (CZ and Chargebee agree; single-year)
- CZ=2026-11-05 and CB=2026-11-05; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 356/464 ≈ 0.7672 → 76.7%.
- 3-month usage trend (2026-06→07→08): 189→191→193; change = 193−189 = +4; percent change = 4/189 ≈ 2.1% → up.
- Risk: Low — strong utilization (76.7%) and steadily rising usage support a low‑risk renewal profile.
C-0D5BBE3A
- CSM: Dana Mercer | ARR: 39,740
- Renewal date used: 2026-11-09 (CZ and Chargebee agree; single-year)
- CZ=2026-11-09 and CB=2026-11-09; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 85/102 ≈ 0.8333 → 83.3%.
- 3-month usage trend (2026-06→07→08): 88→90→91; change = 91−88 = +3; percent change = 3/88 ≈ 3.4% → up.
- Risk: Low — very high utilization (83.3%) with a 3.4% increase in active users indicates strong product reliance.
C-0FB9D5AF
- CSM: Cole Ingram | ARR: 63,158
- Renewal date used: 2026-11-13 (CZ and Chargebee agree; single-year)
- CZ=2026-11-13 and CB=2026-11-13; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 144/199 ≈ 0.7236 → 72.4%.
- 3-month usage trend (2026-06→07→08): 173→173→176; change = 176−173 = +3; percent change = 3/173 ≈ 1.7% → up.
- Risk: Low — solid utilization (72.4%) and slightly increasing active users support renewal.
C-0B344485
- CSM: Elena Sinclair | ARR: 64,384
- Renewal date used: 2026-11-16 (CZ and Chargebee agree; single-year)
- CZ=2026-11-16 and CB=2026-11-16; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 224/287 ≈ 0.7805 → 78.0%.
- 3-month usage trend (2026-06→07→08): 238→240→244; change = 244−238 = +6; percent change = 6/238 ≈ 2.5% → up.
- Risk: Low — high utilization (78.0%) and steadily growing usage signal low churn risk.
C-0CB2C1B4
- CSM: Dana Mercer | ARR: 40,628
- Renewal date used: 2026-11-20 (CZ and Chargebee agree; single-year)
- CZ=2026-11-20 and CB=2026-11-20; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 386/473 ≈ 0.8161 → 81.6%.
- 3-month usage trend (2026-06→07→08): 47→48→49; change = 49−47 = +2; percent change = 2/47 ≈ 4.3% → up.
- Risk: Low — very strong utilization (81.6%) with a 4.3% 3‑month usage increase points to robust engagement.
C-22170CA1
- CSM: Cole Ingram | ARR: 45,646
- Renewal date used: 2026-11-24 (CZ and Chargebee agree; single-year)
- CZ=2026-11-24 and CB=2026-11-24; term_months=12 and is_multi_year=false, so I use the shared date.
- Seat utilization: 251/294 ≈ 0.8537 → 85.4%.
- 3-month usage trend (2026-06→07→08): 143→148→146; change = 146−143 = +3; percent change = 3/143 ≈ 2.1% → mixed/flat (uptick then minor pullback, net positive).
- Risk: Low — very high utilization (85.4%) and slightly positive net usage trend indicate low renewal risk.
SUMMARY OF DATE DISAGREEMENTS AND SYSTEM TRUSTED
- C-0B7D2C30: CZ=2026-09-10 vs CB=2026-09-15; is_multi_year=true (36 months) → trust Chargebee (multi-year dates known wrong in CZ).
- C-0BCDB8C2: CZ=2027-09-18 vs CB=2026-09-18; is_multi_year=true (36 months) → trust Chargebee.
- C-0D2AB865: CZ=2026-09-10 vs CB=2026-09-22; is_multi_year=true (24 months) → trust Chargebee.
- C-0BBE3E60: CZ=2027-09-26 vs CB=2026-09-26; is_multi_year=true (24 months) → trust Chargebee.
- C-0F5D2323: CZ=2026-09-10 vs CB=2026-09-29; is_multi_year=true (24 months) → trust Chargebee.
In all other cases, CZ and Chargebee dates match and Chargebee shows is_multi_year=false, so I treat the aligned date as reliable.
TOTALS (ARR RENEWING AND ARR AT RISK)
- Total ARR renewing over this 90-day window:
- Sum of ARR across all 20 accounts =
65,901 + 54,427 + 38,022 + 30,993 + 90,647 + 79,419 + 21,770 + 56,374 + 48,815 + 46,230 +
16,740 + 35,062 + 85,128 + 30,899 + 94,732 + 39,740 + 63,158 + 64,384 + 40,628 + 45,646
= 1,048,715.
- ARR at risk (Medium + High risk accounts):
- High-risk accounts and ARR:
- C-0B7D2C30: 65,901
- C-0BBE3E60: 30,993
- C-0BCDB8C2: 54,427
- C-0D2AB865: 38,022
- C-0EC6999D: 79,419
- C-0F5D2323: 90,647
High-risk ARR sum:
65,901 + 30,993 = 96,894
96,894 + 54,427 = 151,321
151,321 + 38,022 = 189,343
189,343 + 79,419 = 268,762
268,762 + 90,647 = 359,409
- Medium-risk accounts and ARR:
- C-0F9F8F13: 46,230
- Total ARR at risk (High + Medium):
359,409 (High) + 46,230 (Medium) = 405,639.
1) HRIS sync & user provisioning failures - Count: 12 tickets - Share: 12 / 80 = 0.15 (15.0%) - Distinct accounts: 3 (C-0B2213A9, C-0F6C0F34, C-0DDFC9A7) - ARR affected: - C-0B2213A9 = 36000.00 - C-0F6C0F34 = 30000.00 - C-0DDFC9A7 = 48000.00 - Total ARR = 36000 + 30000 + 48000 = 114000.00 - Example tickets: IC-460059, IC-460055 - Recommendation: Treat HRIS sync as a Tier-1 reliability project (alerts + regression tests) given concentration in C-0B2213A9, C-0F6C0F34, and C-0DDFC9A7. 2) Redemption checkout failures & gift card delivery issues - Count: 18 tickets - Share: 18 / 80 = 0.225 (22.5%) - Distinct accounts: 7 (C-0CEF69FD, C-0B827671, C-0FCCD2DF, C-0F876796, C-0D9CA315, C-14264ABD, C-0B0F1BAB) - ARR affected: - C-0CEF69FD = 8900.00 - C-0B827671 = 10700.00 - C-0FCCD2DF = 9600.00 - C-0F876796 = 8700.00 - C-0D9CA315 = 9600.00 - C-14264ABD = 11000.00 - C-0B0F1BAB = 10300.00 - Total ARR = 8900 + 10700 + 9600 + 8700 + 9600 + 11000 + 10300 = 68800.00 - Example tickets: IC-460025, IC-460030 - Recommendation: Harden redemption flows (timeouts, retries, idempotent gift-card sends) since failures span 7 accounts and 68800 ARR. 3) Billing & seat-count discrepancies (all C-0E9C27D1) - Count: 16 tickets - Share: 16 / 80 = 0.20 (20.0%) - Distinct accounts: 1 (C-0E9C27D1) - ARR affected: - C-0E9C27D1 = 52000.00 - Total ARR = 52000.00 - Example tickets: IC-460071, IC-460069 - Recommendation: Run a root-cause and one-off remediation for C-0E9C27D1’s invoicing/seats logic, then add guardrails so seat-count errors cannot recur over multiple invoices. 4) Missing or delayed points from recognitions - Count: 20 tickets - Share: 20 / 80 = 0.25 (25.0%) - Distinct accounts: 9 (C-0D3278C7, C-0BF20542, C-0D0B047C, C-0D284E42, C-0BE96399, C-0D6CC8E3, C-21FEBCBB, C-0DD0626C, C-0B2895EF) - ARR affected: - C-0D3278C7 = 3500.00 - C-0BF20542 = 4500.00 - C-0D0B047C = 4500.00 - C-0D284E42 = 3400.00 - C-0BE96399 = 2700.00 - C-0D6CC8E3 = 4200.00 - C-21FEBCBB = 2900.00 - C-0DD0626C = 2500.00 - C-0B2895EF = 2900.00 - Total ARR = 3500 + 4500 + 4500 + 3400 + 2700 + 4200 + 2900 + 2500 + 2900 = 31100.00 - Example tickets: IC-460004, IC-460016 - Recommendation: Add monitoring around recognition-to-points pipelines and backfill tooling to quickly correct balances across the 9 affected accounts. 5) Slack integration & slash command failures - Count: 14 tickets - Share: 14 / 80 = 0.175 (17.5%) - Distinct accounts: 4 (C-0B843542, C-10A56B0F, C-0BA71F12, C-8C2E8F00) - ARR affected: - C-0B843542 = 4400.00 - C-10A56B0F = 5400.00 - C-0BA71F12 = 3900.00 - C-8C2E8F00 = 5200.00 - Total ARR = 4400 + 5400 + 3900 + 5200 = 18900.00 - Example tickets: IC-460041, IC-460047 - Recommendation: Treat Slack app as a single integration surface (webhooks, auth, commands) and add health checks so disconnects and slash-command errors are detected before users.
1) C-11C31562
- Match count: 3/4 fields match the prospect.
• size_band: Mid-Market (prospect: Mid-Market → 1 match)
• use_case: employee_recognition (prospect: employee_recognition → +1 match, total 2)
• region: NA-West (prospect: NA-West → +1 match, total 3)
• industry: Manufacturing (prospect: Technology → 0 for this field; total remains 3/4)
- Fields driving similarity: size_band, use_case, region
2) C-64171065
- Match count: 3/4 fields match the prospect.
• industry: Technology (prospect: Technology → 1 match)
• size_band: Mid-Market (prospect: Mid-Market → +1 match, total 2)
• use_case: employee_recognition (prospect: employee_recognition → +1 match, total 3)
• region: NA-East (prospect: NA-West → 0 for this field; total remains 3/4)
- Fields driving similarity: industry, size_band, use_case
3) C-A13C193D
- Match count: 3/4 fields match the prospect.
• industry: Technology (prospect: Technology → 1 match)
• size_band: Mid-Market (prospect: Mid-Market → +1 match, total 2)
• region: NA-West (prospect: NA-West → +1 match, total 3)
• use_case: retention (prospect: employee_recognition → 0 for this field; total remains 3/4)
- Fields driving similarity: industry, size_band, region
Trailing window: 2026-03 through 2026-08 (all months in channel_spend.csv). PAID CHANNEL PERFORMANCE (trailing 6 months) Channel: paid_search - Spend: 6 months × $6,000 = $36,000 - SQMs: 40 SQMs (count of paid_search rows with sqm_date present) - SQOs: 18 SQOs (subset of those 40 with sqo_date present) - Cost per SQM: $36,000 ÷ 40 = $900 per SQM - Cost per SQO: $36,000 ÷ 18 ≈ $2,000 per SQO - SQM-to-SQO rate: 18 ÷ 40 = 0.45 = 45% - Pipeline amount: 18 SQOs × $40,000 each = $720,000 - Pipeline per dollar: $720,000 ÷ $36,000 = 20.0 Channel: linkedin_ads - Spend: 6 months × $4,000 = $24,000 - SQMs: 25 SQMs (count of linkedin_ads rows with sqm_date present) - SQOs: 8 SQOs (subset of those 25 with sqo_date present) - Cost per SQM: $24,000 ÷ 25 = $960 per SQM - Cost per SQO: $24,000 ÷ 8 = $3,000 per SQO - SQM-to-SQO rate: 8 ÷ 25 = 0.32 = 32% - Pipeline amount: 8 SQOs × $12,000 each = $96,000 - Pipeline per dollar: $96,000 ÷ $24,000 = 4.0 Channel: paid_social - Spend: 6 months × $3,000 = $18,000 - SQMs: 0 SQMs (no paid_social rows in contacts_first_touch.csv) - SQOs: 0 SQOs - Cost per SQM: undefined (spend > 0, SQMs = 0; cannot compute $/SQM) - Cost per SQO: undefined (SQOs = 0; cannot compute $/SQO) - SQM-to-SQO rate: undefined (SQMs = 0, SQOs = 0) - Pipeline amount: $0 (no SQOs) - Pipeline per dollar: $0 ÷ $18,000 = 0.0 Channel: webinars - Spend: 6 months × $1,500 = $9,000 - SQMs: 12 SQMs (count of webinars rows with sqm_date present) - SQOs: 5 SQOs (subset of those 12 with sqo_date present) - Cost per SQM: $9,000 ÷ 12 = $750 per SQM - Cost per SQO: $9,000 ÷ 5 = $1,800 per SQO - SQM-to-SQO rate: 5 ÷ 12 ≈ 0.4167 ≈ 41.7% - Pipeline amount: 5 SQOs × $12,000 each = $60,000 - Pipeline per dollar: $60,000 ÷ $9,000 ≈ 6.67 ORGANIC / NON-PAID CHANNEL PERFORMANCE (trailing 6 months) (“Volume” interpreted as SQM count.) Channel: organic_search - Volume (SQMs): 30 SQMs (count of organic_search rows with sqm_date present) - SQOs: 10 SQOs (subset of those 30 with sqo_date present) - SQO rate: 10 ÷ 30 = 0.3333 ≈ 33.3% - Pipeline: 10 SQOs × $9,000 each = $90,000 Channel: referral - Volume (SQMs): 15 SQMs (count of referral rows with sqm_date present) - SQOs: 6 SQOs (subset of those 15 with sqo_date present) - SQO rate: 6 ÷ 15 = 0.4 = 40% - Pipeline: 6 SQOs × $8,000 each = $48,000 DATA QUALITY FLAGS (SQO date precedes SQM date) Rows where sqo_date < sqm_date: - CT-000044, channel=linkedin_ads, sqm_date=2026-07-23, sqo_date=2026-07-18 - CT-000041, channel=linkedin_ads, sqm_date=2026-06-14, sqo_date=2026-06-09 REALLOCATION RECOMMENDATION (with sample-size context) Pipeline per dollar, paid channels: - paid_search: $720,000 ÷ $36,000 = 20.0 pipeline per $1 (18 SQOs) - webinars: $60,000 ÷ $9,000 ≈ 6.67 pipeline per $1 (5 SQOs) - linkedin_ads: $96,000 ÷ $24,000 = 4.0 pipeline per $1 (8 SQOs) - paid_social: $0 ÷ $18,000 = 0.0 pipeline per $1 (0 SQMs / 0 SQOs) Recommendation: - Reduce or pause paid_social (spend $18,000 with 0 SQMs, 0 SQOs, $0 pipeline). - Reallocate the freed $18,000 primarily toward paid_search (highest pipeline per dollar at 20.0 with 18 SQOs), with a smaller share to webinars (solid pipeline per dollar at ≈6.67 with 5 SQOs). - Maintain current linkedin_ads spend or modestly trim it if more budget is needed for paid_search/webinars, since its pipeline per dollar (4.0) trails both paid_search and webinars. Sample size / confidence: - Paid channels total SQOs: 18 (paid_search) + 8 (linkedin_ads) + 0 (paid_social) + 5 (webinars) = 31 SQOs. - Organic channels total SQOs: 10 (organic_search) + 6 (referral) = 16 SQOs. - Confidence: moderate. There are enough SQOs (31 paid, 16 organic) to see clear underperformance for paid_social and strong relative efficiency for paid_search, but differences between linkedin_ads and webinars, and fine-grained reallocations, should be treated as directional rather than definitive.
Battlecard: Rivally (updated) 1) One-line positioning Rivally is a points-based employee recognition platform with an engaging recognition feed, fast setup for mid‑market teams, and strong appeal to distributed EU enterprises that need multi-language support and EU data residency. [S02,S04,S12,S11,S15] 2) Pricing (with sources, dates, and conflicts) List pricing over time - 2026-01-20 pricing page: Rivally Recognition listed at $5 per user/month, annual billing required. [S03] - 2026-04-01 pricing page: Rivally pricing page still shows $5 per user/month for Recognition Starter tier. [S08] - 2026-08-12 pricing page: Rivally pricing page updated; Recognition Starter now $7 per user/month, annual billing required. [S17] Interpretation and conflict - There is a conflict between older pricing page entries ($5/user/mo on 2026-01-20 and 2026-04-01) and the newer entry ($7/user/mo on 2026-08-12). The newer 2026-08-12 pricing page is the best current indicator that Recognition Starter list price is now $7 per user/month on annual billing. [S03,S08,S17] Deal-level pricing examples (not list pricing) - In one 500-seat deal (call notes dated 2026-06-02), Rivally quoted $6.50 per user/month on an annual term. This is below the $7 list observed later on the 2026-08-12 pricing page. [S13,S17] - In a later deal (call notes dated 2026-08-14), a prospect reported Rivally quoting $7 per user/month list and offering a 15% discount for a 3-year term. [S18] Add-on pricing - Rivally launched “Rivally Pulse” as a lightweight engagement survey add-on on 2026-03-05. [S06] - On 2026-09-01, Rivally announced Rivally Pulse exiting beta and confirmed it is priced as an add-on, not bundled into base recognition pricing. [S23] 3) Where they win Recognition experience and core product fit - Reviewers consistently praise Rivally’s points-based recognition feed and describe it as engaging. [S02,S16] - A mid-market reviewer reported setup took under a week and Slack integration worked “out of the box,” indicating low implementation friction for mid-market teams using Slack. [S04] EU/multi-language strengths - An EU enterprise reviewer stated Rivally is strong for distributed EU teams and specifically praised its multi-language support. [S12] - Rivally hired an ex-Workday VP EMEA to lead European expansion, signaling investment in the region. [S11] - Rivally opened a Dublin office and announced EU data residency as generally available, further strengthening its appeal for EU buyers with data residency requirements. [S15] Support and reliability perception - A G2 review praised Rivally’s support response time as being under 4 hours. [S22] Collaboration ecosystem - Rivally announced a Microsoft Teams app v2 in public preview, indicating active investment in Teams-based workflows in addition to Slack. [S19,S04] 4) Where we win (how to position against Rivally) Analytics and reporting depth - Multiple reviews describe Rivally’s analytics and admin reporting as limited: one reviewer explicitly notes “limited analytics,” and another says reporting dashboards are basic compared to enterprise tools. [S02,S07] - A reviewer reports that Rivally’s admin tooling lags peers, reinforcing that analytics and admin UX are weaker points. [S16] - Another reviewer said migration off Rivally was hard because analytics exports are CSV-only, which can make deeper analysis and migrations more painful. [S20] - In at least one 800-seat deal, the prospect chose Bonusly over Rivally specifically citing analytics depth as the reason. [S25] → We should lean into analytics depth, flexible reporting, and ease of analysis/migration whenever buyers care about robust analytics or future portability. All negative analytics/admin claims above are grounded in third-party reviews; the win theme is supported by those reviews plus the documented 800-seat win citing analytics depth. [S02,S07,S16,S20,S25] Enterprise IT / admin efficiency - An enterprise reviewer reports that Rivally lacks SCIM provisioning and that manual user management is painful. [S10] - Another review states that Rivally’s admin console still lacks bulk recognition editing. [S24] → Where buyers care about automated user lifecycle management (e.g., SCIM) or bulk admin workflows, we should probe for pain around Rivally’s manual processes and missing bulk actions and position any of our strengths in IT integration and admin efficiency accordingly. All specific gaps cited here (no SCIM, no bulk editing) come directly from reviews. [S10,S24] Global rewards coverage (EMEA) - A TrustRadius review notes that Rivally’s rewards catalog in EMEA is thinner than its US catalog. [S14] → For globally distributed teams with significant EMEA populations, we should explore whether Rivally’s thinner EMEA rewards catalog is a concern and highlight any relative strengths we can credibly offer in EMEA coverage. [S14] 5) Objections and responses Objection: “Rivally’s recognition experience is better / more engaging.” - Facts: Reviewers praise Rivally’s points-based recognition feed and call it engaging. [S02,S16] - Response: Acknowledge this strength, then pivot to outcomes and measurability: use their documented weaknesses in analytics, admin tooling, and CSV-only exports to question whether a more engaging feed without strong analytics actually delivers measurable program impact or is easy to run over time. [S02,S07,S16,S20] Objection: “Rivally is cheaper.” - Facts: - Earlier pricing pages show Starter at $5 per user/month on annual billing (2026-01-20, still $5 on 2026-04-01). [S03,S08] - Newer pricing page (2026-08-12) shows Starter at $7 per user/month, annual billing required. [S17] - In a 500-seat deal, Rivally quoted $6.50/user/month on an annual term. [S13] - In a later deal, a prospect reported a $7/user/month list quote with a 15% discount for a 3-year term. [S18] - Response: Use the newer 2026-08-12 pricing page as the best signal that list pricing has moved up to $7/user/month and highlight that any headline discount needs to be evaluated against total cost of ownership—including manual admin work (no SCIM, no bulk editing) and limited analytics that can increase internal labor and make change harder later. [S10,S17,S18,S20,S24] Objection: “Rivally is better for EU / data residency and multi-language.” - Facts: - EU enterprise reviewer: strong for distributed EU teams with multi-language support praised. [S12] - Rivally opened a Dublin office and announced EU data residency GA. [S15] - They hired an ex-Workday VP EMEA to lead European expansion. [S11] - Response: Acknowledge that Rivally has invested in EU presence, data residency, and multi-language. Then re-center on whether their limited analytics, CSV-only exports, and admin gaps will constrain EU leaders who need to prove program impact and manage large, distributed user bases efficiently. [S02,S07,S16,S20] Objection: “Rivally’s support is very responsive.” - Fact: A G2 review reports support response times under 4 hours. [S22] - Response: Acknowledge this positive feedback, then steer the conversation toward long-term operational fit—analytics depth, provisioning, admin workflows, and migration flexibility—where reviews show Rivally is weaker. [S02,S07,S10,S16,S20] 6) Recent changes (what’s new) Capital and growth - On 2025-11-04, Rivally announced a $40M Series C round led by Northgate Ventures. [S01] - On 2026-05-09, Rivally hired an ex-Workday VP EMEA to lead European expansion. [S11] Product and packaging - On 2026-03-05, Rivally launched “Rivally Pulse,” a lightweight engagement survey add-on. [S06] - On 2026-09-01, Rivally announced that Rivally Pulse exited beta and confirmed it is priced as an add-on, not bundled with core recognition. [S23] - On 2026-08-20, Rivally announced Microsoft Teams app v2 in public preview. [S19] EU presence and compliance posture - On 2026-07-01, Rivally opened a Dublin office and announced EU data residency as generally available. [S15] Pricing evolution - Recognition Starter list price was $5/user/month on 2026-01-20 and still $5 on 2026-04-01. [S03,S08] - By 2026-08-12, the pricing page shows Recognition Starter at $7/user/month, annual billing required. [S17] 7) Our 12-month win/loss record against Rivally Data source and window - Source: deals_with_competitor.csv (no snippet id provided). - Time window in file: 2025-09 through 2026-08 (inclusive), all rows with competitor = “Rivally”. Arithmetic - Wins (outcome = “win”): - Deals: Deal-A9FD43 (2025-10), Deal-7AA785 (2025-11), Deal-44C524 (2025-12), Deal-0D0CD6 (2026-01), Deal-D5B790 (2026-02), Deal-5C636E (2026-03), Deal-67BE14 (2026-06), Deal-1B6969 (2026-07), Deal-F03E7B (2026-08), Deal-072E31 (2025-09), Deal-F65C8F (2025-10), Deal-E46EAB (2026-01), Deal-1D2392 (2026-02). - Count of wins = 13 (there are 13 rows with outcome = “win”). - Losses (outcome = “loss”): - Deals: Deal-7767F5 (2025-09), Deal-5645A5 (2026-04), Deal-C6FFAA (2026-05), Deal-D263E0 (2025-11), Deal-935746 (2025-12), Deal-9066A6 (2026-03), Deal-72A02F (2026-04). - Count of losses = 7 (there are 7 rows with outcome = “loss”). - Total Rivally-competitive deals in this 12-month window = 13 wins + 7 losses = 20. Result - 12-month record vs Rivally (2025-09 to 2026-08): 13 wins, 7 losses, 20 total deals. (Source: deals_with_competitor.csv; arithmetic shown above. No snippet id was provided for this file.) 8) Unverified or contradicted items from old battlecard - Old claim: “Rivally lacks a Slack integration.” - Contradicted: a mid-market reviewer reports that Slack integration worked out of the box. [S04] - Status: UNVERIFIED / INCORRECT based on available snippets. - Old claim: “Rivally was acquired by WorkHuman in 2025.” - No snippet in competitor_snippets.csv mentions an acquisition by WorkHuman; instead, Rivally raised a $40M Series C in 2025 and later hired an ex-Workday VP EMEA. [S01,S11] - Status: UNVERIFIED (no supporting snippet; available data suggests they continued as an independent company raising capital).
Per-sequence performance (totals): New Logo Nurture - Sent: 500+458+428 = 1,386 - Open rate: 490/1,386 = 35.35% - Reply rate: 90/1,386 = 6.49% - Meeting rate: 27/1,386 = 1.95% - Weakest step: 3 (18/428 = 4.21% reply) Expansion Nurture - Sent: 300+300+275 = 875 - Open rate: 565/875 = 64.57% - Reply rate: 59/875 = 6.74% - Meeting rate: 12/875 = 1.37% - Weakest step: 3 (12/275 = 4.36% reply) Cold Outbound - HR Leaders - Sent: 600+595+590 = 1,785 - Open rate: 545/1,785 = 30.53% - Reply rate: 8/1,785 = 0.45% - Meeting rate: 0/1,785 = 0.00% - Weakest step: 3 (1/590 = 0.17% reply) Cold Outbound - People Ops - Sent: 400+386+377 = 1,163 - Open rate: 340/1,163 = 29.23% - Reply rate: 29/1,163 = 2.49% - Meeting rate: 6/1,163 = 0.52% - Weakest step: 3 (6/377 = 1.59% reply) Tracking errors - Expansion Nurture, step 2: opened 340 > sent 300. That is impossible without double-counting or missing sent data. Audience overlap (examples) - CT-000301 is in Expansion Nurture and New Logo Nurture. - CT-000624 is in Expansion Nurture and New Logo Nurture. - CT-000890 is in Cold Outbound - HR Leaders and Cold Outbound - People Ops. - CT-001285 is in Cold Outbound - HR Leaders and Cold Outbound - People Ops. Failure modes (<2% reply) - Cold Outbound - HR Leaders (0.45% overall; all steps <1%): opens ~30% show deliverability/list are OK; value prop/CTA are not compelling and no meetings are being asked/secured effectively. - Cold Outbound - People Ops step 3 (1.59% reply): late-touch follow-up isn’t adding new value; it’s a weak bump rather than a different angle. One change per weak sequence + priority 1) Cold Outbound - HR Leaders (fix first): completely rewrite step 1–3 messaging around a sharp HR pain + specific, low-friction CTA to test if this is a messaging vs. targeting problem. 2) Cold Outbound - People Ops: replace step 3 with a distinctly different follow-up (new problem framing or channel) instead of another similar nudge.
Quarter timing - Days in quarter: 92 - Days elapsed: 66 - Fraction elapsed = 66 / 92 = 0.7173913043 (≈71.7%) Metrics (direction from targets.csv; QTD actuals from marketing_qtd.csv) 1) SQMs (higher_better) - QTD actual: 230 - Target (full-quarter): 300 - Delta vs target: 230 − 300 = −70 - Expected by now if on pace: 300 × 0.7173913043 = 215.2173913 - Pace: ahead (230 actual > 215.217 expected) 2) SQOs (higher_better) - QTD actual: 84 - Target (full-quarter): 120 - Delta vs target: 84 − 120 = −36 - Expected by now if on pace: 120 × 0.7173913043 = 86.08695652 - Pace: behind (84 actual < 86.08695652 expected) 3) DS2s (higher_better) - QTD actual: 40 - Target (full-quarter): 75 - Delta vs target: 40 − 75 = −35 - Expected by now if on pace: 75 × 0.7173913043 = 53.80434782 - Pace: behind (40 actual < 53.80434782 expected) 4) Closed-lost MIA rate (lower_better) - Inputs from marketing_qtd.csv: - closed_lost_total: 25 - closed_lost_mia: 5 - QTD actual rate: 5 ÷ 25 = 0.2 - Target rate: 0.1 - Delta vs target: 0.2 − 0.1 = 0.1 above target (worse, since lower is better) - Pace: behind (actual rate 0.2 > target 0.1; being above the ceiling is off-track at this point in the quarter) 5) Same-quarter closes (higher_better) - QTD actual: 10 - Target (full-quarter): 20 - Delta vs target: 10 − 20 = −10 - Expected by now if on pace: 20 × 0.7173913043 = 14.34782609 - Pace: behind (10 actual < 14.34782609 expected) 6) Active pipeline (higher_better) - QTD actual: 3,000,000 - Target (full-quarter): 4,000,000 - Delta vs target: 3,000,000 − 4,000,000 = −1,000,000 - Expected by now if on pace: 4,000,000 × 0.7173913043 = 2,869,565.217 - Pace: ahead (3,000,000 actual > 2,869,565.217 expected) Summary of what moved this week (within limits of the data) Only a single QTD snapshot is provided (no prior-week file), so I cannot quantify exact week-over-week changes. Based on the current QTD position at 66/92 days (~71.7% of the quarter), SQMs and active pipeline are ahead of time-based pace but still below full-quarter targets, while SQOs, DS2s, and same-quarter closes are behind pace and materially under their end-of-quarter goals, and the closed-lost MIA rate is elevated at 0.2 vs the 0.1 target (5 MIAs out of 25 closed-lost). This implies that, as of this week’s checkpoint, top-of-funnel marketing volume and overall pipeline dollars are comparatively strong, but conversion into SQOs/DS2s and in-quarter closes, plus better MIA discipline on closed-losts, are the main gaps to address.
Q3 weighted forecast is 115,976.75 on 54 of 86 in-quarter deals, using 100% of 44,729 COMMIT and 35% of 203,565 BEST_CASE (71,247.75), with PIPELINE at 0 and 32 deals totaling 227,575 excluded for October close dates. Owner is blank on 85 of 86 deals and why-buys is empty on 71 of 86 (including all 7 COMMIT), and 32 close dates are in October at DS2 or DS3, so the forecast appears precise but rests on weak data quality.
Hi team, Following up on my August 5 email recapping the July 28 demo and pricing for 150 seats. Does the People team feel ready to move this forward, or is there anything blocking a decision that I can clarify? If helpful, I can set up a quick call this week to review the pricing and confirm next steps. Best, Alex Franklin
Marketing — SQMs landed slightly below goal this week at 46 against a target of 52, leaving a gap of 6 SQMs (52 - 46 = 6). Webinars were a bright spot, contributing 18 of the 46 SQMs (18 ÷ 46 ≈ 0.39, ~39% of weekly volume). Cost per SQM on paid search held steady at 150 dollars, keeping acquisition efficiency predictable while we look to close the SQM gap next week. Sales — Sales converted 14 SQOs and set 9 DS2 meetings, maintaining momentum in qualified pipeline progression. New pipeline created came in at 310000 dollars, giving the team fresh coverage to work. Same-quarter close count for the week was 3, so near-term revenue impact is concentrated in a small set of deals while the new 310000 dollars in pipeline matures through the stages. CS — CS saved 2 renewals this week, directly protecting existing ARR. Team NPS moved to 61, signaling a solid experience baseline to build from. There are 3 open red-flag accounts heading into next week, so focus will be on converting those 3 from risk back into stable status while continuing to reinforce the behaviors that are supporting the current NPS of 61. PLG — PLG added 412 new signups with activation at 31 percent, pairing strong top-of-funnel with meaningful early product engagement. At 31 percent activation on 412 signups, roughly one in three signups is reaching first value (0.31 × 412). In addition, 38 companies hit the “aha” moment of 10 recognition gives, giving Sales and CS a clear subset of product-qualified companies to engage more deeply.
Apex Rewards Co (active) - Activity: Co-webinar locked for 09-15; two sourced opps this period, both in DS1 per #partners Slack. - Partner-sourced pipeline: 2 deals — Deal-DDAAF2 (180000) + Deal-2CF33E (95000) = 275000 total. HRCloud Partners (active) - Activity: Integration referral unblocked security review and opp moved to DS2; one sourced opp this period per #partners Slack. - Partner-sourced pipeline: 1 deal — Deal-F1CDA5 (140000) = 140000 total. CultureBridge (active) - Activity: Lunch-and-learn produced two sourced opps; both early stage per #partners Slack. - Partner-sourced pipeline: 2 deals — Deal-096E1D (60000) + Deal-067213 (75000) = 135000 total. WorkWell Group (active) - Activity: Planning call booked for 09-09 to restart the joint playbook in Q4; no sourced deals this period per #partners Slack. - Partner-sourced pipeline: 0 deals = 0 total. Recogniq (quiet) - Quiet this period; no partner-sourced deals in partner_deals.csv (0 deals = 0 total). KudosWave (quiet) - Quiet this period; no partner-sourced deals in partner_deals.csv (0 deals = 0 total). PeopleFirst Advisors (quiet) - Quiet this period; no partner-sourced deals in partner_deals.csv (0 deals = 0 total). TotalPerk (quiet) - Quiet this period; no partner-sourced deals in partner_deals.csv (0 deals = 0 total).
Q1: Yes. All customer data is encrypted at rest using AES-256. [P1] Q2: Yes. Data in transit is encrypted using TLS 1.2 or higher. [P1] Q3: Yes. Bonusly maintains a SOC 2 Type II report, renewed annually. A copy is available to prospects under NDA. [P2] Q4: Customer data is retained for the duration of the contract plus 90 days, after which it is deleted from production systems. (Retention period = contract term + 90 days.) [P3] Q5: The current subprocessor list is published at trust.bonusly.com, and customers receive 30 days’ notice before a new subprocessor is added. [P4] Q6: Yes. SAML 2.0 single sign-on is supported on the Enterprise plan. [P5] Q7: Production databases are backed up daily, and those encrypted backups are retained for 35 days. (Backup schedule = once per day; retention period = 35 days.) [P6] Q8: Unanswerable from the provided excerpts. None of [P1], [P2], [P3], [P4], [P5], [P6], [P7], or [P8] mentions ISO 27001. This would typically be documented in a formal security certifications or compliance attestation document. Q9: Unanswerable from the provided excerpts. None of [P1], [P2], [P3], [P4], [P5], [P6], [P7], or [P8] specifies any contractual uptime SLA percentage. This would normally be defined in the master subscription agreement and/or a service level agreement (SLA) document. Q10: Unanswerable from the provided excerpts. None of [P1], [P2], [P3], [P4], [P5], [P6], [P7], or [P8] states whether Bonusly will sign a HIPAA Business Associate Agreement. This would typically be covered in a HIPAA-specific addendum or Business Associate Agreement document.
(1) ALWAYS-trigger phrases that overlap/duplicate 1.1 - Severity: WARNING - Action: REVIEW - Finding: `pipeline-intelligence-report` and `weekly-pipeline-report` both claim ALWAYS triggers on overlapping “pipeline” phrases: - `pipeline-intelligence-report`: ALWAYS for “run the pipeline report”, “pipeline review”, “pipeline intelligence”, “score the pipeline”, “full pipeline”, “pipeline update”, “what's the pipeline look like”. - `weekly-pipeline-report`: ALWAYS for “run the pipeline update”, “weekly pipeline report”, “pipeline summary”, “mid-month pipeline check”, “generate the pipeline report”, “do the pipeline report”, “update the pipeline”, “what does pipeline look like”. - Overlaps: generic “pipeline report”, “pipeline update”, “what does/what's pipeline look like”. - Proposal: Clarify lane markers so generic phrases like “pipeline report / pipeline update / what does the pipeline look like” route to exactly one of these skills (e.g., tie “weekly”/time-bounded asks to `weekly-pipeline-report`, and “full scored/tiered view” asks to `pipeline-intelligence-report` only). (2) Circular delegation chains between skills 2.1 - Severity: WARNING - Action: UPDATE_BODY - Finding: Circular delegation between `deal-strategy-coach` and `email-drafter`: - `deal-strategy-coach` explicitly says: “When drafting manager-to-prospect emails, use the `email-drafter` skill…” - `email-drafter` lane marker says: “For deal strategy, diagnosis, or coaching (not email drafting), use `deal-strategy-coach` instead.” - Proposal: Break the cycle by making one skill primary and the other subordinate. For example, keep `deal-strategy-coach` as the strategy owner that MAY optionally suggest `email-drafter`, but remove or soften `email-drafter`’s instruction to route strategy questions back to `deal-strategy-coach` (or vice versa), so an orchestrator cannot ping-pong indefinitely. (3) Delegation targets that do not exist in the manifest (dangling) 3.1 - Severity: WARNING - Action: REVIEW - Finding: `analysis-validator` delegates to specialist skills that are not present in `skill_manifest.csv` and have no SKILL.md in the provided 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` - Proposal: Either (a) add these eight skills to the manifest and ensure their SKILL files exist, or (b) update `analysis-validator` to remove/replace these delegations if those skills are deprecated. 3.2 - Severity: WARNING - Action: REVIEW - Finding: `comms-drafter` instructs “Before drafting any communication, apply the `bonusly-brand` skill,” but `bonusly-brand` is not in the manifest and no SKILL file was provided. - Proposal: Either add `bonusly-brand` to the manifest and ensure the SKILL exists, or update `comms-drafter` to reference an actually-available brand skill. 3.3 - Severity: WARNING - Action: REVIEW - Finding: `deal-strategy-coach` delegates to `prospect-research-multithreading` (“Invoke prospect-research-multithreading whenever…”) but that skill is not in the manifest, and no SKILL file is present in the provided set. - Proposal: Add `prospect-research-multithreading` to the manifest (with its SKILL) or adjust `deal-strategy-coach` to use a different, existing contact-research skill. 3.4 - Severity: WARNING - Action: REVIEW - Finding: `email-drafter` delegates to two skills not present in the manifest: - `bonusly-brand` (tone/brand gate) - `prospect-research-multithreading` (contact lookup) - Proposal: Align with manifest by either adding these skills, or revising `email-drafter` to call only skills that actually exist in this skill set. 3.5 - Severity: WARNING - Action: REVIEW - Finding: `pipeline-intelligence-report` references and depends on the `signalforge-reports` org skill and on `skill-orchestrator`: - “Read `/mnt/skills/organization/signalforge-reports/SKILL.md`…” - “The signalforge-reports org skill supersedes it…” - Mentions `skill-orchestrator` as the controller. Neither `signalforge-reports` nor `skill-orchestrator` appear in the manifest or in the provided SKILL files. - Proposal: Add `signalforge-reports` and `skill-orchestrator` to the manifest (and repository) or rewrite references in `pipeline-intelligence-report` to avoid depending on undeclared skills. 3.6 - Severity: WARNING - Action: REVIEW - Finding: `sales-forecast` references `bonusly-brand` as a required brand/voice skill, which is not in the manifest and has no SKILL file here. - Proposal: Either add `bonusly-brand` to the manifest and codebase or update `sales-forecast` to reference a different, existing brand/voice skill. 3.7 - Severity: WARNING - Action: REVIEW - Finding: `signalforge-claim-compressor` references `caveman` (“Forked and redesigned from JuliusBrussee/caveman…”) as a related compression skill and suggests they can be used together, but `caveman` is not in the manifest and no SKILL file is provided. - Proposal: Clarify whether `caveman` is a separate skill that should be added to the manifest; if not, remove the operational instruction to “use both together” to avoid an unavailable dependency. 3.8 - Severity: WARNING - Action: REVIEW - Finding: `signalforge-feedback` mentions `skill-orchestrator` as the component that registers it as a terminal step, but `skill-orchestrator` is not present in the manifest or skill set here. - Proposal: Either declare `skill-orchestrator` as a skill in the manifest, or rephrase `signalforge-feedback` to describe orchestration behavior without assuming a named skill that doesn’t exist in this set. (4) Version conflicts 4.1 - Severity: INFO - Action: REVIEW - Finding: No version conflicts detected between manifest and SKILL bodies in the provided data: - Manifest does not carry a `version` field; SKILL bodies do have internal versions (e.g., `analysis-validator` v3.6, `pipeline-intelligence-report` “v6 · May 2026”), but there is no second, conflicting version reference for the same skill. - Proposal: No change required; if version governance is desired, add an explicit `version` column to `skill_manifest.csv` so that manifest vs SKILL discrepancies can be detected in the future. (5) Manifest descriptions exceeding 1,024 characters 5.1 - Severity: INFO - Action: REVIEW - Finding: None of the manifest `description_chars` values exceed 1,024: - Max description length in `skill_manifest.csv` is 1,006 characters (`pipeline-intelligence-report` and `signalforge-claim-compressor` both at 1006). - For each row (examples): 656, 897, 996, 792, 965, 676, 945, 1004, 1006, 962, 1006, 708, 762, 656. - Arithmetic: max(656,897,996,792,965,676,945,1004,1006,962,1006,708,762,656) = 1006 < 1024; count of rows >1024 = 0. - Proposal: No trimming required; keep monitoring if future descriptions creep above 1,024 and then apply TRIM_DESC at that point. (6) Hardcoded page IDs, dates, or person names in skill bodies 6.1 – Confluence / Atlassian page and folder IDs - Severity: WARNING - Action: UPDATE_BODY - Finding: Multiple skills contain hardcoded Confluence cloud IDs, space IDs, page IDs, and folder IDs: - `partner-digest`: hardcodes Cloud ID `73fe98de-a4a3-4869-9f8a-bb1eeed4cf7f`, Space ID `1958248479`, folder ID `2286616609`, and full folder URL. - `signalforge-feedback`: hardcodes Feedback Log page ID `2295136266`, Space ID `2232811524`, parent page ID `2234417154`, same Cloud ID. - `sales-forecast`: hardcodes Confluence space/page IDs and Cloud ID for forecast pages. - `pipeline-intelligence-report`: hardcodes reference paths under `/mnt/skills/organization/signalforge-reports/`. - `weekly-pipeline-report`: hardcodes that HTML lives under `/mnt/user-data/outputs/` and references external spec files by path. - Proposal: Centralize Confluence/Atlassian IDs and similar environment-specific identifiers in one configuration or reference skill, and have these skills refer to that central source rather than embedding IDs and URLs directly in their bodies. 6.2 – Other external/system IDs (HubSpot org, Slack channels, Sheets IDs, Snowflake paths) - Severity: WARNING - Action: REVIEW - Finding: Several skills embed hardcoded environment IDs that may drift: - `pipeline-intelligence-report`: HubSpot org ID `1973303` and Snowflake paths (e.g., `PRODUCTION.HUBSPOT.HS_ENGAGEMENTS_ENRICHED`, `FIVETRAN.FIVETRAN_RECOGNITION_BONUSLY_PRODUCTION`). - `stale-pipeline-report`: Slack channel ID `C0561C1JCPJ` for `#revops-team`, HubSpot pipeline and stage IDs, Snowflake table paths. - `weekly-pipeline-report`: Google Sheets IDs `1CLZeOsElVDF_LF0ZG_t2nfwvhnZ6bpwqM_nX3WEYzcw` and `1ENuaEcCuLjdKhMvp8FK3Ys1ek5Aw9ZuOZhsHJJFoB_k`. - Proposal: Review which IDs are intended to be stable constants vs. deployment-specific. For anything deployment-specific, extract them into a config/metadata layer rather than hardcoding in skill text. 6.3 – Hardcoded dates that can become stale - Severity: WARNING - Action: UPDATE_BODY - Finding: Several skills embed calendar dates as part of their logic or documentation: - `analysis-validator`: “Created: April 26, 2026”, “Last Updated: May 9, 2026 (v3.6…)”, “As of May 2026” expected ranges, “Updated May 4, 2026” for certain fields. - `closed-lost-analysis`: references “the 30-deal AI-field sample from May 2026”, and multiple examples anchored to specific months/years. - `partner-digest`: references example issues like “May 16, 2026” and changelog entries dated 2026-05-17. - `sales-forecast`: changelog entries tied to April 27, 2026, and references to Q2-specific context. - `weekly-pipeline-report`: static Q1 2026 context values (Q1 bookings actual vs plan/forecast). - Proposal: For logic that depends on “as of <date>” ranges or static quarter context, refactor to derive current context at runtime (queries & configuration) and keep past dates only in changelog sections clearly marked as historical. 6.4 – Hardcoded person names and rosters - Severity: INFO - Action: REVIEW - Finding: Multiple skills encode specific people and roles: - `analysis-validator`: Business Intelligence Layer includes full GTM team roster (AE, CSM, leadership, RevOps; e.g., “Bryce Harmon”, “Dana Mercer”, “Alaina Loori”, “Amani Phipps”). - `closed-lost-analysis`: references specific companies/people and deal examples (e.g., “Softheon”, “Estee Lauder”, “LIFTOFF”, “Nestlé”, “Aurora Innovation”, “Ethos Cannabis”, “StickerYou”, “GCash”). - `partner-digest`: “Owner: Amani Phipps (RevOps / Partnerships)”. - `weekly-pipeline-report`: “Weekly Pipeline Report — Ben Lavin · Demand Generation · Bonusly”. - `sales-forecast`: refers to specific leadership roles (e.g., Alaina / VP Sales). - Proposal: Review whether these hardcoded names are stable, intended domain knowledge (e.g., leadership/roster reference) vs. implementation details that should be injected from a separate roster/metadata skill. Where roles change frequently, prefer role labels and an external roster source over embedding names directly in the procedural text. (7) Manifest drift in both directions 7.1 - Severity: INFO - Action: REVIEW - Finding: No manifest drift visible in the provided data: - Manifest rows (14): `analysis-validator`, `closed-lost-analysis`, `comms-drafter`, `deal-strategy-coach`, `email-drafter`, `model-selection`, `next-to-close`, `partner-digest`, `pipeline-intelligence-report`, `sales-forecast`, `signalforge-claim-compressor`, `signalforge-feedback`, `stale-pipeline-report`, `weekly-pipeline-report`. - Provided SKILL files: the same 14 names, one `.SKILL.md` per manifest entry. - Arithmetic: |manifest| = 14, |files| = 14, |intersection| = 14 → 0 files without manifest rows; 0 manifest rows without files. - Proposal: No DELETE_SKILL or MERGE actions needed based on manifest/file presence; keep this reconciliation check in place for future additions.
Runbook: Incident #incident-2026-08-29-reward-queue (resolved)
Step 1 – Acknowledge PagerDuty alert and assign IC
- Source message: [M01] 2026-08-29 14:02:10Z
- Actor: Bryce Harmon
- Action taken: Acknowledged PagerDuty alert for “reward-worker queue depth > 10k” and took incident commander (IC) role.
- Command used: None (process/ownership action only).
- Success verification: Not explicitly documented; thread only states that Bryce acknowledged and took IC. Needs confirmation if a specific check or PagerDuty UI state was used.
- Rollback: N/A (no system state change; process/role assignment only).
Step 2 – Check reward-worker queue depth
- Source message: [M02] 2026-08-29 14:04:33Z
- Actor: Farid Osman
- Action taken: Checked Sidekiq queue depth for reward-worker queue.
- Command used:
- `bundle exec rake sidekiq:queue_depth`
- Observed result: Reward queue at 48,213 pending jobs; normal is under 500.
- Success verification: N/A (diagnostic/observation step only; no target state defined beyond reporting the value).
- Rollback: N/A (read-only diagnostic command; no state change).
Step 3 – Inspect Sidekiq dead set for errors
- Source message: [M03] 2026-08-29 14:06:02Z
- Actor: Farid Osman
- Action taken: Inspected Sidekiq dead set to understand failed jobs.
- Command used: Not specified in the thread. Needs confirmation (e.g., exact Rails/Sidekiq console or CLI invocation is not documented).
- Observed result: Dead set has 112 jobs, all `Redis::TimeoutError` from around 13:58.
- Success verification: N/A (diagnostic/observation step only; no target state change).
- Rollback: N/A (no state change; read-only inspection).
Step 4 – Pause auto recognition enqueueing via feature flag
- Source message: [M04] 2026-08-29 14:08:45Z
- Actor: Farid Osman
- Action taken: Paused enqueueing to “stop the bleed” by disabling the `:auto_recognition_enqueue` feature flag.
- Command used:
- `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'`
- Intended effect: Stop new jobs from being enqueued into the reward queue.
- Success verification: Not explicitly documented in the thread for this specific change. Later messages show the queue depth decreasing and eventually reaching 0, but there is no step-specific confirmation that disabling the flag succeeded (e.g., no log, console output, or flag-status check is shown). Needs confirmation.
- Rollback:
- Documented in-thread rollback command:
- `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'`
- This appears in [M04] as “Rollback if needed.”
Step 5 – Clear Sidekiq dead set
- Source message: [M05] 2026-08-29 14:15:20Z
- Actor: Elena Sinclair
- Action taken: Cleared out the Sidekiq dead set while in the console.
- Command used: Not specified in the thread. Needs confirmation (exact console/command sequence is not documented).
- Observed result: Not explicitly quantified; only the action “cleared out the dead set” is documented.
- Success verification: Not explicitly documented for this step alone. Later [M08] reports `bundle exec rake sidekiq:queue_depth` returns 0 and error rate in Datadog is back to baseline, which is consistent with successful resolution, but the thread does not attribute a specific verification directly to the dead-set clear. Needs confirmation if a dead-set-specific check was performed.
- Rollback: Not documented in the thread. Needs confirmation (no explicit way to restore cleared dead jobs is described).
Step 6 – Scale reward-worker deployment up to increase processing capacity
- Source message: [M06] 2026-08-29 14:21:07Z
- Actor: Bryce Harmon
- Action taken: Increased the number of reward-worker replicas to speed up processing of the backlog.
- Command used:
- `kubectl scale deployment/reward-worker --replicas=6`
- Additional context from thread: “(was 3)” – indicates replicas were increased from 3 to 6.
- Success verification:
- [M07] 2026-08-29 14:33:41Z (Farid): “Queue depth down to 9,400 and falling ~1,200/min.” This shows improved drain rate after scaling.
- [M08] 2026-08-29 14:47:55Z (Cole): `bundle exec rake sidekiq:queue_depth` returns 0 and error rate in Datadog is back to baseline.
- These messages jointly indicate that scaling up contributed to successfully draining the queue, but there is no explicit kubectl output or pod-count check documented. Any direct verification of replica count needs confirmation.
- Rollback:
- Documented in-thread rollback command:
- `kubectl scale deployment/reward-worker --replicas=3`
- This appears in [M06] as “Rollback: `kubectl scale deployment/reward-worker --replicas=3`.”
Step 7 – Re-check queue depth and drain rate
- Source message: [M07] 2026-08-29 14:33:41Z
- Actor: Farid Osman
- Action taken: Assessed current reward-worker queue depth and its rate of change after earlier mitigations.
- Command used: Not specified in the thread. It is not stated which exact tool or command was used to obtain “Queue depth down to 9,400 and falling ~1,200/min.” Needs confirmation.
- Observed result: “Queue depth down to 9,400 and falling ~1,200/min.”
- Success verification: N/A as a separate step; this is itself a verification/monitoring action summarizing the system state at that time.
- Rollback: N/A (no state change; observation only).
Step 8 – Verify queue is empty and error rate is back to baseline
- Source message: [M08] 2026-08-29 14:47:55Z
- Actor: Cole Ingram
- Action taken: Verified that the queue backlog was fully drained and that errors had returned to normal levels.
- Commands / tools used:
- `bundle exec rake sidekiq:queue_depth`
- Datadog (error-rate monitoring; specific dashboard or query not specified — needs confirmation if required).
- Observed result:
- `bundle exec rake sidekiq:queue_depth` now returns 0.
- Error rate in Datadog back to baseline.
- Success verification: This step is explicitly a verification step confirming that:
- Reward-worker queue depth is 0.
- Error rate has returned to baseline in Datadog.
- Rollback: N/A (no state change; verification and observation only).
Step 9 – Re-enable auto recognition enqueueing
- Source message: [M09] 2026-08-29 14:49:10Z
- Actor: Bryce Harmon
- Action taken: Re-enabled enqueueing that had been paused earlier by turning the feature flag back on.
- Command used:
- `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'`
- Observed result / success verification:
- Documented in [M09]: “Verified 40 new jobs processed cleanly in the next 3 minutes.”
- This indicates that after re-enabling enqueue, 40 new jobs were successfully processed without errors over a 3-minute window.
- Rollback: Not explicitly documented in the thread for this specific re-enable step. Needs confirmation.
- Note: The disable command `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` appears in [M04], but the thread does not explicitly state that it should be used as rollback for this step.
Step 10 – Scale reward-worker deployment back down and confirm resolution
- Source message: [M10] 2026-08-29 14:55:00Z
- Actor: Bryce Harmon
- Action taken: Reduced reward-worker replicas after backlog was cleared and system stabilized; also declared incident resolution.
- Command used:
- `kubectl scale deployment/reward-worker --replicas=3`
- Observed result / success verification:
- “Queue stable at 0.”
- “Incident resolved.”
- This indicates that after scaling down, the queue remained empty, supporting that the system was healthy at the lower replica count.
- Rollback: Not explicitly documented in the thread for this specific scale-down step. Needs confirmation (no explicit “rollback to replicas=6” or similar is stated).
First error and service/job involved
- First error in the slice:
- 2026-09-03T14:01:12Z, service=reward-service, level=ERROR
- Message: "Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s"
- Service: reward-service
- Job involved (by name in subsequent error lines): RewardGiveJob
Cascade in order (by timestamp)
1) Redis connectivity failure in reward-service
- 2026-09-03T14:01:12Z, reward-service, ERROR
"Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s"
2) RewardGiveJob retries exhaust in reward-service
- 2026-09-03T14:01:20Z, reward-service, ERROR
"Redis::TimeoutError: retry exhausted for RewardGiveJob"
- 2026-09-03T14:01:30Z, reward-service, ERROR
"Redis::TimeoutError: retry exhausted for RewardGiveJob"
- 2026-09-03T14:01:40Z, reward-service, ERROR
"Redis::TimeoutError: retry exhausted for RewardGiveJob"
3) Sidekiq starts failing RewardGiveJob due to Redis::TimeoutError and retrying
- 2026-09-03T14:01:40Z, sidekiq, ERROR
"RewardGiveJob failed: Redis::TimeoutError; retrying in 60s"
- 2026-09-03T14:02:28Z, sidekiq, ERROR
"RewardGiveJob failed: Redis::TimeoutError; retrying"
- 2026-09-03T14:03:31Z, sidekiq, ERROR
"RewardGiveJob failed: Redis::TimeoutError; retrying"
- 2026-09-03T14:04:22Z, sidekiq, ERROR
"RewardGiveJob failed: Redis::TimeoutError; retrying"
- 2026-09-03T14:05:26Z, sidekiq, ERROR
"RewardGiveJob failed: Redis::TimeoutError; retrying"
- 2026-09-03T14:06:47Z, sidekiq, ERROR
"RewardGiveJob failed: Redis::TimeoutError; retrying"
4) Reward queue backlog builds up
- 2026-09-03T14:02:30Z, sidekiq, WARN
"Queue reward depth above 10,000"
5) API-layer 502s from reward-service
- 2026-09-03T14:03:05Z, api-gateway, ERROR
"502 upstream timeout calling reward-service /gives"
- 2026-09-03T14:03:48Z, api-gateway, ERROR
"502 upstream timeout calling reward-service"
- 2026-09-03T14:04:13Z, api-gateway, ERROR
"502 upstream timeout calling reward-service"
- 2026-09-03T14:05:16Z, api-gateway, ERROR
"502 upstream timeout calling reward-service"
- 2026-09-03T14:06:52Z, api-gateway, ERROR
"502 upstream timeout calling reward-service"
6) Web-app failures on give form submissions due to upstream 502s
- 2026-09-03T14:03:30Z, web-app, ERROR
"Give form submission failed: upstream 502 from api-gateway"
- 2026-09-03T14:04:45Z, web-app, ERROR
"Give form submission failed: upstream 502"
- 2026-09-03T14:05:42Z, web-app, ERROR
"Give form submission failed: upstream 502"
- 2026-09-03T14:06:49Z, web-app, ERROR
"Give form submission failed: upstream 502"
7) Redis connectivity restored and queues recover
- 2026-09-03T14:10:56Z–2026-09-03T14:20:59Z, postgres, INFO, "checkpoint complete" (database looks normal in this slice)
- 2026-09-03T14:22:10Z, reward-service, INFO
"Redis connection restored; resuming job processing"
- 2026-09-03T14:24:45Z, sidekiq, INFO
"Queue reward depth below 500"
Datadog query to confirm the first error
(Using only information from the logs; log attributes: service, level, message, timestamp.)
Example Datadog log search query to confirm the first error event:
service:reward-service AND level:ERROR AND "Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s" AND @timestamp:2026-09-03T14:01:12Z
What the logs do NOT show
- Root cause of Redis outage: the logs only show Redis::TimeoutError and a timed-out connection; they do NOT indicate why Redis was unavailable (no CPU/memory/disk/cluster-failover info, no Redis logs).
- Exact duration of Redis unavailability at the Redis layer itself: we see reward-service logs from 2026-09-03T14:01:12Z and a “Redis connection restored” at 2026-09-03T14:22:10Z, but we do NOT see Redis service logs confirming when it went down or came back.
- Impacted request counts, user IDs, or tenant/segment scope: the slice has no per-request identifiers, counts, or customer/company aliases.
- Any mitigation actions taken (e.g., scaling, failover, config changes): no logs here mention operator actions.
- Success/resolution of specific Sidekiq jobs from sidekiq_jobs.csv: sidekiq_jobs.csv shows failed_at timestamps and errors for RewardGiveJob and RecognitionDigestJob, but the logs do NOT show any later per-job success entries for those specific job_ids.
recognition_streaks_v2 - What it controls (per code): In app/models/recognition.rb, when enabled for a company, calls StreakTracker.record(give) during recognition creation. This controls recording/updates of recognition streaks. - Who has it on: segment:beta_companies - Targeting rules: segment-based targeting (segment key: beta_companies) - Company count (must match export): 42 - Notes: Has both code reference and active targets. points_budget_guardrails - What it controls (per code): In app/services/budget_service.rb, when enabled, BudgetService.new(company).enforce!(giver, points) is called. This controls enforcement of points budget guardrails on giving. - Who has it on: all_companies - Targeting rules: enabled for all companies - Company count (must match export): 220 - Notes: Has both code reference and active targets. slack_dm_nudges - What it controls (per code): In app/jobs/nudge_job.rb, the job returns early unless this flag is enabled; when enabled, SlackDm.send_nudge(user) runs. This controls sending Slack direct-message nudges to users. - Who has it on: segment:region_na - Targeting rules: segment-based targeting (segment key: region_na) - Company count (must match export): 87 - Notes: Has both code reference and active targets. redeem_flow_redesign - What it controls (per code): In app/controllers/redeem_controller.rb, when enabled, render RedeemV2Component.new(company) is used; otherwise render RedeemV1Component.new(company). This controls whether the company sees the redesigned redemption flow (V2) vs the legacy flow (V1). - Who has it on: targeted_list - Targeting rules: targeted_list (specific companies, not described further in the data) - Company count (must match export): 12 - Notes: Has both code reference and active targets. analytics_dashboard_v3 - What it controls (per code): In app/controllers/analytics_controller.rb, when enabled, @dashboard is set to AnalyticsV3.new(company). This controls use of the v3 analytics dashboard implementation for that company. - Who has it on: segment:tier_three - Targeting rules: segment-based targeting (segment key: tier_three) - Company count (must match export): 65 - Notes: Has both code reference and active targets. ms_teams_app_v2 - What it controls (per code): In app/services/teams_installer.rb, when enabled, TeamsAppV2.install(company) is called. This controls installation of the v2 Microsoft Teams app for that company. - Who has it on: targeted_list - Targeting rules: targeted_list (specific companies, not described further in the data) - Company count (must match export): 9 - Notes: Has both code reference and active targets. legacy_give_modal - What it controls (per code): No reference to "legacy_give_modal" appears in the provided code excerpt, so its behavior in the application cannot be determined from the given data. - Who has it on: segment:legacy_plan - Targeting rules: segment-based targeting (segment key: legacy_plan) - Company count (must match export): 14 - Notes: Flag has targets but no code reference in the provided excerpt. survey_boosters_q3 - What it controls (per code): No reference to "survey_boosters_q3" appears in the provided code excerpt, so its behavior in the application cannot be determined from the given data. - Who has it on: segment:legacy_plan - Targeting rules: segment-based targeting (segment key: legacy_plan) - Company count (must match export): 7 - Notes: Flag has targets but no code reference in the provided excerpt. paused_offboard_cleanup - What it controls (per code): No reference to "paused_offboard_cleanup" appears in the provided code excerpt, so its behavior in the application cannot be determined from the given data. - Who has it on: none - Targeting rules: none (empty targeting_rules field) - Company count (must match export): 0 - Notes: This flag has no code reference in the provided excerpt and no active targets.
NDA-1: GREEN — Standard mutual NDA with normal term and standard carve-outs; e.g., clause 3: “Carve-outs: information that (a) is or becomes publicly available through no breach, (b) was known prior to disclosure, (c) is received from a third party without duty of confidence, (d) is independently developed, or (e) must be disclosed by law or court order.” NDA-2: YELLOW — Embedded non-solicitation/anti-poach requires counsel review; clause 4: “During the term of this Agreement and for eighteen (18) months thereafter, neither party shall solicit for employment or hire any employee of the other party with whom it came into contact under this Agreement.” NDA-3: RED — Materially overreaching: non-compete plus no confidentiality carve-outs; clauses 2 and 4: “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.” and “No confidentiality carve-outs are stated in this Agreement.”