Research / 2026-09-10

Negotiated rates by payer at the same hospital: what price transparency says about who wins the contract

Across 15 HCA hospitals, UnitedHealthcare's case-rate median sits 24 to 46 percent below each hospital's own cross-payer median on nine high-volume MS-DRGs, while Cigna sits above on eight; at three Tenet hospitals the ordering reverses. The result only holds after filtering on rate methodology.

The question

A hospital's machine-readable file lists what each payer has agreed to pay for the same service at the same building. That removes the case-mix and geography noise that makes cross-hospital price comparison hard. The residual is the contract. This note asks a narrow question of that residual: at hospitals owned by one operator, which national payer is paying the least, and by how much, for ten inpatient DRGs.

What the table holds

hpt_negotiated_rates is extracted from each hospital's own price-transparency file for a curated list of 708 codes. The 2026-08-29 export holds 10,752,221 rows across 2,421 hospitals; 1,772,169 rows are MS-DRGs from 1,898 hospitals, and 267 hospitals map to a listed operator across nine tickers (docs/data-dictionaries/hpt_negotiated_rates.md). Payer names are normalised into payer_name_canonical from a curated alias table. For MS-DRG 470 the four largest canonical payers by negotiated-rate row count are Blue Cross Blue Shield (5,538 rows), UnitedHealthcare (4,284), Aetna (3,108) and Cigna (2,490) (query A). Elevance's Anthem plans are a separate canonical value, "Anthem BCBS", with 647 rows on the same code; this note uses the larger "Blue Cross Blue Shield" bucket, which pools Anthem and non-Anthem Blues plans.

Sample

The operator crosswalk maps 287 hospital CCNs to HCA and 98 to Tenet (THC) (query B). Of those, 88 HCA and 7 Tenet hospitals have negotiated rows for the four payers on the ten DRGs (query C). The sample is the 15 HCA hospitals with the most such rows and all 7 Tenet hospitals: 3,446 negotiated rows in total, 3,077 of them HCA. The HCA hospitals are in Florida (4), Georgia (3), Kansas (2), Missouri (2), Tennessee (2) and Texas (2); all seven Tenet hospitals are in Texas.

The DRG list is 470, 871, 291, 392, 690, 194, 065, 329, 330 and 460. DRGs 193, 683 and 189 are not on the curated extraction list and return no rows (query D). DRG 460 appears at one Tenet hospital only.

The methodology trap

The first pass computed a median per payer per DRG over every negotiated row. It produced knee replacements (DRG 470) at $2,999 for Cigna in Florida and $2,542 for UnitedHealthcare in Houston. Those are not case rates. The rate_methodology column explains them (query E). In the sample, UnitedHealthcare rows split into fee schedule (480 rows, median $12,595), case rate (261, median $10,711 to $35,830), per diem (216 rows at 15 hospitals, median $3,848) and percent of total billed charges (243 rows at 15 hospitals, median 35). A per diem and a percentage are both stored in rate_amount. Mixing them with case rates yields a number that means nothing.

Every result below therefore keeps only rows whose methodology is "case rate" or "fee schedule", the two per-stay dollar conventions. Per-diem and percent-of-charges rows are dropped rather than converted, because the file does not carry the length of stay or charge base needed to convert them. Rows are deduplicated to the latest snapshot per hospital, code, payer, plan and setting.

Result

For each hospital, DRG and payer the median across the payer's plans is taken. The hospital's own median across its four payers is the reference. The table reports the median rate across hospitals and the median of each payer's spread against that reference (query F). Spread is positive when the payer pays more than the hospital's cross-payer median.

Ticker DRG Payer Hospitals Median rate Median spread vs hospital
HCA 470 Hip/knee replacement UnitedHealthcare 15 $16,350 -41.5%
HCA 470 Aetna 14 $27,063 -9.8%
HCA 470 Blue Cross Blue Shield 15 $31,627 +4.9%
HCA 470 Cigna 15 $36,388 +16.9%
HCA 871 Sepsis w MCC UnitedHealthcare 15 $13,226 -43.3%
HCA 871 Blue Cross Blue Shield 15 $18,661 -2.6%
HCA 871 Aetna 14 $31,452 +15.3%
HCA 871 Cigna 14 $36,571 +43.4%
HCA 291 Heart failure w MCC UnitedHealthcare 15 $11,352 -24.3%
HCA 291 Blue Cross Blue Shield 15 $13,937 -3.6%
HCA 291 Aetna 14 $21,097 +7.2%
HCA 291 Cigna 11 $20,926 +27.1%
HCA 329 Bowel procedure w MCC UnitedHealthcare 15 $28,830 -26.0%
HCA 329 Cigna 11 $74,817 +42.4%
THC 470 Aetna 3 $31,151 0.0%
THC 470 Blue Cross Blue Shield 2 $32,243 -5.3%
THC 470 Cigna 3 $35,346 -2.3%
THC 470 UnitedHealthcare 3 $39,705 +12.1%
THC 871 UnitedHealthcare 3 $41,322 +12.1%
THC 871 Cigna 3 $36,782 -2.0%

