Ajie Logo Ajie.
Navigation

© 2026 Ajie Kusumadhany.

Back to Articles

Why Your Core Web Vitals Scores Don't Match Real User Experience Kenapa Skor Core Web Vitals Tak Sesuai Pengalaman Pengguna Asli

Ajie Ajie Kusumadhany
Jul 10, 2026 9 min read
Why Your Core Web Vitals Scores Don't Match Real User Experience Kenapa Skor Core Web Vitals Tak Sesuai Pengalaman Pengguna Asli

You ran the test. PageSpeed Insights gave you a glorious 98 score. All three Core Web Vitals are green. You celebrated, deployed, and moved on to the next task.

Then the support tickets started rolling in.

Users complained about slow loading. Bounce rates increased. Conversion dropped. But how? The metrics said everything was fine.

Here's the uncomfortable truth: lab data and field data are completely different beasts. And trusting only one of them is a recipe for disaster.

Lab Data vs Field Data: What's the Difference?

Lab data is synthetic. It's measured in controlled environments with consistent network speeds, devices, and conditions. Tools like Lighthouse, WebPageTest, and PageSpeed Insights use this approach.

Field data, on the other hand, comes from real users. It's collected through the Chrome User Experience Report (CrUX), measuring actual experiences across countless devices, networks, and contexts.

The gap between these two can be massive.

Metric Lab Data Field Data
Environment Controlled, consistent Chaotic, variable
Network Simulated (often fast) 4G, 3G, WiFi, offline
Device Usually desktop/mobile emulation Low-end Android to M3 Macs
Cache State First visit (empty cache) Mixed (first + return visits)
Sample Size 1-5 test runs Thousands of sessions

Your lab test runs on a powerful server with a fast connection. Your users? They're on a mid-range phone, riding a train through a coverage dead zone, with 47 tabs open in Chrome.

Largest Contentful Paint: The Great Deceiver

LCP measures when the largest content element becomes visible. In lab tests, this is straightforward. The browser loads, the hero image appears, LCP fires.

But in the wild, LCP becomes unpredictable.

A user's device might struggle to decode a heavy image. Network congestion might delay the first byte. Third-party scripts might block the main thread, delaying paint.

Consider this scenario: your lab test shows LCP at 1.8 seconds. Perfect green. But field data shows LCP at 3.2 seconds for the 75th percentile.

What happened?

The Hidden Culprits of LCP Variance

First, client-side rendering. If your LCP element is rendered via JavaScript, the browser must download, parse, and execute the script before anything appears. Lab tests often have powerful CPUs that mask this delay.

Second, web fonts. Your beautiful custom font might look great, but if it's not properly optimized, users might see a flash of invisible text (FOIT) or unstyled text (FOUT), delaying the actual LCP measurement.

Third, server response time. Lab tests often hit cached or CDN-optimized origins. Real users might hit an origin server that's under load, thousands of miles away.

Cumulative Layout Shift: The Silent Killer

CLS is sneaky. It measures visual stability. Elements jumping around the page as it loads. Your lab test might show CLS at 0.02, but users report 0.15.

Why? Because lab tests load pages with a consistent viewport. They don't account for dynamic content.

That personalized recommendation widget? The ad that injects itself mid-load? The image that finally loads with dimensions different from its placeholder?

All of these cause layout shifts in real usage but might never trigger in a controlled test.

Common CLS villains:

  • Images without explicit width and height attributes
  • Dynamically injected content (ads, banners, notifications)
  • Web fonts causing reflow when they swap
  • Animations that use layout properties instead of transforms
  • Embedded iframes that resize after loading

The fix isn't just about fixing each individual shift. It's about reserving space for elements before they load.

Interaction to Next Paint: The New Standard

INP replaced FID as the responsiveness metric. It measures how quickly a page responds to user interactions throughout the entire session, not just the first one.

This is where lab data fails hardest.

Lab tests don't interact with your page. They load it, measure paint timing, and report. INP requires actual user interactions to measure.

You can have perfect lab scores and terrible INP because your JavaScript is blocking the main thread during user interactions.

Why INP Exposes Lazy Development

That click handler that runs a heavy computation? The form validation that blocks for 200ms? The infinite scroll that recalculates layout on every scroll event?

All of these tank INP. But lab tests never click, never scroll, never interact. They're blissfully unaware.

Real users feel every millisecond of delay. And Google's algorithms now factor INP heavily into search rankings.

