Skip to content

Components

Checkout Steppers That Tell the Truth — Completed Means Validated, Clickable Means Safe

Three Step States With Three Meanings, and Back-Navigation That Never Costs Data
Written by Aiden Wood Founder and Lead Design Engineer
🧾 🪜 ✔️

Every multi-step checkout has a progress stepper, and most of them are decorative — ticks that mean "you clicked next", steps you can't click back to, and a bar that claims 75% when the hard part (payment) is all of the remaining 25%. A stepper is a promise about effort; breaking it is how carts get abandoned at step three.

Velocity X's standard-progress-breadcrumb encodes the honest version as a three-state contract.

The Money Pattern

Each step is exactly one of three states, and each state has one meaning:

type StepState = 'completed' | 'current' | 'upcoming';

// completed = this step's data passed validation (not "was visited")
// current   = aria-current="step", exactly one at a time
// upcoming  = not yet reachable by click

<ol class="flex items-center gap-2">
  {steps.map((s, i) => (
    <li>
      {s.state === 'completed' ? (
        <a href={s.href} class="flex items-center gap-1.5">
          <CheckCircle /> {s.label}
        </a>
      ) : (
        <span aria-current={s.state === 'current' ? 'step' : undefined}>
          {s.label}
        </span>
      )}
    </li>
  ))}
</ol>

Two rules hide in that markup. Completed steps are links — a buyer who wants to fix their shipping address mid-payment must be able to go back without fear. Upcoming steps are not links — skipping ahead past unvalidated steps is how half-complete orders reach your API.

The Catch

Back-navigation is only safe if it's lossless: everything typed on steps ahead of the one being revisited survives the round trip. That's a state-architecture decision (the wizard's single form state, same as the multi-step form pattern) — the stepper just exposes whether you got it right.

Count honestly. "Review" isn't a step if it's a summary with a button; four steps that are really three reads as padding, and the progress psychology works against you. And never mark the final step complete before the payment actually settles — an optimistic tick on a declined card is the worst message in commerce.

The Verdict

Completed = validated, clickable = lossless, upcoming = locked, count = real. Four invariants, one trustworthy stepper. It ships in Velocity X's Standard Navigation category, built to sit on top of the wizard state you already have.

Let us make some quick suggestions?

Please provide your full name.
Please provide your phone number.
Please provide a valid phone number.
Please provide your email address.
Please provide a valid email address.
Please provide your brand name or website.
Please provide your brand name or website.