Skip to content

Pennsylvania state tax over-charges qualified retirement income for retirees #8589

Description

@ra-dave

PolicyEngine US 1.720.6 charges Pennsylvania state income tax on qualified retirement distributions (pension, IRA, 401(k)) for retirees who have reached the plan's retirement age. Pennsylvania exempts this income entirely.

Statutory references:

  • 72 P.S. §7303(a) (Pennsylvania Tax Reform Code) defines eight classes of taxable income. Qualified retirement distributions received by retirees who have met the plan's retirement age requirements are not included in any taxable class.
  • PA DoR Personal Income Tax Bulletin 2008-03 and the REV-419 Schedule W-2S instructions (https://www.revenue.pa.gov/) explicitly confirm: "Retirement income, including but not limited to, payments from individual retirement accounts (IRA), 401(k) plans, and similar employer-sponsored
    retirement plans, is generally not subject to Pennsylvania personal income tax when distributed after reaching retirement age (typically 59½)."
  • Pennsylvania additionally exempts Social Security retirement benefits in full (PA Personal Income Tax does not adopt the federal taxation of SS).

Reproducer (PolicyEngine US 1.720.6):

from policyengine_us import Simulation

sim = Simulation(situation={
'people': {
'p0': {
'age': {2026: 67},
'taxable_pension_income': {2026: 40000},
'taxable_ira_distributions': {2026: 30000},
'social_security': {2026: 30000},
},
'p1': {
'age': {2026: 65},
'taxable_pension_income': {2026: 20000},
'social_security': {2026: 20000},
},
},
'tax_units': {
'tu': {'members': ['p0', 'p1'], 'filing_status': {2026: 'JOINT'}},
},
'households': {
'h': {'members': ['p0', 'p1'], 'state_code': {2026: 'PA'}},
},
})
print(float(sim.calculate('state_income_tax', 2026)[0]))

Actual: 938.00

Expected: 0.00

Why it's $0

Both spouses are past retirement age (65 and 67), so all four income components in this household are PA-exempt.

┌──────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────┐
│ Income │ Amount │ PA treatment │
├──────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────┤
│ Primary pension │ $40,000 │ Exempt — qualified retirement distribution received past plan retirement age │
├──────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────┤
│ Primary IRA distribution │ $30,000 │ Exempt — qualified plan, past 59½ │
├──────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────┤
│ Primary Social Security │ $30,000 │ Exempt — PA does not tax SS │
├──────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────┤
│ Spouse pension │ $20,000 │ Exempt — same as primary │
├──────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────┤
│ Spouse Social Security │ $20,000 │ Exempt — PA does not tax SS │
├──────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────┤
│ PA taxable income │ $0 │ │
└──────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────┘

Pre-retirement-age IRA / 401(k) distributions (the early-withdrawal case) ARE PA-taxable, so the variable shouldn't be unconditionally zeroed — the exemption is gated on age vs. the plan's retirement age (the planner's typical 59.5 proxy is fine).

Suggested fix

Add (or fix) a pa_qualified_retirement_subtraction TaxUnit variable that subtracts taxable_pension_income + taxable_ira_distributions + taxable_roth_conversions from pa_taxable_income when the recipient is age 59.5+. The Social Security exemption should already be present in PE's PA
model — please confirm during the fix that social_security flows into PA's exclusion list correctly.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions