Explore cost data
Change a report's date range, groupings, filter, granularity, chart, measure and what it counts on its page, drill into a row, and export what it shows as CSV or Excel.
Every report, the workspace's default one included, is explored on its own page under Cost reports. The controls above the chart choose which cost the report reads, the chart card's own controls choose how it is drawn and counted, and the cost table below the chart lists the rows. Start broad, then add only the groupings and filters the question needs.
A change on the page does not change the saved report: the header shows Unsaved changes until you select Save changes, Save as new or Discard; see Save and manage reports. The page address holds the change, so a copied link, the browser's Back and a reload keep it.
Before you start
- A connected provider whose first collection has finished; see Cost reports overview.
- Every team role can change a report's controls and export what it shows. Saving a change needs the Editor team role; for anyone else the save buttons are disabled and say why. See Access model.
Choose a date range
Select Date range, the first control above the chart. It offers "This month", "Last month", "Last 7 days", "Last 30 days", "Last 90 days", "Year to date", "This quarter", "Last quarter", "This year", "Last year", "Last 3 days", "Last 14 days", "Last 3 months", "Last 6 months", "Last 12 months", "Last 24 months", "Last 36 months" and "Custom range". A named range moves with the calendar and is worked out each time the report opens.
"Custom range" starts at the dates the report shows and adds a two-month calendar beside the control, for any start and end date; those dates then stay fixed. Choosing one of the calendar's own ranges, such as "Last 30 days", switches back to that named range.
Group the cost

- A new report is grouped by Service; choose another dimension in that grouping. On a report with no grouping, select Group by: a first grouping appears, set to Service.
- Choose its dimension: Provider, Provider name, Sub-account, Service, Region, Resource, Charge category, Tag, Segment, Cluster, Namespace, Virtual tag, Billing account, Service category, Service subcategory, Usage unit, Charge class, Tagged, Resource ID, Commitment status, Commitment type, Commitment, Pricing category or SKU.
- For Tag, choose the Tag key; for Virtual tag, choose the virtual tag.
- Select Add grouping for a second and a third grouping. The first is the outermost.
Each dimension can be used once; Tag and Virtual tag once per key. The cross beside a grouping removes it. With no grouping the report shows a single total.
- Provider is the provider's key, shown by its name; Provider name is the provider name written on each cost line, such as
Amazon Web Services. - Tag lists the tag keys found in your cost so far, or "No tag keys discovered yet". Three of them group AI spend across providers: on the AI lines of AWS, Azure and Google Cloud whose model Costfluent recognizes,
ai:modelnames the model as its maker does, such asgpt-4oorclaude-sonnet-4-5, whoever sold it,ai:model_providerwho built it, andai:token_typethe tokens billed,input,output,cache_readorcache_write, where the line says. A line whose model is not recognized carries none of them, and history older than 13 months has none. Virtual tag lists the workspace's virtual tags, or "No virtual tags"; a report that names one since deleted shows "Deleted virtual tag". - Segment groups by the segments your allocation rules assign. Cluster and Namespace hold values only for cost from a connected Kubernetes cluster.
- Sub-account and Billing account show each account's name beside its id, as
prod-payments (123456789012): the latest name the bill gives it, or, for a billing account only one of the workspace's connections collects, that connection's name when it has one of its own. An id the bill names nowhere shows alone. The filter's values are named the same way. - Billing account, Service category, Service subcategory, Usage unit and Charge class are the FOCUS columns of the same names on each cost line. Resource ID keeps two resources that share a name apart, where Resource groups by name; each row shows the resource's name beside its id, as
checkout-api (i-0abc), when its cost lines name it. Tagged splits the cost into "Tagged" and "Untagged": a line with a tag Costfluent did not add itself, and one without. Costfluent addsaws:payerAccountIdto every AWS line, thek8s:keys that place a cluster's line, such ask8s:cluster,k8s:namespaceandk8s:node, to every Kubernetes line, and theai:keys above to AI lines, so those alone leave a line untagged; a pod, namespace or node label tags it (Connect AWS, Connect Kubernetes). Commitment status isUsedfor usage a savings plan, reservation or committed use discount covered andUnusedfor commitment paid for and not used; Commitment type names the commitment (SavingsPlan,ReservedInstance,CommittedUseDiscount); Commitment is the commitment itself, by the provider's id for it: a Savings Plan's or reservation's ARN on AWS, so a report grouped by it shows each one's cost, and Commitments opens a Savings Plan's; Pricing category is how the line was priced, as FOCUS names it:Standardfor the agreed or on-demand rate,Dynamicfor spot capacity,Committedfor a reservation or savings plan, andOther; a tax has none. SKU is the provider's own label for what was billed, such as an Azure meter name or a Google Cloud SKU description, and the SKU id for a line whose provider gives no label.
The result keeps the largest combinations and adds the rest up in one Other row, so the rows always add up to the total.
Filter the cost

