TaxIntellilytics Stories

Data & methodology

How every number is produced

14 datasets, 1,234 indicators, 10,271 observations, every one traceable back to this pipeline.

34 of 34 declared breakdown tables in the source workbook reconcile exactly to their stated totals (see DATA_QUALITY_REPORT.md in the repository for the full test log). Where a number cannot be verified this way, it is not published as fact.

Data sources

The primary source for the Gospel of Tax and the Tax Data Observatory is a single URA research workbook (URA_Dataset_FY2015_2026_INTEGRATED.xlsx), covering 14 data sheets plus a published data dictionary. Uganda Revenue Authority Annual Data Books; Uganda Bureau of Statistics (GDP, trade).

Coverage

FY2015/16 through FY2024/25 for most sheets (complete years); a handful of integrated sheets extend into a partial FY2025/26. Coverage per sheet is listed in full in DATA_AUDIT.md.

Definitions

Every indicator is defined once in the source workbook's own data dictionary and carried through unchanged: 414 dictionary entries, machine-readable at data/canonical/data_dictionary.json.

Transformations

The workbook (wide format: indicator rows × fiscal-year columns) is extracted programmatically (scripts/extract_all.py) into a tidy long-format table (data/canonical/long.json): one row per observation, nothing recalculated at this stage.

Calculations

Derived metrics (growth multiples, CAGR, shares) are computed once in lib/analytics.ts from the tidy data and reused by every chart and figure, so a number can never drift from the formula that produced it. Ratios to GDP and the achievement rate come from one shared evidence base (lib/fiscalLab), described below. Every formula is documented in METRICS.md.

Assumptions

None of the underlying figures are estimated or modelled by us: they are the workbook's own reported values. The exception is a ratio we can recompute from its own components: where the printed ratio disagrees with its components, we publish the recomputation and keep the printed value beside it, flagged. Where the workbook itself notes an assumption (e.g. a category reported as zero because it was not tracked before a given year), that note is preserved rather than silently dropped.

Limitations

Documented in full in DATA_QUALITY_REPORT.md: known missing-value counts per sheet, one structural break (Fees & Licenses/NTR reclassification at the FY2020/21→FY2021/22 boundary) that needs caution before charting across it, and a small number of undocumented indicators. Nothing here is hidden from the reader.

Reproducibility

The extraction and reconciliation pipeline is deterministic and re-runnable end to end: extract_all.py → reconcile_totals.py → compute_metrics.py → npm test. The canonical data and dictionary are downloadable from the Tax Data Observatory.

Ratios to GDP and the achievement rate

Every ratio to GDP on the site uses one GDP series: Uganda Bureau of Statistics (UBOS), Annual GDP, June 2026 release (FY2025/26 publication tables), current prices, base year 2016/17, FY2014/15 to FY2025/26. Each ratio is recomputed from its own numerator in the URA workbook over that series. We checked the series against the UBOS release file itself.

The workbook's GDP column joins older and preliminary GDP estimates, and the Data Book printed some ratios on older GDP figures. Where a printed ratio differs from our recomputation by more than 0.01 percentage points, we publish the recomputation and keep the printed value beside it, flagged. For FY2024/25, net URA collections were 13.88% of GDP on this series; the Data Book printed 13.98%.

The ratios, and what each one measures

  • Net URA collections / GDP. Net URA collections (after refunds) divided by nominal GDP of the same fiscal year. Not 'tax revenue / GDP': may include non-tax revenue collected by URA.
  • Gross URA collections / GDP. Gross URA collections (before refunds) divided by nominal GDP.
  • Domestic taxes / GDP. Gross domestic tax collections divided by nominal GDP.
  • Taxes on international trade / GDP. Taxes on international trade divided by nominal GDP.
  • Direct domestic taxes / GDP. Direct domestic taxes (PAYE, corporate tax and other income taxes) divided by nominal GDP.
  • PAYE / GDP. PAYE collections divided by nominal GDP.
  • Corporate tax / GDP. Corporate income tax collections divided by nominal GDP.
  • Excise duty (domestic) / GDP. Domestic excise duty collections divided by nominal GDP.
  • VAT (domestic) / GDP. Domestic VAT collections divided by nominal GDP. The workbook prints no VAT / GDP column.

"Net URA collections / GDP" is not "tax revenue / GDP": net collections may include non-tax revenue that URA collects. We do not publish a tax revenue / GDP ratio from URA's data, because the data does not separate tax from non-tax revenue in every year.

The achievement rate

Net collections divided by the net target URA reported for the year. For FY2019/20 and FY2020/21 the targets come from URA's Annual Revenue Reports, because the workbook holds different ones. The printed rate differs from its own inputs in 3 years (FY2015/16, FY2017/18, FY2023/24): two are workbook errors confirmed by URA's Annual Revenue Reports, and one, in the FY2024/25 Data Book, divides gross collections by the net target. We publish the recomputed rate.

Sources, every conflict found and how it was settled, and a log of each correction with the values before and after, are in the repository: data/fiscal-lab (registry, definitions, CHANGELOG.md) and docs/fiscal-intelligence-lab/p0-evidence-foundation/EVIDENCE.md. Tests in lib/fiscalLab recompute every published ratio.

See also How we work for editorial policy, and the Observatory's Sources page for per-indicator citations.