The full 76-row table for all ten DRGs, with min and max spread per cell, is in the CSV.

The HCA pattern is consistent across the nine DRGs the sample covers. UnitedHealthcare's median spread is negative on all nine, between -24.3% (DRG 291) and -46.2% (DRG 330). Cigna's is positive on eight of nine, between +7.0% (DRG 330) and +77.0% (DRG 065), with DRG 392 the exception at -3.1%. Aetna and Blue Cross Blue Shield sit near the reference: Aetna between -9.8% and +26.0%, Blue Cross Blue Shield between -3.6% and +4.9%.

The Tenet sample is three hospitals with all four payers, so it is a check rather than a result. There the ordering reverses: on the nine DRGs with three hospitals, UnitedHealthcare's spread is +12.1% and Cigna's is between -12.1% and 0.0%.

One DRG, hospital by hospital

Query G shows DRG 470 at each HCA hospital. UnitedHealthcare is the lowest of the four payers at nine of the 15: all four Florida hospitals ($15,788 to $19,999 against Cigna at $43,537 to $45,470), both Kansas and both Missouri hospitals ($14,599 to $15,972 against Blue Cross Blue Shield at about $31,600), and Woman's Hospital of Texas. Blue Cross Blue Shield is lowest at the three Georgia hospitals ($7,694 to $11,082). Aetna is lowest at the two Tennessee hospitals and at Hill Country Memorial in Texas. The contract ordering is regional, not national, and the operator-level median hides that.

