Apprenticeship Levy Hub

Apprenticeship Levy Activity Dashboard

A comprehensive view of levy utilisation, fund expiry risk, and training spend across Legal and Business Services pathways - built to support data-driven workforce decisions.

-Total Levy Received
-Total Spend
-Remaining Balance
-Lifetime Utilisation
POLICY ALERT: From August 2026, unused levy funds will expire after 12 months (previously 24). The forecast below applies the new rule.
Total Levy In
Across 2017-2026
Total Levy Spend
Legal Spend
Business Services Spend
Transfers Out
Funds transferred
Expired Funds
Lost to expiry
Remaining Balance
Available funds
Cumulative Utilisation
Spend / Levy in (lifetime)
Funds Expiring (12 mo)
Next 12 months at risk

Monthly Levy In vs Spend vs Expired

Trend analysis - completion-payment spikes indicate apprentice end-point assessments

Levy Utilisation by Financial Year

% of levy received that has been spent in-year

Cumulative Levy Position

Running totals - watch the gap between levy in and balance

Spend Split: Legal vs Business Services

Lifetime spend by course category

Fund Expiry Forecast

Projected expiry of unspent levy under FIFO. From Aug 2026, the 12-month window applies.

Legal vs Business Services - Monthly

Spend split trend

Financial Year Summary (UK FY: Apr-Mar)

Cumulative totals and KPI flags. Red = high expiry risk; yellow = sub-30% utilisation; green = healthy.
FYLevy InAdjSpendLegalBus SvcsExpiredTransfersUtilisation %Cum LevyCum SpendStatus

Power BI Build Guide

Technical specification and step-by-step build instructions for replicating this dashboard in Microsoft Power BI - including the data model, every DAX measure, and full calculation logic.

1. Scope & Objectives

What the report delivers and the questions it answers.

The dashboard provides a comprehensive view of UK Apprenticeship Levy activity to support data-driven decision making. Specifically, it answers:

  • How much levy have we received, spent, transferred, lost to expiry, and have remaining?
  • How is utilisation tracking by financial year and is it improving?
  • How is spend split between Legal and Business Services training pathways?
  • Which months show cost spikes (typically driven by Completion Payments at end-point assessment)?
  • How much of our current balance is at risk of expiring in the next 12-24 months under the new policy?
Decision lens: Every visual should let an HR leader answer "should we be spending more, transferring more, or onboarding more apprentices this quarter?"

2. Business Assumptions & Rules

The rules that govern how levy transactions behave - these drive every calculation.

2.1 Transaction Type Semantics

Transaction TypeSignBusiness meaning
LevyPositiveMonthly levy declaration paid in by the employer.
Levy adjustment+ or -HMRC correction to a previous levy declaration.
Monthly paymentNegativeRoutine monthly payment to a training provider.
Completion paymentNegativeFinal 20% payment on successful end-point assessment.
Balance paymentNegativeTrue-up of outstanding cost on funding band.
TransfersNegativeFunds transferred out (up to 50% annual levy).
Expired levyNegativeFunds removed by HMRC after the policy window.

2.2 Expiry Policy

Policy change: Funds entering before 1 Aug 2026 expire 24 months after entry. Funds entering on or after 1 Aug 2026 expire 12 months. FIFO consumption.

2.3 Course Categorisation

  • Legal: course name contains Paralegal, Solicitor, or Legal.
  • Business Services: all other courses (HR, Project, Accounting, Customer Service, Management, Compliance, Financial Services).

2.4 Financial Year

UK FY: 1 April to 31 March. Format FY2025/26.

3. Data Model Design

Star schema: one fact, three dimensions.

TableTypePurpose
FactTransactionsFactOne row per levy account event.
DimDateDimDate intelligence and FY grouping.
DimTransactionTypeDimGroup types into Income / Outflow / Adjustment.
DimCourseDimLegal vs Business Services split.

Step 1 - Import & Shape Data (Power Query)

Get the raw CSV into a clean, typed fact table.

