Theoretical Foundation: Manage Costs by Using Alerts, Budgets, and Azure Advisor Recommendations
1. Initial Intuitionβ
Imagine you are a company's financial manager and receive the electricity bill only once a month, with no tracking during the month. If someone left the air conditioning on unnecessarily for the entire month, you only find out when the bill arrives. At this point, the money has already been spent and there's no way to recover it.
Managing costs in Azure without adequate tools is exactly like this: discovering excessive spending only in the monthly bill, when it's too late to act.
Azure offers three complementary mechanisms to transform this scenario:
Budgets are like the monthly budget: you define how much you can spend and Azure continuously monitors.
Cost alerts are the alarm: when spending approaches or exceeds the budget, you are notified immediately, not at the end of the month.
Azure Advisor is the financial consultant: it analyzes your environment and recommends where you are wasting money and how to optimize.
Together, these three mechanisms form the practice of FinOps in Azure: visibility, control, and real-time cost optimization.
2. Contextβ
Where cost management fits in Azure governanceβ
Cost management depends on the entire organizational structure we built in previous modules. Well-applied tags allow filtering costs by project. Well-organized Resource Groups show cost per application. Separate subscriptions allow isolated billing per environment. Without this foundation, cost management is compromised.
Why these mechanisms existβ
The public cloud model inverts traditional financial control. In on-premises infrastructure, you buy hardware with fixed and predictable costs. In the cloud, cost is variable and can grow at any time: a developer who mistakenly creates 100 VMs, a processing job that doesn't end, a storage account that accumulates data without control.
Without proactive monitoring, cloud costs can surprise negatively. With budgets, alerts, and Advisor recommendations, you maintain financial control without giving up the agility that the cloud offers.
3. Building the Conceptsβ
3.1 Azure Cost Management + Billingβ
Before understanding budgets and alerts, it's necessary to understand the platform that sustains them: Azure Cost Management + Billing.
This is the central financial visibility tool of Azure. It offers:
- Cost Analysis: interactive cost visualization by period, grouped by service, resource, tag, RG, subscription, or any dimension
- Budgets: definition of spending limits with automatic alerts
- Recommendations: integration with Azure Advisor for optimization suggestions
- Exports: automatic cost data export to Storage Account
- Invoices: access to monthly invoices
Cost Management is available for Subscriptions, Resource Groups, and Management Groups. The scope determines which resources are included in the analysis.
3.2 What is a Budgetβ
A Budget in Azure is a definition of spending limit for a specific scope and period. It doesn't block spending (by default), but continuously monitors and triggers notifications when thresholds are reached.
A Budget has the following components:
TimeGrain defines the budget reset period:
| TimeGrain | Period | When to use |
|---|---|---|
| Monthly | Monthly, resets every 1st | Monthly operational budgets |
| Quarterly | Quarterly | Fiscal quarter planning |
| Annually | Annual | Annual budgets approved by board |
| BillingMonth | Billing month | Aligned to Microsoft's billing cycle |
| BillingQuarter | Billing quarter | For EA/MCA with fiscal quarter |
| BillingAnnual | Billing year | For annual contracts |
3.3 Types of cost alertsβ
Within a Budget, you define Notifications that trigger when thresholds are reached. There are two types of threshold:
| Type | What it measures | When to use |
|---|---|---|
| Actual | Cost already incurred and confirmed | Alerts that spending HAS happened |
| Forecasted | Cost projection until end of period | Preventive alerts before cost occurs |
The distinction is critical for action decisions:
An Actual alert at 100% means you have ALREADY spent the entire budget. The action is reactive.
A Forecasted alert at 100% means that, if the trend continues, you WILL reach 100% before the end of the period. The action is preventive.
Anomaly alerts are a third type, independent of budgets: Cost Management uses machine learning to identify unusual spending patterns and automatically notify without needing a defined threshold.
3.4 Budget Scopesβ
Budgets can be created at different scopes in the Azure hierarchy:
| Scope | Covers | Use case |
|---|---|---|
| Management Group | All subscriptions in the MG | Total corporate budget |
| Subscription | All resources in subscription | Budget per environment or BU |
| Resource Group | Only resources in the RG | Budget per project or application |
Budgets in MG and Subscription can be filtered by tags, Resource Groups, services, or specific meters, allowing granular budgets even in broad scopes.
3.5 Azure Advisorβ
Azure Advisor is an automated consultant that continuously analyzes resources in your Azure environment and generates recommendations in five categories:
For cost management purposes, the Cost category is most relevant. Advisor's cost recommendations are based on:
- 30-day analysis of CPU, memory, network, and disk usage
- Comparison of actual usage with contracted SKU
- Analysis of reservations (Reserved Instances) versus pay-as-you-go
- Identification of orphaned resources (disks, IPs, NICs without use)
3.6 Azure Reservations and Savings Plans (Advisor context)β
Advisor frequently recommends Reservations and Savings Plans, which are discount mechanisms through commitment:
| Option | Commitment | Typical discount | Flexibility |
|---|---|---|---|
| Pay-As-You-Go | None | 0% | Total |
| Azure Savings Plan | 1 or 3 years of compute spending | Up to 65% | High (applies to any compute) |
| Reserved Instances | 1 or 3 years of specific resource type | Up to 72% | Low (specific type and region) |
| Hybrid Benefit | Use of existing Windows/SQL license | Up to 85% combined | Medium |
| Spot Instances | No commitment, can be interrupted | Up to 90% | Very low (for fault-tolerant workloads) |
When Advisor identifies that you consistently use a VM type for more than 30 days, it calculates the savings of buying a Reserved Instance and shows the ROI in months.
4. Structural Viewβ
Complete cost management flowβ
How Budget and Advisor complement each otherβ
Budget detects that something is wrong. Advisor explains what and recommends how to fix it.
5. Practical Operationβ
Budget lifecycleβ
Non-obvious Budget behaviorsβ
Budgets DON'T block spending by default. A Budget that reached 100% doesn't automatically stop creating new resources. It only notifies. To automatically block spending, you need to configure an Action Group that triggers an Azure Automation Runbook that applies a Policy or disables resources. This is possible but requires additional configuration.
Cost data has an 8 to 24-hour delay. The cost shown in Cost Management and evaluated by the Budget is not real-time. For resources like VMs and Storage, the typical delay is 8 to 24 hours. For some marketplace services, it can reach 72 hours. This means 100% Actual alerts may trigger after the value has already been exceeded.
Forecasted alerts are more valuable precisely because of this. Since actual data has delays, Forecasted alerts with low thresholds (70-80%) give sufficient margin to act before actual spending is accounted for.
A Budget applies to the defined scope, not the scope where it was created.
A Budget created in Subscription A with tag filter Project=ecommerce monitors only resources with that tag, regardless of RG. Filters are powerful for project budgets that cross multiple RGs.
Multiple alerts in the same Budget are independent. You can have up to 5 notification conditions in a Budget: for example, 50% Actual, 80% Actual, 100% Actual, 80% Forecasted, 100% Forecasted. Each triggers independently and to different recipients if desired.
How Advisor generates cost recommendationsβ
Advisor analyzes 30 days of telemetry data. For VMs, it checks:
- Average CPU usage: if consistently below 5%, recommends reducing SKU or shutting down
- Maximum CPU usage: if peak never exceeds 20%, confirms SKU is overprovisioned
- Inbound network connections: helps confirm if VM is actually in use
A typical Advisor cost recommendation would be:
"VM
vm-analytics-01had average CPU usage of 3% in the last 30 days. Consider reducing from Standard_D4s_v3 (4 vCPUs, $485/month) to Standard_B2s (2 vCPUs, $95/month). Estimated savings: $390/month (80%)."
Advisor doesn't implement recommendations automatically. Every recommendation requires human action or explicitly configured automation.
6. Implementation Methodsβ
Azure Portalβ
When to use: initial configuration, visual cost analysis, reviewing Advisor recommendations
Creating a Budget:
- Portal > Cost Management + Billing > Budgets
- Select scope (Subscription or RG)
- + Add
- Define name, amount, period (Monthly/Quarterly/Annual)
- Define start and end dates
- Optionally: filter by RG, tags, services
- Configure alerts (threshold, Actual/Forecasted type, recipients)
- Create
Checking Advisor recommendations:
- Portal > Azure Advisor
- Cost tab for savings recommendations
- Click each recommendation to see details and estimated savings
- Implement button when available (for some simple actions like VM resizing)
- Postpone or Dismiss button to manage non-applicable recommendations
Cost Analysis:
- Portal > Cost Management + Billing > Cost analysis
- Select period, granularity (daily, monthly)
- Group by: Tag, Resource Group, Service, Location
- Save as custom View for recurring use
Portal limitation: not reproducible, doesn't scale for configuring budgets across multiple subscriptions simultaneously.
Azure CLIβ
# Create Budget in a Subscription
az consumption budget create \
--budget-name "budget-sub-producao-mensal" \
--amount 15000 \
--time-grain Monthly \
--start-date "2026-04-01" \
--end-date "2027-03-31" \
--notifications '{
"alerta_80_actual": {
"enabled": true,
"operator": "GreaterThan",
"threshold": 80,
"threshold_type": "Actual",
"contact_emails": ["cloud-team@empresa.com", "finance@empresa.com"],
"contact_roles": ["Owner", "Contributor"]
},
"alerta_100_actual": {
"enabled": true,
"operator": "GreaterThan",
"threshold": 100,
"threshold_type": "Actual",
"contact_emails": ["cto@empresa.com", "cfo@empresa.com"]
},
"alerta_80_forecast": {
"enabled": true,
"operator": "GreaterThan",
"threshold": 80,
"threshold_type": "Forecasted",
"contact_emails": ["cloud-team@empresa.com"]
}
}'
# Create Budget in a specific Resource Group
az consumption budget create \
--budget-name "budget-ecommerce-mensal" \
--amount 3000 \
--time-grain Monthly \
--start-date "2026-04-01" \
--end-date "2027-03-31" \
--resource-group "rg-ecommerce-prod" \
--notifications '{
"alerta_90": {
"enabled": true,
"operator": "GreaterThan",
"threshold": 90,
"threshold_type": "Actual",
"contact_emails": ["tech-lead@empresa.com"]
}
}'
# List all Budgets in subscription
az consumption budget list --output table
# View details of a Budget
az consumption budget show --budget-name "budget-sub-producao-mensal"
# Delete a Budget
az consumption budget delete --budget-name "budget-sub-producao-mensal"
# View current subscription cost (last 30 days)
az consumption usage list \
--start-date "$(date -d '30 days ago' +%Y-%m-%d)" \
--end-date "$(date +%Y-%m-%d)" \
--query "sort_by([].{
Resource: instanceName,
Service: consumedService,
Cost: pretaxCost,
Currency: currency
}, &Cost) | reverse(@) | [:20]" \
--output table
# View Advisor cost recommendations
az advisor recommendation list \
--category Cost \
--output table
# View Advisor recommendations with estimated savings details
az advisor recommendation list \
--category Cost \
--query "[].{
Recurso: resourceMetadata.resourceId,
Impacto: impact,
Descricao: shortDescription.solution,
Economia: extendedProperties.annualSavingsAmount
}" \
--output table
# Implement a specific Advisor recommendation
az advisor recommendation enable \
--recommendation-id "<recommendation-id>"
# Dismiss a non-applicable recommendation
az advisor recommendation disable \
--recommendation-id "<recommendation-id>" \
--days 30
# Configure automatic cost data export
az costmanagement export create \
--name "export-mensal-sub" \
--type ActualCost \
--scope "subscriptions/<sub-id>" \
--storage-account-id "/subscriptions/<sub-id>/resourceGroups/rg-billing/providers/Microsoft.Storage/storageAccounts/stgbillingexport" \
--storage-container "cost-exports" \
--recurrence Monthly \
--recurrence-period from="2026-04-01" to="2027-03-31"
Azure PowerShellβ
# Create Budget via PowerShell
$notifications = @{
"Alert_80_Actual" = New-AzConsumptionBudgetNotification `
-NotificationKey "Alert_80_Actual" `
-Threshold 80 `
-Operator GreaterThan `
-ContactEmail @("cloud-team@empresa.com", "finance@empresa.com") `
-Enabled $true
"Alert_100_Actual" = New-AzConsumptionBudgetNotification `
-NotificationKey "Alert_100_Actual" `
-Threshold 100 `
-Operator GreaterThan `
-ContactEmail @("cto@empresa.com") `
-Enabled $true
}
New-AzConsumptionBudget `
-Name "budget-sub-producao-mensal" `
-Amount 15000 `
-Category Cost `
-TimeGrain Monthly `
-StartDate (Get-Date -Day 1 -Month 4 -Year 2026) `
-EndDate (Get-Date -Day 31 -Month 3 -Year 2027) `
-Notification $notifications
# List Budgets
Get-AzConsumptionBudget |
Select-Object Name, Amount, CurrentSpend, TimeGrain
# View Advisor recommendations
Get-AzAdvisorRecommendation -Category Cost |
Select-Object ResourceId, Impact, ShortDescription, @{N="Savings"; E={$_.ExtendedProperties.annualSavingsAmount}} |
Sort-Object Savings -Descending
# View resource usage for current month
Get-AzConsumptionUsageDetail `
-StartDate (Get-Date -Day 1) `
-EndDate (Get-Date) |
Group-Object ConsumedService |
Select-Object Name, @{N="TotalCost"; E={($_.Group | Measure-Object PretaxCost -Sum).Sum}} |
Sort-Object TotalCost -Descending | Select-Object -First 10
Bicep for Budgets as codeβ
targetScope = 'subscription'
// Monthly budget for production subscription
resource budgetProd 'Microsoft.Consumption/budgets@2021-10-01' = {
name: 'budget-sub-producao-mensal'
properties: {
category: 'Cost'
amount: 15000
timeGrain: 'Monthly'
timePeriod: {
startDate: '2026-04-01'
endDate: '2027-03-31'
}
notifications: {
Alert_70_Forecast: {
enabled: true
operator: 'GreaterThan'
threshold: 70
thresholdType: 'Forecasted'
contactEmails: ['cloud-team@empresa.com']
contactRoles: ['Owner']
}
Alert_90_Actual: {
enabled: true
operator: 'GreaterThan'
threshold: 90
thresholdType: 'Actual'
contactEmails: ['cloud-team@empresa.com', 'finance@empresa.com']
}
Alert_100_Actual: {
enabled: true
operator: 'GreaterThan'
threshold: 100
thresholdType: 'Actual'
contactEmails: ['cto@empresa.com', 'cfo@empresa.com']
contactRoles: ['Owner']
}
}
}
}
// Budget by Resource Group (different scope)
resource budgetEcommerce 'Microsoft.Consumption/budgets@2021-10-01' = {
name: 'budget-ecommerce-mensal'
properties: {
category: 'Cost'
amount: 3000
timeGrain: 'Monthly'
timePeriod: {
startDate: '2026-04-01'
endDate: '2027-03-31'
}
filter: {
dimensions: {
name: 'ResourceGroupName'
operator: 'In'
values: ['rg-ecommerce-prod']
}
}
notifications: {
Alert_80_Actual: {
enabled: true
operator: 'GreaterThan'
threshold: 80
thresholdType: 'Actual'
contactEmails: ['tech-lead@empresa.com']
}
}
}
}
7. Control and Securityβ
Who can create and view Budgetsβ
| Action | Required Role |
|---|---|
| Create/edit/delete Budgets | Contributor or higher at the Budget scope |
| View Budgets and costs | Cost Management Reader or Reader |
| View cost of individual RGs | Reader on RG |
| Configure exports | Contributor + permission on destination Storage Account |
| Access Advisor recommendations | Reader at the scope |
| Implement Advisor recommendations | Depends on action: usually Contributor on resource |
The Cost Management Reader role is a built-in role that allows viewing all cost data without permission to create or modify resources. It's ideal for finance teams that need visibility without operational access.
Budget alert automation responseβ
A Budget with alert can be connected to an Action Group that triggers an Azure Automation Runbook for automatic response:
This is the only way to make a Budget effectively block spending: through alert response automation.
Cost data securityβ
Cost data in Cost Management contains sensitive information (how much the company spends on each service, usage patterns, application structure). Control who has access to the Cost Management tab:
- Development teams should have access to their RG cost, not the entire subscription
- Finance teams need consolidated subscription or Management Group view
- Use the Cost Management Reader role for visibility without operational power
8. Decision Makingβ
Budget threshold configurationβ
| Situation | Recommended threshold | Type | Recipient |
|---|---|---|---|
| Preventive alert for planning | 70-80% | Forecasted | Cloud team |
| Operational alert for action | 90% | Actual | Cloud team + technical leadership |
| Critical alert for escalation | 100% | Actual | CTO, CFO, managers |
| Immediate anomaly alert | Any anomalous spike | Anomaly detection | Cloud team |
When to act on Advisor recommendationsβ
| Recommendation type | When to implement | Care |
|---|---|---|
| Low usage VM (reduce SKU) | After validating no seasonal peak | Check 90 days, not just 30 |
| Recommended Reserved Instance | When usage is stable and long-term contract acceptable | 1-3 year commitment isn't flexible |
| Disk not associated with VM | Verify if intentional backup or real orphan | Never delete without confirming owner |
| Unused public IP | Check if on standby for DR | Reserved IPs cost even without use |
| Resource unused for 30 days | Confirm with owner before shutting down | May be standby resource |
Budget by scopeβ
| Situation | Budget scope | Reason |
|---|---|---|
| Total company financial control | Root Management Group | Consolidated view of entire organization |
| Budget by line of business | Management Group per BU | Chargeback by business unit |
| Budget by environment (prod, dev) | Subscription | Separate billing per environment |
| Budget by project | Resource Group or tag filter | Project granularity within subscription |
| Budget by team | Owner tag filter in Budget | Teams sharing subscription |
9. Best Practicesβ
Configure Budgets in every new subscription, before creating resources. Every subscription creation process should include, as mandatory step, configuring a Budget with at least three thresholds: 80% Forecasted, 90% Actual, 100% Actual.
Use multiple Budgets with different granularities. One Budget on Subscription for total view and individual Budgets per Resource Group for critical projects. This allows identifying which project is consuming more before the entire subscription is impacted.
Configure Forecasted alerts with lower thresholds than Actual. A Forecasted alert at 70% gives time to act before actual cost reaches 90% or 100%. The asymmetry is intentional: Forecasted is preventive, Actual is reactive.
Review Advisor recommendations weekly. Advisor continuously updates recommendations. A weekly review of Advisor's Cost dashboard, with criteria to implement recommendations above $100/month savings, is a mature FinOps practice.
Don't dismiss Advisor recommendations without documenting reason. Use "Dismiss" function with comment when recommendation doesn't apply. "This VM seems underutilized but is a standby server for DR" is valuable information for future audit.
Combine Budgets with Tags for project budgets.
Configure Budgets with Project tag filters to track cost of projects that have resources in multiple RGs. Tag is the only way to group cost of resources scattered across organization.
Export cost data for historical analysis. Cost Management retains data for 13 months. For longer-term analysis, configure automatic monthly exports to Storage Account. This data can be loaded into Power BI for FinOps dashboards.
Validate Advisor savings before accepting blindly. VM recommendations are based on 30 days. If service has seasonality (Black Friday, fiscal year start), 30 days data may not capture peak. Always validate with resource owner team.
10. Common Errorsβ
| Error | Why it happens | How to avoid |
|---|---|---|
| Believing Budget blocks spending | Confusion with concept; Budget only notifies | Configure response automation if blocking is necessary |
| Creating Budget after cost exploded | Reactivity instead of proactivity | Create Budget as first action when creating subscription |
| Using only Actual alerts | Not knowing Forecasted alerts | Always include at least one Forecasted alert at 70-80% |
| Ignoring Advisor recommendations for months | No review process | Fixed weekly calendar for Advisor review |
| Deleting "orphan" disk recommended by Advisor without checking | Blindly trusting recommendation | Always confirm with owner before deleting |
| Not filtering Budgets by tag for projects crossing RGs | Not knowing Budgets support filters | Use tag filters for project budgets |
| Configuring Budget without Action Group | Email notifications can be ignored | Integrate Budget with Action Group and Teams/Slack |
| Buying Reserved Instance without analyzing trend | Accepting Advisor recommendation without questioning | Check usage for 60-90 days and growth/decline trend |
The costliest errorβ
Not configuring any Budget in a new subscription. A developer creates AKS cluster with dozens of nodes for testing and forgets to shut down. A week later, $15,000 was spent without any alert. With a $500/month Budget with alert at 50% Forecasted, the alert would have fired on the first day.
11. Operation and Maintenanceβ
Monthly cost review (recommended process)β
Monitor Budget statusβ
# View current status of all Budgets with consumed percentage
az consumption budget list \
--query "[].{
Name: name,
Amount: amount,
Spent: currentSpend.amount,
Currency: currentSpend.unit,
Percentage: to_number(currentSpend.amount) / to_number(amount) * 100
}" \
--output table
# Check if any Budget is close to limit
az consumption budget list \
--query "[?to_number(currentSpend.amount) / to_number(amount) > 0.8].{
Name: name,
Amount: amount,
Spent: currentSpend.amount
}" \
--output table
Important limitsβ
| Limit | Value |
|---|---|
| Budgets per subscription | 50 |
| Budgets per Resource Group | 50 |
| Notifications per Budget | 5 |
| Data retention in Cost Management | 13 months |
| Cost data delay | 8-24 hours (up to 72h for some services) |
| Advisor recommendations (update) | Every 24 hours |
12. Integration and Automationβ
Microsoft Teams integration via Logic Appβ
Power BI for FinOps dashboardβ
Configure automatic export to Storage Account and connect to Power BI for real-time FinOps dashboards:
# Create automatic monthly export to Storage Account
az costmanagement export create \
--name "export-custo-mensal" \
--type ActualCost \
--scope "/subscriptions/<sub-id>" \
--storage-account-id "/subscriptions/<sub-id>/resourceGroups/rg-billing/providers/Microsoft.Storage/storageAccounts/stgbillingexport" \
--storage-container "monthly-exports" \
--storage-directory "$(date +%Y)" \
--recurrence Monthly \
--recurrence-period from="2026-01-01" to="2027-12-31" \
--dataset-granularity Daily
In Power BI, connect to Azure Blob Storage and create visualizations of:
- Cost by
Projecttag over time - Top 10 resources by cost in the month
- Budgeted vs. actual comparison by department
- Month-over-month cost growth trend
Budget response automation via Runbookβ
# Runbook: Shut down dev VMs when Budget reaches 100%
param (
[string]$subscriptionId,
[string]$budgetName
)
Connect-AzAccount -Identity
# Shut down VMs with AutoShutdown=true tag in dev RGs
$devVMs = Get-AzVM -Status |
Where-Object {
$_.PowerState -eq "VM running" -and
$_.Tags["Environment"] -eq "Development" -and
$_.Tags["AutoShutdown"] -eq "true"
}
foreach ($vm in $devVMs) {
Write-Output "Shutting down $($vm.Name) - Budget $budgetName reached 100%"
Stop-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Force
}
Write-Output "Total VMs shut down: $($devVMs.Count)"
This Runbook is connected to the Budget's Action Group. When Budget reaches 100%, the alert triggers Action Group, which executes Runbook, which shuts down development VMs automatically.
Azure Advisor API for report automationβ
# Generate weekly cost recommendations report
az advisor recommendation list \
--category Cost \
--query "[?impact=='High'].{
Resource: resourceMetadata.resourceId,
Problem: shortDescription.problem,
Solution: shortDescription.solution,
AnnualSavings: extendedProperties.annualSavingsAmount,
Currency: extendedProperties.savingsCurrency
}" \
--output json > advisor-custo-$(date +%Y%m%d).json
# Calculate total savings from pending recommendations
az advisor recommendation list \
--category Cost \
--query "sum([].extendedProperties.annualSavingsAmount)" \
--output tsv
13. Final Summaryβ
Essential points:
- Budget defines spending limit with notifications but doesn't block spending by default
- Cost alerts have two types: Actual (cost already occurred) and Forecasted (future cost projection)
- Azure Advisor analyzes 30 days of telemetry and generates recommendations in 5 categories; Cost category identifies waste and suggests reservations
- Cost data in Cost Management has 8 to 24 hour delay; some services reach 72 hours
- Budgets can be created at Management Group, Subscription or Resource Group scopes
- To automatically block spending, you need to configure Action Group + Runbook as Budget alert response
Critical differences:
- Budget vs. Resource Lock: Budget monitors spending and notifies; Lock prevents delete/modify operations regardless of cost
- Alert Actual vs. Forecasted: Actual is reactive (spending already occurred); Forecasted is preventive (based on projection)
- Advisor recommendation vs. automatic implementation: Advisor identifies and recommends; implementation is manual or requires configured automation
- Cost Management Reader vs. Reader: Cost Management Reader sees only cost data; Reader sees resources but not necessarily detailed cost
What needs to be remembered for AZ-104:
- Budget does not block expenses; it only notifies
- Limit of 50 Budgets per subscription
- Limit of 5 notifications per Budget
- Advisor analyzes 30 days of usage data for cost recommendations
- Advisor recommendations are updated every 24 hours
- Data retention in Cost Management is 13 months
- Budget supports tag filters, which allows budgets by project even when resources are in multiple Resource Groups
- The Cost Management Reader role is the correct way to provide financial visibility without operational access