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.
| Provider | Invoice | Usage file | API | Granularity | Resource identifier | Tags or labels | Currency |
|---|---|---|---|---|---|---|---|
| Hetzner | PDF per account and month, by product category | Consumption statement as CSV through the invoice link | Prices only (GET /pricing), no usage | Month per line; the console only the current month | Server name in the statement | None in the cost data | EUR or USD per project |
| Scaleway | PDF per organization with a project table | Cost manager in the console | Consumption API (invoice data) and FinOps API (charges per resource with a time window) | Charge per resource and period, clampable | Resource ID, name where passed on | Project as the allocation level | EUR |
| OVHcloud | Bill per project on the 1st of the following month | Usage history in the Control Panel | usage/current and usage/forecast per project; FOCUS 1.3 export as CSV into an S3 bucket, daily or hourly | Month to date in the export; type in the API | In the FOCUS export per the specification | In the FOCUS export, where filled | EUR |
| IONOS | PDF per contract and month | Cost & Usage in the DCD, six months back | Billing API: invoices, utilization per month or day per data centre, usage per meter | Day per data centre and meter | Data centre UUID, meter | None in the cost data | EUR |
| STACKIT | Invoice per customer account around the 5th | Cost Dashboard per project, previous day | Cost API per project or account; Invoice Exporter API; FOCUS 1.1 and 1.2 as CSV into a bucket | Day or month in the FOCUS report | Per FOCUS, project in x_ProjectId | Per FOCUS, where filled | EUR |
| T Cloud Public | PDF per tenant and month | CSV with daily usage in MyWorkplace | No billing API documented | Day per resource in the CSV | In the CSV | Tag Management Service, cost per tag in the invoice attachments | EUR |
| Exoscale | PDF and JSON per organization and month | Usage Details in the portal, refreshed hourly | GET /usage-report per month with quantities without prices; detailed reports per resource only with a higher support plan | Month per product; per resource only with the support plan | Only in the detailed reports | None in the cost data | EUR, CHF or USD |
| UpCloud | Invoices for credits and usage in the customer account | Control Panel | GET /1.3/price, GET /1.3/account, a monthly billing summary per resource | Month per resource | In the billing summary | None in the cost data | EUR, 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.
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.