Skip to content
SnapFrom

The Response That Arrives Before the Response

· · 9 min read

A sprinter's feet set in the starting blocks on a running track, before the start

Before a server sends you a page, it is allowed to send you a note about the page. The status code is 103, the note is a list of Link headers, and the browser uses the gap before the real response to open connections and start downloading the stylesheet, font or script it has just been told it will need.

On 23 September 2026 we sent a navigation request to each of the 500 top domains on the Tranco list and recorded every response that came back. 221 of them answered with an HTML page. Eight of those sent a 103 first. And on half of those eight, the page itself arrived less than 40 milliseconds behind the hint.

That second number is the part nobody writes down. What a 103 buys depends on one thing: how long the server takes to build the page. A fast server gets almost nothing from it.

What a 103 looks like

An ordinary request, for www.cloudflare.com, with the headers a browser sends on navigation. Two responses come back on the same stream:

HTTP/2 103
link: </fonts/Kunst%20Grotesk%20Regular.woff2>; as=font; crossorigin; rel=preload; type=font/woff2,
      </fonts/Kunst%20Grotesk%20Medium.woff2>; as=font; crossorigin; rel=preload; type=font/woff2,
      <https://ot.www.cloudflare.com>; crossorigin; rel=preconnect,
      <https://imagedelivery.net>; crossorigin; rel=preconnect,
      </static/hero-poster.avif>; as=image; fetchpriority=high; rel=preload; type=image/avif

HTTP/2 200
content-type: text/html; charset=utf-8
...

The 103 is not the page, and the specification is explicit that its headers are not a description of anything: “a client MUST NOT interpret the 103 (Early Hints) response header fields as if they applied to the informational response itself”[1]. It is a forecast. Five items here: two fonts and a hero image to fetch, two other origins to open connections to.

Chrome’s guide describes the situation the forecast is for. While the server queries databases or waits on an origin behind a CDN, “the connection effectively goes idle for as long as it takes the server to prepare the response”[2]. The 103 gives the browser something to do in that idle stretch.

The head start is the server’s think time

The same guide adds a caveat: “Early Hints are not useful if your server can send a 200 (or other final responses) right away”[2].

So we measured how long “right away” is. For each site that sent a 103 we repeated the request ten times, half a second apart, and timed two moments on the client: when the first byte of the 103 arrived, and when the headers of the final response arrived. The difference is the window the browser actually gets to act on the hint.

site103 receivedfinal responsemedian head startrange
hubspot.com72 ms1,228 ms1,135 ms829 to 1,322
cloudflare.com/products/workers68 ms217 ms154 ms79 to 255
cloudflare.com55 ms209 ms147 ms82 to 353
allbirds.com68 ms187 ms121 ms38 to 342
twitch.tv63 ms99 ms36 ms35 to 197
wiley.com/en-ie59 ms90 ms28 ms0 to 88
equativ.com52 ms69 ms17 ms0 to 27
doubleverify.com59 ms81 ms16 ms0 to 54
addtoany.com65 ms65 ms0 ms0 to 8

Medians of ten runs, from a single vantage point, 24 September 2026, using the HTTP/2 client in Node.js 24.18 with the request headers Chrome sends on a navigation. The first two columns include network latency; the head start mostly does not, because the 103 and the final response travel the same path. Allbirds is not in the Tranco top 500 and was added as an example of a Shopify storefront.

Only HubSpot gets the full effect. Its page takes over a second to build, and for that whole second the browser already knows about seven files it can download. At the other end, addtoany.com’s hint and its page arrived together. Nine of ten runs got a 103 and one got nothing, which is Cloudflare’s documented behaviour: hints come from an asynchronous lookup, they are “emitted less frequently on requests where the content is cacheable”, and “Cloudflare will not send a 103 response if the main response header is already available”[4]. addtoany’s responses were cache hits.

That is the pattern across the table. The pages most likely to have a 103 turned on are the cached, fast pages a CDN can serve with no work, and those are the pages that gain least from it. Seven of the eight hinting sites in the survey were served through Cloudflare, which generates 103s automatically from Link headers it has seen on earlier responses[4]. Hints generated from past responses go out whether or not this particular response is slow enough to use them.

The conditions, added up

Everything above assumes the browser acts on the hint. Whether it does depends on a list of conditions that are each documented somewhere and never collected in one place.

Top-level navigations only. In Chrome, Early Hints are “only available for navigation requests (that is, the main resource for the top level document)”[2]. An iframe, a fetch(), a subresource: all ignore it.

Two kinds of hint, and Safari takes one. preconnect and preload; Chrome says outright that “prefetch isn’t supported”[2]. Chrome’s own support table lists preconnect-from-103 in Safari 17, and no Safari version at all for preload[2]. So on iPhones, the hubspot.com hint (seven preloads and nothing else) does nothing. The Twitch hint, which is only preconnects, works everywhere.

