Free tool
Find the cloud bill gotchas in your own AWS, Google Cloud or Azure bill.
Drop in your billing export from AWS, Google Cloud or Azure. The checker looks for each gotcha from our free guide, shows the dollars each one costs you, and tells you how to check it yourself.
- Every dollar figure comes from your own file.
- Each check says found, not found, or can't tell from the bill, and why.
- Amounts stay in your file's own currency. Nothing is converted.
- Reads FOCUS exports from all three clouds, the AWS Cost and Usage Report (legacy and CUR 2.0) and Cost Explorer CSV, Azure cost details (EA, MCA and pay-as-you-go), and a Google Cloud billing export through a query we give you. CSV or CSV.gz.
Your file is analyzed in your browser. Nothing is uploaded.
The file is read on your device, in a background worker. The page's security policy blocks it from sending your data anywhere. How to verify it.
The sample is a made-up bill for a company that does not exist. None of its numbers are real. Each cloud has its own made-up sample.
Reading your file in your browser
Starting…
We could not read that file
Need help exporting the right file? See how to export your bill.
Cloud Bill Gotchas Checker report, revelations.consulting/checker
Your results
Results
Spend on the line items behind the gotchas we found
$0.00
Get the detailed breakdown and a printable report
For each gotcha: the top usage types, accounts and resources behind the dollars, and a report you can print or save as PDF for your team. You also get the free guide.
Your results stay on this page. The signup sends only your email address.
Want us to go through it with you?
Book a free 30-minute consult: we'll look at your bill with you, no obligation and no sales pitch.
Book a free 30-minute consultGetting your file
How to export your bill
Export the last two or three months. The checker works out the cloud and the format from the column names and tells you what it found. Amounts stay in your bill's own currency.
AWS
CUR 2.0 (Data Exports)
In the Billing and Cost Management console, open Data Exports and create a standard data export (CUR 2.0) with resource IDs included, delivered as CSV with gzip to an S3 bucket. Download the files for the last two or three months and drop them in together. To see Kubernetes pod costs, turn on split cost allocation data first.
Legacy Cost and Usage Report
If you already have a legacy CUR delivered to S3, download the .csv.gz parts for the months you want and drop them in. Columns are matched by name, so either column style works.
FOCUS (Data Exports)
In Data Exports, create a FOCUS export with all columns, as CSV with gzip. AWS's FOCUS export keeps its usage types (x_UsageType, or SkuMeter in FOCUS 1.2), so most checks can run. It has no split cost allocation data.
Cost Explorer CSV (fewer checks)
In Cost Explorer, set the last three months, monthly granularity, group by Usage type, and choose Download as CSV. It has no resources, accounts, tags or commitment line items, so these checks can't run on it: Discounting your waste, Kubernetes requests vs. reality, Logs nobody reads, and Nobody owns the bill. Grouped by Service, only the CI/CD and AI checks can run.
Azure
Cost Management export (amortized)
In the Azure portal, search for Cost Management, choose your billing scope, then open Exports and select + Create. On the Datasets tab, select + Add export and choose the type of data Cost and usage details (amortized). Amortized cost is the one that shows unused reservations and savings plans. On the Destination tab, choose CSV and Gzip compression, then Review + create. Download the files for each month from the storage account and drop them in together. Enterprise Agreement, Microsoft Customer Agreement and pay-as-you-go column names all work.
FOCUS export
The same steps with Cost and usage details (FOCUS) as the type of data also work. It combines actual and amortized cost in one file.
Downloaded usage file
Without an export: on a Microsoft Customer Agreement, open the billing scope overview, then Download usage and prices, then Azure usage file, Prepare and Download. On an Enterprise Agreement, open Usage + charges and download the usage details. On pay-as-you-go, open Invoices and download the usage details. The pay-as-you-go file has no charge types, so the commitment check can't run on it.
Google Cloud
Billing export to BigQuery, then one query
Google Cloud sends billing data to BigQuery, not to a file. If it isn't on yet: in the console, open Billing, then Billing export, and on the BigQuery export tab enable the Standard usage cost export to a dataset. A multi-region dataset gets data from the start of the previous month; a regional one only from the day you enable it.
Then open BigQuery, start a new SQL query, paste the query below, and put your own table name in the FROM line (gcp_billing_export_v1_ followed by your billing account ID). Run it, then choose Save results and save it as a CSV file on your computer. BigQuery limits a CSV saved to your computer to 10 MB; if yours is bigger, save it to Google Drive and download it from there. The query flattens labels and credits, because BigQuery can't save nested fields to CSV, and groups by month, so the file stays small. It reads only your billing table.
-- Cloud Bill Gotchas Checker: Google Cloud billing, last 3 full months.
-- Put your own table in the FROM line, run it, then Save results as CSV.
WITH line_items AS (
SELECT
invoice.month AS invoice_month,
service.description AS service_description,
sku.id AS sku_id,
sku.description AS sku_description,
project.id AS project_id,
cost_type,
currency,
usage_start_time,
usage_end_time,
usage.amount_in_pricing_units AS usage_amount_in_pricing_units,
usage.pricing_unit AS usage_pricing_unit,
cost,
IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c WHERE IFNULL(c.type, '') != 'PROMOTION'), 0) AS credits,
IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c WHERE c.type = 'PROMOTION'), 0) AS promotion_credits,
IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c WHERE c.type IN ('COMMITTED_USAGE_DISCOUNT', 'COMMITTED_USAGE_DISCOUNT_DOLLAR_BASE')), 0) AS cud_credits,
IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c WHERE c.type = 'FEE_UTILIZATION_OFFSET'), 0) AS fee_offset_credits,
IFNULL((SELECT STRING_AGG(CONCAT(l.key, '=', IFNULL(l.value, '')), ';' ORDER BY l.key) FROM UNNEST(labels) l), '') AS labels,
IFNULL((SELECT STRING_AGG(CONCAT(l.key, '=', IFNULL(l.value, '')), ';' ORDER BY l.key) FROM UNNEST(project.labels) l), '') AS project_labels,
EXISTS(SELECT 1 FROM UNNEST(system_labels) s WHERE s.key = 'compute.googleapis.com/is_unused_reservation' AND LOWER(IFNULL(s.value, '')) != 'false') AS unused_reservation
FROM `my-project.my_dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
WHERE invoice.month >= FORMAT_DATE('%Y%m', DATE_SUB(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 3 MONTH))
AND invoice.month < FORMAT_DATE('%Y%m', DATE_TRUNC(CURRENT_DATE(), MONTH))
)
SELECT
invoice_month, service_description, sku_id, sku_description, project_id,
cost_type, currency, labels, project_labels, unused_reservation,
MIN(usage_start_time) AS usage_start_time,
MAX(usage_end_time) AS usage_end_time,
SUM(usage_amount_in_pricing_units) AS usage_amount_in_pricing_units,
ANY_VALUE(usage_pricing_unit) AS usage_pricing_unit,
SUM(cost) AS cost,
SUM(credits) AS credits,
SUM(promotion_credits) AS promotion_credits,
SUM(cud_credits) AS cud_credits,
SUM(fee_offset_credits) AS fee_offset_credits
FROM line_items
GROUP BY invoice_month, service_description, sku_id, sku_description, project_id,
cost_type, currency, labels, project_labels, unused_reservation
ORDER BY invoice_month, SUM(cost) DESC
Amounts are cost after credits, in your billing account's currency. Promotional credits are kept in their own column and left out, the way AWS credits are, so the checks show what your usage costs once a promotion runs out. The standard export has no resource names, so the checks show services, SKUs and projects. The column names follow Google's "Structure of Standard data export" page in the Cloud Billing docs.
FOCUS export (preview)
Google's FOCUS export also lands in BigQuery. Its labels and credits are nested, so a CSV of it carries no tags or commitment data, and those two checks say they can't tell. The query above covers more.
Privacy
Your bill never leaves your browser
You should not have to take our word for it. Here is how it works, and how to check.
- The file is read and analyzed in a Web Worker on your device, whether it comes from AWS, Google Cloud or Azure. There is no server-side analysis and no upload.
- The page ships a Content-Security-Policy that only allows connections back to this site, and loads no third-party scripts, fonts or trackers.
- The only request the page can make with something you typed is the optional email signup. It sends your email address and the word "checker", nothing else.
- To verify: open your browser's developer tools, go to the Network tab, then drop in your file. You will see no request carrying your data. With the signup, you will see one POST to
/api/guidewith your email. - You can also disconnect from the internet after the page loads, then run the checker. It still works.
- For Google Cloud, you run our query in your own BigQuery project and save the result yourself. The page never connects to Google, Microsoft or AWS.