1Get Data → Text/CSV, select Apprenticeship_Levy_Sample_Dataset.csv, click Transform Data.
2Rename the query to FactTransactions.
3Set column types: Transaction Date → Date, Total → Decimal Number, all others → Text.
4Replace blank strings with null in Training Provider, Apprentice, Course.
5Rename columns to remove spaces: TransactionDate, TransactionType, TrainingProvider, Apprentice, Course, Total.
6Add a Custom Column CourseCategory:
if [Course] = null then "Unallocated"
else if Text.Contains([Course],"Paralegal") or Text.Contains([Course],"Solicitor") or Text.Contains([Course],"Legal")
     then "Legal"
else "Business Services"
7Click Close & Apply.

Step 2 - Build the Date Table

Modeling → New Table.

-- DimDate: continuous date dimension with UK FY
DimDate =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2017, 1, 1 ), DATE ( 2030, 3, 31 ) ),
    "Year",        YEAR ( [Date] ),
    "MonthNum",    MONTH ( [Date] ),
    "MonthName",   FORMAT ( [Date], "MMM" ),
    "YearMonth",   FORMAT ( [Date], "yyyy-MM" ),
    "FYStartYear", IF ( MONTH ( [Date] ) >= 4, YEAR ( [Date] ), YEAR ( [Date] ) - 1 ),
    "FY",
        "FY" & IF ( MONTH ( [Date] ) >= 4, YEAR ( [Date] ), YEAR ( [Date] ) - 1 )
              & "/" & RIGHT ( IF ( MONTH ( [Date] ) >= 4, YEAR ( [Date] ) + 1, YEAR ( [Date] ) ), 2 ),
    "FYMonthIndex",
        MOD ( MONTH ( [Date] ) - 4 + 12, 12 ) + 1,
    "FYQuarter",
        "Q" & ( QUOTIENT ( MOD ( MONTH ( [Date] ) - 4 + 12, 12 ), 3 ) + 1 )
)
1Mark DimDate as a date table.
2Sort MonthName by MonthNum.

Step 3 - Course Category & Transaction Type

DimCourseCategory =
DATATABLE (
    "CourseCategory", STRING, "CategoryOrder", INTEGER,
    {
        { "Legal", 1 },
        { "Business Services", 2 },
        { "Unallocated", 3 }
    }
)

DimTransactionType =
DATATABLE (
    "TransactionType", STRING, "Bucket", STRING, "SignConvention", STRING,
    {
        { "Levy",               "Income",     "Positive" },
        { "Levy adjustment",    "Adjustment", "Mixed" },
        { "Monthly payment",    "Spend",      "Negative" },
        { "Completion payment", "Spend",      "Negative" },
        { "Balance payment",    "Spend",      "Negative" },
        { "Transfers",          "Transfer",   "Negative" },
        { "Expired levy",       "Expired",    "Negative" }
    }
)

Step 4 - Create Relationships

FromToCardinality
FactTransactions[TransactionDate]DimDate[Date]Many-to-one, single direction
FactTransactions[TransactionType]DimTransactionType[TransactionType]Many-to-one, single direction
FactTransactions[CourseCategory]DimCourseCategory[CourseCategory]Many-to-one, single direction
Validation: In Model view all arrows point from dimension to fact. No bidirectional filters.

Step 5 - Core Measures

The seven headline KPIs. Drop all measures into a hidden _Measures table.

-- 1. Total Levy In
Total Levy In :=
CALCULATE ( SUM ( FactTransactions[Total] ),
    FactTransactions[TransactionType] = "Levy" )

-- 2. Total Levy Adjustments
Total Levy Adjustments :=
CALCULATE ( SUM ( FactTransactions[Total] ),
    FactTransactions[TransactionType] = "Levy adjustment" )

-- 3. Total Levy Spend
Total Levy Spend :=
CALCULATE ( -1 * SUM ( FactTransactions[Total] ),
    FactTransactions[TransactionType] IN
        { "Monthly payment", "Completion payment", "Balance payment" } )

-- 4-5. Category splits
Legal Spend :=
CALCULATE ( [Total Levy Spend], FactTransactions[CourseCategory] = "Legal" )

