A European cloud provider billing export comes in three forms: an invoice with lines per product, a daily or monthly usage file per project and, at some providers, a billing API or a FOCUS report; none of the eight providers in this chapter delivers an hourly export per resource with price and tags, as a hyperscaler's usage export does. This page sets the eight providers side by side in one table, says what an export in the manner of the Cost and Usage Report would need, how the data maps onto FOCUS, and which workarounds remain when the data falls short.

How it works

Every provider builds its invoice from an internal usage measurement, but only part of it is handed out. The table summarises what the documentation states on the read date; the provider pages of this chapter carry the sources.

The provider's internalusage measurementThe invoice: lines perproduct, per account,project or contractA usage file: daily ormonthly, per project, inthe console or as CSVAt some providers a billingAPI or a FOCUS reportinto a bucketInto the cost tool, withthe gaps the table names:resource identifier,granularity, price perline, tags, delivery
Only part of the provider's usage measurement is handed out: the invoice, a usage file and at some providers an API or a FOCUS report, each with its gaps
ProviderInvoiceUsage fileAPIGranularityResource identifierTags or labelsCurrency
HetznerPDF per account and month, by product categoryConsumption statement as CSV through the invoice linkPrices only (GET /pricing), no usageMonth per line; the console only the current monthServer name in the statementNone in the cost dataEUR or USD per project
ScalewayPDF per organization with a project tableCost manager in the consoleConsumption API (invoice data) and FinOps API (charges per resource with a time window)Charge per resource and period, clampableResource ID, name where passed onProject as the allocation levelEUR
OVHcloudBill per project on the 1st of the following monthUsage history in the Control Panelusage/current and usage/forecast per project; FOCUS 1.3 export as CSV into an S3 bucket, daily or hourlyMonth to date in the export; type in the APIIn the FOCUS export per the specificationIn the FOCUS export, where filledEUR
IONOSPDF per contract and monthCost & Usage in the DCD, six months backBilling API: invoices, utilization per month or day per data centre, usage per meterDay per data centre and meterData centre UUID, meterNone in the cost dataEUR
STACKITInvoice per customer account around the 5thCost Dashboard per project, previous dayCost API per project or account; Invoice Exporter API; FOCUS 1.1 and 1.2 as CSV into a bucketDay or month in the FOCUS reportPer FOCUS, project in x_ProjectIdPer FOCUS, where filledEUR
T Cloud PublicPDF per tenant and monthCSV with daily usage in MyWorkplaceNo billing API documentedDay per resource in the CSVIn the CSVTag Management Service, cost per tag in the invoice attachmentsEUR
ExoscalePDF and JSON per organization and monthUsage Details in the portal, refreshed hourlyGET /usage-report per month with quantities without prices; detailed reports per resource only with a higher support planMonth per product; per resource only with the support planOnly in the detailed reportsNone in the cost dataEUR, CHF or USD
UpCloudInvoices for credits and usage in the customer accountControl PanelGET /1.3/price, GET /1.3/account, a monthly billing summary per resourceMonth per resourceIn the billing summaryNone in the cost dataEUR, also GBP, USD, SGD

What an export in the manner of the Cost and Usage Report delivers is described in the AWS Cost and Usage Report: one line per resource, usage type and hour, with quantity, rate, amount, account, region, tags and the attribution of discounts. For that a European provider would need five things, which the table checks one by one: a stable resource identifier in every line, a time granularity of at most a day, the price per line or a price list keyed by the same identifier, the resource's tags or labels, and a machine-readable delivery without a click in the portal. OVHcloud and STACKIT meet all five with their FOCUS exports, T Cloud Public four with its daily CSV, Scaleway four with the FinOps API, IONOS three with the daily utilization per data centre, Exoscale and UpCloud two to three depending on the support plan, Hetzner one.

