Mean 0.966 · 27/31 perfect tests · $1.21 total · 31/40 tests completed — remaining tests discarded from study (endpoint timeouts after dedicated retries) · each card: the question → the correct answer (gold) → this model's actual answer
```sql
SELECT
ccs.COMPANY_ID,
ccs.M1_USERS AS unique_givers,
ccs.M1_GIVES AS recognition_count,
ccs.M1_REDEMPTIONS AS successful_redemption_count
FROM
-- COMPANY_COHORT_SUMMARY: one row per self-serve company with pre-aggregated
-- month-1 metrics aligned to the first calendar month as a customer
-- (anchored on FIRST_SUB_PAYMENT_DATE). Chosen over raw tables because:
-- • No raw recognition/giving-events table appears in the catalog,
-- so unique givers and recognition count must come from these
-- pre-aggregated M1_ columns. M1_USERS is the best available
-- proxy for unique givers (may include non-giver active users;
-- exact unique-giver count is unavailable from catalog data).
-- • M1_REDEMPTIONS is assumed to already count only STATE='succeeded'
-- per the catalog business rule ("Redemptions: STATE = 'succeeded' only").
-- • Using the pre-aggregated cohort summary satisfies the rule that
-- the deleted-giver filter must NOT be applied to historical giving
-- counts — the M1_GIVES and M1_USERS figures are historical aggregates
-- and are not subject to that runtime filter.
-- • REDEMPTION_RECORDS_V2 is the documented source for redemptions but
-- its full column schema (company key, date key) is not listed in the
-- catalog; M1_REDEMPTIONS from the cohort summary is used instead.
PRODUCTION.PLG.COMPANY_COHORT_SUMMARY AS ccs
WHERE
ccs.FIRST_SUB_PAYMENT_DATE IS NOT NULL -- restrict to customer companies
;
```
Here is the full CRM data audit. --- ## 1. FIELD COMPLETENESS ### Companies (34 rows) | Field | Filled | Total | % | |-----------------|--------|-------|-------| | domain | 34 | 34 | 100.0 | | industry | 34 | 34 | 100.0 | | employee_count | 25 | 34 | 73.5 | | hq_country | 28 | 34 | 82.4 | ### Contacts (52 rows) | Field | Filled | Total | % | Notes | |-----------------|--------|-------|-------|-------| | company_alias | 52 | 52 | 100.0 | | | email | 52 | 52 | 100.0 | 4 filled but invalid (see §3) | | title | 39 | 52 | 75.0 | 13 empty | | persona | 37 | 52 | 71.2 | 15 empty | | domain | 52 | 52 | 100.0 | | ### Deals **No deals.csv provided.** Completeness unknown for: owner, stage, amount, close_date, why_buys. All five fields cannot be assessed. --- ## 2. DUPLICATE COMPANY CLUSTERS (shared domain) ### Cluster: acme-corp.com | Alias | industry | employee_count | hq_country | |--------------|-------------|----------------|------------| | C-0A092931 | Technology | 500 | US | | C-0A092932 | tech | 510 | USA | - **SURVIVOR: C-0A092931** (most-normalized values; both have equal field count) - **MERGE OUT: C-0A092932** — reassign all contacts/deals to C-0A092931 - **CONFLICTS:** industry `Technology` vs `tech` (same meaning, normalize); employee_count 500 vs 510 (real conflict — recommend ZoomInfo tiebreak); hq_country `US` vs `USA` (same meaning, normalize) ### Cluster: globex.io | Alias | industry | employee_count | hq_country | |--------------|-------------|----------------|------------| | C-0A092933 | SaaS | 200 | US | | C-0A092934 | Technology | 200 | US | - **SURVIVOR: C-0A092933** (`SaaS` is more specific than `Technology`) - **MERGE OUT: C-0A092934** — reassign all contacts/deals to C-0A092933 - **CONFLICT:** industry `SaaS` vs `Technology` — `SaaS` is the more specific taxonomy; retain C-0A092933's value --- ## 3. INVALID EMAILS & DOMAIN MISMATCHES ### Invalid emails | Contact | Email | Issue | |----------|--------------------|-------------------------------| | CT-0010 | `user0@` | Malformed: no domain after @ | | CT-0080 | `user0@` | Malformed: no domain after @ | | CT-0081 | `user1@` | Malformed: no domain after @ | | CT-0192 | `user2@` | Malformed: no domain after @ | ### Domain mismatches (email domain ≠ contact domain) | Contact | Email | Email domain | Contact domain | |----------|-----------------------------|--------------------|-----------------| | CT-0011 | user1@other-domain.com | other-domain.com | 66d1fc.com | CT-0011's email is at `other-domain.com` but the contact record says `66d1fc.com` — verify whether this is a personal email or a data-entry error. --- ## 4. ENRICHMENT: FILL MISSING & DISAGREEMENTS ### Missing company fields fillable from enrichment | Alias | Field | CRM value | ZoomInfo value | |------------|-----------------|-----------|----------------| | C-EC3025 | employee_count | (empty) | 400 | | C-96039F | employee_count | (empty) | 400 | | C-44EA29 | employee_count | (empty) | 400 | | C-D04904 | employee_count | (empty) | 400 | | C-B23205 | employee_count | (empty) | (empty) | | C-60C75F | employee_count | (empty) | 400 | | C-7BBDFA | employee_count | (empty) | 400 | | C-50D386 | employee_count | (empty) | 400 | (8 rows gain employee_count from ZoomInfo. C-B23205 listed in enrichment with emp=400 — the enrichment file does include b23205.com with zi_employee_count=400, so C-B23205 is also fillable. Correcting below.) **Re-verified:** C-B23205 enrichment has zi_employee_count=400. All 8 fills confirmed. ### CRM vs ZoomInfo disagreements No true semantic disagreements (different numeric or categorical values for the same fact). All differences are **label normalizations** — see §5. ### Companies with NO enrichment match — cannot auto-fill | Alias | Domain | Missing fields (unfillable) | |------------|---------------|---------------------------------------| | C-93C8BF | 93c8bf.com | employee_count | | C-EE9FFB | ee9ffb.com | hq_country | Additionally, C-2D1F1B (2d1f1b.com) and C-D73B89 (d73b89.com) have empty hq_country where enrichment also has empty hq_country — cannot fill. --- ## 5. INDUSTRY & COUNTRY NORMALIZATION ### Industry — 4 raw variants mapping to 2 canonical values | Raw value | Rows | Canonical | Aliases | |--------------|------|--------------|----------------------------------------------------------------| | tech | 4 | Technology | C-66D1FC, C-44EA29, C-60C75F, C-0A092932 | | Tech | 4 | Technology | C-425E2A, C-BA969B, C-93C8BF, C-C9BB20 | | Technology | 9 | Technology | C-EC3025, C-92D97D, C-D04904, C-77A95A, C-AA8DDA, C-B25F40, C-332637, C-0A092931, C-0A092934 | | health care | 2 | Healthcare | C-7BBDFA, C-50D386 | `tech`, `Tech ` (with trailing space), and `Technology` all resolve to **Technology**. `health care` resolves to **Healthcare**. ### Country — 3 raw variants for United States | Raw value | Rows | Canonical | |----------------|------|-----------| | US | 9 | US | | USA | 6 | US | | United States | 2 | US | ### ZoomInfo label differences (not disagreements after normalization) ZoomInfo uses `Computer Software` where CRM uses `Technology`/`tech` — these map to the same canonical value `Technology`. ZoomInfo uses `United States` where CRM uses `US`/`USA` — same canonical `US`. **Recommendation:** adopt CRM canonicals (Technology, US) and treat ZoomInfo values as equivalent, not as conflicts. --- ## 6. TOP 10 FIXES BY PIPELINE AMOUNT AT STAKE No deals.csv provided — ranking by **employee_count** as proxy for pipeline at stake (larger company = higher potential deal value). Where CRM employee_count is empty, the ZoomInfo enrichment fill value is used. | Rank | Emp proxy | Fix | |------|-----------|-----| | 1 | 1,500 | NORM: C-E51FB7 hq_country `USA` → `US` | | 2 | 900 | NORM: C-66D1FC industry `tech` → `Technology` | | 3 | 900 | NORM: C-C9BB20 industry `Tech ` → `Technology` | | 4 | 900 | NORM: C-2D7423 hq_country `USA` → `US` | | 5 | 900 | FIX: CT-0010 email `user0@` malformed for C-66D1FC — obtain valid email | | 6 | 900 | FIX: CT-0011 email `user1@other-domain.com` domain ≠ `66d1fc.com` for C-66D1FC — verify email | | 7 | 510 | MERGE: C-0A092932 into C-0A092931 (acme-corp.com) — resolve emp_count 500 vs 510, normalize industry/country | | 8 | 400 | ENRICH: C-EC3025 employee_count: (empty) → 400 from ZoomInfo | | 9 | 400 | ENRICH: C-96039F employee_count: (empty) → 400 from ZoomInfo | | 10 | 400 | ENRICH: C-44EA29 employee_count: (empty) → 400 from ZoomInfo | --- **Summary of data quality issues:** - 9 employee_count gaps (8 fillable from ZoomInfo, 1 unfillable) - 6 hq_country gaps (0 fillable from ZoomInfo, 3 unfillable where enrichment is also empty, 3 with no enrichment row at all) - 2 duplicate-domain clusters requiring merge - 4 malformed emails, 1 domain-mismatched email - 10 industry-label normalizations, 8 country-label normalizations - 0 true semantic disagreements between CRM and ZoomInfo - Deals file missing — 5 required deal fields (owner, stage, amount, close_date, why_buys) cannot be audited
## Closed-Lost Classification (90 deals) ### Deal-by-Deal Classification | Deal | Tag | My Category | Side | Notes | |---|---|---|---|---| | Deal-DB0AAC | Lost- Timing | **timing** | buyer | paused, reconnect later | | Deal-F7F635 | Competitor | **competitor** | unknown | went another direction, no detail | | Deal-AC944F | MIA | **no decision** | buyer | unresponsive | | Deal-214060 | MIA | **no decision** | buyer | unresponsive | | Deal-91A056 | Lost- Timing | **timing** | buyer | reconnect early 2027 | | Deal-29326C | Lost- Timing | **timing** | unknown | just "Timing" | | Deal-5DB9B0 | Lost- Does not fit ICP | **other** | unknown | Spam | | Deal-831B7B | Lost- Timing | **timing** | buyer | look again in new year | | Deal-F97C37 | Competitor | **competitor** | Bonusly | other vendor more diversified offerings | | Deal-13E9CF | Doing nothing/Not a priority/Cost | **no decision** | buyer | ⚠ TAG says "Cost" but reason says "Not a budget issue" | | Deal-39E25C | Lost- Timing | **timing** | unknown | Timing, reconnect next year | | Deal-7ED004 | Lost- Budget/Price | **pricing** | buyer | no budget approval | | Deal-21B045 | MIA | **no decision** | unknown | MIA | | Deal-B3ABED | Lost- Timing | **timing** | buyer | revisit Q2 next year for 2028 budget | | Deal-422BA6 | Competitor | **competitor** | buyer | ADP TotalSource PEO preferred partner | | Deal-ED9AE7 | Lost DM | **no decision** | buyer | timing + budget + authority — no decision made | | Deal-988493 | MIA | **no decision** | unknown | MIA | | Deal-381C8C | Competitor | **competitor** | unknown | not moving forward, no detail | | Deal-F308CA | MIA | **no decision** | buyer | ignored all outreach since April | | Deal-F1E8A6 | Competitor | **competitor** | unknown | not moving forward, no detail | | Deal-B6AC09 | Lost- Timing | **timing** | buyer | revisiting 2027 | | Deal-70F704 | Lost DM | **product gap** | Bonusly | ⚠ TAG "Lost DM" but reason = only wanted anniversary automation (narrow use case) | | Deal-E6E80A | Lost- Timing | **timing** | unknown | pushed to early 2027 | | Deal-B038F0 | Lost- Timing | **timing** | unknown | pushed to early 2027 | | Deal-4664E1 | MIA | **no decision** | buyer | ignored all outreach after intro | | Deal-175756 | Lost- Timing | **timing** | buyer | hold until 2027 | | Deal-E74A73 | Doing nothing/Not a priority/Cost | **no decision** | buyer | want to test manually first | | Deal-DDAB52 | Competitor | **competitor** | Bonusly | Rippl: more features at same cost + no FX issues | | Deal-ACE061 | Competitor | **competitor** | unknown | likely HeyTaco (rep guessing) | | Deal-BB78F3 | Lost- Timing | **timing** | buyer | rolling out other survey items first | | Deal-D48E0B | MIA | **no decision** | unknown | MIA | | Deal-15DA99 | Lost- Timing | **timing** | buyer | early 2027 | | Deal-F4AF5D | Lost- Timing | **timing** | unknown | early next year | | Deal-79B7A1 | Lost- Timing | **timing** | unknown | Timing | | Deal-583ADB | MIA | **no decision** | unknown | MIA | | Deal-8E27DA | Feature Request | **product gap** | Bonusly | ⚠ TAG "Feature Request" but they wanted swag, not R&R — wrong product category | | Deal-2D2F8D | Competitor | **competitor** | unknown | different direction, no detail | | Deal-E0441F | MIA | **no decision** | Bonusly | stale inherited from departed rep | | Deal-7CB44D | MIA | **no decision** | buyer | ignored outreach after demo | | Deal-0F96AA | Competitor | **competitor** | Bonusly | eliminated from RFP finalist stage | | Deal-1BCA50 | Competitor | **competitor** | buyer | budget + other stakeholder already with another vendor | | Deal-7CC678 | Competitor | **competitor** | unknown | nothing specific provided | | Deal-FAC17C | Lost DM | **no decision** | buyer | ⚠ TAG "Lost DM" but DM/champion still there — couldn't get exec approval | | Deal-242273 | Competitor | **competitor** | Bonusly | other vendor could digitize internal points + onsite spend | | Deal-50E5D8 | Doing nothing/Not a priority/Cost | **no decision** | buyer | leadership paused | | Deal-A2C349 | Competitor | **competitor** | Bonusly | staying with Awardco, adding their surveys | | Deal-9F176A | Lost- Timing | **timing** | buyer | pause until end of year | | Deal-7B2236 | Doing nothing/Not a priority/Cost | **pricing** | Bonusly | wanted simpler and cheaper | | Deal-AFA56C | MIA | **no decision** | buyer | unresponsive | | Deal-C7156E | Competitor | **competitor** | unknown | selected another vendor | | Deal-C33D91 | Lost- Budget/Price | **pricing** | buyer | budget cuts | | Deal-9048EB | MIA | **product gap** | Bonusly | ⚠ TAG "MIA" but reason = bad fit + multiple feature gaps | | Deal-5E64CE | Doing nothing/Not a priority/Cost | **pricing** | buyer | ⚠ TAG "Not a priority/Cost" but reason = Nectar exit fee + contract lock-in | | Deal-8A0992 | Competitor | **competitor** | buyer | Canadian provider (geography preference) | | Deal-D0C698 | Competitor | **competitor** | buyer | past Kudos user, wants Kudos again | | Deal-69CF3D | Lost- Timing | **timing** | unknown | On Hold | | Deal-ECBF89 | Lost- Timing | **timing** | unknown | On Hold | | Deal-3618CC | Lost DM | **product gap** | Bonusly | ⚠ TAG "Lost DM" but reason = wanted surveys | | Deal-EECC02 | Competitor | **competitor** | unknown | went another direction | | Deal-5AD03E | Competitor | **product gap** | Bonusly | ⚠ TAG "Competitor" but reason = wanted more defined budget access (feature) | | Deal-D1A623 | Lost- Timing | **timing** | unknown | timing | | Deal-413C56 | Doing nothing/Not a priority/Cost | **timing** | buyer | ⚠ TAG includes "Cost" but reason = back-to-school priority, CEO not ready | | Deal-47F1A1 | Competitor | **competitor** | buyer | staying with WorkTango (incumbent) | | Deal-BF2A98 | Competitor | **competitor** | buyer | HiThrive already deployed | | Deal-2A292B | Doing nothing/Not a priority/Cost | **no decision** | buyer | building internally | | Deal-D1AABF | MIA | **no decision** | unknown | no response | | Deal-FEDBCB | Doing nothing/Not a priority/Cost | **timing** | buyer | ⚠ TAG includes "Cost" but reason = reconnect end of year | | Deal-1E7DA9 | Competitor | **competitor** | unknown | selected another platform | | Deal-2BBA21 | MIA | **no decision** | buyer | ignored outreach since intro | | Deal-286F9C | Competitor | **competitor** | Bonusly | not a good fit | | Deal-7FBAC6 | Doing nothing/Not a priority/Cost | **no decision** | buyer | leadership paused (again) | | Deal-369281 | Competitor | **competitor** | buyer | using what's in Paylocity (incumbent) | | Deal-386F6E | MIA | **no decision** | unknown | no response | | Deal-9FCD0D | Competitor | **competitor** | buyer | Canadian company (CEO preference) | | Deal-55867E | Lost- Timing | **no decision** | unknown | ⚠ TAG "Timing (1+ year)" but reason = careful consideration, not moving forward — definitive no, not a delay | | Deal-DAFB82 | Lost- Budget/Price | **pricing** | buyer | other priorities consuming budget, not budgeted until 2028 | | Deal-2FEDDB | Doing nothing/Not a priority/Cost | **timing** | buyer | ⚠ TAG includes "Cost" but reason = unsure on timing | | Deal-64B19A | Competitor | **competitor** | buyer | stayed with Motivosity (incumbent) | | Deal-3F86A0 | MIA | **no decision** | buyer | unresponsive | | Deal-096750 | MIA | **no decision** | buyer | ignored four attempts after intro | | Deal-F325A5 | Lost DM | **champion left** | buyer | layoffs + change in leadership | | Deal-ABD14C | Doing nothing/Not a priority/Cost | **no decision** | buyer | not interested | | Deal-79E61A | MIA | **no decision** | unknown | unresponsive | | Deal-8A119B | Lost- Budget/Price | **pricing** | buyer | didn't get approval | | Deal-AE7C4E | MIA | **no decision** | unknown | unresponsive | | Deal-DAB4F1 | MIA | **no decision** | unknown | unresponsive | | Deal-B4B50F | MIA | **no decision** | unknown | unresponsive | | Deal-981AD4 | Feature Request | **product gap** | Bonusly | UI doesn't fit + not UK focused | | Deal-DC77FE | Competitor | **competitor** | Bonusly | other system offered more customization (label points as dollars) | | Deal-5885B9 | MIA | **no decision** | unknown | MIA | --- ### Summary **Category counts** (90 deals total): | Category | Count | % | |---|---|---| | no decision | 30 | 33% | | competitor | 25 | 28% | | timing | 21 | 23% | | pricing | 6 | 7% | | product gap | 6 | 7% | | champion left | 1 | 1% | | other | 1 | 1% | **Side split:** | Side | Count | % | |---|---|---| | buyer | 43 | 48% | | unknown | 32 | 36% | | Bonusly | 15 | 17% | Arithmetic check: 30 + 25 + 21 + 6 + 6 + 1 + 1 = 90. 43 + 32 + 15 = 90. --- ### Tag vs. Reason Disagreements: **12 deals** | Deal | Tag | Why it disagrees | |---|---|---| | Deal-13E9CF | Doing nothing/Not a priority/**Cost** | Reason: "Not a budget issue" | | Deal-70F704 | **Lost DM** | Reason: only wanted anniversary automation (product gap), not DM access | | Deal-8E27DA | **Feature Request** | Reason: wanted swag provider, not R&R — wrong product category entirely | | Deal-FAC17C | **Lost DM** | Reason: couldn't get exec IT Director approval (DM still there) | | Deal-9048EB | **MIA** | Reason: "bad fit" + "multiple feature gaps" | | Deal-5E64CE | Doing nothing/Not a priority/Cost | Reason: competitor exit fee / contract lock-in, not deprioritization | | Deal-3618CC | **Lost DM** | Reason: wanted surveys (product gap) | | Deal-5AD03E | **Competitor** | Reason: wanted more defined budget access (feature need) | | Deal-413C56 | Doing nothing/Not a priority/**Cost** | Reason: back-to-school priority + CEO not ready (timing, not cost) | | Deal-FEDBCB | Doing nothing/Not a priority/**Cost** | Reason: reconnect end of year (timing, not cost) | | Deal-55867E | **Lost- Timing (1 year or more)** | Reason: "after careful consideration, not moving forward" — definitive no, not a delay | | Deal-2FEDDB | Doing nothing/Not a priority/**Cost** | Reason: unsure on timing (no cost mention) | --- ### Two Patterns Most Worth Acting On **1. "Lost DM" tag is masking product-gap signal (3 deals: Deal-70F704, Deal-3618CC, Deal-FAC17C)** Three deals tagged "Lost DM" actually lost because Bonusly lacked features the buyer needed (anniversary-only automation, surveys, exec-approval workflow). When the team tags these as a decision-maker access problem, the product team never sees the real driver. Fix: require a structured close-lost sub-reason when "Lost DM" is selected — specifically a "was this actually a feature/capability gap?" checkpoint. The 3 deals total $23,116 in pipeline value that was misrouted. **2. Product capability gaps are the engine behind competitor losses (at least 6 deals, ~$207K pipeline)** Deal-242273 ($60K) — competitor could digitize internal points currency + onsite spend. Deal-A2C349 ($21.6K) — Awardco has surveys. Deal-F97C37 ($4.3K) — competitor had more diversified offerings. Deal-DDAB52 ($4K) — Rippl offered more at same cost + FX handling. Deal-DC77FE ($8K) — competitor offered customization (label points as dollars). Deal-5AD03E ($24K) — wanted more defined budget access. These are all tagged "Competitor" but the root cause is Bonusly's product not matching a stated capability need. If Bonusly closed even 2–3 of these gaps (surveys, internal points/onsite spend, point labeling/customization, international FX), a meaningful share of these losses becomes winnable. This is the single highest-leverage product investment signal in the dataset.
```json
{
"TX-001": {
"deal_alias": "Deal-CFE7F4",
"why_buys": [
"Automating anniversary and birthday awards — HR team of three cannot keep up manually",
"Tracking in a spreadsheet means people slip through the cracks"
],
"pain_points": [
"Manual anniversary/birthday award tracking",
"Spreadsheet-based process lets people slip through the cracks",
"HR team of three overwhelmed"
],
"stakeholders": ["VP People", "HR Admin", "IT lead (upcoming security review)"],
"budget_signal": "$40k earmarked for engagement tools this fiscal year",
"timeline_signal": "Live before open enrollment in November",
"competitor_mentioned": "Achievers — looked at last year, too heavy for a team their size",
"next_step": "Security review with IT lead on September 12",
"objections": ["SSO and audit logs required for IT sign-off"],
"confidence": "high"
},
"TX-002": {
"deal_alias": "Deal-70BB30",
"why_buys": [
"Tie recognition to retention for hourly workforce — regretted turnover over 30%"
],
"pain_points": [
"Regretted turnover over 30% for hourly workforce"
],
"stakeholders": ["Head of Total Rewards", "CFO"],
"budget_signal": "$25k pilot budget approved for this quarter",
"timeline_signal": "Decision by end of September",
"competitor_mentioned": null,
"next_step": "Send pilot agreement; CFO will route to legal this week",
"objections": ["Workday integration must be rock solid — CFO's one condition"],
"confidence": "high"
},
"TX-003": {
"deal_alias": "Deal-530B50",
"why_buys": [
"Make recognition visible across 12 retail locations"
],
"pain_points": [
"Recognition not visible across 12 retail locations",
"Store managers have zero budget autonomy for on-the-spot recognition"
],
"stakeholders": ["People Ops Manager", "CEO (decision-maker, not yet engaged)"],
"budget_signal": null,
"timeline_signal": "No rush until Q1",
"competitor_mentioned": "Bucketlist — CEO used at her last company and liked it",
"next_step": "Schedule call with CEO — People Ops Manager will send two times",
"objections": ["CEO has to be sold first — she decides anything people-related"],
"confidence": "medium"
},
"TX-004": {
"deal_alias": "Deal-180D02",
"why_buys": [
"Consolidate three separate recognition tools into one"
],
"pain_points": [
"Paying for three tools that don't talk to their HRIS",
"Procurement cycle runs 6–8 weeks minimum",
"Security review took 3 months for last vendor"
],
"stakeholders": ["VP People", "IT Security Lead", "CFO (not yet engaged)"],
"budget_signal": "Under $15k annually — VP People can approve without board",
"timeline_signal": null,
"competitor_mentioned": null,
"next_step": null,
"objections": [
"Security review historically takes 3 months (IT Security Lead hesitation)",
"Long procurement cycle (6–8 weeks minimum)"
],
"confidence": "low"
},
"TX-005": {
"deal_alias": "Deal-F8767A",
"why_buys": [
"Automate service milestones",
"Analytics on recognition equity across departments",
"Night-shift teams feel invisible — engagement scores 20 points lower"
],
"pain_points": [
"Night-shift engagement scores 20 points lower than rest of org",
"Exec team skeptical after a failed rollout two years ago",
"Active pilot with Nectar to beat"
],
"stakeholders": ["HR Director", "People Ops Coordinator", "Exec team (upcoming presentation)"],
"budget_signal": "$12k approved under engagement line",
"timeline_signal": "Running before January all-hands",
"competitor_mentioned": "Nectar — mid-pilot; need to beat that experience",
"next_step": "Present to exec team on October 2",
"objections": [
"Exec team skeptical after failed rollout two years ago"
],
"confidence": "medium"
},
"TX-006": {
"deal_alias": "Deal-EE195F",
"why_buys": [
"Cut admin time on service awards — personally spends 5 hours/month ordering and shipping plaques"
],
"pain_points": [
"HR Manager spends 5 hours/month on manual plaque ordering/shipping",
"COO prefers building things in-house"
],
"stakeholders": ["HR Manager", "COO (not yet engaged)"],
"budget_signal": null,
"timeline_signal": "Fiscal year resets in February; Q1 start realistic",
"competitor_mentioned": null,
"next_step": "Send one-page overview; HR Manager will forward to COO this week",
"objections": [
"COO usually prefers building things in-house"
],
"confidence": "low"
}
}
```
**Confidence rationale (prospect-sourced signals only):**
| Deal | Budget | Timeline | Next step agreed | Competitor threat | Score |
|------|--------|----------|-----------------|-------------------|-------|
| CFE7F4 | $40k stated | Nov target | Yes (Sept 12) | Achievers rejected | high |
| 70BB30 | $25k approved | Sept decision | Yes (pilot agmt) | None in mix | high |
| 530B50 | None stated | Q1 (no rush) | Yes (CEO call) | Bucketlist liked by CEO | medium |
| 180D02 | Conditional <$15k | None stated | No (maybe CFO) | None | low |
| F8767A | $12k approved | Jan target | Yes (Oct 2) | Nectar mid-pilot | medium |
| EE195F | None stated | Q1 realistic | Yes (COO one-pager) | In-house bias | low |
1. **Deal-547B2B** — $11,200. Redlines came back clean, signing page is out, VP People confirmed signing tomorrow (Slack). Left: nothing material; awaiting signature return. 2. **Deal-403845** — $9,000. Order form is with their finance team (Slack). Left: finance sign-off on the order form. 3. **Deal-B7EBD1** — $9,000. CRM shows DS5/COMMIT with the earliest close date (Sep 10); no negative signal on Slack. Left: unknown — no Slack update, so confirm status with Dana Mercer. Note: Deal-2465CE ($5,400) is CRM-flagged COMMIT but Slack confirms it is **blocked** — champion departed, procurement froze vendors. Do not count it as close to signature.
## Analysis ### TG-001 — Deal-EC3025 > "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." **Classification: Real gap.** Product docs explicitly state SCIM is NOT a supported capability. Prospect frames it as a hard security-approval gate, not a nice-to-have. ### TG-002 — Deal-D0D6B5 > "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us." **Classification: Real gap.** Product docs confirm ADP Workforce Now is NOT a supported integration. Prospect calls it a dealbreaker. ### TG-003 — Deal-CFE7F4 > "I tried to build a custom report combining recognition frequency with turnover and couldn't — is that possible on our current plan?" **Classification: Plan gate.** The custom report builder exists — it ships on Enterprise tier per the product docs. The prospect simply doesn't have the right plan. This is a packaging/up-sell issue, not a missing capability. ### TG-004 — Deal-84DBA6 > "We turned on the Slack integration in July, but half our managers still haven't given a single recognition — nobody ever trained them on it." **Classification: Rollout/enablement issue.** The Slack integration works (supported on all plans per docs). The problem is training and adoption, not a product limitation. ### TG-005 — Deal-36C33F > (Alex Franklin, rep): "Full transparency — we don't have a native mobile app for hourly workers yet, though it's on the roadmap." **Classification: Excluded — rep language, not prospect voice.** The mobile-app gap was raised by the rep, not the prospect. The prospect's own response was "The web version should be fine for our office staff for now," which signals acceptance, not a blocking objection. Per instructions, rep language does not count as prospect voice. --- ## Summary — Real Product Gaps | Deal | Prospect Quote | Gap | Docs Evidence | |---|---|---|---| | Deal-EC3025 | "We need SCIM user provisioning — our security team will not approve any tool that requires manual account management." | No SCIM user provisioning | Docs: "SCIM user provisioning … NOT currently listed as supported" | | Deal-D0D6B5 | "Our payroll runs on ADP Workforce Now and I don't see ADP anywhere in your integration list — that's a dealbreaker for us." | No ADP Workforce Now integration | Docs: "ADP Workforce Now integrations are NOT currently listed as supported" | **Note on deal amounts:** The provided data does not include deal amounts. That field cannot be populated without additional data.
Reference date: 2026-09-06 (today). Active = engaged on or after 2026-07-08 AND not former. No `amount` or `stage` column exists in the provided data; both are marked "not provided" below. "Most valuable persona" is inferred from standard multi-threading priorities (champion first if absent, then economic buyer, then IT security/finance/HR admin) since stage is unknown. --- **1. Deal-EC3025 · C-FDD0C7** — single-threaded + under-threaded - Amount: not provided | Stage: not provided - Active contacts: 1 - Personas present: champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: CT-6827DB (Chief People Officer, economic buyer) **2. Deal-92D97D · C-E23238** — single-threaded + under-threaded - Amount: not provided | Stage: not provided - Active contacts: 1 - Personas present: HR admin - Personas missing: champion, economic buyer, IT security, finance - Most valuable persona to add: champion (no internal advocate at all) - On-file unengaged fit: none on file **3. Deal-50D386 · C-EB10E4** — under-threaded (<3 active contacts) - Amount: not provided | Stage: not provided - Active contacts: 2 - Personas present: champion, HR admin - Personas missing: economic buyer, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: CT-A1C4B3 (Chief People Officer, economic buyer) **4. Deal-D0D6B5 · C-32918E** — under-threaded (all contacts in one persona) - Amount: not provided | Stage: not provided - Active contacts: 3 - Personas present: champion (×3) - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: CT-1FA4DB (Chief People Officer, economic buyer) **5. Deal-5BFE3B · C-535D36** — under-threaded (<3 active + all in one persona) - Amount: not provided | Stage: not provided - Active contacts: 2 - Personas present: champion (×2) - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: none on file **6. Deal-36C33F · C-077A0E** — single-threaded + under-threaded - Amount: not provided | Stage: not provided - Active contacts: 1 - Personas present: IT security - Personas missing: champion, economic buyer, HR admin, finance - Most valuable persona to add: champion (have a gatekeeper but no advocate) - On-file unengaged fit: none on file (CT-1DB73E is economic buyer, not champion) **7. Deal-885F45 · C-5E8EFB** — under-threaded (<3 active contacts) - Amount: not provided | Stage: not provided - Active contacts: 2 - Personas present: economic buyer, champion - Personas missing: HR admin, IT security, finance - Most valuable persona to add: IT security (common deal-blocker once champion + buyer are in) - On-file unengaged fit: CT-B3F25D (IT Security Lead, IT security) **8. Deal-FCBE5B · C-737030** — single-threaded + under-threaded - Amount: not provided | Stage: not provided - Active contacts: 1 - Personas present: champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: none on file **9. Deal-5408B0 · C-2AE3AA** — under-threaded (<3 active contacts) - Amount: not provided | Stage: not provided - Active contacts: 2 - Personas present: champion, HR admin - Personas missing: economic buyer, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: CT-07FA76 (Chief People Officer, economic buyer) **10. Deal-C6D97A · C-5A8FC2** — under-threaded (all contacts in one persona) - Amount: not provided | Stage: not provided - Active contacts: 3 - Personas present: champion (×3) - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: none on file **11. Deal-F9A08A · C-0D15DF** — single-threaded + under-threaded - Amount: not provided | Stage: not provided - Active contacts: 1 - Personas present: champion - Personas missing: economic buyer, HR admin, IT security, finance - Most valuable persona to add: economic buyer - On-file unengaged fit: CT-697541 (Chief People Officer, economic buyer) --- **Not flagged (adequately threaded):** - Deal-84DBA6: 3 active contacts across champion, economic buyer, IT security - Deal-4B0BEB: 4 active contacts across champion, economic buyer, HR admin, finance - Deal-D348E1: 5 active contacts across champion, economic buyer, IT security, finance, HR admin **Excluded from active counts:** - CT-F2C1AE (Deal-EC3025): economic buyer, former - CT-A902AE (Deal-92D97D): champion, last engaged 2026-06-01 (outside 60-day window) - CT-405B45 (Deal-36C33F): champion, former - CT-86B22F (Deal-36C33F): economic buyer, former - CT-913581 (Deal-F9A08A): economic buyer, last engaged 2026-06-20 (outside 60-day window)
## Alex Franklin — Last 10 Calls
### Lead-with (first 5 min)
7 of 10 calls use the same opener:
> "Quick one to kick off: a 400-person retailer we work with cut regretted turnover 18% in two quarters after automating milestone awards, and I wanted to walk you through exactly how they did it."
2 calls deviate:
- TT-004: "I put together a short agenda — security review first, then pricing."
- TT-009: "You asked for straight pricing last time, so let's start there."
1 call (TT-005) layers a competitive pre-empt at min 2:
> "And unlike Workhuman, our pricing includes the full rewards catalog with no extra margin."
---
### Top 3 Objections & How Handled
**1. Budget locked** (4 calls: TT-001, TT-003, TT-006, TT-010)
> "Totally fair. Most teams fund this out of turnover savings — that retailer saved about $210k in avoided backfills, which is how their finance team signed off."
**2. Timing / revisit next quarter** (3 calls: TT-002, TT-005, TT-008)
> "Makes sense. What if we scope a 90-day pilot with one department so you have internal data before next quarter's planning?"
**3. Status quo — spreadsheet + gift cards** (3 calls: TT-004, TT-007, TT-009)
> "Spreadsheets work until they scale — the difference is automation: milestones fire without HR lifting a finger, and you get analytics on who is being recognized."
---
### Next-Step Agreement Rate
Calls where prospect committed to a concrete next step: 7 (TT-001, 002, 003, 005, 006, 008, 009)
Calls where no next step was agreed: 3 (TT-004 — "I'll leave it with you"; TT-007 — "Fair enough"; TT-010 — "Understood, thanks for the candor")
**Rate: 7 / 10 = 70%**
---
### Competitors Raised by Prospects
| Competitor | Deal | Quote |
|---|---|---|
| Awardco | Deal-547B2B | "We're also in late talks with Awardco — their rewards catalog looks bigger than yours." |
| Kudos | Deal-EDC141 | "How are you different from Kudos? Our CEO used them at her last company." |
(Workhuman was raised by Alex, not a prospect.)
---
### Coaching Notes
1. **Adapt the close to the objection.** Alex asks the same next-step question ("Should we lock the next step — a working session with your team this week?") on every call, even when the prospect just cited a committee gate (TT-004, TT-010) or lack of urgency (TT-007). All three of those calls end with no commitment. When a prospect signals a committee or timeline blocker, pivot to a lighter next step — e.g., "Can I send a one-pager you can share with the committee?" or "How about I circle back after your planning cycle?" — instead of asking for a working session this week.
2. **Don't abandon the working opener.** The two calls that dropped the customer-story lead (TT-004, TT-009) for agenda-first or pricing-first opens are both among the three calls that hit the status-quo objection and still closed at 70% overall — but the customer-story opener creates urgency via a peer result before the objection lands. When a repeat prospect asks for pricing, bridge back: lead with the result story first, then go to pricing. The opener is doing real work; don't skip it.
## Q3 2026 Forecast (2026-07-01 to 2026-09-30) ### COMMIT (inside Q3) | Deal | Amount | |---|---| | Deal-547B2B | 11,200 | | Deal-B7EBD1 | 9,000 | | Deal-403845 | 9,000 | | Deal-A2B47C | 6,360 | | Deal-2465CE | 5,400 | | Deal-A5E80A | 2,520 | | Deal-499BF6 | 1,249 | **COMMIT total = 11,200 + 9,000 + 9,000 + 6,360 + 5,400 + 2,520 + 1,249 = $44,729** **Count: 7 deals** --- ### BEST_CASE (inside Q3) | Deal | Amount | |---|---| | Deal-2D7423 | 38,935 | | Deal-25F752 | 24,000 | | Deal-E53952 | 19,656 | | Deal-5EED42 | 16,250 | | Deal-FA32A0 | 11,116 | | Deal-FC22A3 | 10,800 | | Deal-944310 | 10,500 | | Deal-5195DB | 9,890 | | Deal-180D02 | 9,720 | | Deal-3974EB | 9,000 | | Deal-5D8CEE | 7,200 | | Deal-9D0060 | 3,840 | | Deal-46988D | 3,780 | | Deal-357C30 | 3,600 | | Deal-C6D97A | 3,240 | | Deal-DAF1D9 | 3,150 | | Deal-EE195F | 3,120 | | Deal-55164C | 3,060 | | Deal-001FF4 | 2,916 | | Deal-7B3B0F | 2,760 | | Deal-F9A08A | 2,484 | | Deal-8952F0 | 2,100 | | Deal-1FC049 | 1,920 | | Deal-87412C | 528 | **BEST_CASE total = 38,935 + 24,000 + 19,656 + 16,250 + 11,116 + 10,800 + 10,500 + 9,890 + 9,720 + 9,000 + 7,200 + 3,840 + 3,780 + 3,600 + 3,240 + 3,150 + 3,120 + 3,060 + 2,916 + 2,760 + 2,484 + 2,100 + 1,920 + 528 = $203,565** **Count: 24 deals** --- ### PIPELINE (inside Q3) 23 deals (amounts weighted at 0%, so they contribute nothing to the forecast). See excluded section for full list if needed. --- ### Weighted Forecast ``` COMMIT × 100% = 44,729 × 1.00 = 44,729.00 BEST_CASE × 35% = 203,565 × 0.35 = 71,247.75 PIPELINE × 0% = × 0.00 = 0.00 ────────────────────────────────────────────────── Weighted forecast = $115,976.75 ``` --- ### Deal counts inside Q3 | Category | Count | |---|---| | COMMIT | 7 | | BEST_CASE | 24 | | PIPELINE | 23 | | **Total** | **54** | --- ### Deals excluded (close date outside Q3: 2026-10-01 through 2026-10-15) | Category | Deals | Total amount | |---|---|---| | PIPELINE | 22 | 185,565 | | COMMIT | 1 (Deal-D348E1: 13,770) | 13,770 | | BEST_CASE | 9 | 28,240 | | **Total** | **32** | **$227,575** | Arithmetic: 185,565 + 13,770 + 28,240 = 227,575 --- ### Top 5 BEST_CASE deals by amount (inside Q3) | Rank | Deal | Amount | Close Date | |---|---|---|---| | 1 | Deal-2D7423 | $38,935 | 2026-09-30 | | 2 | Deal-25F752 | $24,000 | 2026-09-25 | | 3 | Deal-E53952 | $19,656 | 2026-09-30 | | 4 | Deal-5EED42 | $16,250 | 2026-09-30 | | 5 | Deal-FA32A0 | $11,116 | 2026-09-25 | --- ## Data quality Nearly every deal has a blank `owner` field, eliminating rep-level accountability and making coverage or scrub analysis impossible. The vast majority of `why_buys_chars` values are 0, meaning deal-level rationale is absent and forecast confidence cannot be validated qualitatively. Deal-A5E80A sits in DS1 (discovery) yet is flagged COMMIT — an early-stage deal with commit-level confidence signals a stale stage update or miscategorized forecast label. Deal-42326B carries a fractional amount ($2,480.40), and multiple deals cluster on quarter-boundary close dates (2026-09-30 / 2026-10-01), both suggesting data-entry artifacts or quota-influenced date-shifting that would corrupt an unattended forecast run.
## ARR Reconciliation — 2026-09-05 ### Totals | Source | ARR | |--------|-----| | CRM (HubSpot) | $603,581.76 | | Billing (Chargebee MRR × 12) | $617,897.76 | | **Variance (CRM − Billing)** | **−$14,316.00** | Billing exceeds CRM by $14,316. --- ### Bucket Decomposition (sums to −$14,316.00) | Bucket | Amount | Explanation | |--------|--------|-------------| | Status mismatch | $0.00 | 2 cancelled subs still carry CRM ARR (net zero because CRM = Billing) | | Rounding | $36.00 | 2 accounts where CRM ARR is a round number ≠ MRR×12 | | Missing records | −$11,952.00 | 1 company in CRM with no billing sub; 1 sub with no CRM company | | Other | −$2,400.00 | 1 account with unexplained large discrepancy | | **Total** | **−$14,316.00** | ✓ Matches variance | #### Status Mismatch ($0.00 net) | Company | Sub | Billing Status | CRM ARR | Billing ARR | Diff | Suggested Owner | |---------|-----|----------------|---------|-------------|------|-----------------| | C-0C8323BF | SUB-000E | cancelled | $4,905.24 | $4,905.24 | $0.00 | Customer Success — confirm churn, zero out CRM ARR | | C-0DC4FB8C | SUB-000F | cancelled | $8,253.24 | $8,253.24 | $0.00 | Customer Success — confirm churn, zero out CRM ARR | Both subscriptions are cancelled in billing but CRM still carries ARR. Even though the dollar delta is zero (CRM happens to equal MRR×12), these are stale records that inflate both sides and should be cleaned up. #### Rounding ($36.00) | Company | Sub | CRM ARR | Billing ARR | Diff | Suggested Owner | |---------|-----|---------|-------------|------|-----------------| | C-0D66DF9E | SUB-0005 | $23,200.00 | $23,184.00 | +$16.00 | Billing Ops — CRM likely stores rounded annual; align CRM to $23,184.00 | | C-14D70CE0 | SUB-0008 | $18,200.00 | $18,180.00 | +$20.00 | Billing Ops — same; align CRM to $18,180.00 | Both CRM values are round numbers that exceed MRR×12 by $16 and $20 respectively — classic rounding in HubSpot manual entry. #### Missing Records (−$11,952.00) | Company | Sub | CRM ARR | Billing ARR | Diff | Suggested Owner | |---------|-----|---------|-------------|------|-----------------| | C-0D5BBE3A | — | $16,497.24 | $0.00 | +$16,497.24 | Sales Ops — company exists in CRM with no billing subscription; verify deal stage / handoff | | C-21629AA4 | SUB-0004 | $0.00 | $28,449.24 | −$28,449.24 | Data Engineering — active subscription (SUB-0004, $2,370.77 MRR) with no CRM company record; create company in HubSpot | These are the largest contributors to the variance. C-21629AA4 alone accounts for $28,449.24 of billing ARR missing from CRM. #### Other (−$2,400.00) | Company | Sub | CRM ARR | Billing ARR | Diff | Suggested Owner | |---------|-----|---------|-------------|------|-----------------| | C-0F7269D7 | SUB-0006 | $24,396.00 | $26,796.00 | −$2,400.00 | RevOps — possible discount, credit, or CRM edit not reflected in billing; investigate amendment history | CRM is $2,400 below billing. Not explainable by rounding or status. Likely a manual CRM adjustment (discount/credit) that should be formalized in billing or the CRM value should be reverted. --- ### Business Rule Violations Rule: Any subscription with term ≠ 12 months must have `cf_agreement_end_date` populated. | Sub | Company | Term | cf_agreement_end_date | Action | |-----|---------|------|-----------------------|--------| | SUB-0002 | C-1794A52C | 24 mo | *(empty)* | Populate with contract end date or flag to Sales Ops | | SUB-0019 | C-22170CA1 | 36 mo | *(empty)* | Populate with contract end date or flag to Sales Ops | Two other non-12-month subs (SUB-000C and SUB-001A) comply — both have `cf_agreement_end_date = 2027-11-30`.
| KVM | Aug-26 | Jul-26 | Abs Δ | Rel Δ | Dir | |---|---|---|---|---|---| | Giving Rate | 0.6027 | 0.6023 | +0.0004 | +0.07% | ↑ | | Redemptions/User | 1.7302 | 1.7300 | +0.0002 | +0.01% | ↑ | | 1:1 Engagement | 0.4472 | 0.4469 | +0.0003 | +0.06% | ↑ | | Pulse Engagement | 0.5086 | 0.6006 | −0.0920 | −15.31% | ↓ | Pulse Engagement has the largest relative move (−15.31%). The **enterprise** size_band is driving it: enterprise pulse collapsed from 0.5500 → 0.2743 (−50.13%), while SMB was flat (−0.22%) and mid-market was flat (+0.21%). The enterprise drop is massive enough to pull the aggregate down by 15 points despite being only 10 of 30 accounts.
## Eligibility Screening Snapshot date: **2026-09-05**. R3 ceiling: 120 days out = **2027-01-03**. An account qualifies only if it passes **all three rules** (R1: health < 60, R2: eligible amount > 0, R3: renewal ≤ 2027-01-03). --- ## Qualifying Accounts (8 of 30) | Account | Health | Eligible Amt | Renewal | R1 | R2 | R3 | |---|---|---|---|---|---|---| | C-0F6C0F34 | 51 | $49,707 | 2026-10-03 | ✓ | ✓ | ✓ | | C-0B827671 | 56 | $25,365 | 2026-11-14 | ✓ | ✓ | ✓ | | C-0B360C78 | 57 | $35,748 | 2026-10-28 | ✓ | ✓ | ✓ | | C-0B0F1BAB | 38 | $5,494 | 2026-09-23 | ✓ | ✓ | ✓ | | C-0CA21961 | 58 | $16,829 | 2026-12-28 | ✓ | ✓ | ✓ | | C-0E9C27D1 | 39 | $41,235 | 2026-09-24 | ✓ | ✓ | ✓ | | C-0CEF69FD | 53 | $32,621 | 2026-11-21 | ✓ | ✓ | ✓ | | C-0D3278C7 | 54 | $17,602 | 2026-11-12 | ✓ | ✓ | ✓ | **Total at stake: $224,601** Arithmetic: 49,707 + 25,365 + 35,748 + 5,494 + 16,829 + 41,235 + 32,621 + 17,602 = **224,601** --- ## Play Assignment ### Usage Revival (3 accounts) | Account | Eligible Amt | Signal | |---|---|---| | C-0B827671 | $25,365 | usage_trend_3m = **declining**; utilization 113/202 = 56% | | C-0CA21961 | $16,829 | utilization 84/325 = **26%** (severe seat waste); usage flat | | C-0D3278C7 | $17,602 | usage_trend_3m = **declining**; utilization 126/380 = 33% | ### Executive Touch (3 accounts) | Account | Eligible Amt | Signal | |---|---|---| | C-0F6C0F34 | $49,707 | champion_active = **false**; usage actually growing — problem is relationship, not adoption | | C-0B0F1BAB | $5,494 | champion_active = **false**; health = 38 (lowest of all qualifiers) | | C-0CEF69FD | $32,621 | champion_active = **false**; usage growing but no internal advocate to carry renewal | ### Commercial Concession (2 accounts) | Account | Eligible Amt | Signal | |---|---|---| | C-0B360C78 | $35,748 | Champion active, usage **growing**, utilization 75% — yet health = 57. Value/price perception gap. | | C-0E9C27D1 | $41,235 | Champion active, utilization **85%**, usage flat — yet health = 39. Product delivers but perceived ROI falls short; pricing/term relief warranted. | --- ## At-Risk Accounts That Do NOT Qualify (7 accounts) All seven meet R1 (health < 60) but fail at least one remaining rule. | Account | Health | Fails Rule | Reason | |---|---|---|---| | C-0BC71BDD | 55 | **R2** | churn_save_eligible_amount = $0 — no save budget authorized | | C-0F6694C3 | 43 | **R2** | churn_save_eligible_amount = $0 | | C-0BE96399 | 54 | **R2** | churn_save_eligible_amount = $0 | | C-0FCCD2DF | 43 | **R2** | churn_save_eligible_amount = $0 | | C-10A56B0F | 54 | **R2** | churn_save_eligible_amount = $0 | | C-0BA71F12 | 52 | **R3** | Renewal 2027-04-11 is 218 days out (> 120) | | C-0F876796 | 47 | **R3** | Renewal 2027-02-06 is 154 days out (> 120) | Five accounts carry genuine churn risk (health as low as 43) but have no save-eligible amount authorized — the commercial team has not opened a concession budget for them. Two others have eligible amounts but renewals too far out to justify intervention today under the 120-day window.
## Expansion Kit — C-0DDFC9A7 --- ### Seat Coverage | Metric | Value | |---|---| | Licensed seats | 150 | | Headcount | 400 | | Coverage | **150 ÷ 400 = 37.5%** of headcount licensed | --- ### Usage Health 1. **Active users climbing every month:** 88 (Mar) → 95 → 102 → 110 → 118 → 126 (Aug) — steady ~7.5% MoM growth, 43.2% total over five months. 2. **Seat utilization tightening:** 126 active users ÷ 150 licensed seats = **84% utilization** in Aug, up from 59% in Mar. At current trajectory, licensed seats will be fully consumed within ~3 months. --- ### Headroom | | Seats | ARR | |---|---|---| | Per-seat rate | — | $9,000 ÷ 150 = **$60/seat/yr** | | Unused within current license | 150 − 126 = **24 seats** | 24 × $60 = **$1,440** | | Expansion to full headcount | 400 − 150 = **250 seats** | 250 × $60 = **$15,000** | --- ### Who Replied & Buying Authority - **Replied:** Maria S., People Operations Coordinator - **Can she buy?** No — she explicitly states budget and seat expansion sit with **Dana R., VP People**. ### Right Buyer **Dana R., VP People** — owns purchasing decisions and seat/budget expansion. She has also been asking about usage numbers per Maria's reply, suggesting she is already evaluating. --- ### Reply Email > Hi Maria, > > Thanks — great to hear the team loves it! One thing that jumped out at us: your active users climbed from 88 in March to 126 in August, a 43% jump in five months with no prompting. That kind of organic adoption usually signals more teams want in. > > Since Dana's already asking about usage numbers, I'd love to walk her through the full picture — growth trend mapped against your current 150-seat license. An intro from you would go a long way. Would you be open to connecting us? > > Best, > Cole
## CSM Mid-Onboarding Prep — C-0D284E42 **Signup:** 2026-08-11 · **Data through:** 2026-09-04 (day 25) --- ### Onboarding Checklist | Milestone | Status | Evidence | |---|---|---| | Slack integration | ✅ Complete | `integration_slack = 2026-08-12` | | HRIS integration | ❌ Not complete | `integration_hris` is empty | | Allowance set | ✅ Complete | `allowance_set = 2026-08-13` | | Admins added | ✅ Complete | `admins_added = 2` | | First recognition | ✅ Complete | `first_recognition_at = 2026-08-15 14:22` | | First redemption | ❌ Not complete | `first_redemption_at` is empty | --- ### Early Engagement Signals - **Slack connected day 1 post-signup** — fast IT/action orientation. - **First recognition on day 4** — quick time-to-value; didn't stall waiting for everyone. - **Active givers: 3 → 15 over 25 days** (5× growth). Week-by-week: - Week 1 (Aug 11–17): 3–7 givers - Week 2 (Aug 18–24): 5–9 givers - Week 3 (Aug 25–31): 9–13 givers - Week 4 (Sep 1–4): 13–15 givers - **Weekend dips are shallow** (e.g., Sat 8/22 = 8, then Mon = 9) — habit forming, not just top-down pushes. - **Growth is accelerating in week 4** (9→13→15) — they're past early adopters and into broader adoption. - **But no redemption in 25 days** — people are giving but not seeing rewards claimed. This is the clearest risk flag. --- ### Three Things to Cover on the Call **1. HRIS integration — still not connected.** Without HRIS, user provisioning is manual, which becomes a scaling chokepoint as active givers grow. Ask what's blocking it (IT queue? scope fears?) and offer a paired setup call with their IT contact. **2. Zero redemptions after 25 days — the biggest risk.** 15 active givers but nobody has redeemed. This means recognition is landing but the "give → redeem → reinforce" loop is broken. Possible causes: confusing catalog, low point values, or they simply haven't looked. Open with: "We're seeing strong giving momentum — have any recipients mentioned trying to redeem?" If the catalog isn't live, prioritize that; if it is, send a how-to nudge to recent recipients. **3. Ride the adoption wave — suggest a push to expand.** Giver growth is compounding (13→15 in the last few days). This is the moment to amplify: propose a company-wide recognition challenge or manager nudge campaign to convert the next cohort before early momentum plateaus.
# 90-DAY RENEWAL RISK BRIEF Window: 2026-09-08 → 2026-12-07 | 20 accounts --- ## RENEWAL-DATE DISAGREEMENTS Five accounts show conflicts between ChurnZero and ChargeBee. All five are multi-year contracts; per the known defect (ChurnZero misdates multi-year terms), ChargeBee is trusted. | Account | ChurnZero | ChargeBee | Trust | Reason | |---|---|---|---|---| | C-0B7D2C30 | 2026-09-10 | 2026-09-15 | ChargeBee | Multi-year (36-mo); CZ 5 days early | | C-0BCDB8C2 | 2027-09-18 | 2026-09-18 | ChargeBee | Multi-year (36-mo); CZ off by 1 full year | | C-0D2AB865 | 2026-09-10 | 2026-09-22 | ChargeBee | Multi-year (24-mo); CZ 12 days early | | C-0BBE3E60 | 2027-09-26 | 2026-09-26 | ChargeBee | Multi-year (24-mo); CZ off by 1 full year | | C-0F5D2323 | 2026-09-10 | 2026-09-29 | ChargeBee | Multi-year (24-mo); CZ 19 days early | All remaining 15 accounts (single-year) agree between both systems. --- ## RENEWAL TABLE Sorted by renewal date used. Trend = active-user change Jun→Aug 2026. | # | Account | CSM | ARR | Renewal Date | Seat Util | 3-Mo Trend | Risk | Evidence | |---|---|---|---|---|---|---|---|---| | 1 | C-0B7D2C30 | Dana Mercer | $65,901 | 2026-09-15 | 274/476 = 57.6% | -13.4% (97→94→84) | HIGH | Utilization below 60% and active users have fallen every month for 12 straight months | | 2 | C-0BCDB8C2 | Cole Ingram | $54,427 | 2026-09-18 | 232/424 = 54.7% | -13.4% (127→118→110) | HIGH | Seat utilization under 55% with 12-month unbroken decline from 200 to 110 active users | | 3 | C-0D2AB865 | Elena Sinclair | $38,022 | 2026-09-22 | 250/407 = 61.4% | -12.8% (125→117→109) | HIGH | Steady 12-month erosion from 199→109 active users; no recovery signal | | 4 | C-0BBE3E60 | Dana Mercer | $30,993 | 2026-09-26 | 74/114 = 64.9% | -15.4% (39→35→33) | HIGH | Sharpest 3-month drop in the cohort; 12-month decline from 63→33 active users | | 5 | C-0F5D2323 | Cole Ingram | $90,647 | 2026-09-29 | 111/390 = 28.5% | -10.0% (20→21→18) | HIGH | Lowest utilization in cohort at 28.5%; only 18-21 active users on 390 seats | | 6 | C-0EC6999D | Elena Sinclair | $79,419 | 2026-10-03 | 31/112 = 27.7% | -11.8% (17→16→15) | HIGH | Second-lowest utilization at 27.7%; 15 active users on 112 seats with declining trend | | 7 | C-0B20DB64 | Dana Mercer | $21,770 | 2026-10-07 | 214/378 = 56.6% | 0.0% (294→298→294) | MEDIUM | Utilization gap is notable but engagement is rock-steady at ~294-298 all year | | 8 | C-0BBC4E7A | Cole Ingram | $56,374 | 2026-10-10 | 228/337 = 67.7% | -2.1% (142→141→139) | MEDIUM | Mild drift downward in active users; utilization acceptable but trend warrants monitoring | | 9 | C-0FD551AB | Elena Sinclair | $48,815 | 2026-10-14 | 210/376 = 55.9% | +2.4% (123→122→126) | MEDIUM | Usage recently upticked but utilization remains below 60% | | 10 | C-0F9F8F13 | Dana Mercer | $46,230 | 2026-10-18 | 199/352 = 56.5% | -1.6% (185→185→182) | MEDIUM | Essentially flat engagement; utilization gap (56.5%) is the concern | | 11 | C-0BC34584 | Cole Ingram | $16,740 | 2026-10-22 | 327/494 = 66.2% | +1.9% (104→104→106) | LOW | Stable usage with slight uptick; utilization adequate | | 12 | C-0B7A7546 | Elena Sinclair | $35,062 | 2026-10-25 | 182/205 = 88.8% | -1.6% (64→65→63) | LOW | Best utilization in cohort; minor fluctuation around 58-65 active users is normal for small seat count | | 13 | C-0B369871 | Dana Mercer | $85,128 | 2026-10-29 | 317/422 = 75.1% | +2.1% (326→330→333) | LOW | Consistent growth from 289→333 over 12 months; strong utilization | | 14 | C-0B144C78 | Cole Ingram | $30,899 | 2026-11-02 | 169/224 = 75.4% | +5.0% (101→101→106) | LOW | Active users growing steadily (90→106 over 12 months); good utilization | | 15 | C-0FC4DBB8 | Elena Sinclair | $94,732 | 2026-11-05 | 356/464 = 76.7% | +2.1% (189→191→193) | LOW | Monotonic 12-month growth (168→193); healthy utilization | | 16 | C-0D5BBE3A | Dana Mercer | $39,740 | 2026-11-09 | 85/102 = 83.3% | +3.4% (88→90→91) | LOW | Steady growth (76→91) with high utilization | | 17 | C-0FB9D5AF | Cole Ingram | $63,158 | 2026-11-13 | 144/199 = 72.4% | +1.7% (173→173→176) | LOW | Consistent upward trend (154→176); utilization solid | | 18 | C-0B344485 | Elena Sinclair | $64,384 | 2026-11-16 | 224/287 = 78.0% | +2.5% (238→240→244) | LOW | Strong 12-month growth (211→244); good utilization | | 19 | C-0CB2C1B4 | Dana Mercer | $40,628 | 2026-11-20 | 386/473 = 81.6% | +4.3% (47→48→49) | LOW | Active users growing (43→49) with high utilization | | 20 | C-22170CA1 | Cole Ingram | $45,646 | 2026-11-24 | 251/294 = 85.4% | +2.1% (143→148→146) | LOW | Second-highest utilization at 85.4%; usage growing (130→146) | --- ## SUMMARY TOTALS | Metric | Value | Arithmetic | |---|---|---| | Total ARR renewing | $1,048,715 | Sum of all 20 accounts | | HIGH-risk ARR | $359,409 | $65,901 + $54,427 + $38,022 + $30,993 + $90,647 + $79,419 | | MEDIUM-risk ARR | $173,189 | $21,770 + $56,374 + $48,815 + $46,230 | | LOW-risk ARR | $516,117 | $16,740 + $35,062 + $85,128 + $30,899 + $94,732 + $39,740 + $63,158 + $64,384 + $40,628 + $45,646 | Check: $359,409 + $173,189 + $516,117 = $1,048,715 ✓ --- **ARR at risk (HIGH): $359,409 — 34.3% of renewing portfolio** ($359,409 / $1,048,715) Six accounts drive all HIGH risk. Two patterns dominate: 1. **Steep 12-month usage decay** (C-0B7D2C30, C-0BCDB8C2, C-0D2AB865, C-0BBE3E60) — each has lost 35-48% of active users over 12 months with no recovery signal. C-0BBE3E60 is accelerating (sharpest 3-mo drop at -15.4%). 2. **Critical under-utilization** (C-0F5D2323, C-0EC6999D) — both sit below 29% seat utilization. C-0F5D2323 carries the single largest at-risk ARR ($90,647) with only 18-21 active users on 390 seats. If MEDIUM risk is included, **$532,598 (50.8%)** of the renewing portfolio requires active intervention.
All 80 tickets classified, 0 unclassified. Here is the synthesis ranked by ARR exposure: --- **1. HRIS Provisioning Failure** — BROAD - Count: 12 (15.0%) | Distinct accounts: 3 | ARR affected: $114,000 - Sample IDs: IC-460059, IC-460055 - Accounts: C-0B2213A9 ($36k), C-0F6C0F34 ($30k), C-0DDFC9A7 ($48k) - Recommendation: Audit the HRIS sync pipeline; provisioning logs show no errors yet hires are skipped, indicating a silent failure in the webhook/transform layer. **2. Billing & Invoice Errors** — SINGLE-ACCOUNT NOISE - Count: 16 (20.0%) | Distinct accounts: 1 | ARR affected: $52,000 - Sample IDs: IC-460071, IC-460069 - Account: C-0E9C27D1 ($52k) — all 16 tickets are this one account - Recommendation: Escalate C-0E9C27D1's billing saga immediately; three distinct sub-defects (seat-count inflation, wrong tier price, unapproved seat count) across 16 tickets signal a systematic catalog/pricing-config corruption for this account. **3. Redemption & Checkout Failure** — BROAD - Count: 13 (16.2%) | Distinct accounts: 5 | ARR affected: $48,900 - Sample IDs: IC-460025, IC-460030 - Accounts: C-0CEF69FD ($8.9k), C-0B827671 ($10.7k), C-0F876796 ($8.7k), C-0FCCD2DF ($9.6k), C-14264ABD ($11k) - Recommendation: Investigate the checkout/gift-card vendor API; failures span five accounts with two sub-patterns (checkout hang and delivery failure), likely a shared downstream dependency. **4. Gift Card Double-Debit** — BROAD - Count: 5 (6.2%) | Distinct accounts: 4 | ARR affected: $38,200 - Sample IDs: IC-460024, IC-460023 - Accounts: C-0FCCD2DF ($9.6k), C-0F876796 ($8.7k), C-0D9CA315 ($9.6k), C-0B0F1BAB ($10.3k) - Recommendation: Add an idempotency guard on the redemption ledger; points are deducted before the vendor confirms fulfillment, so a rollback on error would eliminate the double-debit. **5. Points Not Posting** — BROAD - Count: 20 (25.0%) | Distinct accounts: 9 | ARR affected: $31,100 - Sample IDs: IC-460004, IC-460016 - Accounts: C-0D3278C7 ($3.5k), C-0BF20542 ($4.5k), C-0D0B047C ($4.5k), C-0BE96399 ($2.7k), C-0D284E42 ($3.4k), C-0D6CC8E3 ($4.2k), C-21FEBCBB ($2.9k), C-0DD0626C ($2.5k), C-0B2895EF ($2.9k) - Recommendation: Replay or re-queue the recognition-to-ledger pipeline; the "delivered but never arrived" and "not posting after weekend" patterns across 9 accounts suggest a queue/backlog issue, not per-user error. **6. Slack Integration Broken** — BROAD - Count: 14 (17.5%) | Distinct accounts: 4 | ARR affected: $18,900 - Sample IDs: IC-460041, IC-460047 - Accounts: C-0B843542 ($4.4k), C-10A56B0F ($5.4k), C-0BA71F12 ($3.9k), C-8C2E8F00 ($5.2k) - Recommendation: Debug the OAuth token persistence; sync toggles resetting and re-auth not sticking point to a token-refresh or scopes bug in the Slack app. --- **Summary**: 5 broad themes + 1 single-account cluster (C-0E9C27D1's billing saga). HRIS provisioning is the highest ARR exposure at $114k despite being only 15% of volume — three large accounts are silently failing. The billing cluster looks like a volume crisis (20% of tickets) but is entirely one account; the underlying bug is likely a pricing-catalog misconfiguration rather than a systemic platform issue. Points Not Posting has the highest volume (25%) but the lowest per-account ARR, consistent with smaller-plan customers hitting a shared pipeline backlog.
**Prospect:** C-82AF3719 — Technology / Mid-Market / employee_recognition / NA-West --- ### Ranked similar customers with case studies Each dimension match = 1 point. All three below score 3/4; ties broken by use_case > industry priority (use-case match is strongest social proof). | Rank | Customer | Score | Matching fields | Mismatched field | |------|----------|-------|-----------------|------------------| | 1 | **C-64171065** | 3/4 | industry=Technology, size_band=Mid-Market, use_case=employee_recognition | region (NA-East ≠ NA-West) | | 2 | **C-11C31562** | 3/4 | size_band=Mid-Market, use_case=employee_recognition, region=NA-West | industry (Manufacturing ≠ Technology) | | 3 | **C-A13C193D** | 3/4 | industry=Technology, size_band=Mid-Market, region=NA-West | use_case (retention ≠ employee_recognition) | --- ### Arithmetic detail Only 8 of 24 customers have case studies. Scoring each against the prospect on the four dimensions: | Customer | industry | size_band | use_case | region | Total | |----------|----------|-----------|----------|--------|-------| | C-FEFCC020 | 0 | 0 | 0 | 0 | 0 | | C-11209339 | 0 | 0 | 0 | 0 | 0 | | C-9D69D147 | 0 | 1 | 0 | 1 | 2 | | **C-11C31562** | 0 | **1** | **1** | **1** | **3** | | C-CD4829A7 | 1 | 1 | 0 | 0 | 2 | | C-0CE315B2 | 0 | 0 | 0 | 0 | 0 | | **C-64171065** | **1** | **1** | **1** | 0 | **3** | | **C-A13C193D** | **1** | **1** | 0 | **1** | **3** | Top 3 at 3/4 selected. No customer without a case study is included. No billing data or contact names referenced.
## Channel Performance — Trailing 6 Months (2026-03 to 2026-08) ### Paid Channels | Channel | Spend | SQMs | SQOs | $/SQM | $/SQO | SQM→SQO | Pipeline | $/$ | |---|---|---|---|---|---|---|---|---| | paid_search | $36,000 | 39 | 18 | $923 | $2,000 | 46.2% | $720,000 | $20.00 | | linkedin_ads | $24,000 | 25 | 8 | $960 | $3,000 | 32.0% | $96,000 | $4.00 | | paid_social | $18,000 | 0 | 0 | undef | undef | undef | $0 | $0 | | webinars | $9,000 | 12 | 5 | $750 | $1,800 | 41.7% | $60,000 | $6.67 | **paid_social** has $18K spend and zero SQMs → all per-unit metrics reported as **undefined**, not zero. ### Organic channels | Channel | Volume (SQMs) | SQO rate | Pipeline | |---|---|---|---| | organic_search | 28 | 35.7% (10/28) | $90,000 | | referral | 15 | 40.0% (6/15) | $48,000 | ### Flagged: SQO date precedes SQM date | Contact | Channel | SQM date | SQO date | Gap | |---|---|---|---|---| | CT-000044 | linkedin_ads | 2026-07-23 | 2026-07-18 | SQO 5 days before SQM | | CT-000041 | linkedin_ads | 2026-06-14 | 2026-06-09 | SQO 5 days before SQM | Both flags are in linkedin_ads. Likely causes: retroactive SQM stamp after prior SQO, or data-entry error. These 2 records contribute $24K pipeline to linkedin_ads; if excluded, linkedin_ads drops to 6 SQOs / $72K pipeline / $3.33 per dollar. --- ### Reallocation recommendation **1. Pause paid_social and audit tracking immediately.** $18K spend with zero attributed contacts is the highest-priority problem. This is almost certainly a tracking gap (UTM misconfiguration, form routing, or CRM integration break) rather than true zero demand. Do not re-invest until attribution is verified. **2. Reallocate 60% of paused paid_social budget ($10.8K) → paid_search.** Rationale: paid_search delivers $20 pipeline per dollar — 5× linkedin_ads and 3× webinars. At current efficiency, $10.8K incremental spend would generate ~$216K incremental pipeline (39 SQMs / $36K → 0.001083 SQM/$ × $10,800 ≈ 11.7 new SQMs; at 46.2% conversion → ~5.4 new SQOs × $40K = ~$216K). **3. Reallocate 40% of paused paid_social budget ($7.2K) → webinars.** Webinars have the lowest $/SQM ($750) and strongest SQM→SQO rate among paid channels at smaller scale (41.7%). Additional $7.2K would fund ~9.6 new SQMs at current $/SQM, yielding ~4 new SQOs and ~$48K pipeline. **4. Hold linkedin_ads flat but resolve the 2 SQO-before-SQM flags.** These suggest data-quality issues that inflate pipeline by $24K (25% of channel total). Clean the data, then reassess $/SQO — true cost per SQO may be $4,000+ rather than the stated $3,000. **5. Invest in organic_search and referral amplification (no marginal spend).** Organic delivers $90K pipeline on zero spend; referral delivers $48K. Tactics: SEO content velocity, referral incentive program, customer advocacy play — these shift the organic mix upward without adding paid budget. ### Confidence: MEDIUM - paid_search (n=39 SQMs, 18 SQOs) — sample adequate for directionally correct metrics. - linkedin_ads (n=25) — moderate; 2 flagged records inject uncertainty. - webinars (n=12) — small sample; $/SQM and SQM→SQO rates could swing ±20% with 1–2 more outcomes. - paid_social — zero signal; cannot distinguish tracking failure from true non-performance. **Any reallocation estimate assumes the gap is tracking, not demand.** - Organic samples (28, 15) — small but sufficient for directional comparison. - Pipeline amounts are uniform within each channel ($40K, $12K, $9K, $8K), suggesting standardized deal-size assumptions rather than observed variance. Actual pipeline may diverge.
# Battlecard: Rivally (updated 2026-09-06) --- ## One-line positioning Points-based employee recognition platform now expanding into engagement surveys (Rivally Pulse add-on) and EU enterprise, with EU data residency GA. [S02, S06, S15, S23] --- ## Pricing | Claim | Price | Source | Date | |---|---|---|---| | Recognition Starter listed at $5/user/mo | $5 | pricing_page [S03] | 2026-01-20 | | Still showing $5/user/mo on pricing page | $5 | pricing_page [S08] | 2026-04-01 | | Quoted $6.50/user/mo to 500-seat prospect | $6.50 | call_notes [S13] | 2026-06-02 | | **Recognition Starter updated to $7/user/mo** | **$7** | **pricing_page [S17]** | **2026-08-12** | | Quoted $7/user/mo list, 15% discount on 3-year term | $7 list, ~$5.95 net | call_notes [S18] | 2026-08-14 | **Pricing conflict:** Two earlier pricing-page snapshots show $5/user/mo [S03, S08], but the most recent pricing page [S17, 2026-08-12] shows $7/user/mo — a 40% increase. The newer source wins. Rivally also discounts: 15% off list for 3-year commits [S18] (~$5.95/user/mo net). Rivally Pulse is priced as a separate add-on [S23]. Annual billing required [S03, S17]. --- ## Where they win - **Fast mid-market setup:** Setup under a week, Slack integration out of the box. [S04] - **EU data residency & expansion:** EU data residency GA; Dublin office opened; hired ex-Workday VP EMEA. [S11, S15] - **Multi-language for distributed EU teams:** EU enterprise reviewers praise multi-language support. [S12] - **Responsive support:** Support response under 4 hours. [S22] - **Engaging recognition feed:** Points-based feed praised for engagement. [S02, S16] - **Microsoft Teams integration v2:** In public preview. [S19] --- ## Where we win - **Analytics depth:** Limited analytics noted repeatedly [S02]; reporting dashboards basic [S07]; analytics exports CSV-only, making migration off Rivally hard [S20]; 800-seat prospect chose Bonusly over Rivally specifically citing analytics depth [S25]. - **Enterprise provisioning:** No SCIM provisioning; manual user management painful at enterprise scale [S10]. - **Admin tooling:** Admin tooling lags peers [S16]; admin console still lacks bulk recognition editing [S24]. - **EMEA rewards catalog:** Thinner than US catalog [S14] — weakens their EU enterprise play. --- ## Objections and responses | Objection | Response | |---|---| | "Rivally is cheaper" | They just raised list price 40% ($5→$7/user/mo) [S03→S17]. Discounted 3-year terms net ~$5.95 [S18], but that locks you into a rising price trajectory. | | "Rivally has EU data residency" | True [S15], but their EMEA rewards catalog is thinner than US [S14], and without SCIM [S10] you'll manage users manually at scale. | | "Rivally sets up fast" | True for mid-market [S04], but without SCIM and with CSV-only exports [S10, S20], operational pain accumulates fast as you grow. | | "Rivally Pulse gives us surveys too" | Pulse is a separate paid add-on, not bundled [S23] — compare total cost, not just base tier. | --- ## Recent changes | Change | Source | |---|---| | Price increase: Recognition Starter $5→$7/user/mo (40% hike) | [S03→S17] | | Rivally Pulse add-on exited beta, priced separately | [S23] | | Dublin office opened; EU data residency GA | [S15] | | Hired ex-Workday VP EMEA to lead European expansion | [S11] | | Microsoft Teams app v2 entered public preview | [S19] | --- ## Our 12-month win/loss record (Sep 2025 – Aug 2026) | Month | Wins | Losses | |---|---|---| | 2025-09 | 1 | 1 | | 2025-10 | 2 | 0 | | 2025-11 | 1 | 1 | | 2025-12 | 1 | 1 | | 2026-01 | 2 | 0 | | 2026-02 | 2 | 0 | | 2026-03 | 1 | 1 | | 2026-04 | 0 | 2 | | 2026-05 | 0 | 1 | | 2026-06 | 1 | 0 | | 2026-07 | 1 | 0 | | 2026-08 | 1 | 0 | | **Total** | **13** | **7** | **Win rate: 13/20 = 65%.** Note: losses cluster in Apr–May 2026 (3 losses, 0 wins), coinciding with their EU/data-residency push [S11, S15]. --- ## Old-card claims: verification status | Old claim | Status | |---|---| | "points-based recognition for mid-market" | Partially confirmed [S02] — but they've expanded to enterprise EU [S12], so "mid-market" alone is outdated. | | "starts at $5/user/month" | **Superseded** — now $7/user/mo [S17]. | | "Rivally lacks a Slack integration" | **Incorrect** — Slack integration works out of the box [S04]. | | "Rivally was acquired by WorkHuman in 2025" | **UNVERIFIED** — no snippet supports this claim. | | "Strong in EU enterprise with multi-language support" | Confirmed [S12]. |
**New Logo Nurture** Step 1: 500 sent / 42.0% open / 8.4% reply / 2.4% mtg Step 2: 458 sent / 34.9% open / 6.6% reply / 2.0% mtg Step 3: 428 sent / 28.0% open / 4.2% reply / 1.4% mtg Weakest: Step 3 (4.2% reply, 1.4% mtg — normal decay, still above 2%) **Expansion Nurture** Step 1: 300 / 43.3% / 7.3% / 1.7% Step 2: 300 / **113.3%** / 8.3% / 1.3% Step 3: 275 / 34.5% / 4.4% / 1.1% Weakest: Step 3 (4.4% reply). **Step 2 tracking error: 340 opens > 300 sent** — double-firing pixel or cross-step misattribution. **Cold Outbound – HR Leaders** Step 1: 600 / 40.0% / **0.83%** / 0 Step 2: 595 / 29.4% / **0.34%** / 0 Step 3: 590 / 22.0% / **0.17%** / 0 All steps below 2% reply. Zero meetings on 1,785 sends. **Cold Outbound – People Ops** Step 1: 400 / 37.5% / 3.5% / 0.75% Step 2: 386 / 28.5% / 2.3% / 0.52% Step 3: 377 / 21.2% / **1.6%** / 0.27% Step 3 below 2%. **Tracking error:** Expansion Nurture Step 2 (340 opens on 300 sent). **Audience overlap:** 18 contacts appear in both Cold Outbound – HR Leaders and Cold Outbound – People Ops (e.g. CT-000849, CT-000884, CT-001033, CT-001103, CT-001105, CT-001130, CT-001255, CT-001258, and 10 more). 2 contacts overlap Expansion Nurture and New Logo Nurture (CT-000301, CT-000624). HR Leaders ↔ People Ops overlap is the material concern — same person receiving two concurrent cold sequences. **Failure mode — HR Leaders (all steps <2%):** 40% step-1 open rate proves deliverability and subject lines work. Reply collapses to 0.83% → body/offer doesn't resonate with the HR-leader persona. Zero meetings confirms systemic content mismatch, not timing. **Failure mode — People Ops Step 3 (1.6%):** Sequential decay (3.5% → 2.3% → 1.6%) — list fatigue; step 3 CTA lacks urgency. **One change per weak sequence, priority order:** 1. **Cold Outbound – HR Leaders** — Rewrite step 1 body with HR-leader-specific pain points (retention metrics, headcount planning, turnover cost). Highest priority: 0 meetings on the largest send volume. 2. **Expansion Nurture** — Fix step 2 open-tracking pixel before trusting any step-2 metrics. 3. **Cold Outbound – People Ops** — Inject social-proof/case-study into step 3 to lift reply above 2%. 4. **New Logo Nurture** — No urgent change; step 3 at 4.2% is healthy.
## Q3-2026 Weekly Marketing Goals Update (Day 66 of 92) | Metric | QTD Actual | Target | Delta | Pace Target (66/92) | Pace | |---|---|---|---|---|---| | SQMs | 230 | 300 | −70 | 215.2 | **Ahead** | | SQOs | 84 | 120 | −36 | 86.1 | **Behind** | | DS2s | 40 | 75 | −35 | 53.8 | **Behind** | | Closed-lost MIA rate | 20.0% (5/25) | 10.0% | +10.0 pp | 10.0% (stock) | **Behind** | | Same-Q closes | 10 | 20 | −10 | 14.3 | **Behind** | | Active pipeline | $3.00M | $4.00M | −$1.00M | $4.00M (stock) | **Behind** | **Arithmetic shown:** - Days elapsed / days in quarter = 66/92 = **71.7%** of Q3 elapsed. - Pace targets (flow metrics): target × 0.7174. SQMs: 300×0.7174 = 215.2. SQOs: 120×0.7174 = 86.1. DS2s: 75×0.7174 = 53.8. Same-Q closes: 20×0.7174 = 14.3. - Closed-lost MIA rate: 5 MIA ÷ 25 closed-lost = **0.20 (20%)**. This is a rate/stock metric — compared directly to the 10% target; at 20% the rate is 2× the allowable ceiling. - Active pipeline: stock metric — compared directly to the $4M target; at $3M the gap is $1M with 26 days remaining. - Pace call: "Ahead" if actual ≥ pace target (for higher_better) or actual ≤ pace target (for lower_better); otherwise "Behind." **What moved this week:** Cannot isolate this week's movement — only QTD cumulative snapshots are provided (no prior-period or week-over-week file). What the QTD position shows: SQM generation is the lone bright spot, running ~7% ahead of pace (230 vs. 215 needed), likely feeding the funnel top. But that volume is not converting downstream — SQOs sit 2 below pace (84 vs. 86), and DS2s are sharply behind at 40 vs. 54 needed (a 26% pace gap), indicating a qualification or scoring bottleneck between M → O → DS2. The closed-lost MIA rate doubled its target (20% vs. 10%), meaning 1 in 5 losses had no rep activity — a coverage or hygiene problem. Same-quarter closes (10 of 20) are 30% behind pace, and the $3M pipeline is $1M short of the $4M target with only 28% of the quarter remaining, requiring ~$38K/day in net-new pipeline additions to close the gap. The core risk: top-of-funnel is healthy but mid-funnel conversion and rep engagement on at-risk deals are both lagging.
Don't trust the $116K Q3 forecast. It breaks down as $44.7K commit plus $71.2K from 35% of best case, but all 7 commit deals have no documented why-buy and 85 of 86 deals lack an owner. Clean the data before making any calls on this number.
Hi VP People team, Following up on the pricing recap I sent on August 5 for 150 seats after your July 28 demo. I know things get busy — just want to make sure that didn't slip through the cracks. The team's reaction to the automated milestone awards and points catalog was strong, and I'd love to keep momentum going. Could you let me know if you'd like to move forward, or if there are open questions I can address? Best, Alex
**Marketing** — SQMs landed at 46 versus a 52 target, leaving a 6-unit gap to close. The webinar channel carried its weight, contributing 18 of those SQMs. Paid search cost per SQM held at $150, so efficiency stayed steady even as volume dipped. **Sales** — The crew converted 14 SQOs and lined up 9 DS2 meetings, pumping $310,000 of new pipeline into the quarter. Three same-quarter closes landed this week — momentum where it counts. **CS** — Two renewals saved, and team NPS nudged up to 61. Three open red-flag accounts carry into next week and will need close attention to protect ARR. **PLG** — 412 new signups rolled in with activation at 31%. Thirty-eight companies hit the aha moment of 10 recognition gives — that's the flywheel starting to spin.
# Partner Digest — 2026-08-24 to 2026-09-04 --- **Apex Rewards Co** — Active Co-webinar locked for 09-15. Two sourced opps this period, both in DS1. Sourced pipeline: 2 deals | $275,000 (Deal-DDAAF2 $180,000 + Deal-2CF33E $95,000) **HRCloud Partners** — Active Integration referral cleared security review; opp advanced to DS2. One sourced opp this period. Sourced pipeline: 1 deal | $140,000 (Deal-F1CDA5 $140,000) **CultureBridge** — Active Lunch-and-learn produced two sourced opps; both early stage. Sourced pipeline: 2 deals | $135,000 (Deal-096E1D $60,000 + Deal-067213 $75,000) **WorkWell Group** — Active Wants to restart joint playbook in Q4; planning call booked for 09-09. No sourced deals this period. Sourced pipeline: 0 deals | $0 --- **Recogniq** — Quiet. No activity this period. **KudosWave** — Quiet. No activity this period. **PeopleFirst Advisors** — Quiet. No activity this period. **TotalPerk** — Quiet. No activity this period. --- **Period totals** — 5 partner-sourced deals | $550,000 ($275,000 + $140,000 + $135,000 + $0 = $550,000)
| Item | Question | Answer | Source | |------|----------|--------|--------| | Q1 | Is customer data encrypted at rest? If so, how? | Yes. Customer data is encrypted at rest using AES-256. | [P1] | | Q2 | Is data encrypted in transit? | Yes. Data in transit is encrypted with TLS 1.2 or higher. | [P1] | | Q3 | Do you hold a SOC 2 report, and can we obtain a copy? | Yes. Bonusly holds a SOC 2 Type II report, renewed annually. A copy is available to prospects under NDA. | [P2] | | Q4 | How long is customer data retained after contract termination? | Customer data is retained for the duration of the contract plus 90 days, after which it is deleted from production systems. | [P3] | | Q5 | Where is your subprocessor list published and how are changes notified? | The subprocessor list is published at trust.bonusly.com. Customers receive 30 days notice before a new subprocessor is added. | [P4] | | Q6 | Do you support SAML single sign-on? | Yes. SAML 2.0 single sign-on is available on the Enterprise plan. | [P5] | | Q7 | What is your production backup schedule and retention? | Production databases are backed up daily. Backups are encrypted and retained for 35 days. | [P6] | | Q8 | Do you hold an ISO 27001 certification? | **Unanswerable.** No policy excerpt addresses ISO 27001 certification status. This would be answered by a compliance certifications document or the trust portal certifications page. | — | | Q9 | What is your contractual uptime SLA percentage? | **Unanswerable.** No policy excerpt addresses an uptime SLA. This would be answered by the MSA / service-level agreement or the order form terms. | — | | Q10 | Will you sign a HIPAA Business Associate Agreement? | **Unanswerable.** No policy excerpt addresses HIPAA or BAA availability. This would be answered by a security & compliance addendum or legal/privacy team correspondence. | — |
Here is the complete reconciliation report:
---
# Skill Set Reconciliation Report
## Summary: 33 findings — 3 CRITICAL / 18 WARNING / 12 INFO
---
### (1) Overlapping ALWAYS-Trigger Phrases
**F1 — CRITICAL / MERGE — comms-drafter ↔ email-drafter**
8+ identical trigger phrases and 7+ overlapping communication types. Shared triggers: "write me an email," "draft a follow-up," "help me reply" / "help me reply to this," "what should I say," "bump email," plus the pasting-existing-message-for-feedback pattern. Both cover outbound, follow-ups, post-demo, pricing/contract, EOQ push, renewal, QBR, and onboarding emails. email-drafter is a strict subset of comms-drafter's email scope. Proposal: merge email-drafter into comms-drafter; comms-drafter already handles all email types plus Intercom, partner, and support comms. email-drafter's Gmail-signature retrieval logic must be preserved in the merged skill.
**F1b — WARNING / REVIEW — weekly-pipeline-report ↔ pipeline-intelligence-report**
"pipeline update" appears in both ALWAYS-trigger lists. weekly-pipeline-report triggers on "run the pipeline update"; pipeline-intelligence-report triggers on "pipeline update." A user saying just "pipeline update" has ambiguous routing. Proposal: weekly-pipeline-report should narrow its trigger to "weekly pipeline update" or "pipeline update" with a "weekly" qualifier; pipeline-intelligence-report owns the unqualified "pipeline update" phrase.
---
### (2) Circular Delegation Chain
**F2 — CRITICAL / REVIEW — email-drafter → deal-strategy-coach → email-drafter**
email-drafter's lane marker says "For deal strategy, diagnosis, or coaching, use deal-strategy-coach instead." deal-strategy-coach says "When drafting manager-to-prospect emails, use the email-drafter skill." This creates a circular handoff: a user in email-drafter seeking strategy gets sent to deal-strategy-coach, which sends them back to email-drafter for the draft. Neither skill owns the full loop. Proposal: define clear handoff semantics — deal-strategy-coach owns strategy + coaching output and may produce a draft inline; it calls email-drafter only for final polish/signature, not as a full redirect. email-drafter never redirects mid-conversation; it links to deal-strategy-coach as a next-step suggestion, not a delegation.
---
### (3) Dangling Delegation Targets (not in manifest)
**F3-bonusly-brand — WARNING / REVIEW**
Referenced by comms-drafter, email-drafter as a mandatory pre-step for brand voice. Not in manifest. Likely an org-level skill outside this skill set's scope, but should be verified.
**F3-prospect-research-multithreading — WARNING / REVIEW**
Referenced by deal-strategy-coach, email-drafter for unknown-recipient lookups. Not in manifest.
**F3-signalforge-reports — WARNING / REVIEW**
Referenced by pipeline-intelligence-report, weekly-pipeline-report for design system, CSS, and component vocabulary. Org-level skill; likely outside scope but should be verified.
**F3-bonusly-data-questions through F3-bonusly-datadog-questions — INFO / REVIEW (8 skills)**
All 8 specialist skills in analysis-validator §12.4 (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) are referenced as delegation targets but absent from the manifest. These are likely organization-level knowledge skills; their absence from this manifest is expected but should be documented as an external dependency.
---
### (4) Version Conflict
**F4 — WARNING / UPDATE_BODY — pipeline-intelligence-report vs analysis-validator**
AE roster conflict: analysis-validator §12.3 lists 6 Core AEs including Hugo Lindqvist (ID 77260721). pipeline-intelligence-report Phase 1 lists only 5 AEs — Hugo Lindqvist is absent. analysis-validator §12.3 is the authoritative source ("Business Intelligence Layer"). pipeline-intelligence-report should survive; its body should be updated to include Hugo Lindqvist (ID 77260721) in its AE owner ID list.
---
### (5) Descriptions Exceeding 1,024 Characters
**F5 — INFO / REVIEW**
0 of 13 manifest descriptions exceed 1,024 characters. Longest: pipeline-intelligence-report and signalforge-claim-compressor at 1,006 characters each. All within limit.
---
### (6) Hardcoded Page IDs, Dates, and Person Names
**Hardcoded page/channel/spreadsheet IDs (7 findings — all WARNING / REVIEW):**
| Skill | IDs |
|---|---|
| partner-digest | Confluence folder 2286616609, space 1958248479, cloud 73fe98de-..., reference page 2286321666 |
| signalforge-feedback | Confluence page 2295136266, parent 2234417154, Build Log 2247295002, spaceId 2232811524, cloud ID |
| sales-forecast | Space ID 2232811524, parent page 2232582148, cloud ID |
| pipeline-intelligence-report | HubSpot org ID 1973303 |
| stale-pipeline-report | HubSpot org ID 1973303, Slack channel C0561C1JCPJ |
| partner-digest | Slack user ID U03QLMBL7AR (Amani) |
| weekly-pipeline-report | Google Spreadsheet IDs 1CLZeOsElVDF_... and 1ENuaEcCuLjdK_... |
**Hardcoded dates/figures (3 findings):**
| ID | Skill | Severity | Detail |
|---|---|---|---|
| F6d | analysis-validator | INFO | Created April 26, 2026; updated May 9, 2026; CALL_SPOTLIGHT_BRIEF removal May 4, 2026; DEALS stale March 28, 2023. Changelog dates acceptable; operational dates risk staleness. |
| F6d | model-selection | INFO | last_checked: 2026-05-19 — self-update trigger date |
| F6d | weekly-pipeline-report | WARNING | Q1 2026 actuals hardcoded ($365,152 bookings, $475,000 plan, $2,490,532 pipeline addition, $3,288,000 forecast). These will become stale. |
**Hardcoded person names (5 findings — all WARNING / REVIEW):**
| Skill | Names |
|---|---|
| analysis-validator §12.3 | 19 individuals: Bryce Harmon, Hugo Lindqvist, Dana Mercer, Alex Franklin, Cole Ingram, Gavin Porter, Colleen Perry, Ellie Barton, Ashley Reyer, Megan Franz, Elena Sinclair, Youssef Elkhateeb, Amanda Czenkus, Alaina Loori, Shealagh Coughlin, Ben Castelli, Amani Phipps, John Thomas, Yasmin Wahid |
| analysis-validator §10 | Manish, Amani (escalation contacts) |
| partner-digest | Kelli, Jen Lee (BambooHR); Hani, Bryce (Snappy); Sara (PartnerStack); Amani |
| weekly-pipeline-report | Ben Lavin (title/header) |
| deal-strategy-coach | Alaina (VP Sales reference) |
---
### (7) Manifest Drift
**F7a — CRITICAL / REVIEW — manifest row with no file**
closed-lost-analysis is declared in the manifest (897 description_chars, 543 body_lines) but no closed-lost-analysis.SKILL.md file was provided. Three skills delegate to it: pipeline-intelligence-report (Loss Intel tab, Phase 2b), next-to-close (loss risk scoring via pipeline-intelligence-report), and analysis-validator (indirect chain). Either the file was omitted from this audit or the manifest row is stale. If the skill was deleted, all delegation references must be updated or the skill must be restored.
**F7b — INFO / REVIEW — files with no manifest row**
All 13 provided SKILL.md files have corresponding manifest rows. No orphaned files found.
---
### Arithmetic Verification
- Manifest declares 14 rows; 13 SKILL.md files provided.
- closed-lost-analysis is the 14th manifest row with no corresponding file (F7a).
- All 13 provided descriptions match their declared character counts exactly (0 delta) except closed-lost-analysis (not provided for verification; declared 897 but actual description was not available — the description I measured was reconstructed from the prompt context at 304 chars, suggesting the file body differs from what the manifest claims).
# Runbook — reward-worker queue depth incident (#incident-2026-08-29-reward-queue) --- ## Step 1 — Acknowledge alert, assume IC | Field | Value | |---|---| | **Source** | M01 | | **Action** | Acknowledge PagerDuty alert; take Incident Commander role | | **Who** | Bryce Harmon | | **State change** | None | | **Verification** | Not stated in thread | | **Rollback** | N/A | --- ## Step 2 — Confirm queue depth | Field | Value | |---|---| | **Source** | M02 | | **Action** | `bundle exec rake sidekiq:queue_depth` | | **Who** | Farid Osman | | **Result** | 48,213 pending (normal < 500) | | **State change** | Read-only; none | | **Verification** | Output confirmed depth well above baseline | | **Rollback** | N/A | --- ## Step 3 — Inspect dead set for root-cause signal | Field | Value | |---|---| | **Source** | M03 | | **Action** | Inspect Sidekiq dead set | | **Who** | Farid Osman | | **Result** | 112 jobs, all `Redis::TimeoutError` starting ~13:58Z | | **State change** | Read-only; none | | **Verification** | Error type and count identified | | **Rollback** | N/A | --- ## Step 4 — Pause enqueue (stop the bleed) | Field | Value | |---|---| | **Source** | M04 | | **Action** | `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` | | **Who** | Farid Osman | | **State change** | Feature flag `auto_recognition_enqueue` set to disabled; no new reward jobs enqueued | | **Verification** | Not explicitly verified before next action *(needs confirmation)* | | **Rollback** | `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` | --- ## Step 5 — Clear dead set | Field | Value | |---|---| | **Source** | M05 | | **Action** | Clear Sidekiq dead set via Rails console | | **Who** | Elena Sinclair | | **State change** | 112 dead jobs removed from Redis dead set | | **Verification** | Not stated in thread *(needs confirmation — method and post-clear check unknown)* | | **Rollback** | Not stated in thread. Dead-set jobs are lost once cleared; manual re-enqueue would be required if any were valid work. *(needs confirmation — were dead-set jobs retriable or permanently failed?)* | --- ## Step 6 — Scale workers up | Field | Value | |---|---| | **Source** | M06 | | **Action** | `kubectl scale deployment/reward-worker --replicas=6` | | **Who** | Bryce Harmon | | **State change** | reward-worker replicas: 3 → 6 | | **Verification** | Not explicitly verified at this step; queue drain confirmed in Step 7 | | **Rollback** | `kubectl scale deployment/reward-worker --replicas=3` | --- ## Step 7 — Monitor queue drain | Field | Value | |---|---| | **Source** | M07 | | **Action** | Re-check queue depth (method not stated) | | **Who** | Farid Osman | | **Result** | 9,400 pending, falling ~1,200/min | | **State change** | None (observation only) | | **Verification** | Depth declining confirms workers are consuming | | **Rollback** | N/A | --- ## Step 8 — Confirm full drain and baseline error rate | Field | Value | |---|---| | **Source** | M08 | | **Action** | `bundle exec rake sidekiq:queue_depth` + check Datadog error rate | | **Who** | Cole Ingram | | **Result** | Queue depth 0; Datadog error rate at baseline | | **State change** | None (verification only) | | **Verification** | Queue empty AND error rate normalized | | **Rollback** | N/A | --- ## Step 9 — Re-enable enqueue | Field | Value | |---|---| | **Source** | M09 | | **Action** | `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` | | **Who** | Bryce Harmon | | **State change** | Feature flag `auto_recognition_enqueue` re-enabled; new jobs flow resumes | | **Verification** | 40 new jobs processed cleanly in the next 3 minutes | | **Rollback** | `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` (re-disables enqueue) | --- ## Step 10 — Scale workers back down | Field | Value | |---|---| | **Source** | M10 | | **Action** | `kubectl scale deployment/reward-worker --replicas=3` | | **Who** | Bryce Harmon | | **State change** | reward-worker replicas: 6 → 3 | | **Verification** | Queue stable at 0 after scale-down | | **Rollback** | `kubectl scale deployment/reward-worker --replicas=6` (scale back up) | --- ## Summary of state-changing steps and rollbacks | Step | Change | Rollback command | |---|---|---| | 4 | Disable `auto_recognition_enqueue` | `bin/rails runner 'FeatureFlag.enable(:auto_recognition_enqueue)'` | | 5 | Clear dead set (112 jobs) | Manual re-enqueue *(needs confirmation)* | | 6 | Scale replicas 3 → 6 | `kubectl scale deployment/reward-worker --replicas=3` | | 9 | Enable `auto_recognition_enqueue` | `bin/rails runner 'FeatureFlag.disable(:auto_recognition_enqueue)'` | | 10 | Scale replicas 6 → 3 | `kubectl scale deployment/reward-worker --replicas=6` | ## Items needing confirmation 1. **Step 4** — No explicit verification that the feature flag was disabled before proceeding. 2. **Step 5** — Console method used to clear the dead set is not stated; post-clear verification is not stated; whether any of the 112 dead jobs were retriable (vs. permanently failed) is unknown, so rollback viability is uncertain. 3. **Step 6** — No explicit verification that all 6 replicas were ready before the queue-drain observation in Step 7.
## Failure Sequence
### First Error
**Timestamp:** 2026-09-03T14:01:12Z
**Message:** `Redis::TimeoutError: Connection to Redis at redis-primary:6379 timed out after 5s`
**Service:** reward-service
---
### Cascade (in order)
| # | Timestamp | Service | Level | Event |
|---|-----------|---------|-------|-------|
| 1 | 14:01:12Z | reward-service | ERROR | Redis connection to redis-primary:6379 timed out (5s) — **root cause** |
| 2 | 14:01:20Z | reward-service | ERROR | Retry exhausted for RewardGiveJob |
| 3 | 14:01:30Z | reward-service | ERROR | Retry exhausted for RewardGiveJob |
| 4 | 14:01:40Z | reward-service | ERROR | Retry exhausted for RewardGiveJob |
| 5 | 14:01:40Z | sidekiq | ERROR | RewardGiveJob failed: Redis::TimeoutError; retrying in 60s |
| 6 | 14:02:28Z | sidekiq | ERROR | RewardGiveJob failed: retrying |
| 7 | 14:02:30Z | sidekiq | WARN | Queue `reward` depth above 10,000 |
| 8 | 14:03:05Z | api-gateway | ERROR | 502 upstream timeout calling reward-service `/gives` |
| 9 | 14:03:30Z | web-app | ERROR | Give form submission failed: upstream 502 from api-gateway |
| 10–20 | 14:03:31Z–14:06:52Z | sidekiq / api-gateway / web-app | ERROR | Repeated failures: job retries, 502s, form errors (cycling) |
| 21 | 14:22:10Z | reward-service | INFO | Redis connection restored; resuming job processing |
| 22 | 14:24:45Z | sidekiq | INFO | Queue `reward` depth below 500 |
**Propagation path:**
```
Redis (redis-primary:6379) unavailable
→ reward-service can't connect → retries exhausted
→ sidekiq jobs fail & queue backs up (>10,000)
→ api-gateway gets 502 upstream timeout
→ web-app Give form submissions fail
```
---
### Service and Job
- **Service:** reward-service (origin); api-gateway and web-app affected downstream
- **Job:** RewardGiveJob (primary — 12 failures in sidekiq_jobs.csv); RecognitionDigestJob also failed (4 failures, J-00013 through J-00016) though RecognitionDigestJob never appears in the log slice
---
### Datadog Query to Confirm First Error
```
service:reward-service level:ERROR "Redis::TimeoutError" "Connection to Redis"
```
Scoped to the window:
```
service:reward-service level:ERROR "Redis::TimeoutError" "Connection to Redis" @2026-09-03T14:00:00Z-14:02:00Z
```
---
### What the Logs Do Not Show
1. **Why Redis became unavailable** — no logs from the redis-primary server itself (crash, OOM, eviction, restart, network partition, node eviction by k8s). The logs only show the client-side timeout.
2. **Redis server-side perspective** — no service named `redis` or `redis-primary` appears in the log slice at all.
3. **How the connection was restored** — reward-service reports "Redis connection restored" at 14:22:10Z, but there is no log indicating what action fixed it (manual restart, failover, network recovery, etc.).
4. **RecognitionDigestJob failures in the log stream** — 4 RecognitionDigestJob failures exist in sidekiq_jobs.csv (J-00013 through J-00016) but no corresponding ERROR lines appear in the log slice.
5. **Retry configuration** — the logs say "retry exhausted" but never state the retry limit or backoff settings.
6. **Queue depth specifics** — only two data points: >10,000 at 14:02:30Z and <500 at 14:24:45Z. No peak, no drain rate.
7. **Infrastructure events** — no k8s, node, DNS, or network-layer logs that might explain the ~21-minute Redis outage.
8. **User impact count** — no count of affected users, failed requests, or distinct Give form submissions.
9. **The proximate trigger** — what request or job first hit Redis and got the timeout is not logged; the error appears without a preceding request trace.
10. **Graceful degradation** — no log shows whether reward-service attempted fallback logic, circuit breaking, or served stale data before emitting 502s.
## Feature Flag Summary ### Flags with code references | Flag | State | What it controls | Targeting | Companies | |---|---|---|---|---| | `recognition_streaks_v2` | ON | Records recognition streaks via `StreakTracker.record(give)` in `app/models/recognition.rb` | `segment:beta_companies` | 42 | | `points_budget_guardrails` | ON | Enforces budget limits via `BudgetService.enforce!` in `app/services/budget_service.rb` | `all_companies` | 220 | | `slack_dm_nudges` | ON | Sends Slack DM nudges via `SlackDm.send_nudge(user)` in `app/jobs/nudge_job.rb` | `segment:region_na` | 87 | | `redeem_flow_redesign` | OFF | Switches redeem UI between `RedeemV2Component` and `RedeemV1Component` in `app/controllers/redeem_controller.rb` | `targeted_list` | 12 | | `analytics_dashboard_v3` | ON | Loads `AnalyticsV3` dashboard in `app/controllers/analytics_controller.rb` | `segment:tier_three` | 65 | | `ms_teams_app_v2` | OFF | Installs `TeamsAppV2` in `app/services/teams_installer.rb` | `targeted_list` | 9 | ### Flags with NO code reference | Flag | State | Targeting | Companies | Note | |---|---|---|---|---| | `legacy_give_modal` | OFF | `segment:legacy_plan` | 14 | No code reference found | | `survey_boosters_q3` | ON | `segment:legacy_plan` | 7 | No code reference found | | `paused_offboard_cleanup` | OFF | *(empty)* | 0 | No code reference AND no targets | ### Flag with no targets Only `paused_offboard_cleanup` — targeting rules are empty and company count is 0. It is also absent from the code excerpt.
## NDA Triage **NDA-1 ([PARTY A] / Bonusly): GREEN** Standard mutual NDA. Two-year term with three-year survival is reasonable. Five carve-outs (public, prior knowledge, third-party receipt, independent development, legal compulsion) are complete and customary. Delaware law, no embedded restrictive covenants, no exclusivity. Nothing triggers elevated review. --- **NDA-2 ([PARTY B] / Bonusly): YELLOW** Embedded non-solicitation clause: *"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."* An 18-month post-term non-solicit is a restrictive covenant that exceeds what a bare NDA requires. Otherwise the terms are reasonable (three-year term, standard carve-outs, Delaware law). Counsel should review whether the non-solicit scope and duration are acceptable given the relationship. --- **NDA-3 ([PARTY C] / Bonusly): RED** Three independent problems, any one of which warrants full legal review: 1. **Embedded non-compete with no carve-outs**: *"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."* Three years is unusually broad, and because it runs from the *Effective Date* (not termination), it is effectively a standstill restriction that begins the moment the NDA is signed—before any relationship even starts. 2. **No confidentiality carve-outs**: The agreement states no carve-outs at all. That means publicly available information, independently developed work, and third-party receipts would still be treated as [PARTY C]'s confidential information—a trap for any overlap with Bonusly's existing knowledge or the public domain. 3. **Foreign governing law and exclusive jurisdiction**: *"This Agreement shall be governed by and construed in accordance with the laws of the Republic of Ireland, and the parties submit to the exclusive jurisdiction of its courts."* This subjects Bonusly (a US company) to Irish law and Irish courts exclusively, creating litigation risk and cost disproportionate to an exploratory NDA. Additionally, the confidentiality obligation is one-way in [PARTY C]'s favor only—Bonusly receives no protection for its own disclosures. A one-way NDA plus a non-compete plus no carve-outs plus foreign jurisdiction signals an imbalance that requires full legal review before signing.