The Google Cloud billing export, which Google calls Cloud Billing export to BigQuery, writes the cost, usage and pricing data of a Cloud Billing account into a BigQuery dataset in one of your projects, in loads spread through the day. It matters for the bill because it is the only line-level source for Google Cloud cost with project, SKU, labels and credits side by side, and because it collects data only from the moment it is enabled: anything earlier is backfilled for the previous month at most.
How it works
The datasets
Three datasets can be enabled per Cloud Billing account, plus the FOCUS export in Preview. Google recommends enabling the export when the billing account is created, in a separate project linked to that same billing account.
| Export | Table | Grain | Key fields | What it lacks |
|---|---|---|---|---|
| Standard usage cost | gcp_billing_export_v1_BILLING_ACCOUNT_ID | service, SKU, project, hourly window | invoice.month, cost, credits, cost_type, sku.id, project.id, labels | anything about the resource |
| Detailed usage cost | gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID | adds the resource | plus resource.name, resource.global_name | resources only for the services Google lists; GKE only with cost allocation |
| Pricing | cloud_pricing_export | SKU and pricing tier, once a day | sku.id, list_price, billing_account_price | usage; prices from before it was enabled |
| FOCUS usage cost (Preview) | gcp_billing_export_focus_BILLING_ACCOUNT_ID | as detailed | FOCUS columns and x_ columns | among others InvoiceId, Tags and the commitment discount columns |
Detailed holds everything in standard and adds the resource for a list of services Google maintains, among them Compute Engine, Cloud Storage, Cloud SQL, Cloud Run, BigQuery and GKE. Customers with committed use discounts can add the CUD metadata export (Preview); resellers have their own rebilling export. The FOCUS export sits in an immutable dataset that Google provides and whose storage Google pays for the most recent two years; a two-year TTL deletes older rows.
The fields that carry money and keys
cost is the cost under the applicable consumption model, including negotiated contract discounts, before credits. Credits sit in the repeated field credits, with a credits.type such as COMMITTED_USAGE_DISCOUNT, SUSTAINED_USAGE_DISCOUNT, FREE_TIER, PROMOTION or DISCOUNT; Google's example queries compute net cost as cost plus the sum of credits.amount. cost_at_list is the cost at list price. cost_type separates regular, tax, adjustment and rounding error. currency is the billing currency and currency_conversion_rate the rate from US dollars into it. usage.amount is stated in the base unit usage.unit, such as byte-seconds, and usage.amount_in_pricing_units in the pricing unit. invoice.month (YYYYMM) is the invoice month, usage_start_time and usage_end_time bound an hourly window, and export_time rises with every load. Allocation keys are project, labels, system_labels and tags. Through sku.id, every row joins to the pricing export and the Cloud Billing Catalog API.
When the data arrives
After enabling, the first rows take a few hours, the pricing export up to 48 hours. If the dataset sits in a multi-region location (EU or US), the first enablement loads data from the start of the previous month, one day at a time, which can take up to five days. In a single region, the data starts on the day of enablement. A dataset's location cannot be changed later. Moving the export to another dataset does not carry the old data across; a period with the export disabled may stay a gap, and deleted rows are not restored. Google commits to no delivery time; cost details usually arrive within a day, sometimes later.
What the export itself costs
Storage and queries are billed to the billing account of the project holding the dataset; loading is free. BigQuery's pricing page lists the first 10 GiB of storage and the first 1 TiB of query data processed each month as free. Querying detailed can cost more than querying standard, so Google recommends standard for trends and detailed for resource-level analysis.
What it means for your cost
An invoice total comes from filtering on invoice.month, not on the timestamps. Late-reported usage can land on the next month's invoice, and a correction appears as new rows on a later invoice that cancel the wrong amount and state the right one, marked by adjustment_info; the original invoice is not changed. The export carries no invoice number, only the invoice month; since 2020-09-01 taxes appear as separate rows per project.
For cost allocation, project and labels are the keys (tags and labels). A row records the state at the time of usage: a label added later only affects new rows. Cost per instance, bucket or database in a cost report needs the detailed export, and Kubernetes namespaces only appear with GKE cost allocation (Kubernetes cost data). How far back a report reaches is decided by the enablement date (retention and history); the three providers' resolutions are compared in granularity.
The FOCUS export builds BilledCost and EffectiveCost from cost plus credits; its mapping is covered in FOCUS columns and the providers' mapping, the AWS counterpart in AWS Cost and Usage Report and Data Exports. The set-up, step by step, is in set up Google Cloud billing export for cost reporting.
Where it goes wrong
- The export was enabled late. Symptom: history starts with the month before enablement, or on the day itself. Cause: Google backfills only into multi-region datasets, and only from the start of the previous month.
- Monthly totals are built on
usage_start_time. Symptom: the month does not match the invoice. Cause: late-reported usage and corrections land on later invoices; onlyinvoice.monthreproduces the invoice. - Queries read the export tables directly. Symptom: reports break after a schema change. Cause: the schema can change, for example when fields are added; Google recommends views as a stable layer.
- GKE cost shows only as nodes. Symptom: no namespace in the data. Cause: GKE cost allocation is not enabled, or only standard is queried; allocation writes to detailed only.
- Rows from an old dataset are copied into the export table. Symptom: the copied rows disappear again. Cause: Google warns that the export process may delete manually inserted data and recommends separate tables joined with
UNION.
Sources
Read on 2026-10-16. Cloud Billing's documentation now lives on docs.cloud.google.com. Google Export Cloud Billing data to BigQuery, Understand the Cloud Billing data tables in BigQuery, Structure of Standard data export, Structure of Detailed data export, Structure of pricing data export, Structure of FOCUS data export, Set up Cloud Billing data export to BigQuery, BigQuery pricing.