The 75th Percentile Problem

Here's something most developers miss: Core Web Vitals pass/fail is determined by the 75th percentile, not the median or average.

This means 25% of your users can have a terrible experience without affecting your "pass" status.

But that 25% might be your most valuable users. The ones on slower devices. The ones in regions with worse infrastructure. The ones who need your product most.

Average metrics hide suffering. The 75th percentile exposes it.

Why Your Optimization Might Be Backfiring

You optimized images. You added lazy loading. You inlined critical CSS. Your lab scores improved.

But field data got worse.

How is this possible?

Lazy loading, when implemented incorrectly, can delay LCP. If your hero image is lazy-loaded, the browser might prioritize other resources, causing the LCP element to appear later.

Inlining too much CSS can block initial render. Aggressive code splitting can cause waterfalls on interaction.

Optimization without measurement is just guessing. And guessing can make things worse.

Bridging the Gap: Practical Steps

So how do you align lab and field data? How do you ensure your optimizations actually help real users?

Step 1: Establish a Baseline with Field Data

Before optimizing anything, check your field data in Google Search Console. Understand where you're actually failing. Not in a lab, but in the wild.

Look at the 75th percentile values, not averages. Identify which pages are problematic. Note the devices and connection types where users struggle most.

Step 2: Use Lab Data for Debugging

Once you know there's a problem, use lab tools to diagnose and fix it. WebPageTest is particularly valuable here because it offers more realistic network and device emulation.

Run tests on mobile devices with throttled CPU and 3G networks. This closer approximates real-world conditions.

Step 3: Measure in Production

Deploy changes gradually and monitor field data. Use the web-vitals JavaScript library to collect Real User Monitoring (RUM) data.

Send this data to your analytics platform. Break it down by device type, connection speed, and geography. Find the patterns.

Step 4: Optimize for the Worst Case

Don't optimize for the median user. Optimize for the 75th percentile. This means faster servers, smaller bundles, and more aggressive caching.

It also means testing on low-end devices. Borrow a budget Android phone. Use Chrome DevTools' CPU throttling. Experience your site the way your users do.

The Real User Test

The best performance testing tool is your own experience, under real conditions.

Open your site on a budget phone. Turn off WiFi. Use 4G or even 3G. Clear your cache. Navigate as a first-time visitor would.

Does it feel fast?

If not, no lab score will save you. And no field data metric will capture the frustration of a user who abandons your site before it even loads.

Key Takeaways

  • Lab data is controlled and consistent; field data is messy and real. You need both.
  • The 75th percentile determines pass/fail. Optimize for your slowest 25% of users.
  • INP requires actual user interactions to measure. Lab tests can't capture it.
  • CLS often fails in the wild due to dynamic content that doesn't exist in lab tests.
  • LCP variance comes from client-side rendering, fonts, and server response times.
  • Test on real devices with real network conditions. Your users will thank you.

Green scores in PageSpeed Insights feel great. But they're vanity metrics if they don't reflect reality. Close the gap between lab and field. Your users, your conversion rates, and your search rankings will all benefit.

Anda menjalankan tes. PageSpeed Insights memberikan skor gemilang 98. Ketiga Core Web Vitals hijau semua. Anda merayakan, deploy, dan lanjut ke tugas berikutnya.

Lalu tiket support mulai berdatangan.

Pengguna mengeluh soal loading lambat. Bounce rate naik. Konversi turun. Tapi bagaimana? Metrik bilang semuanya fine-fine saja.

Inilah kebenaran yang tak nyaman: lab data dan field data adalah dua binatang yang sama sekali berbeda. Dan mempercayai hanya salah satunya adalah resep bencana.

Lab Data vs Field Data: Apa Bedanya?

Lab data bersifat sintetis. Diukur di lingkungan terkontrol dengan kecepatan jaringan, perangkat, dan kondisi yang konsisten. Tools seperti Lighthouse, WebPageTest, dan PageSpeed Insights menggunakan pendekatan ini.

Field data, di sisi lain, berasal dari pengguna nyata. Dikumpulkan melalui Chrome User Experience Report (CrUX), mengukur pengalaman aktual dari ribuan perangkat, jaringan, dan konteks berbeda.

Gap antara keduanya bisa sangat besar.

