Fix · Nina.care

Nina.care: LCP on mobile from 4.9 to 1.7 seconds, and the layout shifts gone

A childcare platform on WordPress that failed all three Core Web Vitals. Fixed in two rounds in 2024.

1.7sLCP on mobile, was 4.9s
0CLS on mobile, was 0.35 in 2023
175msINP on mobile, was 225ms
ClientNina.care, childcare platform
PlatformWordPress; the app runs separately
ServiceFix, two rounds in 2024
The client

Nina.care, a WordPress site that grew with every country

I got the call while hiking in the Ardennes: "Hey Arjen, can you help us with a nanny site?" I pictured an elderly couple with a small babysitting service. Back home two days later I found a startup in several countries, and a WordPress site that had grown with it. Not quite the couple I had in mind.

Nina.care matches families with childcare workers. Every new feature and every new country added a bit more to the site, until LCP, INP and CLS all failed.

In December 2024 I was on the guest list for their team’s Christmas drinks.

Nina.care homepage
What we found, what we did

Two rounds: the first screen, then the clicks

First I added CoreDash. Then we went through the home page. I did the scripts, the chat widget, the hero preload and the lazy loading; their developer did the rest.

What was wrong
What we did

Round one · early 2024

LCP
None of the 50-odd images below the hero was lazy loaded, and the hero had no preload and no fetchpriority.
The hero got a preload and fetchpriority="high". The rest waited until they were needed.
LCP
Scripts ran before the first screen could paint. Two cookie tools loaded, CookieYes and Cookiebot, and eight Gravity Forms stylesheets for the newsletter form in the footer.
The scripts got async or moved to later. CookieYes went, and so did four of the form stylesheets.
CLS
The icons popped in when their font arrived, the banner moved the content, and the fonts swapped.
The icons stayed hidden until their font was there, the banner got its height from the start, and the fallback font got the same metrics as the web font, which was preloaded.

Round two · autumn 2024

INP
Six Gravity Forms scripts and four WordPress helper scripts still loaded on the home page, for that one footer form.
The form came out of the footer. Its scripts and the last four stylesheets left with it.
INP
The chat widget loaded with the page, competing with the first clicks for the main thread.
We moved it to a small script that started it once the page was there.
The home page, before and after

In January the home page requested all 54 images up front, so on a phone the hero shared the connection with 53 photos nobody had scrolled to yet. Six scripts in the head had to download and run before the browser could build the rest of the page. I moved those scripts out of the way and lazy loaded 46 of the images. In round two the form scripts left the home page, and 25 external scripts became 11.

17 January 2024before
6
blocking scripts
0 of 54
lazy images
26
external scripts
2 June 2024after round one
0
blocking scripts
46 of 54
lazy images
25
external scripts
6 November 2024after round two
0
blocking scripts
46 of 54
lazy images
11
external scripts
The Nina.care home page in the Internet Archive, counted from the HTML of each capture.

The hero was a plain img between 53 others, so it started at low priority and only got raised after layout, when the other photos were already downloading. I gave it fetchpriority="high" and a preload in the head, so it starts high and goes first.

Before17 January 2024: no preload, no priority, nothing lazy
<div class="hero-section"><div class="top"><img src="…/homepage-2-lyla-jasmijn.jpg" alt="au pairs reading a book" /></div>…<div class="each-services"><img src="…/babysit-image-homepage.png" alt="babysit product image" />
After6 November 2024: the hero first, most of the rest lazy
<link fetchpriority="high" rel="preload" href="…/homepage-1.png"   as="image">…<div class="hero-section">    <div class="top">        <img data-preload loading="eager" decoding="async" fetchpriority="high" src="…/homepage-1.png" alt="au pair and…    </div>…                    <div class="each-services">                        <img decoding="async" loading="lazy" src="…/au-pair-service-img.png" alt="Au pair service" />
The same home page, 17 January and 6 November 2024. Line numbers are from the archived HTML.
In CrUX

I like this one because both rounds are in it. In the second half of 2023 LCP on phones ran 3 to 3.8 seconds, with 4.9 in December, the month before I started, and CLS peaked at 0.35 in September. After round one LCP dropped to 2.2 seconds in February. It slipped back to orange in March, April and July, then stayed green from August, down to 1.7 seconds by January 2025. CLS was 0 every month from February 2024. Round two shows in INP: 225 ms from July to September, 175 ms from October.

2.5 s4.0 s3.8 sJul 2023Oct4.9 sJan 2024AprJulOct1.7 sJan 2025LCP on mobile, p75
0.100.250.15Jul 20230.35OctJan 2024AprJulOct0.00Jan 2025CLS on mobile, p75
200 ms200 msJul 2023OctJan 2024Apr225 msJulOct175 msJan 2025INP on mobile, p75
nina.care in CrUX, phone, July 2023 to January 2025. One bar per month, p75, from Google’s CrUX data in BigQuery. Green is good, orange needs improvement, red is poor.
"Thank you so much for all that you have done for me and the boys! You feel like a part of the company and I like it."

Jasmijn, Nina.care

What we learned

A form nobody fills in still loads for everyone

Nobody decided to make the site slow. The footer had a newsletter form that hardly anyone filled in, and Gravity Forms loaded its own files for it on every visit. Make that call on purpose. Say a form costs every visitor half a second and one in ten thousand signs up. Do you still want it in the footer, or do you link to a page with the form?

Measure first, then fix

CoreDash was on the site before we changed anything, so each change showed up in their field data.

Arjen Karel

A WordPress site that fails all three?

I work on a copy of your site and measure the result in your real visitor data.

Nina.care: LCP on Mobile From 4.9s to 1.7s, CLS to Zero Core Web Vitals Nina.care: LCP on Mobile From 4.9s to 1.7s, CLS to Zero