Opportunity Scoring
Opportunity scoring combines inherited account fit, aggregated contact engagement, and a stage velocity adjustment into a single score for each open opportunity. This helps sales teams prioritize deals that have both strong fit and active buyer engagement.
Scoring Components
An opportunity score is built from three inputs:
1. Fit Score: Inherited from Account
By default, the opportunity's fit score is inherited directly from its parent account. The ICP match of the company applies equally to all opportunities at that account.
The fitSource configuration supports:
| Option | Behavior |
|---|---|
"inherit-account" (default) | Uses the parent account's fit score directly |
"blended" | Reserved for future use (e.g., solution-specific ICP matching) |
If no parent account score is available (e.g., orphaned opportunity), the fit score defaults to 0.
2. Contact Engagement: Aggregated from Contacts
The engagement component aggregates scores from all contacts associated with the opportunity. Two strategies are available:
Weighted-Average (Default)
All contacts contribute proportionally, weighted by seniority:
oppEngagement = sum(contact.score * contact.seniorityMultiplier)
/ sum(contact.seniorityMultiplier)
Seniority multipliers are the same as in Account Scoring:
| Title Pattern | Multiplier |
|---|---|
| C-suite, President, Founder | 1.5 |
| VP, SVP, EVP | 1.5 |
| Director | 1.3 |
| Manager | 1.1 |
| All others | 1.0 |
Champion
The highest-scoring contact contributes 60% of the score, with the remaining contacts sharing the other 40%:
oppEngagement = champion.score * 0.6
+ average(rest.scores) * 0.4
3. Stage Velocity: Bonus or Penalty
Stage velocity compares how fast the opportunity is progressing relative to an expected cadence:
daysSinceCreation = (now - opportunity.createdAt) / days
velocityRatio = expectedDaysPerStage / max(daysSinceCreation, 1)
velocityFactor = clamp(velocityRatio - 1, -1, 1)
velocityBonus = velocityFactor * stageVelocityWeight * 100
| Scenario | Velocity Factor | Effect |
|---|---|---|
| Moving faster than expected | Positive (0 to +1) | Score bonus |
| Moving at expected pace | ~0 | No change |
| Moving slower than expected | Negative (-1 to 0) | Score penalty |
The default expected pace is 30 days per stage and the default stageVelocityWeight is 0.1, meaning velocity can adjust the engagement score by up to +/-10 points.
A deal that reaches stage 2 in 15 days (vs. expected 30) gets a positive velocity bonus, boosting its engagement score. This surfaces fast-moving deals that might otherwise look average based on engagement alone.
Combined Score
The opportunity's final combined score blends fit and engagement:
combinedScore = (fitScore * fitWeight + engagementScore * engagementWeight)
/ (fitWeight + engagementWeight)
Default weights are equal (fitWeight: 1, engagementWeight: 1).
Worked Example
Opportunity: Acme Corp - Enterprise License
| Input | Value |
|---|---|
| Account fit score | 78 |
| Contact A (VP Sales) | Engagement 65, Seniority 1.5 |
| Contact B (Analyst) | Engagement 40, Seniority 1.0 |
| Days since creation | 20 |
| Stage velocity weight | 0.1 |
Contact engagement (weighted-average):
(65 * 1.5 + 40 * 1.0) / (1.5 + 1.0) = (97.5 + 40) / 2.5 = 55.0
Stage velocity bonus:
velocityRatio = 30 / 20 = 1.5
velocityFactor = clamp(1.5 - 1, -1, 1) = 0.5
velocityBonus = 0.5 * 0.1 * 100 = 5.0
Final engagement score: min(100, 55.0 + 5.0) = 60.0
Combined score: (78 * 1 + 60 * 1) / 2 = 69.0
Score Breakdown
Each opportunity score includes a full audit trail:
- Fit components: Shows
"account-inherited"with the inherited fit score - Engagement components: Per-contact contributions with seniority multipliers
- Rollup method: Strategy name with
"+velocity"suffix (e.g.,"weighted-average+velocity")
Configuration Reference
interface OpportunityRollupConfig {
fitSource: "inherit-account" | "blended";
stageVelocityWeight: number; // default: 0.1
contactEngagementStrategy: "weighted-average" | "champion";
}
| Parameter | Default | Description |
|---|---|---|
fitSource | "inherit-account" | Where the fit score comes from |
stageVelocityWeight | 0.1 | How much stage velocity affects engagement |
contactEngagementStrategy | "weighted-average" | How contact engagement scores are aggregated |
If an opportunity has no associated contacts, its engagement score is 0 (plus any velocity adjustment). Ensure your CRM sync includes OpportunityContactRole relationships.
Related Pages
- Account Scoring --- How account scores feed into opportunities
- Engagement Scoring --- Person-level engagement details
- Tier Assignment --- How opportunity scores map to tiers
- Scoring Overview --- Full pipeline context