Delay plus cancel, kept
Schedule the call with one POST and cancel it with another. The same pattern as a delay with a cancel_url, outside any workflow engine.
Pipedream delay alternative
Pipedream’s delay pauses a workflow for up to a year and gives you a cancel_url. With Workflows closing on March 31, 2027, those delays need a new home. Webhook Scheduler does the part that is hard to rebuild: hold an HTTP call until a set time, let you cancel it, retry it if it fails, and log every attempt.
curl https://webhookscheduler.com/api/v1/schedule \
-H "Authorization: Bearer wh_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.example.com/hooks/payment-follow-up",
"runAt": "2026-11-03T09:00:00.000Z",
"reference": "order:ord_1042",
"body": { "orderId": "ord_1042" }
}'Schedule the call with one POST and cancel it with another. The same pattern as a delay with a cancel_url, outside any workflow engine.
If the endpoint is down when the time comes, the call is retried with exponential backoff and you get an email if it fails for good.
Status code, response body and latency for each attempt, so you can answer “did the follow-up run?” without digging.
Pipedream’s documentation states that Workflows and String shut down on March 31, 2027. Workflows is in maintenance mode and no longer accepts signups or new subscriptions. All Workflows data, connected-account credentials included, is to be deleted by April 30, 2027. Pipedream Connect is not affected. The docs offer a JSON export of workflow structure, one project at a time, but no replacement product.
We checked this on pipedream.com/docs/workflows on October 24, 2026. Read the notice there for anything that changes after that date.
Pipedream offers two ways to pause: $.flow.delay in a Node.js code step and the built-in Delay action. Both pause the execution for anywhere from a millisecond to a year, and both return a cancel_url that stops that execution and a resume_url that continues it early.
That covers a common need: “do this in three days unless something happens first.” A trial reminder that should not go out after an upgrade, a dunning email that should not go out after payment, a follow-up that should not go out after a reply.
| What you need | Pipedream delay | Webhook Scheduler |
|---|---|---|
| Pause for a duration | $.flow.delay(ms) in a Node.js step, or the built-in Delay action | POST /api/v1/schedule with runAt set to now plus the duration |
| Steps after the delay | Run in the same execution when the delay ends | Move them behind an HTTPS endpoint (your API, a serverless function, a Make or n8n webhook) set as url |
| Data kept across the delay | Step exports from earlier steps | Whatever you put in body (JSON, up to 100 KB) is sent to url |
| Cancel before it runs | Request the cancel_url returned by the delay | POST /api/v1/jobs/{id}/cancel with your API key, or find open jobs by reference first |
| Resume early | Request the resume_url | No direct equivalent: cancel the job, then send the request now with POST /api/v1/execute-now |
| Longest delay | Up to one year | Up to 7 days on Free, 365 days on paid plans |
| Failure handling | Handled by the workflow that resumes | Delivery retried with exponential backoff (4 retries on Free, 10 on Pro), then an email if it still fails |
| History | Workflow execution history | Each delivery attempt with status code, response body and latency |
The real change is structural. A Pipedream delay resumes the same execution with its earlier step results. A scheduled webhook calls a URL later, so the steps after the delay move behind an endpoint, and anything they need travels in body. Have that endpoint re-read the current state (has the order been paid?) before it acts.
// Pipedream Node.js step
export default defineComponent({
async run({ steps, $ }) {
const { cancel_url } = $.flow.delay(3 * 24 * 60 * 60 * 1000);
// save cancel_url to cancel if the customer pays first
// ...steps that run three days later
},
});// Wherever the workflow starts (your API, a job, a no-code HTTP step)
const res = await fetch('https://webhookscheduler.com/api/v1/schedule', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WEBHOOK_SCHEDULER_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://api.example.com/hooks/payment-follow-up',
runAt: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString(),
reference: `order:${order.id}`,
body: { orderId: order.id, email: order.email },
}),
});
const { id } = await res.json(); // keep it, or rely on the reference
// Later, if the customer pays first
await fetch(`https://webhookscheduler.com/api/v1/jobs/${id}/cancel`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.WEBHOOK_SCHEDULER_KEY}` },
});If you would rather not store the id, set a reference such as order:ord_1042. When the customer pays, list the open jobs with GET /api/v1/jobs?reference=order:ord_1042&state=open and cancel each one.
It is not a workflow engine. It does not run your code, host triggers, or connect to apps. If the rest of your Pipedream workflow needs a new home, move it to your own backend or a tool such as Make or n8n, and use Webhook Scheduler only for the delay. The target must be a public HTTPS URL. Free plans schedule up to 7 days ahead. Delays longer than that, up to 365 days, need a paid plan, and there are no recurring schedules.
Comparing other options for the delay itself? See delayed webhook services compared, with max delay, cancel, retries and free tiers side by side.
Pipedream’s docs give March 31, 2027 for Workflows and String, with all Workflows data deleted by April 30, 2027. Pipedream Connect is not affected. We checked the notice on October 24, 2026.
Schedule the work as an HTTP call with POST /api/v1/schedule, then cancel it with POST /api/v1/jobs/{id}/cancel. The steps that ran after the delay go behind the URL you schedule.
On paid plans, up to 365 days ahead. The Free plan schedules up to 7 days ahead.
Not as one call. Cancel the pending job, then send the same request immediately with POST /api/v1/execute-now.
The call is retried with exponential backoff: 4 retries over ~8 min on Free, 10 retries over ~8.5 h on Pro. Every attempt is logged, and you get an email if it still fails after the last retry.
Start with the free plan, test a real delivery, then upgrade when the workflow becomes production critical.
Try a live webhook