Skip to content
Skip to content
Skip to content

Case study

A checkout that is ready before the customer has finished reaching for their card.

LCP on a mid-range phonefrom 2.9 sto 0.8 s

Client
Northwind
Year
2025
Role
Lead frontend developer
Kind
Product
A laptop with a dark dashboard and a phone on a desk at dusk

The problem

Northwind sells outdoor gear in nine countries, and four in ten carts were abandoned on the payment step. The page waited for three services before it drew anything.

The approach

  • The payment form now renders from the server with the cart already in it; the card fields hydrate on their own.
  • The whole flow is one state machine, so a slow network can no longer leave the button in two states at once.
  • Fonts, the logo and the first product image are the only things in the critical path. Everything else waits.
A laptop with a dark dashboard, a phone and a hand reaching in, in an office at dusk
A laptop with a dark dashboard, a phone and a hand reaching in, in an office at dusk
Phone wireframe sketches on paper and a hand with a pen
Phone wireframe sketches on paper and a hand with a pen

The result

Largest Contentful Paint on a mid-range Android went from 2.9 s to 0.8 s. Completed checkouts rose 11% in the first full month, and support tickets that mention the word stuck fell by two thirds.

We had been tuning the backend for a year. Soren found the two seconds in the browser in his first week.

Built with

ReactTypeScriptXStateVite

Case study

A checkout that is ready before the customer has finished reaching for their card.

LCP on a mid-range phonefrom 2.9 sto 0.8 s

Client
Northwind
Year
2025
Role
Lead frontend developer
Kind
Product
A laptop with a dark dashboard and a phone on a desk at dusk

The problem

Northwind sells outdoor gear in nine countries, and four in ten carts were abandoned on the payment step. The page waited for three services before it drew anything.

The approach

  • The payment form now renders from the server with the cart already in it; the card fields hydrate on their own.
  • The whole flow is one state machine, so a slow network can no longer leave the button in two states at once.
  • Fonts, the logo and the first product image are the only things in the critical path. Everything else waits.
A laptop with a dark dashboard, a phone and a hand reaching in, in an office at dusk
A laptop with a dark dashboard, a phone and a hand reaching in, in an office at dusk
Phone wireframe sketches on paper and a hand with a pen
Phone wireframe sketches on paper and a hand with a pen

The result

Largest Contentful Paint on a mid-range Android went from 2.9 s to 0.8 s. Completed checkouts rose 11% in the first full month, and support tickets that mention the word stuck fell by two thirds.

We had been tuning the backend for a year. Soren found the two seconds in the browser in his first week.

Built with

ReactTypeScriptXStateVite

Case study

A checkout that is ready before the customer has finished reaching for their card.

LCP on a mid-range phonefrom 2.9 sto 0.8 s

Client
Northwind
Year
2025
Role
Lead frontend developer
Kind
Product
A laptop with a dark dashboard and a phone on a desk at dusk

The problem

Northwind sells outdoor gear in nine countries, and four in ten carts were abandoned on the payment step. The page waited for three services before it drew anything.

The approach

  • The payment form now renders from the server with the cart already in it; the card fields hydrate on their own.
  • The whole flow is one state machine, so a slow network can no longer leave the button in two states at once.
  • Fonts, the logo and the first product image are the only things in the critical path. Everything else waits.
A laptop with a dark dashboard, a phone and a hand reaching in, in an office at dusk
A laptop with a dark dashboard, a phone and a hand reaching in, in an office at dusk
Phone wireframe sketches on paper and a hand with a pen
Phone wireframe sketches on paper and a hand with a pen

The result

Largest Contentful Paint on a mid-range Android went from 2.9 s to 0.8 s. Completed checkouts rose 11% in the first full month, and support tickets that mention the word stuck fell by two thirds.

We had been tuning the backend for a year. Soren found the two seconds in the browser in his first week.

Built with

ReactTypeScriptXStateVite

Start a project

Three quick picks so the first reply is useful. You finish the message on the contact page.

What do you need?

Rough budget

brief.tsdraft, not sent

Brief so far: nothing picked yet

or write to hello@sorenhale.dev

Nothing is sent from this page. Your picks are kept in this browser tab and wait for you on the contact form.

Start a project

Three quick picks so the first reply is useful. You finish the message on the contact page.

What do you need?

Rough budget

brief.tsdraft, not sent

Brief so far: nothing picked yet

or write to hello@sorenhale.dev

Nothing is sent from this page. Your picks are kept in this browser tab and wait for you on the contact form.

Start a project

Three quick picks so the first reply is useful. You finish the message on the contact page.

What do you need?

Rough budget

brief.tsdraft, not sent

Brief so far: nothing picked yet

or write to hello@sorenhale.dev

Nothing is sent from this page. Your picks are kept in this browser tab and wait for you on the contact form.

Footer

Local time, Oslo

Footer

Local time, Oslo

Footer

Local time, Oslo

Create a free website with Framer, the website builder loved by startups, designers and agencies.