<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://web.dev/</id>
  <title>Jan Brockmeyer on web.dev</title>
  <updated>2026-04-15T23:21:06Z</updated>
  <author>
    <name>Jan Brockmeyer</name>
  </author>
  <link href="https://web.dev/authors/jbrockmeyer/feed.xml" rel="self"/>
  <link href="https://web.dev/"/>
  <icon>https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/OKm64vE60MFeWq62TFBh.jpg?auto=format</icon>
  <logo>https://web.dev/images/shared/rss-banner.png</logo>
  <subtitle>Our latest news, updates, and stories by Jan Brockmeyer.</subtitle>
  
  
  <entry>
    <title>How Zalando reduced performance feedback time from 1 day to 15 minutes with Lighthouse CI</title>
    <link href="https://web.dev/zalando/"/>
    <updated>2021-04-13T00:00:00Z</updated>
    <id>https://web.dev/zalando/</id>
    <content type="html" mode="escaped">&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; This case study was authored by Jeremy Colin and Jan Brockmeyer from the Zalando web infrastructure team. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;With more than 35 million active customers,
&lt;a href=&quot;https://www.zalando.com/&quot; rel=&quot;noopener&quot;&gt;Zalando&lt;/a&gt; is Europe&#39;s leading online fashion platform.
In this post we explain why we started to use Lighthouse CI,
the ease of implementation,
and the advantages to our team.&lt;/p&gt;
&lt;p&gt;At Zalando, we know the relationship between website performance and revenue.
In the past,
&lt;a href=&quot;https://engineering.zalando.com/posts/2018/06/loading-time-matters.html&quot; rel=&quot;noopener&quot;&gt;we tested how artificially increasing the loading time on Catalog pages&lt;/a&gt;
affected bounce rates,
conversion rates, and revenue per user.
The results were clear.
A 100 milliseconds page load time improvement led to increased engagement with lower bounce rate and a 0.7% uplift in revenue per session.&lt;/p&gt;
&lt;div class=&quot;stats&quot;&gt;
  &lt;div class=&quot;stats__item&quot;&gt;
    &lt;p class=&quot;stats__figure&quot;&gt;100&lt;sub&gt;ms&lt;/sub&gt;&lt;/p&gt;
    &lt;p&gt;Page load time improvement&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;stats__item&quot;&gt;
    &lt;p class=&quot;stats__figure&quot;&gt;0.7&lt;sub&gt;%&lt;/sub&gt;&lt;/p&gt;
    &lt;p&gt;Increased revenue per session&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;company-buy-in-does-not-always-translate-to-performance&quot;&gt;Company buy-in does not always translate to performance &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/zalando/#company-buy-in-does-not-always-translate-to-performance&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Despite the strong performance buy-in inside the company,
