tech-cost-transparency

Part A — Methodology Note: Cost Transparency & Attribution

Scope: Meridian Technology Infrastructure, General Ledger for Q1 2025 (Jan to Mar), total base of $40.17M. This note explains how raw GL spend is attributed down to Product and Application and rolled up to Program and Funding Request, how the shared-overhead bucket is handled, the assumptions made, and the headline findings.

Data model

The analytical layer is a star schema built in staged layers: raw CSV tables, cleaned staging, an intermediate allocation layer, and a final mart. The core fact, FCT_FULLY_LOADED_COST, is at grain of one row per date x cost_pool x product x application. Cost pool is deliberately kept in the grain (rather than collapsed) so that scenario analysis can act on individual pools. Two satellite facts share conformed dimensions: VW_VARIANCE (actual vs budget vs forecast at product grain) and the retained consumption fact (driver volumes, also the unit-cost denominator). Program and Funding Request are not native to any cost table; they are reached through a product-to-funding-request bridge derived from the budget/forecast data.

Allocation methodology

Cost is attributed in two hops:

  1. Cost pool to product. GL rows already tagged to a product (for example hardware depreciation) are treated as direct cost. Rows with no product (labour, cloud, data centre, vendor) are split across their target products using FACT_ALLOCATION_MAP for the rule and FACT_CONSUMPTION for the weights (each product’s share of the relevant driver volume: vCPU-hours, GB stored, headcount, or tickets).
  2. Product to application. Each product’s cost is split across its applications in proportion to each application’s share of that product’s driver volume for the period.

The result rolls up cleanly to Program and Funding Request. Allocation reconciles to the GL to within rounding (allocated $40,171,993 vs GL $40,172,000, a difference of $7, or 0.00002%, from floating-point share arithmetic).

Shared / unallocated overhead (CP99 / PR99)

The CP99 “Shared / Unallocated Overhead” pool (carried on product PR99) is $3.2M, about 8% of the base. It has no allocation rule and no consumption meter, so it cannot be split by a driver. Policy adopted: spread it pro-rata to each application’s direct-plus-allocated cost, but carry it in its own column (overhead_loading_usd) separate from fully_loaded_usd. Rationale: shared overhead tends to scale with the size of the operation it supports, and with no driver available, cost is the best proxy. Keeping it in a separate column means the loading is fully transparent and can be toggled off. Trade-off: pro-rata to cost makes large products absorb more overhead regardless of causation; headcount or an even split are defensible alternatives and are candidates for sensitivity testing.

Key assumptions

  1. Mixed-driver pools (equal group weighting). Labour (CP01) and Data Centre (CP04) each allocate across products measured in different units (for example CPU-hours and headcount), which are not directly comparable. Each driver group is given an equal share of the pool, then split within the group by measured volume. This is the single most influential assumption (see Findings).
  2. Carry-forward for missing driver feeds. Where a product’s usage feed is absent for a month, the most recent prior month’s volume is used as the weight rather than dropping the cost. This is standard treatment for a late or missing feed and is why the model reconciles to the GL.
  3. Variance comparison basis. Actual is compared to budget and forecast on a direct-plus-allocated (pre-overhead) basis, since budgets are not set with allocated overhead loaded. Overhead is reported separately.
  4. Funding-request mapping. Product maps 1:1 to a single funding request in this dataset. FR0004 is intentionally unmapped and is left as-is.

Findings

Limitations and next steps

With more time: sensitivity-test the labour split under alternative bases; model the product-to-funding-request relationship as a weighted many-to-many (it is 1:1 here but often is not in practice); and add a backstop for any driver group with no history at all (none occurs in this dataset). The full period is only one quarter, so trend statements are directional.