Building a FinOps Cost Intelligence Dashboard on Azure: From Raw Data to Operational Insight

Over the past few weeks, I built a FinOps cost intelligence workflow that ingests Azure daily cost data, stores it in Dataverse with precision accuracy, and visualizes trends and billing-cycle insights through a Power BI dashboard. What started as a simple reporting idea evolved into a structured platform — complete with governance, automation, and operational runbooks.

This article documents the journey — the design choices, data modeling lessons, the billing-cycle challenge, and how Power Platform + Power BI came together to create something useful, repeatable, and extensible.


🌍 Why I Built This

Azure billing is easy when costs are large — but many workloads generate micro-charges across hundreds of services. The native portal shows totals, but not:

  • Daily burn-up trends
  • Dev vs Prod allocation
  • Top cost drivers by workload
  • Non-calendar billing cycles
  • Precision-preserved cost tracking

I wanted a solution that was:

  • accurate
  • auditable
  • automation-friendly
  • aligned to FinOps practices

So instead of connecting Power BI directly to the Cost API, I designed a small platform around it.


🧩 Architecture — Ingest, Normalize, Store, Analyze

The solution follows a clear pattern:

1️⃣ Power Automate Flow
Pulls daily usage from the Azure Cost API at 2:00 AM, normalizes fields, and preserves precision using micro-currency units.

2️⃣ Dataverse (CloudCostLedger)
Acts as the system of record — enabling governance, auditability, and future workflow automation.

3️⃣ Power BI Dataset & DAX Semantic Layer
DimDate handles billing-cycle logic (20th → 20th), not just calendar months.

4️⃣ FinOps Dashboard
Burn-up trends, Dev vs Prod insights, top resource groups, anomaly awareness.

This separation makes the platform maintainable and production-ready.


🧱 The Data Model — Precision & Billing Context Matter

Every cost record is stored with a composite uniqueness key:

Date + SubscriptionId + ResourceGroup + ServiceName + MeterId

To preserve accuracy, costs are stored as CostMicro, then converted in DAX instead of rounding upstream.

The most interesting design problem was the non-calendar billing cycle. Instead of forcing visuals to work around it, I added these fields in DimDate:

  • BillingMonth
  • BillingPeriodLabel
  • IsCurrentBillingPeriod

This allowed clean toggle behavior:

Full View vs Current Billing Period

and enabled burn-up, MTD totals, and daily burn rate to behave correctly.


📊 The Dashboard — More Than Just a Report

Some of the key visuals include:

  • Cumulative Billing Spend (Smart) — forward-fills missing days
  • Daily Burn Rate — meaningful for trend awareness
  • Dev vs Prod Split — quick environment signal
  • Top 10 Resource Groups — cost driver visibility
  • Subscription / Workload filters — FinOps-friendly navigation

A subtle but important UX element is the footer:

“Data refresh: 2:00 AM daily • Billing Window 20th–20th • Powered by FinOps”

Tiny details like that build trust and reduce confusion.


⚙️ Operational Discipline — Not Just a Dashboard

I treated this like a real platform:

  • Daily runbook
  • Incident log & RCA structure
  • Deployment guide
  • Support playbook
  • Decisions log (ADR-lite)

These artifacts turned a prototype into something repeatable, supportable, and enterprise-ready.

This experience reinforced that FinOps is not just reporting — it’s operational stewardship.


🎯 What I Learned

  • Precision matters when dealing with micro-usage billing
  • Billing periods rarely align with calendars — the model must respect reality
  • Forward-fill smoothing prevents misleading cost spikes
  • Separate ingestion vs analytics leads to cleaner architecture
  • Governance documents are not overhead — they are leverage
  • Power Platform + Power BI is extremely powerful when treated as a system

🚀 What’s Next

Future enhancements I plan to explore:

  • Automated anomaly detection
  • Budget variance alerting
  • Tag-based allocation modeling
  • Multi-subscription / multi-tenant scaling
  • Optional Fabric / Lakehouse backend

This project is just the beginning — but it already delivers actionable FinOps insight.


💡 Final Thought

Cost visibility is not about graphs — it is about awareness, accountability, and decision support. Building this dashboard helped transform raw Azure cost data into something the platform — and the business — can actually use.

FavoriteLoadingAdd to favorites

Comments

Leave a Reply


RECENT POSTS


Categories



Tags

ADO ai angular asian asp.net asp.net core azure ACA azure administration Azure Cloud Architect Azure Key Vault Azure Storage Blazor WebAssembly BLOB bootstrap c# containers css datatables design pattern docker excel framework Git HTML JavaScript jQuery json knockout lab LINQ linux power bi powershell REST API smart home SQL Agent SQL server SSIS SSL SVG Icon typescript visual studio Web API window os wordpress


ARCHIVE


DISCLAIMER