One step in your pipeline. Nothing else to adopt.

Is this change actually approved to ship to production?

Approvegate is a change management solution that checks your deploy against a signed approval record and documentation before it reaches production — and blocks it, with a reason, if it isn't real.

# deploy stage
deploy_ledger-api_prod:
  stage: deploy
  environment:
    name: production
  script:
    - approvegate check
        --service ledger-api
  # SHA + release read automatically —
  # release comes from the tag when the pipeline
  # runs off a tag push, e.g. v2.14.3.
  # branch-triggered deploys need --release explicitly.
  # fails the job if not approved
approvegate check → verdict
BLOCK

v2.14.3 has not been approved for prod deployment. Active approved deployment tickets - www.approvegate.io/team/approvegate/active

exit 1 · pipeline stopped before promotion

Why this isn't just "better branch protection"

A code review isn't a deploy authorization.

Branch protection checks that a diff was reviewed before merge. It says nothing about whether this build is cleared to ship to production right now — under the current policy, outside any freeze. Approvegate is that second check.

"The PR was reviewed and merged. Three weeks later that build sat in the queue, ready to ship — and nobody had re-authorized the deploy."

— reviewed ≠ authorized to ship
approvegate check · CHG-4471
release
v2.14.3
artifact
sha 9f2a1c…c17b
merge review
passed · 2 approvals
deploy auth
missing · never recorded
result
BLOCK
How it's built

One connected system. Two thin surfaces.

Approvegate isn't a portal you migrate into. It's an API your pipeline calls, backed by a minimal record of who approved what.

01 — the check

CI/CD package

A GitHub Action or GitLab CI step you drop into your existing deploy job. It calls the Approvegate API with the artifact version and service name — and the pipeline fails closed if the answer is no.

  • Zero UI for developers to visit — it's a pipeline step
  • Runs where you already deploy — GitHub Actions, GitLab CI
  • Fails with a reason, not a black box
→ calls the record below to decide
02 — the record

Minimal approval UI

Just enough surface to create a change request bound to an artifact, record who approved it, and attach the policy that governed it. Not a release planner. Not a second Jira.

  • Create a change, bind it to a commit or image digest
  • Record approval — enforces SoD automatically
  • Ingest approvals from Jira later — never compete with it
What creating an approval actually looks like

You approve the release. The artifact binds itself later.

You won't know the exact build yet — the pipeline hasn't run. Approve the release and who's allowed to sign off; the artifact locks in automatically the moment it's built. Set an expiry, and a stale approval can't authorize a deploy weeks later without anyone remembering to revoke it.

new approval
release / version
v2.14.3
service · environment
ledger-api · production
approver
m.chen
✓ not the requester — SoD satisfied
policy
default-prod-approval
valid for (optional)
7 days
expires automatically — no one has to remember to revoke it
what the check sees at deploy time
release
v2.14.3
artifact
sha 9f2a1c…c17b · bound at build
approved_by
m.chen
SoD
passed
expires
4 days remaining
status
ready to deploy

This is the same control that would have caught the three-week-old build from earlier — an expired approval can't authorize a deploy, whether anyone remembers to check or not.

If we're ever down, you're not stuck

A 99.99% uptime target — and you hold the override regardless.

The check calls out to us on every deploy, so availability matters — we build and monitor toward 99.99% uptime. But an SLA alone isn't good enough for a P1. You configure your own emergency path, in your own pipeline, on your own terms.

99.99%
uptime target
  • Two ways to move fast: override a single deploy, or open a time-boxed window for everything
  • Both are declared, not edited into the pipeline — nothing to remember to revert
  • Every emergency deploy is still logged as an exception, never a silent bypass
deploy_ledger-api_prod_emergency:
  stage: deploy
  environment:
    name: production
  script:
    - approvegate check
        --service ledger-api
        --release v2.14.4-hotfix
        --force-approve
        --reason "sev1-incident-4821"
  # bypasses the standard check, logged as an emergency deploy
Or open the window entirely — temporarily

Not every emergency is one deploy. Sometimes it's the next 12 hours.

Declare a time-boxed exception instead of editing the pipeline under pressure. No file to commit, no flag to remember to remove — it reverts to your normal policy on its own.

emergency patch mode
scope
main → production, all services
policy
allow all — no approval required
duration
12 hours
reason
sev1-incident-4821 — payments outage
declared by
s.park
what happens
window
now → +12h
expires
automatically — reverts to default-prod-approval
every deploy
logged, tagged emergency-window
declared_by
s.park
reason
recorded
Who this is actually for

Built for teams that already take production seriously — and want the process to hold.

This isn't here to convince you that change approval matters. It's for teams that already believe that, already have a process, and are tired of it being paperwork instead of protection.

A good fit

  • You already have a change or release-approval process and want it enforced, not just documented
  • Enough engineers ship to production that no one person can catch every risky change
  • An auditor, customer security review, or internal policy already requires documented approval before prod changes
  • You're tired of a process that's paperwork rather than something that actually stops a bad deploy

Not yet, if…

  • You're a small team where everyone already knows exactly what's shipping and why
  • Nobody currently reviews or approves changes before they reach production
  • An unauthorized or misconfigured deploy wouldn't be a serious problem for you
  • You want a place to plan releases, not a check that enforces one
What falls out for free

The audit trail was never the point. It's the byproduct of the check being real.

Every check — allow, block, or escalation — lands in an append-only log: artifact, approver, policy, and result. Export it when an assessor asks. You didn't do anything extra to get it.

See a sample export

Wire it into one deploy job. See it block one real thing.

A small number of design partners get the package installed on one pipeline, one production service — running against a real deploy in prod or non-prod.

01

One pipeline

Drop the Action/CI step into one real deploy job.

02

Deploy a build in Prod or Non-Prod

Run the check against a real deploy, wherever you run it — a staging environment or straight to production.

03

Your call on policy

You define what "approved" means for your team — we enforce it.

Approvegate helps teams enforce and evidence the change controls their compliance program requires. It does not by itself make any organization compliant with PCI DSS, SOX, HIPAA, or any other framework. Product surfaces shown are illustrative of the pilot build.