National Priorities in Numbers: Budget 2025-26 Flow Overview

Interactive Sankey & Key Budget Visualizations

Author

Zahid Asghar

Published

June 11, 2025

The Pakistan Federal Budget 2025-26 is financed by net revenue receipts of Rs. 11,072 bn and borrowings of Rs. 6,501 bn, matching a total expenditure of Rs. 17,573 bn.

Show code
library(tidyverse)
library(networkD3)
library(plotly)
library(knitr)
library(kableExtra)
library(scales)

theme_set(
  theme_minimal(base_size = 14) +
    theme(
      plot.title    = element_text(face = "bold", size = 16),
      plot.subtitle = element_text(color = "gray40"),
      legend.position = "bottom"
    )
)

Budget Breakdown Table

Show code
library(gt)
library(dplyr)

# Base data with one-time headers
budget_df <- tibble::tibble(
  Section = rep(c("Resources", "Expenditure"), each = 10),
  Item = c(
    "Tax Revenue (FBR) – Fed. Consolidated Fund",
    "Non-Tax Revenue",
    "Gross Revenue Receipts (a)",
    "Less Provincial Share (b)",
    "Net Revenue Receipts (a–b)",
    "Non-Bank Borrowing (NSSs & Others)",
    "Net External Receipts",
    "Bank Borrowing (T-Bills, PIBs, Sukuk)",
    "Privatization Proceeds",
    "Total Resources (I–V)",
    "Interest Payments",
    "Pension",
    "Defence Affairs & Services",
    "Grants & Transfers to Provinces & Others",
    "Subsidies",
    "Running of Civil Government",
    "Provision for Emergency & Others",
    "Federal PSDP",
    "Net Lending",
    "Total Expenditure (A + B)"
  ),
  Amount = c(
    14131, 5147, 19278, 8206, 11072,
    2874, 106, 3435, 87, 17573,
    8207, 1055, 2550, 1928, 1186,
    971, 389, 1000, 287, 17573
  )
) %>%
  mutate(
    Amount = paste0("Rs. ", format(Amount, big.mark = ","))
  )

# Create final gt table
gt(budget_df) %>%
  tab_header(title = "Pakistan Federal Budget 2025-26: Consolidated Breakdown") %>%
  cols_hide(columns = c(Section)) %>%
  cols_label(
    Item = "Revenue & Expenditure Items",
    Amount = "Amount (bn PKR)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Item %in% c("Total Resources (I–V)", "Total Expenditure (A + B)")
    )
  ) %>%
  tab_row_group(
    label = "**Resources**",
    rows = 1:10
  ) %>%
  tab_row_group(
    label = "**Expenditure**",
    rows = 11:20
  ) %>%
  tab_options(table.width = pct(100))
Pakistan Federal Budget 2025-26: Consolidated Breakdown
Revenue & Expenditure Items Amount (bn PKR)
**Expenditure**
Interest Payments Rs. 8,207
Pension Rs. 1,055
Defence Affairs & Services Rs. 2,550
Grants & Transfers to Provinces & Others Rs. 1,928
Subsidies Rs. 1,186
Running of Civil Government Rs. 971
Provision for Emergency & Others Rs. 389
Federal PSDP Rs. 1,000
Net Lending Rs. 287
Total Expenditure (A + B) Rs. 17,573
**Resources**
Tax Revenue (FBR) – Fed. Consolidated Fund Rs. 14,131
Non-Tax Revenue Rs. 5,147
Gross Revenue Receipts (a) Rs. 19,278
Less Provincial Share (b) Rs. 8,206
Net Revenue Receipts (a–b) Rs. 11,072
Non-Bank Borrowing (NSSs & Others) Rs. 2,874
Net External Receipts Rs. 106
Bank Borrowing (T-Bills, PIBs, Sukuk) Rs. 3,435
Privatization Proceeds Rs. 87
Total Resources (I–V) Rs. 17,573
Show code
library(gt)
library(gtExtras)
library(dplyr)
library(scales)

