Argo CD deployment history that outlives the UI

Argo CD knows what is running right now, and keeps a short window of what came before. It is not built to answer what changed in this cluster three weeks ago, or which sync preceded last month's incident. Kollaber records each sync as a timeline event, so the history stays after Argo has moved on.

What lands on the timeline

Service
The Argo CD application name.
Revision
The Git revision the sync applied.
Sync status
Synced, out of sync, and the operation phase.
Health
Application health at the time of the sync.
Placement
The Argo project and destination namespace.

Setup

  1. 1Add a webhook service and template

    Argo CD builds the request body from a template you write, so the body below is the contract. Add both blocks to argocd-notifications-cm.

    service.webhook.kollaber: |
      url: https://kollaber.io/webhooks/argocd?environment_id=<uuid>
      headers:
      - name: X-Kollaber-Secret
        value: $kollaber-webhook-secret
    
    template.kollaber-sync: |
      webhook:
        kollaber:
          method: POST
          body: |
            {
              "app": "{{.app.metadata.name}}",
              "revision": "{{.app.status.sync.revision}}",
              "sync_status": "{{.app.status.sync.status}}",
              "health_status": "{{.app.status.health.status}}",
              "operation_phase": "{{.app.status.operationState.phase}}",
              "project": "{{.app.spec.project}}",
              "namespace": "{{.app.spec.destination.namespace}}"
            }
  2. 2Subscribe an application

    Annotate the Application you want recorded. Any trigger works; on-sync-succeeded is the usual starting point.

    notifications.argoproj.io/subscribe.on-sync-succeeded.kollaber: ""
  3. 3Sync and check the timeline

    The next successful sync lands on the environment timeline with the revision and health attached.

Good to know

  • Only the app field is required. Everything else enriches the event, so a trimmed template still works.
  • Event status comes from operation_phase first and health_status second. A sync that succeeded onto a degraded app is recorded as a successful change, with the health left in the metadata — the change did land, and conflating the two would distort change failure rate.
  • Add "type": "teardown" to the body on an on-app-deleted subscription. It defaults to deploy.

Questions

Does this replace Argo CD's own notifications?

No. It is an additional service in the same notifications config, so your existing Slack or email subscriptions keep working unchanged.

How do I send different applications to different environments?

Define one webhook service per environment, each with its own environment_id in the URL, and subscribe applications to the matching one.

What happens when a sync fails?

Subscribe on-sync-failed to the same service. The operation phase drives the event status, so a failed sync is recorded as a failed change and feeds change failure rate.

Other integrations

Start recording Argo CD changes

The free plan covers two environments and five members. The full reference for this integration lives in the docs.