Metrik Lab Data Field Data
Lingkungan Terkontrol, konsisten Chaotic, bervariasi
Jaringan Disimulasikan (sering cepat) 4G, 3G, WiFi, offline
Perangkat Biasanya desktop/emulasi mobile Android low-end sampai M3 Macs
Cache State Kunjungan pertama (empty cache) Campuran (first + return visits)
Sample Size 1-5 test runs Ribuan sesi

Lab test Anda berjalan di server powerful dengan koneksi cepat. Pengguna Anda? Mereka pakai hp mid-range, naik kereta melewati zona blank spot, dengan 47 tab terbuka di Chrome.

Largest Contentful Paint: Sang Penipu Ulung

LCP mengukur kapan elemen konten terbesar terlihat. Di lab test, ini straightforward. Browser load, hero image muncul, LCP fires.

Tapi di alam liar, LCP jadi tak terduga.

Perangkat pengguna mungkin kesulitan mendecode image berat. Kemacetan jaringan bisa delay first byte. Third-party script mungkin block main thread, menunda paint.

Pertimbangkan skenario ini: lab test Anda menunjukkan LCP di 1.8 detik. Hijau sempurna. Tapi field data menunjukkan LCP di 3.2 detik untuk persentil ke-75.

Apa yang terjadi?

Karakter Tersembunyi di Balik Variance LCP

Pertama, client-side rendering. Kalau elemen LCP Anda di-render via JavaScript, browser harus download, parse, dan eksekusi script sebelum apa pun muncul. Lab test sering punya CPU powerful yang menutupi delay ini.

Kedua, web fonts. Font custom Anda mungkin cantik, tapi kalau tidak dioptimasi dengan benar, pengguna mungkin melihat flash of invisible text (FOIT) atau unstyled text (FOUT), menunda pengukuran LCP aktual.

Ketiga, server response time. Lab test sering mengakses origin yang sudah ter-cache atau ter-optimasi CDN. Pengguna nyata mungkin mengakses origin server yang sedang under load, ribuan kilometer jauhnya.

Cumulative Layout Shift: Pembunuh Diam-diam

CLS itu licik. Mengukur stabilitas visual. Elemen yang lompat-lompat di halaman saat loading. Lab test Anda mungkin menunjukkan CLS di 0.02, tapi pengguna melaporkan 0.15.

Kenapa? Karena lab test load halaman dengan viewport konsisten. Mereka tidak mengakomodasi konten dinamis.

Widget rekomendasi yang dipersonalisasi? Iklan yang inject dirinya sendiri di tengah loading? Image yang akhirnya load dengan dimensi beda dari placeholder-nya?

Semua ini menyebabkan layout shift di penggunaan nyata tapi mungkin tidak pernah trigger di tes terkontrol.

Karakter villain CLS yang umum:

  • Image tanpa atribut width dan height eksplisit
  • Konten yang di-inject secara dinamis (iklan, banner, notifikasi)
  • Web font yang menyebabkan reflow saat swap
  • Animasi yang menggunakan layout properties bukan transforms
  • Embedded iframe yang resize setelah load

Fix-nya bukan hanya memperbaiki setiap shift individual. Tapi mereserve space untuk elemen sebelum mereka load.

Interaction to Next Paint: Standar Baru

INP menggantikan FID sebagai metrik responsiveness. Mengukur seberapa cepat halaman merespons interaksi pengguna sepanjang keseluruhan sesi, bukan hanya yang pertama.

Di sinilah lab data gagal paling parah.

Lab test tidak berinteraksi dengan halaman Anda. Mereka load, ukur paint timing, dan report. INP butuh interaksi pengguna aktual untuk diukur.

Anda bisa punya skor lab sempurna tapi INP buruk karena JavaScript Anda memblock main thread selama interaksi pengguna.

Kenapa INP Mengungkap Development yang Malas

Click handler yang menjalankan komputasi berat? Form validation yang block selama 200ms? Infinite scroll yang mengkalkulasi ulang layout di setiap scroll event?

Semua ini merusak INP. Tapi lab test tidak pernah click, tidak pernah scroll, tidak pernah berinteraksi. Mereka tidak tahu menahu.

Pengguna nyata merasakan setiap milidetik delay. Dan algoritma Google sekarang memfaktorkan INP secara berat di search ranking.

Masalah Persentil ke-75

Inilah yang dilewatkan sebagian besar developer: Core Web Vitals pass/fail ditentukan oleh persentil ke-75, bukan median atau rata-rata.

