Everything you need, built in.
The essentials for teams that want to move fast without giving up control.
Verify like Stripe verifies.
Every request carries an `Atlas-Signature` header with a timestamp and HMAC-SHA256. Verify the signature before trusting the payload — we ship helpers in every SDK.
- HMAC-SHA256 over `timestamp.payload` with your endpoint secret
- 5-minute timestamp tolerance defeats replay attacks
- Signature helpers built into every SDK (`atlas.webhooks.verify`)
- Rotate endpoint secrets without downtime — old secrets valid for 24h
At-least-once, with escape hatches.
We retry failed deliveries 9 times over 48 hours on exponential backoff. Disable a noisy endpoint, replay missed events, or bulk-redeliver after a deploy.
- Retries on any non-2xx, timeout after 10 seconds per attempt
- Dashboard shows delivery log, payload, response, and duration
- `Atlas-Attempt` header tells you which retry you're seeing
- Dead-letter events auto-paused after 9 failures — no silent drops
Teams ship revenue with this.
Real-world use cases across every revenue function.
Frequently asked questions
Which events are available?
50+ events including `deal.{created,updated,stage_changed,closed_won,closed_lost,deleted}`, `contact.{created,updated,merged,deleted}`, `activity.{email,call,meeting}`, `task.*`, `ticket.*`, `subscription.*`, and more. Full list in the dashboard.
How do I handle out-of-order events?
Use `event.created` (Unix timestamp) to order events yourself. We also emit a monotonically increasing `sequence` per endpoint. For strict ordering, set your endpoint to `serialize=true` and we'll deliver one attempt at a time.
Can I receive webhooks in a local dev environment?
Yes — `atlas webhooks listen --forward-to localhost:3000` spins up a signed tunnel. Same flow Stripe developers know. No ngrok config.
What happens if my endpoint is down?
We retry 9 times on exponential backoff (10s → 30s → 1m → 5m → 30m → 2h → 12h → 24h → 48h). Final failure moves the event to the dead-letter queue, replayable for 30 days.
Can I filter which events a URL receives?
Yes — subscribe to specific event types, object properties (`deal.value > 10000`), or object tags. Multiple endpoints per workspace, filtered independently.