# MA plan payment — Part C (contract x plan x year)

`medicare_silver.ma_plan_payment_part_c` · Medicare Advantage, Part D, Medicaid · status live · 40,014 rows

CMS Part C plan-payment summary: per MA contract+plan+year, the average risk-adjusted A/B payment per member per month (avg_ab_pmpm_payment), the average enrollee risk score (avg_part_c_risk_score), and the average rebate PMPM (avg_rebate_pmpm_payment). The revenue side of MA economics.

**Grain.** One row per Medicare Advantage contract x plan x payment year. Verified: contract_id x plan_id x payment_year = 40,014 distinct = 40,014 total rows. (Within any single payment_year, contract_id+plan_id alone is unique — 2,742 rows in 2015 rising to 5,539 in 2024.)

**How to use it.** Benchmark what Medicare pays a given MA plan and how rich its rebate-funded extra benefits are, risk-adjusted. Example: SELECT payment_year, avg_ab_pmpm_payment, avg_part_c_risk_score, avg_rebate_pmpm_payment FROM medicare_silver.ma_plan_payment_part_c WHERE contract_id='H0028' AND plan_id='007' ORDER BY payment_year; -> the year-by-year per-member-per-month CMS payment, population risk score, and rebate for that specific plan. Aggregate by contract_id (not contract_name) for an insurer view, or by payment_year + plan_type for market trends; weight carefully since values are plan-level averages, not enrollment-weighted totals.

**Traps.**
- GRAIN IS contract_id x plan_id x payment_year (40,014 = total). The profiler's 5-column key (adding contract_name + plan_type + bronze_publication_id) is a redundant SUPERSET: within any single year (contract_id, plan_id) is already unique, and bronze_publication_id is 1:1 with payment_year. Do NOT key on or GROUP BY contract_name/plan_type to dedup — they are attributes.
- contract_name is NOT stable across years: the same contract_id can carry up to 4 different names over 2015-2024 (organizations rebrand/merge). Join and aggregate on contract_id, not on the name; treating (contract_id, contract_name) as a fixed pair will double-count.
- avg_rebate_pmpm_payment = 0.0 is a MEANINGFUL zero (plan receives no rebate), present in 3,844 rows — NOT a null and NOT missing data. All MSA plans are $0 by design, and EGWP plans (plan_id >= '800', 3,509 rows) average near-zero rebate (~$11.6 vs ~$132 for individual-market plans). Filtering out zeros will bias rebate stats upward and drop legitimate plans.
- No is_current / no snapshot dedup needed: there is exactly ONE publication per payment_year (10 bronze_publication_ids, 10 source_urls, 10 sha256 hashes), all asserted_at on 2026-05-18. asserted_at is the pipeline LOAD time, not a content date — never use it as the time axis; use payment_year.
- Unbalanced panel + plan-ID semantics: only 1,004 of ~9,783 plans appear in all 10 years (2,100 appear in just one) — plans enter/exit, so cross-year trends need care. Also numeric precision differs by vintage: 2015-2023 payment/rebate values are rounded to 2 decimals, but 2024 carries full-precision decimals (a source/parser artifact) — round before exact-equality comparisons across years.
- Scope: this is PLAN-level (PBP), aggregate, average-PMPM data — it is the only contract-x-plan-x-year payment table; it is NOT beneficiary-level, NOT monthly, and contains no benchmark/bid or county-rate columns. The three measures (avg AB PMPM payment, avg Part C risk score, avg rebate PMPM) are the entire payment fact set.

