Hospital Capital Purchases Panel (Worksheet A-7)

Description

The full capital-purchase schedule every Medicare-certified US hospital files with CMS, as a panel: one row per hospital fiscal year, fiscal years 2019 to present, for every hospital on file — not only the ones that tripped the Hospital Capex Signals threshold. That product is the filtered slice of this one.

Worksheet A-7 Part I of the cost report (form CMS-2552-10) is the hospital's own reconciliation of its capital asset balances. It states, in dollars, what the hospital purchased during the fiscal year, split by asset class: land, land improvements, buildings and fixtures, building improvements, fixed equipment, major movable equipment, and health-IT designated assets, plus the total capital asset balance at the start and end of the year. Major movable equipment is the relocatable capital equipment line — imaging, surgical, laboratory and similar.

Each row also carries the same hospital's prior fiscal year movable-equipment and total purchases, the year-over-year multiple, purchases as a share of the opening asset base, and a boolean that recomputes the Capex Signals rule (movable equipment ≥ $1M and either ≥ 2× a positive prior year, or a first purchase after a year with other capital purchases but no movable line) so a buyer can see per row whether that signal fired — or apply a different rule.

Hospital identity (name, address, NPI, control type, hospital type, beds, total revenues, net income, total assets) comes from the same fiscal year's cost report header and summary worksheets, so capex can be sized against the hospital's operating scale without a second join.

  • Source: CMS HCRIS HOSP10 (form 2552-10) Worksheet A-7 Part I, numeric files from downloads.cms.gov; hospital identity and financial summary from the filed cost report (the same rows as HCRIS Hospital Financials).
  • Refresh cadence: quarterly, on the HCRIS release cycle.
  • Row count: 36,080 hospital fiscal years across 6,304 hospitals (2026-09-11 export). By fiscal year 2019–2025: 3,406 · 5,850 · 5,840 · 5,843 · 5,871 · 5,877 · 3,393. FY2019 is partial because the loaded A-7 history starts there; FY2025 is partial because cost reports are still arriving (about 58% of hospitals filed at export time). The operator calendar table has 93 rows (14 tickers × calendar years 2019–2025).
  • Vintage: derived at export from the latest Worksheet A-7 line ingest (2026-07-22 at authoring).
  • Three files: the panel keyed on CCN; the same panel with one operator-crosswalk row per CCN (parent operator, ticker); and the ticker roll-up calendarized to calendar years, which is the table to reconcile against a public operator's reported capex.

Reconciling to reported capex

Read this before comparing any roll-up with a 10-K.

