Hospital billing was supposed to be made easier to decipher, but that's not what's happened, Sun-Times finds
Five patients are at
function window {
'use strict';
window._cpmGfxDotPlotData = window._cpmGfxDotPlotData || {};
window._cpmGfxDotPlotData['93306'] = {
procedure: 'Diagnostic echocardiogram',
detail: '
footnote: 'Each listed price is the median for all of thatu00a0insurer’s plans.',
dots: [
{price: 973, insurer: 'uhc', label: 'United Healthcare'},
{price: 1258, insurer: '
{price: 1524, insurer: 'cigna', label: 'Cigna'},
{price: 1710, insurer: 'bcbs', label: 'Blueu00a0Cross Blueu00a0Shield'},
{price: 1721, insurer: 'humana', label: 'Humana'},
{price: 1155, insurer: 'CASH', label: 'Cash price, no insurance'}
]
};
} this ;
function window {
'use strict';
window._cpmGfxDotPlotData = window._cpmGfxDotPlotData || {};
window._cpmGfxDotPlotData['90935'] = {
procedure: 'Hemodialysis',
detail: '
footnote: 'Each listed price is the median for all of thatu00a0insurer’s plans.',
dots: [
{price: 741, insurer: 'CASH', label: 'Cash price, no insurance'},
{price: 1715, insurer: 'bcbs', label: 'Blueu00a0Cross Blueu00a0Shield'},
{price: 1970, insurer: 'humana', label: 'Humana'},
{price: 2050, insurer: 'cigna', label: 'Cigna'},
{price: 2413, insurer: 'uhc', label: 'United Healthcare'},
{price: 2769, insurer: '
]
};
} this ;
function window {
'use strict';
window._cpmGfxDotPlotData = window._cpmGfxDotPlotData || {};
window._cpmGfxDotPlotData['45378'] = {
procedure: 'Colonoscopy',
detail: 'Northwestern Medicine Palos Hospital',
footnote: 'Each listed price is the median for all of thatu00a0insurer’s plans.',
dots: [
{price: 980, insurer: 'bcbs', label: 'Blueu00a0Cross Blueu00a0Shield'},
{price: 3371, insurer: 'uhc', label: 'United Healthcare'},
{price: 3371, insurer: '
]
};
} this ;
Something as simple as an X-ray of the foot had wide variations in price. At
function window {
'use strict';
window._cpmGfxDotPlotData = window._cpmGfxDotPlotData || {};
window._cpmGfxDotPlotData['73630'] = {
procedure: 'Foot X-ray',
detail: '
footnote: 'Each listed price is the median for all of thatu00a0insurer’s plans.',
dots: [
{price: 97, insurer: '
{price: 118, insurer: 'cigna', label: 'Cigna'},
{price: 167, insurer: 'bcbs', label: 'Blueu00a0Cross Blueu00a0Shield'},
{price: 287, insurer: 'uhc', label: 'United Healthcare'},
{price: 551, insurer: 'humana', label: 'Humana'}
]
};
} this ;
The same hospital system accepting the same insurance plans also had widely varying prices. A hand X-ray under Blue Cross Blue Shield’s Managed Care plan was
function window {
'use strict';
window._cpmGfxDotPlotData = window._cpmGfxDotPlotData || {};
window._cpmGfxDotPlotData['73130'] = {
procedure: 'Hand X-ray',
detail: 'Blueu00a0Cross Blueu00a0Shield Managedu00a0Care plan',
dots: [
{price: 330, hospOwner: 'advocate', label: 'Advocate
{price: 424, hospOwner: 'advocate', label: 'Advocate Illinois Masonic Medicalu00a0Center Lakeu00a0View '},
{price: 521, hospOwner: 'advocate', label: 'Advocate Goodu00a0Samaritan Hospital Downersu00a0Grove '},
{price: 647, hospOwner: 'advocate', label: 'Advocate Southu00a0Suburban Hospital Hazelu00a0Crest '}
]
};
} this ;
The price differences are felt most keenly by consumers with high-deductible plans, who made up about 42% of the private insurance market in 2023, according to a survey by the CDC’s
Even when prices have been posted, complicated and unwieldy datasets make it unhelpful for the average consumer trying to comparison shop for, say, the best price for an MRI. And insurers’ bundling and discounting can change the final price.The federal government is working on reforms to streamline how data is presented in hopes of making it more useful. But research shows consumers don’t typically comparison shop for healthcare, usually opting for whatever their doctor recommends.“The average consumer can’t access the data, can’t make heads or tails of it. You have to be able to compare one hospital to another. Without comparisons, you don’t have anything actionable,”
function window {
'use strict';
window._cpmGfxDotPlotData = window._cpmGfxDotPlotData || {};
window._cpmGfxDotPlotData['92920'] = {
procedure: 'Balloon angioplasty',
detail: '
footnote: 'Each listed price is the median for all of thatu00a0insurer’s plans.',
dots: [
{price: 7962, insurer: 'CASH', label: 'Cash price, no insurance'},
{price: 18423, insurer: 'bcbs', label: 'Blueu00a0Cross Blueu00a0Shield'},
{price: 21155, insurer: 'humana', label: 'Humana'},
{price: 22014, insurer: 'cigna', label: 'Cigna'},
{price: 25917, insurer: 'uhc', label: 'United Healthcare'},
{price: 29742, insurer: '
]
};
} this ;
Some consumer groups, like
Tell us what you seeHave you received a confusing hospital bill? Or seen a sharp price increase for a procedure or test you’ve had in the past?Have you ever tried to bargain down a hospital bill? What happened?What aspect of the system would you like to see investigated?Sun-
How we analyzed prices at
Related
Surprise medical bills hit some uninsured hard
Car insurance nightmare: After wreck, hospitalized patient crashes again, into
.cpm-gfx-dot-plot-wrapper {
margin: 2rem 0 2rem 3rem;
}
.cpm-gfx-dot-plot-wrapper h3 {
margin-bottom: 0.5rem;
margin-top: 0;
}
.cpm-gfx-dot-plot-wrapper h4 {
margin-bottom: 0.5rem;
margin-top: 0;
}
.cpm-gfx-dot-plot-wrapper p:last-of-type {
font-size: 1.5rem;
}
.cpm-gfx-dot-plot-wrapper p:last-of-type:before {
content: 'Note: ';
font-weight: bold;
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount {
fill-opacity: 0.7;
stroke: #000;
stroke-opacity: 0.5;
stroke-width: 1;
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount.cpm-gfx-shading-by-insurer.cpm-gfx-shading-uhc {
fill: #002677; /* Brand color for
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount.cpm-gfx-shading-by-insurer.cpm-gfx-shading-
fill: #7d3f98; /* Brand color for
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount.cpm-gfx-shading-by-insurer.cpm-gfx-shading-cigna {
fill: #0033ff; /* Brand color for Cigna */
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount.cpm-gfx-shading-by-insurer.cpm-gfx-shading-bcbs {
fill: #007cbf; /* Brand color for
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount.cpm-gfx-shading-by-insurer.cpm-gfx-shading-humana {
fill: #5c9a1b; /* Brand color for Humana */
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount.cpm-gfx-shading-by-insurer.cpm-gfx-shading-CASH {
fill: #788f6f; /* Sample from a
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-amount.cpm-gfx-shading-by-hospOwner.cpm-gfx-shading-advocate {
fill: #7e82c2; /* Brand color for Advocate */
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-dot-plot {
height: 8rem;
width: 100%;
z-index: 1;
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-positioner {
position: relative;
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-tooltip {
background-color: #fff;
border: 1px solid #666;
box-shadow: 2px 2px 6px rgba 0, 0, 0, 0.4 ;
display: none;
font-family: sans-serif;
font-size: 1.5rem;
left: 0;
line-height: 1;
padding: 0.5rem;
pointer-events: none;
position: absolute;
top: 0;
max-width: 50%;
min-width: 10rem;
z-index: 9001;
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-tooltip.cpm-gfx-tooltip-active {
display: block;
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-tooltip .cpm-gfx-tooltip-name {
font-weight: normal;
}
.cpm-gfx-dot-plot-wrapper .cpm-gfx-tooltip .cpm-gfx-tooltip-value {
font-weight: bold;
}
function window {
'use strict';
// CONSTANTS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const ATTRIB_NAME_DATA = 'data-gfx-cpt';
const CLASS_NAME_AMOUNT = 'cpm-gfx-amount';
const CLASS_NAME_DATA = 'cpm-gfx-dot-plot-data';
const CLASS_NAME_PLOT = 'cpm-gfx-dot-plot';
const CLASS_NAME_POSITIONER = 'cpm-gfx-positioner';
const CLASS_NAME_TOOLTIP = 'cpm-gfx-tooltip';
const CLASS_NAME_TOOLTIP_ACTIVE = 'cpm-gfx-tooltip-active';
const CLASS_NAME_TOOLTIP_NAME = 'cpm-gfx-tooltip-name';
const CLASS_NAME_TOOLTIP_VALUE = 'cpm-gfx-tooltip-value';
const MARGINS = {
top: convertRemToPixels 2 , right: convertRemToPixels 2 ,
bottom: convertRemToPixels 2 , left: convertRemToPixels 2 };
const SHADE_BY_CHOICES = ['insurer', 'hospOwner'];
const TICK_COUNT = 5;
const TRANSITION_DURATION = 1000 * 1;
const Y_HEIGHT = 4;
// HELPER FUNCTIONS =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
function convertRemToPixels rem {
// Source - https://stackoverflow.com/a/42769683
// Posted by etham
// Retrieved 2026-06-02, License -
return rem * parseFloat getComputedStyle document.documentElement .fontSize ;
}
// PLOT SETUP AND RENDERING =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const plotsByCPT = {};
function createContainer siblingBefore, cpt, data {
const wrapper = window.document.createElement 'div' ;
wrapper.classList.add `${CLASS_NAME_PLOT}-wrapper` ;
function _addText text, tagName {
if text == null {
return;
}
const elem = window.document.createElement tagName ;
elem.innerText = text;
wrapper.appendChild elem ;
}
_addText data.procedure, 'h3' ;
_addText data.detail, 'h4' ;
const positioner = window.document.createElement 'div' ;
positioner.classList.add CLASS_NAME_POSITIONER ;
wrapper.appendChild positioner ;
const tooltip = window.document.createElement 'div' ;
tooltip.classList.add CLASS_NAME_TOOLTIP ;
positioner.appendChild tooltip ;
const frame = window.document.createElement 'div' ;
frame.classList.add CLASS_NAME_PLOT ;
frame.setAttribute ATTRIB_NAME_DATA, cpt ;
positioner.appendChild frame ;
_addText data.footnote, 'p' ;
siblingBefore.insertAdjacentElement 'afterend', wrapper ;
return {frame, tooltip};
}
function buildScales data, dims {
const sortedValues = data.dots.map d => d.price ;
sortedValues.sort a, b => a - b ;
const max = sortedValues.slice -1 [0];
const niceTicks = d3.nice 0, max, TICK_COUNT ;
const x = d3.scaleLinear
.domain niceTicks
.range [MARGINS.left, dims.width - MARGINS.right]
const y = d3.scaleLinear
.domain [- Y_HEIGHT / 2 , Y_HEIGHT / 2 ]
.range [dims.height - MARGINS.bottom, MARGINS.top] ;
return {x, y};
}
function renderBase data, dims, scales {
const svg = d3.create 'svg'
.attr 'width', dims.width
.attr 'height', dims.height ;
svg.append 'g'
.attr 'transform', `translate 0,${MARGINS.top} `
.classed 'cpm-gfx-axis cpm-gfx-axis-x', true
.call
d3.axisTop scales.x
.ticks TICK_COUNT ;
return svg;
}
function renderInitialCircles data, scales, svg {
svg.selectAll `circle.${CLASS_NAME_AMOUNT}`
.data data.dots
.join 'circle'
.attr 'cx', scales.x 0
.attr 'cy', scales.y 0 // FIXME?
.attr 'r', Math.abs scales.y 0.75 - scales.y 0
.attr 'class', function setCircleClasses d {
const baseClasses = [CLASS_NAME_AMOUNT];
const shadingBy = SHADE_BY_CHOICES.find
choice => d[choice] != null ;
if shadingBy == null {
return baseClasses.join ' ' ;
}
const shadingValue = d[shadingBy];
return baseClasses.concat [
`cpm-gfx-shading-by-${shadingBy}`,
`cpm-gfx-shading-${shadingValue}`] .join ' ' ;
} ;
}
function setupPlot placeholder {
const cpt = placeholder.getAttribute ATTRIB_NAME_DATA ;
const data = window._cpmGfxDotPlotData[cpt];
const {frame: container, tooltip} = createContainer
placeholder, cpt, data ;
const dims = {
height: container.clientHeight,
width: container.clientWidth};
const scales = buildScales data, dims ;
const svg = renderBase data, dims, scales ;
container.append svg.node ;
renderInitialCircles data, scales, svg ;
const circles = svg.selectAll `circle.${CLASS_NAME_AMOUNT}` ;
bindEvents circles, dims, scales, tooltip ;
function fire {
circles.transition newTransition
.attr 'cx', d => scales.x d.price
.attr 'cy', d => scales.y randomY ;
}
function reset {
circles.transition newTransition
.attr 'cx', 0
.attr 'cy', scales.y 0 ;
}
plotsByCPT[cpt] = {
container, circles, cpt, data, dims,
fire, reset, scales, svg, tooltip};
};
// ANIMATION AND INTERACTION -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const _interpolator = d3.interpolate -0.75, 0.75 ;
const _randSampler = d3.randomUniform ;
function randomY {
return _interpolator _randSampler ;
}
function newTransition {
return d3.transition
.duration TRANSITION_DURATION
.ease d3.easeCubicInOut ;
}
function bindEvents circles, dims, scales, tooltip {
circles
.on 'mouseenter', listenForShow dims, scales, tooltip
.on 'mouseleave', listenForHide tooltip ;
}
function listenForShow dims, scales, tooltip {
function _showTooltip e, d {
tooltip.innerHTML = renderTooltipBody d ;
tooltip.classList.add CLASS_NAME_TOOLTIP_ACTIVE ;
const priceX = scales.x d.price ;
const tooltipWidth = tooltip.clientWidth;
if priceX + tooltipWidth > scales.x.range [1] {
tooltip.style.setProperty 'left', `${priceX - tooltipWidth}px` ;
} else {
tooltip.style.setProperty 'left', `${priceX}px` ;
}
const pointY = scales.y 0 ; // FIXME
tooltip.style.setProperty 'top', `${pointY}px` ;
}
return _showTooltip;
}
function listenForHide tooltip {
function _hideTooltip {
tooltip.classList.remove CLASS_NAME_TOOLTIP_ACTIVE ;
}
return _hideTooltip;
}
const formatCurrency = d3.format '$,.0d' ;
function renderTooltipBody d {
return `
${d.label}:
${formatCurrency d.price }
`;
}
// INITIALIZATION =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
function _initAll {
Array.from window.document.querySelectorAll
`.${CLASS_NAME_PLOT}-wrapper` .map elem => elem.remove ;
// VISUALIZATIONS =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const placeholders = window.document.querySelectorAll
`.${CLASS_NAME_DATA}` ;
Array.from placeholders .forEach setupPlot ;
// OBSERVERS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const plots = window.document.querySelectorAll `.${CLASS_NAME_PLOT}` ;
const observerCallback = function observerFire entries, observer {
entries.forEach function checkObservedEntry entry {
const entryCPT = entry.target.getAttribute ATTRIB_NAME_DATA ;
const plot = plotsByCPT[entryCPT];
if entry.isIntersecting {
plot.fire ;
} else {
plot.reset ;
}
} ;
};
const observer = new IntersectionObserver observerCallback, {
root: null, threshold: 0.7} ;
Array.from plots .forEach function bindObserver plotElem {
observer.observe plotElem ;
} ;
}
const initAll = _.debounce _initAll, 1000 * 1, {trailing: true} ;
window.document.addEventListener
'DOMContentLoaded',
function initWithResize {
window.addEventListener 'resize', initAll ;
initAll ;
} ;
} this ;


FACT FOCUS: Trump says illegal immigration increased car insurance premiums. Experts say otherwise
Polling shows Midwestern voters concerned about home insurance cost
Advisor News
- Help child-free clients plan for their later years
- When new investment trends emerge, Gen Z is most likely generation to be first in
- Could ‘plain English’ become an advisor’s secret weapon?
- IRI urges Senate action on 403(b) parity legislation
- Three estate planning ideas to protect your clients and their wealth
More Advisor NewsAnnuity News
- Nationwide adds mutual fund-linked strategy to New Heights Select FIA
- NUNN INTRODUCES BILL TO CUT RED TAPE, GIVE IOWANS CLEARER INSURANCE INFORMATION
- NAIC working group pressed to accelerate annuity illustration overhaul
- State Auditor James Brown Kicks Off Life Insurance Awareness Month With Policy Locator Tool
- Wink: Annuity sales post strong Q2, led by MYGAs and structured products
More Annuity NewsHealth/Employee Benefits News
Life Insurance News