Business Services Spend :=
CALCULATE ( [Total Levy Spend], FactTransactions[CourseCategory] = "Business Services" )

-- 6. Transfers
Transfer Funds :=
CALCULATE ( -1 * SUM ( FactTransactions[Total] ),
    FactTransactions[TransactionType] = "Transfers" )

-- 7. Expired
Expired Funds :=
CALCULATE ( -1 * SUM ( FactTransactions[Total] ),
    FactTransactions[TransactionType] = "Expired levy" )

-- 8. Remaining Balance
Remaining Balance :=
VAR LevyIn  = [Total Levy In] + [Total Levy Adjustments]
VAR Outflow = [Total Levy Spend] + [Transfer Funds] + [Expired Funds]
RETURN LevyIn - Outflow

-- 9. % Utilisation
% Utilisation :=
DIVIDE ( [Total Levy Spend], [Total Levy In] + [Total Levy Adjustments], 0 )

-- 10. % Leakage
% Leakage :=
DIVIDE ( [Expired Funds] + [Transfer Funds], [Total Levy In] + [Total Levy Adjustments], 0 )

Step 6 - Trend & Variance Measures

-- Cumulative measures
Cumulative Levy In :=
CALCULATE ( [Total Levy In],
    FILTER ( ALL ( DimDate ), DimDate[Date] <= MAX ( DimDate[Date] ) ) )

Cumulative Spend :=
CALCULATE ( [Total Levy Spend],
    FILTER ( ALL ( DimDate ), DimDate[Date] <= MAX ( DimDate[Date] ) ) )

Cumulative Expired :=
CALCULATE ( [Expired Funds],
    FILTER ( ALL ( DimDate ), DimDate[Date] <= MAX ( DimDate[Date] ) ) )

Running Balance :=
CALCULATE ( [Remaining Balance],
    FILTER ( ALL ( DimDate ), DimDate[Date] <= MAX ( DimDate[Date] ) ) )

-- Completion Spike Flag (cohort throughput signal)
Completion Spike Flag :=
VAR ThisMonth =
    CALCULATE ( -1 * SUM ( FactTransactions[Total] ),
        FactTransactions[TransactionType] = "Completion payment" )
VAR Avg6 =
    CALCULATE (
        AVERAGEX (
            VALUES ( DimDate[YearMonth] ),
            CALCULATE ( -1 * SUM ( FactTransactions[Total] ),
                FactTransactions[TransactionType] = "Completion payment" )
        ),
        DATESINPERIOD ( DimDate[Date], MAX ( DimDate[Date] ), -6, MONTH )
    )
RETURN IF ( ThisMonth > 1.5 * Avg6 && ThisMonth > 0, 1, 0 )

-- Year on year
Spend YoY % :=
VAR Cur = [Total Levy Spend]
VAR Prv = CALCULATE ( [Total Levy Spend], DATEADD ( DimDate[Date], -1, YEAR ) )
RETURN DIVIDE ( Cur - Prv, Prv, BLANK () )

-- FY status
FY Utilisation Status :=
VAR U = [% Utilisation]
RETURN SWITCH ( TRUE (),
    U >= 0.40, "Healthy",
    U >= 0.25, "Watch",
    "Low" )

Step 7 - Expiry Forecast Model

Approach: Allocate spend against levy pots in FIFO order. Each pot's expiry uses 24 months (entry < 1 Aug 2026) or 12 months (entry ≥ 1 Aug 2026). Residual on a pot whose expiry is in the future is "at risk".

7.1 Calculated table - LevyPots

LevyPots =
VAR Levies =
    SELECTCOLUMNS (
        FILTER ( FactTransactions, FactTransactions[TransactionType] = "Levy" ),
        "EntryDate", FactTransactions[TransactionDate],
        "PotAmount", FactTransactions[Total]
    )
RETURN
ADDCOLUMNS (
    Levies,
    "ExpiryMonths", IF ( [EntryDate] >= DATE ( 2026, 8, 1 ), 12, 24 ),
    "ExpiryDate",   EDATE ( [EntryDate], IF ( [EntryDate] >= DATE ( 2026, 8, 1 ), 12, 24 ) )
)

