Skip to contents

Introduction

Date of Service (DOS) to Date of Reconciliation is a critical metric for Revenue Cycle Management. The time it takes to process a claim can have a significant impact on cash flow. This vignette demonstrates how to calculate the average days in accounts receivable (AR) for a medical practice.

Definitions

Date of Service: The date a patient receives medical services.

Date of Release: The date a claim is released for billing.

Date of Submission: The date a claim is submitted to the payer.

Date of Acceptance: The date a claim is accepted by the payer.

Date of Adjudication: The date a claim is adjudicated by the payer.

Date of Reconciliation: The date a claim is reconciled by the medical practice.

The Lifecycle of a Claim

  • Provider Lag: Date of Service - Date of Release
  • Billing Lag: Date of Release - Date of Submission
  • Acceptance Lag: Date of Submission - Date of Acceptance
  • Payment Lag: Date of Acceptance - Date of Adjudication
  • Days in AR: Date of Release - Date of Adjudication


# Balances, when zero, add net payment and adjustments
# Payment and adjustments should be a percentage of the balance, equal to one
(x <- mock_claims(15000))
#> # A tibble: 15,000 × 10
#>    claimid payer     charges balance date_ser…¹ date_rel…² date_sub…³ date_acc…⁴
#>    <chr>   <fct>       <dbl>   <dbl> <date>     <date>     <date>     <date>    
#>  1 00064   UnitedHe…    277.      0  2024-07-07 2024-07-09 2024-07-12 2024-07-23
#>  2 00102   Oscar         55.      0  2024-07-07 2024-07-17 2024-07-17 2024-08-05
#>  3 00134   Medicaid      61.     61. 2024-07-07 2024-07-18 2024-07-24 2024-07-31
#>  4 00242   American     200.      0  2024-07-07 2024-07-09 2024-07-10 2024-07-16
#>  5 00337   Allianz      199.      0  2024-07-07 2024-07-20 2024-07-23 2024-07-29
#>  6 00395   Molina       124.    124. 2024-07-07 2024-07-17 2024-07-21 2024-07-27
#>  7 00449   Oscar        396.      0  2024-07-07 2024-08-04 2024-08-08 2024-08-19
#>  8 00484   Molina       182.    182. 2024-07-07 2024-07-12 2024-07-18 2024-08-03
#>  9 00487   GuideWell     75.      0  2024-07-07 2024-07-11 2024-07-15 2024-07-19
#> 10 00580   Athene       237.    237. 2024-07-07 2024-07-15 2024-07-20 2024-07-25
#> # ℹ 14,990 more rows
#> # ℹ abbreviated names: ¹​date_service, ²​date_release, ³​date_submission,
#> #   ⁴​date_acceptance
#> # ℹ 2 more variables: date_adjudication <date>, date_reconciliation <date>


(x <- prep_claims(x))
#> # A tibble: 15,000 × 13
#>    claimid payer           charges balance date_ser…¹ aging_bin   dar days_rel…²
#>    <chr>   <fct>             <dbl>   <dbl> <date>     <fct>     <dbl>      <dbl>
#>  1 00001   Univ. Healthca…   467.      0   2024-05-22 0-30         24          1
#>  2 00002   BCBS WY           263.    263.  2024-06-01 0-30         26          3
#>  3 00003   Humana             30.     30.  2024-06-14 0-30         22          1
#>  4 00004   Medicare            7.5     7.5 2024-06-10 0-30         23          2
#>  5 00005   American           83.      0   2024-07-04 31-60        36          3
#>  6 00006   Mass Mutual       186.    186.  2024-06-19 0-30         28          5
#>  7 00007   HCSC              177.    177.  2024-04-14 0-30         30          7
#>  8 00008   Mass Mutual       118.    118.  2024-04-25 31-60        34          6
#>  9 00009   Wellcare           55.     55.  2024-04-26 31-60        44         13
#> 10 00010   New York Life     132.      0   2024-05-22 31-60        36          7
#> # ℹ 14,990 more rows
#> # ℹ abbreviated names: ¹​date_service, ²​days_release
#> # ℹ 5 more variables: days_submission <dbl>, days_acceptance <dbl>,
#> #   days_adjudication <dbl>, days_reconciliation <dbl>, dates <list>


summarise_claims(x) |> 
  glimpse()
