The invoice says the month cost more. The daily chart in Cost analysis looks busy. Before anyone starts deleting resources, it helps to know which of three shapes you are looking at:

  • A spike: one tall day, then back to normal. Usually a batch job, a data load, a load test or a one-off purchase.
  • A step: the line moves up and stays up. Usually new or larger infrastructure: a scaled-up SKU, a new environment, a replica nobody removed.
  • A rhythm: a regular dip every few days. Usually resources that run on office hours, and the dips are the quiet days.

They need different responses, and you can tell them apart with a Cost analysis export and a spreadsheet in about fifteen minutes.

Step 1: export daily cost for two periods

In the Azure portal, open Cost Management > Cost analysis on the subscription (or the billing scope you care about).

  1. Choose the Daily costs view, or set granularity to Daily in the accumulated view.
  2. Set the date range to the last 28 complete days. Azure publishes cost a day or two after it is incurred, so leave the most recent day or two out; they are not final.
  3. Download the view as CSV.
  4. Repeat for the 28 days just before.

28 days is deliberate: it holds every day of the week exactly four times, so no weekday is over-represented.

Step 2: overlay the two periods

Put both periods side by side, day 1 next to day 1, and chart them as two lines on one axis that starts at zero. An axis that starts at the lowest value makes a 5% wobble look like a cliff.

Now read the shape:

  • One point far above both lines: a spike. Find the date, then group that one day by Service name or Resource in Cost analysis to see what ran.
  • The current line runs at the old level, then jumps and stays higher until the end: a step. Note the first high day; the change was made then. Group the days after it by resource group or resource and compare them with the days before.
  • Both lines go up and down together on the same weekdays: a rhythm, and the next step measures it.

Step 3: average by day of the week

Add a column with the weekday of each date (=TEXT(A2,"dddd") in Excel or Google Sheets), then average the cost per weekday with a pivot table or AVERAGEIF.

Two rules keep this honest:

  • Average only the days that have a cost record. A missing day in the export is not a free day; Azure may not have delivered it yet. Count the days behind each average and show the count.
  • Compare averages, not totals, when the two periods have a different number of recorded days.

What the result tells you:

  • A clear gap between working days and the rest usually comes from resources that run on office hours, or from workloads driven by your users' working week.
  • A flat week comes from resources that run all the time. That is normal for production. If development and test resources are just as expensive on quiet days, they are candidates for an auto-shutdown schedule or for scaling down outside working hours.

Do not label any day a "weekend" in a shared sheet: which days are quiet depends on where your team and your customers are.

Step 4: month by month, by average day

If your range crosses months, compare months by average cost per recorded day, not by total. A month you only cover in part (say 12 days of 15) would otherwise look cheaper than it was.

Doing it on every refresh

The steps above are worth doing once by hand, so you know what you are looking at. Repeating them every week is where it gets tedious.

(I build CostGuard, an Azure cost tool on Azure Marketplace with a Free plan, so weigh this accordingly.) Its Cost trend page does this for the scope you pick: the daily line laid over the period just before on an axis from zero, the daily average and its change, the highest, lowest and latest recorded day, the average by day of the week once the range covers 14 days, and a month-by-month table that marks partial months.

CostGuard's table by day of the week for a sample workspace: seven rows, each with its average cost, a bar and the number of days with cost, the working days clearly higher than the rest.

It only reads cost: the connection uses the built-in Reader role, so it cannot change anything in your Azure.

Honest limits

  • Cost data arrives a day or two late, by hand or in any tool; the newest days can still change.
  • The day-of-week average says when cost is higher, not why. You still group by service or resource to find the cause.
  • CostGuard holds no exchange rates, so a scope billed in two currencies is read one currency at a time.
  • Cost trend is on the Starter plan and up; the Free plan shows a labelled sample of the page.

The full walkthrough of the page, figure by figure: https://hoshebartar.com/en/help/cost-trend?utm_source=devto&utm_medium=article&utm_campaign=kb-cost-trend

How do you read your daily Azure cost: a dashboard, a weekly export, or only when the invoice arrives?