7.2 FIFO consumption measure

Pot Remaining :=
VAR Today      = TODAY ()
VAR PotEntry   = SELECTEDVALUE ( LevyPots[EntryDate] )
VAR PotAmount  = SELECTEDVALUE ( LevyPots[PotAmount] )
VAR PotExpiry  = SELECTEDVALUE ( LevyPots[ExpiryDate] )
VAR CumCapacityToThisPot =
    CALCULATE ( SUM ( LevyPots[PotAmount] ),
        FILTER ( ALL ( LevyPots ), LevyPots[EntryDate] <= PotEntry ) )
VAR TotalDrain =
    CALCULATE ( -1 * SUM ( FactTransactions[Total] ),
        FactTransactions[TransactionType] IN
            { "Monthly payment", "Completion payment", "Balance payment", "Transfers" },
        FactTransactions[TransactionDate] <= Today )
VAR PriorCapacity = CumCapacityToThisPot - PotAmount
VAR DrainedFromThisPot =
    MIN ( PotAmount, MAX ( 0, TotalDrain - PriorCapacity ) )
VAR Remaining = PotAmount - DrainedFromThisPot
RETURN IF ( PotExpiry >= Today, Remaining, 0 )

7.3 Forecast horizons

Funds Expiring Next 12 Months :=
SUMX (
    FILTER ( LevyPots,
        LevyPots[ExpiryDate] >= TODAY ()
            && LevyPots[ExpiryDate] <= EDATE ( TODAY (), 12 ) ),
    [Pot Remaining] )

Funds Expiring Next 24 Months :=
SUMX (
    FILTER ( LevyPots,
        LevyPots[ExpiryDate] >= TODAY ()
            && LevyPots[ExpiryDate] <= EDATE ( TODAY (), 24 ) ),
    [Pot Remaining] )

Forecast Expiring This Period :=
SUMX (
    FILTER ( LevyPots,
        LevyPots[ExpiryDate] >= MIN ( DimDate[Date] )
            && LevyPots[ExpiryDate] <= MAX ( DimDate[Date] )
            && LevyPots[ExpiryDate] >= TODAY () ),
    [Pot Remaining] )

Step 8 - Page 1: Executive Overview

VisualTypeField
KPI cardsCardTotal Levy In, Spend, Legal, Business Services, Transfers, Expired, Remaining Balance
% UtilisationKPI gaugeValue=[% Utilisation], Target=0.95
Funds at risk (12m)Card[Funds Expiring Next 12 Months]
FY summaryMatrixRows=FY, Values=all core measures + Status
SlicersSlicerFY, TrainingProvider, CourseCategory

Step 9 - Page 2: Trend Analysis

VisualTypeField
Monthly Levy vs Spend vs ExpiredStacked column + lineColumns=Levy In/Spend/Expired, Line=Completion
Cumulative PositionAreaCumulative Levy In / Spend / Expired
% Utilisation by FYColumn + target[% Utilisation], target 95%
YoY Spend ChangeWaterfall[Spend YoY %]
Completion SpikeConditional columnBackground by [Completion Spike Flag]

Step 10 - Page 3: Expiry Forecast

VisualTypeField
Funds at risk (12m / 24m)CardsThe two horizon measures
Expiry scheduleColumnAxis=ExpiryDate (Month), Value=[Pot Remaining]
Policy switch markerConstant lineX = 1 Aug 2026
Pot detailTableEntryDate, PotAmount, ExpiryMonths, ExpiryDate, [Pot Remaining]

Step 11 - Page 4: Legal vs Business Services

VisualTypeField
Lifetime splitDonutLegend=CourseCategory, Value=Spend
Monthly trendLineLegend=CourseCategory, Value=Spend
Provider breakdownTreemapGroup=Provider, Detail=Category
Top 10 coursesBarTop N=10
Apprentice countCardDISTINCTCOUNT(Apprentice)

Metric Library - Business & Calculation Logic

