Instrument once.
We handle the rest.
Wrap your workflows with the SDK. Upkeel's platform detects every silent failure, fires the alerts, escalates to the right people, and shows you exactly what happened. Without touching your application code again.
Seconds to install. Nothing else to configure.
The SDK is pure telemetry. It records what happened and when. That's the entire job. No alerting logic, no retry handling, no dashboards to wire up in your application. Install it once and forget it. Everything else happens on our side.
npm install @upkeel/sdkimport { Upkeel } from '@upkeel/sdk'
const keel = new Upkeel({ apiKey: process.env.UPKEEL_API_KEY })
// Your existing checkout code. Unchangedconst session = await stripe.checkout.sessions.create({ line_items: order.items, metadata: { orderId: order.id },})
// One line: Stripe webhook must arrive within 30skeel.expect('payment.succeeded', { within: '30s', correlationId: session.id, meta: { orderId: order.id },})
// In your webhook handler, confirm itapp.post('/webhooks/stripe', (req, res) => { const event = stripe.webhooks.constructEvent(req.body, sig, secret) keel.fulfill('payment.succeeded', { correlationId: event.data.object.id, }) res.sendStatus(200)})We watch your expectations so you don't have to.
Every expectation you register runs through our server-side detection pipeline. The worker sweeps continuously and flips overdue expectations to missed the second the deadline lapses. Then your escalation rules decide whether a single miss is noise or a scope-wide incident.
degraded or criticalWe send the alerts. You write zero notification code.
When Upkeel detects a missing event or a degrading flow, we handle the entire notification chain. Initial alert, escalation, incident ticket. No webhooks to configure in your application, no Slack bots to build, no on-call routing logic to maintain. Configure your channels once in the dashboard and you're done.
See when things happened. Drag to zoom. Filter to drill in.
A live histogram of every event flowing through your system, stacked by type or severity. Drag across the chart to brush-select a window. The table below filters to the same range instantly. Stack the bars by event type to see what changed, or by severity to see when things got noisy. The chart and table share filter state, so a query you build is shareable as a URL.
Multi-step workflows, visualized and verified.
Flows turn scattered expect/fulfill pairs into a coherent timeline. When an expectation is missed, the alert doesn't just say "event X didn't arrive". It says "step Y of this workflow didn't complete, here's the last thing that happened, and here's who's affected." Context that makes alerts actionable, not just noisy.
import { Upkeel } from '@upkeel/sdk'
const keel = new Upkeel({ apiKey: process.env.UPKEEL_API_KEY })
async function processOrder(order) { const flow = keel.flow('order-fulfillment')
flow.step('payment-confirmed') flow.expect('warehouse.picked', { within: '4h', correlationId: order.id, description: 'Warehouse must confirm pick within 4 hours', })
// When expectation is missed, the alert includes: // - Flow name: "order-fulfillment" // - Last step: "payment-confirmed" // - Description: "Warehouse must confirm pick within 4 hours" // - All metadata you attached}Test that your flows do what you think they do.
@upkeel/testing brings Upkeel's entire detection model into your test suite. Assert on expectations, simulate known failure scenarios, and advance virtual time in a single line. No real waiting, no network calls, no flakiness.
import { createTestKit } from '@upkeel/testing'
it('detects a missing Stripe webhook', async () => { const { keel, clock, expectations } = createTestKit()
// Run your checkout code with the test SDK keel.expect('payment.succeeded', { within: '30s' })
// Simulate 31 seconds passing. Webhook never arrived clock.advance('31s')
// Assert the expectation was missed expect(expectations.missed('payment.succeeded')).toBe(true)})
it('fulfillment completes within SLA', async () => { const { keel, clock, expectations } = createTestKit()
keel.expect('warehouse.picked', { within: '4h' }) clock.advance('2h') keel.fulfill('warehouse.picked')
expect(expectations.met('warehouse.picked')).toBe(true)})Frequently asked questions
@upkeel/sdk, @upkeel/testing, and @upkeel/scenarios. The backend detection engine, alerting pipeline, and dashboard are proprietary. The SDK being open source means you can audit exactly what runs in your production application before shipping it.Ready to see what you've been missing?
Solo is $9/mo, Team is $39. And the first 14 days are free.