Skip to main content

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:

OptionBehavior
"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 PatternMultiplier
C-suite, President, Founder1.5
VP, SVP, EVP1.5
Director1.3
Manager1.1
All others1.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
ScenarioVelocity FactorEffect
Moving faster than expectedPositive (0 to +1)Score bonus
Moving at expected pace~0No change
Moving slower than expectedNegative (-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.

Fast-Moving Deals

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

InputValue
Account fit score78
Contact A (VP Sales)Engagement 65, Seniority 1.5
Contact B (Analyst)Engagement 40, Seniority 1.0
Days since creation20
Stage velocity weight0.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";
}
ParameterDefaultDescription
fitSource"inherit-account"Where the fit score comes from
stageVelocityWeight0.1How much stage velocity affects engagement
contactEngagementStrategy"weighted-average"How contact engagement scores are aggregated
Missing Contacts

If an opportunity has no associated contacts, its engagement score is 0 (plus any velocity adjustment). Ensure your CRM sync includes OpportunityContactRole relationships.