Calculator
The FOCUS Export Analyzer
Drop in a FOCUS-formatted cost export from AWS, Azure, or Google Cloud. See which columns it has, which FOCUS version it supports, and a money breakdown by charge category, provider, and service, plus seven findings each linked to a fix. Everything runs in this browser; nothing you paste in is sent anywhere.
Last updated
This is a static site with no backend to upload to. Parsing and analysis all happen in your browser's JavaScript. Check the Network tab while you paste a file in and you'll see nothing sent anywhere.
This result is not saved. It disappears when you reload the page. Copy it as Markdown or download it before you leave.
Free tool
Drop in a FOCUS export from any provider
A FOCUS-formatted CSV from AWS, Azure, or Google Cloud is all this needs. Everything below computes in your browser; nothing you drop in is sent anywhere.
A FOCUS export from AWS, Azure, or Google Cloud — parsed entirely in your browser
The sample is a synthetic file built to show every finding this tool checks for — not a real bill.
Reading your file…
Conformance
Columns present
Columns missing
Every column this tool reads for is present.
Values outside the spec's allowed set
The money
By charge category
By provider
Top services
What to look at
This is a static site with no backend to upload to — parsing and analysis run entirely in your browser's JavaScript. Check the Network tab while you use this tool and you'll see nothing sent anywhere.
How to get a FOCUS export
Every major provider exports FOCUS a little differently. Here's exactly where to click for each one.
AWS
Billing and Cost Management → Data Exports
- Create the export. Open Billing and Cost Management, select Data Exports, then create a new export and choose the "FOCUS 1.2 with AWS columns" table.
- Set a destination. Point the export at an S3 bucket and choose CSV as the output format.
- Download and paste it in. AWS adds three extension columns of its own on top of the standard FOCUS columns: x_Discounts, x_Operation, and x_ServiceCode. This tool counts them but does not read them. Download the CSV and drop it in below.
Source: AWS docs: FOCUS 1.2 with AWS columns (table dictionary)
Azure
Cost Management → Exports
- Open Exports. In the Azure portal, open Cost Management, select a billing scope, then select Exports, and select + Create.
- Choose the FOCUS dataset. Pick a template or select "Create your own export", and for the type of data choose "Cost and usage details (FOCUS)".
- Set the destination and download. Choose an Azure Storage account as the destination and CSV as the format. Every column in an Azure FOCUS export uses PascalCase, and Azure's own extension columns carry an x_ prefix, same as AWS's.
Source: Microsoft Learn: Tutorial - Create and manage Cost Management exports
Google Cloud
Billing → Billing export → BigQuery export
- Enable the FOCUS export. In the Google Cloud console, open Billing, select your billing account, select Billing export, open the BigQuery export tab, and select "Enable FOCUS export".
- Pick a project and a location. Choose a project to hold the new dataset and a data location. The dataset is named gcp_billing_immutable_<billing account ID>_<location>, and the FOCUS table inside it is named gcp_billing_export_focus_<billing account ID>.
- Query it out to CSV. Run a query against that table in BigQuery and export the result as CSV. The table's own columns are PascalCase, same as AWS's and Azure's; a view built on top of it may re-alias them to snake_case, and this tool reads either form.
Source: Google Cloud docs: Set up FOCUS Cloud Billing data export to BigQuery
The columns this tool reads
A file that is missing one of these still parses. This tool says plainly what the gap costs you and suppresses whatever it can no longer answer, instead of guessing.
BilledCost mandatory
The reconciliation total: the number that should match the invoice.
Missing it: There's no way to check this export against the actual bill.
EffectiveCost mandatory
The trend-safe total. Every dollar figure and finding on this page reads EffectiveCost, so a one-time upfront charge doesn't distort a single month.
Missing it: The file still parses, but every total and every finding below is suppressed. This is the column the rest of the report is built on.
ListCost mandatory
The pre-discount baseline, so this tool can show the discount already captured (ListCost minus EffectiveCost).
Missing it: The discount-captured figure is left out. Every other total still runs.
ChargeCategory mandatory
The split by charge type: Usage, Purchase, Tax, Credit, Adjustment. The on-demand-share, credits-and-adjustments, and corrections findings all read this column.
Missing it: Cost can't be split by charge type, and three findings below are suppressed.
ChargeClass mandatory
Flags a row as a "Correction" to a previously closed billing period, so a restatement doesn't read as new spend.
Missing it: A restatement to a past period can't be told apart from new spend.
CommitmentDiscountStatus conditional
Whether a commitment discount (a Reserved Instance, a Savings Plan, a committed-use contract) was used or sat unused on a row. This is the column the unused-commitment finding reads.
Missing it: The unused-commitment and on-demand-share findings are suppressed. Both need this column to tell a committed charge apart from an on-demand one.
ServiceName mandatory
The top-services table, and the service each biggest-mover and spend-concentration finding names.
Missing it: There's no per-service breakdown, and the movers and concentration findings are suppressed.
ProviderName mandatory
The multi-cloud split: one table showing how much of this file's cost sits with each provider.
Missing it: The provider split is left out. Everything else still runs off the other columns.
BillingCurrency mandatory
Confirms every dollar figure on this page is actually denominated in the currency it looks like.
Missing it: This tool assumes the figures are already in one consistent currency and says so.
ChargePeriodStart mandatory
The first half of the date range the biggest-movers finding compares.
Missing it: The biggest-movers finding is suppressed. There's no way to tell one charge period from another.
ChargePeriodEnd mandatory
The exclusive end bound of each charge period, alongside ChargePeriodStart.
Missing it: Nothing in this tool reads ChargePeriodEnd on its own, so nothing else changes.
Tags conditional
Feeds the untagged-cost finding: the share of cost that carries no cost-allocation tag at all.
Missing it: The untagged-cost finding is suppressed. Without this column there's no way to tell a tagged row from an untagged one.
What we look for
Seven finding rules, each computed from your own export. Nothing here is a savings promise; it's what to check next, and each one links to a fix.
- Some commitment spend sat unused. FOCUS requires a provider to record the unused share of a commitment as its own row, with CommitmentDiscountStatus = "Unused". That row is money already paid for capacity nobody drew down this period.
- A large share of usage carries no commitment discount. Usage with no CommitmentDiscountStatus at all is priced on demand: the most expensive rate a provider charges. Worth checking whether more of it could sit under a commitment instead.
- A share of this file's cost carries no tag. Cost with no Tags value, or an empty one, can't be attributed to a team, project, or customer. It's the single biggest blocker to a believable chargeback report.
- One service moved more than any other between periods. A jump this size on a single service is the kind of thing worth catching the week it happens, not the month it's reconciled.
- Credits and adjustments sit alongside the usage rows. A BilledCost or EffectiveCost total that ignores Credit and Adjustment rows reads gross spend as if it were net. Both categories are already broken out above; just don't drop them when you re-total this file elsewhere.
- A prior billing period was restated. A row with ChargeClass = "Correction" is a provider fixing a previously invoiced period, not new spend. Read it as a restatement, not a spike.
- One service holds most of this file's cost. That's not automatically a problem on a file with one dominant workload, but it's the highest-leverage place to check pricing and commitment coverage first.
Sources
Where the parsing rules and the specification quotes on this page come from
Every quoted requirement is attributed to the FOCUS specification or a provider's own export documentation, current as of 2026-08-19.
- FOCUS Specification — CommitmentDiscountStatus column (FOCUS 1.4)
FOCUS 1.4 states that CommitmentDiscountStatus "MUST be 'Unused' when the charge represents the unused portion of the given CommitmentDiscountId", and "MUST NOT be null when CommitmentDiscountId is not null and ChargeCategory is 'Usage'". Both sentences are quoted from the 1.4 release, which is where the explicit "MUST be 'Unused'" rule was added; 1.0 through 1.3 carry the same meaning in the column's allowed-values table, which defines Unused as "Charges that represent the unused portion of the commitment discount". That is the basis for this tool's unused-commitment finding: summing EffectiveCost on every row where CommitmentDiscountStatus is "Unused", which reads correctly on a 1.2 or 1.3 export too.
- FOCUS Specification — ChargeCategory column (FOCUS 1.2)
ChargeCategory is Mandatory, "MUST NOT be null", and "MUST be one of the allowed values" — all three stated on the 1.2 column page linked here, and unchanged through 1.4. That allowed set is exactly Usage, Purchase, Tax, Credit, Adjustment, per the same column's allowed-values table in the 1.2 specification. This tool's conformance check flags any other value, and the on-demand-share, credits-and-adjustments, and corrections findings all filter on it.
- FOCUS Specification — ChargeClass column (FOCUS 1.2)
ChargeClass is null for a normal charge, and "Correction" when a row restates a previously closed billing period, which is its only allowed non-null value. Stated on the 1.2 column page linked here, and unchanged through 1.4. This tool's corrections finding reads exactly that value.
- AWS — FOCUS 1.2 with AWS columns (table dictionary)
Names AWS's three FOCUS extension columns verbatim: x_Discounts, x_Operation, and x_ServiceCode. This tool's parser counts any column starting with x_ as a provider extension without trying to read it.
- Microsoft Learn — Tutorial - Create and manage Cost Management exports
States that Cost Management exports support a "Cost and usage details (FOCUS)" dataset type, chosen on the Datasets tab when creating an export, with CSV or Parquet as the output format.
- Microsoft Learn — FOCUS cost and usage details file schema
Lists the full FOCUS 1.2-preview column set Azure exports, confirming PascalCase names (BilledCost, ChargeCategory, ProviderName, and so on) and the x_ prefix on every Azure-specific extension column (x_AccountId, x_ResourceGroupName, and 30-plus more).
- Google Cloud — Set up FOCUS Cloud Billing data export to BigQuery
Documents the console path (Billing → Billing export → BigQuery export tab → Enable FOCUS export) and the resulting dataset name (gcp_billing_immutable_<billing account ID>_<location>) and table name (gcp_billing_export_focus_<billing account ID>).
- FinOps Foundation — Introducing FOCUS 1.4
States, verbatim: "FOCUS 1.4 completes the deprecation lifecycle started in 1.3 by removing Provider Name and Publisher Name, whose roles are now filled by Service Provider Name, Host Provider Name, Invoice Issuer Name, and Data Generator metadata." (The article writes column names as display names; the export columns themselves are ProviderName and ServiceProviderName.) This tool treats a file with ProviderName as topping out at FOCUS 1.3, and a file with ServiceProviderName as FOCUS 1.4-shaped, for exactly this reason.
FAQ
Common questions about the FOCUS Export Analyzer
Is anything I paste into this tool uploaded anywhere?
No. CostMon's marketing site is a static build with no backend to upload to. Whatever you drop in or paste is parsed and analyzed entirely in your browser's JavaScript. Open your browser's Network tab while you use the tool and you'll see no request carrying your data, because there isn't one.
Does this tool work on an AWS, Azure, or Google Cloud export equally well?
Yes. Header matching ignores case and separators, so BilledCost, Billed Cost, and billed_cost all resolve to the same column. That's what lets an AWS Data Exports file, an Azure Cost Management export, and a Google Cloud BigQuery export all parse the same way.
What happens if I paste in a file that isn't a FOCUS export?
This tool looks for FOCUS column names in the header row. If it can't find a single one, it says so plainly and points at the export steps below, rather than guessing at a report from columns it doesn't recognize.
Why is a finding missing from my results?
Every finding needs specific columns to compute. If one of them isn't in your file, the finding is suppressed and this tool says exactly which column it's missing, rather than estimating a number it can't actually support.
What FOCUS version does this tool check against?
The column definitions and allowed values come from the FOCUS specification's ratified releases through 1.4, the same sourcing data/focus.ts and /focus-finops-standard use. The one version signal this tool can read from a file itself is whether its provider column is still named ProviderName (FOCUS 1.0 through 1.3) or has been renamed to ServiceProviderName (FOCUS 1.4).
Does this tool estimate savings?
No. It reports what's actually in the file you gave it: totals, a conformance check, and findings with a dollar figure computed from your own rows. It never invents a number the file can't support.
How is this different from /focus-finops-standard?
That page explains what FOCUS is and what each column means. This tool reads your own FOCUS file against those same definitions and prints a report. One is the reference; the other reads your numbers.
A bill read by hand goes stale tomorrow.
Reading one export line by line takes real work. CostMon reads the next one for you, every day, for every provider you connect.