- Select Add filter. A clause appears, set to Service and "is any of".
- Choose the field: Provider, Provider name, Sub-account, Service, Region, Resource, Charge category, Tag, Segment, Cluster, Namespace, Virtual tag, Billing account, Service category, Service subcategory, Usage unit, Charge class, Tagged, Resource ID, Commitment status, Commitment type, Commitment, Pricing category or SKU. A Tag clause also asks for the Tag key; a Virtual tag clause asks for the virtual tag.
- Choose the operator: "is any of", "is none of", "contains", "does not contain", "starts with", "does not start with", "ends with", "does not end with", "has no value" or "has a value". Provider offers only "is any of" and "is none of"; Tagged offers "is any of" with "Tagged" or "Untagged". "has no value" takes no values: it matches a line whose field is empty, or, on a Tag clause, a line without that tag key.
- Enter the values. With "is any of" and "is none of", Provider, Provider name, Sub-account, Service, Region, Charge category, Cluster, Namespace, Billing account, Service category, Service subcategory, Usage unit, Charge class, Commitment status, Commitment type, Commitment and Pricing category offer a list under Select values, and a virtual tag offers the values its rules assign. Segment takes "is any of" only and offers the workspace's segments, never the shared one, and a filter holds one Segment clause; see Filter a report to a segment. Every other clause takes one typed value.
All clauses apply together. A clause still waiting for a value does not filter yet. To combine conditions with OR, choose CQL and write the filter as text; see Filter with CQL. If the list of values cannot be loaded, the clause says "Filter values could not be loaded." with Retry. The filter is part of the report like every other control: Save changes keeps it.
Shape the chart
The chart card carries the report's title and its own controls:
- Granularity: "Daily", "Weekly", "Monthly", "Quarterly" or "Cumulative". "Cumulative" draws the cost so far on each day, ending at the range's total.
- Chart: "Line chart", "Bar chart", "Stacked bar", "Area chart", "Pie chart" or "Table". A line, bar, stacked bar or area chart draws one series per group, with Other in grey; a pie chart draws one slice per group; "Table" lists each "Group" with its "Cost" and "% of total" in place of a chart. Nothing is added across currencies with conversion off, or across units for usage: a pie chart shows the table instead, each share within its own currency or unit, and stacked bars stand side by side and areas overlap rather than stack.
- Horizontal axis: "By date", the default, or "By group", which sets the report's groups along the axis in place of its dates. It needs a "Bar chart" or "Stacked bar" of a grouped report in any granularity but "Cumulative"; see Compare each group.
- Measure: Cost, Usage or Count; see the next section.
- Options: the switches Amortized cost, Include credits, Include refunds, Include tax and Compare to previous period. The first four set what the report counts; see Cost amounts.
Usage and count
Measure switches what the chart and the table show:
- Cost, the default.
- Usage, each provider's consumed quantity in its own unit, such as hours, GB-months or requests. A quantity is never converted, and different units are never added: the chart draws one line per unit, named in its legend, and every table row carries its unit. Rows without a unit or without a quantity, such as tax, a reservation purchase or unused commitment, are left out. Azure's quantity comes from its actual-cost export, so amortizing changes no quantity. Group by Usage unit, or filter with
costs.usage_unit, to compare like with like. - Count, the distinct resources with a cost row in each period. A row without a resource ID is not counted, and a count has no "Cumulative" granularity, because a running total would count a resource once a day; choosing Count moves a cumulative chart to "Daily".
The measure is saved with the report, and the export carries it: usage exports each quantity beside its unit, under Quantity and Unit (ConsumedQuantity and ConsumedUnit in FOCUS 1.4), and a count exports the distinct resources with the unit resources.
Compare to previous period
With Compare to previous period on, the "Total cost" card is joined by "Previous period", the total for the period compared with, and "Change", the difference in percent, and the chart draws a dashed line for that period, named with its dates, each of its days, weeks, months or quarters beside the report's own in the same place. Which period that is depends on the granularity: "Daily" and "Cumulative" compare with the same number of days just before the range; "Weekly", "Monthly" and "Quarterly" compare with the same weeks, months or quarters one period earlier, moved back by the fewest whole weeks, months or quarters that clear the range. So 1 August to 17 October by month compares with 1 May to 17 July, each month beside the month in the same place, and switching the granularity can change "Previous period" and "Change". "Change" appears only when the previous period has cost; a rise is red, a fall green.
A provider delivers the last day or two late, so a range that runs past the last settled day, two days ago or the earliest day your connections' data reaches if that is earlier, compares only its days through that day with as many days from the start of the previous period. "Change" then says "vs the same days before, through …", "Previous period" names the days it covers, and the chart still draws both periods whole. A range with no settled day yet shows no "Change". A fixed Compare with range is always compared whole.
With Currency conversion off (Currency settings), a report whose range and previous period are not both billed in the same one currency shows neither "Previous period" nor "Change", and no comparison line. The same holds when the range or its previous period reaches back past your plan's history limit. To compare with a fixed range instead of the previous period, set Compare with in Settings; see Save and manage reports.
Compare each group
With Compare to previous period on, a grouped report compares each group too: each group's cost in the previous period over the same days as "Previous period", so the groups add up to it, and a group with no cost then at zero. A group is compared by its value, so a service or tag value that was renamed has no previous cost under its new name. Cost that only the previous period had, in groups the report no longer shows, is carried by an Other row of no cost now.
To see the groups side by side, choose "Bar chart" and, under Horizontal axis, "By group". Each group becomes a category with a bar for "This period" and beside it one for "Previous period", each named with the days it covers; while the last days are still arriving, both cover the days "Change" compares, and the chart says "vs the same days before, through …". The ten largest groups get bars of their own and Other holds the rest. "Stacked bar" stacks each group's days, weeks, months or quarters instead and draws no comparison. A count draws its ten largest groups without Other and never stacks them, since one resource can sit in several groups. With mixed currencies and Currency conversion off, or usage in several units, the chart shows the table instead, as a pie chart does. The forecast, the cost per unit and the dashed previous-period line belong to the date axis and are left out. A dashboard widget draws its report as saved, and by date on a dashboard set to "Cumulative".

