Steps
context.sleep
context.sleep() pauses workflow execution for a specified duration.
When a workflow is paused, the current request completes and a new one is automatically scheduled to resume after the delay. This ensures no compute resources are consumed during the sleep period.
Always
await a sleep step to properly pause execution.Arguments
stepNamebodystring
A unique identifier for the step.
durationbodynumber|string
The duration to pause workflow execution.
- Human-readable string format:
| Input | Duration |
|---|---|
"10s" | 10 seconds |
"1m" | 1 minute |
"30m" | 30 minutes |
"2h" | 2 hours |
"1d" | 1 day |
"1w" | 1 week |
"1mo" | 1 month |
"1y" | 1 year |
- Numeric format (seconds):
| Input | Duration |
|---|---|
60 | 60 seconds (1 minute) |
3600 | 3600 seconds (1 hour) |
86400 | 86400 seconds (1 day) |
Usage
TypeScript
import { serve } from "@upstash/workflow/nextjs";import { signIn, sendEmail } from "@/utils/onboarding-utils";export const { POST } = serve<User>(async (context) => { const userData = context.requestPayload; const user = await context.run("sign-in", async () => { const signedInUser = await signIn(userData); return signedInUser; }); // π Wait for one day (in seconds) await context.sleep("wait-until-welcome-email", "1d"); await context.run("send-welcome-email", async () => { return sendEmail(user.name, user.email); });});Python
from fastapi import FastAPIfrom upstash_workflow.fastapi import Servefrom upstash_workflow import AsyncWorkflowContextfrom onboarding_utils import sign_in, send_emailapp = FastAPI()serve = Serve(app)@serve.post("/api/onboarding")async def onboarding(context: AsyncWorkflowContext[User]) -> None: user_data = context.request_payload async def _sign_in(): return await sign_in(user_data) user = await context.run("sign-in", _sign_in) # π Wait for one day (in seconds) await context.sleep("wait-until-welcome-email", "1d") async def _send_email(): return await send_email(user.name, user.email) await context.run("send-welcome-email", _send_email)