Overview
Pulses are lightweight event records that capture changes to your systems — deploys, config updates, feature-flag flips, database migrations, CI builds — without paging anyone, creating an incident, or generating a notification. They exist for a single reason: when an incident happens, responders need to answer “what changed?” as fast as possible. Pulses give you a searchable, filterable timeline of every change that landed in the recent past, so triage takes minutes instead of digging through Slack, git logs, and deploy dashboards to reconstruct the timeline.How Pulses Are Used
Sending Pulses
Pulses can be created two ways: through the Rootly API and through the Rootly CLI. Pick whichever matches how your pipeline is already structured — most teams end up using both (API for programmatic sources, CLI for shell scripts and CI).API
Every pulse is aPOST /v1/pulses with a summary and optional metadata. Minimal request:
CLI
The Rootly CLI exposes two pulse commands — one that creates a pulse from a summary and one that wraps an arbitrary shell command: Simple pulse:pulse run executes the wrapped command and creates a pulse capturing the command, its exit status, and its runtime. Best for CI job wrappers where you want “this thing ran” as pulse metadata automatically.
See the Rootly CLI docs for the full command reference.
Pulse Attributes
Every pulse supports the following fields. All are searchable and filterable in the pulses UI and in pulse variables for workflow templates.{"version": "2.14.1", "author": "alice"}.Common Pulse Sources
CI/CD deploy pipelines
CI/CD deploy pipelines
Feature flag services
Feature flag services
Infrastructure changes (Terraform, Pulumi, Kubernetes)
Infrastructure changes (Terraform, Pulumi, Kubernetes)
terraform apply, every kubectl rollout, every Pulumi update. Include the plan diff (or a link to it) in labels or external_url so responders can see what actually changed at the infra level.Database migrations
Database migrations
Manual runbook actions
Manual runbook actions
rootly pulse create "Restarted elasticsearch-prod") as an operator habit. Future you will thank present you when the change becomes relevant during triage.Best Practices
- Send more pulses than you think you need. Filtering out noisy pulses at read time is trivial (label filters, service filters, time-window filters). Reconstructing a change history from scratch during a live incident is not.
- Wire pulses at the automation layer, not by hand. A pulse that requires an engineer to remember to send it doesn’t get sent when it matters most (during a rushed hotfix). Bake pulse creation into deploy jobs, CI hooks, and feature-flag webhooks so it happens automatically.
- Use consistent labels across sources. If your GitHub deploys use
version, your Terraform runs useterraform_version, and your feature flags usevariant, filtering at read time gets awkward. Standardize on a small label vocabulary and apply it everywhere. - Tag
environmentsandserviceson every pulse. Untagged pulses don’t surface in incident triage because triage filters by service and environment. A pulse without those tags is a pulse that responders won’t see. - Include an
external_urlwhen the pulse links to actionable detail. A pulse that says “Deploy v2.14.1” is useful; a pulse that says “Deploy v2.14.1” + a link to the CircleCI build page is a rollback candidate in one click. - Don’t use pulses for alerts. Pulses are inert by design. If you want an incident to open when a specific change happens, that’s a Pulse Workflow with an Incident Created action — not the pulse itself.
Troubleshooting
A pulse I sent isn't appearing in the incident triage view
A pulse I sent isn't appearing in the incident triage view
services or environments don’t match the incident’s — triage filters by intersection, so a pulse tagged only with staging won’t appear on a Production incident; (2) the pulse landed outside the triage time window (default is the last few hours before the incident). Widen the window from the triage view’s date picker if the pulse is older.API returns 401 when creating a pulse
API returns 401 when creating a pulse
Authorization: Bearer <token> header is missing or the token is invalid. Generate a token in Account → Manage API keys → Generate New API Key and confirm it has API access enabled. If you’re using a Team API key, confirm the key’s team has permission to write pulses.CLI can't find labels in the correct format
CLI can't find labels in the correct format
key=value pairs: --labels "version=2, attempt=1". Common mistakes: quoting individual pairs (--labels "version=2","attempt=1"), using colons instead of equals (--labels "version:2"), or wrapping values in inner quotes.Pulses are firing pulse workflows I didn't expect
Pulses are firing pulse workflows I didn't expect
services, environments, or specific label values. The Workflow Conditions evaluator lets you test conditions against a sample pulse payload.High-volume pulse sources are cluttering the triage view
High-volume pulse sources are cluttering the triage view
Frequently Asked Questions
How are pulses different from incidents?
How are pulses different from incidents?
Can pulses page on-call?
Can pulses page on-call?
How long are pulses retained?
How long are pulses retained?
Can we search pulses across all incidents?
Can we search pulses across all incidents?
Do pulses count against API rate limits?
Do pulses count against API rate limits?
Can we use Liquid to reference pulse data in workflows?
Can we use Liquid to reference pulse data in workflows?
{{ pulse.id }}, {{ pulse.short_id }}, {{ pulse.source }}, {{ pulse.summary }}, and {{ pulse.data }} (the raw pulse payload). Reach into the payload with {{ pulse.data | get: 'field_name' }} for anything not exposed as its own top-level variable.What's the difference between the CLI's pulse create and pulse run commands?
What's the difference between the CLI's pulse create and pulse run commands?
rootly pulse create creates a pulse from a summary and metadata you provide. rootly pulse run wraps an actual shell command — it executes the command, captures its exit status and runtime, and creates a pulse with that metadata attached automatically. Use pulse run when the pulse is the fact that a specific command ran (deploy scripts, migration jobs, backup jobs).Related Pages
Pulse Workflows
Pulse Variables
pulse.id, pulse.short_id, pulse.source, pulse.summary, and pulse.data.Rootly CLI
pulse create and pulse run.