TL
The short answer

The common GCP billing surprises are BigQuery on demand queries that scan more data than anyone expected, network egress between regions and out to the internet, idle resources that keep running after their purpose ended, premium network tier applied to traffic that does not need it, and missed committed use discounts on steady workloads. None of these appears as one obvious line, which is exactly why they accumulate quietly. The fix is the same for all of them: enable detailed billing export to BigQuery, group cost by service, SKU, and project, and put an owner on each driver so it stops being nobody's problem.

A surprise is just a cost no one was watching. Name it, attribute it, and it stops surprising you.

Why does BigQuery cost so much more than expected?

BigQuery on demand pricing charges for the bytes a query scans, not the rows it returns, so a query that selects three columns from a wide table still pays only for those columns, but a query with no partition filter scans the whole table every time it runs. The surprise arrives when a dashboard refreshes every few minutes against an unpartitioned table, or an analyst runs select star to explore, and each execution rescans gigabytes. Multiply by a team and a month and the line balloons.

Three habits remove most of it. Partition and cluster large tables so queries prune to the slice they need. Select only the columns a query uses rather than star. And for predictable, heavy query volume, evaluate capacity pricing, where you pay for reserved slots instead of per byte scanned, because past a certain steady scan volume reserved capacity is cheaper and caps the bill. That on demand versus capacity decision has its own discipline and is worth modelling against your actual scan profile.

Why is the egress line bigger than the compute line?

Data transfer is the cost nobody provisions on purpose. GCP charges for egress to the internet, egress between regions, and egress between zones, while ingress and same zone internal traffic are generally free. A service that calls a database in another region pays inter region egress on every request, and an architect rarely sees that boundary crossing when they wire the system. The bill grows in proportion to how far data travels and how many times it crosses a boundary, not to anything a single owner decided.

Co locating chatty services, caching repeated responses at the edge, and choosing the network tier deliberately are the levers. The deeper treatment of egress, including how to trace each transfer SKU to a workload, is worth reading alongside this.

Where do idle resources and the wrong defaults hide?

Idle and oversized resources are the quiet baseline tax on every estate. Persistent disks survive after their instances are deleted and keep billing. External IP addresses that are reserved but unattached carry a charge. Load balancers and Cloud NAT keep running on forgotten environments. Snapshots accumulate with no retention policy. And premium network tier, the default, routes egress over Google's backbone at a higher rate than standard tier, which hands off to the public internet earlier and costs less for traffic that does not need global low latency routing. Each of these is invisible until you look, because nothing fails when you overpay.

Which discounts are you leaving on the table?

GCP applies sustained use discounts automatically to eligible Compute Engine usage that runs for a large share of the month, with no commitment, which is genuinely helpful but is not the biggest lever. Committed use discounts, which you buy in exchange for a one or three year commitment, discount steady workloads far more deeply, and they come in two shapes: resource based CUDs tied to specific machine types in a region, and spend based CUDs that apply to a dollar amount of eligible usage with more flexibility. Teams that rely only on the automatic sustained use discount leave the larger committed use saving uncollected on workloads that clearly run all year. The commitment decision is risk adjusted: cover the demand a defensible forecast supports, not the peak.

Worked example

A Fortune 500 retailer opened its first billing export and found four surprises stacked together: a reporting dashboard rescanning an unpartitioned BigQuery table every few minutes, a service reading cross region from a data store, a fleet of unattached persistent disks and reserved IPs left from a migration, and a steady compute base running entirely on demand with no committed use coverage. Partitioning the table, moving the read replica into the same region, deleting the orphaned disks and IPs, and placing a committed use discount over the steady base together cut the project's monthly bill by roughly a third. Figures are verified against billing data and anonymised.

Where this sits in the wider GCP picture

These surprises are the symptoms; the system that prevents them is a billing export wired into ownership and review. The architecture decisions that stop them recurring are covered in the GCP architecture choices that cut cost, and the egress line gets its full treatment in data transfer costs on GCP explained. The estate wide playbook lives in the GCP cost optimization guide, and the cross cloud view, including how the same traps look on AWS and Azure, is in the cross cloud cost optimization guide.

Frequently asked questions

What causes unexpected GCP bills?
BigQuery on demand queries that scan more than expected, network egress between regions and to the internet, idle resources left running, premium network tier on traffic that does not need it, and missed committed use discounts on steady workloads. Each is small per event but compounds across a month.
How do I find what is driving a GCP cost spike?
Enable detailed billing export to BigQuery and group by service, SKU, and project. The SKU names the exact driver, so you can trace a spike to the query, the egress path, or the resource that caused it and to the team that owns it.
Does GCP give discounts automatically?
Sustained use discounts apply automatically to eligible Compute Engine usage with no commitment. Committed use discounts are separate and must be purchased, and they discount steady workloads more deeply, so relying only on the automatic discount leaves money on the table.

Put a number on your surprises

We open the billing export, attribute every surprise line to its source, and turn the repeat offenders into a watched, falling number. Our guarantee: we reduce your cloud spend or we reimburse our service fee. Pricing is either a Fixed Fee scoped up front or Gainshare, a share of verified savings with no retainer and no risk.

Independent · buyer-side

Put a defensible number on your cloud spend.

No provider in the room, no published price list. Tell us your footprint and we will scope the savings against your billing data — we reduce your cloud spend or we reimburse our service fee.

Buyer-side intelligence, monthly.

The Cloud Spend Navigator: what changed in cloud pricing, commitments, and FinOps — no vendor spin.