Skip to contents

Calculating Medicare Fee Schedule Rates

The Medicare Physician Fee Schedule (MPFS) uses a resource-based relative value system (RBRVS) that assigns a relative value to HCPCS codes with input from representatives of health care professional associations and societies. The relative weighting factor (relative value unit or RVU) is derived from a resource-based relative value scale.

The components of the RBRVS for each procedure are the (a) professional component (i.e., work as expressed in the amount of time, technical skill, physical effort, stress, and judgment for the procedure required of physicians and certain other practitioners); (b) technical component (i.e., the practice expense expressed in overhead costs such as assistant’s time, equipment, supplies); and (c) professional liability component.

CMS determines the final relative value unit (RVU) for each code, which is then multiplied by the annual conversion factor (a dollar amount) to yield the national average fee. Rates are adjusted according to geographic indices based on provider locality. Payers other than Medicare that adopt these relative values may apply a higher or lower conversion factor.

dplyr::tibble(
  Component = c("Work", "Practice Expense", "Malpractice"),
  Weight = c(0.51, 0.45, 0.04),
  Description = c("Time, effort, skill, and stress associated with the physician’s performance of a service.", "Overhead costs of maintaining a practice, including staff, equipment, and supplies.", "Cost of malpractice insurance based on the risk associated with the service provided.")
) |> 
  gt::gt(groupname_col = "Component") |> 
  gt::fmt_percent(columns = 2, decimals = 0) |>
  gt_theme_northstar()
Work 51% Time, effort, skill, and stress associated with the physician’s performance of a service.
Practice Expense 45% Overhead costs of maintaining a practice, including staff, equipment, and supplies.
Malpractice 4% Cost of malpractice insurance based on the risk associated with the service provided.

How Medicare Part B Fees are Calculated by Providers

There are many factors providers must take into account when calculating the final payment they will receive for Medicare Part B services:

  • Standard 20% Co-Pay
  • Nonparticipating Status & Limiting Charge
  • Facility & Non-Facility Rates
  • Geographic Adjustments
  • Multiple Procedure Payment Reductions (MPPR)

Standard 20% Co-Pay

All Part B services require the patient to pay a 20% co-payment. The MPFS does not deduct the co-payment amount. Therefore, the actual payment by Medicare is 20% less than shown in the fee schedule. A provider must make “reasonable” efforts to collect the 20% co-payment from the beneficiary.

Nonparticipating Status & Limiting Charge

There are two categories of provider participation within Medicare:

  • Participating: Accept assignment and accept the Medicare fee schedule rate.
  • Nonparticipating: May choose to not accept assignment and may bill a slightly higher rate known as the limiting charge.

Both categories require that providers enroll in the Medicare program and are required to file the claim to Medicare.

Participating

A participating provider is required to bill on an assignment basis and accept the Medicare allowable fee as payment in full. Medicare will pay 80% of the allowable amount of the MPFS and the patient will pay a 20% co-insurance at the time services are rendered or ask you to bill their Medicare supplemental policy.

For example, if the Medicare allowed amount is \$100, but a provider’s rate is \$160, the provider must accept \$100 and cannot balance bill the patient for the \$60 difference. In this scenario, Medicare would pay the provider \$80, and the patient would pay the provider \$20.

Nonparticipating

A nonparticipating provider is permitted to decide on an individual claim basis whether or not to accept the Medicare fee schedule rate (accept assignment) or bill the patient via the limiting charge, a slightly higher rate than the Medicare fee schedule.

As with participating providers, nonparticipating providers cannot balance bill the Medicare beneficiary for the difference between the provider’s fee schedule and the limiting charge.

In addition, civil monetary penalties can be applied to providers charging in excess of the limiting charge, as outlined in the Medicare Claims Processing and Program Integrity Manuals.

The allowable fee for a nonparticipating provider is reduced by 5% in comparison to a participating provider; in other words, the allowable fee for nonparticipating providers is 95% of the Medicare fee schedule allowed amount,
    whether or not

they choose to accept assignment.

However, the provider is allowed to bill the patient the limiting charge. The limiting charge is 115% of 95% of the fee schedule allowed amount.

For example, if the Medicare allowed amount is \$100, a nonparticipating provider starts at \$95 (95% of the Medicare fee schedule rate) and then adds the limiting charge (115% of the nonparticipating provider rate).

In this case, the most that can be charged to the patient is \$109.25.

The provider will submit an unassigned claim to Medicare; Medicare will pay 80% of the approved Medicare amount (\$95) and the patient is responsible for 20% of the \$95 plus the difference between the \$95 and the limiting charge.

However, the provider is responsible for collecting the full amount (the limiting charge) from the patient and Medicare will send reimbursement directly to the patient for the 80%.

For example, the Medicare allowed amount for HCPCS code 92626 is \$85.88

desc <- search_descriptions(
  hcpcs_code = "92626", 
  hcpcs_desc_type = "Consumer")