#> Rows: 1
#> Columns: 9
#> $ n_claims            <int> 15000
#> $ gross_charges       <dbl> 1996234
#> $ ending_ar           <dbl> 1319105
#> $ mean_release        <dbl> 8.007933
#> $ mean_submission     <dbl> 2.992733
#> $ mean_acceptance     <dbl> 7.5078
#> $ mean_adjudication   <dbl> 15.01487
#> $ mean_reconciliation <dbl> 2.214623
#> $ mean_dar            <dbl> 34.27453
x |> 
  group_by(
    year = year(date_service),
    month = month(date_service)
    ) |>
  summarise_claims()
#> # A tibble: 4 × 11
#>    year month n_claims gross_charges ending_ar mean_rele…¹ mean_sub…² mean_acc…³
#>   <int> <int>    <int>         <dbl>     <dbl>       <dbl>      <dbl>      <dbl>
#> 1  2024     4     3194       424745.   278117.         8.0        3.0        7.5
#> 2  2024     5     5351       721214.   476128.         8.0        3.0        7.6
#> 3  2024     6     5274       694532.   463579.         7.9        2.9        7.5
#> 4  2024     7     1181       155743.   101281.         8.0        3.0        7.4
#> # ℹ abbreviated names: ¹​mean_release, ²​mean_submission, ³​mean_acceptance
#> # ℹ 3 more variables: mean_adjudication <dbl>, mean_reconciliation <dbl>,
#> #   mean_dar <dbl>


x |> 
  group_by(
    year = year(date_service),
    quarter = quarter(date_service)
    ) |>
  summarise_claims()
#> # A tibble: 2 × 11
#>    year quarter n_claims gross_char…¹ ending_ar mean_rel…² mean_sub…³ mean_acc…⁴
#>   <int>   <int>    <int>        <dbl>     <dbl>      <dbl>      <dbl>      <dbl>
#> 1  2024       2    13819     1840491.  1217824.        8.0        3.0        7.5
#> 2  2024       3     1181      155743.   101281.        8.0        3.0        7.4
#> # ℹ abbreviated names: ¹​gross_charges, ²​mean_release, ³​mean_submission,
#> #   ⁴​mean_acceptance
#> # ℹ 3 more variables: mean_adjudication <dbl>, mean_reconciliation <dbl>,
#> #   mean_dar <dbl>
x |> 
  group_by(
    year = year(date_service),
    month = month(date_service),
    aging_bin
    ) |>
  summarise_claims()
#> # A tibble: 12 × 12
#>     year month aging_bin n_claims gross_charges ending_ar mean_rele…¹ mean_sub…²
#>    <int> <int> <fct>        <int>         <dbl>     <dbl>       <dbl>      <dbl>
#>  1  2024     4 0-30          1106       145094.    97525.         4.4        2.1
#>  2  2024     4 31-60         2076       278433.   180082.         9.9        3.5
#>  3  2024     4 61-90           12         1218.      510.        20.         6.2
#>  4  2024     5 0-30          1834       245423.   164266.         4.5        2.1
#>  5  2024     5 31-60         3504       474441.   311295.         9.9        3.5
#>  6  2024     5 61-90           13         1350.      567.        18          5.1
#>  7  2024     6 0-30          1866       241399.   165359.         4.4        2.1
#>  8  2024     6 31-60         3387       450547.   296956.         9.8        3.4
#>  9  2024     6 61-90           21         2586.     1263.        19.         5.9
#> 10  2024     7 0-30           403        52596.    36031.         4.3        2.0
#> 11  2024     7 31-60          773       102179.    65251.         9.9        3.5
#> 12  2024     7 61-90            5          968.        0         19.         5  
#> # ℹ abbreviated names: ¹​mean_release, ²​mean_submission
#> # ℹ 4 more variables: mean_acceptance <dbl>, mean_adjudication <dbl>,
#> #   mean_reconciliation <dbl>, mean_dar <dbl>


x |> 
  group_by(
    year = year(date_service),
    quarter = quarter(date_service),
    payer
    ) |>
  summarise_claims()
