Research / 2026-09-10

The PE diligence pack for a hospital target, built from public filings only

Oroville Hospital, an independent 153-bed nonprofit in Butte County, California, assembled from cost reports, HCAI quarterlies, Worksheet A-7, Care Compare, four exclusion lists and the MA county file in 13 queries; FY2024 revenue $405.1M at a 7.9% margin, a Q4 2025 operating loss, a one-star rating and readmission ratios above 1.0 on five conditions.

The target

The screen was mechanical: a California acute-care hospital with no operator in the crosswalk, a complete FY2019 to FY2024 cost-report series, a quarterly HCAI series, a Care Compare star rating, six Worksheet A-7 rows and named owners in the CMS ownership file. Oroville Hospital, CCN 050030, passed every filter (query A). Everything below is from public filings. No management access, no data room.

Identity and ownership

Oroville Hospital, 2767 Olive Highway, Oroville, California 95965. NPI 1780788018. Cost-report control type code 2; Care Compare lists it as "Voluntary non-profit - Private", acute care, with emergency services. Fiscal year ends 30 November. The operator crosswalk has no row for the CCN, and the cost-report parent field reads "Orohealth Corporation A Non Profit Healthcare System" (query B).

The CMS Hospital All Owners file, snapshot 2026-07-17, lists eight parties (query C). One organisation: OroHealth Corporation, a 5% or greater direct ownership interest, associated since 2007-12-03; the file flags it as not private equity, not a REIT, not a chain home office. Seven individuals: three corporate directors associated 2017-06-29 (Edward Gilbert, Matthew Bazzani, Roy Shannon), three corporate officers (Jo Dilbeck since 2003-12-01, Colleen Duncan since 2020-01-31, Scott Chapple since 2026-04-06) and one W-2 managing employee (Ashley Cristescu, 2026-04-06). Two of the eight associations are five months old. Ownership percentages are not stated in the filing.

Financials, FY2019 to FY2024

From the cost report (query D). Fiscal years end 30 November.

FY Beds Discharges Revenue Net income Margin Medicare share of IP days Uncomp. care Total assets Fund balance
2019 153 13,889 $316.5M $15.4M 4.9% 53% $26.8M $420.8M $111.6M
2020 153 13,581 $306.8M $14.4M 4.7% 47% $31.5M $489.9M $126.0M
2021 153 12,899 $347.3M $14.9M 4.3% 44% $27.9M $519.5M $141.0M
2022 153 11,379 $347.8M -$3.8M -1.1% 43% $35.9M $511.1M $137.2M
2023 153 10,599 $382.1M $15.1M 4.0% 42% $29.1M $513.4M $149.4M
2024 153 11,475 $405.1M $32.1M 7.9% 38% $26.1M $565.3M $166.5M

Revenue grew 28.0% over five years while discharges fell 17.4%. Medicare's share of inpatient days fell from 53% to 38%; Medi-Cal's, on the cost report's inpatient-days line, ran 3% to 6%. Charity care charges fell from $18.2M in FY2019 to $6.5M in FY2024 and bad debt held at $3.7M to $3.9M. Salaries rose from $118.7M to $150.0M; FTEs were 1,317 in FY2019 and 1,327 in FY2023 (FY2024 is not filed). Total liabilities went from $309.1M to $398.7M. The Medicaid charges line on this filer is near zero in every year and is not usable for payer mix; the days line is.

One reading note. Net income is the filed line, not total revenues minus total costs; on that arithmetic the hospital is negative in four of six years. The cost report's cost total is a Medicare cost-finding figure and the difference is the point.

The last eight quarters

HCAI's quarterly filing runs to March 2026, two quarters past the last cost report (query E). Licensed beds are 259 on this filing against 153 on the cost report.

