Change freeze controller

Change freezes as an API.

One source of truth for freeze windows that every pipeline, script and auditor can query. Hard-block or soft-warn, time-zone-aware recurrence, exception workflow with named approvers, and an audit trail you can hand to SOC 2 / SOX auditors.

Free plan, no card. One curl in your pipeline. Returns 423 Locked during a hard freeze.

deploy.sh — POST /v1/check
$ curl -si -X POST https://changefreeze.io/v1/check \
    -H "Authorization: Bearer cfk_r_8fK2…" \
    -d '{"service":"checkout-api","environment":"prod",
         "change_type":"code","actor":"ci@acme.io","source":"github-actions"}'

HTTP/2 423 Locked
{
  "ok": false,
  "check_id": "chk_01JBX4Q7N2",
  "frozen": true,
  "decision": "block",
  "mode": "hard",
  "active": [{ "name": "Black Friday / Cyber Monday", "kind": "hard",
               "reason_category": "peak_season",
               "ends_at": "2026-12-01T05:00:00.000Z" }],
  "exception": null,
  "message": "Changes are blocked by the \"Black Friday / Cyber Monday\" freeze for Acme…"
}
# .github/workflows/deploy.yml
- name: Change freeze gate
  run: |
    curl -sf -X POST https://changefreeze.io/v1/check \
      -H "Authorization: Bearer ${{ secrets.CHANGEFREEZE_KEY }}" \
      -d '{"service":"checkout-api","environment":"prod","change_type":"code",
           "actor":"${{ github.actor }}","ref":"${{ github.sha }}","source":"github-actions"}'

Works with anything that can make an HTTP request

GitHub ActionsGitLab CIJenkinsAzure DevOpsTerraformKubernetesArgo CDSlack
The problem

Your freeze lives in a Slack message. Your deploys don't read Slack.

Every team has freeze windows. Almost nobody has a system that enforces them everywhere a change can originate.

Freezes are scattered

Dates live in Slack threads, a shared calendar and a spreadsheet owned by someone on PTO. Nobody is sure which one is current, and no tool can query any of them.

Every tool only freezes itself

GitLab deploy freeze, Harness, Octopus, Argo sync windows and Merge Freeze each guard their own door. Terraform applies, kubectl, feature flags and cron jobs walk straight through.

Exceptions are email threads

"Can we ship the hotfix?" gets a thumbs-up from somebody, somewhere. Six months later an auditor flags a production change with no documented approval and you rebuild the story from chat logs.

How it works

Define once. Enforce everywhere. Prove it later.

Define windows

Create hard or soft freezes with a time zone, recurrence and scope: services, environments, change types, tags. Pick a template (BFCM, year-end, quarter close, no-deploy Fridays) or hit Freeze now during an incident.

{ "name": "Quarter-end close", "kind": "soft",
  "timezone": "America/New_York",
  "recurrence": { "freq": "monthly", "interval": 3 },
  "scope": { "tags": ["finance"], "environments": ["prod"] } }

Gate your pipelines

Add one HTTP call before anything that changes production. A hard freeze answers 423 Locked and the job stops; a soft freeze answers 200 with decision: "warn" and is logged.

curl -sf https://changefreeze.io/v1/check \
  -H "Authorization: Bearer $CF_KEY" \
  -d '{"service":"billing","environment":"prod"}' \
  || { echo "Change freeze active"; exit 1; }

Handle exceptions & prove it

Engineers request an exception with a justification and rollback plan; named approvers approve it; the token EXC-7K2M-9QXD unlocks exactly that scope until it expires. Every check, block, override and approval is kept, and exported on demand.

-d '{"service":"billing","environment":"prod",
     "exception_token":"EXC-7K2M-9QXD"}'
HTTP/2 200  "decision": "override"
Features

Everything a freeze needs. Nothing a ticketing suite drags along.

Hard block or soft warn

Hard freezes return 423 and stop the job. Soft freezes let it through with a warn decision that is logged and can alert the channel.

Scoped precisely

Freeze by service, environment, change type (code, infra, config, data, flag, hotfix) or tag. Freeze customer-facing prod without freezing docs.

Time-zone-aware recurrence

Daily, weekly (by weekday), monthly or yearly windows anchored to a wall clock in the freeze's own time zone. DST shifts are handled, not hand-corrected.

Exception tokens

Requests carry a justification, rollback plan, risk level and expiry. Named approvers decide; no self-approval by default. The token overrides only the scope it was granted for.

Audit trail & evidence

Every check, block, override, approval and freeze edit is recorded with actor, source, IP and timestamp. Business exports CSV/JSON mapped to SOC 2, SOX, PCI DSS and ISO 27001.

Public status page

A free "Are we frozen?" page at /s/your-org, an SVG badge for READMEs, status.json for scripts and an ICS feed for calendars.

Notifications

Slack, Microsoft Teams, Discord, signed webhooks and email for upcoming, started and ended freezes, exception requests and decisions, and blocked deploys.

Freeze now

One button (or one POST /v1/freezes with freeze_now: true) during an incident. Default four hours, every pipeline stops, every channel is told.

Built for compliance

Evidence as a product output, not a quarterly scramble.

Auditors ask the same questions every year: when were changes restricted, who approved what went through anyway, and can you prove the control actually ran? ChangeFreeze answers all three from one export.

  • Freeze windows (expanded occurrences), exceptions with approvals, every check and the full audit log for a date range
  • CSV for spreadsheets and GRC uploads, JSON for your own tooling
  • Retention from 30 days (Free) to 7 years (Enterprise), enforced per plan
  • Customer- and tenant-labelled freezes for SaaS vendors and MSPs who honour each customer's peak season
