Cost tracker

What we’re paying GCP each month, projected from verified me-central2 prices. Update this page every time we turn on a new resource so the running total stays honest.

Verification policy: every dollar value here must trace back to the GCP Cloud Billing Catalog API (run python3 scripts/gcp-prices.py). Third-party sites (cloudprice.net, blog posts, calculator widgets) are not an acceptable source — they lag, they apply discounts that no longer exist, and they’re inconsistent. See Checking GCP prices for the methodology.


Current monthly spend (verified 2026-05-13)

Project: wiqaia-ops

Operational infrastructure — Gitea + docs + auto-deploy.

ResourceDetailCatalog mathEst. monthly
Ops VMe2-small (0.5 vCPU + 2 GiB), me-central2-a, 24/70.5 × $0.036643/h + 2 × $0.004912/h = $0.02814/h × 730h$20.55
Boot disk30 GiB pd-balanced (zonal), me-central2-a30 × $0.16/GiB·mo$4.80
Disk snapshotsDaily incremental, 7-day retention. ~7 GiB stored across all 7 snapshots after first-snapshot dedupe.7 × $0.08/GiB·mo~$0.56
Static external IPAttached to ops VM. $0/h for standard VMs in me-central2 (catalog SKU “External IP Charge on a Standard VM” = $0).$0.00
GCS bucket wiqaia-ops-tfstateTerraform state, ~50 KiB Standard storage0.00005 × $0.030/GiB·mo<$0.01
Cloud LoggingVM writes well under the 50 GiB/project/mo free tier$0.00
Cloud MonitoringMetric writes under free tier$0.00
IAP tunnel (SSH)Low usage, well under free tier$0.00

Subtotal: ~$25.91/mo

Project: wiqaia (the pilot — note the name)

The Saudi Airlines pilot lives in a GCP project literally named wiqaia, not wiqaia-pilot-prod as the plan originally assumed. The project was created via CNTXT without the suffix; we kept the name and relaxed the Terraform validation regex to accept it.

Nothing applied yet beyond quota preferences. The first terraform apply is gated on:

  • CE-03 (senior Terraform audit), and
  • Org-level decision to start spending (cash flow).

Quota guardrails are live (applied 2026-05-14 via gcloud, not via TF apply — see Managing quotas) so even an accidental apply has hard caps to push against. 11 quotas total; worst case if every cap maxed = ~$3,200/mo, below the $4,000 budget alert.

Running total

ProjectVerified spendBudget capHeadroom
wiqaia-ops~$26/mo$50/mo$24
wiqaia (pilot)$0$4,000/mo$4,000
Total~$26/mo$4,050$4,024

What we plan to turn on next

Numbers below are catalog-verified per-unit rates × estimated quantities. Quantities are best-guesses until each resource is actually sized. Mark items VERIFIED once they’re running and the actual size is known.

Imminent — gitea_data nightly backup to GCS

ResourceDetailCatalog mathEst. monthly
GCS Standard storage (Dammam)Daily tarball of gitea_data volume, 30 days retained, ~60 MiB compressed today30 × 0.06 GiB × $0.030/GiB·mo~$0.05
GCS Coldline (lifecycle after 30 days)Long-term retention, 11 months × ~60 MiB11 × 0.06 GiB × $0.006/GiB·mo~$0.005

Climbing toward $0.50-1/mo over the next 12 months as repos grow.

M01 — Foundations (gated on CE-03 audit)

Status column means: rates-verified (per-unit rates verified, sizing/quantity is the only estimate), partial (some rate-pieces verified, others guessed), estimate (rates not yet in catalog dump — to verify before sizing).