| column | type | meaning |
|---|---|---|
| payment_year | int | CMS Medicare Advantage payment year (calendar year), int 2015-2024. The temporal dimension and part of the grain key. Maps 1:1 to bronze_publication_id and source_url (one CMS annual ZIP per year). NOT a snapshot/load date — it is the substantive year the payment data describes. |
| contract_id | string | CMS MA contract identifier, 5-char string. Always 'H'+4 digits (39,232 rows, all plan types) or 'R'+4 digits (782 rows, exclusively Regional PPO). 1,047 distinct contracts. Part of the grain key. Join key to other MA contract-level tables (e.g. Star Ratings, enrollment). |
| plan_id | string | CMS Plan Benefit Package (PBP) ID within a contract, zero-padded 3-char string (always length 3, e.g. '007', '438', '815'). 518 distinct values. Part of the grain key. plan_id >= '800' (3,509 rows) are employer/union group plans (EGWP) — they have near-zero rebates (avg $11.6 PMPM vs $132 for individual-market plans). The full plan = contract_id + plan_id (a.k.a. H#####-### / CCN-style ID). |
| contract_name | string | Legal/marketing name of the contracting organization (e.g. 'AETNA LIFE INSURANCE COMPANY', 'KAISER FOUNDATION HP OF CO'). 890 distinct. ATTRIBUTE of contract_id, NOT part of the minimal key. WARNING: it is NOT stable — the same contract_id can carry up to 4 different names across years (e.g. H5928 rebrands), so do not treat (contract_id, contract_name) as a fixed pair; key on contract_id. |
| plan_type | string | MA plan-type category. 6 observed values: HMO (27,183), Local PPO (11,576), Regional PPO (782, always R-prefix contracts), PFFS (416), MSA (54), 'Medicare-Medicaid Plan HMOPOS' (3). Attribute of the plan, not part of the minimal key. MSA plans structurally always have $0 rebate. |
| avg_ab_pmpm_payment | double | Average Part A & B benefit payment per member per month (USD), the core risk-adjusted CMS payment to the plan for covering standard Medicare benefits. double, 0% null, never zero. Range 238.6 to 1,360.02, mean ~813. Rises over time (2015 avg $694 -> 2024 avg $880). This is the headline MA Part C cost-to-Medicare figure in this table. |
| avg_part_c_risk_score | double | Average Part C (CMS-HCC) risk score for the plan's enrollees. double, 0% null, never zero. Range 0.398 to 4.11, mean ~1.135 (1.0 = average-risk beneficiary). Drives the AB payment: higher = sicker/costlier population. Highest scores (>3.7) concentrate in 2024 and special-needs-type plans. |
| avg_rebate_pmpm_payment | double | Average MA rebate payment per member per month (USD) — the portion of the plan's bid-below-benchmark savings CMS returns to fund extra benefits/reduced premiums. double, 0% null. Range 0 to 958.0, mean ~122. 3,844 rows are exactly 0.0 — a MEANINGFUL zero (no rebate), not a null: all 54 MSA rows are $0 by design, PFFS/Regional PPO over-represented, and EGWP (plan_id>=800) plans average near-zero. |
| source_url | string | CMS download URL for the originating annual 'plan payment data' ZIP. 10 distinct (one per payment_year). Provenance only; URL pattern changes year to year (e.g. .../downloads/2015-payment-data.zip vs /files/zip/2024-plan-payment-zip-file.zip). |
| sha256_content_hash | string | SHA-256 of the ingested source file content. 10 distinct (one per year). Provenance/immutability fingerprint of the raw CMS file; identical for all rows from the same year. |
| bronze_publication_id | string | Internal bronze-layer publication identifier, format 'ma_plan_payment_<year>_<hash8>' (e.g. ma_plan_payment_2024_53379284). 10 distinct, maps 1:1 to payment_year. This is the snapshot/ingestion unit — because there is exactly one publication per year, there is no is_current flag and no multi-snapshot dedup to worry about. |
| asserted_at | timestamp | Timestamp the row was asserted into silver. 10 distinct values, ALL on 2026-05-18 (within ~2 minutes of each other, one per year-file loaded sequentially). This is pipeline load time, NOT a data-content date — do not use it for time-series analysis; use payment_year. |
| parser_artifact_hash | string | Hash of the parser code/artifact that produced these rows. Exactly 1 distinct value across the entire table — all 40,014 rows parsed by the same parser version. Lineage/reproducibility field. |

Query it: `query_substrate` with `SELECT ... FROM medicare_silver.ma_plan_payment_part_c WHERE ... LIMIT 100`; read `describe_data_source("medicare_silver.ma_plan_payment_part_c")` first.
