Overview

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.

1 Executive summary

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.

2 A note on the data

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.

3 The aggregate budget

3.1 Large, flat, and volatile

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

3.2 Where Congress adjusts the budget

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.

3.3 Which P/A/Ps does Congress augment?

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.

4 Where the money goes

4.1 Composition by PREXC program

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.

4.2 Composition by expense class

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.

4.3 The largest P/A/Ps

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.

Full P/A/P ranking, FY 2026 (interactive)

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)"))

5 Overall budget utilization

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.

5.1 Execution over time

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.

5.2 Absorptive capacity

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.

Execution at a glance (interactive)

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.

6 Questions for discussion

  1. A regulator that mostly disburses subsidies. About 96% of CHED’s budget is student subsidies; quality assurance and regulation — its statutory core — is around 2%. Is the balance between funding higher education and governing it the right one?
  2. Why isn’t the money reaching students? Only ~40–60% of the allotment is disbursed in-year, and unspent free-tuition balances build up. What is causing the lag — eligibility processing, enrolment timing, coordination with SUCs — and how much reaches students late or not at all?
  3. Flat funding, rising demand. The budget has not grown since 2018 while enrolment and costs have risen. Can a flat appropriation sustain a demand-driven entitlement like free higher education, and what gives if it cannot?
  4. Living with volatility. A +₱37B / −₱20B swing between years is hard to plan around for a multi-year commitment. How should a tuition-subsidy program be budgeted so that funding is predictable for students and institutions?
  5. What would program-level execution data show? With no FAR No. 1, we can see that CHED’s overall disbursement lags badly, but not which subsidy or scholarship lines are stalling. Program-level records would show exactly where the free-tuition money is getting stuck.

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.