Use immutable Budget, append-only Actuals, Commitments, CategoryMap, and Summary tables. Stable key = MonthStart|CostCenter|Category. Map CategoryCode through CategoryMap and keep unmapped transactions in Review while still reconciling their amount.
Summary columns: Month, CostCenter, Category, Owner, Budget, Actual, Commitments, OwnerRemainingEstimate, Forecast, ActualVariance, ActualVariancePct, ForecastVariance, ForecastVariancePct, Status, Comment. Populate Actual with SUMIFS on PostingDate month bounds plus mapped dimensions; use the same dimensions for commitments. Forecast = Actual+Commitments+OwnerRemainingEstimate. Variance = Actual−Budget; percentage returns N/A when Budget is zero.
Status examples: Review for unmapped data; Forecast over budget above an agreed materiality threshold; Timing if actual is low but commitments explain the gap; On track otherwise. Do not automatically call negative actual variance savings. Reconcile Actuals total, including Review, to the finance export; check TransactionID uniqueness; reconcile Summary budget to Budget_v2; show unclassified amounts separately; lock formula and approved-budget cells; record refresh date and budget version.