Opportunity Score Formula: How to Calculate and Prioritize Product Opportunities

The Opportunity Score formula is Importance × (1 − Satisfaction), where both variables are normalized to a 0‑1 scale, producing a 0‑1 score that surfaces high‑value customer problems ripe for innovation.

The Opportunity Score is a prioritization metric introduced by Dan Olsen in The Lean Product Playbook. Product teams use it to rank potential features or assumptions by weighing how critical a problem is against how poorly it is currently solved. The phuryn/pm-skills repository documents this formula across multiple skill modules, providing both theoretical context and executable code samples.

Understanding the Opportunity Score Formula

The formula follows a simple multiplicative model designed to maximize impact:

Opportunity Score = Importance × (1 − Satisfaction)

The Two Input Variables

  • Importance – A decimal value from 0 to 1 representing how critical the problem is to the target customer. A score of 0.9 indicates a severe pain point, while 0.2 reflects a minor annoyance.
  • Satisfaction – A decimal value from 0 to 1 representing how well existing solutions address the problem. A score of 0.1 means current solutions are inadequate, whereas 0.9 indicates the problem is already well‑solved.

Because the formula multiplies Importance by the unsatisfied portion of the market (1 − Satisfaction), the highest scores emerge when a critical problem (high Importance) meets an underserved market (low Satisfaction).

Implementing the Calculation in Code

According to the phuryn/pm-skills source code, you can implement the Opportunity Score in any programming language using the same mathematical operation.

Python Implementation

The repository provides a concise Python function in pm-product-discovery/skills/prioritize-features/SKILL.md:

def opportunity_score(importance, satisfaction):
    """
    importance and satisfaction should be floats in the range [0, 1].
    Returns a score in the range [0, 1].
    """
    return importance * (1 - satisfaction)

# Sample data (importance, satisfaction)

problems = {
    "slow onboarding": (0.9, 0.3),
    "missing export feature": (0.6, 0.8),
    "poor search relevance": (0.8, 0.2),
}

# Compute scores

scores = {name: opportunity_score(imp, sat) for name, (imp, sat) in problems.items()}

# Sort by highest opportunity

ranked = sorted(scores.items(), key=lambda kv: kv[1], reverse=True)
print("Opportunities ranked by score:")
for name, score in ranked:
    print(f"{name}: {score:.2f}")

This script outputs:


Opportunities ranked by score:
poor search relevance: 0.64
slow onboarding: 0.63
missing export feature: 0.12

In this example, "poor search relevance" receives the highest Opportunity Score (0.64) because it combines high importance (0.8) with very low satisfaction (0.2).

JavaScript Implementation

For web‑based product management tools, the same logic applies:

function opportunityScore(importance, satisfaction) {
  return importance * (1 - satisfaction);
}

// Sample problems
const problems = {
  "slow onboarding": [0.9, 0.3],
  "missing export feature": [0.6, 0.8],
  "poor search relevance": [0.8, 0.2],
};

const scores = Object.entries(problems).map(([name, [imp, sat]]) => ({
  name,
  score: opportunityScore(imp, sat),
}));

scores.sort((a, b) => b.score - a.score);
console.log("Opportunities ranked by score:");
scores.forEach(p => console.log(`${p.name}: ${p.score.toFixed(2)}`));

Both implementations normalize inputs to the 0‑1 range and return a score that can be sorted descending to reveal the highest‑priority opportunities.

Where This Formula Appears in the pm-skills Repository

The phuryn/pm-skills repository references the Opportunity Score formula in several key locations:

Summary

  • The Opportunity Score formula is Importance × (1 − Satisfaction), producing a 0‑1 score.
  • High scores indicate critical problems with poor existing solutions, representing the best opportunities for product investment.
  • Both Python and JavaScript implementations require only a single arithmetic operation.
  • The phuryn/pm-skills repository documents this formula across feature prioritization, assumption testing, and opportunity mapping skill modules.

Frequently Asked Questions

What is the Opportunity Score formula?

The Opportunity Score formula is Importance multiplied by (1 minus Satisfaction). Both inputs are normalized to values between 0 and 1, yielding a score in the same range. This calculation identifies problems that are both important to customers and currently underserved by existing solutions.

Who created the Opportunity Score?

Dan Olsen introduced the Opportunity Score in his book The Lean Product Playbook. He designed it as a quantitative method for product teams to objectively compare and rank potential opportunities based on customer data rather than intuition alone.

How do you interpret Opportunity Score results?

Scores closest to 1.0 represent the highest priority opportunities—these are urgent problems with inadequate current solutions. Scores near 0 indicate either low‑importance issues or problems that are already well‑solved. Teams should generally address opportunities scoring above 0.5 before investing in lower‑scoring items.

Can Opportunity Score be used for assumptions as well as features?

Yes. According to pm-product-discovery/skills/prioritize-assumptions/SKILL.md, the identical formula applies to assumption prioritization. Product teams can rate the importance of an assumption to business success and their current confidence (satisfaction) in that assumption to determine which hypotheses require immediate validation.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →