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.
| Resource | Detail | Catalog math | Est. monthly |
|---|---|---|---|
| Ops VM | e2-small (0.5 vCPU + 2 GiB), me-central2-a, 24/7 | 0.5 × $0.036643/h + 2 × $0.004912/h = $0.02814/h × 730h | $20.55 |
| Boot disk | 30 GiB pd-balanced (zonal), me-central2-a | 30 × $0.16/GiB·mo | $4.80 |
| Disk snapshots | Daily incremental, 7-day retention. ~7 GiB stored across all 7 snapshots after first-snapshot dedupe. | 7 × $0.08/GiB·mo | ~$0.56 |
| Static external IP | Attached 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-tfstate | Terraform state, ~50 KiB Standard storage | 0.00005 × $0.030/GiB·mo | <$0.01 |
| Cloud Logging | VM writes well under the 50 GiB/project/mo free tier | — | $0.00 |
| Cloud Monitoring | Metric 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
| Project | Verified spend | Budget cap | Headroom |
|---|---|---|---|
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
| Resource | Detail | Catalog math | Est. monthly |
|---|---|---|---|
| GCS Standard storage (Dammam) | Daily tarball of gitea_data volume, 30 days retained, ~60 MiB compressed today | 30 × 0.06 GiB × $0.030/GiB·mo | ~$0.05 |
| GCS Coldline (lifecycle after 30 days) | Long-term retention, 11 months × ~60 MiB | 11 × 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).
| Resource | Sizing assumption | Catalog math | Est. monthly | Status |
|---|---|---|---|---|
| GKE general node pool | 3× e2-medium (1 vCPU + 4 GiB), on-demand | per node: $0.036643 + 4×$0.004912 = $0.0563/h × 730 = $41.10/mo | ~$123 | rates-verified |
| GKE GPU node pool — Tier-2 LLM | 1× g2-standard-8 (8 vCPU + 32 GiB) + 1× L4, always-warm, on-demand | 8×$0.041980 + 32×$0.004918 + $0.896064 = $1.389/h × 730 | ~$1,014 | rates-verified |
| GKE GPU node pool — with 1-yr commit on L4 | same VM + 1-yr committed L4 ($0.5645/h) | 8×$0.041980 + 32×$0.004918 + $0.5645 = $1.057/h × 730 | ~$772 | rates-verified |
| Memorystore Redis | M1 Standard 4 GiB | 4 × $0.0480/GiB·h × 730 | ~$140 | rates-verified |
| Cloud Storage (CMEK, per-tenant buckets) | Mixed Standard + Coldline lifecycle | $0.030/$0.006 per GiB·mo verified; volume TBD | ~$10-30 | rates-verified |
| KMS keys | ~6 software + ~3 HSM symmetric | $0.06/key·mo software + $1/key·mo HSM | ~$3-7 | rates-verified |
| Cloud Load Balancer | 1× Global HTTPS LB, first forwarding rule | $0.025/h (Global) × 730 = $18.25 first rule + $0.01/h per additional | ~$20-30 | rates-verified |
| Cloud NAT — IP charge | 1× NAT IP | $0.005/h × 730 verified | ~$3.65 | partial |
| Cloud NAT — data processing | Pilot volume | Per-GiB-processed rate not in my catalog dump; commonly ~$0.045/GiB | ~$10-40 | estimate |
| Cloud SQL Postgres Regional — RAM | db-custom-2-7680: 7.5 GiB RAM, HA | 7.5 × $0.0224/GiB·h × 730 | $122.64 | rates-verified |
| Cloud SQL Postgres Regional — vCPU | 2 vCPU, HA | vCPU 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 + backups | 50 GiB + PITR | Hyperdisk Balanced IOPS shows $0.064/mo; storage SKU not clean | ~$5-15 | estimate |
| GKE control plane | 1 zonal cluster | Not in catalog dump under expected names. GCP docs: first cluster free, $0.10/h after | $0-73 | estimate |
| Pub/Sub | 8 topics, pilot volume | “Message Delivery Basic” tiered rate exists ($50/TiB at upper tier); free below ~10 GiB/mo per docs | <$5 | estimate |
| BigQuery | ~50 GiB scanned/mo | Dammam SKUs not in current dump; us-central1 is $6.25/TiB scanned | ~$0.30 + storage | estimate |
| Artifact Registry | ~10 GiB Docker images | Dammam storage SKU not in dump (docs say $0.10/GiB·mo) | ~$1 | estimate |
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.
| Date | Project | Resource | Monthly delta | Cumulative |
|---|---|---|---|---|
| 2026-05-13 | wiqaia-ops | Initial ops VM + disk + snapshots + tfstate bucket | +$26 | $26 |
| 2026-05-14 | wiqaia-ops | 11 quota preferences brought under Terraform (no cost — quotas are free) | +$0 | $26 |
| 2026-05-14 | wiqaia (pilot) | 11 quota preferences via gcloud (no other resources applied) | +$0 | $26 |
How to refresh
- Verify any price:
python3 scripts/gcp-prices.py --service <X> --grep "<term>". The Catalog API is the only source of truth. - Update this table with the verified numbers. Mark items VERIFIED once they’re running.
- Add a changelog row for any new resource turned on.
- 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 destroyunused 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.