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.

Firm-level VAT (planned)

Why firm-level VAT?

Household-side VAT in PolicyEngine answers the question “what does this household pay in VAT on the goods and services it buys?” but it can’t answer policy questions framed at the business side:

Closing those questions needs a separate entity that carries turnover, sector, and registration status, and variables for input/output VAT and net liability.

Scope

Phase 1: minimum viable product

  1. Firm entity with the bare attributes needed for the threshold and rate questions: firm_turnover, firm_industry_sector, firm_vat_registered. Firms are linked to households for sole traders and partnerships (unincorporated business income flows already exist in the FRS) and stand alone for incorporated entities.

  2. Registration threshold logic: a firm must register if its taxable turnover is more than a new gov.hmrc.vat.firm.registration_threshold parameter, or it can register voluntarily. The threshold has been £90,000 since 1 April 2024.

  3. Standard / reduced / zero-rated supply split at the firm level, driven by sector-specific share parameters.

  4. firm_vat_on_sales (output VAT) and firm_vat_on_purchases (input VAT), each computed from share-based decompositions of turnover and intermediate consumption.

  5. firm_net_vat_liability = output VAT − input VAT.

Phase 2: distributional refinements

Phase 3: incidence

Implementation plan

Entity

A new Firm entity in policyengine_uk/entities.py next to the existing Household, BenUnit, Person:

Firm = build_entity(
    key="firm",
    plural="firms",
    label="Firm",
    doc="A business entity that may register for VAT.",
    roles=[
        {
            "key": "owner",
            "plural": "owners",
            "label": "Owner",
            "doc": "Person who owns the firm.",
        }
    ],
    containing_entities=[],
)

The containing_entities set deliberately does not include household because incorporated firms have no household; the link for sole traders is via an explicit firm_owning_household_id input variable rather than entity nesting. (The existing Household and BenUnit entities list a "state" containing entity, but PolicyEngine UK has no state entity, so the firm should not copy it.) In policyengine-core only people can be members of a group entity, so the owner role holds people. Core also places each person in exactly one instance of every group entity, so a person cannot own two firms and everyone belongs to some firm: a situation that lists firms gives anyone it leaves out a one-person firm, one that lists households but no firms puts all its people in a single firm, and a dataset build must assign every person a firm. The design therefore needs a way to represent people who own no firm and incorporated firms with no owner in the data.

Variables

Under a new variables/gov/hmrc/vat/firm/ tree:

The household-side vat variable stays untouched; the two sides only meet in Phase 3.

Parameters

A new tree under parameters/gov/hmrc/vat/firm/:

Tests

Data needs

This is the harder half of the project. Summary of where each Phase 1 component sits against our current data:

ComponentPublic sourceFRS coverageDatalab source
Firm turnover distributionONS UK business: activity, size and locationsole-trader / partnership profit (not turnover) via FRS self-employment incomeHMRC Datalab: anonymised VAT returns
Industry sectorSIC codes from ONS Inter-Departmental Business Register (IDBR)main- or last-job SIC 2007 division only (sic_industry_division); no firm-level sectorHMRC Datalab
VAT registration shareHMRC VAT statistics (annual)not in FRSHMRC Datalab
Input VAT sharesONS Supply and Use tablesnot applicableHMRC Datalab

Proposed imputation approach

  1. Build a synthetic firm panel weighted to ONS UK business: activity, size and location counts by SIC sector and turnover band.

  2. Attach to each firm a registration status, supply split, and intermediate-consumption ratio drawn from HMRC VAT statistics and ONS Supply and Use tables.

  3. Calibrate the panel so that summed firm_net_vat_liability matches the HMRC VAT receipts outturn for the year.

  4. For sole traders and partnerships, link the synthetic firm row back to the FRS household that owns it via self-employment income.

The companion repo policyengine/uk-vatlab hosts the firm-level VAT analysis files linked from #1333.

Effort estimate

Open questions

References