What your uptime check saw
GET https://app.acme.dev/ → 200 OK · 183 ms · SSL valid for 61 days. Status: Up. Everything green. Your status page agrees.
SYNTHETICS · BETA
DevHelm runs your own Playwright specs and multi-step API checks on a schedule, from 4 regions. When one fails, you get the trace, the video and the exact step, not a red dot.
WHY SYNTHETICS
Same app, same minute. A ping cannot click a button, so it passes straight over failures like these.
GET https://app.acme.dev/ → 200 OK · 183 ms · SSL valid for 61 days. Status: Up. Everything green. Your status page agrees.
8 steps. Step 7 click "Pay $29" → POST /api/checkout/confirm returned 502 after 8.2 s. "Payment confirmed" never appeared. Status: Failed. Nobody in eu-west or ap-south has paid you since 03:12 UTC.
PLAYWRIGHT MONITORING
Upload your Playwright project, name the entry spec, and pick a schedule. Same selectors, same assertions, same @playwright/test.
import { test, expect } from '@playwright/test';
test('pro plan checkout completes', async ({ page }) => {
await test.step('Open login', () => page.goto('https://app.acme.dev/login'));
await test.step('Sign in', async () => {
await page.getByLabel('Email').fill(process.env.CHECKOUT_EMAIL!);
await page.getByLabel('Password').fill(process.env.CHECKOUT_PASSWORD!);
await page.getByRole('button', { name: 'Sign in' }).click();
});
await test.step('Open pricing', () => page.goto('https://app.acme.dev/pricing'));
await test.step('Start Pro', () => page.getByRole('button', { name: 'Start Pro' }).click());
const card = page.frameLocator('iframe[name^="__privateStripeFrame"]').first();
await test.step('Enter card', () => card.getByPlaceholder('Card number').fill('4242 4242 4242 4242'));
await test.step('Enter expiry and CVC', async () => {
await card.getByPlaceholder('MM / YY').fill('12 / 34');
await card.getByPlaceholder('CVC').fill('123');
});
await test.step('Pay $29', () => page.getByRole('button', { name: /Pay \$29/ }).click());
await test.step('Payment confirmed', () =>
expect(page.getByRole('heading', { name: 'Payment confirmed' })).toBeVisible({ timeout: 15_000 })
);
});checkout-monitor.zip
├── tests/
│ ├── checkout.spec.ts # entry spec
│ └── helpers/
│ └── stripe.ts
└── package.json
Entry spec: tests/checkout.spec.ts
Secrets: CHECKOUT_EMAIL, CHECKOUT_PASSWORDSAMPLE RUN REPORT
An illustrative checkout failure showing the evidence a run can capture. A failed run is a recording, so the first person who opens the alert sees the failure instead of trying to reproduce it.
checkout-pro-plan · Run run_8f3a91 · Failed · 41.3 s · started 2026-10-04 03:17:42 UTC · eu-west. Run run_8f3a92 in ap-south also Failed (39.8 s).
Step 7 of 8, click "Pay $29". Expected heading "Payment confirmed" within 15 s. Timed out at 15.0 s.
Immediate retry, 1 attempt: failed again at the same step. Incident opened; alert sent to Slack #eng-alerts and PagerDuty.
The failure is after Stripe accepted the card and before your backend confirmed the order. Look at /api/checkout/confirm.
screenshot 212 KB · video 41 s · trace 6.8 MB · console 14 lines · HAR 63 requests.
Design partners also get the AI SRE agent, installed by the DevHelm team. It starts from a failed run like this one and reports whether it is your code or a vendor, with the evidence attached.
MULTI-STEP API CHECKS
A single GET proves a route exists. A sequence tests the contract: authenticate, create, read back, clean up. Name the request steps and assert their responses in your test; inspect the test outcome and recorded run evidence when it fails.
Authenticate
POST /oauth/token
Create invoice
POST /v1/invoices
Read invoice
GET /v1/invoices/:id
Clean up
DELETE /v1/invoices/:id
5 min interval, us-east. 1 POST /oauth/token 200 212 ms · 2 POST /v1/invoices 201 388 ms · assert body.status == "draft" · 3 GET /v1/invoices/inv_2KxQ9 200 141 ms · assert body.total == 4900 · 4 DELETE /v1/invoices/inv_2KxQ9 204 96 ms. Total 837 ms.
404. assert body.total == 4900 not evaluated.
WHERE IT RUNS
Checks run from us-east, us-west, eu-west and ap-south, and all four are on every plan. Choose regions per monitor.
PRICING, IN RUNS
Add your monitors below and see which plan covers them. Browser and API runs have separate monthly pools.
30-day month. One execution in one region is one run. Retries count too.
When included runs are used, new runs stop. No overage bill.
KEY FACTS
What it is, what runs it, and where the edges are. Facts checked 2026-10-06.
FIT CHECK
Built for small SaaS teams with a handful of journeys that must not break.
FAQ
Specs, runs, regions and access. The docs have the rest.
Uptime monitoring checks that an endpoint responds. Synthetic monitoring runs a scripted user journey or API sequence and checks that it completes with the right result. DevHelm has both: uptime checks (HTTP, DNS, TCP, ping, heartbeat, MCP server) and Synthetics for Playwright and multi-step API checks.
No. Upload the spec you already run, with the files it imports, and name the entry spec. Secrets reach it as process.env.NAME. Specs that depend on local-only state (a seeded database, a mocked server) need a production-safe version.
One execution in one region is one run, so two regions means two runs per schedule. Browser and API runs have separate monthly pools, and the usage meter shows where you are. When the included runs are used, new runs stop. No overage bill.
Free every 60 minutes, Starter every 10, Pro every 5, Team every minute, Business every 30 seconds, Enterprise every 10 seconds. Shorter intervals use more runs; the calculator above shows how many.
Turn on immediate retry: 0 to 10 attempts, off by default. When a spec fails on your app, DevHelm reruns it right away in the same region before deciding. A pass on retry is recorded as passed on retry; a repeat failure opens an incident. Retries count as runs.
From us-east, us-west, eu-west and ap-south. Each region's traffic leaves from one fixed IP. We share the list on request.
Staging works if it is reachable from the public internet on HTTP or HTTPS, for example behind basic auth or a token header. Anything reachable only inside your network can't be monitored today.
It's in beta. Runs, evidence and alerts work today; run limits and regions can still change, and we announce changes in the changelog first.
An investigation agent that starts from a failed run or check and reports whether it is your code or a vendor, with the evidence. It is available to design partners, installed and tuned by the DevHelm team. It is not self-serve and it does not change anything on its own.
Access is by invitation. Book a 30-minute demo and we'll set up your workspace.