The mapping onto FOCUS follows from that. At OVHcloud and STACKIT the columns arrive ready-made, with provider-specific additions such as x_ProjectId; at the others BilledCost and ServiceName come from the invoice or the usage file, ResourceId only where the file carries it, ChargePeriodStart and ChargePeriodEnd in day or month boundaries, ListUnitPrice from the price list or the price endpoint, and tags stay empty where the cost data knows none. Which columns are mandatory and what an empty column means is in FOCUS columns; the currency sits for all eight in the account's invoice currency, at Exoscale and UpCloud by choice, and a report in euro across several providers needs the same rate for all of them, as EUR and GBP reporting describes.

What it means for your cost

Two workarounds close the gap, and both have limits. Parsing the invoice or the invoice CSV yields amounts per line and month, binding and complete, but without hours, without a resource identifier where the line names only the product, and only days after the month ends; it serves the close and trends per product, not the allocation to teams and not alerts in the running month. Polling the resource list through the API at fixed times and pricing it with the price list, at Hetzner through GET /pricing, at UpCloud through GET /1.3/price, yields an estimate per resource and hour in the running month, with tags from the resources themselves, but without the provider's discounts, vouchers, allowances and rounding; it serves allocation and alerts, not the close, and the difference from the invoice has to be explained at month end, as reconciling exports with the invoice describes. Whoever combines both has rebuilt the shape of a usage export, with the monthly reconciliation as a duty.

the close andtrends per productallocation and alertsin the running monthWhat is thedata for?Parse the invoice or itsCSV: binding and complete,per line and month, daysafter the month endsPoll the resource list andprice it with the pricelist: per resource andhour, with tags, withoutdiscounts, allowancesand roundingBoth together rebuild theshape of a usage export,with the monthlyreconciliation against theinvoice as a duty
The invoice serves the close, the priced resource list serves allocation and alerts, and whoever combines both owes a monthly reconciliation

For cost allocation that means: at Scaleway, OVHcloud and STACKIT the project is the natural level, at IONOS the data centre, at T Cloud Public the tag, at the others the resource from the API; an allocation by team therefore needs one rule per provider, as tags and labels describes them for the hyperscalers. For comparison across providers FOCUS stays the lowest common denominator, with empty columns where a provider delivers nothing.

Where it goes wrong

  • The invoice arrives too late for the close. Symptom: the month-end close waits for Hetzner or OVHcloud. Cause: the invoice is generated on the 1st or up to 28 days after the month ends; the running month comes only from the console or the API.
  • Estimate and invoice disagree. Symptom: the costs calculated from the price list exceed the invoice. Cause: monthly caps, allowances, discounts and vouchers are missing from the estimate; Scaleway itself names the discrepancy between the FinOps API and the invoice.
  • No resource identifier. Symptom: a line cannot be assigned to a server. Cause: the invoice names the product, not the resource; only FOCUS exports and detailed reports carry the identifier.
  • Tags are missing from the cost data. Symptom: the allocation by team fails. Cause: only T Cloud Public, OVHcloud and STACKIT carry tags or labels in cost data; at the others they have to come from the resource API.
  • Two currencies in one report. Symptom: totals across providers do not add up. Cause: Exoscale bills in CHF, Hetzner projects in USD; the conversion needs one fixed rate per month.
  • The export stops. Symptom: no new FOCUS files in the bucket. Cause: at STACKIT a deleted service account breaks the schedule for good; at OVHcloud the export lives on the API configuration.
  • Daily data read as hourly. Symptom: a cost spike cannot be assigned to an hour. Cause: the finest level at most providers is the day; the hour comes only from your own polling.

Sources

Read on 2026-10-21. Hetzner Cloud API specification and billing system, Scaleway FinOps API and reading an invoice, OVHcloud export to a bucket and billing, IONOS Cost & Usage and Billing API, STACKIT FOCUS report and retrieve cost data, T Cloud Public service description (PDF), Exoscale usage reports, UpCloud API pricing and accounts.