Quarter end Net patient revenue Operating income Op. margin Net income Discharges Medicare + Medi-Cal net revenue
2024-06-30 $106.1M $5.8M 5.3% $6.6M 3,163 $86.5M
2024-09-30 $105.9M $4.0M 3.7% $4.7M 3,230 $86.1M
2024-12-31 $101.0M $5.6M 5.4% $16.4M 3,039 $82.2M
2025-03-31 $106.9M $3.7M 3.4% $6.0M 2,874 $93.4M
2025-06-30 $107.8M $2.9M 2.6% $2.3M 2,912 $91.5M
2025-09-30 $107.0M $2.1M 1.9% $2.3M 2,743 $88.8M
2025-12-31 $105.5M -$7.3M -6.8% -$7.1M 2,683 $84.7M
2026-03-31 $107.5M $1.3M 1.2% $1.2M 2,772 $92.2M

Net patient revenue is flat at $101M to $108M a quarter. Operating margin fell from 5.3% in the June 2024 quarter to 1.9% by September 2025, posted a -6.8% loss in the December 2025 quarter, and was 1.2% in March 2026. Quarterly discharges are down 12% over the window. The December 2024 net income of $16.4M includes $10.8M of non-operating revenue. Medicare and Medi-Cal together are 80% to 87% of net patient revenue in every quarter. Equity was $160.7M in June 2024 and $149.7M in March 2026.

Capital spending, Worksheet A-7

FY Movable equipment Health IT Buildings and improvements Total purchases Purchases / opening assets
2019 $5.38M $2.13M $1.19M $9.04M 7.1%
2020 $5.42M $5.79M $0.13M $11.45M 8.4%
2021 $4.77M $1.70M $0.64M $7.11M 4.8%
2022 $0.57M $2.18M $0.98M $3.80M 2.5%
2023 -$0.10M $5.22M $3.33M $8.89M 5.7%
2024 not filed $0.45M not filed $0.45M 0.3%

Query F. Six-year total purchases are $40.7M against a capital asset balance of $162.0M at FY2024 end. Movable equipment, the imaging and surgical line, ran $4.8M to $5.4M a year through FY2021 and has been under $0.6M since; the FY2023 figure is a negative reclassification. FY2024 filed one line, $0.45M of health IT. A buyer should treat FY2024 as a capex holiday or an incomplete schedule and ask which.

Quality

CMS overall star rating: 1 of 5 (Care Compare, refreshed 2026-05-21). Mortality and safety groups are above the national average; readmission is below; patient experience and timeliness are not scored (query B). The Hospital Readmissions Reduction Program measures for the period ending 2024-06-30 show excess readmission ratios above 1.0 on five of six conditions: heart failure 1.3606, pneumonia 1.4255, COPD 1.2545, hip and knee 1.1118, AMI 1.0894; CABG not available (query G). The hospital-wide readmission rate is 19.3%, "worse than the national rate", on 2,592 cases. A ratio above 1.0 on any condition triggers an HRRP payment reduction; the reduction factor itself is not in the table.

Sanctions screen

Query H screens the hospital's NPI and the nine names (eight owners plus the hospital) against OIG LEIE, GSA SAM, state Medicaid exclusions and state board sanctions, by NPI and by exact name. Zero hits on every list. Scope: the state Medicaid list holds 23,310 California rows refreshed 2026-09-07; the state board list covers 13 states and California is not one of them (docs/data-dictionaries/provider_exclusions.md). Exact-name matching is the floor; a fuzzy pass on the seven individuals is the buyer's next step.

Local market

