ETA Range

Quotes delivery as a realistic date range, naming a likely day only when one stands out, so customers aren't promised an impossible day.

StopsDelivery promised on an impossible day

Installation

pnpm dlx shadcn@latest add https://bollard-ui.vercel.app/r/eta-range.json

The files land in your project. They're yours to edit.

Usage

eta-range-usage.tsx
import { EtaRange } from "@/components/ui/eta-range"

<EtaRange
  now={TIMES[time]}
  timeZone="Asia/Kolkata"
  cutoff="16:00"
  transit={[0.05, 0.25, 0.5, 0.15, 0.05]}
  previous={{ earliest: "2026-10-15", latest: "2026-10-16" }}
  reason="Carrier backlog after the long weekend"
/>

What it catches

  • False precision, by quoting a range instead of one date
  • Holidays and no-delivery days inside the range
  • The order cutoff, with the range you get after it
  • A range that widened since last shown, with the reason

Props

EtaRange props
PropTypeDefault
now

Order time. Leave out to use the live clock (ticks every 30 s after mount).

Date | number—
previous

The range you quoted before, as "YYYY-MM-DD" days, to explain a change.

{ earliest: string; latest: string }—
reason

Why the estimate changed, e.g. "Carrier backlog after the long weekend".

string—
countdownWithin

Show the cutoff countdown when the cutoff is this close, in minutes.

number360
locale

Date and time formatting locale.

string"en-IN"
titleText

Templates: `{range}`, `{day}`, `{share}`, `{wait}`, `{cutoff}`, `{ship}`, `{after}`, `{days}`, `{previous}`.

string"Arrives {range}"
likelyText

Text naming the most likely day.

string"most likely {day} ({share} of orders)"
flatText

Text used when no day stands out.

string"any day in this range is about as likely"
countdownText

Countdown to the cutoff.

string"Order within {wait} to ship {ship} ({cutoff} cutoff). Af…
missedText

Shown after the cutoff has passed.

string"Today's {cutoff} cutoff has passed, so it ships {ship}."
shipsText

Text saying when the order ships.

string"Ships {ship}."
closedText

Text naming no-delivery days in the range.

string"No deliveries on {days}; it isn't counted."
widenedText

Explains why the range widened.

string"Widened from {previous}."
todayLabel

Word used for today.

string"today"

* required. Also accepts the native props of <div> (className, aria-*, data-*…), passed through to it.

Accessibility

  • The distribution chart is aria-hidden, with a text version of each day's share
  • Countdown and changes are aria-live="polite"
  • aria-busy while the clock hasn't loaded

Only what the source does. Test with your own screen reader and content before shipping.

Limitations

  • Accuracy depends on the delivery distribution and calendar you pass
  • The 90% range is a statistical estimate, not a carrier guarantee

What it stops

Delivery promised on an impossible day

Also known as

delivery estimate · eta · shipping · order tracking · cutoff · business days · checkout · pincode

Field type

Dependencies

Pairs well with