#> # A tibble: 54 × 12
#>     year quarter payer       n_claims gross_ch…¹ ending_ar mean_rel…² mean_sub…³
#>    <int>   <int> <fct>          <int>      <dbl>     <dbl>      <dbl>      <dbl>
#>  1  2024       2 Univ. Heal…      528     73771.    48781.        8.1        3.0
#>  2  2024       2 BCBS WY          472     62095.    42728.        8.2        3.2
#>  3  2024       2 Humana           533     69274.    44326.        7.7        3.1
#>  4  2024       2 Medicare         489     67676.    43976.        7.7        2.8
#>  5  2024       2 American         512     66607.    42299.        8.2        3.0
#>  6  2024       2 Mass Mutual      528     70643.    45577.        8.0        3.1
#>  7  2024       2 HCSC             527     71427.    47349.        8.1        2.8
#>  8  2024       2 Wellcare         493     63505.    38206.        8.1        2.9
#>  9  2024       2 New York L…      512     69661.    44720.        7.6        2.8
#> 10  2024       2 Allianz          512     73092.    49016.        8.0        2.9
#> # ℹ 44 more rows
#> # ℹ abbreviated names: ¹​gross_charges, ²​mean_release, ³​mean_submission
#> # ℹ 4 more variables: mean_acceptance <dbl>, mean_adjudication <dbl>,
#> #   mean_reconciliation <dbl>, mean_dar <dbl>

Average Days in AR

Monthly Calculation

tibble(
  date = date_build(2024, 1:12),
  gct  = rpois(12, 250000:400000),
  earb = rpois(12, 290000:400000)
  ) |> 
  avg_dar(
    date, 
    gct, 
    earb, 
    dart = 35,
    by = "month")
#> # A tibble: 12 × 15
#>    date         gct  earb  ndip   adc  dart   dar dar_pass ratio_id…¹ ratio_ac…²
#>    <date>     <int> <int> <int> <dbl> <dbl> <dbl> <lgl>         <dbl>      <dbl>
#>  1 2024-01-01 2.5e5 2.9e5    31 8066.    35   36. FALSE           1.1        1.2
#>  2 2024-02-01 2.5e5 2.9e5    29 8606.    35   34. TRUE            1.2        1.2
#>  3 2024-03-01 2.5e5 2.9e5    31 8050.    35   36. FALSE           1.1        1.2
#>  4 2024-04-01 2.5e5 2.9e5    30 8349.    35   35. TRUE            1.2        1.2
#>  5 2024-05-01 2.5e5 2.9e5    31 8054.    35   36. FALSE           1.1        1.2
#>  6 2024-06-01 2.5e5 2.9e5    30 8336.    35   35. TRUE            1.2        1.2
#>  7 2024-07-01 2.5e5 2.9e5    31 8061.    35   36. FALSE           1.1        1.2
#>  8 2024-08-01 2.5e5 2.9e5    31 8051.    35   36. FALSE           1.1        1.2
#>  9 2024-09-01 2.5e5 2.9e5    30 8353.    35   35. TRUE            1.2        1.2
#> 10 2024-10-01 2.5e5 2.9e5    31 8067.    35   36. FALSE           1.1        1.2
#> 11 2024-11-01 2.5e5 2.9e5    30 8303.    35   35. FALSE           1.2        1.2
#> 12 2024-12-01 2.5e5 2.9e5    31 8052.    35   36. FALSE           1.1        1.2
#> # ℹ abbreviated names: ¹​ratio_ideal, ²​ratio_actual
#> # ℹ 5 more variables: ratio_diff <dbl>, earb_target <dbl>, earb_diff <dbl>,
#> #   gct_pct <dbl>, earb_pct <dbl>


Quarterly Calculation

tibble(
  date = date_build(2024, 1:12),
  gct  = rpois(12, 250000:400000),
  earb = rpois(12, 285500:400000)
  ) |> 
  avg_dar(
    date, 
    gct, 
    earb, 
    dart = 35,
    by = "quarter")
#> # A tibble: 4 × 15
#>   date         earb   gct  ndip   adc  dart   dar dar_pass ratio_id…¹ ratio_ac…²
#>   <date>      <int> <int> <int> <dbl> <dbl> <dbl> <lgl>         <dbl>      <dbl>
#> 1 2024-03-01 285675 7.5e5    91 8244.    35   35. TRUE           0.38       0.38
#> 2 2024-06-01 285325 7.5e5    91 8233.    35   35. TRUE           0.38       0.38
#> 3 2024-09-01 285589 7.5e5    92 8167.    35   35. TRUE           0.38       0.38
#> 4 2024-12-01 285249 7.5e5    92 8156.    35   35. TRUE           0.38       0.38
#> # ℹ abbreviated names: ¹​ratio_ideal, ²​ratio_actual
#> # ℹ 5 more variables: ratio_diff <dbl>, earb_target <dbl>, earb_diff <dbl>,
#> #   gct_pct <dbl>, earb_pct <dbl>