The Special Purpose Funds are lump-sum appropriations in the General Appropriations Act that aren’t tied to a specific agency when the budget passes. The DBM parcels them out to departments during the year, through Special Allotment Release Orders, as claims and needs arise. Two of them are essentially formulaic: the Allocation to Local Government Units, which is the constitutionally-mandated LGU share, and Budgetary Support to Government Corporations, the subsidies and equity for GOCCs. This report sets those two aside and looks at what’s left, the discretionary lump sums: pensions, civilian and uniformed salary adjustments, the calamity and contingent funds, military modernisation, and a handful of smaller funds.
These matter for two reasons. They hand the executive a large pool of money to allocate after the budget is enacted, which moves real spending decisions out of the appropriations debate and into in-year releases. And Congress has been cutting them in the GAA, year after year, even as it inflated the standby Unprogrammed Appropriations far above the President’s proposal. Read alongside the Unprogrammed Appropriations review, the two tell one story about where control over lump-sum money has moved.
The data cover FY 2011 to 2027: fund-level proposed (NEP) and enacted (GAA) amounts, and allotment releases broken down by fund and recipient department.
yrs <- 2011:2027
bars <- agg %>% select(Year, `NEP (proposed)` = NEP, `GAA (enacted)` = GAA) %>%
pivot_longer(-Year, names_to = "series", values_to = "amount") %>%
mutate(series = factor(series, levels = c("NEP (proposed)", "GAA (enacted)")),
Year = factor(Year, levels = yrs)) %>% filter(!is.na(amount))
line <- agg %>% filter(!is.na(Releases)) %>%
transmute(Year = factor(Year, levels = yrs), Releases, series = "Releases")
ggplot() +
geom_col(data = bars, aes(Year, amount, fill = series),
position = position_dodge(width = 0.8), width = 0.72) +
geom_line(data = line, aes(Year, Releases, group = 1, colour = series), linewidth = 0.9) +
geom_point(data = line, aes(Year, Releases, colour = series), size = 1.9) +
scale_fill_manual(values = spf_pal[c("NEP (proposed)", "GAA (enacted)")]) +
scale_colour_manual(values = c("Releases" = unname(spf_pal["Releases"]))) +
scale_x_discrete(drop = FALSE) +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, 0.05))) +
labs(x = NULL, y = NULL,
title = "Congress enacts the lump sums below the proposal, year after year",
subtitle = "Lump-sum Special Purpose Funds: proposed (NEP) and enacted (GAA) as bars, released as the line",
caption = str_c("Excludes the LGU and GOCC transfers. FY 2027 shows the NEP only (GAA not yet enacted). ",
"FY 2026 releases are as of August; all others full-year.")) +
theme_spf() +
guides(fill = guide_legend(order = 1), colour = guide_legend(order = 2)) +
theme(axis.text.x = element_text(size = 9))
The enacted lump sums have grown, from about PHP 141.6B in 2011 to PHP 322.9B in 2025, but the dark GAA bar sits below the light NEP bar in almost every year. Congress consistently enacts these funds below what the President proposes. The released amount, the orange line, tracks the enacted level fairly closely, closer than the Unprogrammed Appropriations ever do, because most of this money is committed spending: pensions that must be paid and salary adjustments already granted.
The gap between proposal and enactment runs the opposite way to the Unprogrammed Appropriations. There, Congress added. Here, it cuts.
gap <- agg %>% filter(!is.na(GAA)) %>%
transmute(Year, gap = GAA - NEP, dir = ifelse(gap >= 0, "Congress added", "Congress cut"))
ggplot(gap, aes(factor(Year), gap, fill = dir)) +
geom_col(width = 0.7) +
geom_hline(yintercept = 0, color = "grey40") +
geom_text(aes(label = ifelse(abs(gap) >= 20e9, php_b(gap), ""),
vjust = ifelse(gap >= 0, -0.4, 1.3)), size = 3, fontface = "bold") +
scale_fill_manual(values = gap_pal) +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0.14, 0.08))) +
labs(x = NULL, y = "Enacted minus proposed",
title = "Congress cut the lump-sum funds in 15 of 16 years",
subtitle = "Enacted (GAA) less proposed (NEP) lump-sum Special Purpose Funds, by fiscal year",
caption = "Negative = Congress enacted the funds below the President's proposal; positive = above it.") +
theme_spf()
The pattern is steady and it deepened under Marcos. Congress trimmed the lump-sum funds by PHP 141.7B in 2023 and PHP 236.8B in 2024, the two largest cuts on record. Those are the same two years Congress inflated the Unprogrammed Appropriations most. The money didn’t disappear; it moved. Cutting the executive’s discretionary lump sums and building up a congressionally-shaped standby fund are two sides of the same shift in who controls post-enactment spending.
Twelve funds make up the total, but two of them, both personnel-related, account for most of it.
ff <- fund_tot %>% filter(!is.na(Releases), Releases > 0) %>%
mutate(Fund = short_fund(Fund)) %>% arrange(desc(Releases))
ggplot(ff, aes(reorder(Fund, Releases), Releases)) +
geom_col(fill = "#E6550D", width = 0.72) +
geom_text(aes(label = php_b(Releases)), hjust = -0.1, size = 3) +
coord_flip(clip = "off") +
scale_x_discrete(labels = function(x) str_wrap(x, 30)) +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, 0.16))) +
labs(x = NULL, y = NULL,
title = "Pensions and salary adjustments are the lump-sum budget",
subtitle = "Total releases by fund, FY 2011 to 2026",
caption = "From the allotment releases. The Priority Development Assistance Fund (PDAF) appears through FY 2013 only.") +
theme_spf()
The Pension and Gratuity Fund, which pays the pensions of retired military and uniformed personnel, released PHP 1,713.5B over the period, more than half the total on its own. The Miscellaneous Personnel Benefits Fund, which covers salary adjustments and new positions across the government, released PHP 824.9B. After those two, the funds thin out fast: the Calamity and Contingent funds, AFP modernisation, and the long tail of smaller and now-defunct funds, including the Priority Development Assistance Fund, the pork barrel abolished after 2013. The full fund-level detail, with proposed, enacted, and released amounts, is below.
spf_ng %>% filter(Year <= 2026) %>% group_by(Fund) %>%
summarise(NEP = sum(NEP, na.rm = TRUE), GAA = sum(GAA, na.rm = TRUE), .groups = "drop") %>%
left_join(rel %>% group_by(Fund) %>% summarise(Releases = sum(Release), .groups = "drop"), by = "Fund") %>%
mutate(`Released / GAA` = Releases / GAA) %>%
arrange(desc(Releases)) %>%
transmute(Fund, `NEP` = NEP / 1e3, `GAA` = GAA / 1e3,
`Releases` = Releases / 1e3, `Released / GAA`) %>%
dt_table(page = 12, money_cols = c("NEP", "GAA", "Releases"),
pct_cols = "Released / GAA",
caption = "Lump-sum Special Purpose Funds by fund, FY 2011–2026 totals (PHP thousand). NEP left, GAA right.")
Amounts in PHP thousand, summed FY 2011–2026. “Released / GAA” over 100% means the fund was released above its enacted total across the period.
The FY 2027 NEP proposes PHP 344.8B in lump-sum funds, again led by the two personnel funds.
spf_ng %>% filter(Year == 2027, !is.na(NEP), NEP > 0) %>%
arrange(desc(NEP)) %>%
transmute(Fund, `NEP (proposed)` = NEP / 1e3) %>%
dt_table(page = 12, money_cols = "NEP (proposed)",
caption = "FY 2027 proposed lump-sum Special Purpose Funds (PHP thousand).")
Amounts in PHP thousand. The FY 2027 GAA is not yet enacted.
Most of these funds release at or below their enacted amount. A few don’t. In several years the Contingent Fund and the Calamity Fund were released well past their GAA, topped up from savings, continuing appropriations, and other sources during the year.
over <- spf_ng %>% inner_join(rel_fy, by = c("Fund", "Year")) %>%
filter(!is.na(GAA), GAA > 0) %>% mutate(rate = Release / GAA) %>%
filter(rate > 1) %>% arrange(desc(rate)) %>%
mutate(lab = paste0(short_fund(Fund), ", ", Year))
ggplot(over, aes(reorder(lab, rate), rate)) +
geom_col(fill = "#54278F", width = 0.68) +
geom_text(aes(label = percent(rate, accuracy = 1)), hjust = -0.15, size = 3, fontface = "bold") +
geom_hline(yintercept = 1, linetype = "dotted", color = "grey45") +
coord_flip(clip = "off") +
scale_y_continuous(labels = percent, expand = expansion(mult = c(0, 0.14))) +
labs(x = NULL, y = "Releases as a share of the enacted fund",
title = "When the Contingent and Calamity funds blow past their ceiling",
subtitle = "Fund-years where releases exceeded the enacted (GAA) amount",
caption = "From the appropriations and releases. Overruns are funded from savings, continuing appropriations, and augmentation.") +
theme_spf()
The Contingent Fund is the clearest case. In 2017 it carried a PHP 5.5B appropriation but released PHP 12.4B, more than double. The Calamity Fund, now the National Disaster Risk Reduction and Management Fund, ran over its ceiling in 2011, 2014, 2017, and 2020, all years with major disasters. That these funds can be topped up mid-year is the point of having them, but it’s also the transparency concern: the enacted number understates what actually gets spent, and the topping-up is decided by the executive after the budget is passed.
Releases are allotted to implementing departments. Totalling them over three periods, roughly the Aquino, Duterte, and Marcos budget years, shows a concentration that barely moves.
periods <- c("2011–2016", "2017–2022", "2023–2026")
pdp <- rel %>%
mutate(period = case_when(FY >= 2011 & FY <= 2016 ~ periods[1],
FY >= 2017 & FY <= 2022 ~ periods[2],
FY >= 2023 & FY <= 2026 ~ periods[3], TRUE ~ NA_character_),
Dept = str_extract(Department, "\\(([^)]+)\\)$") %>% str_remove_all("[()]"),
Dept = coalesce(Dept, str_trunc(Department, 26))) %>%
filter(!is.na(period), !is.na(Release))
ord <- pdp %>% group_by(Dept) %>% summarise(t = sum(Release), .groups = "drop") %>%
arrange(t) %>% pull(Dept)
dept_top <- tail(ord, 10)
dept_per <- pdp %>% filter(Dept %in% dept_top) %>%
group_by(Dept, period) %>% summarise(Release = sum(Release), .groups = "drop") %>%
mutate(Dept = factor(Dept, levels = dept_top), period = factor(period, levels = periods))
ggplot(dept_per, aes(Dept, Release, fill = period)) +
geom_col(position = position_dodge(width = 0.78), width = 0.72) +
coord_flip(clip = "off") +
scale_fill_manual(values = setNames(c("#BDBDBD", "#F16913", "#54278F"), periods)) +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, 0.06))) +
labs(x = NULL, y = NULL,
title = "Defence and interior dominate every period",
subtitle = "Total lump-sum Special Purpose Fund releases by department, three periods",
caption = str_c("From the allotment releases. Top 10 departments by total release across FY 2011–2026. ",
"FY 2026 releases are as of August, so the latest period is partial.")) +
theme_spf()
dtot <- pdp %>% group_by(Dept) %>% summarise(t = sum(Release), .groups = "drop")
deped_early <- pdp %>% filter(Dept == "DepEd", period == periods[1]) %>% summarise(s = sum(Release)) %>% pull(s)
The concentration barely moves. The Department of National Defense (PHP 1,141.3B) and the Department of the Interior and Local Government (PHP 853.2B) lead in every period, together about two-thirds of all releases, driven by uniformed-personnel pensions, the military under DND, the police, fire, and jail services under DILG, plus AFP modernisation at Defence. Both grew into the 2017–2022 period and stayed high. The one real shift is at Education, which took the largest non-uniformed share in 2011–2016, about PHP 195.0B from the school-building fund, then dropped away as that fund wound down. The full period breakdown by department is below.
rel %>%
mutate(period = case_when(FY >= 2011 & FY <= 2016 ~ "2011–2016",
FY >= 2017 & FY <= 2022 ~ "2017–2022",
FY >= 2023 & FY <= 2026 ~ "2023–2026", TRUE ~ NA_character_)) %>%
filter(!is.na(period), !is.na(Release)) %>%
group_by(Department, period) %>% summarise(Release = sum(Release) / 1e3, .groups = "drop") %>%
pivot_wider(names_from = period, values_from = Release, values_fill = 0) %>%
mutate(Total = `2011–2016` + `2017–2022` + `2023–2026`) %>%
arrange(desc(Total)) %>%
dt_table(page = 10, money_cols = c("2011–2016", "2017–2022", "2023–2026", "Total"),
caption = "Lump-sum Special Purpose Fund releases by department and period (PHP thousand).")
Amounts in PHP thousand. FY 2026 releases are as of August, so the 2023–2026 column is partial.
The lump-sum Special Purpose Funds are less contested than the Unprogrammed Appropriations, and for most of them that’s warranted. Pensions and salary adjustments are obligations the government has to meet, and a lump-sum appropriation is a reasonable way to budget for them when the exact per-agency split isn’t known at enactment.
The concern is narrower. Some of these funds, the Contingent and Calamity funds above all, are released well beyond their enacted amount, topped up during the year from savings and other sources at the executive’s discretion. The enacted figure, the one Congress debates and votes on, understates what actually flows. And the steady congressional cutting of the whole block, deepest in the same years the Unprogrammed Appropriations were inflated most, is the fiscal counterpart to a shift in control: away from the executive’s post-enactment discretion over lump sums, toward a standby fund whose releases Congress has more say in shaping. Neither pool is well-suited to line-by-line scrutiny, which is the reason both are worth watching as the budget moves through the legislature.
Source. DBM Special Purpose Fund allotment-release
annexes and the General Appropriations Act, compiled in
Compiled_-_Special_Purpose_Funds.xlsx: fund-level NEP and
GAA (SPFs sheet) and releases by fund and department
(Allotment_Releases). The compilation excludes the two
largest Special Purpose Funds, the Allocation to Local Government Units
and Budgetary Support to Government Corporations, leaving the
discretionary lump sums. Amounts in the workbook are in thousands of
pesos; charts are shown in billions.
Reading the figures. “NEP” is the proposed fund, “GAA” the enacted fund, and “Releases” the allotments actually issued during the year. FY 2027 shows the NEP only, since the GAA is not yet enacted. FY 2026 releases are as of August, so any figure that includes 2026 is partial for that year and shouldn’t be compared directly with a full year. Releases above the GAA are not an error: these funds can be augmented mid-year from savings, continuing appropriations, and other sources.