HTTP/2 or later. “Early Hints are recommended to only be sent over HTTP/2 or HTTP/3 connections and most browsers will only accept them over those protocols”[2]. The reason is in the RFC: an HTTP/1.1 client that mistakes a 103 for the final response can misattribute every later response on that connection[1]. Cloudflare will not send them over HTTP/1.1 at all[4].

Only the first 103 counts. The RFC allows a server to send several as it learns more[1]; “browsers only process the first”[3]. In our 90 repeat requests no site ever sent a second 103, so for now this limit does not bite anyone.

A cross-origin redirect erases it. The first 103 “must be discarded if the request results in a cross-origin redirect”[3], and Chrome drops “the resources and connections it obtained”[2]. Four of the eight hinting sites in our survey sat behind at least one redirect. Their hints arrived on the final hop, which is the only place they survive.

The resource has to be cacheable. A hinted preload is stored in the HTTP cache and picked up from there when the HTML asks for it, so “only cacheable resources can be preloaded using Early Hints or the resource will be double fetched”[2].

No viewport yet. When the 103 arrives there is no document, so there is no screen size. Responsive preloads using imagesrcset, imagesizes or media “may not be supported”, and “at best they will wait until the document is received”[2].

When the hint loses a condition

The last condition turned up in the survey data.

doubleverify.com’s HTML preloads two stylesheets, one for all screens and one for wide ones:

<link rel="preload" href=".../template_fwds_styles--mobile.min.css" as="style">
<link rel="preload" href=".../template_fwds_styles--desktop.min.css" as="style"
      media="(min-width: 769px)">

Its 103 carries the same two preloads, and the media condition is gone:

HTTP/2 103
link: <.../template_fwds_styles--mobile.min.css>; as=style; rel=preload,
      <.../template_fwds_styles--desktop.min.css>; as=style; rel=preload,
      ...

In the HTML, a phone knows the desktop stylesheet does not apply to it. In the 103, the same phone is told to preload it, in the same window it uses for the stylesheet it actually needs. This is what “naively copying the preconnect and preload directives from HTML to Early Hints” looks like in practice, a pattern Chrome’s guide warns “may not be optimal”[2].

We did check the most obvious failure: hinting a file the page no longer uses. For every preload and preconnect in all nine 103s, we fetched the final HTML and looked for the hinted path or host in it. All of them were there. None of these sites is sending stale forecasts. A hint can be correct and still cost a phone something, though.

What the largest deployment found

Shopify turned Early Hints on for its storefronts in 2022. By default each store sends two preconnects to cdn.shopify.com, and merchants can add “up to 10 different resources per page”[5]. In June 2025 Shopify published what its real-user data showed. It is the most useful source on this subject because it is not a lab test.

On desktop the benefit was “modest”, and pages with “no preload hints or 1-3 preload hints consistently show the fastest TTFB values”[5]. On mobile it reversed: “pages without Early Hints actually show better TTFB from the 40th percentile onwards”, and for First Contentful Paint “pages without Early Hints consistently outperform those using Early Hints across all percentiles”[5]. LCP on mobile “degrades when preloading 4 or more resources”[5].

The authors list two limits on this themselves. The data is Chromium only, so it “excludes all iOS devices”. And pages with no hints tended to be pages where the CDN had no cached hints, which “often correlates with other caching layers” also missing[5]. That tangles “no hints” with “slow page”, in both directions.

The third finding matters for anyone who turned Early Hints on and left it alone. Shopify’s default preconnects were effective in 2022, when most store assets lived on cdn.shopify.com. Since then “most resources are now served directly from merchants’ domains, reducing the benefits of these preconnect hints”[5]. The allbirds.com hint in our table shows both halves: the two default preconnects to cdn.shopify.com, then a preload of the theme stylesheet from www.allbirds.com, the merchant’s own domain.

Checking your own site

A browser can tell you whether a 103 reached it and how much head start it had. As of June 2026 this works in every major engine: firstInterimResponseStart is Baseline[6]. Paste this into the console on any page:

const nav = performance.getEntriesByType("navigation")[0];
nav.firstInterimResponseStart === 0
  ? "no 103 on this navigation"
  : `head start: ${Math.round(nav.finalResponseHeadersStart - nav.firstInterimResponseStart)} ms`;

A value of 0 “typically indicates Early Hints were not used”[6]. Collect the same two numbers from real visitors and you have the distribution the table above samples from one location: how long, on your pages and your cache hit rate, the browser actually has to act on what you told it.

Where that leaves you

A 103 is a way to spend server think time. When the server takes a second to build the page, as hubspot.com’s does, the browser can start its downloads a second early. When the CDN answers from cache in under 20 milliseconds, there is almost nothing to spend, and on mobile Shopify’s data says the hint can cost more than it returns.

So the useful questions about Early Hints are how long your uncached pages take to produce, and whether what the 103 names is small, cacheable and needed on every screen size. For most of the sites that send one today, the answer to the first question is “not long”.