# Budget data with highlight logic used internally, then removed
budget_df <- tibble::tibble(
  Section = rep(c("Resources", "Expenditure"), each = 10),
  `Budget Component` = c(
    "Tax Revenue (FBR) – Federal Consolidated Fund",
    "Non-Tax Revenue",
    "Gross Revenue Receipts",
    "Less Provincial Share",
    "Net Revenue Receipts",
    "Non-Bank Borrowing (NSSs & Others)",
    "Net External Receipts",
    "Bank Borrowing (T-Bills, PIBs, Sukuk)",
    "Privatization Proceeds",
    "Total Resources (I–V)",
    "Interest Payments",
    "Pension",
    "Defence Affairs & Services",
    "Grants & Transfers to Provinces & Others",
    "Subsidies",
    "Running of Civil Government",
    "Provision for Emergency & Others",
    "Federal PSDP",
    "Net Lending",
    "Total Expenditure (A + B)"
  ),
  Amount = c(
    14131, 5147, 19278, 8206, 11072,
    2874, 106, 3435, 87, 17573,
    8207, 1055, 2550, 1928, 1186,
    971, 389, 1000, 287, 17573
  )
) %>%
  mutate(
    `Formatted Amount` = paste0("Rs. ", format(Amount, big.mark = ","))
  )

# Identify rows for highlighting
highlight_rows <- which(budget_df$`Budget Component` %in% c("Total Resources (I–V)", "Total Expenditure (A + B)"))

# Build gt table
budget_df %>%
  select(-Amount) %>%
  gt(groupname_col = "Section") %>%
  cols_label(
    `Budget Component` = "Component",
    `Formatted Amount` = "Amount (bn PKR)"
  ) %>%
  tab_header(
    title = md("**Pakistan Federal Budget 2025‑26**"),
    subtitle = "Detailed breakdown of Resources and Expenditures"
  ) %>%
  tab_style(
    style = list(
      cell_text(weight = "bold", color = "white"),
      cell_fill(color = "#2E86C1")
    ),
    locations = cells_body(rows = highlight_rows)
  ) %>%
  tab_options(
    table.width = pct(90),
    row_group.border.bottom.color = "gray",
    heading.title.font.size = px(18),
    heading.subtitle.font.size = px(14)
  ) %>%
  gtExtras::gt_theme_espn()
Pakistan Federal Budget 2025‑26
Detailed breakdown of Resources and Expenditures
Component Amount (bn PKR)
Resources
Tax Revenue (FBR) – Federal Consolidated Fund Rs. 14,131
Non-Tax Revenue Rs. 5,147
Gross Revenue Receipts Rs. 19,278
Less Provincial Share Rs. 8,206
Net Revenue Receipts Rs. 11,072
Non-Bank Borrowing (NSSs & Others) Rs. 2,874
Net External Receipts Rs. 106
Bank Borrowing (T-Bills, PIBs, Sukuk) Rs. 3,435
Privatization Proceeds Rs. 87
Total Resources (I–V) Rs. 17,573
Expenditure
Interest Payments Rs. 8,207
Pension Rs. 1,055
Defence Affairs & Services Rs. 2,550
Grants & Transfers to Provinces & Others Rs. 1,928
Subsidies Rs. 1,186
Running of Civil Government Rs. 971
Provision for Emergency & Others Rs. 389
Federal PSDP Rs. 1,000
Net Lending Rs. 287
Total Expenditure (A + B) Rs. 17,573

Revenue vs Major Expenditures

Show code
rev <- tibble(
  Category = c("Tax Revenue","Non-Tax Revenue","Privatization Proceeds"),
  Amount   = c(14131, 5147, 87),
  Type     = "Revenue"
)
exp <- tibble(
  Category = c("Interest Payments","Defence","Grants & Transfers",
               "Subsidies","Pension","Running of Govt.","Emergencies"),
  Amount   = c(8207,2550,1928,1186,1055,971,389),
  Type     = "Expenditure"
)
cmp <- bind_rows(rev, exp)

