Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Working Tax Credit and Child Tax Credit

WTC and CTC were jointly administered by HMRC (and historically DWP-routed on legacy migrations). PolicyEngine UK groups them under gov.dwp.tax_credits because the means-test logic is shared. The combined household award is the variable tax_credits, which sums the two with a minimum-payment floor:

amount = wtc_pre_minimum + ctc_pre_minimum
tax_credits = where(amount < min_benefit, 0, amount)

Parameters live in policyengine_uk/parameters/gov/dwp/tax_credits/ and the formulas in policyengine_uk/variables/gov/dwp/.

Working Tax Credit (WTC)

WTC was paid to working-age adults whose hours and income met the eligibility test. PolicyEngine computes it via wtc_entitlement, which is the maximum WTC amount minus the shared tax_credits_reduction from the means test, gated by the would_claim_WTC take-up input.

Elements (gov.dwp.tax_credits.working_tax_credit.elements)

ElementParameterNotes
Basicbasic.yamlFlat amount everyone meeting the hours test gets
Couplecouple.yamlCouple addition
Lone parentlone_parent.yamlLone-parent addition
30-hourworker.yamlAwarded when total hours hit the higher band
Disabled workerdisabled.yaml
Severely disabled workerseverely_disabled.yaml
Childcare capchildcare_1.yaml, childcare_2.yaml, childcare_coverage.yaml70% of approved childcare costs up to the weekly cap (one or two-plus children)

Hours test

The min_hours tree (min_hours/default.yaml, lower.yaml, old_age.yaml, couple_with_children.yaml) encodes the bands that gate WTC eligibility — typically 30 hours/week for adults with no kids, 16 for lone parents, with a lower band for over-60s.

Child Tax Credit (CTC)

CTC supported families with children regardless of whether anyone in the benunit worked. PolicyEngine computes it via ctc_entitlement, gated by would_claim_CTC.

Elements (gov.dwp.tax_credits.child_tax_credit.elements)

ElementParameter
Familyfamily_element.yaml (extinct from 2017 for new claims)
Per qualifying childchild_element.yaml
Disabled child additiondis_child_element.yaml
Severely disabled child additionsevere_dis_child_element.yaml

Two-child limit

Since April 2017 the child element has been restricted to the first two qualifying children. The child_count parameter under child_tax_credit/limit/ encodes this, and born_before (6 April 2017, Tax Credits Act 2002 s.9(3A)) sets which children it applies to: those born before it are exempt, compared on date_of_birth. A few specific exceptions (non-consensual conception, multiple births, kinship care) also apply in law but are not modelled; gov/contrib/two_child_limit/ holds reform options such as an age-based exemption.

Qualifying child tests

A child counts towards CTC if they are under 16, or under 20 and in approved education or training and meet the qualifying-young-person conditions. These tests are exposed as a family of *_for_child_tax_credit variables (is_child_for_child_tax_credit, meets_qualifying_young_person_*_for_child_tax_credit).

Shared means test

WTC and CTC share a single income test in gov.dwp.tax_credits.means_test:

threshold = ctc_only ? income_threshold_CTC_only : income_threshold
overage = max(0, tax_credits_applicable_income - threshold)
reduction = overage * income_reduction_rate

tax_credits_applicable_income is the benunit’s total income net of specific disregards (pension contributions, certain benefits). The non-earned disregard for unearned income is the means_test/non_earned_disregard.yaml parameter. Awards below min_benefit (a £26-ish floor) are paid as zero.

Scheme end

From 2025-04-06 onwards the tax_credits variable returns zero unconditionally — the active parameter flips off and the formula short-circuits with an empty array. The remaining caseload was migrated to Universal Credit via the DWP/HMRC managed-migration programme finalised on 5 April 2025.

The reported variables (working_tax_credit_reported, child_tax_credit_reported) remain available for historical analysis, and the take-up flags (would_claim_WTC, would_claim_CTC) continue to be populated stochastically when the dataset is built so historical years still match published caseload aggregates.

References