Reference for every metric. Use as the canonical specification when migrating to production data.

Total Levy In Core
The total levy paid in from the employer's PAYE bill. Topline funding pool.
Logic: Sum of Total where TransactionType = "Levy".
Total Levy Adjustments Core
HMRC corrections to previous declarations. Indicates payroll restatements.
Logic: Sum of Total where TransactionType = "Levy adjustment". Can be + or -.
Total Levy Spend Core
All money paid for active apprenticeship training. Excludes transfers and expiry.
Logic: -1 × SUM(Total) where TransactionType in {Monthly, Completion, Balance}.
Legal Spend Split
Spend on Legal pathway (Paralegal, Solicitor, Legal Services).
Logic: [Total Levy Spend] filtered to CourseCategory = "Legal".
Business Services Spend Split
Spend on Business Services courses (HR, PM, Accounting, etc.).
Logic: [Total Levy Spend] filtered to CourseCategory = "Business Services".
Transfer Funds Core
Levy transferred to another employer (up to 50% annual cap).
Logic: -1 × SUM(Total) where TransactionType = "Transfers".
Expired Funds Core Risk
Levy removed by HMRC unused within policy window. Pure financial leakage.
Logic: -1 × SUM(Total) where TransactionType = "Expired levy".
Remaining Balance Core
Funds available in the digital account at the date being viewed.
Logic: (Levy In + Adjustments) - (Spend + Transfers + Expired).
% Utilisation KPI
Productive use of levy - primary efficiency KPI, target 95%+.
Logic: Spend ÷ (Levy In + Adjustments). Healthy ≥40%, Watch 25-40%, Low <25%.
% Leakage
Share of levy lost to expiry or transfer. Inverse health signal.
Logic: (Expired + Transfers) ÷ (Levy In + Adjustments).
Cumulative Levy In / Spend / Expired Trend
Running lifetime totals. Gap between Cum Levy In and Cum Spend is the loaded balance.
Logic: CALCULATE([base], FILTER(ALL(DimDate), Date ≤ MAX(Date))).
Completion Spike Flag Insight
Months where Completion Payments exceed 150% of trailing 6-month average - signal of cohort throughput and likely precursor to new intake.
Logic: 1 if month Completion > 1.5 × AVG(last 6 months Completion).
Spend YoY %
Year-on-year growth in training spend.
Logic: (Current - Prior) ÷ Prior using DATEADD(-1, YEAR).
Funds Expiring Next 12 / 24 Months Forecast
Forward-looking risk - how much levy will evaporate if not deployed.
Logic: SUMX of [Pot Remaining] over pots with ExpiryDate in horizon. 24-month window for entries before 1 Aug 2026, 12-month after.
Pot Remaining Forecast
Per-pot unspent amount after FIFO consumption against all spends and transfers to date.
Logic: PotAmount - MIN(PotAmount, MAX(0, TotalDrain - PriorCapacity)). Zeroed if expired.
FY Utilisation Status KPI
Stoplight classification per FY for matrix conditional formatting.
Logic: SWITCH on % Utilisation - ≥40% Healthy / ≥25% Watch / else Low.

Governance, Refresh & QA

Refresh

  • Frequency: Monthly, aligned with HMRC levy account update (~22nd).
  • Source: Manage Apprenticeships service CSV export.
  • Gateway: Personal for prototype; on-prem with RLS for production.

Data Quality Checks

  1. Row count vs source CSV - exact match.
  2. Sum of Total reconciles to HMRC statement.
  3. No null TransactionDate or Total.
  4. TransactionType values within the seven known types.
  5. Remaining Balance matches HMRC digital account within £1.
  6. LevyPots row count = count of "Levy" rows in fact.

Performance

  • Star schema; sub-second queries under 1M rows.
  • Pot Remaining is O(N²) worst case - materialise FIFO as a calculated table for > 100k rows.
  • Avoid bidirectional filters.

Security

  • Apprentice names are PII - RLS so only HR Ops sees individual names.
  • Mask Apprentice column at report layer for non-HR audiences.