# GCS Bucket Standard Class with Low Access

> Standard storage costs about $0.020 per GB-month while Nearline costs $0.010 in the same regions, a 50% delta. ZopNight recommends the move only when the measured access rate stays under 0.05 operations per day for 30 days. An uninstrumented bucket is never reclassed blind.

Source: https://zop.dev/integrations/gcp/recommendations/gcs-bucket-standard-class-with-low-access
Updated: 2026-08-19

---

## One access every 20 days is the bar

The rule watches each Standard-class bucket's average daily API-operation rate over 30
days and calls it cold below 0.05 operations per day, roughly one access every 20 days.
That bar is deliberately severe, because Nearline punishes misclassification: it adds a
per-GB retrieval fee and per-operation charges that erase the storage saving on any
bucket that is actually read. A bucket at or above the bar is left on Standard without
comment.

## Half the storage rate, same bucket

Standard storage runs about $0.020 per GB-month against Nearline's $0.010 (us-central1
reference pricing), so the recommendation applies a 50% delta to the bucket's known
monthly cost, a real cost because bucket capacity is backfilled from the measured
total-bytes series rather than assumed. Three gates must all pass: the default class is
recorded as STANDARD, the access-rate series exists and reads cold, and a positive cost
is known. Miss any one and nothing is emitted; in particular, a bucket whose monitoring
was never instrumented has an unknown access pattern and is never reclassed on that
unknown.

## Measure the access rate

```bash
curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://monitoring.googleapis.com/v3/projects/PROJECT_ID/timeSeries?filter=metric.type%3D%22storage.googleapis.com%2Fapi%2Frequest_count%22%20AND%20resource.labels.bucket_name%3D%22my-bucket%22&interval.startTime=$(date -u -v-30d +%Y-%m-%dT%H:%M:%SZ)&interval.endTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
```

The series behind the rule is read with `monitoring.timeSeries.list`
(`roles/monitoring.viewer`); the bucket's own configuration comes from
`storage.buckets.get`.

## Default class changes affect new objects first

`gcloud storage buckets update gs://my-bucket --default-storage-class=NEARLINE` changes
what class *new* objects land in. Existing objects keep their class until rewritten or
moved by a lifecycle rule, so pair the default-class change with a transition rule if the
bulk of the data is already there. Mind Nearline's 30-day minimum storage duration:
objects deleted or reclassed sooner still bill the full 30 days.

## Quiet cases

Buckets already on Nearline, Coldline, or Archive; buckets whose storage class was never
recorded; access at or above 0.05 ops/day; a missing access-rate series; or an unknown
cost. Each abstains; the rule never converts an unmeasured bucket.
