Catalog/saas-pmf-score

Calculators

Product-market-fit (PMF) score API

Transparent weighted PMF rubric (0-100) over five 0-1 factors with explicit weights — mustHaveSurvey 0.30 (Sean Ellis >40% 'very disappointed'), retention 0.25, organicGrowth 0.15, nps 0.15, usageFrequency 0.15 — returning a rating bucket (strong/emerging/weak/pre-PMF) and per-factor contribution breakdown. Answers 'do I have product-market fit','what is my PMF score','which PMF factor is weakest'.

Price$0.01per request
MethodPOST
Route/v1/calc/saas-pmf-score
StatusLive
MIME typeapplication/json
Rate limit120/minute
CacheNo cache
saaspmfproduct-market-fitscorestartuprubricretentioncalc
API URLhttps://x402.hexl.dev/v1/calc/saas-pmf-score
Integration docs
Example request
{
  "mustHaveSurvey": 0.45,
  "retention": 0.7,
  "organicGrowth": 0.6,
  "nps": 0.5,
  "usageFrequency": 0.65
}
Example response
{
  "score": 57.25,
  "rating": "weak-signal",
  "weights": {
    "mustHaveSurvey": 0.3,
    "retention": 0.25,
    "organicGrowth": 0.15,
    "nps": 0.15,
    "usageFrequency": 0.15
  },
  "breakdown": [
    {
      "factor": "mustHaveSurvey",
      "label": "% very disappointed without product (Sean Ellis)",
      "value": 0.45,
      "weight": 0.3,
      "contribution": 13.5
    },
    {
      "factor": "retention",
      "label": "cohort retention plateau",
      "value": 0.7,
      "weight": 0.25,
      "contribution": 17.5
    },
    {
      "factor": "organicGrowth",
      "label": "share of organic/word-of-mouth growth",
      "value": 0.6,
      "weight": 0.15,
      "contribution": 9
    },
    {
      "factor": "nps",
      "label": "net promoter score (normalised 0-1)",
      "value": 0.5,
      "weight": 0.15,
      "contribution": 7.5
    },
    {
      "factor": "usageFrequency",
      "label": "active usage frequency vs. ideal",
      "value": 0.65,
      "weight": 0.15,
      "contribution": 9.75
    }
  ],
  "formula": "score = 100 * (0.30*mustHaveSurvey + 0.25*retention + 0.15*organicGrowth + 0.15*nps + 0.15*usageFrequency)"
}
Input schema
{
  "type": "object",
  "required": [
    "mustHaveSurvey",
    "retention",
    "organicGrowth",
    "nps",
    "usageFrequency"
  ],
  "properties": {
    "mustHaveSurvey": {
      "type": "number",
      "description": "% very disappointed without product, normalised 0-1 (Sean Ellis)",
      "examples": [
        0.45
      ]
    },
    "retention": {
      "type": "number",
      "description": "cohort retention plateau 0-1",
      "examples": [
        0.7
      ]
    },
    "organicGrowth": {
      "type": "number",
      "description": "share of organic/word-of-mouth growth 0-1",
      "examples": [
        0.6
      ]
    },
    "nps": {
      "type": "number",
      "description": "net promoter score normalised 0-1",
      "examples": [
        0.5
      ]
    },
    "usageFrequency": {
      "type": "number",
      "description": "active usage frequency vs ideal 0-1",
      "examples": [
        0.65
      ]
    }
  }
}
Output schema
{
  "type": "object",
  "additionalProperties": true
}