SOC 2 CC8.1Change management: changes are authorised, tested and approved before deployment; freeze periods and emergency-change approvals documented.
SOX ITGCChange control and emergency changes: evidence that financial-close freezes were enforced and overrides had segregated approval.
PCI DSS 6.5Change control procedures for changes to system components in the cardholder data environment, including rollback plans.
ISO 27001 A.8.32Change management: information-processing changes are subject to defined procedures with approval and traceability.
Integrations

If it can run curl, it can honour a freeze.

No agents, no plugins to keep updated. Your tooling pulls the decision; ChangeFreeze never needs access to your infrastructure.

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Change freeze gate
        env:
          CF_KEY: ${{ secrets.CHANGEFREEZE_KEY }}
          EXCEPTION_TOKEN: ${{ inputs.exception_token }}
        run: |
          curl -sf -X POST https://changefreeze.io/v1/check \
            -H "Authorization: Bearer $CF_KEY" -H "Content-Type: application/json" \
            -d "{\"service\":\"checkout-api\",\"environment\":\"prod\",\"change_type\":\"code\",
                 \"actor\":\"${{ github.actor }}\",\"source\":\"github-actions\",
                 \"ref\":\"${{ github.repository }}@${{ github.sha }}\",
                 \"exception_token\":\"$EXCEPTION_TOKEN\"}" \
            || { echo "::error::Change freeze is active. Request an exception in ChangeFreeze."; exit 1; }
      - run: ./deploy.sh

More in the docs: Jenkins, Azure DevOps gates, exit-code conventions and webhook signature verification.

Public status page

"Are we frozen?" answered in one URL.

Every org gets changefreeze.io/s/your-org, with status.json, an SVG badge and an ICS feed behind it. Share it with support, sales and customers.

Acme change freeze statusTime zone: America/New_York

Change freeze in effect

Changes are blocked until Tue 1 Dec 2026, 00:00 (America/New_York).

Active windows

  • hardBlack Friday / Cyber MondayTue 24 Nov 00:00 → Tue 1 Dec 00:00

Services

  • checkout-apiFrozen
  • storefrontFrozen
  • billingSoft freeze
  • docs-siteOpen

Upcoming (30 days)

  • softQuarter-end closeMon 28 Dec 00:00 → Sat 2 Jan 23:59
  • hardYear-end holiday freezeSat 19 Dec 00:00 → Sun 3 Jan 00:00
Pricing

Start free. Pay when you need recurrence, exceptions or evidence.

Free

For a single team that wants one source of truth.

$0

forever

  • 3 services, 2 environments, 2 members
  • 2 scheduled freeze windows
  • Freeze-status API (60 req/min)
  • Public "Are we frozen?" page
  • 1 Slack channel
  • 30-day audit history
Start free

Business

Audit evidence, customer-driven freezes and unlimited seats.

$199/mo

or $1,990/yr (2 months free)

  • 50 services, unlimited members
  • Customer / tenant-driven freeze windows
  • SOC 2 / SOX evidence exports (CSV, JSON)
  • 25 API keys, 3,000 req/min
  • Blocked-deploy alerts
  • 3-year audit history
  • Priority support
Start free

Enterprise

Unlimited everything, SSO and a signed agreement.

Custom

annual contract

  • Unlimited services, keys and history
  • SSO / SAML via Auth0 enterprise connections
  • Multiple organizations (MSP workspaces)
  • Custom retention and data residency
  • Dedicated support and SLA
Contact sales

See the full comparison →

FAQ

Questions engineers ask first

How is this different from GitLab deploy freeze, Argo sync windows or Merge Freeze?

Those features freeze the tool they live in. ChangeFreeze is the freeze calendar those tools (and Terraform, kubectl, feature-flag scripts, cron jobs and humans) consult. Keep using them; point them at one source of truth so a window defined once applies to every path to production.

Does ChangeFreeze block deployments itself?

No. It is pull-based: your pipeline calls POST /v1/check and acts on the decision. That means no agents, no credentials to your cloud, and you decide how strictly each job honours the answer.

What happens if the API is unreachable?

You choose. curl -f with exit 1 fails closed; appending || true or passing soft_fail: true (which makes a block return 200) fails open. Many teams fail closed for production deploys and open for low-risk jobs. Enterprise plans include an SLA.

Hard freeze vs soft freeze?

A hard freeze returns decision: "block" with HTTP 423 unless a valid exception token is supplied. A soft freeze returns decision: "warn" with HTTP 200, is recorded, and can notify a channel. If both apply, hard wins.

How do exceptions work?

A member requests one with a title, justification, rollback plan, risk level, scope and validity window (default 4 hours, max 14 days). Approvers (owner, admin or approver roles by default) approve or deny; the requester cannot approve their own. Approved requests get a token like EXC-7K2M-9QXD that turns a block into an override for matching checks until it expires.

What is recorded, and can I give it to auditors?

Every check (target, actor, source, ref, decision, matching freezes, exception, API key, IP), every freeze create/edit/cancel, every exception request and decision, and key and member changes. Business and Enterprise export a date range as CSV or JSON with a summary that cites SOC 2 CC8.1, SOX ITGC, PCI DSS 6.5 and ISO 27001 A.8.32.

How are time zones and daylight saving handled?

Each freeze carries an IANA time zone. Recurring windows are anchored to the wall clock in that zone, so "Friday 15:00 to Monday 09:00 in Europe/London" stays at 15:00 across the DST change. All API timestamps are ISO 8601 UTC.

Is there really a free plan?

Yes: 3 services, 2 environments, 2 members, 2 scheduled windows, 5,000 checks a month at 60 requests per minute, one Slack channel, a public status page and 30 days of history. No card required.

Ship a freeze gate before lunch.

Create an org, add a service, generate a read key and paste one step into your pipeline. The first freeze window takes about five minutes.