Read the result
Above the chart, a card holds the range's total: "Total cost", or "Total usage" or "Resources" for the other measures. Beside it, a cost report shows "Saved against list price": what the range's usage saved against the providers' list prices through credits, discounts and commitments, naming the providers that state no list price (Cost amounts). Between the controls and the chart, a line names the range's actual dates, and "Data through" names the latest day every connection the report reads has delivered; providers deliver a day's cost a day or two late, so the days after it are not a drop in spend. Grouped by Provider, a report whose cost includes a Kubernetes cluster says that the cluster's rows divide node cost the cloud connection already reports, so the total counts that cost twice.
The cost table below the chart has three views: Rows, By group and By period. Rows has a "Date" column, one column per grouping and a "Cost" column: one row per date and group, the Other row included. It shows 25 rows a page; Rows per page changes that, and the page address keeps the page you are on. By group lists each group over the whole range with its "Cost" and "% of total", and with Compare to previous period on its "Previous period" and "Change" over the days "Change" compares. By period sets one row per group and one column per day, week, month or quarter, each row's sum in a "Total" column and on top a "Total" row for each currency or unit; a count has neither, since its resources do not add up. Its groups are the chart's: the ten largest and Other. "Cumulative" has no period to set apart, so it offers no By period. The page address keeps the view, and neither the view nor the page makes an unsaved change.
The refresh button at the end of the controls above the chart reloads the figures. If the query fails, the page says "Cost data could not be loaded", and the table adds "The query failed. Nothing was shown rather than a partial total.", with Retry: the page never shows a partial total.
Drill into a row
In a grouped report, a bar or pie slice of the chart, an entry of its legend and each grouping value in the cost table drill into that group. A drill adds a filter for the group's value in every grouping and groups the report by the next dimension, so the label reads, for example, "Drill into Amazon EC2 by SKU". The next dimension follows from the last grouping: Billing account to Sub-account, Sub-account to Service, Service category to Service subcategory, Service subcategory to Service, Service to SKU, SKU to Resource ID, Cluster to Namespace, Namespace to Resource, Tagged to Resource ID, and every other dimension to Service. One the filter already holds to a single value is skipped; when the filter holds every one of them, the report shows the group as one total over time. A value that is empty becomes a "has no value" clause. The browser's Back undoes one drill at a time.
To group by another dimension instead, select More beside a value in the cost table and choose one; it lists every dimension the drill does not hold to one value. Tag and Virtual tag then ask for the key.
In a report grouped by one dimension, Other drills too: it filters to every value the chart or table did not name and keeps the grouping, so the values after them rank. The chart's bars, lines and areas and the cost table name the top 10 values, and a pie the top 50. A Segment value drills to every segment with that name; the drilled view adds the segment's share of shared cost, so its total can be larger than the row's (see Segments). "Idle capacity" drills like any namespace.
A drill-down is an unsaved change like any other. A dashboard widget and a shared link do not drill. These cannot be drilled into and show their values as plain text:
- Other in a report grouped by more than one dimension or by Segment, or whose values are split by currency or unit; its tooltip says why.
- "Unallocated" in a Segment grouping.
- A row whose filter would pass 20 conditions.
Export to CSV or Excel
- Set up the report as you want it: range, groupings and filters. Unsaved changes are exported as the page shows them.
- Open Export above the cost table.
- Choose CSV or Excel for Costfluent's native columns, or CSV (FOCUS 1.4) or Excel (FOCUS 1.4) for FOCUS column names.
The file holds the rows the screen counts, including your plan's history limit, except that with Currency conversion on, spend no exchange rate converts is written on its own rows in its billing currency rather than left out, and is named after its date range. FOCUS BilledCost is always the billed cost, whatever the report counts, while the native Cost column is the amount the screen counts, so with Amortized cost on, the default, the two differ wherever a commitment is spread over usage. In a workspace that spreads commitment discounts, the native AmortizedCost, and Cost while Amortized cost is on, carry the spread figure and ListCost is unchanged, while FOCUS EffectiveCost stays the provider's own figure, so on eligible AWS usage the two files' amortized amounts differ. Every team role that can open the workspace can export, and each export is recorded in the audit log. If the export fails, the page says "The export failed. Nothing was downloaded." An export still downloading when a sync changes the cost it covers fails the same way, rather than mixing figures from before and after the sync; export again.
Grouped by Sub-account, Billing account or Resource ID, the file follows each of those columns with the name the bill gives it, in SubAccountName, BillingAccountName or ResourceName, in both column sets. A name the bill does not give is left empty. Grouped by Resource ID and Resource together, the Resource column already holds the name, so no second one is added.
The Excel workbook has the same columns as the CSV on a Costs sheet, with dates as dates and amounts and quantities as numbers, so they sort and add up without converting. A Settings sheet records what was exported: the date range, granularity, groupings, filter, what the report counts, the currency, the layout and the number of rows.
A report that charts a unit cost adds a Unit cost sheet to the workbook, between Costs and Settings, with one row per day, week, month or quarter: its date, the metric's amount and the figure, headed by what it is in, such as Cost per order (EUR) or Gross margin (%). A period with no figure is left empty, and Settings names the metric and the calculation. Unit cost (CSV) downloads the same rows as a CSV of their own. The figures never join the cost rows, where a figure per period repeated on every grouped row would be added up by mistake.
From the By period view, Export offers CSV and Excel in Costfluent's native columns, laid out as the view is: one row per group, one column per day, week, month or quarter headed by its first day, each row's sum in a Total column, and on top a Total row for each currency or unit, none for a count. The file holds every group, not only the ten the view shows, with the name columns above. Its figures count toward the export limit as rows do.
A spreadsheet number holds 15 significant digits, so in the workbook an amount with more digits is rounded in its last places. The CSV writes every amount exactly as Costfluent holds it; use it when the figures must reconcile to the last digit.
One export holds at most 250,000 rows. A larger one is refused before anything downloads, and the page says "This export has more than 250,000 rows, the most one export may hold. Narrow the date range, filters or grouping." Narrow the view, or export it in parts, such as one month at a time.
How it behaves
- Your plan sets how far back cost history reaches. A range that starts earlier is cut back with the message "Cost history before a given date is not included in your plan, so this range starts there." The missing days are withheld, not shown as zero.
- Before a workspace has a connected provider, the page says "No cloud providers connected" and offers Connect provider.