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 SchedulerCountdown Timer API
Invoke something laterYes, 270+ AWS targetsYes, signed HTTPS webhook
Setup per deadlineSchedule + IAM role + targetOne POST
Read time remainingNoGET /timers/{id}/status
Pause and resumeNoYes, for duration timers
Move the deadlineUpdateSchedulePATCH the timer
Cleanup after firingYou configure itAutomatic
Account quota on schedulesYesMonthly timer allowance by plan
Hosted countdown pageNoYes
Email-safe animated GIFNoYes
Per-recipient deadlinesBuild it yourselfPersonalized timers
Native AWS targetsYes — Lambda, SQS, Step Functions, ECSHTTPS only
Runs inside your VPCYesNo — external service
Data residency controlFull, per regionNot 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.

None of this is a reason to avoid EventBridge for what it is good at. It is a reason to notice when you have started using a scheduling control plane as a per-customer data store.

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.