rvus <- search_rvus(hcpcs_code = "92626")

rvus |> 
  dplyr::reframe(
    hcpcs_code,
    participating_fee = sum(rvu_work, rvu_non_pe, rvu_mp) * cf,
    medicare_responsibility = participating_fee * 0.80,
    patient_responsibility = participating_fee * 0.20
  )
#> # A tibble: 1 × 4
#>   hcpcs_code participating_fee medicare_responsibility patient_responsibility
#>   <chr>                  <dbl>                   <dbl>                  <dbl>
#> 1 92626                   85.9                    68.7                   17.2

In this example, Medicare will reimburse the patient 80% of the Medicare approved amount for nonparticipating providers (\$81.59 x 0.80 = \$65.27).

The patient is fully responsible for the difference between the approved rate and the limiting charge (\$93.83 - \$65.27 = \$28.56).

rvus |> 
  dplyr::reframe(
    hcpcs_code,
    non_participating_fee = (sum(rvu_work, rvu_non_pe, rvu_mp) * cf) * 0.95,
    limiting_charge = non_participating_fee * 1.15,
    approved_rate = non_participating_fee * 0.80,
    patient_responsibility = limiting_charge - approved_rate
  )
#> # A tibble: 1 × 5
#>   hcpcs_code non_participating_fee limiting_charge approved_rate
#>   <chr>                      <dbl>           <dbl>         <dbl>
#> 1 92626                       81.6            93.8          65.3
#> # ℹ 1 more variable: patient_responsibility <dbl>

Facility & Non-Facility Rates

The MPFS includes both facility and non-facility rates. In general, if services are rendered in one’s own office, the Medicare fee is higher (i.e., the non-facility rate) because the practitioner is paying for overhead and equipment costs. Providers receive lower rates when services are rendered in a facility because the facility incurs overhead/equipment costs.

Physician Fee Schedule Amount Calculation

Physician Fee Schedule Variables
Variables Descriptions
\(RVU_w\) Relative Value Unit (Physician Work)
\(GPCI_w\) Geographic Practice Cost Index (Physician Work)
\(RVU_p\) Relative Value Unit (Practice Expense)
\(GPCI_p\) Geographic Practice Cost Index (Practice Expense)
\(RVU_m\) Relative Value Unit (Malpractice)
\(GPCI_m\) Geographic Practice Cost Index (Malpractice)
\(CF\) Conversion Factor


Physician Fee Schedule Formulas
Formula Result
\(RVU_w(GPCI_w) + RVU_p(GPCI_p) + RVU_m(GPCI_m)\) Total RVUs
\(\text{Total RVUs} \times CF\) Participating Fee
\(\text{Participating Fee} \times 0.95\) Non-Participating Fee
\(\text{Participating Fee} \times 1.0925\) Limiting Charge


As there is a corresponding GPCI value for each of the three components of an RVU, the formula is essentially the dot product of the RVU and GPCI vectors, multiplied by the Conversion Factor:


RVUGPCI=RVUw(GPCIw)+RVUp(GPCIp)+RVUm(GPCIm) RVU \cdot GPCI = RVU_w(GPCI_w) + RVU_p(GPCI_p) + RVU_m(GPCI_m)


wrvu  = 6.26   # Work RVU
wgpci = 1      # Work GPCI

pgpci = 0.883  # Practice GPCI
prvu  = 4.36   # Practice RVU

mrvu  = 0.99   # Malpractice RVU
mgpci = 1.125  # Malpractice GPCI

cf    = 32.744 # Conversion Factor

rvus <- (wrvu * wgpci) + (prvu * pgpci) + (mrvu * mgpci)
rvus # Total RVUs
#> [1] 11.22363
rvus * cf # Participating Fee
#> [1] 367.5065


Using base r’s matrix multiplication infix operator

as.vector(c(wrvu, prvu, mrvu) %*% c(wgpci, pgpci, mgpci))
#> [1] 11.22363


Using the dot() function from the {pracma} package

pracma::dot(
  c(wrvu, prvu, mrvu), 
  c(wgpci, pgpci, mgpci))
#> [1] 11.22363


calculate_amounts(
  wrvu  = 6.26,
  nprvu = 7.92,
  fprvu = 4.36,
  mrvu  = 0.99,
  cf    = 32.744,
  wgpci = 1,
  pgpci = 0.883,
  mgpci = 1.125) |> 
  tt() |> 
  format_tt(markdown = TRUE) |> 
  style_tt(bootstrap_class = "table table-hover")
component value
facility_prvu 4.36000
facility_rvu 11.22363
facility_par 367.50654
facility_nonpar 349.13121
facility_limit 401.50090
nonfacility_prvu 7.92000
nonfacility_rvu 14.36711
nonfacility_par 470.43665
nonfacility_nonpar 446.91482
nonfacility_limit 513.95204