diff --git a/changelog.d/mn-employer-paid-leave-premium.added.md b/changelog.d/mn-employer-paid-leave-premium.added.md
new file mode 100644
index 00000000000..5a1c2f0017c
--- /dev/null
+++ b/changelog.d/mn-employer-paid-leave-premium.added.md
@@ -0,0 +1 @@
+Model the Minnesota Paid Leave employer premium, including the small employer rate and test (Minn. Stat. 268B.14, subds. 5a-5c), and include it in employer payroll taxes.
diff --git a/changelog.d/mn-employer-paid-leave-premium.removed.md b/changelog.d/mn-employer-paid-leave-premium.removed.md
new file mode 100644
index 00000000000..632ca9dff66
--- /dev/null
+++ b/changelog.d/mn-employer-paid-leave-premium.removed.md
@@ -0,0 +1 @@
+Remove the Minnesota Paid Leave `employee_rate` parameter. The model now derives the employee portion from `rate`, `employer_minimum_share` and the `small_employer` shares, so reforms that set `employee_rate` must set those instead.
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/employee_rate.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/employee_rate.yaml
deleted file mode 100644
index a9d643c601a..00000000000
--- a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/employee_rate.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-description: Employee-side Minnesota Paid Leave contribution rate.
-values:
- 0000-01-01: 0
- 2026-01-01: 0.0044
-
-metadata:
- period: year
- unit: /1
- label: Minnesota Paid Leave employee rate
- reference:
- - title: Minnesota DEED confirms Paid Leave premium rate
- href: https://mn.gov/deed/newscenter/press-releases/?id=1045-670064
- - title: Minnesota Statutes Section 268B.14
- href: https://www.revisor.mn.gov/statutes/cite/268B.14
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/employer_minimum_share.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/employer_minimum_share.yaml
new file mode 100644
index 00000000000..360ed19c311
--- /dev/null
+++ b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/employer_minimum_share.yaml
@@ -0,0 +1,16 @@
+description: Minnesota sets this minimum share of the premium that employers pay under the Paid Leave program.
+values:
+ # Earlier years read the 2026 value; the zero rate keeps every amount at 0
+ # before 2026 unless a reform sets an earlier rate.
+ 0000-01-01: 0.5
+ 2026-01-01: 0.5
+
+metadata:
+ period: year
+ unit: /1
+ label: Minnesota Paid Leave employer minimum premium share
+ reference:
+ - title: Minnesota Statutes Section 268B.14, subdivision 3
+ href: https://www.revisor.mn.gov/statutes/cite/268B.14#stat.268B.14.3
+ - title: Minnesota Paid Leave, Premium rate and contributions ("employers can collect up to 0.44% from employees")
+ href: https://pl.mn.gov/resources/calculators/premium-rate-and-contributions
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/rate.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/rate.yaml
new file mode 100644
index 00000000000..43ebaffa74a
--- /dev/null
+++ b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/rate.yaml
@@ -0,0 +1,20 @@
+description: Minnesota sets this premium rate on taxable wages for an employer in both the family and medical benefit programs under the Paid Leave program.
+values:
+ 0000-01-01: 0
+ # Statutory 0.7% (subd. 6), adjusted by the commissioner under subd. 7.
+ 2026-01-01: 0.0088
+ 2027-01-01: 0.0088
+
+metadata:
+ period: year
+ unit: /1
+ label: Minnesota Paid Leave premium rate
+ reference:
+ - title: Minnesota Statutes Section 268B.14, subdivisions 1, 6 and 7
+ href: https://www.revisor.mn.gov/statutes/cite/268B.14#stat.268B.14.1
+ - title: Minnesota DEED confirms Paid Leave premium rate
+ href: https://mn.gov/deed/newscenter/press-releases/?id=1045-670064
+ - title: Minnesota Paid Leave, Premium rate and contributions ("For 2026 and 2027, the Paid Leave premium rate is 0.88%")
+ href: https://pl.mn.gov/resources/calculators/premium-rate-and-contributions
+ - title: Minnesota DEED, Paid Leave premium rate unchanged for 2027 (July 31, 2026)
+ href: https://content.govdelivery.com/accounts/MNDEED/bulletins/422fdf7
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/employer_minimum_share.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/employer_minimum_share.yaml
new file mode 100644
index 00000000000..630ae15e141
--- /dev/null
+++ b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/employer_minimum_share.yaml
@@ -0,0 +1,16 @@
+description: Minnesota sets this minimum share of the full premium rate that small employers pay under the Paid Leave program.
+values:
+ # Earlier years read the 2026 value; the zero rate keeps every amount at 0
+ # before 2026 unless a reform sets an earlier rate.
+ 0000-01-01: 0.25
+ 2026-01-01: 0.25
+
+metadata:
+ period: year
+ unit: /1
+ label: Minnesota Paid Leave small employer minimum premium share
+ reference:
+ - title: Minnesota Statutes Section 268B.14, subdivision 5a(b)(1)
+ href: https://www.revisor.mn.gov/statutes/cite/268B.14#stat.268B.14.5a
+ - title: Minnesota DEED, Paid Leave small employer premium rate designation ("Like large employers, small employers can deduct up to 0.44% of wages")
+ href: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf#page=1
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/max_average_wage_ratio.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/max_average_wage_ratio.yaml
new file mode 100644
index 00000000000..a9d2892b974
--- /dev/null
+++ b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/max_average_wage_ratio.yaml
@@ -0,0 +1,16 @@
+description: Minnesota limits the small employer premium rate to employers whose average wage is at most this multiple of the state's average wage in covered employment under the Paid Leave program.
+values:
+ # Earlier years read the 2026 value; the zero rate keeps every amount at 0
+ # before 2026 unless a reform sets an earlier rate.
+ 0000-01-01: 1.5
+ 2026-01-01: 1.5
+
+metadata:
+ period: year
+ unit: /1
+ label: Minnesota Paid Leave small employer average wage limit ratio
+ reference:
+ - title: Minnesota Statutes Section 268B.14, subdivision 5a(a)(2)
+ href: https://www.revisor.mn.gov/statutes/cite/268B.14#stat.268B.14.5a
+ - title: Minnesota DEED, Paid Leave small employer premium rate designation
+ href: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf#page=1
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/max_headcount.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/max_headcount.yaml
new file mode 100644
index 00000000000..d586d32da61
--- /dev/null
+++ b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/max_headcount.yaml
@@ -0,0 +1,16 @@
+description: Minnesota limits the small employer premium rate to employers with at most this many employees under the Paid Leave program.
+values:
+ # Earlier years read the 2026 value; the zero rate keeps every amount at 0
+ # before 2026 unless a reform sets an earlier rate.
+ 0000-01-01: 30
+ 2026-01-01: 30
+
+metadata:
+ period: year
+ unit: person
+ label: Minnesota Paid Leave small employer maximum employees
+ reference:
+ - title: Minnesota Statutes Section 268B.14, subdivisions 5a(a)(1) and 5b
+ href: https://www.revisor.mn.gov/statutes/cite/268B.14#stat.268B.14.5a
+ - title: Minnesota DEED, Paid Leave small employer premium rate designation
+ href: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf#page=1
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/rate_share.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/rate_share.yaml
new file mode 100644
index 00000000000..286ab4d9664
--- /dev/null
+++ b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/rate_share.yaml
@@ -0,0 +1,18 @@
+description: Minnesota sets the small employer premium rate at this share of the full premium rate under the Paid Leave program.
+values:
+ # Earlier years read the 2026 value; the zero rate keeps every amount at 0
+ # before 2026 unless a reform sets an earlier rate.
+ 0000-01-01: 0.75
+ 2026-01-01: 0.75
+
+metadata:
+ period: year
+ unit: /1
+ label: Minnesota Paid Leave small employer premium rate share
+ reference:
+ - title: Minnesota Statutes Section 268B.14, subdivision 5a(b)
+ href: https://www.revisor.mn.gov/statutes/cite/268B.14#stat.268B.14.5a
+ - title: Minnesota Paid Leave, Premium rate and contributions ("The Paid Leave small employer rate is 0.66%")
+ href: https://pl.mn.gov/resources/calculators/premium-rate-and-contributions
+ - title: Minnesota DEED, Paid Leave small employer premium rate designation
+ href: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf#page=1
diff --git a/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/state_average_annual_wage.yaml b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/state_average_annual_wage.yaml
new file mode 100644
index 00000000000..f307143e91b
--- /dev/null
+++ b/policyengine_us/parameters/gov/states/mn/tax/payroll/paid_leave/small_employer/state_average_annual_wage.yaml
@@ -0,0 +1,21 @@
+description: Minnesota uses this statewide average annual wage in covered employment for the small employer wage test under the Paid Leave program.
+values:
+ # Earlier years read the 2026 value; the zero rate keeps every amount at 0
+ # before 2026 unless a reform sets an earlier rate.
+ 0000-01-01: 73_989
+ # Statewide average annual wage for 2025 ("$73,989 per year"), applied to
+ # 2026 premiums, whose basis period is October 2024 to September 2025.
+ 2026-01-01: 73_989
+ # No Department of Employment and Economic Development figure for 2027
+ # premiums as of 2026-10-20, so the 2026 value carries forward; update it
+ # when the department issues 2027 small employer designations.
+
+metadata:
+ period: year
+ unit: currency-USD
+ label: Minnesota Paid Leave state average annual wage
+ reference:
+ - title: Minnesota Statutes Section 268B.14, subdivisions 5a(a)(2) and 5b(a)
+ href: https://www.revisor.mn.gov/statutes/cite/268B.14#stat.268B.14.5a
+ - title: Minnesota DEED, Paid Leave small employer premium rate designation, Key Terms ("The Statewide Average Annual Wage for 2025 was $73,989 per year")
+ href: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf#page=2
diff --git a/policyengine_us/tests/core/test_payroll_contributions.py b/policyengine_us/tests/core/test_payroll_contributions.py
index 6939b040785..c10660d79a7 100644
--- a/policyengine_us/tests/core/test_payroll_contributions.py
+++ b/policyengine_us/tests/core/test_payroll_contributions.py
@@ -78,6 +78,9 @@ def calculate(sim: Simulation, variable: str) -> float:
pytest.param(
"ME", "employer_total_me_paid_leave_taxable_wages", 4_000, id="ME"
),
+ pytest.param(
+ "MN", "employer_total_mn_paid_leave_taxable_wages", 4_000, id="MN"
+ ),
pytest.param(
"OR", "employer_total_or_paid_leave_taxable_wages", 4_000, id="OR"
),
@@ -131,6 +134,7 @@ def make_employer_total_simulation(
employer_total_dc_paid_leave_taxable_wages: float = WAGES,
employer_total_ma_paid_leave_taxable_wages: float = WAGES,
employer_total_me_paid_leave_taxable_wages: float = WAGES,
+ employer_total_mn_paid_leave_taxable_wages: float = WAGES,
employer_total_or_paid_leave_taxable_wages: float = WAGES,
employer_total_vt_child_care_contribution_wages: float = WAGES,
employer_total_wa_paid_leave_taxable_wages: float = WAGES,
@@ -182,6 +186,9 @@ def make_employer_total_simulation(
"employer_total_me_paid_leave_taxable_wages": {
PERIOD: employer_total_me_paid_leave_taxable_wages
},
+ "employer_total_mn_paid_leave_taxable_wages": {
+ PERIOD: employer_total_mn_paid_leave_taxable_wages
+ },
"employer_total_or_paid_leave_taxable_wages": {
PERIOD: employer_total_or_paid_leave_taxable_wages
},
@@ -508,6 +515,14 @@ def test_employee_payroll_tax_zero_when_payroll_tax_abolished():
},
id="ME",
),
+ pytest.param(
+ "MN",
+ {
+ "mn_employer_paid_leave_contribution": 440,
+ "mn_employer_additional_state_payroll_tax": 440,
+ },
+ id="MN",
+ ),
pytest.param(
"OR",
{
@@ -592,6 +607,143 @@ def test_small_employer_thresholds_zero_employer_paid_leave_share(
assert calculate(sim, variable) == 0
+@pytest.mark.parametrize(
+ ("small_employer_minimum", "small_employee", "small_employer"),
+ [
+ # A small employer minimum above the 75% small employer premium
+ # leaves employees nothing ("the remaining portion, if any").
+ pytest.param(0.8, 0, 750, id="employee-floor"),
+ # A negative minimum can't make employees pay more than the premium.
+ pytest.param(-0.1, 750, 0, id="employee-cap"),
+ ],
+)
+def test_minnesota_paid_leave_shares_follow_the_parameters(
+ small_employer_minimum: float, small_employee: float, small_employer: float
+):
+ # The employee portion is derived from the rate and the employer minimums
+ # (Minn. Stat. 268B.14, subds. 3 and 5a(b)), so a reform of either reaches
+ # both sides.
+ paid_leave = "gov.states.mn.tax.payroll.paid_leave"
+ reform = Reform.from_dict(
+ {
+ f"{paid_leave}.rate": {
+ "2025-01-01.2025-12-31": 0.01,
+ "2026-01-01.2026-12-31": 0.01,
+ },
+ f"{paid_leave}.employer_minimum_share": {"2026-01-01.2026-12-31": 0.6},
+ f"{paid_leave}.small_employer.employer_minimum_share": {
+ "2026-01-01.2026-12-31": small_employer_minimum
+ },
+ },
+ country_id="us",
+ )
+ people = {
+ name: {
+ "age": {PERIOD: 30},
+ "employment_income": {"2025": WAGES, PERIOD: WAGES},
+ "employer_headcount": {"2025": headcount, PERIOD: headcount},
+ "employer_total_mn_paid_leave_taxable_wages": {PERIOD: WAGES},
+ }
+ for name, headcount in (("large", 100), ("small", 30))
+ }
+ sim = Simulation(
+ tax_benefit_system=CountryTaxBenefitSystem(reform=(reform,)),
+ situation={
+ "people": people,
+ "households": {
+ "household": {
+ "members": list(people),
+ "state_code": {"2025": "MN", PERIOD: "MN"},
+ }
+ },
+ "tax_units": {"tax_unit": {"members": list(people)}},
+ "spm_units": {"spm_unit": {"members": list(people)}},
+ "families": {"family": {"members": list(people)}},
+ "marital_units": {
+ f"{name}_marital_unit": {"members": [name]} for name in people
+ },
+ },
+ )
+
+ # Large: 1% premium, 40% of it deductible. Small: 75% * 1% premium.
+ assert sim.calculate("mn_paid_leave_premium", PERIOD) == pytest.approx([1_000, 750])
+ assert sim.calculate(
+ "mn_employee_paid_leave_contribution", PERIOD
+ ) == pytest.approx([400, small_employee])
+ assert sim.calculate(
+ "mn_employer_paid_leave_contribution", PERIOD
+ ) == pytest.approx([600, small_employer])
+ # The employer-level path reads the same derived rates.
+ assert sim.calculate(
+ "employer_total_additional_state_payroll_tax", PERIOD
+ ) == pytest.approx([600, small_employer])
+ # In 2025 the reform sets only the rate, so the shares keep their
+ # statutory values: the employer pays 1% - 0.5% = 0.5% of wages, or for
+ # a small employer 0.75% - (0.75% - 0.25%) = 0.25%.
+ assert sim.calculate("mn_paid_leave_premium", "2025") == pytest.approx([1_000, 750])
+ assert sim.calculate(
+ "mn_employer_paid_leave_contribution", "2025"
+ ) == pytest.approx([500, 250])
+
+
+def test_minnesota_small_employer_wage_limit_rounds_half_up():
+ # 150% * $73,991 / 4 = $27,746.625, which rounds half up to $27,746.63
+ # (half to even would give $27,746.62). In 2027, 150% * $73,989.02 / 4 =
+ # $27,745.8825, which rounds to $27,745.88 (rounding up would give
+ # $27,745.89).
+ reform = Reform.from_dict(
+ {
+ "gov.states.mn.tax.payroll.paid_leave.small_employer.state_average_annual_wage": {
+ "2026-01-01.2026-12-31": 73_991,
+ "2027-01-01.2027-12-31": 73_989.02,
+ },
+ },
+ country_id="us",
+ )
+ people = {
+ name: {
+ "age": {PERIOD: 30},
+ "employment_income": {PERIOD: WAGES},
+ "employer_headcount": {PERIOD: 10, "2027": 10},
+ "mn_paid_leave_employer_average_quarterly_wage": {
+ PERIOD: average_wage_2026,
+ "2027": average_wage_2027,
+ },
+ }
+ for name, average_wage_2026, average_wage_2027 in (
+ ("at_limit", 27_746.63, 27_745.88),
+ ("above", 27_746.64, 27_745.89),
+ )
+ }
+ sim = Simulation(
+ tax_benefit_system=CountryTaxBenefitSystem(reform=(reform,)),
+ situation={
+ "people": people,
+ "households": {
+ "household": {
+ "members": list(people),
+ "state_code": {PERIOD: "MN", "2027": "MN"},
+ }
+ },
+ "tax_units": {"tax_unit": {"members": list(people)}},
+ "spm_units": {"spm_unit": {"members": list(people)}},
+ "families": {"family": {"members": list(people)}},
+ "marital_units": {
+ f"{name}_marital_unit": {"members": [name]} for name in people
+ },
+ },
+ )
+
+ assert sim.calculate("mn_paid_leave_small_employer", PERIOD).tolist() == [
+ True,
+ False,
+ ]
+ assert sim.calculate("mn_paid_leave_small_employer", "2027").tolist() == [
+ True,
+ False,
+ ]
+
+
@pytest.mark.parametrize(
("state_code", "expected"),
[
@@ -637,6 +789,7 @@ def test_small_employer_thresholds_zero_employer_paid_leave_share(
{
"mn_paid_leave_taxable_wages": 7_000,
"mn_employee_paid_leave_contribution": 30.8,
+ "mn_employer_paid_leave_contribution": 30.8,
},
id="MN",
),
@@ -962,6 +1115,7 @@ def test_new_york_mctmt_employer_tax(
pytest.param("DE", 100, WAGES, 9_000, 400, id="DE"),
pytest.param("MA", 100, WAGES, 9_000, 420, id="MA"),
pytest.param("ME", 100, WAGES, 9_000, 500, id="ME"),
+ pytest.param("MN", 100, WAGES, 9_000, 440, id="MN"),
pytest.param("OR", 100, WAGES, 9_000, 400, id="OR"),
pytest.param("RI", 100, WAGES, 29_200, 61.32, id="RI"),
pytest.param("VT", 100, WAGES, 9_000, 330, id="VT"),
@@ -996,6 +1150,7 @@ def test_employer_total_additional_state_payroll_tax(
pytest.param("DE", 20, id="DE"),
pytest.param("MA", 29.4, id="MA"),
pytest.param("ME", 35, id="ME"),
+ pytest.param("MN", 30.8, id="MN"),
pytest.param("OR", 28, id="OR"),
pytest.param("RI", 8.4, id="RI"),
pytest.param("VT", 13.2, id="VT"),
@@ -1014,6 +1169,7 @@ def test_employer_total_additional_state_payroll_tax_uses_state_specific_wage_ba
employer_total_dc_paid_leave_taxable_wages=7_000,
employer_total_ma_paid_leave_taxable_wages=7_000,
employer_total_me_paid_leave_taxable_wages=7_000,
+ employer_total_mn_paid_leave_taxable_wages=7_000,
employer_total_or_paid_leave_taxable_wages=7_000,
employer_total_vt_child_care_contribution_wages=4_000,
employer_total_wa_paid_leave_taxable_wages=7_000,
diff --git a/policyengine_us/tests/core/test_state_payroll_premium_deduction_share_invariants.py b/policyengine_us/tests/core/test_state_payroll_premium_deduction_share_invariants.py
index fa28532f644..578a330cc1a 100644
--- a/policyengine_us/tests/core/test_state_payroll_premium_deduction_share_invariants.py
+++ b/policyengine_us/tests/core/test_state_payroll_premium_deduction_share_invariants.py
@@ -10,24 +10,25 @@
`employer_state_payroll_premium_deduction_share` says how much of the
permitted employee share the employer deducts (default 1). Hypothesis draws
workers in those states, in states whose contributions are mandatory
-withholding, and in a state with neither, with any wages, employer size and
-share, and runs each worker three times in one simulation: with two drawn
-shares and with the input left at its default. For every worker, in 2026 and
-2027:
+withholding, and in a state with neither, with any wages, employer size, share
+and (for Minnesota's small employer test) employer average wage, and runs each
+worker three times in one simulation: with two drawn shares and with the input
+left at its default. For every worker, in 2026 and 2027:
1. The employee amount of the optional programs is the clipped share times the
amount at the default, so the default is the full permitted share and a
share outside 0 to 1 acts as the nearer bound.
2. The mandatory components of `employee_state_payroll_tax` do not depend on
the share.
-3. Where the employer side is modeled (CO, DE, MA, ME, VT, WA), employee plus
- employer premium does not depend on the share: the employer pays exactly
- what it does not deduct. Minnesota and New York employer costs are not
- modeled, so their employer amount is zero at any share.
+3. Where the employer side is modeled (CO, DE, MA, ME, MN, VT, WA), employee
+ plus employer premium does not depend on the share: the employer pays
+ exactly what it does not deduct. The New York employer cost is not
+ modeled, so its employer amount is zero at any share.
4. A larger share never lowers the employee amount or raises the employer
amount.
5. With employer-level wage totals equal to the worker's own wages, capped at
- the Social Security base where the worker's are (a one-worker employer),
+ the Social Security base where the worker's are and at Minnesota's rounded
+ base for Minnesota (a one-worker employer),
`employer_total_additional_state_payroll_tax` equals
`employer_additional_state_payroll_tax` in every modeled state: the
employer-level path and the per-worker path agree at any share and
@@ -36,6 +37,13 @@
with DFML's swap of the two rates (Acts 2026 c. 101 ss. 25, 26, 43(a)),
leaves each worker's employee and employer amounts where they were in
2026, for wages under both years' wage bases.
+7. Minnesota matches the statute computed independently here: the premium is
+ 0.88% of taxable wages, or 0.66% for a small employer (30 or fewer
+ employees and an average quarterly wage of at most $27,745.88); employee
+ plus employer amounts equal it at any share; and the employer pays its
+ minimum (half the premium, or 0.22% of wages for a small employer) plus
+ the part of the rest it does not deduct (Minn. Stat. 268B.14, subds. 1,
+ 3 and 5a).
Amounts are compared to float32 precision, within a cent.
@@ -55,7 +63,7 @@
YEARS = (2026, 2027)
OPTIONAL_STATES = ("CO", "DE", "MA", "ME", "MN", "NY", "VT", "WA")
MANDATORY_STATES = ("CA", "CT", "NJ", "OR", "PA", "RI")
-EMPLOYER_MODELED_STATES = ("CO", "DE", "MA", "ME", "VT", "WA")
+EMPLOYER_MODELED_STATES = ("CO", "DE", "MA", "ME", "MN", "VT", "WA")
OPTIONAL_EMPLOYEE_VARIABLES = (
"co_employee_famli_contribution",
"de_employee_paid_leave_contribution",
@@ -74,6 +82,20 @@
year: system.parameters(f"{year}-01-01").gov.irs.payroll.social_security.cap
for year in YEARS
}
+# Minn. Stat. 268B.01, subd. 43: the Social Security base rounded to the
+# nearest $1,000.
+MN_TAXABLE_WAGE_BASE = {
+ year: 1_000 * np.floor(SOCIAL_SECURITY_CAP[year] / 1_000 + 0.5) for year in YEARS
+}
+# Minnesota Paid Leave, from the statute and DEED, independent of the
+# parameter files: 0.88% in 2026 and 2027 (subd. 7); employer minimum 50%
+# (subd. 3); small employers 75% of the rate with an employer minimum of 25%
+# of the full rate (subd. 5a(b)), if 30 or fewer employees and an average
+# quarterly wage of at most $27,745.88 (subd. 5a(a); DEED's 2026 designation:
+# 150% of the $73,989 statewide average annual wage, per quarter).
+MN_RATE = 0.0088
+MN_SMALL_MAX_HEADCOUNT = 30
+MN_SMALL_MAX_AVERAGE_QUARTERLY_WAGE = 27_745.88
COPIES = 3 # drawn share a, drawn share b, input left at its default
# The model computes in float32: compare to that precision, never past a cent.
CENT = 0.01
@@ -83,12 +105,19 @@
st.sampled_from([0.0, 0.25, 0.5, 1.0, -0.5, 1.5]),
st.floats(-0.5, 1.5, allow_nan=False),
)
+# Whole cents, as DEED states wages: the model holds the input in float32,
+# which can't tell sub-cent amounts around the limit apart.
+average_quarterly_wage = st.one_of(
+ st.sampled_from([0.0, 27_745.88, 27_745.89, 40_000.0]),
+ st.integers(0, 6_000_000).map(lambda cents: cents / 100),
+)
workers = st.tuples(
st.sampled_from(OPTIONAL_STATES + MANDATORY_STATES + ("TX",)),
st.integers(0, 300_000), # employment_income
- st.sampled_from([1, 9, 10, 14, 15, 20, 24, 25, 49, 50, 100]),
+ st.sampled_from([1, 9, 10, 14, 15, 20, 24, 25, 30, 31, 49, 50, 100]),
share,
share,
+ average_quarterly_wage, # Minnesota small employer test only
)
@@ -96,7 +125,7 @@ def simulate(rows):
people, households = {}, {}
groups = {"tax_units": {}, "spm_units": {}, "families": {}, "marital_units": {}}
index = 0
- for state, wages, headcount, share_a, share_b in rows:
+ for state, wages, headcount, share_a, share_b, average_wage in rows:
for share_value in (share_a, share_b, None):
person = f"person_{index}"
people[person] = {
@@ -106,6 +135,12 @@ def simulate(rows):
"employer_total_taxable_earnings_for_social_security": {
year: min(wages, SOCIAL_SECURITY_CAP[year]) for year in YEARS
},
+ "employer_total_mn_paid_leave_taxable_wages": {
+ year: min(wages, MN_TAXABLE_WAGE_BASE[year]) for year in YEARS
+ },
+ "mn_paid_leave_employer_average_quarterly_wage": {
+ year: average_wage for year in YEARS
+ },
"employer_total_payroll_tax_gross_wages": {
year: wages for year in YEARS
},
@@ -138,19 +173,22 @@ def by_copy(simulation, variable, year):
st.lists(workers, min_size=4, max_size=30).map(
# Every optional state gets a worker at a large employer below every
# wage base, and one at a 9-employee employer (below the CO, MA, ME
- # and WA size thresholds; DE does not cover it) above every wage base
- # and New York's PFL maximum; Delaware also gets a 12-employee
- # employer (parental leave only). Shares lie strictly between 0 and 1
- # or above 1, so each program's properties compare positive amounts,
- # small-employer rules and capped amounts. Workers on each side of an
- # employer-size threshold make property 5 compare the per-worker and
- # employer-level paths at that threshold.
+ # and WA size thresholds; DE does not cover it; a Minnesota small
+ # employer) above every wage base and New York's PFL maximum;
+ # Delaware also gets a 12-employee employer (parental leave only).
+ # Minnesota also gets employers at 30 and 31 employees and one of 10
+ # employees whose average wage fails the small employer test. Shares
+ # lie strictly between 0 and 1 or above 1, so each program's
+ # properties compare positive amounts, small-employer rules and
+ # capped amounts. Workers on each side of an employer-size threshold
+ # make property 5 compare the per-worker and employer-level paths at
+ # that threshold.
lambda rows: (
- [(state, 60_000, 100, 0.5, 0.0) for state in OPTIONAL_STATES]
- + [(state, 250_000, 9, 0.3, 1.2) for state in OPTIONAL_STATES]
- + [("DE", 250_000, 12, 0.3, 1.2)]
+ [(state, 60_000, 100, 0.5, 0.0, 0.0) for state in OPTIONAL_STATES]
+ + [(state, 250_000, 9, 0.3, 1.2, 0.0) for state in OPTIONAL_STATES]
+ + [("DE", 250_000, 12, 0.3, 1.2, 0.0)]
+ [
- (state, 60_000, headcount, 0.5, 0.0)
+ (state, 60_000, headcount, 0.5, 0.0, 0.0)
for state, headcount in (
("CO", 10),
("DE", 10),
@@ -164,6 +202,11 @@ def by_copy(simulation, variable, year):
("WA", 50),
)
]
+ + [
+ ("MN", 60_000, 30, 0.5, 0.0, 27_745.88),
+ ("MN", 60_000, 31, 0.5, 0.0, 0.0),
+ ("MN", 60_000, 10, 0.5, 0.0, 27_745.89),
+ ]
+ rows
)
)
@@ -172,9 +215,16 @@ def test_state_payroll_premium_deduction_share_invariants(rows):
simulation = simulate(rows)
states = np.array([row[0] for row in rows])
wages = np.array([row[1] for row in rows])
+ headcounts = np.array([row[2] for row in rows])
shares = np.clip(np.array([[row[3], row[4], 1.0] for row in rows]), 0, 1)
+ average_wages = np.array([row[5] for row in rows])
modeled = np.isin(states, EMPLOYER_MODELED_STATES)
- unmodeled = np.isin(states, ("MN", "NY"))
+ unmodeled = states == "NY"
+ mn = states == "MN"
+ mn_small = (headcounts <= MN_SMALL_MAX_HEADCOUNT) & (
+ average_wages <= MN_SMALL_MAX_AVERAGE_QUARTERLY_WAGE
+ )
+ assert mn_small[mn].any() and (~mn_small[mn]).any()
uncapped = wages <= UNCAPPED_WAGES
optional_by_year = {}
employer_by_year = {}
@@ -215,6 +265,29 @@ def test_state_payroll_premium_deduction_share_invariants(rows):
np.testing.assert_allclose(
employer_total[same_path], employer[same_path], **TOLERANCE
)
+ # Property 7.
+ mn_wages = np.minimum(np.maximum(wages, 0), MN_TAXABLE_WAGE_BASE[year])
+ mn_premium = MN_RATE * np.where(mn_small, 0.75, 1) * mn_wages
+ mn_minimum = np.where(mn_small, 0.25 * MN_RATE * mn_wages, 0.5 * mn_premium)
+ mn_employee = by_copy(simulation, "mn_employee_paid_leave_contribution", year)
+ mn_employer = by_copy(simulation, "mn_employer_paid_leave_contribution", year)
+ np.testing.assert_allclose(
+ by_copy(simulation, "mn_paid_leave_premium", year)[mn],
+ mn_premium[mn][:, None] * np.ones((1, COPIES)),
+ **TOLERANCE,
+ )
+ np.testing.assert_allclose(
+ (mn_employee + mn_employer)[mn],
+ mn_premium[mn][:, None] * np.ones((1, COPIES)),
+ **TOLERANCE,
+ )
+ np.testing.assert_allclose(
+ mn_employer[mn],
+ (mn_minimum[:, None] + (1 - shares) * (mn_premium - mn_minimum)[:, None])[
+ mn
+ ],
+ **TOLERANCE,
+ )
optional_by_year[year] = optional
employer_by_year[year] = employer
# Property 6.
diff --git a/policyengine_us/tests/policy/baseline/gov/states/mn/tax/payroll/paid_leave/mn_employer_paid_leave_contribution.yaml b/policyengine_us/tests/policy/baseline/gov/states/mn/tax/payroll/paid_leave/mn_employer_paid_leave_contribution.yaml
new file mode 100644
index 00000000000..b24dd01703b
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/states/mn/tax/payroll/paid_leave/mn_employer_paid_leave_contribution.yaml
@@ -0,0 +1,312 @@
+# Minnesota Paid Leave premium, employer and employee sides (Minn. Stat.
+# 268B.14). 2026 and 2027 premium rate 0.88% (DEED, subd. 7); the employer
+# pays at least 50% (subd. 3). A small employer under subd. 5a (30 or fewer
+# employees, average quarterly wage at most 150% * $73,989 / 4 = $27,745.875,
+# which DEED's 2026 designation gives as $27,745.88) pays 75% of the rate,
+# 0.66%, of which the employer pays at least 25% of the full rate, 0.22%.
+# Employees pay at most 0.88% - 0.44% = 0.66% - 0.22% = 0.44% of taxable
+# wages. Taxable wages are capped at the Social Security base rounded to the
+# nearest $1,000 (268B.01, subd. 43): $184,500 rounds to $185,000 in 2026.
+
+- name: A large employer that deducts the full permitted share pays half the premium.
+ period: 2026
+ input:
+ employment_income: 100_000
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: false
+ mn_paid_leave_premium_rate: 0.0088
+ mn_paid_leave_permitted_employee_rate: 0.0044
+ # 0.88% * 100,000 = 880.
+ mn_paid_leave_premium: 880
+ # 0.44% * 100,000 = 440.
+ mn_employee_paid_leave_contribution: 440
+ # 880 - 440 = 440.
+ mn_employer_paid_leave_contribution: 440
+ mn_employer_additional_state_payroll_tax: 440
+ employer_additional_state_payroll_tax: 440
+
+- name: A large employer that deducts half the permitted share pays the rest.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_state_payroll_premium_deduction_share: 0.5
+ state_code: MN
+ output:
+ mn_paid_leave_premium: 880
+ # 0.5 * 440 = 220.
+ mn_employee_paid_leave_contribution: 220
+ # 880 - 220 = 660.
+ mn_employer_paid_leave_contribution: 660
+
+- name: A large employer that deducts nothing pays the whole premium.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_state_payroll_premium_deduction_share: 0
+ state_code: MN
+ output:
+ mn_employee_paid_leave_contribution: 0
+ mn_employer_paid_leave_contribution: 880
+
+- name: A small employer pays 75% of the rate, of which employees may pay the same 0.44%.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 30
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: true
+ # 75% * 0.88% = 0.66%.
+ mn_paid_leave_premium_rate: 0.0066
+ # (75% - 25%) * 0.88% = 0.44%.
+ mn_paid_leave_permitted_employee_rate: 0.0044
+ # 0.66% * 100,000 = 660.
+ mn_paid_leave_premium: 660
+ mn_employee_paid_leave_contribution: 440
+ # 660 - 440 = 220, the 25% * 0.88% = 0.22% minimum.
+ mn_employer_paid_leave_contribution: 220
+ employer_additional_state_payroll_tax: 220
+
+- name: A small employer that deducts half the permitted share pays the rest.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 30
+ employer_state_payroll_premium_deduction_share: 0.5
+ state_code: MN
+ output:
+ mn_employee_paid_leave_contribution: 220
+ # 660 - 220 = 440.
+ mn_employer_paid_leave_contribution: 440
+
+- name: A small employer that deducts nothing pays the whole small employer premium.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 30
+ employer_state_payroll_premium_deduction_share: 0
+ state_code: MN
+ output:
+ mn_employee_paid_leave_contribution: 0
+ mn_employer_paid_leave_contribution: 660
+
+- name: An employer with 31 employees is not a small employer.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 31
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: false
+ mn_paid_leave_premium: 880
+ mn_employer_paid_leave_contribution: 440
+
+- name: An average quarterly wage equal to the limit meets the small employer wage test.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 10
+ mn_paid_leave_employer_average_quarterly_wage: 27_745.88
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: true
+ mn_paid_leave_premium: 660
+ mn_employer_paid_leave_contribution: 220
+
+- name: An average quarterly wage above the limit fails the small employer wage test.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 10
+ mn_paid_leave_employer_average_quarterly_wage: 27_745.89
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: false
+ mn_paid_leave_premium: 880
+ mn_employer_paid_leave_contribution: 440
+
+- name: An average quarterly wage a fraction of a cent above the limit fails the wage test.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 10
+ mn_paid_leave_employer_average_quarterly_wage: 27_745.885
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: false
+ mn_paid_leave_premium: 880
+
+- name: Wages above the rounded Social Security base are capped at 185,000.
+ period: 2026
+ input:
+ employment_income: 250_000
+ state_code: MN
+ output:
+ mn_paid_leave_taxable_wages: 185_000
+ # 0.88% * 185,000 = 1,628.
+ mn_paid_leave_premium: 1_628
+ # 0.44% * 185,000 = 814.
+ mn_employee_paid_leave_contribution: 814
+ mn_employer_paid_leave_contribution: 814
+
+- name: A small employer's capped premium leaves the employer a quarter of the full rate.
+ period: 2026
+ input:
+ employment_income: 250_000
+ employer_headcount: 9
+ state_code: MN
+ output:
+ # 0.66% * 185,000 = 1,221.
+ mn_paid_leave_premium: 1_221
+ mn_employee_paid_leave_contribution: 814
+ # 1,221 - 814 = 407 = 0.22% * 185,000.
+ mn_employer_paid_leave_contribution: 407
+
+- name: Small wages keep fractional cents.
+ period: 2026
+ input:
+ employment_income: 8_000
+ state_code: MN
+ output:
+ # 0.88% * 8,000 = 70.40; 0.44% * 8,000 = 35.20.
+ mn_paid_leave_premium: 70.4
+ mn_employee_paid_leave_contribution: 35.2
+ mn_employer_paid_leave_contribution: 35.2
+
+- name: Negative employment income owes no premium.
+ period: 2026
+ input:
+ employment_income: -5_000
+ state_code: MN
+ output:
+ mn_paid_leave_premium: 0
+ mn_employee_paid_leave_contribution: 0
+ mn_employer_paid_leave_contribution: 0
+
+- name: The employer premium flows into employer state and total payroll taxes.
+ period: 2026
+ input:
+ employment_income: 100_000
+ # A zero unemployment insurance rate keeps this case independent of the
+ # Minnesota unemployment insurance wage base.
+ employer_state_unemployment_tax_rate_override: 0
+ state_code: MN
+ output:
+ mn_employer_paid_leave_contribution: 440
+ employer_state_unemployment_tax: 0
+ # 0 + 440 = 440.
+ employer_state_payroll_tax: 440
+ # Social Security 6.2% * 100,000 = 6,200; Medicare 1.45% * 100,000 =
+ # 1,450; FUTA 0.6% * 7,000 = 42; 6,200 + 1,450 + 42 + 440 = 8,132.
+ employer_payroll_tax: 8_132
+
+- name: The 2027 premium rate is unchanged at 0.88%.
+ period: 2027
+ input:
+ employment_income: 100_000
+ state_code: MN
+ output:
+ mn_paid_leave_premium: 880
+ mn_employee_paid_leave_contribution: 440
+ mn_employer_paid_leave_contribution: 440
+
+- name: No premium is due before 2026.
+ period: 2025
+ input:
+ employment_income: 100_000
+ employer_headcount: 9
+ state_code: MN
+ output:
+ mn_paid_leave_premium: 0
+ mn_employee_paid_leave_contribution: 0
+ mn_employer_paid_leave_contribution: 0
+ mn_employer_additional_state_payroll_tax: 0
+
+# Earlier years read the 2026 small employer limits, so a reform that sets an
+# earlier rate gets the 2026 test.
+- name: In 2025, 31 employees fail the small employer headcount test.
+ period: 2025
+ input:
+ employment_income: 100_000
+ employer_headcount: 31
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: false
+
+- name: In 2025, an average quarterly wage equal to the 2026 limit meets the wage test.
+ period: 2025
+ input:
+ employment_income: 100_000
+ employer_headcount: 30
+ mn_paid_leave_employer_average_quarterly_wage: 27_745.88
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: true
+
+- name: In 2025, an average quarterly wage a cent above the 2026 limit fails the wage test.
+ period: 2025
+ input:
+ employment_income: 100_000
+ employer_headcount: 10
+ mn_paid_leave_employer_average_quarterly_wage: 27_745.89
+ state_code: MN
+ output:
+ mn_paid_leave_small_employer: false
+
+- name: Years before the 2015 parameter backdating still compute.
+ period: 2014
+ input:
+ employment_income: 100_000
+ employer_headcount: 9
+ state_code: MN
+ output:
+ mn_paid_leave_premium: 0
+ mn_employer_paid_leave_contribution: 0
+ employer_additional_state_payroll_tax: 0
+
+- name: Workers outside Minnesota owe no Minnesota premium.
+ period: 2026
+ input:
+ employment_income: 100_000
+ employer_headcount: 9
+ state_code: WI
+ output:
+ mn_paid_leave_premium: 0
+ mn_employer_paid_leave_contribution: 0
+ employer_additional_state_payroll_tax: 0
+
+- name: Employer-level premium for a large employer that deducts the full permitted share.
+ period: 2026
+ input:
+ employer_headcount: 100
+ employer_total_taxable_earnings_for_social_security: 1_000_000
+ state_code: MN
+ output:
+ employer_total_mn_paid_leave_taxable_wages: 1_000_000
+ # (0.88% - 0.44%) * 1,000,000 = 4,400.
+ employer_total_additional_state_payroll_tax: 4_400
+
+- name: Employer-level premium for a small employer that deducts a quarter of the permitted share.
+ period: 2026
+ input:
+ employer_headcount: 20
+ employer_state_payroll_premium_deduction_share: 0.25
+ employer_total_taxable_earnings_for_social_security: 1_000_000
+ state_code: MN
+ output:
+ # (0.66% - 0.25 * 0.44%) * 1,000,000 = 6,600 - 1,100 = 5,500.
+ employer_total_additional_state_payroll_tax: 5_500
+
+- name: Employer-level wages can be set at Minnesota's rounded base.
+ period: 2026
+ input:
+ employer_headcount: 100
+ employer_total_taxable_earnings_for_social_security: 369_000
+ # Two workers at Minnesota's 185,000 base, not the 184,500 Social
+ # Security base.
+ employer_total_mn_paid_leave_taxable_wages: 370_000
+ state_code: MN
+ output:
+ # 0.44% * 370,000 = 1,628.
+ employer_total_additional_state_payroll_tax: 1_628
diff --git a/policyengine_us/tests/policy/baseline/gov/states/tax/payroll/state_payroll_premium_deduction_share.yaml b/policyengine_us/tests/policy/baseline/gov/states/tax/payroll/state_payroll_premium_deduction_share.yaml
index 9bebda21773..528c90d7b06 100644
--- a/policyengine_us/tests/policy/baseline/gov/states/tax/payroll/state_payroll_premium_deduction_share.yaml
+++ b/policyengine_us/tests/policy/baseline/gov/states/tax/payroll/state_payroll_premium_deduction_share.yaml
@@ -180,7 +180,7 @@
# 1.13% * (1 - 0.2857) * 100,000 = 807.159.
wa_employer_paid_leave_contribution: 807.159
-- name: Minnesota Paid Leave employee share scales with the deduction share.
+- name: Minnesota Paid Leave employer pays the premium the employee share leaves.
period: 2026
input:
employment_income: 100_000
@@ -190,6 +190,8 @@
# 0.5 * 0.44% * 100,000 = 220.
mn_employee_paid_leave_contribution: 220
employee_state_payroll_tax: 220
+ # 0.88% * 100,000 - 220 = 660.
+ mn_employer_paid_leave_contribution: 660
- name: New York PFL and DBL scale the capped permitted contribution.
period: 2026
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/mn_employer_additional_state_payroll_tax.py b/policyengine_us/variables/gov/states/mn/tax/payroll/mn_employer_additional_state_payroll_tax.py
new file mode 100644
index 00000000000..f073e239871
--- /dev/null
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/mn_employer_additional_state_payroll_tax.py
@@ -0,0 +1,12 @@
+from policyengine_us.model_api import *
+
+
+class mn_employer_additional_state_payroll_tax(Variable):
+ value_type = float
+ entity = Person
+ label = "Minnesota employer additional state payroll tax"
+ documentation = "Employer-side Minnesota Paid Leave premium."
+ definition_period = YEAR
+ unit = USD
+ defined_for = StateCode.MN
+ adds = ["mn_employer_paid_leave_contribution"]
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_employee_paid_leave_contribution.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_employee_paid_leave_contribution.py
index 0fdf8023416..fc3f4b36cf7 100644
--- a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_employee_paid_leave_contribution.py
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_employee_paid_leave_contribution.py
@@ -11,9 +11,9 @@ class mn_employee_paid_leave_contribution(Variable):
"under subd. 5a, at least a quarter of the full rate); employees pay "
"by wage deduction only the part the employer does not pay (Minn. "
"Stat. 268B.14, subds. 1, 3 and 5a). This is the largest such part, "
- "half the premium at the full rate, times "
- "state_payroll_premium_deduction_share. The employer premium is not "
- "modeled."
+ "mn_paid_leave_permitted_employee_rate times taxable wages, times "
+ "state_payroll_premium_deduction_share. The employer pays the rest "
+ "of the premium (mn_employer_paid_leave_contribution)."
)
definition_period = YEAR
unit = USD
@@ -21,6 +21,6 @@ class mn_employee_paid_leave_contribution(Variable):
reference = "https://www.revisor.mn.gov/statutes/cite/268B.14"
def formula(person, period, parameters):
- rate = parameters(period).gov.states.mn.tax.payroll.paid_leave.employee_rate
+ rate = person("mn_paid_leave_permitted_employee_rate", period)
permitted = rate * person("mn_paid_leave_taxable_wages", period)
return permitted * person("state_payroll_premium_deduction_share", period)
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_employer_paid_leave_contribution.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_employer_paid_leave_contribution.py
new file mode 100644
index 00000000000..9dc1402c42a
--- /dev/null
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_employer_paid_leave_contribution.py
@@ -0,0 +1,24 @@
+from policyengine_us.model_api import *
+
+
+class mn_employer_paid_leave_contribution(Variable):
+ value_type = float
+ entity = Person
+ label = "Minnesota employer paid leave contribution"
+ documentation = (
+ "Employer-side Minnesota Paid Leave premium: the premium the employer "
+ "owes on the person's taxable wages (Minn. Stat. 268B.14, subd. 1) "
+ "less the employee wage deduction (subds. 3 and 5a). That is at "
+ "least the employer's minimum, half the premium or for a small "
+ "employer a quarter of the full rate, plus any part of the permitted "
+ "employee portion the employer does not deduct."
+ )
+ definition_period = YEAR
+ unit = USD
+ defined_for = StateCode.MN
+ reference = "https://www.revisor.mn.gov/statutes/cite/268B.14"
+
+ def formula(person, period, parameters):
+ return person("mn_paid_leave_premium", period) - person(
+ "mn_employee_paid_leave_contribution", period
+ )
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_employer_average_quarterly_wage.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_employer_average_quarterly_wage.py
new file mode 100644
index 00000000000..b3bf4bcdc83
--- /dev/null
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_employer_average_quarterly_wage.py
@@ -0,0 +1,28 @@
+from policyengine_us.model_api import *
+
+
+class mn_paid_leave_employer_average_quarterly_wage(Variable):
+ value_type = float
+ entity = Person
+ label = "Minnesota Paid Leave employer average quarterly wage"
+ documentation = (
+ "Average wage of the person's employer as Minnesota Paid Leave "
+ "measures it for the small employer premium rate: the employer's "
+ "covered wages in its highest-paid quarter of the basis period (the "
+ "four quarters ending September 30 of the prior year) divided by its "
+ "highest quarterly employee count in that period; the two may come "
+ "from different quarters (Minn. Stat. 268B.14, subds. 5b(a) and "
+ "5c(a)). An employer not covered for the whole basis period instead "
+ "divides its estimated covered wages for the following tax year by "
+ "its estimated employee count (subd. 5c(b)), an annual figure; divide "
+ "that figure by 4 here. Enter a quarterly amount, wages per employee "
+ "for one quarter, whichever subdivision applies: "
+ "mn_paid_leave_small_employer compares it with a quarterly limit, "
+ "150 percent of the state's average annual wage divided by 4. The "
+ "default of 0 treats the employer as meeting the wage test, so "
+ "employer_headcount alone decides whether the small employer rate "
+ "applies."
+ )
+ unit = USD
+ definition_period = YEAR
+ reference = "https://www.revisor.mn.gov/statutes/cite/268B.14"
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_permitted_employee_rate.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_permitted_employee_rate.py
new file mode 100644
index 00000000000..48d472c265e
--- /dev/null
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_permitted_employee_rate.py
@@ -0,0 +1,37 @@
+from policyengine_us.model_api import *
+
+
+class mn_paid_leave_permitted_employee_rate(Variable):
+ value_type = float
+ entity = Person
+ label = "Minnesota Paid Leave permitted employee premium rate"
+ documentation = (
+ "Largest share of the person's taxable wages the employer may deduct "
+ "for Minnesota Paid Leave: the premium rate less the employer's "
+ "minimum. The employer pays at least half the premium (Minn. Stat. "
+ "268B.14, subd. 3), or for a small employer eligible under subd. 5a, "
+ "at least 25 percent of the full rate out of a premium of 75 percent "
+ "of it (subd. 5a(b)); employees pay the remaining portion, if any."
+ )
+ definition_period = YEAR
+ unit = "/1"
+ defined_for = StateCode.MN
+ reference = "https://www.revisor.mn.gov/statutes/cite/268B.14"
+
+ def formula(person, period, parameters):
+ p = parameters(period).gov.states.mn.tax.payroll.paid_leave
+ small = person("mn_paid_leave_small_employer", period)
+ premium_share_of_full_rate = where(small, p.small_employer.rate_share, 1)
+ employer_minimum_share_of_full_rate = where(
+ small,
+ p.small_employer.employer_minimum_share,
+ p.employer_minimum_share,
+ )
+ # Employees pay the remaining portion, if any, which is never more
+ # than the premium itself.
+ employee_share_of_full_rate = clip(
+ premium_share_of_full_rate - employer_minimum_share_of_full_rate,
+ 0,
+ premium_share_of_full_rate,
+ )
+ return p.rate * employee_share_of_full_rate
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_premium.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_premium.py
new file mode 100644
index 00000000000..583930617b9
--- /dev/null
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_premium.py
@@ -0,0 +1,21 @@
+from policyengine_us.model_api import *
+
+
+class mn_paid_leave_premium(Variable):
+ value_type = float
+ entity = Person
+ label = "Minnesota Paid Leave premium"
+ documentation = (
+ "Minnesota Paid Leave premium on the person's taxable wages, which "
+ "accrues to and is payable by the employer (Minn. Stat. 268B.14, "
+ "subd. 1). The employer pays it less the employee wage deduction."
+ )
+ definition_period = YEAR
+ unit = USD
+ defined_for = StateCode.MN
+ reference = "https://www.revisor.mn.gov/statutes/cite/268B.14"
+
+ def formula(person, period, parameters):
+ return person("mn_paid_leave_premium_rate", period) * person(
+ "mn_paid_leave_taxable_wages", period
+ )
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_premium_rate.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_premium_rate.py
new file mode 100644
index 00000000000..0c0a4ede280
--- /dev/null
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_premium_rate.py
@@ -0,0 +1,24 @@
+from policyengine_us.model_api import *
+
+
+class mn_paid_leave_premium_rate(Variable):
+ value_type = float
+ entity = Person
+ label = "Minnesota Paid Leave premium rate"
+ documentation = (
+ "Minnesota Paid Leave premium rate on the person's taxable wages: the "
+ "annual premium rate, or 75 percent of it for a small employer "
+ "eligible under subd. 5a (Minn. Stat. 268B.14, subds. 5a(b), 6 and "
+ "7). Assumes the employer participates in both the family and "
+ "medical benefit programs; approved private plans (subds. 1 and 6, "
+ "section 268B.10) are not modeled."
+ )
+ definition_period = YEAR
+ unit = "/1"
+ defined_for = StateCode.MN
+ reference = "https://www.revisor.mn.gov/statutes/cite/268B.14"
+
+ def formula(person, period, parameters):
+ p = parameters(period).gov.states.mn.tax.payroll.paid_leave
+ small = person("mn_paid_leave_small_employer", period)
+ return p.rate * where(small, p.small_employer.rate_share, 1)
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_small_employer.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_small_employer.py
new file mode 100644
index 00000000000..8b776d183a1
--- /dev/null
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_small_employer.py
@@ -0,0 +1,44 @@
+from policyengine_us.model_api import *
+
+
+class mn_paid_leave_small_employer(Variable):
+ value_type = bool
+ entity = Person
+ label = "Minnesota Paid Leave small employer"
+ documentation = (
+ "Whether the person's employer qualifies for the Minnesota Paid Leave "
+ "small employer premium rate: 30 or fewer employees, and an average "
+ "wage at most 150 percent of the state's average wage in covered "
+ "employment for the basis period (Minn. Stat. 268B.14, subd. 5a(a)). "
+ "employer_headcount stands in for the employer's highest quarterly "
+ "employee count in the basis period (subd. 5b), and "
+ "mn_paid_leave_employer_average_quarterly_wage for its average wage "
+ "(subd. 5c). The limit is a quarterly amount, which DEED states to "
+ "the cent: 150 percent of $73,989 / 4 is $27,745.875 for 2026, which "
+ "DEED gives as $27,745.88. DEED's "
+ "further condition that the employer filed every wage detail report "
+ "in the basis period is not modeled."
+ )
+ definition_period = YEAR
+ defined_for = StateCode.MN
+ reference = (
+ "https://www.revisor.mn.gov/statutes/cite/268B.14",
+ "https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf#page=1",
+ )
+
+ def formula(person, period, parameters):
+ p = parameters(period).gov.states.mn.tax.payroll.paid_leave.small_employer
+ headcount = person("employer_headcount", period)
+ average_wage = person("mn_paid_leave_employer_average_quarterly_wage", period)
+ quarterly_state_average = p.state_average_annual_wage / 4
+ # DEED states the limit to the cent: $27,745.875 for 2026 becomes
+ # $27,745.88. Round half up, as for the taxable wage base.
+ max_average_wage = (
+ np.floor(100 * p.max_average_wage_ratio * quarterly_state_average + 0.5)
+ / 100
+ )
+ # Inputs are held in float32: compare at that precision, so an input
+ # of exactly the published limit meets it.
+ return (headcount <= p.max_headcount) & (
+ average_wage <= np.float32(max_average_wage)
+ )
diff --git a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_taxable_wages.py b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_taxable_wages.py
index 03112c1cd04..8fc38110961 100644
--- a/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_taxable_wages.py
+++ b/policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_taxable_wages.py
@@ -18,3 +18,26 @@ def formula(person, period, parameters):
social_security_cap = parameters(period).gov.irs.payroll.social_security.cap
taxable_wage_base = 1_000 * np.floor(social_security_cap / 1_000 + 0.5)
return min_(max_(0, person("employment_income", period)), taxable_wage_base)
+
+
+class employer_total_mn_paid_leave_taxable_wages(Variable):
+ value_type = float
+ entity = Person
+ label = "Employer total Minnesota Paid Leave taxable wages"
+ documentation = (
+ "Aggregate employer wages subject to Minnesota Paid Leave premiums "
+ "for employer-only payroll tax calculations. Defaults to "
+ "employer_total_taxable_earnings_for_social_security, which caps each "
+ "worker's wages at the Social Security wage base. Minnesota caps them "
+ "at that base rounded to the nearest $1,000 (Minn. Stat. 268B.01, "
+ "subd. 43): $185,000 against $184,500 in 2026. The two bases differ "
+ "by at most $500, so the default is off by at most $500 per worker "
+ "paid above the lower one; set this input to use Minnesota's base."
+ )
+ definition_period = YEAR
+ unit = USD
+ defined_for = StateCode.MN
+ reference = "https://www.revisor.mn.gov/statutes/cite/268B.01"
+
+ def formula(person, period, parameters):
+ return person("employer_total_taxable_earnings_for_social_security", period)
diff --git a/policyengine_us/variables/gov/states/tax/payroll/employee_state_payroll_tax.py b/policyengine_us/variables/gov/states/tax/payroll/employee_state_payroll_tax.py
index 91e48d04977..686c8339ec8 100644
--- a/policyengine_us/variables/gov/states/tax/payroll/employee_state_payroll_tax.py
+++ b/policyengine_us/variables/gov/states/tax/payroll/employee_state_payroll_tax.py
@@ -41,8 +41,8 @@ class employee_state_payroll_tax(Variable):
"employee amount is the permitted share times "
"employer_state_payroll_premium_deduction_share, which defaults to 1, "
"the full permitted share, and the employer-side variables carry any "
- "part the employer does not deduct, except in Minnesota and New York, "
- "whose employer cost is not modeled. Not modeled: an employer's "
+ "part the employer does not deduct, except in New York, whose "
+ "employer cost is not modeled. Not modeled: an employer's "
"election to pay a required employee contribution as a benefit (Paid "
"Leave Oregon, ORS 657B.150(5)) or voluntary payment of other "
"mandatory contributions, and, for the state paid family and medical "
diff --git a/policyengine_us/variables/gov/states/tax/payroll/employer_additional_state_payroll_tax.py b/policyengine_us/variables/gov/states/tax/payroll/employer_additional_state_payroll_tax.py
index 0bbb5e52be0..c4fd5cc40cf 100644
--- a/policyengine_us/variables/gov/states/tax/payroll/employer_additional_state_payroll_tax.py
+++ b/policyengine_us/variables/gov/states/tax/payroll/employer_additional_state_payroll_tax.py
@@ -7,6 +7,7 @@
"de_employer_additional_state_payroll_tax",
"ma_employer_additional_state_payroll_tax",
"me_employer_additional_state_payroll_tax",
+ "mn_employer_additional_state_payroll_tax",
"or_employer_additional_state_payroll_tax",
"ri_employer_additional_state_payroll_tax",
"vt_employer_additional_state_payroll_tax",
@@ -22,8 +23,8 @@ class employer_additional_state_payroll_tax(Variable):
"Employer-side state payroll taxes and payroll-funded contributions "
"other than state unemployment insurance, including any part of a "
"permitted employee premium the employer does not deduct "
- "(employer_state_payroll_premium_deduction_share). Minnesota Paid "
- "Leave and the New York PFL and DBL employer costs are not modeled."
+ "(employer_state_payroll_premium_deduction_share). The New York PFL "
+ "and DBL employer costs are not modeled."
)
definition_period = YEAR
unit = USD
diff --git a/policyengine_us/variables/gov/states/tax/payroll/employer_total_additional_state_payroll_tax.py b/policyengine_us/variables/gov/states/tax/payroll/employer_total_additional_state_payroll_tax.py
index 2c41614b842..0966b78fc32 100644
--- a/policyengine_us/variables/gov/states/tax/payroll/employer_total_additional_state_payroll_tax.py
+++ b/policyengine_us/variables/gov/states/tax/payroll/employer_total_additional_state_payroll_tax.py
@@ -96,6 +96,14 @@ def formula(person, period, parameters):
+ (1 - deducted) * me_p.employee_rate * me_wages
)
+ # The premium and permitted employee rates depend on the small
+ # employer test (Minn. Stat. 268B.14, subd. 5a), which reads the same
+ # employer inputs as the per-worker path.
+ mn = (
+ person("mn_paid_leave_premium_rate", period)
+ - deducted * person("mn_paid_leave_permitted_employee_rate", period)
+ ) * person("employer_total_mn_paid_leave_taxable_wages", period)
+
or_p = parameters(period).gov.states["or"].tax.payroll.paid_leave
or_tax = where(
headcount >= or_p.employer_headcount_threshold,
@@ -135,11 +143,12 @@ def formula(person, period, parameters):
state_code == StateCode.DE,
state_code == StateCode.MA,
state_code == StateCode.ME,
+ state_code == StateCode.MN,
state_code == StateCode.OR,
state_code == StateCode.RI,
state_code == StateCode.VT,
state_code == StateCode.WA,
],
- [ca, co, dc, de, ma, me, or_tax, ri, vt, wa],
+ [ca, co, dc, de, ma, me, mn, or_tax, ri, vt, wa],
default=0,
)
diff --git a/policyengine_us/variables/input/employer_payroll.py b/policyengine_us/variables/input/employer_payroll.py
index 48b93d8f61e..55d364f553c 100644
--- a/policyengine_us/variables/input/employer_payroll.py
+++ b/policyengine_us/variables/input/employer_payroll.py
@@ -21,7 +21,10 @@ class employer_headcount(Variable):
label = "Employer headcount"
documentation = (
"Employer employee count used as a proxy for size-based payroll "
- "contribution rules, including paid leave and similar programs."
+ "contribution rules, including paid leave and similar programs. For "
+ "Minnesota Paid Leave's small employer rate it stands in for the "
+ "employer's highest quarterly employee count in the basis period "
+ "(Minn. Stat. 268B.14, subd. 5b)."
)
definition_period = YEAR
default_value = 100
@@ -40,12 +43,12 @@ class employer_state_payroll_premium_deduction_share(Variable):
"New York Paid Family Leave and Disability Benefits, the Vermont "
"Child Care Contribution and Washington Paid Family and Medical "
"Leave. 1, the default, deducts the full permitted share; 0 deducts "
- "nothing. Outside Minnesota and New York, whose employer cost is not "
- "modeled, the employer-side variables carry any part the employer "
- "does not deduct. For the state paid family and medical leave funds, "
- "the federal treatment of an employer's payment of the employee "
- "share as the employee's wages (Rev. Rul. 2025-4; Notice 2026-6) is "
- "not modeled. Values outside 0 to 1 are treated as the nearer bound."
+ "nothing. Outside New York, whose employer cost is not modeled, the "
+ "employer-side variables carry any part the employer does not deduct. "
+ "For the state paid family and medical leave funds, the federal "
+ "treatment of an employer's payment of the employee share as the "
+ "employee's wages (Rev. Rul. 2025-4; Notice 2026-6) is not modeled. "
+ "Values outside 0 to 1 are treated as the nearer bound."
)
unit = "/1"
definition_period = YEAR
diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml
index 6427e4fd8e9..f96f3162272 100644
--- a/source_conflicts/candidates.yaml
+++ b/source_conflicts/candidates.yaml
@@ -5557,6 +5557,78 @@ candidates:
note: Ruled 2026-11-02 for the statute. Subd. 2 sends the person to subd. 3(b) with no arrangement test, and the
manual's single-person lists do give the upgrade on arrangement B. mn_msa_payment_category reads the federal
arrangement only for the facility test.
+- id: us-mn:paid-leave-small-employer-average-wage
+ program: paid-family-medical-leave
+ years:
+ from: 2026
+ type: calendar
+ question: Does Minnesota compare its Paid Leave small employer wage limit with an employer's highest quarterly
+ covered wages divided by its highest quarterly count of wage records, or with that quotient divided by four again?
+ sources:
+ - kind: statute
+ citation: Minn. Stat. 268B.14, subds. 5a(a)(2) and 5c(a)
+ url: https://www.revisor.mn.gov/statutes/cite/268B.14
+ - kind: guidance
+ citation: DEED, Paid Leave small employer premium rate designation (2026 premiums)
+ url: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf
+ - kind: agency-practice
+ citation: Unemployment Insurance Minnesota, small employer premium rate page
+ url: https://mn.gov/uimn/employers/paid-leave/small-employer-premiums.jsp
+ readings:
+ statute: Under subd. 5c(a), an employer's average wage equals its highest quarterly covered wages divided by its
+ highest quarterly count of wage records. Subd. 5a(a)(2) sets the limit at 150 percent of the state's average
+ wage, and an average equal to that limit qualifies. In its designation notice, DEED computes the average the
+ same way and excludes only averages above $27,745.88 a quarter for 2026.
+ other: On its small employer page, Unemployment Insurance Minnesota (UIMN) calls that quotient an average annual
+ wage and divides it by four to get an average quarterly wage. UIMN states the test as less than 150 percent of
+ the statewide average, but in its last step it excludes only an average that exceeds the limit.
+ example: For 2026, an employer with 10 employees and $400,000 of covered wages in its highest-paid quarter averages
+ $40,000 under subd. 5c(a) and pays the full 0.88%. Under UIMN's steps, it would average $10,000, within the
+ $27,745.88 limit, and pay 0.66%.
+ pe_us:
+ follows: statute
+ code:
+ - policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_small_employer.py
+ - policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_employer_average_quarterly_wage.py
+ prs:
+ - https://github.com/PolicyEngine/policyengine-us/pull/10294
+ state: ruled
+ note: Ruled 2026-11-09 for the statute, which DEED follows in its notice. Users enter the subd. 5c(a) quotient with
+ no further division by four, and an average equal to the limit qualifies. On $100,000 of 2026 wages, an employer
+ that deducts the most it may from wages pays $440 of an $880 premium, against $220 of $660 under UIMN's steps.
+- id: us-mn:paid-leave-small-employer-wage-limit-cents
+ program: paid-family-medical-leave
+ years:
+ from: 2026
+ to: 2026
+ type: calendar
+ question: Does a 2026 average quarterly wage of $27,745.88 meet Minnesota's Paid Leave small employer wage test,
+ when 150 percent of DEED's $73,989 statewide average annual wage comes to $27,745.875 a quarter and DEED states
+ $27,745.88?
+ sources:
+ - kind: statute
+ citation: Minn. Stat. 268B.14, subd. 5a(a)(2)
+ url: https://www.revisor.mn.gov/statutes/cite/268B.14
+ - kind: guidance
+ citation: DEED, Paid Leave small employer premium rate designation (2026 premiums)
+ url: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf
+ readings:
+ statute: Subd. 5a(a)(2) sets the limit at 150 percent of the state's average wage and admits an average equal to
+ it, but doesn't say how to state the limit per quarter or round it. A quarter of 150 percent of $73,989 comes to
+ $27,745.875, and an average of $27,745.88 exceeds it.
+ other: DEED states the limit to the cent, $27,745.88, and excludes only averages above it, so an average of
+ $27,745.88 qualifies.
+ example: An employer with 10 employees and $277,458.80 of covered wages in its highest-paid quarter averages
+ $27,745.88. Against DEED's figure it pays 0.66%; against $27,745.875 it would pay 0.88%.
+ pe_us:
+ follows: gap-fill
+ code:
+ - policyengine_us/variables/gov/states/mn/tax/payroll/paid_leave/mn_paid_leave_small_employer.py
+ prs:
+ - https://github.com/PolicyEngine/policyengine-us/pull/10294
+ state: ruled
+ note: Ruled 2026-11-09 for DEED's figure, since the statute leaves the quarterly limit's rounding open. The model
+ rounds the limit half up to the cent, which reproduces $27,745.88, so an input of $27,745.88 meets it.
- id: us-mn:small-claim-of-right-repayment-deduction
program: income-tax
years:
diff --git a/source_conflicts/sources/us-mn/deed-small-employer-designation-2026.txt b/source_conflicts/sources/us-mn/deed-small-employer-designation-2026.txt
new file mode 100644
index 00000000000..cebeadef65a
--- /dev/null
+++ b/source_conflicts/sources/us-mn/deed-small-employer-designation-2026.txt
@@ -0,0 +1,104 @@
+Source: https://mn.gov/deed/assets/paid-leave-small-employer-premium-rate-designation-acc_tcm1045-716947.pdf
+Pages 1-2, text extracted with pdftotext (poppler), reading order.
+
+Minne sota Paid Leave
+
+Small employer premium rate designation
+
+Paid Leave premiums
+Much like private insurance, Paid Leave is funded through premiums that can be split between an employer and an
+employee. For most employers, the rate for 2026 will be 0.88% of wages paid to employees up to the Social Security
+withholding limit, rounded to the nearest thousand dollars (currently $185,000). Employers can deduct up to 0.44% of
+wages from employees for their portion of the premium.
+
+Small employer premium rate
+Small employers pay a lower premium rate under Paid
+Leave. The effective rate for small employers is 0.66%
+of wages up to the same Social Security withholding
+limit. Like large employers, small employers can
+deduct up to 0.44% of wages from employees for their
+portion of the premium.
+To qualify as a small employer, a business must:
+1. Have an employee count of 30 or fewer
+employees in each quarter during the basis
+period; and
+2. Have an average employee wage equal to or
+less than 150% of the statewide average
+wage. This is calculated from the quarter
+where you paid the most in wages.
+3. Meet wage detail reporting requirements
+throughout the basis period.
+
+How your rate was assessed
+To determine if an employer meets the statutory
+definition of a small employer, the following steps
+were applied for employers that were covered for the
+entirety of the basis period.
+1. Established employee count: This was accomplished by looking at the maximum number of employee records
+reported on a single wage detail during the basis period. If an employer reported more than 30 records in any
+quarter, they were not designated as a small employer.
+2. Calculated average wage: This was accomplished by identifying the quarter with the largest amount of covered
+wages and dividing those wages by the employee count. If this number was higher than $27,745.88, the
+employer was not designated as a small employer.
+3. Checked wage detail compliance: This was accomplished by reviewing wage detail reports across the basis
+period to ensure all reports were filed. If a report was not submitted, the employer was not designated as a
+small employer.
+Minnesota Paid Leave
+180 E 5th St, Suite 1200 | St. Paul, MN 55101 | paidleave.mn.gov
+
+Key Terms
+Basis Period
+The basis period is the four-quarter period ending September 30 of the prior year. For the purpose of 2026 premiums,
+this refers to the time period between October 1, 2024, and September 30, 2025.
+
+Statewide Average Wage
+The Statewide Average Wage is calculated annually by the Department of Employment and Economic Development
+based on annual covered employment wage records. The Statewide Average Annual Wage for 2025 was $73,989 per
+year, or $18,497.35 per quarter. 150% of that number is $27,745.88 per quarter.
+Percentage
+
+Statewide Average
+Weekly Wage
+
+Statewide Average
+Wage (Quarterly)
+
+Statewide Average
+Annual Wage
+
+100%
+
+$1,422.88
+
+$18,497.25
+
+$73,989.00
+
+150%
+
+$2,134.30
+
+$27,745.88
+
+$110,983.50
+
+Employee Count
+For each employer that has been covered by Paid Leave for the entirety of the basis period, the employee count is the
+maximum number of quarterly wage records reported by the employer during the basis period. In simpler terms, this
+means we use the quarter where an employer reported the highest number of employees to determine the size of a
+business.
+
+Average Wage
+For each employer that has been covered for the entirety of the basis period, the employer's average wage is calculated
+by first taking the maximum amount of covered wages reported by the employer in a single quarterly wage record
+during the basis period. This amount is divided by the maximum number of quarterly wage records reported by the
+employer during the basis period.
+
+Wage Detail Requirements
+Employers are required to submit wage detail on a quarterly basis through their Employer Account at uimn.org. If an
+employer has failed to report wages in one or more quarter, they cannot be designated as a small employer.
+
+Minnesota Paid Leave
+180 E 5th St, Suite 1200 | St. Paul, MN 55101 | paidleave.mn.gov
+
+
\ No newline at end of file
diff --git a/source_conflicts/sources/us-mn/minn-stat-268b14.html b/source_conflicts/sources/us-mn/minn-stat-268b14.html
new file mode 100644
index 00000000000..f4efa7a6166
--- /dev/null
+++ b/source_conflicts/sources/us-mn/minn-stat-268b14.html
@@ -0,0 +1,1416 @@
+
+
+
+
+
+
+
(a) Family and medical leave premiums accrue and become payable by each employer, except for an employer with an approved private plan under section 268B.10, for each calendar year on the taxable wages that the employer paid to employees in covered employment.
+
Each employer must pay premiums quarterly, at the premium rate defined under this section, on the taxable wages paid to each employee. The commissioner must compute the premium due from the wage detail report required under section 268B.12 and notify the employer of the premium due. The premiums must be paid to the family and medical benefit insurance account and must be received by the department on or before the last day of the month following the end of the calendar quarter.
+
(b) If for any reason the wages on the wage detail report under section 268B.12 are adjusted for any quarter, the commissioner must recompute the premiums due for that quarter and assess the employer for any amount due or credit the employer as appropriate.
Notwithstanding section 177.24, subdivision 4, or 181.06, subdivision 1, and subject to subdivision 6, employers must pay a minimum of 50 percent of the annual premiums paid under this section. Employees, through a deduction in their wages to the employer, must pay the remaining portion, if any, of the premium not paid by the employer. Such deductions for any given employee must be in equal proportion to the premiums paid based on the wages of that employee. Deductions under this section must not cause an employee's wage, after the deduction, to fall below the rate required to be paid to the employee by any applicable statute, regulation, rule, ordinance, or government resolution or policy, whichever rate of pay is greater.
The maximum wages subject to premium in a calendar year is equal to the maximum earnings in that year subject to the FICA Old-Age, Survivors, and Disability Insurance tax.
(a) Small employers are eligible for the premium rates provided by this subdivision if the employer:
+
(1) has 30 or fewer employees pursuant to subdivision 5b; and
+
(2) the average wage for that employer as calculated in subdivision 5c is less than or equal to 150 percent of the state's average wage in covered employment for the basis period.
+
(b) The premium rate for small employers eligible under this subdivision is 75 percent of the annual premium rate calculated in subdivisions 6 and 7, as follows:
+
(1) employers must pay a minimum of 25 percent of the rate calculated in subdivisions 6 and 7. Employers shall not deduct from any employees' pay to fund the employer portion of the premium; and
+
(2) employees must pay the remaining portion due under this subdivision, if any, of the premium not paid by the employer. The employer must make wage deductions as necessary under this subdivision to fund the employee portion of the premium.
(a) The basis period for determining premiums under:
+
(1) subdivision 5a;
+
(2) average employer wages under subdivision 5c; and
+
(3) eligibility for small employer assistance grants under section 268B.29 for any tax year shall be the four-quarter period ending September 30 of the prior year.
+
(b) For each employer that has been covered for the entirety of the basis period, the maximum number of quarterly wage records reported by the employer during the basis period shall be used to determine premiums under subdivision 5a and eligibility for small employer assistance grants under section 268B.29.
+
(c) For any employer not covered for the entirety of the basis period, the number of employees used to determine premiums under subdivision 5a and eligibility for small employer assistance grants under section 268B.29 shall be based on the number of employees working in Minnesota the employer estimates they will employ in the following calendar year.
+
(d) If upon a review of the actual number of wage records reported, it is found that a new employer's estimate at time of registration was ten percent or more less than the actual number of records reported, the employer's premiums under subdivision 5a and eligibility for small employer assistance grants under section 268B.29 shall be recalculated based on the wage records reported.
(a) For each employer that has been covered for the entirety of the basis period, the employer's average wage shall be calculated by dividing the maximum amount of covered wages reported by the employer in a single quarterly wage record during the basis period by the maximum number of quarterly wage records reported by the employer during the basis period.
+
(b) For any employer not covered for the entirety of the basis period, the employer's average wage shall by calculated by dividing the employer's estimated amount of covered wages in the following tax year by the employer's estimated number of employees working in Minnesota the employer will employ in the following calendar year.
+
(c) If upon a review of the actual amount of covered wages reported it is found that a new employer's estimate at time of registration was ten percent or more less than the actual amount of covered wages, the employer's premiums under subdivision 5a and eligibility for small employer assistance grants under section 268B.29 shall be recalculated based on the wage records reported.
The employer premium rates beginning January 1, 2026, shall be as follows:
+
(1) for an employer participating in both family and medical benefit programs, 0.7 percent;
+
(2) for an employer participating in only the medical benefit program and with an approved private plan for the family benefit program, 0.4 percent; and
+
(3) for an employer participating in only the family benefit program and with an approved private plan for the medical benefit program, 0.3 percent.
The commissioner may adjust the annual premium rates pursuant to this section prior to January 1, 2026. By July 31, 2026, and then by July 31 of each year thereafter, the commissioner must adjust the annual premium rates for the following calendar year based on program historical experience and sound actuarial principles and so that the projected fund balance as a percentage of total program expenditure does not fall below 25 percent. The commissioner shall contract with a qualified independent actuarial consultant to conduct an actuarial study for this purpose no less than every year. A copy of all actuarial studies, and any revisions or other documents received that relate to an actuarial study, must be provided promptly to the chairs and ranking minority members of the legislative committees with jurisdiction over this chapter. All actuarial studies, and any revisions or other documents received that relate to an actuarial study, must also be filed with the Legislative Reference Library in compliance with section 3.195. A qualified independent actuarial consultant is one who is a Fellow of the Society of Actuaries (FSA) and a Member of the American Academy of Actuaries (MAAA) and who has experience directly relevant to the analysis required. In no year shall the annual premium rate exceed 1.1 percent of taxable wages paid to each employee.
+ Official Publication of the State of Minnesota
+ Revisor of Statutes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source_conflicts/sources/us-mn/uimn-small-employer-premiums.txt b/source_conflicts/sources/us-mn/uimn-small-employer-premiums.txt
new file mode 100644
index 00000000000..8c0358a425a
--- /dev/null
+++ b/source_conflicts/sources/us-mn/uimn-small-employer-premiums.txt
@@ -0,0 +1,56 @@
+Source: https://mn.gov/uimn/employers/paid-leave/small-employer-premiums.jsp
+Page fetched 2026-11-09, text extracted with pandoc 3.11 (-f html -t plain --wrap=none).
+
+Small employer premium rate
+
+Rate reductions for small employers
+
+Your Paid Leave premium rate is calculated annually. If your business meets certain statutory requirements, you will automatically be assigned the reduced small employer premium rate on your annual Paid Leave Premium Rate Notice.
+
+Your total Paid Leave premium rate will be used to calculate the amount in Paid Leave premiums you need to pay based on your quarterly taxable wages.
+
+ ----------------------- --------------------
+ Employer type Total premium rate
+ Regular employer rate 0.88%
+ Small employer rate 0.66%
+ ----------------------- --------------------
+
+ : Table showing regular and small employer rates {.align-center width="auto" border="2"}
+
+Employers can learn more about Paid Leave premium rates, including withholding requirements, by visiting Premium rate and contributions / Minnesota Paid Leave.
+
+Calculating potential qualification for the small employer premium rate
+
+There are two requirements under Minnesota law to be automatically assigned the small employer premium rate:
+
+- You must have 30 or fewer employees
+- Your average employee wage must be less than 150 percent of the statewide average annual wage.
+
+- How we calculate whether you had 30 or fewer employees
+
+ To calculate whether you had 30 or fewer employees, we review your wage detail reports for the four-quarter period that ended September 30 of the previous year.
+
+ - Quarters with more than 30 wage records reported: If you reported more than 30 wage records during any calendar quarter during the review period, you will not be automatically assigned the small employer premium rate.
+ - Missing wage detail reports: If you have an overdue wage detail report, you will not be automatically assigned the small employer premium rate.
+ - Employers with multiple accounts under the same FEIN: For employers who have a Joint UI/Paid Leave account as well as a Paid Leave-ONLY account under the same FEIN, we will review your combined employee count. If your combined count of wage records exceeds 30 records during any calendar quarter during the review period, you will not be automatically assigned the small employer premium rate.
+
+- How we calculate your average employee wage
+
+ To calculate whether your average employee wage is less than 150 percent of the statewide average, we review your wage detail reports for the four-quarter period that ended September 30 of the previous year. Then we:
+
+ 1. Determine the maximum amount of gross wages you reported for any calendar quarter.
+ 2. Determine the maximum number of wage records you reported for any calendar quarter.
+ 3. Divide your maximum gross wages by your maximum wage record count to calculate your average annual wage.
+ 4. Divide your average annual wage by four to calculate your average quarterly wage.
+
+ Then, we calculate whether your average quarterly wage exceeds 150 percent of the statewide average wage. The statewide average wage is recalculated annually based on statewide employment records.
+
+ For employers who have a Joint UI/Paid Leave account as well as a Paid Leave-ONLY account under the same FEIN, we will review your average wage across both accounts to determine whether you should be automatically assigned the small employer premium rate.
+
+- Requesting a review of your Paid Leave premium rate
+
+ If we do not automatically assign the small employer premium rate to your account, and you think you qualify based on the requirements above, you can follow the instructions on your determination to file an appeal. More information on how to appeal can be found on the Paid Leave website: https://pl.mn.gov/contact/appeals
+
+- If you have questions on your premium rate
+
+ If you believe your premium rate is incorrect or have questions about your premium rate, contact Paid Leave for assistance. To reach the Paid Leave Contact Center by phone, call 651-556-7777 or 844-556-0444 (toll-free). To reach the Paid Leave Contact Center by email, contact them at paidleave@state.mn.us.