This document tracks the budget of the Department of Social Welfare and Development – Office of the Secretary (DSWD-OSEC) across ten fiscal years, FY 2018 to FY 2027 — with FY 2027 the Executive’s proposal (NEP), not yet enacted — following each peso from the Executive’s proposal (NEP) to enactment (GAA), release (allotment), commitment (obligation), and final cash payment (disbursement).
It is the long-form companion to the DSWD-OSEC briefing deck. Where the deck fits each point on a slide, this version keeps the full argument and adds reference tables — most sortable, searchable, and exportable — so a reader can interrogate the figures directly. Every table can be copied or downloaded from its toolbar.
DSWD is simple to characterize and, in some ways, politically charged. It is overwhelmingly a cash-transfer machine: three programs — Pantawid Pamilyang Pilipino (4Ps), Protective Services, and the Social Pension — carry the great majority of the budget, and because cash assistance classifies as Maintenance and Other Operating Expenses, the agency is almost entirely MOOE. Two threads run through what follows. First, execution has steadily improved — DSWD’s money increasingly gets paid out, reaching 96% of allotments in 2025. Second, Congress does not so much enlarge the DSWD budget as re-shape it from within, trimming the flagship 4Ps while building up Protective Services and inventing an entirely new program, AKAP, that never appeared in any Presidential proposal.
The FY 2027 proposal (NEP) is ₱236B for DSWD-OSEC — up about ₱14B (+6%) on the 2026 proposal and the largest yet, though it sits ₱29B below the Congress-augmented 2026 enacted level (₱264B). The striking move is internal: the flagship 4Ps is proposed down ₱14B, from ₱113B to ₱99B. This is a genuine reduction, not a proposal-versus-enacted artifact — Congress left 4Ps at the proposed ₱113B in 2026, so the drop is the Executive’s own choice, and it is the first time a Presidential proposal steps 4Ps down. In its place a new ₱17.7B program — “Panahon ng Pagkilos: Philippine Community Resilience” — appears with no prior-year budget and no track record, and Protective Services (which houses the discretionary AICS) is proposed up ₱6.3B to ₱33B. Money is shifting from the evaluated, conditional 4Ps toward a new program and more discretionary assistance. Because DSWD disburses at 96% and 4Ps at 98–99%, the reduction cannot rest on an inability to spend — it is a policy choice, not a capacity problem.
DSWD is overwhelmingly a cash-transfer agency. Three programs — 4Ps, Protective Services, and the Social Pension — account for 74–88% of the OSEC budget every year, and ₱229B of the proposed ₱264B 2026 budget. 4Ps alone is ₱113B in 2026, 43% of the office.
The OSEC budget has nearly doubled, from ₱141B (2018 GAA) to a proposed ₱264B (2026 GAA), with the single biggest year-on-year jump being the proposed FY 2026 (+₱22B over the 2025 GAA, after a 2025 contraction).
The agency is almost entirely MOOE. Maintenance and Other Operating Expenses run 93–95% of every year’s GAA, because cash transfers and subsidies classify as MOOE. Personnel Services is a thin sliver, and Financial Expenses and Capital Outlays are each under 1% of the budget.
Absorption has improved steadily. Disbursement-to-allotment held at 71–84% through 2018–2023, then jumped to 90% (2024) and 96% (2025) — the strongest readings on record.
Congress consistently augments DSWD, but redirects within the agency. The enacted GAA exceeded the Executive’s NEP in eight of nine years. But the headline net change conceals a large internal reshuffle: the biggest cumulative add is to Protective Services (+₱116B), the biggest cumulative trim is to 4Ps (−₱83B), and Congress created AKAP — now ₱26B a year — entirely outside the President’s budget, a cumulative +₱53B that never had a matching NEP line.
The 2026 NEP-to-GAA delta (+₱43B) is concentrated in Protective Services (+₱37B alone), extending an eleven-fold scale-up of that program since 2018 — from ₱5.7B (2018) to a proposed ₱63.9B (2026).
The defining DSWD question is not whether the money is spent — increasingly it is — but how Congress is steadily rewriting the social-protection portfolio from the floor of the legislature: shrinking the conditional-cash flagship, enlarging a broad discretionary assistance line, and standing up a new program by appropriation alone.
Period. FY 2018 through FY 2027 for NEP and FY 2018 through FY 2026 for GAA — FY 2027 is the NEP (the Executive’s proposal) only, not yet debated or enacted and with no execution data, so wherever a chart or table shows FY 2027 the figure is proposed. Execution data — Adjusted Appropriations, Adjusted Allotments, Obligations, Disbursements — is available at the P/A/P level for every year FY 2018–2025; FY 2026 reflects the proposed/enacted budget only.
Scope. The main analysis is DSWD Office of the Secretary only; the attached agencies (the National Anti-Poverty Commission, the Council for the Welfare of Children, and others) are summarised in a short attached-agencies section at the end. Current New Appropriations only; nominal pesos.
Expense classes. DSWD uses four: Personnel Services (PS), Maintenance & Other Operating Expenses (MOOE), Financial Expenses (FE), and Capital Outlays (CO). MOOE dominates because cash transfers classify under MOOE; FE and CO are each under 1% of the budget, so the expense-class absorption analysis below reports only PS and MOOE.
Absorptive-capacity denominator. Unless noted, ratios use Adjusted Allotments. The three ratios are O/A (Obligations ÷ Allotment), D/O (Disbursements ÷ Obligations), and D/A (Disbursements ÷ Allotment).
evo <- totals_by_year %>%
filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Obligations","Disbursements"),
labels = c("NEP (proposed)","GAA (enacted)","Adj. Allotment","Obligations","Disbursements")))
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 = c(seq(2018, 2026, 2), 2027)) +
annotate("text", x = 2027, y = Inf, label = "proposed", vjust = 1.4, size = 3, color = "grey45") +
labs(title = "DSWD-OSEC budget, NEP through Disbursements (FY 2018–2027)",
subtitle = "The budget nearly doubled; disbursements have caught up to allotments; the FY 2027 NEP proposes ~PHP 236B",
x = NULL, y = NULL, caption = "FY 2027 is the NEP (proposed) only; FY 2026 reflects NEP/GAA only; execution runs through 2025.") +
theme_dswd() + guides(color = guide_legend(nrow = 1))
The defining feature of this chart is how tightly the disbursement line now hugs the allotment line at the right-hand end. Through the middle years there is a visible gap; by 2024–2025 it has nearly closed. The budget itself roughly doubled over the period, dipping in 2025 before the large 2026 proposal. The table gives the underlying figures.
tbl_evo <- totals_by_year %>%
filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
mutate(value = total/1e9) %>% select(year, metric, value) %>%
pivot_wider(names_from = year, values_from = value) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Obligations","Disbursements"),
labels = c("NEP","GAA","Adj. Allotment","Obligations","Disbursements"))) %>%
arrange(metric) %>% rename(`PHP B` = metric)
kbl_clean(tbl_evo, font = 13, digits = 1, format.args = list(big.mark = ","), na = "")
| PHP B | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 |
|---|---|---|---|---|---|---|---|---|---|---|
| NEP | 137.6 | 136.4 | 156.6 | 169.2 | 189.0 | 194.6 | 207.2 | 226.7 | 221.4 | 235.7 |
| GAA | 141.4 | 138.5 | 162.0 | 174.7 | 202.4 | 196.5 | 245.0 | 215.8 | 264.4 | |
| Adj. Allotment | 139.6 | 133.3 | 161.9 | 174.7 | 202.4 | 194.3 | 241.8 | 212.8 | ||
| Obligations | 136.6 | 128.7 | 141.0 | 158.9 | 184.6 | 188.0 | 236.7 | 208.7 | ||
| Disbursements | 116.7 | 109.0 | 114.6 | 143.7 | 161.9 | 157.0 | 216.8 | 203.9 |
The enacted GAA exceeded the Executive’s NEP in eight of nine years; the exception is FY 2025, when Congress trimmed about ₱11B. The 2024 GAA jumped ₱38B over the NEP, largely to launch AKAP and scale up Protective Services. The table pairs each year’s GAA growth with the size of the net Congressional adjustment.
wide_yr <- totals_by_year %>% pivot_wider(names_from = metric, values_from = total)
growth <- wide_yr %>% arrange(year) %>%
transmute(year,
`GAA (B)` = round(GAA/1e9,1),
`Growth %` = scales::percent(GAA/lag(GAA) - 1, accuracy = 0.1),
`NEP (B)` = round(NEP/1e9,1),
`Net adj. GAA−NEP (B)` = round((GAA-NEP)/1e9,1))
kbl_clean(growth, font = 13, align = "rrrrr", na = "")
| year | GAA (B) | Growth % | NEP (B) | Net adj. GAA−NEP (B) |
|---|---|---|---|---|
| 2018 | 141.4 | 137.6 | 3.8 | |
| 2019 | 138.5 | -2.1% | 136.4 | 2.1 |
| 2020 | 162.0 | 16.9% | 156.6 | 5.4 |
| 2021 | 174.7 | 7.9% | 169.2 | 5.6 |
| 2022 | 202.4 | 15.9% | 189.0 | 13.5 |
| 2023 | 196.5 | -2.9% | 194.6 | 1.9 |
| 2024 | 245.0 | 24.7% | 207.2 | 37.8 |
| 2025 | 215.8 | -11.9% | 226.7 | -10.8 |
| 2026 | 264.4 | 22.5% | 221.4 | 43.1 |
| 2027 | 235.7 |
The net adjustment is positive in every year except FY 2025. As later sections show, even these net figures hide much larger offsetting moves between programs.
DSWD-OSEC’s budget is organized into seven PREXC programs. The chart shows how the enacted budget divides among them; the tables give pesos and shares.
comp <- df_long %>%
filter(metric == "GAA", year <= 2026, !is.na(amount)) %>%
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) +
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 = "The Protective and Promotive Social Welfare programs together carry the budget",
x = NULL, y = NULL) +
theme_dswd() + guides(fill = guide_legend(nrow = 4, byrow = TRUE))
Two programs carry almost everything. The Promotive Social Welfare Program houses 4Ps and the Social Pension; the Protective Social Welfare Program houses Protective Services and AKAP. Together they are the bulk of the budget, and the relative weight has been shifting toward the Protective side as Congress builds it up — a structural change the composition chart makes visible.
comp_tbl <- comp %>% group_by(year) %>% mutate(share = amount/sum(amount)) %>% ungroup()
comp_amt <- comp_tbl %>% mutate(amount = round(amount/1e9,1)) %>%
select(category, year, amount) %>% pivot_wider(names_from = year, values_from = amount)
kbl_clean(comp_amt %>% rename(`Program (PHP B)` = category),
font = 12, digits = 1, format.args = list(big.mark=","), na = "")
| Program (PHP B) | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| Disaster Response and Management Program | 4.9 | 3.5 | 4.2 | 4.3 | 4.3 | 5.0 | 4.6 | 4.8 | 7.2 |
| General Administration and Support | 0.7 | 0.7 | 0.8 | 1.4 | 1.0 | 1.1 | 2.1 | 2.4 | 2.2 |
| Promotive Social Welfare Program | 99.9 | 94.3 | 115.8 | 113.3 | 122.2 | 116.4 | 116.2 | 73.6 | 120.1 |
| Protective Social Welfare Program | 34.0 | 35.1 | 38.7 | 53.4 | 71.7 | 71.1 | 119.3 | 131.9 | 131.6 |
| Standards-setting and Compliance Program | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.3 |
| Support to Operations | 0.9 | 3.8 | 1.4 | 1.1 | 1.9 | 1.5 | 1.6 | 1.9 | 1.6 |
| Technical and Advisory Services Program | 0.9 | 1.0 | 1.0 | 1.1 | 1.2 | 1.2 | 1.3 | 1.2 | 1.5 |
comp_pct <- comp_tbl %>% mutate(share = round(share*100,1)) %>%
select(category, year, share) %>% pivot_wider(names_from = year, values_from = share)
Share of each year’s total budget:
kbl_clean(comp_pct %>% rename(`Program (% of GAA)` = category), font = 12, digits = 1, na = "")
| Program (% of GAA) | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| Disaster Response and Management Program | 3.5 | 2.5 | 2.6 | 2.5 | 2.1 | 2.6 | 1.9 | 2.2 | 2.7 |
| General Administration and Support | 0.5 | 0.5 | 0.5 | 0.8 | 0.5 | 0.6 | 0.8 | 1.1 | 0.8 |
| Promotive Social Welfare Program | 70.6 | 68.1 | 71.5 | 64.8 | 60.4 | 59.2 | 47.4 | 34.1 | 45.4 |
| Protective Social Welfare Program | 24.1 | 25.3 | 23.9 | 30.6 | 35.4 | 36.2 | 48.7 | 61.1 | 49.8 |
| Standards-setting and Compliance Program | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.1 |
| Support to Operations | 0.6 | 2.8 | 0.9 | 0.7 | 1.0 | 0.8 | 0.6 | 0.9 | 0.6 |
| Technical and Advisory Services Program | 0.7 | 0.7 | 0.6 | 0.6 | 0.6 | 0.6 | 0.5 | 0.6 | 0.6 |
DSWD’s expense-class profile is extremely lopsided: it is a MOOE department, because cash assistance is classified as an operating expense.
ec_levels <- c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)",
"Financial Expenses (FE)","Capital Outlays (CO)")
comp_ec <- df_long_all %>%
filter(metric == "GAA", year <= 2026, expense_class %in% c("1PS","2MOOE","3FE","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","3FE","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 = "Maintenance & Operating Expenses are 93–95% of the budget every year",
x = NULL, y = NULL) +
theme_dswd() + guides(fill = guide_legend(nrow = 1))
MOOE has held between 93% and 95% of the GAA every single year. This is not a sign of an under-resourced bureaucracy; it is what a social-protection agency looks like in expense-class terms — the “operating expense” is the assistance itself. The corollary is that the usual expense-class lens (is it salaries, operations, or infrastructure?) tells you very little here. What matters at DSWD is which programs the MOOE flows through, which is why the rest of this report works mostly at the program and P/A/P level.
ec_share <- comp_ec %>% group_by(year) %>% mutate(share = round(amount/sum(amount)*100,1)) %>% ungroup() %>%
select(expense_class, year, share) %>% pivot_wider(names_from = year, values_from = share)
kbl_clean(ec_share %>% rename(`Expense class (% of GAA)` = expense_class), font = 12.5, digits = 1, na = "")
| Expense class (% of GAA) | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| Personnel Services (PS) | 4.1 | 4.7 | 4.1 | 4.1 | 4.5 | 5.3 | 4.3 | 4.9 | 6.0 |
| Maintenance & Other Op. Exp. (MOOE) | 94.0 | 94.9 | 95.5 | 95.4 | 94.9 | 93.9 | 95.3 | 94.8 | 93.2 |
| Financial Expenses (FE) | 0.6 | 0.4 | 0.3 | 0.2 | 0.2 | 0.0 | 0.0 | 0.0 | 0.0 |
| Capital Outlays (CO) | 1.3 | 0.0 | 0.1 | 0.3 | 0.4 | 0.9 | 0.5 | 0.3 | 0.8 |
top10 <- pap_year %>% filter(year == 2027, !is.na(NEP), NEP > 0) %>%
arrange(desc(NEP)) %>% slice_head(n = 10) %>% mutate(pap = factor(pap, levels = rev(pap)))
ggplot(top10, aes(pap, NEP)) +
geom_col(fill = "#54278F", width = 0.75) +
geom_text(aes(label = php_b(NEP)), hjust = -0.1, size = 3.3, color = "grey20") +
coord_flip() +
scale_x_discrete(labels = function(x) str_wrap(x, 46)) +
scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, .20)), limits = c(0, NA)) +
labs(title = "Top 10 P/A/Ps by FY 2027 NEP (proposed)",
subtitle = "4Ps is proposed down to PHP 99B but is still the largest line, at 42% of the proposal",
x = NULL, y = NULL) +
theme_dswd() +
theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))
Every P/A/P, ranked by the FY 2027 proposal (NEP), alongside the FY 2026 proposal and enacted budget. Lines that exist in only one year (a new program, or one dropped in the proposal) show a blank where they have no figure. Sort, search, or export.
all_paps <- pap_year %>% filter(year == 2027) %>%
transmute(`P/A/P` = pap, `NEP 2027 (B)` = NEP/1e9)
nep_gaa_26 <- pap_year %>% filter(year == 2026) %>%
transmute(`P/A/P` = pap, `NEP 2026 (B)` = NEP/1e9, `GAA 2026 (B)` = GAA/1e9)
all_paps <- all_paps %>% full_join(nep_gaa_26, by = "P/A/P") %>%
arrange(desc(`NEP 2027 (B)`))
dt_table(all_paps, page = 15,
money_cols = c("NEP 2027 (B)","NEP 2026 (B)","GAA 2026 (B)"))
Comparing the two proposals — the FY 2026 NEP against the FY 2027 NEP — isolates what the Executive itself chose to change, before Congress acts. The picture is a reallocation, not a cut to the total: 4Ps is proposed down ₱14B while a new ₱17.7B “Panahon ng Pagkilos” community-resilience program appears and Protective Services (AICS) rises ₱6.3B. Because Congress had left 4Ps at the proposed level in 2026, the 4Ps reduction here is real, not a rebound from a prior-year Congressional trim.
nep_change <- pap_year %>%
filter(year %in% c(2026, 2027)) %>%
select(pap, year, NEP) %>%
pivot_wider(names_from = year, values_from = NEP, names_prefix = "y") %>%
mutate(change = (coalesce(y2027, 0) - coalesce(y2026, 0)) / 1e9) %>%
filter(abs(change) >= 0.5)
ups <- nep_change %>% filter(change > 0) %>% arrange(desc(change)) %>% slice_head(n = 7)
downs <- nep_change %>% filter(change < 0) %>% arrange(change) %>% slice_head(n = 6)
nep_change <- bind_rows(ups, downs) %>% arrange(desc(change)) %>%
mutate(pap = factor(pap, levels = rev(pap)),
dir = ifelse(change >= 0, "Increased / new", "Reduced"))
ggplot(nep_change, aes(pap, change, fill = dir)) +
geom_col(width = 0.72) +
geom_text(aes(label = sprintf("%+.1f", change),
hjust = ifelse(change >= 0, -0.15, 1.15)),
size = 3, color = "grey25") +
coord_flip() +
scale_fill_manual(values = c("Increased / new" = "#1B7837", "Reduced" = "#D95F02")) +
scale_x_discrete(labels = function(x) str_wrap(x, 44)) +
scale_y_continuous(labels = function(v) paste0(peso, v, "B"),
expand = expansion(mult = c(0.16, 0.16))) +
labs(title = "What the Executive changed: FY 2026 NEP to FY 2027 NEP (PHP B)",
subtitle = "Proposal-to-proposal change; a new program and more discretionary aid offset the 4Ps step-down",
x = NULL, y = NULL) +
theme_dswd() +
theme(panel.grid.major.y = element_blank(),
panel.grid.major.x = element_line(color = "grey85"),
legend.position = "none")
The single largest move is the appearance of Panahon ng Pagkilos (+₱17.7B), a community-resilience program with no prior-year budget; Protective Services (+₱6.3B) and a food-security/nutrition line (+₱3.9B) also rise. Against these, 4Ps falls ₱13.9B and an ICT line is trimmed. In net terms the additions more than replace the 4Ps reduction — the proposal does not shrink DSWD, it re-weights it away from the rules-based conditional transfer and toward a new program and discretionary assistance.
Collapsing the budget to the three flagship cash-transfer lines against everything else shows how concentrated DSWD is.
share <- df_long %>%
filter(metric == "GAA", year <= 2026, !is.na(amount)) %>%
mutate(grp = case_when(
pap == PANTAWID ~ "Pantawid Pamilyang (4Ps)",
pap == PROTECTIVE ~ "Protective Services",
pap == SOCPEN ~ "Social Pension",
TRUE ~ "All other P/A/Ps")) %>%
group_by(year, grp) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(grp = factor(grp, levels = c("Pantawid Pamilyang (4Ps)","Protective Services",
"Social Pension","All other P/A/Ps")))
ct_pal <- c("Pantawid Pamilyang (4Ps)" = "#08519C","Protective Services" = "#3182BD",
"Social Pension" = "#9ECAE1","All other P/A/Ps" = "#D9D9D9")
ggplot(share, aes(year, amount, fill = grp)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = ct_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 = "Three cash-transfer programs vs. everything else, GAA 2018–2026",
subtitle = "4Ps + Protective Services + Social Pension = 74–88% of OSEC GAA every year",
x = NULL, y = NULL) +
theme_dswd() + guides(fill = guide_legend(nrow = 2, byrow = TRUE))
The three lines together are 74–88% of the OSEC budget in every year, and ₱229B of the ₱264B 2026 proposal. The internal mix is shifting, though: 4Ps is being held flat-to-down while Protective Services climbs steeply, so the blue and mid-blue bands are trading places over the period. For anyone interested in how social protection actually reaches Filipino households, almost the entire story lives in these three lines — and increasingly in the second of them.
The single most consequential line in the FY 2027 proposal is the flagship Pantawid Pamilyang Pilipino Program (4Ps). The chart traces its proposed (NEP) and enacted (GAA) budgets side by side.
four_ps <- pap_year %>% filter(pap == PANTAWID) %>%
select(year, NEP, GAA) %>%
pivot_longer(c(NEP, GAA), names_to = "metric", values_to = "amount") %>%
filter(!is.na(amount))
ggplot(four_ps, aes(year, amount/1e9, color = metric, group = metric)) +
geom_line(linewidth = 1.0) + geom_point(size = 2) +
annotate("text", x = 2027, y = Inf, label = "proposed", vjust = 1.4, size = 3, color = "grey45") +
scale_color_manual(values = c("NEP" = "#54278F", "GAA" = "#08519C"),
labels = c("GAA (enacted)","NEP (proposed)")) +
scale_x_continuous(breaks = c(seq(2018, 2026, 2), 2027)) +
scale_y_continuous(labels = function(v) paste0(peso, v, "B"), limits = c(0, NA),
expand = expansion(mult = c(0, .08))) +
labs(title = "4Ps: the first time the Executive's own proposal steps down",
subtitle = "Congress enacted 4Ps below the proposal in most years since 2021; the FY 2027 NEP proposes PHP 99B",
x = NULL, y = NULL, color = NULL,
caption = "FY 2027 is the NEP (proposed) only; no FY 2027 GAA yet.") +
theme_dswd() + guides(color = guide_legend(nrow = 1))
Two things stand out. First, Congress has repeatedly enacted 4Ps below the Executive’s proposal since 2021 — most sharply in 2025, when a proposed ₱114B was cut to a ₱64B GAA. In that light 4Ps has been a donor to the internal reallocation, not a beneficiary. Second, and new this year, the FY 2027 proposal itself steps 4Ps down, from ₱113B to ₱99B (−₱14B). In 2026 the enacted budget had matched the proposal exactly (₱113B), so this is not a rebound from a prior-year cut — it is the first time a Presidential proposal, rather than Congress, reduces the conditional-cash flagship. With 4Ps disbursing at 98–99%, the reduction cannot be explained by weak absorption; it reflects a caseload, graduation, or policy decision that advocates can legitimately probe.
DSWD’s net augmentation is modest, but that masks a large internal reshuffle. The chart below shows the cumulative NEP-to-GAA change for the most-adjusted P/A/Ps over 2018–2026 — additions in green, cuts in orange.
aug <- pap_year %>% filter(year <= 2026) %>% group_by(pap) %>%
summarise(nep = sum(NEP, na.rm = TRUE), gaa = sum(GAA, na.rm = TRUE), .groups = "drop") %>%
mutate(change = gaa - nep) %>% filter(abs(change) >= 5e8)
aug_plot <- bind_rows(
aug %>% arrange(desc(change)) %>% slice_head(n = 8),
aug %>% arrange(change) %>% slice_head(n = 8)) %>%
distinct() %>%
mutate(direction = ifelse(change >= 0, "Net increase (GAA > NEP)", "Net decrease (GAA < NEP)"),
hj = ifelse(change >= 0, -0.12, 1.12),
pap = factor(pap, levels = pap[order(change)]))
ggplot(aug_plot, aes(pap, change/1e9, fill = direction)) +
geom_col(width = 0.7) +
geom_text(aes(label = sprintf("%+.1fB", change/1e9), hjust = hj), size = 2.9, color = "grey20") +
coord_flip() +
scale_fill_manual(values = c("Net increase (GAA > NEP)" = "#1B9E77", "Net decrease (GAA < NEP)" = "#D95F02")) +
scale_x_discrete(labels = function(x) str_trunc(x, 44)) +
scale_y_continuous(labels = function(v) paste0(peso, v, "B"), expand = expansion(mult = c(0.22, 0.22))) +
labs(title = "Cumulative NEP-to-GAA change by P/A/P, 2018–2026",
subtitle = "Congress redirects: builds up Protective Services (+PHP 116B); trims 4Ps (−PHP 83B)",
x = NULL, y = NULL) +
theme_dswd() +
theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85")) +
guides(fill = guide_legend(nrow = 1))
This is the most distinctive pattern at DSWD. Congress does not simply add money — it reallocates between the agency’s two biggest instruments. The largest cumulative addition is to Protective Services (+₱116B), a broad discretionary-assistance program; the largest cumulative cut is to the conditional-cash flagship 4Ps (−₱83B). The net effect on the agency total is comparatively small, but the composition of social protection has been substantially rewritten on the floor of Congress.
The full cumulative table lists every P/A/P with a material (≥₱0.5B) net change over the nine years.
aug_full <- pap_year %>% filter(year <= 2026) %>% group_by(pap) %>%
summarise(nep = sum(NEP, na.rm = TRUE), gaa = sum(GAA, na.rm = TRUE), .groups = "drop") %>%
mutate(change = gaa - nep) %>% filter(abs(change) >= 5e8) %>%
transmute(`P/A/P` = pap, `Σ NEP 2018–26 (B)` = nep/1e9, `Σ GAA 2018–26 (B)` = gaa/1e9,
`Cumulative change (B)` = change/1e9) %>%
arrange(desc(`Cumulative change (B)`))
dt_table(aug_full, page = 10,
money_cols = c("Σ NEP 2018–26 (B)","Σ GAA 2018–26 (B)","Cumulative change (B)"))
The starkest case of Congressional initiative is the Ayuda sa Kapos ang Kita Program (AKAP). It is a cash-assistance line for low-income earners — and it has never appeared in a Presidential NEP. Congress inserted it directly into the GAA.
pap_year %>% filter(str_detect(pap, "AKAP")) %>%
transmute(FY = year, `NEP (B)` = round(NEP/1e9, 2), `GAA (B)` = round(GAA/1e9, 2),
`Allotment (B)` = round(AdjAllot/1e9, 2), `Disbursed (B)` = round(Disbursements/1e9, 2),
`D/A` = ifelse(!is.na(AdjAllot) & AdjAllot > 0,
scales::percent(Disbursements/AdjAllot, accuracy = 1), NA_character_)) %>%
arrange(FY) %>% kbl_clean(font = 13.5, align = "rrrrrr", na = "")
| FY | NEP (B) | GAA (B) | Allotment (B) | Disbursed (B) | D/A |
|---|---|---|---|---|---|
| 2018 | |||||
| 2019 | |||||
| 2020 | |||||
| 2021 | |||||
| 2022 | |||||
| 2023 | |||||
| 2024 | 26.70 | 26.70 | 26.17 | 98% | |
| 2025 | 0 | 26.16 | 26.16 | 25.13 | 96% |
| 2026 | |||||
| 2027 |
AKAP first appears in the 2024 GAA at ₱26.7B and again in 2025 at ₱26.2B, with no NEP line in any year — a cumulative ₱53B inserted by the legislature. Whatever its policy merits, AKAP is a clean example of Congress not merely augmenting the Executive’s program but authoring a new one, with the design, targeting, and audit arrangements established after the money rather than before it.
Protective Services for Individuals and Families in Difficult Circumstances is now the second-largest DSWD line, behind only 4Ps — and it is the clearest beneficiary of the Congressional reallocation. It bundles a wide range of assistance (AICS, emergency shelter, OFW services, anti-trafficking, and more).
prot <- pap_year %>% filter(str_starts(pap, "Protective Services")) %>%
select(year, NEP, GAA, AdjAllot, Disbursements) %>%
pivot_longer(-year, names_to = "metric", values_to = "amount") %>% filter(!is.na(amount)) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Disbursements"),
labels = c("NEP (proposed)","GAA (enacted)","Adj. Allotment","Disbursements")))
ggplot(prot, aes(year, amount, color = metric, group = metric)) +
geom_line(linewidth = 1.0) + geom_point(size = 2.2) +
scale_color_manual(values = exec_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(5), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = 2018:2026) +
labs(title = "Protective Services for Individuals and Families: 2018–2026",
subtitle = "From PHP 5.7B in 2018 to a proposed PHP 63.9B in 2026 — driven by Congressional augmentation",
x = NULL, y = NULL) +
theme_dswd() + guides(color = guide_legend(nrow = 1))
pap_year %>% filter(str_starts(pap, "Protective Services"), year %in% 2018:2025) %>%
transmute(FY = year, `NEP (B)` = round(NEP/1e9,1), `GAA (B)` = round(GAA/1e9,1),
`Allotment (B)` = round(AdjAllot/1e9,1), `Disbursed (B)` = round(Disbursements/1e9,1),
`D/A` = scales::percent(Disbursements/AdjAllot, accuracy = 1)) %>%
kbl_clean(font = 13.5, align = "rrrrrr", na = "")
| FY | NEP (B) | GAA (B) | Allotment (B) | Disbursed (B) | D/A |
|---|---|---|---|---|---|
| 2018 | 3.5 | 5.7 | 5.7 | 4.9 | 85% |
| 2019 | 4.1 | 5.1 | 5.1 | 4.5 | 89% |
| 2020 | 6.6 | 8.7 | 18.2 | 9.7 | 53% |
| 2021 | 12.0 | 23.6 | 23.6 | 17.9 | 76% |
| 2022 | 18.0 | 39.9 | 39.8 | 31.6 | 79% |
| 2023 | 19.9 | 36.8 | 36.8 | 35.7 | 97% |
| 2024 | 20.0 | 34.3 | 34.3 | 33.5 | 98% |
| 2025 | 35.2 | 44.7 | 44.7 | 44.3 | 99% |
The program has grown roughly eleven-fold, from ₱5.7B (2018 GAA) to a proposed ₱63.9B (2026), and its cumulative NEP-to-GAA augmentation since 2018 is +₱116B — the largest of any DSWD line. The 2026 jump is concentrated here: a +₱37B add over the NEP lifts it to ₱63.9B. Encouragingly, recent absorption is strong (D/A 97–99% in 2023–2025). The open question is whether that track record holds at this much larger scale, spread across many disparate sub-lines — when a single P/A/P quietly becomes a ₱60B umbrella for a dozen distinct assistance schemes, the aggregate disbursement rate can hide a great deal.
DSWD’s absorption story is one of steady improvement.
absorp_long <- absorp_total %>% select(year, oblig_allot, disb_oblig, disb_allot) %>%
pivot_longer(-year, names_to = "ratio", values_to = "value") %>%
mutate(ratio = factor(ratio, levels = c("oblig_allot","disb_oblig","disb_allot"),
labels = c("Obligations / Adj. Allotment","Disbursements / Obligations","Disbursements / Adj. Allotment")))
ggplot(absorp_long, aes(year, value, color = ratio, group = ratio)) +
geom_line(linewidth = 0.9) + geom_point(size = 2) +
geom_text(aes(label = scales::percent(value, accuracy = 1)), vjust = -1.0, size = 3.0, show.legend = FALSE, color = "grey20") +
scale_color_manual(values = absorp_pal) +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.08), breaks = seq(0, 1, 0.2)) +
scale_x_continuous(breaks = 2018:2025) +
labs(title = "DSWD-OSEC absorptive capacity, 2018–2025",
subtitle = "Disbursement-to-allotment has improved steadily, reaching 96% in 2025 from a 71% low in 2020",
x = NULL, y = NULL) +
theme_dswd() + guides(color = guide_legend(nrow = 1))
absorp_total %>%
transmute(Year = year, `Allotment (B)` = round(AdjAllot/1e9,1),
`Obligations (B)` = round(Obligations/1e9,1), `Disbursements (B)` = round(Disbursements/1e9,1),
`O/A` = scales::percent(oblig_allot, accuracy = 1),
`D/O` = scales::percent(disb_oblig, accuracy = 1),
`D/A` = scales::percent(disb_allot, accuracy = 1)) %>%
kbl_clean(font = 13, align = "rrrrrrr", na = "")
| Year | Allotment (B) | Obligations (B) | Disbursements (B) | O/A | D/O | D/A |
|---|---|---|---|---|---|---|
| 2018 | 139.6 | 136.6 | 116.7 | 98% | 85% | 84% |
| 2019 | 133.3 | 128.7 | 109.0 | 97% | 85% | 82% |
| 2020 | 161.9 | 141.0 | 114.6 | 87% | 81% | 71% |
| 2021 | 174.7 | 158.9 | 143.7 | 91% | 90% | 82% |
| 2022 | 202.4 | 184.6 | 161.9 | 91% | 88% | 80% |
| 2023 | 194.3 | 188.0 | 157.0 | 97% | 84% | 81% |
| 2024 | 241.8 | 236.7 | 216.8 | 98% | 92% | 90% |
| 2025 | 212.8 | 208.7 | 203.9 | 98% | 98% | 96% |
Obligation rates have stayed high throughout (87–98%), so the binding issue was never committing the money but paying it out — and that gap has now largely closed. The improvement from a 71% disbursement low in 2020 to 96% in 2025 coincides with the maturing of the large cash-transfer programs, which disburse cleanly once their payment systems are running.
Restricting to the two material classes (PS and MOOE; FE and CO are each under 1% of the budget), the picture is reassuring: personnel spending absorbs near-fully, and MOOE — which is the budget — has climbed steadily.
ec_levels2 <- c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)")
absorp_ec <- df_long_all %>%
filter(metric %in% c("AdjAllot","Disbursements"), expense_class %in% c("1PS","2MOOE"), year %in% 2018:2025) %>%
group_by(year, metric, expense_class) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = metric, values_from = amount) %>%
mutate(da = ifelse(AdjAllot > 0, Disbursements/AdjAllot, NA_real_),
expense_class = factor(expense_class, levels = c("1PS","2MOOE"), labels = ec_levels2))
ggplot(absorp_ec, aes(year, da, color = expense_class, group = expense_class)) +
geom_line(linewidth = 0.9) + geom_point(size = 1.8) +
geom_text(aes(label = scales::percent(da, accuracy = 1)), vjust = -1.0, size = 2.9, show.legend = FALSE, color = "grey20") +
scale_color_manual(values = ec_pal) +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.08), breaks = seq(0, 1, 0.2)) +
scale_x_continuous(breaks = 2018:2025) +
labs(title = "Disbursement-to-Allotment by Expense Class, 2018–2025",
subtitle = "Personnel spending absorbs near-fully; MOOE climbed steadily from 70% (2020) to 96% (2025)",
x = NULL, y = NULL,
caption = "Financial Expenses and Capital Outlays each <1% of the budget; absorption ratios omitted due to small base.") +
theme_dswd() + guides(color = guide_legend(nrow = 1))
Because MOOE is 93–95% of the budget, the MOOE line here is essentially the aggregate line — the agency-wide absorption rate is the MOOE absorption rate. There is no large salary block to flatter the average; the headline number reflects how well the cash actually goes out the door.
Both tables cover P/A/Ps with a 2025 allotment of at least ₱1B.
abs_2025 <- pap_year %>% filter(year == 2025, !is.na(AdjAllot), AdjAllot >= 1e9) %>%
mutate(`O/A` = Obligations/AdjAllot, `D/O` = Disbursements/Obligations,
`D/A` = Disbursements/AdjAllot, `Allotment (B)` = round(AdjAllot/1e9, 2))
Strongest absorbers, FY 2025 — the flagship cash-transfer programs disburse at 98–99%.
abs_2025 %>% arrange(desc(`D/A`)) %>% slice_head(n = 8) %>%
transmute(`P/A/P` = str_trunc(pap, 54), `Allotment (B)`,
`O/A` = scales::percent(`O/A`, accuracy = 1),
`D/O` = scales::percent(`D/O`, accuracy = 1),
`D/A` = scales::percent(`D/A`, accuracy = 1)) %>%
kbl_clean(font = 13, align = "lrrrr", na = "")
| P/A/P | Allotment (B) | O/A | D/O | D/A |
|---|---|---|---|---|
| Walang Gutom 2027: Food STAMP Program | 1.89 | 100% | 100% | 99% |
| Protective Services for Individuals and Families in… | 44.73 | 100% | 99% | 99% |
| Pantawid Pamilyang Pilipino Program (Implementation… | 63.68 | 98% | 100% | 98% |
| Social Pension for Indigent Senior Citizens | 47.95 | 99% | 98% | 98% |
| Ayuda sa Kapos ang Kita Program (AKAP) | 26.16 | 99% | 97% | 96% |
| Sustainable Livelihood Program | 6.16 | 98% | 95% | 94% |
| Provision of Technical/Advisory Assistance and Othe… | 1.17 | 98% | 94% | 93% |
| Supplementary Feeding Program | 5.01 | 100% | 93% | 93% |
Weakest absorbers, FY 2025 — smaller operational and special-purpose lines: PAMANA, General Management, ICT.
abs_2025 %>% arrange(`D/A`) %>% slice_head(n = 8) %>%
transmute(`P/A/P` = str_trunc(pap, 54), `Allotment (B)`,
`O/A` = scales::percent(`O/A`, accuracy = 1),
`D/O` = scales::percent(`D/O`, accuracy = 1),
`D/A` = scales::percent(`D/A`, accuracy = 1)) %>%
kbl_clean(font = 13, align = "lrrrr", na = "")
| P/A/P | Allotment (B) | O/A | D/O | D/A |
|---|---|---|---|---|
| Implementation and Monitoring of Payapa at Masagana… | 1.05 | 52% | 76% | 40% |
| General Management and Supervision | 2.36 | 72% | 68% | 49% |
| Information and Communication Technology Service Ma… | 1.46 | 78% | 73% | 57% |
| Services for Residential and Center-based Clients | 2.92 | 96% | 83% | 80% |
| Quick Response Fund | 1.25 | 97% | 91% | 89% |
| Kapit-Bisig Laban sa Kahirapan-Comprehensive and In… | 2.11 | 95% | 96% | 91% |
| Disaster Response and Rehabilitation Program | 2.08 | 97% | 95% | 92% |
| Supplementary Feeding Program | 5.01 | 100% | 93% | 93% |
The familiar pattern holds: routine cash-transfer execution runs cleanly, while administrative and project-type lines lag. But the spread is narrow — the weakest material absorbers here sit around 40–57%, not in the single digits.
Every P/A/P with a 2025 allotment, all three ratios, sortable and searchable.
abs_full <- pap_year %>% filter(year == 2025, !is.na(AdjAllot), AdjAllot > 0) %>%
transmute(`P/A/P` = pap, `Allotment (B)` = AdjAllot/1e9, `Obligations (B)` = Obligations/1e9,
`Disbursements (B)` = Disbursements/1e9, `O/A` = Obligations/AdjAllot,
`D/O` = ifelse(Obligations>0, Disbursements/Obligations, NA_real_), `D/A` = Disbursements/AdjAllot) %>%
arrange(`D/A`)
dt_table(abs_full, page = 15,
money_cols = c("Allotment (B)","Obligations (B)","Disbursements (B)"),
pct_cols = c("O/A","D/O","D/A"))
Six of the most consequential programs, each showing enacted budget, allotment, and disbursements together. Where the lines sit on top of one another, execution is clean; where disbursements fall away, money is released but unspent.
trend_paps <- c(PANTAWID, PROTECTIVE, SOCPEN,
"Supplementary Feeding Program", "Sustainable Livelihood Program",
"Ayuda sa Kapos ang Kita Program (AKAP)")
trend_dat <- pap_year %>% filter(pap %in% trend_paps) %>%
select(pap, year, GAA, AdjAllot, Disbursements) %>%
pivot_longer(c(GAA, AdjAllot, Disbursements), names_to = "metric", values_to = "amount") %>%
filter(!is.na(amount)) %>%
mutate(metric = factor(metric, levels = c("GAA","AdjAllot","Disbursements"),
labels = c("GAA (enacted)","Adj. Allotment","Disbursements")),
pap = factor(pap, levels = trend_paps,
labels = c("Pantawid Pamilyang (4Ps)","Protective Services","Social Pension",
"Supplementary Feeding","Sustainable Livelihood","AKAP")))
trend_pal <- c("GAA (enacted)" = "#54278F","Adj. Allotment" = "#08519C","Disbursements" = "#31A354")
ggplot(trend_dat, aes(year, amount, color = metric, group = metric)) +
geom_line(linewidth = 0.9) + geom_point(size = 1.5) +
facet_wrap(~ pap, ncol = 3, scales = "free_y",
labeller = label_wrap_gen(width = 24)) + expand_limits(y = 0) +
scale_color_manual(values = trend_pal) +
scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(4)) +
scale_x_continuous(breaks = c(2018, 2022, 2026)) +
labs(title = "How the six largest cash-transfer programs have evolved (2018–2026)",
subtitle = "All six absorb well in their most recent year; 4Ps shows a persistent GAA-vs-disbursement gap",
x = NULL, y = NULL) +
theme_dswd() + guides(color = guide_legend(nrow = 1))
The 4Ps panel is the one to watch: even as the enacted budget is held roughly flat, a visible gap persists between the GAA and disbursements — the conditional-cash flagship is the only one of the six with a consistent shortfall. Protective Services and AKAP show the steep recent climbs discussed above, both absorbing well so far. Social Pension, Supplementary Feeding, and Sustainable Livelihood are steadier, smaller lines that track their allotments closely.
The top 20 P/A/Ps by the FY 2027 proposal (NEP), with the FY 2026 proposal and enacted budget and the most recent (2025) disbursement-to-allotment ratio, so budget levels sit beside how each line has recently absorbed. The full unabridged list is in the ranking section above.
ref <- pap_year %>% filter(year == 2027, !is.na(NEP), NEP > 0) %>%
arrange(desc(NEP)) %>% slice_head(n = 20) %>%
transmute(pap, `NEP 2027 (B)` = NEP/1e9)
ctx <- pap_year %>% filter(year == 2026) %>%
transmute(pap, `NEP 2026 (B)` = NEP/1e9, `GAA 2026 (B)` = GAA/1e9)
da_25 <- pap_year %>% filter(year == 2025) %>%
transmute(pap, `D/A 2025` = ifelse(!is.na(AdjAllot) & AdjAllot > 0, Disbursements/AdjAllot, NA_real_))
ref %>% left_join(ctx, by = "pap") %>% left_join(da_25, by = "pap") %>% rename(`P/A/P` = pap) %>%
dt_table(page = 20, money_cols = c("NEP 2027 (B)","NEP 2026 (B)","GAA 2026 (B)"), pct_cols = "D/A 2025")
2026 execution data is not yet available; the 2025 D/A column indicates how each line has most recently absorbed.
The main report covers the Office of the Secretary. DSWD also oversees a set of small attached agencies and councils, appropriated separately and shown here on an appropriations basis only — no P/A/P-level execution data is published for them. Together they are a rounding error against the OSEC total, but the FY 2027 proposal moves several of them, and two disappear from the DSWD budget entirely.
attached <- read_excel(file_path, sheet = "DSWD") %>%
filter(UACS_AGY_DSC != "Office of the Secretary") %>%
pivot_longer(matches("^(NEP|GAA)_\\d{4}_EXP_TOTAL$"), names_to = "var", values_to = "amount") %>%
separate(var, into = c("metric","year","tag","ec"), sep = "_") %>%
mutate(year = as.integer(year), amount = as.numeric(amount)) %>%
group_by(agency = UACS_AGY_DSC, year, metric) %>%
summarise(amount = if (all(is.na(amount))) NA_real_ else sum(amount, na.rm = TRUE), .groups = "drop")
att_2027 <- attached %>% filter(metric == "NEP", year == 2027, !is.na(amount), amount > 0) %>%
arrange(amount) %>% mutate(agency = factor(agency, levels = agency))
ggplot(att_2027, aes(agency, amount/1e6)) +
geom_col(fill = "#54278F", width = 0.72) +
geom_text(aes(label = paste0(peso, scales::comma(round(amount/1e6)), "M")),
hjust = -0.1, size = 3, color = "grey20") +
coord_flip() +
scale_x_discrete(labels = function(x) str_wrap(x, 34)) +
scale_y_continuous(labels = function(v) paste0(peso, scales::comma(v), "M"),
expand = expansion(mult = c(0, .30))) +
labs(title = "Attached agencies by FY 2027 NEP (proposed)",
subtitle = "Appropriations basis only; no execution data is published for these agencies",
x = NULL, y = NULL) +
theme_dswd() +
theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))
att_tbl <- attached %>%
filter((metric == "NEP" & year %in% c(2026, 2027)) | (metric == "GAA" & year == 2026)) %>%
mutate(key = paste0(metric, year)) %>%
select(agency, key, amount) %>%
pivot_wider(names_from = key, values_from = amount) %>%
transmute(Agency = agency,
`NEP 2027 (M)` = NEP2027/1e6,
`NEP 2026 (M)` = NEP2026/1e6,
`GAA 2026 (M)` = GAA2026/1e6) %>%
arrange(desc(`NEP 2027 (M)`))
kbl_clean(att_tbl, font = 12.5, digits = 0, format.args = list(big.mark = ","), na = "")
| Agency | NEP 2027 (M) | NEP 2026 (M) | GAA 2026 (M) |
|---|---|---|---|
| National Commission of Senior Citizens | 3,808 | 0 | 3,597 |
| National Authority for Child Care | 812 | 721 | 747 |
| National Anti-Poverty Commission | 360 | 369 | 369 |
| Presidential Commission for the Urban Poor | 233 | 248 | 248 |
| Council for the Welfare of Children | 136 | 203 | 203 |
| Juvenile Justice and Welfare Council | 126 | 133 | 133 |
| National Council on Disability Affairs | 92 | 171 | 187 |
| Inter-Country Adoption Board | |||
| National Commission on Indigenous Peoples |
The National Commission of Senior Citizens (₱3.8B) is the largest and grows further; the National Authority for Child Care (₱0.8B) also rises. Most of the councils are proposed at or a little below their FY 2026 enacted levels, and the National Council on Disability Affairs is roughly halved. Two bodies carry no FY 2027 line at all: the Inter-Country Adoption Board, whose functions fold into the new Child Care Authority, and the National Commission on Indigenous Peoples, which is no longer carried under DSWD. As with the OSEC lines, none of these agencies publishes P/A/P-level execution data, so this appropriations view is as far as the analysis can go.
Underlying data: DBM-published budget and execution data for the DSWD Office of the Secretary (Current New Appropriations only), FY 2018–2026. Execution measures (Allotments, Obligations, Disbursements) cover FY 2018–2025. Prepared as the long-form companion to the DSWD-OSEC budget briefing.