Countdown Timer API vs Amazon EventBridge Scheduler
EventBridge Scheduler is a genuinely good piece of infrastructure: durable, cheap per invocation, and wired into every AWS target you already use. If your deadline's only job is to invoke a Lambda, it is hard to argue against. The comparison gets interesting when the deadline is something a customer can see — because a schedule has no readable state between creation and firing, and nothing to render.
What each one takes to set up
EventBridge Scheduler
// One schedule per deadline, created through the AWS SDK.
await scheduler.createSchedule({
Name: `hold-${hold.id}`,
ScheduleExpression: `at(${expiresAt.toISOString().slice(0, 19)})`,
FlexibleTimeWindow: { Mode: "OFF" },
Target: {
Arn: process.env.RELEASE_HOLD_LAMBDA_ARN,
RoleArn: process.env.SCHEDULER_ROLE_ARN,
Input: JSON.stringify({ holdId: hold.id }),
},
ActionAfterCompletion: "DELETE",
});
// Requires: an IAM role the scheduler can assume, a target Lambda,
// a policy allowing invocation, and cleanup so one-time schedules
// do not accumulate against the account quota.Countdown Timer API
// One request. No IAM, no target ARN, no cleanup.
await call("/timers", {
method: "POST",
headers: { "Idempotency-Key": `hold_${hold.id}` },
body: JSON.stringify({
name: `Cart hold ${hold.id}`,
type: "duration",
duration_seconds: 900,
metadata: { hold_id: hold.id },
publish: true,
}),
});
// Attach the rule once per timer, pointing at one destination
// you registered a single time for the whole account.The AWS version is not complicated, but it has more moving parts than the call suggests: a role the scheduler can assume, a target with an invocation policy, and a decision about what happens to the schedule after it fires. Get the last one wrong and one-time schedules accumulate against your account quota until creation starts failing.
ActionAfterCompletion: "DELETE" is the line people omit. Without it every expired hold leaves a dead schedule behind, and the limit arrives as a throttled create call rather than as anything resembling a scheduling problem.Side by side
| EventBridge Scheduler | Countdown Timer API | |
|---|---|---|
| Invoke something later | Yes, 270+ AWS targets | Yes, signed HTTPS webhook |
| Setup per deadline | Schedule + IAM role + target | One POST |
| Read time remaining | No | GET /timers/{id}/status |
| Pause and resume | No | Yes, for duration timers |
| Move the deadline | UpdateSchedule | PATCH the timer |
| Cleanup after firing | You configure it | Automatic |
| Account quota on schedules | Yes | Monthly timer allowance by plan |
| Hosted countdown page | No | Yes |
| Email-safe animated GIF | No | Yes |
| Per-recipient deadlines | Build it yourself | Personalized timers |
| Native AWS targets | Yes — Lambda, SQS, Step Functions, ECS | HTTPS only |
| Runs inside your VPC | Yes | No — external service |
| Data residency control | Full, per region | Not configurable |
The last three rows are decisive for some teams and irrelevant to others. If your architecture requires that scheduling stay inside your own AWS account and VPC, this comparison ends there and EventBridge wins.
Per-record deadlines are where it strains
EventBridge Scheduler is designed around schedules as infrastructure — a manageable number of them, defined largely up front. Creating one per cart, per trial, or per invitation turns a control-plane resource into application data.
Three consequences
Quotas start to matter, because schedules are a limited per-account resource rather than rows in a table. Cleanup becomes your responsibility, and a missed DELETE is a slow leak. And listing or inspecting them is a control-plane operation, so “show me every pending deadline” is an API call against AWS rather than a query you can join to your own data.
When EventBridge Scheduler is the better choice
When EventBridge Scheduler is the better choice
- The target is an AWS service — Lambda, Step Functions, SQS, ECS — and you would rather not add an HTTPS hop.
- Compliance, data residency, or network policy requires scheduling to stay inside your account and region.
- The schedules are infrastructure: ETL windows, scaling events, maintenance tasks. There is no per-record deadline.
- Nothing about the delay is customer-visible, so rendering is worth nothing to you.
- You need retries, DLQs, and observability that plug into the CloudWatch and X-Ray setup you already run.
- Your volume is high and short-lived enough that per-timer semantics would be pure overhead.
Running both
The clean division is by audience. EventBridge handles schedules your operations team cares about; the countdown API handles deadlines your customers care about. A webhook handler that acknowledges immediately and drops the payload onto SQS bridges the two, keeping the downstream work inside AWS while the visible deadline stays renderable.
If you go that route, verify the signature before enqueuing — verify a delivery covers the raw-body requirement, which is easy to break behind API Gateway if the body is transformed on the way in.
Common questions
Does EventBridge Scheduler have a quota on one-time schedules?
Yes. Schedules count against a per-account, per-region limit, and one-time schedules linger after firing unless you set ActionAfterCompletion to DELETE or clean them up yourself. Teams that create a schedule per record usually hit this before they expect to, and the failure surfaces as a create call being throttled rather than as a missed deadline.
Is EventBridge Scheduler cheaper?
Per invocation it is very cheap, and if you are already on AWS the marginal infrastructure cost is close to nothing. The cost sits elsewhere: IAM roles, target wiring, schedule cleanup, and building any customer-visible countdown separately. Compare total work rather than per-call pricing.
Can EventBridge Scheduler show a countdown to a customer?
No. It has no readable state between creation and firing and no rendering of any kind. A schedule is not queryable for "time remaining" in a form you would show a user, so the display becomes a separate system built on your own stored deadline.
Can I use both?
Yes. A common split is EventBridge for infrastructure schedules — nightly ETL, cache warming, scaling events — and a countdown API for per-record customer deadlines that need a face. They are not competing for the same job.
Related
Keep AWS for infrastructure, not for deadlines with a face
Sandbox is free with any account. Create one timer and see what a schedule cannot give you: readable remaining time, a hosted page, and an email GIF.