Ini artinya 25% pengguna Anda bisa punya pengalaman buruk tanpa mempengaruhi status "pass" Anda.

Tapi 25% itu mungkin pengguna paling berharga Anda. Yang pakai device lebih lambat. Yang di region dengan infrastruktur lebih buruk. Yang paling butuh produk Anda.

Metrik rata-rata menyembunyikan penderitaan. Persentil ke-75 mengungkapnya.

Kenapa Optimasi Anda Mungkin Jadi Bumerang

Anda sudah optimasi image. Sudah tambah lazy loading. Sudah inline critical CSS. Skor lab membaik.

Tapi field data justru memburuk.

Bagaimana mungkin?

Lazy loading, kalau diimplementasi salah, bisa menunda LCP. Kalau hero image Anda di-lazy-load, browser mungkin memprioritaskan resource lain, menyebabkan elemen LCP muncul lebih lambat.

Inline CSS terlalu banyak bisa block initial render. Code splitting terlalu agresif bisa menyebabkan waterfalls saat interaksi.

Optimasi tanpa pengukuran cuma tebakan. Dan tebakan bisa bikin segalanya lebih buruk.

Menjembatani Gap: Langkah Praktis

Jadi bagaimana menyelaraskan lab dan field data? Bagaimana memastikan optimasi Anda benar-benar membantu pengguna nyata?

Langkah 1: Tetapkan Baseline dengan Field Data

Sebelum mengoptimasi apa pun, cek field data di Google Search Console. Pahami di mana Anda benar-benar gagal. Bukan di lab, tapi di alam liar.

Lihat nilai persentil ke-75, bukan rata-rata. Identifikasi halaman mana yang bermasalah. Catat device dan tipe koneksi di mana pengguna paling kesulitan.

Langkah 2: Gunakan Lab Data untuk Debugging

Setelah tahu ada masalah, gunakan lab tools untuk diagnosis dan perbaikan. WebPageTest sangat berharga di sini karena menawarkan emulasi jaringan dan device yang lebih realistis.

Jalankan tes di perangkat mobile dengan CPU throttle dan jaringan 3G. Ini lebih mendekati kondisi real-world.

Langkah 3: Ukur di Production

Deploy perubahan secara bertahap dan monitor field data. Gunakan library JavaScript web-vitals untuk mengumpulkan Real User Monitoring (RUM) data.

Kirim data ini ke platform analytics Anda. Pecah berdasarkan tipe device, kecepatan koneksi, dan geografi. Temukan polanya.

Langkah 4: Optimasi untuk Worst Case

Jangan optimasi untuk pengguna median. Optimasi untuk persentil ke-75. Ini artinya server lebih cepat, bundle lebih kecil, dan caching lebih agresif.

Juga artinya tes di device low-end. Pinjam Android budget. Gunakan CPU throttling Chrome DevTools. Rasakan situs Anda seperti yang dirasakan pengguna.

Tes Pengguna Nyata

Tool performance testing terbaik adalah pengalaman Anda sendiri, dalam kondisi nyata.

Buka situs Anda di hp budget. Matikan WiFi. Pakai 4G atau bahkan 3G. Clear cache. Navigasi seperti pengguna baru.

Apakah terasa cepat?

Kalau tidak, tidak ada skor lab yang bisa menyelamatkan Anda. Dan tidak ada metrik field data yang bisa menangkap frustrasi pengguna yang meninggalkan situs Anda sebelum sempat load.

Kesimpulan Utama

  • Lab data terkontrol dan konsisten; field data berantakan dan nyata. Anda butuh keduanya.
  • Persentil ke-75 menentukan pass/fail. Optimasi untuk 25% pengguna terlambat Anda.
  • INP butuh interaksi pengguna aktual untuk diukur. Lab test tidak bisa menangkapnya.
  • CLS sering gagal di alam liar karena konten dinamis yang tidak ada di lab test.
  • Variance LCP berasal dari client-side rendering, font, dan server response time.
  • Tes di device nyata dengan kondisi jaringan nyata. Pengguna Anda akan berterima kasih.

Skor hijau di PageSpeed Insights memang terasa nikmat. Tapi itu vanity metric kalau tidak mencerminkan realitas. Tutup gap antara lab dan field. Pengguna Anda, conversion rate, dan search ranking akan semuanya mendapat manfaat.

#Web Performance #Frontend #Core Web Vitals #UX #Best Practices