This document profiles the budget of the National Commission on Muslim Filipinos (NCMF) — the agency, formerly the Office on Muslim Affairs, mandated to promote the well-being of Muslim Filipinos and preserve their cultural, religious, and historical heritage — across nine fiscal years, FY 2018 to FY 2026. NCMF carries a particular data constraint: 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 NCMF’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 NCMF’s budget. First, it has grown fast — more than doubling since 2018. Second, it is unusually concentrated: a single line, the preservation of Muslim cultural centers and heritage, has been roughly half the entire agency every year. Third, NCMF has been institutionally stable — one move (from the Other Executive Offices to the DILG, around 2019) and no change to its five-program structure — so its trend lines read cleanly from 2018 to 2026.
Growth, though, is only half the picture. Set against the community NCMF serves — roughly 7.0 million Muslim Filipinos by the 2020 census, and by NCMF’s own estimate considerably more — the 2026 budget works out to about ₱188 per person per year, or roughly fifty centavos a day. The questions this review raises are therefore less about whether the agency spends what it receives (it largely does) than about whether what it receives is adequate to the mandate, and whether the spending reaches the communities it is meant for.
NCMF’s enacted budget has more than doubled. From ₱535M (2018 GAA) to ₱1,314M (2026) — about +145%, roughly 12% a year, with a steep ramp in 2025–2026.
But the scale remains modest against the population it serves. Spread across the roughly 7.0 million Muslim Filipinos counted in the 2020 census, the 2026 budget is about ₱188 per person per year — about fifty centavos a day — and closer to ₱110 if the community is as large as NCMF itself estimates.
One organizational move, a stable structure. NCMF (the former Office on Muslim Affairs) shifted from the Other Executive Offices to the DILG around 2019 and has stayed there — without re-cutting its five-program structure, so program lines are comparable across all years.
Half the budget is a single line. Preservation of Muslim cultural centers, heritage, holidays and festivities has been 46–60% of the agency every year, reaching ₱603M in 2026. With Hajj operations (₱104M) and Madrasah/Shari’ah education (₱142M), cultural, religious and educational services are the core of the budget — the functions the agency exists to deliver.
Congress reliably tops up NCMF. Enacted budgets matched or beat the proposal in eight of nine years; the +₱148M (+13%) add for FY 2026 is the largest in the period.
A delivery-oriented tilt. Operating programs are about 75% of the 2026 budget, and the personnel share of spending fell from 84% (2018) to 56% (2026) as MOOE expanded.
Execution is strong. Agency-level obligation rates run 86–99%, and NCMF disburses nearly everything it obligates — except 2019 (68% cash utilization), the OEO→DILG transition year.
NCMF is a small, fast-growing agency with a stable structure that spends what it is given. The open questions are about adequacy and reach: whether an envelope of roughly fifty centavos per Muslim Filipino per day matches the mandate, and whether communities can see the spending arriving.
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 NCMF, so there is no P/A/P-level absorption analysis. Utilization is shown only at the agency aggregate.
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. The two series should not be read one-to-one.
One reorganization, a stable program structure. NCMF’s mother agency changed once (OEOs → DILG, ~2019); its P/A/P structure stayed stable throughout, so program lines are comparable across all years.
Population figures. Per-person comparisons use the 2020 Census of Population and Housing, which recorded 6,981,710 Filipinos (6.4%) reporting Islam as their religious affiliation. NCMF has estimated the share at 10–11%, citing under-registration and incomplete coverage of Muslim communities in official surveys. Per-person amounts here therefore use the census count and should be read as an upper bound — if the community is larger, the budget per person is smaller.
Expense classes. Personnel Services (PS), Maintenance & Other Operating Expenses (MOOE), Capital Outlays (CO). NCMF carries no Financial Expenses. Units are PHP millions throughout.
NCMF changed mother agency once and otherwise kept its programs intact — so its trend lines run cleanly across all nine years.
tl <- tibble::tribble(
~track, ~label, ~start, ~end, ~fill,
"Mother agency", "OEOs", 2018, 2019, "#1B4965",
"Mother agency", "Under DILG", 2019, 2026.4, "#54278F",
"P/A/P structure", "Stable five-program structure", 2018, 2026.4, "#1B9E77")
ggplot(tl, aes(y = track)) +
geom_segment(aes(x = start, xend = end, yend = track, color = fill), linewidth = 13, lineend = "butt") +
scale_color_identity() +
geom_text(aes(x = (start + end) / 2, label = label), color = "white", fontface = "bold", size = 3.6) +
scale_x_continuous(breaks = 2018:2026, limits = c(2017.7, 2026.6)) +
labs(title = "NCMF moved once — and kept its programs intact",
subtitle = "Placement based on where each year's enacted (GAA) appropriations are recorded", x = NULL, y = NULL) +
theme_ncmf() + theme(panel.grid.major.y = element_blank(),
axis.text.y = element_text(face = "bold", color = "grey20"))
The same program lines run cleanly from 2018 to 2026, so the trends that follow can be read at face value.
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_m_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 = "NCMF current-year appropriations, FY 2018–2026",
subtitle = "Enacted funding grew ~145% (₱535M → ₱1,314M), with a steep ramp in 2025–2026",
x = NULL, y = NULL, caption = "Current-year new appropriations only.") +
theme_ncmf() + guides(color = guide_legend(nrow = 1))
The budget grew at roughly 12% a year, accelerating recently — up ₱265M in FY 2025 and a further ₱181M in FY 2026. The proposed (NEP) and enacted (GAA) lines rarely diverge much: NCMF’s appropriations are largely Executive-led, with Congress fine-tuning at the margin.
totals %>% filter(metric %in% c("NEP","GAA")) %>% mutate(value = total/1e6) %>%
select(year, metric, value) %>% pivot_wider(names_from = year, values_from = value) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA"))) %>% arrange(metric) %>% rename(`PHP M` = metric) %>%
kbl_clean(font = 13, digits = 0, format.args = list(big.mark = ","), na = "")
| PHP M | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| NEP | 574 | 591 | 635 | 686 | 749 | 745 | 868 | 1,075 | 1,166 |
| GAA | 535 | 601 | 672 | 701 | 769 | 760 | 868 | 1,133 | 1,314 |
Growth reads differently once the budget is set against the population NCMF exists to serve.
CENSUS_MUSLIM <- 6981710 # 2020 Census of Population and Housing (6.4% reporting Islam)
pc <- totals %>% filter(metric == "GAA", !is.na(total)) %>%
transmute(year, per_person = total / CENSUS_MUSLIM)
ggplot(pc, aes(year, per_person)) +
geom_col(fill = bar_fill, width = 0.7) +
geom_text(aes(label = sprintf("%.0f", per_person)), vjust = -0.5, size = 3.2, color = "grey20") +
scale_x_continuous(breaks = 2018:2026) +
scale_y_continuous(labels = function(v) paste0(peso, v), expand = expansion(mult = c(0, 0.12))) +
labs(title = "NCMF budget per Muslim Filipino per year, FY 2018–2026",
subtitle = "Even after doubling, the 2026 budget is about ₱188 per person — roughly fifty centavos a day",
x = NULL, y = NULL,
caption = "GAA ÷ 6,981,710 (2020 Census). NCMF estimates the community is larger, which would lower these figures.") +
theme_ncmf()
On the census count, NCMF’s budget has risen from about ₱77 per Muslim Filipino in 2018 to ₱188 in 2026. That is real growth — it has more than doubled — but the level remains small: roughly fifty centavos per person per day to cover cultural and heritage services, Hajj administration, Madrasah and Shari’ah education, livelihood programs, and the agency’s own operations.
The census figure is also the generous reading. NCMF has estimated that Muslim Filipinos are 10–11% of the population rather than the 6.4% recorded in 2020, pointing to under-registration and incomplete survey coverage. On that basis the same budget would work out to roughly ₱110–120 per person per year. Whichever figure is used, the per-person envelope is the context for everything that follows: NCMF spends what it is given reliably, so the binding question is how far that amount can stretch.
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/1e6, fill = direction)) +
geom_col(width = 0.7) +
geom_text(aes(label = ifelse(abs(change) < 1e6, "", sprintf("%+.0f", change/1e6)),
vjust = ifelse(change >= 0, -0.4, 1.2)), size = 3.2, 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, "M"), expand = expansion(mult = c(0.16, 0.18))) +
labs(title = "Enacted minus proposed (GAA − NEP), by year",
subtitle = "Congress tops NCMF up almost every year; the +₱148M FY 2026 add is the largest", x = NULL, y = NULL) +
theme_ncmf() + guides(fill = guide_legend(nrow = 1))
Congress reliably augments NCMF: the enacted budget met or exceeded the proposal in eight of nine years, the only cut being FY 2018 (−₱39M). The +₱148M (+13%) plus-up for FY 2026 is the largest single adjustment in the period.
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, 30)) +
scale_y_continuous(labels = php_m_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 = "Cultural, Religious & Hajj services are roughly two-thirds of the budget throughout", x = NULL, y = NULL) +
theme_ncmf() + guides(fill = guide_legend(nrow = 3, byrow = TRUE)) +
theme(legend.text = element_text(size = 9), legend.key.size = unit(0.4, "cm"))
The green Cultural, Religious & Hajj Services program is the budget: it runs around two-thirds of the total in every year, dwarfing economic empowerment (orange) and social/legal/peace services (purple). Administration and support carry through unchanged. The stable structure means these shares are directly comparable across all nine years.
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_m_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 = "Personnel share fell from 84% (2018) to 56% (2026) as MOOE expanded — a tilt toward operations", x = NULL, y = NULL) +
theme_ncmf() + guides(fill = guide_legend(nrow = 1))
The mix has shifted markedly toward operations. Personnel Services fell from 84% of the budget in 2018 to 56% in 2026, while MOOE climbed to 41% — by 2026 the maintenance-and-operating bill nearly matches the payroll, the clearest sign of a budget being pushed toward delivery rather than staffing.
comp_ec %>% group_by(year) %>% mutate(share = round(amount/sum(amount)*100)) %>% ungroup() %>%
select(expense_class, year, share) %>% pivot_wider(names_from = year, values_from = share) %>%
rename(`Expense class (% of GAA)` = expense_class) %>% kbl_clean(font = 12.5, na = "")
| Expense class (% of GAA) | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| Personnel Services (PS) | 84 | 75 | 73 | 81 | 82 | 83 | 76 | 61 | 56 |
| Maintenance & Other Op. Exp. (MOOE) | 16 | 18 | 23 | 17 | 16 | 17 | 22 | 27 | 41 |
| Capital Outlays (CO) | 0 | 7 | 4 | 2 | 2 | 0 | 2 | 12 | 2 |
top_paps <- pap_year %>% filter(year == 2026, !is.na(GAA), GAA > 0) %>% arrange(desc(GAA)) %>%
slice_head(n = 10) %>% 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_m(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_m_axis, expand = expansion(mult = c(0, .25)), limits = c(0, NA)) +
labs(title = "Top P/A/Ps by FY 2026 GAA",
subtitle = "One line — preservation of Muslim cultural centers & heritage — is 46% of the budget; the top three are 71%",
x = NULL, y = NULL) +
theme_ncmf() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))
The budget is highly concentrated: a single P/A/P — preservation of Muslim cultural centers, heritage, holidays and festivities (₱603M) — is nearly half the total, more than three times the next line, General Management (₱193M). Institutional support for Madrasah/Shari’ah education (₱142M) and Hajj operations (₱104M) follow. The top three lines alone are 71% of the agency.
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 (M)` = NEP/1e6, `GAA 2026 (M)` = GAA/1e6,
`GAA 2025 (M)` = GAA25/1e6, `Net chg 2026 (M)` = (GAA - NEP)/1e6) %>%
arrange(desc(`GAA 2026 (M)`)) %>%
dt_table(page = 10, money_cols = c("NEP 2026 (M)","GAA 2026 (M)","GAA 2025 (M)","Net chg 2026 (M)"))
Because so much of NCMF rides on one P/A/P, it deserves a closer look. The promotion and preservation of Muslim cultural centers, heritage, holidays and festivities has been roughly half the agency every year and has grown in step with the total.
heritage <- pap_year %>% filter(str_detect(pap, "cultural centers")) %>%
select(year, NEP, GAA) %>% pivot_longer(-year, names_to = "metric", values_to = "amount") %>%
filter(!is.na(amount)) %>%
mutate(metric = factor(metric, levels = c("NEP","GAA"), labels = c("NEP (proposed)","GAA (enacted)")))
ggplot(heritage, 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_m_axis, breaks = pretty_breaks(5), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = 2018:2026) +
labs(title = "Promotion & preservation of Muslim cultural centers, heritage & festivities",
subtitle = "A single P/A/P that has been ~half the entire agency every year since 2018", x = NULL, y = NULL) +
theme_ncmf() + guides(color = guide_legend(nrow = 1))
The line grew from ₱299M (2018) to ₱603M (2026) — a 102% rise — holding a 46–60% share throughout. Two things follow. First, because so much rides on one line, its sub-components — which centers, which regions, which festivities, what upkeep — are not visible in the budget documents, so communities cannot easily tell whether the money is reaching them. Second, together with Hajj operations and Madrasah/Shari’ah education, cultural, religious and educational services are the core of NCMF’s budget — the functions the agency exists to deliver — while the livelihood programs (Endowment, Muslim MSEs, Halal) remain barely 5% of the total.
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 NCMF is a strong absorber, with one clear exception.
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_m_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 = "Allotments, obligations & disbursements track closely — except a sharp 2019 disbursement dip",
x = NULL, y = NULL, caption = "Includes new, automatic & continuing appropriations; not comparable to the NEP/GAA series.") +
theme_ncmf() + guides(color = guide_legend(nrow = 1))
The three lines sit close together across fifteen years — what is released is, for the most part, obligated and paid — with one visible break in 2019, when disbursements fell well below obligations.
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.6, 1.02), breaks = seq(0.6, 1, 0.1)) +
scale_x_continuous(breaks = seq(2011, 2025, 2)) +
labs(title = "NCMF absorptive capacity, FY 2011–2025",
subtitle = "Obligation rate stays high (86–99%); cash utilization fell to 68% in 2019, the OEO→DILG transition year",
x = NULL, y = NULL) +
theme_ncmf() + guides(color = guide_legend(nrow = 1))
NCMF obligates almost everything released to it (86–99%) and, in normal years, disburses nearly all of what it obligates. The exception is 2019, when disbursement-to-obligation fell to ~70% (and disbursement-to-allotment to 68%) — the year the agency moved to the DILG, a textbook transition-year cash lag rather than a chronic problem, since the ratio recovered immediately afterward.
exec %>% transmute(Year = year, `Allotments (M)` = Allotments/1e6, `Obligations (M)` = Obligations/1e6,
`Disbursements (M)` = Disbursements/1e6, `O/A` = oblig_allot, `D/O` = disb_oblig, `D/A` = disb_allot) %>%
dt_table(page = 15, money_cols = c("Allotments (M)","Obligations (M)","Disbursements (M)"),
pct_cols = c("O/A","D/O","D/A"))
PHP millions, 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. Per-person figures use the 2020 Census of Population and Housing (6,981,710 Filipinos, 6.4%, reporting Islam); NCMF has estimated the share at 10–11%, so per-person amounts should be read as an upper bound. No FAR No. 1 (P/A/P-level execution) was available for NCMF, so absorption is reported only at the agency aggregate, on a basis not directly comparable to the appropriations series. Prepared as the long-form companion to the NCMF budget briefing.