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:
BillingMonthBillingPeriodLabelIsCurrentBillingPeriod
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.

Add to favorites
Leave a Reply
You must be logged in to post a comment.