Two caveats apply to any reading. plan_name mixes commercial, exchange and Medicare Advantage lines (for example "MCR", "MCRPPO", "NarrowNetworkIndivExchange" at Woman's Hospital of Texas), and a payer with more Medicare Advantage lines will show a lower median. And a hospital file states what a payer has agreed to pay, not what volume moves at that price.

May 2026 start and the monthly diff

The table's snapshot_date runs from 2026-05-22 to 2026-08-29 (docs/data-dictionaries/hpt_negotiated_rates.md). Hospitals are re-crawled on a rolling basis. In this sample every HCA row carries the 2026-07-29 snapshot; the Tenet rows carry 2026-05-23, 2026-05-24 or 2026-07-29 (query H). No fact in the sample yet has two snapshots (query I), so there is nothing to diff today.

Once a hospital has been crawled twice, the diff is a list of (hospital, code, payer, plan) facts whose rate_amount changed between snapshots, with the hospital's own file as the audit trail via source_mrf_url. Hospitals update their files on their own schedules, typically monthly under the CMS rule (docs/data-dictionaries/hpt_negotiated_rates.md). A contract renewal shows up as a block of changed rows for one payer at one hospital in one month. That is the signal a monthly rebuild of this table is built to surface.

CSV download

data/negotiated-rates-by-payer-same-hospital.csv: 76 rows, one per ticker, DRG and payer, with hospital count, median rate, median, min and max spread against the hospital's cross-payer median, the methodology filter and the snapshot window.

Appendix: queries

All queries were run read-only against the production Postgres (hpt_rates is the source table for the hpt_negotiated_rates product) on 2026-09-10 with statement_timeout = '60s'. Every hpt_rates query is filtered on explicit ccn and billing_code lists and uses the idx_hpt_rates_lookup (ccn, billing_code, rate_type) index.

Query A, top canonical payers on DRG 470:

SELECT payer_name_canonical, count(*) n
FROM hpt_rates
WHERE payer_name_canonical IS NOT NULL AND rate_type = 'negotiated' AND billing_code = '470'
GROUP BY 1 ORDER BY 2 DESC LIMIT 15;

Query B, operator CCN counts:

SELECT ticker, operator_key, count(DISTINCT ccn) ccns
FROM provider_operator_crosswalk
WHERE ticker IN ('HCA','THC') AND facility_type = 'hospital'
GROUP BY 1, 2;

Query C, rank operator hospitals by matching rows (top 15 HCA, all THC taken):

WITH x AS (
  SELECT DISTINCT ticker, ccn FROM provider_operator_crosswalk
  WHERE ticker IN ('HCA','THC') AND facility_type = 'hospital')
SELECT x.ticker, x.ccn, count(*) n_rows,
       count(DISTINCT r.billing_code) n_drgs, count(DISTINCT r.payer_name_canonical) n_payers
FROM x JOIN hpt_rates r ON r.ccn = x.ccn
WHERE r.billing_code IN ('470','871','291','392','690','194','193','683','189','065','65')
  AND r.rate_type = 'negotiated'
  AND r.payer_name_canonical IN ('UnitedHealthcare','Blue Cross Blue Shield','Aetna','Cigna')
GROUP BY 1, 2 ORDER BY 1, 3 DESC;

Query D, which candidate DRGs exist:

SELECT billing_code, count(*) n, count(DISTINCT ccn) hosp
FROM hpt_rates
WHERE billing_code IN ('470','871','291','392','690','194','193','683','189','065','65','460','329','330','853')
  AND billing_code_type = 'MS-DRG' AND rate_type = 'negotiated'
GROUP BY 1 ORDER BY 2 DESC;

Query E, methodology mix in the sample (:ccns is the 22-CCN list from query C):

SELECT payer_name_canonical payer, coalesce(rate_methodology, '(null)') methodology,
       count(*) n, count(DISTINCT ccn) hosp,
       round(percentile_cont(0.5) WITHIN GROUP (ORDER BY rate_amount)::numeric) median_amt
FROM hpt_rates
WHERE ccn IN (:ccns)
  AND billing_code IN ('470','871','291','392','690','194','065','329','330','460')
  AND billing_code_type = 'MS-DRG' AND rate_type = 'negotiated'
  AND payer_name_canonical IN ('UnitedHealthcare','Blue Cross Blue Shield','Aetna','Cigna')
GROUP BY 1, 2 ORDER BY 1, 3 DESC;

Query F, the result table:

WITH sel AS (
  SELECT DISTINCT ticker, ccn FROM provider_operator_crosswalk
  WHERE ticker IN ('HCA','THC') AND facility_type = 'hospital' AND ccn IN (:ccns)),
facts AS (
  SELECT DISTINCT ON (r.ccn, r.billing_code, r.payer_name_canonical,
                      coalesce(r.plan_name,''), coalesce(r.setting,''))
         s.ticker, r.ccn, r.billing_code, r.payer_name_canonical AS payer, r.rate_amount
  FROM hpt_rates r JOIN sel s ON s.ccn = r.ccn
  WHERE r.ccn IN (:ccns)
    AND r.billing_code IN ('470','871','291','392','690','194','065','329','330','460')
    AND r.billing_code_type = 'MS-DRG' AND r.rate_type = 'negotiated'
    AND r.payer_name_canonical IN ('UnitedHealthcare','Blue Cross Blue Shield','Aetna','Cigna')
    AND r.rate_amount BETWEEN 1 AND 500000
    AND lower(r.rate_methodology) IN ('case rate','fee schedule')
  ORDER BY r.ccn, r.billing_code, r.payer_name_canonical,
           coalesce(r.plan_name,''), coalesce(r.setting,''), r.snapshot_date DESC),
hp AS (
  SELECT ticker, ccn, billing_code, payer,
         percentile_cont(0.5) WITHIN GROUP (ORDER BY rate_amount) AS hp_median
  FROM facts GROUP BY 1, 2, 3, 4),
hm AS (
  SELECT ccn, billing_code,
         percentile_cont(0.5) WITHIN GROUP (ORDER BY hp_median) AS hosp_median, count(*) n_payers
  FROM hp GROUP BY 1, 2)
SELECT hp.ticker, hp.billing_code, hp.payer, count(DISTINCT hp.ccn) hospitals,
       round(percentile_cont(0.5) WITHIN GROUP (ORDER BY hp.hp_median)::numeric) median_rate,
       round(100 * percentile_cont(0.5) WITHIN GROUP (ORDER BY hp.hp_median / hm.hosp_median - 1)::numeric, 1) median_spread_vs_hosp_pct,
       round(100 * min(hp.hp_median / hm.hosp_median - 1)::numeric, 1) min_spread_pct,
       round(100 * max(hp.hp_median / hm.hosp_median - 1)::numeric, 1) max_spread_pct
FROM hp JOIN hm USING (ccn, billing_code)
WHERE hm.n_payers >= 3
GROUP BY 1, 2, 3 ORDER BY 1, 2, 3;

Query G, DRG 470 by HCA hospital (:hca_ccns is the 15 HCA CCNs):

WITH facts AS (
  SELECT DISTINCT ON (ccn, payer_name_canonical, coalesce(plan_name,''), coalesce(setting,''))
         ccn, payer_name_canonical payer, rate_amount
  FROM hpt_rates
  WHERE ccn IN (:hca_ccns) AND billing_code = '470' AND billing_code_type = 'MS-DRG'
    AND rate_type = 'negotiated'
    AND payer_name_canonical IN ('UnitedHealthcare','Blue Cross Blue Shield','Aetna','Cigna')
    AND rate_amount BETWEEN 1 AND 500000
    AND lower(rate_methodology) IN ('case rate','fee schedule')
  ORDER BY ccn, payer_name_canonical, coalesce(plan_name,''), coalesce(setting,''), snapshot_date DESC),
hp AS (SELECT ccn, payer, percentile_cont(0.5) WITHIN GROUP (ORDER BY rate_amount) m FROM facts GROUP BY 1, 2)
SELECT h.ccn, r.provider_name, r.state,
       round(max(m) FILTER (WHERE payer = 'UnitedHealthcare')) uhc,
       round(max(m) FILTER (WHERE payer = 'Blue Cross Blue Shield')) bcbs,
       round(max(m) FILTER (WHERE payer = 'Aetna')) aetna,
       round(max(m) FILTER (WHERE payer = 'Cigna')) cigna,
       (SELECT payer FROM hp h2 WHERE h2.ccn = h.ccn ORDER BY m ASC LIMIT 1) lowest_payer
FROM hp h
LEFT JOIN LATERAL (SELECT provider_name, state FROM hcris_hospital_reports x
                   WHERE x.ccn = h.ccn ORDER BY fy_end DESC LIMIT 1) r ON true
GROUP BY 1, 2, 3 ORDER BY 3, 1;

Query H, snapshot window of the sample:

SELECT s.ticker, count(DISTINCT r.ccn) hospitals, min(r.snapshot_date), max(r.snapshot_date),
       count(DISTINCT date_trunc('month', r.snapshot_date)) months, count(*) rows_all
FROM hpt_rates r
JOIN (SELECT DISTINCT ticker, ccn FROM provider_operator_crosswalk
      WHERE ticker IN ('HCA','THC') AND facility_type = 'hospital') s ON s.ccn = r.ccn
WHERE r.ccn IN (:ccns)
  AND r.billing_code IN ('470','871','291','392','690','194','065','329','330','460')
  AND r.billing_code_type = 'MS-DRG' AND r.rate_type = 'negotiated'
GROUP BY 1;

Query I, facts with two snapshots (Tenet CCNs):

WITH f AS (
  SELECT ccn, billing_code, payer_name_canonical payer, coalesce(plan_name,'') plan,
         coalesce(setting,'') setting, snapshot_date, rate_amount
  FROM hpt_rates
  WHERE ccn IN ('670047','670060','670076','450860','670049','670067','450864')
    AND billing_code IN ('470','871','291','392','690','194','065','329','330','460')
    AND billing_code_type = 'MS-DRG' AND rate_type = 'negotiated'
    AND payer_name_canonical IN ('UnitedHealthcare','Blue Cross Blue Shield','Aetna','Cigna')
    AND rate_amount BETWEEN 1 AND 500000),
k AS (
  SELECT ccn, billing_code, payer, plan, setting,
         count(DISTINCT snapshot_date) n_snaps, count(DISTINCT rate_amount) n_rates
  FROM f GROUP BY 1, 2, 3, 4, 5)
SELECT ccn, count(*) facts,
       count(*) FILTER (WHERE n_snaps >= 2) facts_two_snaps,
       count(*) FILTER (WHERE n_snaps >= 2 AND n_rates > 1) facts_rate_changed
FROM k GROUP BY 1 ORDER BY 1;