## TL;DR
Expanded accounts on an at-risk list means the list does not know what those accounts did, and a wrong join key is how usage goes missing for exactly the accounts that grew. Product usage keyed by workspace, organisation, or a legacy product ID joined to CRM accounts on a different key drops or misassigns usage, so growing accounts read as declining. Find the key mismatch, repair the mapping, rebuild the list, and personally clear the wrongly flagged accounts with their CSMs.

```text
at-risk list includes accounts that expanded last month: product usage joined on the wrong account key
```

## Use this when
- At-risk accounts include several that expanded or upgraded in the same period
- Their usage looks low or absent in the health data but normal in the product
- The affected accounts share a trait, such as multiple workspaces, a migration, or a parent child structure

## Not for this skill when
- The accounts expanded in seats but usage per seat collapsed, a real risk the list is right to surface
- Billing expansion is recorded but the expansion was a paperwork true-up with no real usage change

## Steps
1. Take three wrongly flagged accounts and trace their usage end to end. Record every identifier each carries, CRM account ID, product organisation or workspace IDs, billing customer ID, and any legacy ID, then query raw product usage under each ID to see where their activity actually lives and which ID the health pipeline used. Verify: for each sample account, the ID holding the real usage and the ID the pipeline used are documented
2. Examine the join in the pipeline code or model. Identify the exact keys on both sides, any coalesce or fallback logic, and how one to many relationships are handled when an account has several workspaces or products. Wrong key joins often work for simple accounts and fail only for structured ones, which matches the pattern of the complaints. Verify: the join keys and their failure mode for structured accounts are pinpointed
3. Measure the blast radius. Count accounts whose product IDs do not resolve through the current join, accounts with usage in the product that reaches no CRM account, and accounts whose joined usage comes from a shared or parent ID that may belong to another customer. Report all three, because a wrong key can also credit usage to the wrong account and hide real risk elsewhere. Verify: the three mismatch counts are produced and shared with the data owner
4. Build the durable mapping. Create or repair an account identity crosswalk sourced from the system that provisions product accounts from CRM accounts, with effective dates for re-keyed accounts, and change the pipeline to join through the crosswalk, failing loudly on unresolved IDs above a small threshold instead of silently joining to nothing. Verify: the crosswalk is in place and a test run reports unresolved IDs instead of dropping them silently
5. Rebuild the at-risk list and diff it against the old one. For every account that leaves the list because its usage is restored, note the reason, and for every account that enters the list because usage was previously credited from the wrong place, brief its CSM directly, since newly visible risk is the most valuable output of the whole fix. Verify: the list diff is reviewed and CSMs are briefed on accounts entering the list
6. Add key governance so the next re-keying is planned. Require product and CRM teams to register ID scheme changes with the data team, keep the crosswalk under version control, and run a weekly unresolved ID report, because identity drift is continuous and the join will rot again without an owner. Verify: the weekly unresolved ID report runs and the change registration step is documented

## Why it happens
Products, CRMs, and billing systems each mint their own account identifiers at different times for different reasons. A join written when every customer had one workspace and one CRM record quietly breaks as structures grow, workspaces multiply, companies merge, and products re-key. The join does not error, it simply returns less usage for the structured accounts, and downstream the at-risk model reads that absence as decline, flagging your growing customers as your riskiest ones.

Compatibility: Warehouse joins between product usage, CRM accounts in Salesforce or HubSpot, and billing customers, with identity crosswalks, in current versions.

## Variants and edge cases
### at-risk list wrong accounts joined on wrong key
['The direct phrasing. Sample tracing with real IDs beats reading join code in the abstract, the mismatch shows itself in the data first.']

### expanded accounts flagged churn risk usage missing
['The contradiction phrasing. Billing expansion plus missing usage is a join signature, while expansion plus low usage per user is a real adoption signal, separate them early.']

### product usage not matching CRM accounts identity
['The identity variant. A governed crosswalk with effective dates is the durable asset, one-off fixes in a single model rot with the next migration.']

Edge cases to work through before you close the incident:
- Parent level rollups can hide a dying child account inside a healthy parent. After fixing the key, confirm the list works at the level CSMs actually own accounts.
- Never overwrite the crosswalk history when IDs are reused. A reused product ID across years can resurrect the same class of bug in historical reporting.
- If usage is credited to the wrong account today, some other account is probably being flattered. Always check both directions of a join error before declaring the list fixed.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_g1zqXUfioh3t81HfPHr0RA
