by ACloud.Solutions
AzClean Reporting
Turn AzClean CSV exports into something you can hand to a client: an HTML report, a Markdown summary and a Teams or Slack digest.
PowerShell 5.1 or 7+ · no modules, no Azure connection · requires AzClean for the input
AzClean Reporting // Client-ready output by ACloud.Solutions ------------------------------------ [*] Reading 9 CSV file(s)... orphans.csv -> Orphaned resources: 7 (137.26 USD/mo) snapshots.csv -> Stale snapshots: 2 (47.62 USD/mo) nsg-findings.csv -> Network security groups: 4 public-storage.csv -> Public storage exposure: 2 stale-rbac.csv -> Stale and risky access: 3 cost-by-tag.csv -> Spend by tag: 3 (6,828.68 USD/mo) [+] HTML report : AzClean-Report-2026-09-07.html [+] Markdown : AzClean-Summary-2026-09-07.md 184.88 USD/month identified, 11 security finding(s) Spend-by-tag is existing spend, not recoverable waste, so it is excluded from the headline figure.
One wrong number and you argue with the wrong people
A report is only useful if a client can check it. That means the headline has to be defensible, so the arithmetic is deliberately conservative.
Spend-by-tag is excluded
That report shows existing spend, not recoverable waste. Folding it in would inflate the headline by an order of magnitude and destroy the report the moment anyone checks.
Caveats travel with the numbers
AzClean's pricing caveats carry through to the report footer: retail list prices, ignoring reservations, savings plans, Hybrid Benefit and negotiated discounts.
Severity first
Findings are grouped and ordered security, then cost, then governance, so the conversation starts with the part that is not about money.
Three outputs from one command
Point it at a folder of CSVs and it writes all of them.
HTML report
Self-contained, light and dark, responsive, and laid out to print or PDF cleanly, because that is how these actually get sent.
Markdown summary
A table you can paste straight into a ticket or an email.
Teams and Slack digests
Optional webhooks. Nothing is uploaded anywhere unless you pass one.
White-labelling
-WhiteLabel strips every AzClean and ACloud.Solutions reference so the report goes out under your own name, with -LogoText for your wordmark. Consultant tier and above.
Reads anything
Each CSV is classified by its header signature, falling back to the filename. It renders whatever columns it finds, so it survives AzClean gaining a column and handles exports it has never seen.
Sample data included
A CSV from each of the ten AzClean scripts, so you can generate a report before you have run anything.
Pick your licence
Same files in every tier. What changes is what you are allowed to do with them. Lifetime updates on all three, with no subscription and no renewal.
Single Organisation
For your own estate
$39
one-time · lifetime updates
- Everything in the pack
- Your own tenants and subsidiaries
- Modify it freely, commercial use included
- Lifetime updates
Consultant
For client engagements
$99
one-time · lifetime updates
- Everything in Single Organisation
- Hand clients a white-labelled report
- Run it as part of paid engagements
Redistribution
For building on
$499
one-time · lifetime updates
- Everything in Consultant
- Embed the reporting in what you sell
- Ship to any number of your customers
A licence to build on, not to resell as-is.
Get RedistributionNot sure which tier? Ask us.
Questions
Four quick ones.
Do I need AzClean?
Yes, for the input. This reports on AzClean CSV exports and does not talk to Azure itself. The free script produces a CSV too, so you can see the reporting work before buying the full toolkit.
Can I send the report to a client?
Yes, with -WhiteLabel, on a Consultant licence or above. That strips all branding so it goes out as your own work. The licence has a row for exactly this.
Does it need modules or credentials?
Neither. It reads CSVs off disk. No Az modules, no Graph, no Azure connection, and nothing leaves your machine unless you pass a webhook.
What if AzClean changes its output?
The parser is schema-agnostic by design: it classifies on header signature and renders whatever columns exist, so a new column appears in the report rather than breaking it.
Findings are not a deliverable
Turn them into something a client can read, in one command.