if performance is not set as a product delivery criteria
it can easily slip away. When we were redesigning Zalando website in 2020
we focused on delivering
&lt;a href=&quot;https://corporate.zalando.com/en/newsroom/news-stories/zalando-sets-out-revolutionize-pre-owned-fashion-europe&quot; rel=&quot;noopener&quot;&gt;new features&lt;/a&gt;
while  maintaining excellent user experience and applying a facelift
to the website with custom fonts and more vibrant colors.
However, when the redesigned website and app were ready for release,
early adopter metrics revealed that the new version was slower.
First Contentful Paint was up to 53% slower,
and our measured Time to Interactive reported up to 59% slower.&lt;/p&gt;
&lt;h2 id=&quot;the-web-at-zalando&quot;&gt;The web at Zalando &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/zalando/#the-web-at-zalando&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Zalando website is created by a core team developing a framework,
&lt;a href=&quot;https://engineering.zalando.com/posts/2021/03/micro-frontends-part1.html&quot; rel=&quot;noopener&quot;&gt;with over 15 feature teams contributing frontend microservices&lt;/a&gt;.
While supporting the new release,
we also transitioned part of our website to a more centralized architecture.&lt;/p&gt;
&lt;p&gt;The previous architecture called &lt;a href=&quot;https://www.mosaic9.org/&quot; rel=&quot;noopener&quot;&gt;Mosaic&lt;/a&gt;
included a way to measure page performance with in-house metrics.
However, it was difficult to compare performance metrics prior to rolling out to real users
as we lacked internal lab performance monitoring tools.
Despite deploying every day,
there was a feedback loop of around one day for developers working on performance improvements.&lt;/p&gt;
&lt;h2 id=&quot;web-vitals-and-lighthouse-to-the-rescue&quot;&gt;Web Vitals and Lighthouse to the rescue &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/zalando/#web-vitals-and-lighthouse-to-the-rescue&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We were not entirely satisfied with our in-house metrics as they did not adapt well to our new setup.
More importantly, they were not centered on customer experience.
We switched to &lt;a href=&quot;https://web.dev/vitals/&quot;&gt;Core Web Vitals&lt;/a&gt;
as they provided a condensed, yet comprehensive and user-centric set of metrics.&lt;/p&gt;
&lt;p&gt;In order to improve the performance before the release,
we needed to create a proper
&lt;a href=&quot;https://web.dev/how-to-measure-speed/#lab-data-vs-field-data&quot;&gt;lab environment&lt;/a&gt;.
This provided reproducible measurements,
in addition to testing conditions representing our 90th percentile of field data.
Now, engineers working on performance improvements knew where to focus their
efforts to make the biggest impact.
We were already using Lighthouse audit reports locally.
So our first iteration was to develop a service based on &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse#using-the-node-module&quot; rel=&quot;noopener&quot;&gt;Lighthouse node module&lt;/a&gt;,
where changes could be tested from our staging environment.
This gave us a reliable performance feedback loop of around one hour,
which enabled us to bring the performance on par and save our release!&lt;/p&gt;
&lt;h2 id=&quot;giving-performance-feedback-to-developers-on-pull-requests&quot;&gt;Giving performance feedback to developers on pull requests &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/zalando/#giving-performance-feedback-to-developers-on-pull-requests&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We did not want to stop there,
as we wanted to take the opportunity to not only be reactive towards performance but also proactive.
Making the jump from Lighthouse node module to &lt;a href=&quot;https://web.dev/lighthouse-ci/&quot;&gt;Lighthouse CI (LHCI) server&lt;/a&gt;
was not too difficult.
We opted for the self hosted solution in order to give us a a better integration with our existing company services.
Our LHCI server application gets built as a Docker image,
which is then deployed to our Kubernetes cluster together with a PostgreSQL database, and reports to our GitHub.&lt;/p&gt;
&lt;p&gt;Our framework was already providing some performance feedback to developers—
component bundle sizes were being compared to threshold values on every commit.
Now we are able to report Lighthouse metrics as GitHub status checks.
These cause the CI pipeline to fail if they do not meet the performance thresholds,
with a link to the detailed Lighthouse reports as shown in the following images.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Image of GitHub UI showing lines of successful checks.&quot; decoding=&quot;async&quot; height=&quot;126&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/vPqK9LEp3dKrHSSqULRe.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;Lighthouse CI GitHub status checks make it easy for developers
    to understand the regression and address it before it reaches production.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Comparison image in Lighthouse CI showing how the commit compares to the main branch&quot; decoding=&quot;async&quot; height=&quot;370&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/ZDZVuXt6QqfXtxkpXcPGfnygYjd2/PRQBzVBLG7wG1Ftngp6B.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;Lighthouse CI detailed commit report compared to the main branch.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;extending-the-performance-coverage&quot;&gt;Extending the performance coverage &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/zalando/#extending-the-performance-coverage&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We started with a very pragmatic approach.
Currently Lighthouse only runs on two of our most important pages:
the home page and product detail page.
Fortunately, Lighthouse CI makes it easy to extend the run configurations.
Feature teams working on specific pages of our website are able to set up their matching URL pattern and assertions.
With this in place, we are pretty confident that our performance coverage will increase.&lt;/p&gt;
&lt;p&gt;We are now much more confident when building larger releases,
and developers can enjoy a much shorter feedback loop on the performance of their code.&lt;/p&gt;
</content>
    <author>
      <name>Jeremy Colin</name>
    </author><author>
      <name>Jan Brockmeyer</name>
    </author>
  </entry>
</feed>
