CFR
CFR has a transparency file which is released alongside the CFR data.
Get the data
CFR is the framework by which local authority schools submit their data to DfE. Data is submitted via an online form, as in AAR. Local authorities do their own checks on CFR data as they are responsible for funding LA schools, in contrast to academies who are funded directly from DfE. Schools have a deadline to submit their returns and not all schools submit at the same time, so product owners in FBIT make a call as to when enough schools have submitted, and that frozen “cut” of the submission tables is what gets used in FBIT. FBIT combines this financial with other data sources in the data pipeline. CFR uses inputs from the data sources page. The data sources page links to where to source these files:
- CFR_24-25_Data.csv
- gias.csv
- gias_links.csv
- census_pupils.csv
- census_workforce.csv
- sen.csv
- sen2_estab_caseload.csv
- cdc.csv
- ks2.csv
- ks4.csv
- ILR R06 cut with FSM and EHCP.xlsx
- hospital_schools.csv
- pru.csv
- lookup_la.csv
Test the data pipeline runs locally
- Set up the pipeline locally.
- Add the new data to the relevant year folder in Azure
- Configure the schemas for the new files in
data-pipeline.src.pipeline.input_schemas - Run the pipeline to test the new data. Debug and fix any issues, eg misconfigured schemas.
- After configuration, run the pipeline successfully
- Run the LAA risk scores derivation pipeline: Once the CFR run is complete, trigger the LAA calculations locally (see running the pipeline locally for trigger formats) to verify that school risk scores are generated and loaded correctly.
- Check that the pipeline has deposited rows in SQL by querying the database tables for schools (fill in the year):
SELECT * FROM [dbo].[Financial] WHERE RunId like '<year>' AND RunType like 'default'
SELECT * FROM [dbo].[NonFinancial] WHERE RunId like '<year>' AND RunType like 'default'
Check the outputs
To assure the quality of the CFR ingestion pipeline, specific logical checks targeting Federated Schools must be performed to prevent double-counting.
1. Federated School Aggregations & View Exclusions
Maintained schools in a federation submit their financial data under a combined return led by a single “lead” school.
-
The Logic:
- The lead school’s database record holds the aggregated financial and workforce metrics (e.g., pupil numbers, FTE, total expenditure) for the entire federation.
- Member schools have individual entries pointing to the lead school’s URN, but their financial metrics are empty or non-applicable in the final views to avoid duplicate counts.
-
Checks:
- Identify a federation in the raw
maintained_schools_master_list.csvor by searching for schools with a non-zero “Lead school in federation” LAEstab. - Query the database to ensure the lead school contains the aggregated metrics, and member schools have
FederationLeadURNpointing to the lead school’s URN. - Execute a validation query against views
030-SchoolsFinancialSummary.sqland031-SchoolsWorkforceSummary.sqlto confirm that non-lead federation schools are correctly filtered out using:
WHERE s.FederationLeadURN = s.URN -- lead schoolORs.FederationLeadURN IS NULL -- not federated
- Identify a federation in the raw
-
SQL Verification Query:
-- Checking federation topology and lead school mappings SELECT URN, SchoolName, FederationLeadURN, TotalExpenditure FROM [dbo].[School] s JOIN [dbo].[Financial] f ON s.URN = f.URN WHERE (s.FederationLeadURN = '<LeadURN>' OR s.URN = '<LeadURN>') AND f.RunId = '<year>';
2. Transparency File DNS & Federation Flags Check
- Checks:
- Validate that the CFR Transparency File generator correctly tags member schools with the “DNS” (Did Not Submit) or federated submission status where their financials are combined into the lead school.
- Check that the sum of the transparency file’s school expenditures matches the totals computed on the FBIT database for active lead schools.
Completeness checks compared to last year
-- Compare total maintained school counts and coverage percentage of key fields against the previous year's run
SELECT
f_curr.RunId AS Run,
Count(f_curr.URN) AS Total_Schools,
Count(f_curr.KS2Progress) * 100 / Count(*) AS KS2_coverage,
Count(f_curr.KS4Progress) * 100 / Count(*) AS KS4_coverage,
Count(f_curr.TotalPupils) * 100 / Count(*) AS Pupils_coverage,
Count(f_curr.TeachersFTE) * 100 / Count(*) AS Teachers_coverage,
Count(f_curr.TotalInternalFloorArea) * 100 / Count(*) AS CDC_Floor_coverage,
Count(f_curr.PercentFreeSchoolMeals) * 100 / Count(*) AS FSM_coverage,
Count(f_curr.PercentSpecialEducationNeeds) * 100 / Count(*) AS SEN_coverage
FROM [dbo].[NonFinancial] f_curr
WHERE f_curr.RunId = '2025' AND f_curr.RunType = 'default' AND f_curr.FinanceType = 'Maintained'
GROUP BY f_curr.RunId
UNION ALL
SELECT
f_prev.RunId AS Run,
Count(f_prev.URN) AS Total_Schools,
Count(f_prev.KS2Progress) * 100 / Count(*) AS KS2_coverage,
Count(f_prev.KS4Progress) * 100 / Count(*) AS KS4_coverage,
Count(f_prev.TotalPupils) * 100 / Count(*) AS Pupils_coverage,
Count(f_prev.TeachersFTE) * 100 / Count(*) AS Teachers_coverage,
Count(f_prev.TotalInternalFloorArea) * 100 / Count(*) AS CDC_Floor_coverage,
Count(f_prev.PercentFreeSchoolMeals) * 100 / Count(*) AS FSM_coverage,
Count(f_prev.PercentSpecialEducationNeeds) * 100 / Count(*) AS SEN_coverage
FROM [dbo].[NonFinancial] f_prev
WHERE f_prev.RunId = '2024' AND f_prev.RunType = 'default' AND f_prev.FinanceType = 'Maintained'
GROUP BY f_prev.RunId;
Gotchas
- Find all the ancillary data used in the CFR release in
get_cfr_ancillary_data(). - LAA Risk Derivations: Remember to trigger LAA risk derivations right after CFR runs successfully. Verify that both denormalised target tables (
LASchoolRiskIndicatorsandLASchoolRiskIndicatorsHeaders) are populated and match the expectations in the LAA Risk Indicator Validation block. - Dealing with federations is a complex part of CFR. Do some spot checks on federated maintained schools to check their numbers are being handled correctly.
- CFR test plans