A-7 purchases are assets placed in service, not cash capital expenditure. The schedule reconciles the capital asset balance, so a project enters it when it is capitalised into a depreciable asset, which for a building programme is one or two years after the cash was spent. Hospital fiscal years end in every month (39 of HCA's 158 filing hospitals end in December), so a sum by fy_end_year blends two of the company's calendar years. An acquisition books the purchase-accounting step-up of the whole asset base as a purchase: Mission Hospital (CCN 340002, HCA, closed 2019-02-01) filed $445m of purchases in FY2020 against a $697m opening balance, none of it new capital spending.

So, to reconcile: use hospital_capex_a7_operator_calendar, not a fy_end_year roll-up; compare the two-year rolling sums, which absorb most of the placed-in-service lag; and use the _ex_flagged columns, which drop rows where acquisition_revaluation_flag or implausible_purchases_flag is true. For HCA the calendarized total purchases are ($m): 2019 2,885 · 2020 3,397 · 2021 3,182 · 2022 3,432 · 2023 3,852 · 2024 4,455, on 122 / 154 / 156 / 156 / 157 / 157 hospital-years of coverage; the 2019 figure is low because the loaded history starts in FY2019, and 2025 is partial until the remaining cost reports post. Against HCA's reported capex of 4,158 · 2,835 · 3,577 · 4,395 · 4,744 · 4,875 the calendarized series runs at 78–120% year by year for 2020–2024 (the 2020 figure carries the Mission Hospital step-up); excluding flagged rows it is 3,007 · 3,129 · 3,419 · 3,806 · 4,363, or 78–106%, and moves in the same direction as the 10-K in all four comparable year pairs. The two-year rolling ex-flagged sums run at 96%, 82%, 79% and 85% of the two-year 10-K sums for 2021–2024; the full reconciliation working is available on request. The residual is non-hospital capex (surgery centres, physician practices, corporate IT), which never files a hospital cost report.

Table: hospital_capex_a7_panel

Snowflake: HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_PANEL

Column Type Description Notes
ccn VARCHAR CMS Certification Number of the hospital. Key. Joins to HCRIS Hospital Financials, Facility Quality, Capex Signals and the Operator Crosswalk.
npi VARCHAR Hospital NPI as filed on the cost report. Null where the hospital did not report one.
hospital_name VARCHAR Provider name from the filed cost report. —
address / city / state VARCHAR Hospital location from the cost report, as filed. —
zip VARCHAR Verified 5-digit US ZIP, or NULL — same header as HCRIS Hospital Financials, same rule: 5-digit only (the +4 is dropped), checked against the Census 2020 ZCTA universe and against this row's state. 31,619 of 36,080 rows populated; 100% of those are a real ZIP consistent with state. 4,461 NULL: 4,371 CCN-in-ZIP or blank at source, 90 that failed the ZIP↔state check on 2026-09-11. NULL means "not verified", never "no ZIP". See the zip section of the dictionaries README.
control_type VARCHAR CMS type-of-control code (voluntary non-profit, proprietary, governmental, …). As filed; codes per CMS-2552-10 Worksheet S-2.
hospital_type VARCHAR CMS hospital type code (general short-term, critical access, psychiatric, …). As filed.
total_beds INTEGER Beds reported on the same fiscal year's cost report. —
total_revenues / net_income / total_assets DOUBLE Financial summary from the same fiscal year's cost report. Lets capex be sized against operating scale without a second join.
fy_end_year INTEGER The fiscal year (year the reporting FY ends). Key with ccn.
fy_begin / fy_end DATE Fiscal period covered by the report. Hospital fiscal years end in different months (Dec, Jun, Sep are common); use fy_end to place a row in calendar time.
land_purchases DOUBLE A-7 Part I line 1, purchases column: land bought in the FY, dollars. Any A-7 amount can be null (line not filed) or, rarely, negative (a filed reclassification). Take coalesce(x, 0) before aggregating.
land_improvement_purchases DOUBLE Line 2: land improvements. —
building_purchases DOUBLE Line 3: buildings and fixtures. —
building_improvement_purchases DOUBLE Line 4: building improvements. —
fixed_equipment_purchases DOUBLE Line 5: fixed (built-in) equipment. —
movable_equipment_purchases DOUBLE Line 6: major movable equipment — imaging, surgical, lab and other relocatable capital equipment. About 15% of hospital-years leave this line blank or zero. Median filed value is about $1.2M.
hit_asset_purchases DOUBLE Line 7: health-IT designated assets. Sparsely filed; null-heavy.
total_purchases DOUBLE Line 8 (subtotal of lines 1–7): all capital purchases in the FY. —
total_beginning_balance DOUBLE Line 8, beginning-balance column: total capital assets at FY start. —
total_ending_balance DOUBLE Line 8, ending-balance column. —
prior_year_movable_equipment_purchases DOUBLE Line 6 purchases from the same hospital's prior-FY report. Null when FY−1 is not on file.
prior_year_total_purchases DOUBLE Line 8 purchases from the prior FY. —
movable_equipment_yoy_multiple DOUBLE movable_equipment_purchases / prior_year_movable_equipment_purchases, rounded to 2 places. Null when the prior-year figure is missing or ≤ 0.
purchases_to_beginning_assets DOUBLE total_purchases / total_beginning_balance, rounded to 4 places. Capital spending intensity against the asset base. Null when the opening balance is missing or ≤ 0.
purchases_to_balance_change DOUBLE Reported total_purchases divided by the absolute change in the capital asset balance over the year. A screen, not a flag. Purchases add to the balance and disposals subtract it, so a value near 1 means the two corroborate each other. A large value means the hospital reported buying far more than its asset base grew. That is either heavy disposal in the same year or a balance filed as a purchase, and the filing does not say which. 120 hospital fiscal years have a ratio above 10 and more than $50m of total_purchases; a few of those are large enough to move an operator's yearly total by several percent. The ratio alone, with no dollar floor, is above 10 on 817 hospital fiscal years, most of them too small to matter. Screen on it if reconciling to a cash-flow statement. Null when the balance did not move.
prior_year_basis VARCHAR What the prior fiscal year filed on the movable-equipment line: positive, negative (a reclassification or disposal netted into purchases), no_movable_filed (other capital purchases filed, no movable line — CMS files never contain a zero, so absent means zero or unfiled), schedule_blank (no A-7 filed that year), no_prior_year. Read the YoY multiple only where this is positive.
movable_equipment_jump_1m_2x BOOLEAN The Hospital Capex Signals rule recomputed per row: purchases ≥ $1,000,000 and either ≥ 2× a positive prior year or following a no_movable_filed year (a first equipment purchase). 4,277 true, matching the signals product row for row.
acquisition_revaluation_flag BOOLEAN True when the year's purchases look like an acquisition step-up rather than capital spending: total_purchases > 35% of total_beginning_balance and either a CMS change of ownership for the CCN took effect in the 24 months to fy_end (CMS hospital CHOW file, buyer or seller CCN) or the opening balance is more than 10% away from the prior fiscal year's closing balance (a balance discontinuity). 272 true at the 2026-09-11 export (7 on HCA hospitals). Never null. Exclude these rows before comparing a roll-up with reported capex; the calendar table does this for you in its _ex_flagged columns.
implausible_purchases_flag BOOLEAN True when the filed purchases cannot be real capital spending and acquisition_revaluation_flag does not catch it. Two branches: total_purchases > 10 × total_beginning_balance and > $1bn; or total_beginning_balance ≤ $1, which makes purchases_to_beginning_assets meaningless at any numerator. 361 true at the 2026-09-11 export, 7 of them also acquisition_revaluation_flag. Never null. The ratio branch catches exactly one row and it is the important one: CCN 450056 (Ascension Seton Medical Center, Austin TX, 391 beds) FY2021 filed $78.93bn of total purchases — $78.91bn of it on the fixed-equipment line — against a $458m opening balance, a ratio of 172× and roughly 18× HCA's entire calendar-year capital purchases. No CHOW and no balance discontinuity sit behind it, so the acquisition flag stays false. The balance branch catches 360 rows with a $1-or-less opening balance (e.g. CCN 670135 FY2023) and removes almost no dollars — it exists to stop the intensity ratio exploding.
acquisition_revaluation_reason VARCHAR Which branch fired: chow_24m, balance_discontinuity, or chow_24m+balance_discontinuity. Null when the flag is false. CCN 340002 FY2020 is chow_24m (its balances are continuous, 697m → 697m; the CHOW of 2019-02-01 is the evidence).
_dataset / _vintage / _exported_at VARCHAR See README. —

Table: hospital_capex_a7_by_operator

Snowflake: HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_BY_OPERATOR

Every column of hospital_capex_a7_panel (including implausible_purchases_flag, acquisition_revaluation_flag and acquisition_revaluation_reason), plus one row from the Provider-to-Operator Crosswalk per CCN. Where a CCN has more than one crosswalk row (106 do), the ticker-bearing row is kept, then the largest ownership share. The join therefore never fans out: this table has exactly the same row count as the panel.

Crosswalk CCNs are normalised to 6 zero-padded characters before the join (see that dictionary's Known limits), which raised the matched share from 28.56% to 30.51% of panel rows — 10,304 to 11,008 — at the 2026-09-11 export.

Column Type Description Notes
operator_key VARCHAR Stable key of the parent operator. Null for hospitals the crosswalk does not map (most independents).
operator_legal_name VARCHAR Parent operator's legal name. —
entity_class VARCHAR Operator class (public company, non-profit system, private equity, government, …). —
ticker / exchange VARCHAR Stock ticker and exchange where the parent is listed. 4,727 hospital-years across 14 tickers at export. Public operators are a minority of US hospitals.
match_method VARCHAR How the CCN was linked to the operator: cms_ownership_name rests on a CMS-published ownership filing; hcris_provider_name rests on the facility's brand name and is our inference. Filter on it if you only want the CMS-evidenced link.
match_confidence VARCHAR Crosswalk confidence band. —
ownership_pct DOUBLE Ownership share reported to CMS for the kept owner row. Null for name-based matches.

Table: hospital_capex_a7_operator_calendar

Snowflake: HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_OPERATOR_CALENDAR

One row per ticker and calendar year, 2019–2025, for every hospital in hospital_capex_a7_by_operator whose parent is listed (14 tickers, 93 rows). Each hospital fiscal year's purchases are allocated to calendar years by day fraction: a fiscal year running 1 October 2023 to 30 September 2024 puts 92/366 of its purchases in 2023 and 274/366 in 2024. The crosswalk rule is the same as the by-operator table (one row per CCN, ticker-bearing row first), so a hospital counts once. Rows are ordered by ticker and year.

Column Type Description Notes
ticker VARCHAR Stock ticker of the parent operator. Key with calendar_year.
parent_operator VARCHAR Legal name of the ticker's parent operator from the crosswalk. Where a ticker maps to more than one crosswalk operator (UNH does), the one with more hospitals.
calendar_year INTEGER Calendar year, 1 January to 31 December. 2019 is low because the loaded A-7 history starts in FY2019; the latest year is partial until cost reports post.
hospitals INTEGER Hospitals with at least one day of a fiscal year inside the calendar year. —
hospital_years_covered DOUBLE Sum of the day fractions, 2 places: how many full hospital-years of filings the calendar year is built from. Compare with hospitals: 156.42 on 157 hospitals means the year is essentially complete; 49.23 on 110 means most of the year is still unfiled.
land_purchases … hit_asset_purchases DOUBLE The seven A-7 purchase lines, calendarized (each fiscal-year amount × its day fraction, summed), whole dollars. Nulls on the source line are treated as zero.
total_purchases DOUBLE Line 8 total purchases, calendarized. —
movable_equipment_purchases_ex_flagged DOUBLE Movable equipment, calendarized, excluding hospital fiscal years where acquisition_revaluation_flag or implausible_purchases_flag is true. —
total_purchases_ex_flagged DOUBLE Total purchases, calendarized, excluding flagged hospital fiscal years (both flags). The series to reconcile against a 10-K.
total_purchases_2y_rolling DOUBLE total_purchases for this calendar year plus the prior calendar year. Null for 2019 (no 2018 row). Absorbs most of the placed-in-service lag.
total_purchases_ex_flagged_2y_rolling DOUBLE The same two-year sum on total_purchases_ex_flagged. Null for 2019.
_dataset / _vintage / _exported_at VARCHAR See README. —

Example queries (Snowflake)

-- 1. National capital purchases by asset class and fiscal year (the
--    denominator the Capex Signals product cannot give you).
SELECT "fy_end_year",
       count(*)                                            AS hospitals,
       sum(coalesce("movable_equipment_purchases", 0))     AS movable_equipment,
       sum(coalesce("building_purchases", 0)
         + coalesce("building_improvement_purchases", 0))  AS buildings,
       sum(coalesce("total_purchases", 0))                 AS total_capex
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_PANEL
GROUP BY 1 ORDER BY 1;

-- 2. Compare a public operator with its 10-K capex line: the calendarized
--    series, acquisition years excluded, and the two-year rolling sum.
SELECT "ticker", "calendar_year", "hospitals", "hospital_years_covered",
       "total_purchases_ex_flagged", "total_purchases_ex_flagged_2y_rolling",
       "movable_equipment_purchases_ex_flagged"
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_OPERATOR_CALENDAR
WHERE "ticker" IN ('HCA', 'THC', 'UHS', 'CYH')
ORDER BY 1, 2;

-- 2b. The same roll-up by hospital fiscal year, with the acquisition years
--     visible, from the by-operator panel.
SELECT "ticker", "fy_end_year",
       count(*)                                                AS facilities,
       count(*) FILTER (WHERE "acquisition_revaluation_flag"
                          OR "implausible_purchases_flag")     AS flagged,
       sum(coalesce("total_purchases", 0))                     AS a7_total_purchases,
       sum(coalesce("total_purchases", 0))
         FILTER (WHERE NOT "acquisition_revaluation_flag"
                   AND NOT "implausible_purchases_flag")       AS a7_total_ex_flagged
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_BY_OPERATOR
WHERE "ticker" IN ('HCA', 'THC', 'UHS', 'CYH')
GROUP BY 1, 2 ORDER BY 1, 2;

-- 3. Your own signal rule: hospitals whose movable-equipment purchases
--    were at least $10M and tripled, most recent fiscal year first.
SELECT "fy_end", "hospital_name", "state", "total_beds",
       "movable_equipment_purchases", "prior_year_movable_equipment_purchases",
       "movable_equipment_yoy_multiple"
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_PANEL
WHERE "movable_equipment_purchases" >= 10000000
  AND "movable_equipment_yoy_multiple" >= 3
ORDER BY "fy_end" DESC, "movable_equipment_purchases" DESC;

-- 4. Capital intensity: purchases as a share of the opening asset base,
--    for hospitals with a meaningful balance sheet.
SELECT "hospital_name", "state", "fy_end_year",
       "total_beginning_balance", "total_purchases", "purchases_to_beginning_assets"
FROM HEALTHPARSE_DATA.HOSPITAL_CAPEX_A7.HOSPITAL_CAPEX_A7_PANEL
WHERE "total_beginning_balance" >= 100000000 AND "fy_end_year" = 2024
ORDER BY "purchases_to_beginning_assets" DESC
LIMIT 50;

Known limits

  • The schedule says what was spent by asset class, not what was bought or from whom. No vendor, product or model information exists in the cost report and none is inferred.
  • Purchases are assets placed in service, not cash spent. A multi-year building programme appears when it is capitalised, and an acquired hospital's revalued asset base appears as a purchase in the acquisition year. acquisition_revaluation_flag marks the second case; the calendar table's two-year rolling sums soften the first. See Reconciling to reported capex above.
  • Some filings are simply wrong, and CMS does not validate them. A-7 is as-filed. The extreme case is CCN 450056 FY2021, which reports $78.93bn of capital purchases against a $458m asset base — a misfiled figure roughly 18× HCA's entire annual capital purchases, on a 391-bed hospital. It carries no CHOW and no balance discontinuity, so the acquisition flag does not catch it; implausible_purchases_flag does. Any unfiltered sum(total_purchases) at panel or state level is wrong by tens of billions of dollars — filter on both flags, or use the calendar table's _ex_flagged columns, which already do. 626 of 36,080 rows carry at least one flag.
  • zip is now verified or NULL. Hospital identity on this panel comes from the cost-report header, so it inherited every ZIP defect HCRIS Hospital Financials had. Since 2026-09-11 the column is normalised to five digits (6,966 rows previously shipped a dangling 36302-; 4,038 shipped a ZIP+4) and then verified against the Census ZCTA reference and the row's state; 90 further rows were NULLed because the ZIP and the state contradicted each other or the ZIP is not real. Historically, 4,371 rows carried a zip equal to the row's own ccn from a loader bug. Those now export as NULL. Exports dated before 2026-09-11 are affected — discard zip where it equals ccn.
  • The operator join is one row per CCN, and the crosswalk has gaps. hospital_capex_a7_by_operator collapses the crosswalk to a single row per CCN (ticker-bearing first, then largest ownership share) so it cannot fan out, and CCN formatting is normalised to 6 characters before the join — which raised the matched share from 28.6% to 30.5% of panel rows at the 2026-09-11 export. The remaining ~70% are facilities the crosswalk does not yet reach, not facilities without an owner. See the Operator Crosswalk dictionary's Known limits.
  • Timeliness. Cost reports are filed after the fiscal year ends and CMS posts them on a rolling basis, typically several quarters later. The most recent fiscal year is always partial.
  • No point-in-time history of filings. Each hospital fiscal year appears once, with the latest filed figures. When a hospital amends a report the row is updated in place; the date a report first appeared in HCRIS is not recorded.
  • Non-hospital capex is out of scope. Ambulatory surgery centers, physician practices and other facilities that do not file a hospital cost report are not here, so an operator roll-up will not equal a company's consolidated capex where it owns such facilities.

Purchases that the asset balance does not corroborate

Three hospitals illustrate why purchases_to_balance_change is worth screening on. Two Tenet hospitals in Memphis (CCNs 440183 and 440228) report roughly $200m and $105m of purchases in fiscal 2023 and again in 2024, while their capital asset balances move by $9m to $12m. HCA's CJW Medical Center (CCN 490112) reports $739m in fiscal 2025 against a $60m balance move. In each case the neighbouring years look ordinary. We do not exclude these rows, because a hospital that rebuilds a campus genuinely can buy and retire in the same year, and the cost report does not distinguish the two. We expose the ratio so a buyer can apply their own rule. A ratio above 10 on its own catches 817 hospital fiscal years across the panel; adding a $50m floor on total_purchases, so that only hospital-years large enough to move an operator total are caught, narrows that to 120.