Sources

  1. RFC 8297: An HTTP Status Code for Indicating Hints - RFC Editor, IETF, accessed

    Supports: Defines the 103 status code and its standing: 'Category: Experimental', dated December 2017. The hints do not describe the 103 itself: 'A client MUST NOT interpret the 103 (Early Hints) response header fields as if they applied to the informational response itself'. On repetition: 'A server MAY emit multiple 103 (Early Hints) responses with additional header fields as new information becomes available while the request is being processed.' On old clients: 'an HTTP/1.1 client that mishandles an informational response as a final response is likely to consider all responses to the succeeding requests sent over the same connection to be part of the final response'.

  2. Faster page loads using server think-time with Early Hints - Chrome for Developers, Google, accessed

    Supports: Chrome's guide, last updated 10 July 2026. The premise: the connection 'effectively goes idle for as long as it takes the server to prepare the response', and Early Hints 'helps the browser take advantage of such server think-time'. The caveat: 'Early Hints are not useful if your server can send a 200 (or other final responses) right away.' The limitations, in Chrome's words: 'Only available for navigation requests (that is, the main resource for the top level document)'; 'Only supports preconnect and preload (that is, prefetch isn't supported)'; 'Early Hints followed by a cross-origin redirect on the final response will result in browsers dropping the resources and connections it obtained using Early Hints'; 'only cacheable resources can be preloaded using Early Hints or the resource will be double fetched'; and responsive preloads using 'imagesrcset, imagesizes or media' 'may not be supported ... as the viewport is not defined until the document is created'. Also recommends emitting hints only to requests carrying 'sec-fetch-mode: navigate' and 'only ... over HTTP/2 or HTTP/3'. Its support table lists preconnect in Chrome 103, Edge 103, Firefox 120 and Safari 17, and preload in Chrome 103, Edge 103 and Firefox 123, with no Safari version.

  3. 103 Early Hints - MDN Web Docs, Mozilla, accessed

    Supports: 'Browsers only process the first early hints response, and this response must be discarded if the request results in a cross-origin redirect.' 'It is recommended to only send HTTP 103 Early Hints responses over HTTP/2 or later unless the client is known to handle informational responses correctly. Most browsers limit support to HTTP/2 or later for this reason.' A 103 'may also contain a Content-Security-Policy header that is enforced while processing the early hint'.

  4. Early Hints - Cloudflare, accessed

    Supports: How the CDN that fronted seven of the eight hinting sites in the survey generates 103s: from Link headers it has cached, only 'For URIs with .html, .htm, or .php file extensions, or no file extension', 'On 200, 301, or 302 response return codes', and 'When the response contains link headers with preconnect or preload rel types'. Entries 'are keyed by request URI and ignore query strings'. 'Cloudflare will asynchronously look up and emit a cached 103 Early Hints response ahead of a main response', but 'Early Hints may be emitted less frequently on requests where the content is cacheable' and 'Cloudflare will not send a 103 response if the main response header is already available.' 'Early Hints is currently only supported over HTTP/2 and HTTP/3.'

  5. Early Hints at Shopify - Shopify Performance, accessed

    Supports: Published 11 June 2025, from 'Real User Monitoring (RUM) data from Shopify stores', Chromium only, which 'excludes all iOS devices'. Defaults: 'Shopify automatically adds two preconnect resource hints' to cdn.shopify.com, and allows 'preloading up to 10 different resources per page'. Desktop: 'modest benefits', with 'Pages using either no preload hints or 1-3 preload hints consistently show the fastest TTFB values'. Mobile: 'pages without Early Hints actually show better TTFB from the 40th percentile onwards'; for FCP 'pages without Early Hints consistently outperform those using Early Hints across all percentiles'; for LCP 'performance degrades when preloading 4 or more resources'. Confound, stated by the authors: pages with no hints often lacked them because 'Cloudflare's edge nodes lack cached Early Hints for a specific page', which 'often correlates with other caching layers' missing too. Drift: the default preconnects were more effective in 2022, but 'most resources are now served directly from merchants' domains, reducing the benefits of these preconnect hints'.

  6. PerformanceResourceTiming: firstInterimResponseStart property - MDN Web Docs, Mozilla, accessed

    Supports: The property 'returns a timestamp immediately after the browser receives the first byte of the interim 1xx response (for example, 100 Continue or 103 Early Hints)' and 'returns 0 if the resource sent no interim response'; since Early Hints apply to the navigation, 'a 0 typically indicates Early Hints were not used'. Marked 'Baseline 2026 - Newly available', 'Since June 2026'. Its companion, finalResponseHeadersStart, is the timestamp 'immediately after the browser receives the first bytes of the final document response (for example, 200 OK)'.

  7. Tranco list L5PV4 (generated 2026-09-23) - Tranco, accessed

    Supports: The sample for the survey: the first 500 domains of Tranco list L5PV4, created 23 September 2026 from the Chrome UX Report, Farsight, Majestic, Cloudflare Radar and Cisco Umbrella rankings averaged over 25 August to 23 September 2026. Tranco ranks registrable domains, not websites, so a share of its top entries (API, CDN and telemetry hostnames) serve no page at all.