Webhook Scheduler
Log inStart free

Pipedream delay alternative

Replace Pipedream’s delay step before Workflows shuts down.

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.

API request
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" }
  }'
01

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.

02

Retries on the delayed call

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.

03

Every attempt on record

Status code, response body and latency for each attempt, so you can answer “did the follow-up run?” without digging.

What Pipedream announced

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.

What the delay step did

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.

Migration mapping

What you needPipedream delayWebhook Scheduler
Pause for a duration$.flow.delay(ms) in a Node.js step, or the built-in Delay actionPOST /api/v1/schedule with runAt set to now plus the duration
Steps after the delayRun in the same execution when the delay endsMove them behind an HTTPS endpoint (your API, a serverless function, a Make or n8n webhook) set as url
Data kept across the delayStep exports from earlier stepsWhatever you put in body (JSON, up to 100 KB) is sent to url
Cancel before it runsRequest the cancel_url returned by the delayPOST /api/v1/jobs/{id}/cancel with your API key, or find open jobs by reference first
Resume earlyRequest the resume_urlNo direct equivalent: cancel the job, then send the request now with POST /api/v1/execute-now
Longest delayUp to one yearUp to 7 days on Free, 365 days on paid plans
Failure handlingHandled by the workflow that resumesDelivery retried with exponential backoff (4 retries on Free, 10 on Pro), then an email if it still fails
HistoryWorkflow execution historyEach 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.

Before and after

Before
// 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
  },
});
After
// 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.

Where Webhook Scheduler is not a fit

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.

FAQ

When does Pipedream Workflows shut down?

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.

What replaces $.flow.delay and its cancel_url?

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.

Can I delay for a full year like Pipedream?

On paid plans, up to 365 days ahead. The Free plan schedules up to 7 days ahead.

Is there an equivalent of resume_url?

Not as one call. Cancel the pending job, then send the same request immediately with POST /api/v1/execute-now.

What happens if my endpoint is down at the scheduled time?

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.

Ship delayed webhooks without maintaining scheduling infrastructure.

Start with the free plan, test a real delivery, then upgrade when the workflow becomes production critical.

Try a live webhook