# How We Measure the DNP vs MSN Pay Delta for PMHNP Jobs (and Turn It Into ROI Math)

The “DNP earns $10–20K more than MSN” claim is directionally true in our job dataset—but only after you normalize salary formats, dedupe reposts, and separate degree signals from everything else employers pay for.

# How We Measure the DNP vs MSN Pay Delta for PMHNP Jobs (and Turn It Into ROI Math)

The DNP vs MSN question usually collapses into one number: **is an extra ~$10–20K/year worth more school?**

From a product/data engineering angle, that number is not something you “look up.” It’s something you **derive**—from messy job postings, inconsistent compensation fields, duplicate listings, and fuzzy degree requirements.

PMHNP Hiring aggregates from **500+ job sources daily** and maintains **10,000+ verified PMHNP jobs across all 50 states**. Here’s how we turn raw postings into (1) a defensible pay delta and (2) an honest break-even model you can use.

---

## 1) The data problem: job postings aren’t a salary table

A PMHNP posting might say:

- “$65–$80/hr” (hourly)
- “$130k base + bonus” (mixed)
- “Up to $180k” (ceiling only)
- “Competitive” (no number)
- “MSN required; DNP preferred” (ambiguous degree signal)

If you just average these strings, you’ll get nonsense.

### Our pipeline (high level)

**Ingest → Parse → Normalize → Deduplicate → Enrich → Serve**

- **Ingest**: scheduled collectors pull from job boards, health system career pages, ATS feeds, and smaller niche sites.
- **Parse**: extract compensation text + structured hints (interval, min/max, currency), plus requirements (degree, licensure, telehealth, etc.).
- **Normalize**: convert hourly/monthly to annual, handle ranges, and standardize to a comparable “annualized base” field.
- **Deduplicate**: collapse reposts across sources (same job syndicated to 5 boards) so one employer doesn’t overweight the stats.
- **Enrich**: geocode locations, tag setting (hospital/outpatient/telehealth), detect pay bands vs free-text.
- **Serve**: Next.js + TypeScript API routes query Supabase with filters and return real-time results.

---

## 2) Salary normalization: turning “$75/hr” into a comparable annual number

A big reason the DNP vs MSN delta looks noisy is that job posts mix comp intervals.

We normalize to an annual estimate with explicit assumptions:

- hourly → annual = `hourly * 40 * 52`
- daily/weekly/monthly similarly
- ranges → we store `min_annual`, `max_annual`, and a `midpoint_annual`

Example (TypeScript-ish pseudocode):

```ts
type Comp = { min?: number; max?: number; interval: 'hour'|'year' };

function annualize(comp: Comp) {
  const factor = comp.interval === 'hour' ? 40 * 52 : 1;
  const min = comp.min ? comp.min * factor : undefined;
  const max = comp.max ? comp.max * factor : undefined;
  const midpoint = min && max ? (min + max) / 2 : min ?? max;
  return { minAnnual: min, maxAnnual: max, midpointAnnual: midpoint };
}
```

We also track a **confidence score** (e.g., explicit range vs “up to”) so we can filter analyses to “high-confidence comp only” when computing salary deltas.

---

## 3) Degree detection: “required” vs “preferred” matters

For the DNP/MSN comparison, we classify degree language into buckets:

- `MSN_required`
- `DNP_required`
- `DNP_preferred`
- `degree_unspecified`

This is mostly rules + targeted patterns (not a vague “AI summary”). Why? Because “DNP preferred” frequently correlates with higher-paying org types (large systems) without being the direct cause of higher pay.

A simplified extraction sketch:

```sql
-- example: classify degree requirement from extracted text
case
  when req_text ilike '%dnp%required%' then 'DNP_required'
  when req_text ilike '%msn%required%' then 'MSN_required'
  when req_text ilike '%dnp%preferred%' then 'DNP_preferred'
  else 'degree_unspecified'
end as degree_bucket
```

This lets us compute apples-to-apples comparisons like:

- same state
- same setting (telehealth vs outpatient vs hospital)
- similar experience requirements
- high-confidence salary only

---

## 4) What the data shows: the ~$10–20K delta is real, but conditional

After normalization + dedupe + filtering to postings with usable comp data, we repeatedly see a **DNP-to-MSN pay delta around ~$10–20K/year**.

The important caveats (which show up clearly once you slice the data):

- **Pay-band orgs** (health systems, large groups, some FQHCs) more often encode formal degree differentials.
- **Smaller practices** often pay the same for MSN vs DNP and price more heavily on “can you carry a panel?”
- **Telehealth-first roles** sometimes pay more overall, but the premium is often tied to productivity, multi-state coverage, or schedule—degree text may be incidental.

This is why we expose filters on the jobs page and keep the salary guide separate: one is **real-time market evidence**, the other is **aggregated range context**.

---

## 5) Turning salary delta into break-even time (the ROI calculation)

The cleanest ROI view is: **how long to break even?**

Break-even years:

```text
break_even_years = total_cost / annual_salary_lift
```

Where `total_cost` should include:

- tuition + fees
- interest/loan costs
- **lost income** if you delay full-time work or reduce hours

Example:

- Total cost = $40,000
- Salary lift = $12,000/year

Break-even ≈ 3.3 years.

But if:

- Total cost = $70,000
- Lift = $10,000/year

Break-even = 7 years.

That’s the part many “average bump” discussions miss: **a $15K delta can vanish if the doctorate delays earnings by a year**.

---

## 6) How we surface this in the product

From a UI standpoint, “DNP vs MSN” is just a filter. Under the hood, it’s a chain of data decisions:

- normalized compensation fields stored in Supabase
- deduped job entities (one canonical job, many source URLs)
- degree buckets with confidence
- location geocoding for state/city slices
- real-time query performance so you can compare your market quickly

If you want to sanity-check your target area, start with live postings on the main jobs page and then cross-reference the broader ranges in the salary guide:

- https://pmhnphiring.com/jobs
- https://pmhnphiring.com/salary-guide

The takeaway isn’t “DNP always wins.” It’s: **the ROI depends on where you plan to work, how the employer prices credentials, and whether the extra schooling changes your time-to-earn.**
