This document profiles the budget of the Commission on Higher Education (CHED) — the government’s body for regulating and developing higher education — across nine fiscal years, FY 2018 to FY 2026. CHED is a large, multi-billion-peso agency, but it carries the same data constraint as several commissions: usable program-level execution records were not available, so this review pairs the proposed-to-enacted budget at the program level with budget utilization measured at the agency aggregate.
Because the program-by-program execution chain cannot be traced, the emphasis is on what CHED’s budget is composed of, how Congress adjusts it, and — at the whole-agency level — how much of what is released actually gets obligated and paid out.
Three features define CHED’s budget. First, it is, in budget terms, a free-tuition fund: a single program — student subsidies, dominated by Universal Access to Quality Tertiary Education (UAQTEA) — is about 96% of the money, while CHED’s own regulatory mandate is a rounding error. Second, the budget has not grown: it was ₱49.4B in 2018 and ₱47.5B in 2026, essentially flat across nine years. Third, it is extraordinarily volatile — Congress has swung the enacted budget from +₱37B above the proposal (2018) to −₱20B below it (2022) — and a persistent gap between what is released and what is spent makes weak execution its defining operational problem.
CHED is a large but stagnant budget. Enacted funding was ₱49.4B in 2018 and ₱47.5B in 2026 — essentially flat over nine years, having peaked around ₱50B (2018–2021) and bottomed near ₱31B (2022–2023).
In budget terms, CHED is a free-tuition fund. Student-subsidy programs are about 96% of the 2026 budget, and a single P/A/P — Universal Access to Quality Tertiary Education (UAQTEA) — is ₱37.6B, about 79% of the whole agency on its own.
Its regulatory mandate is a rounding error. Quality assurance and regulation — CHED’s core statutory job — is about 2% of the budget (~₱1.1B), with administration and support another 2%.
Congress reshapes CHED violently. It added +₱37B in 2018 (when free higher education was first funded, against a ₱12B proposal), cut ₱20B in 2022, and added +₱14B in 2026 — swings far larger than most agencies’ entire budgets.
Execution is strikingly weak. Cash utilization (disbursements-to-allotment) is often just 40–60%; large unspent balances build up on the free-tuition line year after year.
CHED is, on paper, a regulator; in budget terms, it is a machine for disbursing free tuition — one that is not growing, swings wildly with each budget cycle, and pays out well under two-thirds of what it is given. The pressing questions are why the money is not reaching students, and whether a flat budget can sustain a demand-driven entitlement.
Period. FY 2018 through FY 2026 for the proposed (NEP) and enacted (GAA) budget, at the P/A/P level. Agency-level execution (Allotments, Obligations, Disbursements) covers FY 2011–2025.
No program-level execution. Usable FAR No. 1 (SAAODB) records were not available for CHED, so there is no P/A/P-level absorption analysis. Utilization is shown only at the agency aggregate — the gap this review would most like to close, given how central the execution question is for CHED.
Two bases, not directly comparable. The NEP/GAA figures are current-year new appropriations only. The execution figures are DBM’s published agency aggregates, which combine all available funds — new, automatic, and continuing appropriations. This distinction matters especially for CHED, because unspent free-tuition balances carry forward as continuing appropriations. The two series should not be read one-to-one.
A single home. CHED has been an Other Executive Office (attached to the Office of the President) throughout the period, so there is no reclassification to reconcile and its four-program structure is stable — the budget series is directly comparable across all years.
Expense classes. Personnel Services (PS), Maintenance & Other Operating Expenses (MOOE), Capital Outlays (CO). Units are PHP billions throughout.
evo <- totals %>% filter(metric %in% c("NEP","GAA")) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA"), labels = c("NEP (proposed)","GAA (enacted)")))
ggplot(evo, aes(year, total, color = metric, group = metric)) +
geom_line(linewidth = 1.0) + geom_point(size = 2) +
scale_color_manual(values = exec_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2018, 2026, 2)) +
labs(title = "CHED current-year appropriations, FY 2018–2026",
subtitle = "No net growth in nine years (~₱47–49B), but a violent 2022 trough and a wide proposal-to-enacted gap",
x = NULL, y = NULL, caption = "Current-year new appropriations. Source: DBM NEP & GAA.") +
theme_ched() + guides(color = guide_legend(nrow = 1))
Two things stand out. There is no net growth: CHED is about ₱47B in both 2018 and 2026, having peaked near ₱50B (2018–2021) and dropped to about ₱31B in 2022–2023. And the enacted (GAA) line swings hugely around the proposal (NEP) — most dramatically in 2018, when the proposal was only ₱12B but the enacted budget was ₱49B, and in 2022, when a ₱52B proposal was cut to ₱32B. CHED’s budget is as much a product of the legislature as of the Executive.
totals %>% filter(metric %in% c("NEP","GAA")) %>% mutate(value = total/1e9) %>%
select(year, metric, value) %>% pivot_wider(names_from = year, values_from = value) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA"))) %>% arrange(metric) %>% rename(`PHP B` = metric) %>%
kbl_clean(font = 13, digits = 1, format.args = list(big.mark = ","), na = "")
| PHP B | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| NEP | 12.4 | 49.5 | 39.7 | 49.6 | 51.5 | 29.9 | 29.7 | 30.1 | 33.1 |
| GAA | 49.4 | 51.5 | 46.8 | 50.5 | 31.7 | 30.9 | 36.7 | 33.3 | 47.5 |
gap <- totals %>% filter(metric %in% c("NEP","GAA")) %>% pivot_wider(names_from = metric, values_from = total) %>%
mutate(change = GAA - NEP, direction = ifelse(change >= 0, "Net increase (GAA > NEP)", "Net decrease (GAA < NEP)"))
ggplot(gap, aes(year, change/1e9, fill = direction)) +
geom_col(width = 0.7) +
geom_text(aes(label = sprintf("%+.1f", change/1e9), vjust = ifelse(change >= 0, -0.4, 1.2)), size = 3.1, color = "grey20") +
scale_fill_manual(values = c("Net increase (GAA > NEP)" = "#1B9E77", "Net decrease (GAA < NEP)" = "#D95F02")) +
scale_x_continuous(breaks = 2018:2026) +
scale_y_continuous(labels = function(v) paste0(peso, v, "B"), expand = expansion(mult = c(0.14, 0.16))) +
labs(title = "Enacted minus proposed (GAA − NEP), PHP billions",
subtitle = "Enormous swings: +₱37B in 2018 (free HE first funded), −₱20B in 2022, +₱14B in 2026",
x = NULL, y = NULL) +
theme_ched() + guides(fill = guide_legend(nrow = 1))
The scale of these adjustments is unusual. The +₱37B in 2018 reflects the first funding of free higher education — the Executive proposed ₱12B, and Congress raised the enacted budget to ₱49B. The −₱20B in 2022 was the reverse: a ₱52B proposal cut to ₱32B. For a multi-year entitlement like free tuition, swings of this size are extremely hard to plan around.
aug <- df_long %>% filter(metric %in% c("NEP","GAA")) %>%
group_by(pap, year, metric) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = metric, values_from = amount, values_fill = 0) %>%
mutate(delta = GAA - NEP) %>% group_by(pap) %>% summarise(delta = sum(delta), .groups = "drop")
aug_plot <- bind_rows(aug %>% slice_max(delta, n = 6), aug %>% slice_min(delta, n = 4)) %>%
filter(abs(delta) > 1e8) %>%
mutate(dir = ifelse(delta >= 0, "Increased by Congress", "Cut by Congress"),
pap = factor(pap, levels = pap[order(delta)]))
ggplot(aug_plot, aes(delta/1e9, pap, fill = dir)) +
geom_col(width = 0.72) +
geom_text(aes(label = sprintf("%+.1f", delta/1e9), hjust = ifelse(delta >= 0, -0.12, 1.12)), size = 3, color = "grey20") +
scale_fill_manual(values = c("Increased by Congress" = "#1B9E77", "Cut by Congress" = "#D95F02")) +
scale_x_continuous(labels = function(v) paste0(peso, v, "B"), expand = expansion(mult = c(0.18, 0.18))) +
scale_y_discrete(labels = function(x) str_wrap(str_trunc(x, 54), 34)) +
labs(title = "P/A/Ps most changed by Congress, cumulative FY 2018–2026 (GAA − NEP)",
subtitle = "The free-tuition line (UAQTEA) absorbs nearly all of both the additions and the cuts",
x = NULL, y = NULL) +
theme_ched() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"),
axis.text.y = element_text(size = 9, lineheight = 0.9)) +
guides(fill = guide_legend(nrow = 1))
Because the free-tuition line is so much larger than everything else, it is also where nearly all of Congress’s adjustments land — both the big additions and the 2022 cut flow through UAQTEA. The smaller scholarship, subsidy, and regulatory lines are adjusted only at the margins.
comp <- df_long %>% filter(metric == "GAA", year <= 2026, !is.na(amount), !is.na(category)) %>%
group_by(year, category) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(category = factor(category, levels = names(cat_pal)))
ggplot(comp, aes(year, amount, fill = category)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = cat_pal, labels = function(x) str_wrap(x, 32)) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2018, 2026, 2)) +
labs(title = "Composition of the GAA by PREXC program, 2018–2026",
subtitle = "Student subsidies are ~96% of the budget; regulation and administration are a thin band",
x = NULL, y = NULL) +
theme_ched() + guides(fill = guide_legend(nrow = 2, byrow = TRUE)) +
theme(legend.text = element_text(size = 9), legend.key.size = unit(0.4, "cm"))
The green Higher Education Development & Student Subsidies program is essentially the whole budget — about 96% in 2026. What CHED is best known for as an institution — regulation and quality assurance (purple) — is a sliver, alongside administration and support. In budget terms, CHED’s regulatory function and its subsidy function are almost entirely different in scale: the agency spends the overwhelming majority of its money moving tuition subsidies to students, not regulating institutions.
ec_levels <- c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)","Capital Outlays (CO)")
comp_ec <- df_long_all %>% filter(metric == "GAA", year <= 2026, expense_class %in% c("1PS","2MOOE","6CO")) %>%
group_by(year, expense_class) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(expense_class = factor(expense_class, levels = c("1PS","2MOOE","6CO"), labels = ec_levels))
ggplot(comp_ec, aes(year, amount, fill = expense_class)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = ec_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2018, 2026, 2)) +
labs(title = "GAA composition by expense class, 2018–2026",
subtitle = "Almost entirely MOOE — tuition subsidies and grants classify as operating expenses",
x = NULL, y = NULL) +
theme_ched() + guides(fill = guide_legend(nrow = 1))
CHED is an overwhelmingly MOOE agency: because tuition subsidies and grants book as operating expenses, maintenance-and-operating spending dominates, with a thin personnel line and little capital. The expense-class mix simply mirrors the program mix — this is a budget for transferring money to and on behalf of students.
top_paps <- pap_year %>% filter(year == 2026, !is.na(GAA), GAA > 0) %>% arrange(desc(GAA)) %>%
slice_head(n = 8) %>% mutate(pap = factor(pap, levels = rev(pap)))
ggplot(top_paps, aes(pap, GAA)) +
geom_col(fill = bar_fill, width = 0.72) +
geom_text(aes(label = php_b(GAA)), hjust = -0.1, size = 3.2, color = "grey20") +
coord_flip() + scale_x_discrete(labels = function(x) str_wrap(x, 50)) +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, .22)), limits = c(0, NA)) +
labs(title = "Largest P/A/Ps by FY 2026 GAA",
subtitle = "Universal Access to Quality Tertiary Education (₱37.6B) is about 79% of the agency on its own",
x = NULL, y = NULL) +
theme_ched() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))
The concentration is extreme: UAQTEA (₱37.6B) — free tuition at state universities and colleges — is nearly four-fifths of the entire agency, dwarfing the next lines: the Tulong Dunong grant program (₱2.7B), other scholarships and incentives (₱2.2B), post-graduate and medical scholarships (~₱1B each). CHED’s regulatory and monitoring lines do not appear until far down the list.
pap_year %>% filter(year == 2026, !is.na(GAA)) %>%
left_join(pap_year %>% filter(year == 2025) %>% transmute(pap, GAA25 = GAA), by = "pap") %>%
transmute(`P/A/P` = pap, `NEP 2026 (B)` = NEP/1e9, `GAA 2026 (B)` = GAA/1e9,
`GAA 2025 (B)` = GAA25/1e9, `Net add 2026 (B)` = (GAA - NEP)/1e9) %>%
arrange(desc(`GAA 2026 (B)`)) %>%
dt_table(page = 10, money_cols = c("NEP 2026 (B)","GAA 2026 (B)","GAA 2025 (B)","Net add 2026 (B)"))
With no program-level execution data, utilization can only be read at the agency aggregate, and on a different basis from the appropriations above (all available funds, not just current-year new appropriations). On that basis CHED’s execution is strikingly weak — a chronic gap between money released and money spent.
el <- exec %>% select(year, Allotments, Obligations, Disbursements) %>%
pivot_longer(-year, names_to = "stage", values_to = "amount") %>% filter(!is.na(amount)) %>%
mutate(stage = factor(stage, levels = c("Allotments","Obligations","Disbursements")))
ggplot(el, aes(year, amount, color = stage, group = stage)) +
geom_line(linewidth = 1.0) + geom_point(size = 2) +
scale_color_manual(values = exec_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = seq(2011, 2025, 2)) +
labs(title = "Budget execution, FY 2011–2025 (all available funds)",
subtitle = "A wide, persistent gap between allotments and disbursements — much of the money is not paid out in-year",
x = NULL, y = NULL, caption = "Includes new, automatic & continuing appropriations; not comparable to the NEP/GAA series.") +
theme_ched() + guides(color = guide_legend(nrow = 1))
The gap between the allotment line and the disbursement line is the story: large sums are released but not spent within the year, and they accumulate as unspent balances that carry forward. For a program meant to pay tuition on students’ behalf each semester, that persistent lag is the central concern.
absorp_long <- exec %>% select(year, oblig_allot, disb_oblig, disb_allot) %>%
pivot_longer(-year, names_to = "ratio", values_to = "value") %>% filter(!is.na(value)) %>%
mutate(ratio = factor(ratio, levels = c("oblig_allot","disb_oblig","disb_allot"),
labels = c("Obligations / Allotment","Disbursements / Obligations","Disbursements / Allotment")))
ggplot(absorp_long, aes(year, value, color = ratio, group = ratio)) +
geom_line(linewidth = 0.9) + geom_point(size = 2) +
scale_color_manual(values = absorp_pal) +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0.3, 1.0), breaks = seq(0.3, 1, 0.1)) +
scale_x_continuous(breaks = seq(2011, 2025, 2)) +
labs(title = "CHED absorptive capacity, FY 2011–2025",
subtitle = "Cash utilization runs low and erratic — disbursements-to-allotment is often just 40–60%",
x = NULL, y = NULL) +
theme_ched() + guides(color = guide_legend(nrow = 1))
CHED’s absorption is both low and erratic. Disbursement-to-allotment has ranged from the high-30s to the high-60s percent, sitting in the 40–60% band in most years — meaning that in a typical year, roughly half of what is released is not actually disbursed. Obligation rates are steadier but still volatile. Whatever the causes — eligibility verification, enrolment timing, coordination with state universities, or reporting lags — the result is that a large, flat budget is delivering considerably less to students than its headline suggests.
exec %>% transmute(Year = year, `Allotments (B)` = Allotments/1e9, `Obligations (B)` = Obligations/1e9,
`Disbursements (B)` = Disbursements/1e9, `O/A` = oblig_allot, `D/O` = disb_oblig, `D/A` = disb_allot) %>%
dt_table(page = 15, money_cols = c("Allotments (B)","Obligations (B)","Disbursements (B)"),
pct_cols = c("O/A","D/O","D/A"))
PHP billions, all-funds basis. O/A = obligations ÷ allotment; D/O = disbursements ÷ obligations; D/A = disbursements ÷ allotment. Not comparable to the NEP/GAA appropriations series above.
Underlying data: DBM NEP & GAA documents (current-year new appropriations, P/A/P level), FY 2018–2026; DBM-published execution aggregates (all available funds, agency level), FY 2011–2025. CHED has been an Other Executive Office (attached to the Office of the President) throughout the period. No FAR No. 1 (P/A/P-level execution) was available for CHED, so absorption is reported only at the agency aggregate, on a basis not directly comparable to the appropriations series; note that unspent free-tuition balances carry forward as continuing appropriations. Prepared as the long-form companion to the CHED budget briefing.