Butte County has three hospitals that file a cost report and one psychiatric health facility with no CCN (query I; county from the HCAI filing, since Care Compare's county field is empty for California).

Hospital City Type Beds Discharges FY2024 revenue Margin Stars Operator
Enloe Health Chico Acute 258 18,040 $976.5M 7.7% 3 none mapped
Oroville Hospital Oroville Acute 153 11,475 $405.1M 7.9% 1 none mapped
Orchard Hospital Gridley Critical access 24 333 $29.6M 2.5% not rated none mapped

Enloe is 2.4 times the target by revenue, 1.6 times by discharges, and rates two stars higher. No hospital in the county maps to a listed, PE-backed or nonprofit-system operator in the crosswalk.

Medicare Advantage in Butte County (FIPS 06007), August 2026, from the parent-county rollup (queries J and K): 5,355 MA enrollees across 58 parents, with 703 of 723 plan-county cells suppressed by CMS as under 11 enrollees. The raw file shows 1,030 of 1,087 cells suppressed. The rollup is therefore a floor, and a low one. Among unsuppressed enrollment, Elevance holds 1,893 (35.4%), UnitedHealth 1,433 (26.8%), Imperial Health Plan of California 1,259 (23.5%), Blue Shield of California 590 (11.0%) and CVS 134 (2.5%). A penetration rate needs an eligibles denominator that the product does not carry; the enrollment floor and the parent shares are what the file supports.

What the pack says

An independent nonprofit with flat revenue, falling volume, a payer mix that is four-fifths government, a capex line that has gone quiet, a one-star rating with readmission penalties on five conditions, and a larger, better-rated competitor in the same county. Every number has a filing behind it.

Time to assemble: 13 queries (11 lettered below plus two coverage checks), 31 seconds of database execution, about 20 minutes to write and check them.

CSV download

data/pe-diligence-pack-hospital-target.csv: 390 rows in long format (source, period type, period end, fiscal year, metric, value) covering the six cost-report years, the eight HCAI quarters and the six A-7 years.

Appendix: queries

Run read-only against production Postgres on 2026-09-10 with statement_timeout = '60s'. Execution times are from the run.

Query A, candidate screen (13.9 s):

WITH o AS (SELECT lpad(ccn,6,'0') ccn, count(DISTINCT owner_name) n_owners
           FROM cms_provider_ownership WHERE facility_type='hospital' AND lpad(ccn,6,'0') LIKE '05%' GROUP BY 1),
h AS (SELECT ccn, max(provider_name) provider_name,
             count(DISTINCT fy_end_year) FILTER (WHERE fy_end_year BETWEEN 2019 AND 2024) nfy,
             max(total_beds) FILTER (WHERE fy_end_year=2024) beds24,
             max(total_revenues) FILTER (WHERE fy_end_year=2024) rev24
      FROM hcris_hospital_reports WHERE state='CA' GROUP BY 1),
q AS (SELECT ccn, count(*) nq, max(county) county, max(control_type) hcai_control
      FROM state_hospital_quarterly_financials WHERE report_type='quarter' AND ccn IS NOT NULL GROUP BY 1),
c AS (SELECT ccn, hospital_type, overall_rating FROM cms_care_compare_hospitals WHERE state='CA'),
a AS (SELECT ccn, count(*) na FROM hcris_a7_capex WHERE fy_end_year BETWEEN 2019 AND 2024 GROUP BY 1),
xw AS (SELECT ccn, string_agg(operator_key,',') ops FROM provider_operator_crosswalk GROUP BY 1)
SELECT o.ccn, h.provider_name, q.county, q.hcai_control, c.hospital_type, c.overall_rating,
       h.nfy, h.beds24, h.rev24, q.nq, a.na, o.n_owners, xw.ops
FROM o LEFT JOIN h USING (ccn) LEFT JOIN c USING (ccn) LEFT JOIN q USING (ccn)
       LEFT JOIN a USING (ccn) LEFT JOIN xw USING (ccn)
ORDER BY (xw.ops IS NULL) DESC, h.nfy DESC NULLS LAST, h.rev24 DESC NULLS LAST;

Query B, identity (0.8 s):

SELECT h.ccn, h.npi, h.provider_name, h.street, h.city, h.state, h.zip, h.control_type, h.hospital_type, h.fy_end,
       c.hospital_ownership, c.emergency_services, c.overall_rating,
       c.mortality_national_comparison, c.safety_national_comparison, c.readmission_national_comparison,
       c.patient_experience_national_comparison, c.timely_effective_national_comparison, c.ingested_at::date,
       p.parent_org,
       (SELECT count(*) FROM provider_operator_crosswalk x WHERE x.ccn='050030') crosswalk_rows
FROM (SELECT * FROM hcris_hospital_reports WHERE ccn='050030' ORDER BY fy_end DESC LIMIT 1) h
LEFT JOIN cms_care_compare_hospitals c ON c.ccn=h.ccn
LEFT JOIN hcris_ccn_parent p ON p.ccn=h.ccn;

Query C, owners (0.8 s):

SELECT owner_name, owner_type, role_text, ownership_pct, association_date, organization_name,
       is_pe, is_reit, is_chain_home_office, is_holding, is_investment, snapshot_date
FROM cms_provider_ownership
WHERE facility_type='hospital' AND lpad(ccn,6,'0')='050030'
ORDER BY owner_type DESC, owner_name;

Query D, cost-report series (0.9 s):

SELECT fy_end_year, fy_begin, fy_end, total_beds, total_discharges, total_inpatient_days,
       medicare_inpatient_days, medicaid_inpatient_days, total_revenues, total_costs, net_income,
       round(100*net_income/nullif(total_revenues,0),1) margin_pct,
       total_charges, medicare_charges, medicaid_charges,
       round(100*medicare_inpatient_days/nullif(total_inpatient_days,0),1) medicare_day_share_pct,
       round(100*medicaid_inpatient_days/nullif(total_inpatient_days,0),1) medicaid_day_share_pct,
       bad_debt, charity_care_charges, uncompensated_care, total_assets, total_liabilities, fund_balance,
       total_salaries, total_fte, ownership_change_flag
FROM hcris_hospital_reports WHERE ccn='050030' AND fy_end_year BETWEEN 2019 AND 2025 ORDER BY fy_end;

Query E, HCAI last eight quarters (1.0 s):

SELECT fiscal_year, quarter_end_date, licensed_beds, staffed_beds, gross_patient_revenue, deductions_from_revenue,
       net_patient_revenue, other_operating_revenue, total_operating_revenue, total_operating_expenses, operating_income,
       round(100*operating_income/nullif(total_operating_revenue,0),1) op_margin_pct,
       nonoperating_revenue, net_income, bad_debt, charity_care, total_assets, total_liabilities, total_equity,
       patient_days, discharges, outpatient_visits, emergency_visits, medicare_patient_days, medicaid_patient_days,
       medicare_discharges, medicaid_discharges, medicare_net_revenue, medicaid_net_revenue
FROM state_hospital_quarterly_financials
WHERE ccn='050030' AND report_type='quarter' ORDER BY quarter_end_date DESC LIMIT 8;

Query F, Worksheet A-7 (0.9 s):

SELECT fy_end_year, land_purchases, land_improvement_purchases, building_purchases, building_improvement_purchases,
       fixed_equipment_purchases, movable_equipment_purchases, hit_asset_purchases, total_purchases,
       total_beginning_balance, total_ending_balance,
       round(100*total_purchases/nullif(total_beginning_balance,0),2) purchases_to_beginning_assets_pct
FROM hcris_a7_capex WHERE ccn='050030' AND fy_end_year BETWEEN 2019 AND 2025 ORDER BY 1;

Query G, readmission measures (0.8 s):

SELECT measure_id, score, score_text, denominator, end_date
FROM cms_care_compare_measures
WHERE ccn='050030' AND (measure_id ILIKE '%READM%' OR measure_id ILIKE '%HRRP%' OR measure_id ILIKE '%HWR%')
ORDER BY measure_id;

Query H, sanctions screen (5.7 s):

WITH owners AS (
  SELECT DISTINCT upper(trim(owner_name)) nm FROM cms_provider_ownership
  WHERE facility_type='hospital' AND lpad(ccn,6,'0')='050030'
  UNION SELECT 'OROVILLE HOSPITAL'),
npis AS (SELECT DISTINCT npi FROM hcris_hospital_reports WHERE ccn='050030' AND npi IS NOT NULL)
SELECT 'oig_leie' src, 'npi' method, count(*) hits FROM oig_leie_exclusions e JOIN npis n ON n.npi=e.npi
UNION ALL SELECT 'oig_leie','name',count(*) FROM oig_leie_exclusions e JOIN owners o
  ON upper(trim(coalesce(e.business_name, e.first_name||' '||e.last_name)))=o.nm
  OR upper(trim(e.first_name||' '||e.last_name))=o.nm
UNION ALL SELECT 'sam','npi',count(*) FROM gsa_sam_exclusions e JOIN npis n ON n.npi=e.npi
UNION ALL SELECT 'sam','name',count(*) FROM gsa_sam_exclusions e JOIN owners o ON upper(trim(e.name))=o.nm
UNION ALL SELECT 'state_medicaid','npi',count(*) FROM state_medicaid_exclusions e JOIN npis n ON n.npi=e.npi
UNION ALL SELECT 'state_medicaid','name',count(*) FROM state_medicaid_exclusions e JOIN owners o ON upper(trim(e.provider_name))=o.nm
UNION ALL SELECT 'state_board','npi',count(*) FROM state_board_sanctions e JOIN npis n ON n.npi=e.npi
UNION ALL SELECT 'state_board','name',count(*) FROM state_board_sanctions e JOIN owners o ON upper(trim(e.person_name))=o.nm
UNION ALL SELECT 'owners_screened','n',count(*) FROM owners
UNION ALL SELECT 'npis_screened','n',count(*) FROM npis;

California coverage of the state Medicaid list (1.1 s): SELECT count(*), max(ingested_at)::date FROM state_medicaid_exclusions WHERE state='CA';

Query I, county market (0.7 s):

WITH b AS (SELECT DISTINCT ccn, facility_name, city, hospital_type hcai_type, control_type hcai_control
           FROM state_hospital_quarterly_financials
           WHERE county='Butte' AND report_type='quarter' AND quarter_end_date >= '2025-01-01'),
h AS (SELECT DISTINCT ON (ccn) ccn, provider_name, fy_end_year, total_beds, total_discharges, total_revenues, net_income
      FROM hcris_hospital_reports WHERE ccn IN (SELECT ccn FROM b) AND fy_end_year <= 2024 ORDER BY ccn, fy_end DESC),
c AS (SELECT ccn, hospital_type, overall_rating FROM cms_care_compare_hospitals),
xw AS (SELECT ccn, string_agg(operator_legal_name,'; ') operator FROM provider_operator_crosswalk GROUP BY 1)
SELECT b.*, c.hospital_type, c.overall_rating, h.fy_end_year, h.total_beds, h.total_discharges, h.total_revenues,
       h.net_income, round(100*h.net_income/nullif(h.total_revenues,0),1) margin_pct, xw.operator
FROM b LEFT JOIN h USING (ccn) LEFT JOIN c USING (ccn) LEFT JOIN xw USING (ccn)
ORDER BY h.total_revenues DESC NULLS LAST;

Query J, MA enrollment by month (0.7 s):

SELECT report_month, sum(enrollment) ma_enrollment, count(*) parents,
       sum(suppressed_plan_count) suppressed_plans, sum(plan_count) plans
FROM ma_enrollment_parent_county_monthly
WHERE fips_state_county='06007' AND program='MA' GROUP BY 1 ORDER BY 1;

Query K, MA parents, latest month (0.8 s):

SELECT r.parent_organization, t.ticker, r.enrollment, r.plan_count, r.suppressed_plan_count,
       round(100.0*r.enrollment/sum(r.enrollment) OVER (),1) share_pct
FROM ma_enrollment_parent_county_monthly r
LEFT JOIN cms_ma_parent_tickers t ON t.parent_organization=r.parent_organization
WHERE r.fips_state_county='06007' AND r.program='MA'
  AND r.report_month=(SELECT max(report_month) FROM ma_enrollment_parent_county_monthly)
ORDER BY r.enrollment DESC NULLS LAST LIMIT 8;

Raw-file check behind the suppression statement (3.2 s): SELECT report_month, count(*) cells, count(*) FILTER (WHERE suppressed) suppressed_cells, sum(enrollment) FROM cms_ma_enrollment_county WHERE fips_state_county='06007' GROUP BY 1 ORDER BY 1 DESC LIMIT 3;