Skip to main content

Azure FinOps Monthly Report

Generate a cross-validated Azure cost report with interactive dashboard, CxO executive summary, and Azure Advisor-sourced recommendations — in under 15 minutes.

Quickstart (2 steps)

# Step 1: Export CSV from Azure Portal > Cost Management > Cost Analysis > Export
# Save to: data/finops/azure/YYYY-MM/cost-analysis-{subscriptions,services}.csv

# Step 2: Generate report + dashboard
/finops:azure-monthly --billing-period YYYY-MM --budget YOUR_BUDGET_NZD --data-dir data/finops/azure/YYYY-MM

Or manually:

export AZURE_MONTHLY_BUDGET_NZD=45000
python azure-finops-dashboard.py
open azure-finops-dashboard.html

Prerequisites

RequirementHow to Verify
Azure CLI installedaz --version
Authenticatedaz login then az account show
ADLC framework.claude/ directory exists in your project
Portal CSV exporteddata/finops/azure/YYYY-MM/cost-analysis-subscriptions.csv exists

Environment Variables

export AZURE_SUBSCRIPTION_ID=YOUR_SUBSCRIPTION_ID
export AZURE_TENANT_ID=YOUR_TENANT_ID
export AZURE_LOCATION=YOUR_REGION # e.g., australiaeast
export AZURE_MONTHLY_BUDGET_NZD=YOUR_BUDGET # e.g., 45000
export AZURE_OVERAGE_THRESHOLD_PCT=10 # Alert at 10% over budget

Monthly Process (5 Steps)

Step 1: Export Portal CSV (SSOT)

  1. Open Azure Portal > Cost Management > Cost Analysis
  2. Set date range to the billing month (e.g., Feb 1-28, 2026)
  3. Group by: Subscription → Click Export → Save as cost-analysis-subscriptions.csv
  4. Group by: Service Name → Click Export → Save as cost-analysis-services.csv
  5. Save both to: data/finops/azure/YYYY-MM/
Why Portal CSV, Not API?

The Azure Cost Management API (az rest) only returns data for subscriptions where you have RBAC Reader access. Portal CSV exports at EA billing scope include ALL subscriptions — even those without RBAC. See SSOT Hierarchy below.

Step 2: Run the Report Command

/finops:azure-monthly --billing-period YYYY-MM --budget 45000 --data-dir data/finops/azure/YYYY-MM

This generates:

  • Interactive HTML dashboard (Plotly charts, budget gauge, KPI cards)
  • CxO executive report (markdown)
  • Stakeholder email (copy-paste ready)
  • CSV exports (subscription costs, service breakdown)
  • Excel workbook
  • Cross-validation evidence (JSON)

Step 3: Review Azure Advisor Recommendations

  1. Open Azure Portal > Advisor > Cost tab
  2. Filter: All subscriptions
  3. Note each recommendation's:
    • Yearly savings (NZD)
    • Impacted subscription and resource
    • Impact level (High/Medium/Low)
    • Recommendation type ID (for audit trail)
  4. Add to the dashboard and CxO report
Savings Must Be Advisor-Sourced

Never include savings estimates from pricing pages, calculations, or agent-generated numbers. Azure Advisor recommendations are evidence-based and include the recommendation type ID for independent verification.

Step 4: Send to Stakeholders

Copy azure-email.txt to your email client. Attach:

  • azure-finops-dashboard.html (interactive dashboard)
  • azure-cxo-report.md (executive summary)
  • subscription-costs.csv + service-breakdown.csv

Step 5: Archive Evidence

# Evidence is auto-saved to:
# Git-tracked: projects/CloudOps-S1/finops-reports/YYYY-MM/
# Ephemeral: tmp/cloud-infrastructure/finops/azure/

Deliverables

FileFormatAudienceContent
azure-finops-dashboard.htmlHTMLCxO, FinOpsInteractive charts, KPIs, budget gauge
azure-cxo-report.mdMarkdownCFO, CTOExecutive summary, top subscriptions, services, recommendations
azure-email.txtPlain textStakeholdersCopy-paste email with key figures
azure-stakeholder-email.mdMarkdownCloudOpsDetailed email with data quality, Advisor table
subscription-costs.csvCSVAnalyticsPer-subscription breakdown with cost tiers
service-breakdown.csvCSVAnalyticsPer-service breakdown with categories
azure-monthly-YYYY-MM.xlsxExcelFinanceWorkbook with styled sheets
azure-scoring.jsonJSONQAAgent scoring evidence

Data Source Hierarchy

┌─────────────────────────────────────────────────────────────┐
│ 1. Portal CSV (EA billing) ← AUTHORITATIVE │
│ Includes ALL subscriptions regardless of RBAC │
│ │
│ 2. Azure API (az rest) ← RBAC-SCOPED │
│ Only returns subs where user has Reader access │
│ May be PARTIAL — missing ungoverned subscriptions │
│ │
│ 3. MCP Server ← VALIDATION ONLY │
│ Cross-check layer, not primary source │
└─────────────────────────────────────────────────────────────┘

When API total < Portal CSV total: A subscription exists in the EA billing that the current user cannot access via API (no RBAC Reader). Document the gap with subscription-level reconciliation.

Anti-pattern: FINOPS_API_SSOT_MISMATCH — presenting API-only totals as authoritative without the RBAC caveat.


Cross-Validation

Every monthly report should include a cross-validation check:

# Compare API result vs Portal CSV
# API: az rest query → total across accessible subscriptions
# Portal: CSV sum → total across ALL subscriptions (EA billing)
# Delta: If > 1%, investigate which subscriptions are missing

The cross-validation evidence is saved as cross-validation-YYYY-MM-DD.json with:

  • L1 (API total), L2 (CLI total), L3 (Portal CSV total)
  • Variance percentage
  • Root cause if delta exists
  • 5-why analysis for material gaps

Configuration

ParameterEnvironment VariableDefaultDescription
SubscriptionAZURE_SUBSCRIPTION_IDRequiredPrimary subscription UUID
TenantAZURE_TENANT_IDRequiredAzure AD tenant UUID
RegionAZURE_LOCATIONaustraliaeastPrimary Azure region
BudgetAZURE_MONTHLY_BUDGET_NZDRequiredMonthly budget in NZD
OverageAZURE_OVERAGE_THRESHOLD_PCT10Alert threshold (%)

Monthly Cadence

WeekActionCommand
1st of monthExport prior month CSV from PortalManual (Azure Portal)
1st of monthGenerate report + dashboard/finops:azure-monthly
1st of monthReview Advisor recommendationsManual (Azure Portal > Advisor)
1st of monthSend stakeholder emailCopy azure-email.txt
Mid-monthCheck budget vs MTD/finops:azure-monthly (current month)