ResourceSizing assumptionCatalog mathEst. monthlyStatus
GKE general node poole2-medium (1 vCPU + 4 GiB), on-demandper node: $0.036643 + 4×$0.004912 = $0.0563/h × 730 = $41.10/mo~$123rates-verified
GKE GPU node pool — Tier-2 LLMg2-standard-8 (8 vCPU + 32 GiB) + 1× L4, always-warm, on-demand8×$0.041980 + 32×$0.004918 + $0.896064 = $1.389/h × 730~$1,014rates-verified
GKE GPU node pool — with 1-yr commit on L4same VM + 1-yr committed L4 ($0.5645/h)8×$0.041980 + 32×$0.004918 + $0.5645 = $1.057/h × 730~$772rates-verified
Memorystore RedisM1 Standard 4 GiB4 × $0.0480/GiB·h × 730~$140rates-verified
Cloud Storage (CMEK, per-tenant buckets)Mixed Standard + Coldline lifecycle$0.030/$0.006 per GiB·mo verified; volume TBD~$10-30rates-verified
KMS keys~6 software + ~3 HSM symmetric$0.06/key·mo software + $1/key·mo HSM~$3-7rates-verified
Cloud Load Balancer1× Global HTTPS LB, first forwarding rule$0.025/h (Global) × 730 = $18.25 first rule + $0.01/h per additional~$20-30rates-verified
Cloud NAT — IP charge1× NAT IP$0.005/h × 730 verified~$3.65partial
Cloud NAT — data processingPilot volumePer-GiB-processed rate not in my catalog dump; commonly ~$0.045/GiB~$10-40estimate
Cloud SQL Postgres Regional — RAMdb-custom-2-7680: 7.5 GiB RAM, HA7.5 × $0.0224/GiB·h × 730$122.64rates-verified
Cloud SQL Postgres Regional — vCPU2 vCPU, HAvCPU SKU not cleanly visible in catalog dump (might be Small instance flat $0.112/h or per-vCPU rate I haven’t found). To verify before sizing.$80-160 (?)estimate
Cloud SQL storage + backups50 GiB + PITRHyperdisk Balanced IOPS shows $0.064/mo; storage SKU not clean~$5-15estimate
GKE control plane1 zonal clusterNot in catalog dump under expected names. GCP docs: first cluster free, $0.10/h after$0-73estimate
Pub/Sub8 topics, pilot volume“Message Delivery Basic” tiered rate exists ($50/TiB at upper tier); free below ~10 GiB/mo per docs<$5estimate
BigQuery~50 GiB scanned/moDammam SKUs not in current dump; us-central1 is $6.25/TiB scanned~$0.30 + storageestimate
Artifact Registry~10 GiB Docker imagesDammam storage SKU not in dump (docs say $0.10/GiB·mo)~$1estimate

M01 estimated total (when fully on):

  • Conservative (1-yr GPU commit, lower bounds on ranges): ~$1,200/mo
  • On-demand GPU + upper bounds: ~$1,500/mo

Well within the $4,000/mo pilot-prod budget cap.

What “rates-verified” actually means: the per-unit price came from the GCP Catalog API. The estimated monthly is verified_rate × sizing_guess, so if we double the VM count or the GiB allocation, the cost doubles linearly with confidence. The numbers are only as right as the sizing — but they won’t be off by 50% from a wrong rate.

What “estimate” means: the per-unit rate isn’t (yet) in our local catalog dump. The price might be in a less-obvious SKU, or might be a flat-rate that I missed when scanning. Re-run python3 scripts/gcp-prices.py --service <X> --all-skus and search before committing to a number.

M05 / M06 — Edge AI + Tier-2 LLM

GPU is already accounted for above. The dominant ongoing cost.

M07+ — Spatial correlation, dashboards, etc.

Incremental: Cloud SQL storage growth, more Pub/Sub messages. Likely +$50-100/mo through M10.


Changelog

Append a row every time we turn on something new.

DateProjectResourceMonthly deltaCumulative
2026-05-13wiqaia-opsInitial ops VM + disk + snapshots + tfstate bucket+$26$26
2026-05-14wiqaia-ops11 quota preferences brought under Terraform (no cost — quotas are free)+$0$26
2026-05-14wiqaia (pilot)11 quota preferences via gcloud (no other resources applied)+$0$26

How to refresh

  1. Verify any price: python3 scripts/gcp-prices.py --service <X> --grep "<term>". The Catalog API is the only source of truth.
  2. Update this table with the verified numbers. Mark items VERIFIED once they’re running.
  3. Add a changelog row for any new resource turned on.
  4. Recompute the totals. Build, commit, push — see Maintaining the docs.

Things that could surprise the bill

Documented for paranoia:

  • Egress out of me-central2 is expensive — ~$0.08-0.12/GiB cross-region within Middle East, ~$0.19/GiB to internet. Keep traffic intra-region.
  • Cloud SQL backups + PITR window: charged separately; PITR window past 7 days adds up.
  • BigQuery query bytes: a runaway scan costs real money. Quota + dry-run-by-default protects this.
  • Snapshot retention beyond 7 days is linear in cost.
  • GPU left running when unused: $654/mo per always-warm L4 on-demand. The plan deliberately chose always-warm for safety; if we ever experiment with scale-to-zero, that’s where to save most.
  • Reserved-but-unattached static IPs: $0.01/h ($7.30/mo). terraform destroy unused IPs.

Defense at pilot scale: tight quotas (the actual hard ceiling — see Managing quotas) + the 7-threshold budget alert stack + human response. An automated kill-switch was considered and deferred; see decisions.

WiqAIa+ Docs · Rizoma