p1 <- ggplot(cmp, aes(x = fct_reorder(Category, Amount), y = Amount, fill = Type)) +
  geom_col(width = .7) +
  coord_flip() +
  scale_y_continuous(labels = comma_format()) +
  labs(
    title    = "Pakistan Budget 2025-26: Revenue vs Expenditure",
    subtitle = "Amount in Billion PKR",
    x        = NULL, y = "Amount (bn PKR)"
  )
ggplotly(p1, tooltip = c("x","y"))

Revenue vs Major Expenditure Categories (bn PKR)


Provincial Allocation

Show code
prov <- tibble(
  Province   = c("Punjab","Sindh","Khyber Pakhtunkhwa","Balochistan"),
  Amount     = c(4076,2044,1343,743)
) %>%
  mutate(Percent = round(Amount / sum(Amount) * 100, 1))

kable(
  prov, 
  caption = "Provincial Fund Allocation 2025-26",
  col.names = c("Province","Amount (bn PKR)","% of Total"),
  align = c("l","r","r")
) %>%
  kable_styling(full_width = FALSE)
Provincial Fund Allocation 2025-26
Province Amount (bn PKR) % of Total
Punjab 4076 49.7
Sindh 2044 24.9
Khyber Pakhtunkhwa 1343 16.4
Balochistan 743 9.1

Provincial Fund Allocation (bn PKR)

Show code
plot_ly(
  prov, labels = ~Province, values = ~Amount, type = "pie",
  textinfo = "label+percent",  hoverinfo = "label+value"
) %>%
  layout(
    title = "Provincial Allocation Breakdown",
    legend = list(orientation = "h", x = 0.2, y = -0.1)
  )

Provincial Fund Allocation (bn PKR)


Interactive Sankey Flow

Show code
nodes <- data.frame(
  name = c(
    # Revenue/Borrowing Sources (0–4)
    "Tax Revenue", "Non-Tax Revenue", "Privatization",
    "Borrowing (Domestic)", "Borrowing (Foreign)",
    # Intermediate stages (5–7)
    "Net Revenue", "Borrowing Total", "Total Resources",
    # Expenditure areas (8–14)
    "Interest", "Pension", "Defence", "Grants", "Subsidies", "Civil Govt", "Emergency",
    # Development (15–16)
    "Federal PSDP", "Net Lending"
  ),
  group = c(
    rep("Revenue", 3), rep("Borrowing", 2),
    rep("Intermediate", 3),
    rep("Expenditure", 7),
    rep("Development", 2)
  ),
  stringsAsFactors = FALSE
)

links <- data.frame(
  source = c(0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7),
  target = c(5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),
  value  = c(14131, 5147, 87, 2874, 106, 11072, 6502, 8207, 1055, 2550, 1928, 1186, 971, 389, 1000, 287)
)
Show code
# Define color scale
col_scale <- 'd3.scaleOrdinal()
  .domain(["Revenue","Borrowing","Intermediate","Province","Expenditure","Development"])
  .range(["#2E7D32","#C62828","#1565C0","#F57C00","#6A1B9A","#00695C"])'

sankeyNetwork(
  Links      = links,
  Nodes      = nodes,
  Source     = "source",
  Target     = "target",
  Value      = "value",
  NodeID     = "name",
  NodeGroup  = "group",
  colourScale= col_scale,
  nodeWidth  = 30,
  nodePadding= 12,
  fontSize   = 12
)

Pakistan Federal Budget 2025-26: Flow Diagram


Key Findings

  1. Heavy Debt Service Interest payments consume nearly half of net revenues.

  2. Skewed Spending Current obligations (salaries, subsidies, debt service) dominate; development outlays are just 7.4%.

  3. Dependence on Tax Tax receipts cover over 80% of net revenues, underlining vulnerability to revenue shortfalls.


Prepared by Zahid Asghar — Source: Pakistan Federal Budget 2025-26