Core Web Vitals and third-party embeds: a practical guide for small sites
Social feeds, video players, review widgets and chat buttons make a website feel alive, but each one is code from someone else’s server running on your page. Google’s Core Web Vitals measure exactly the things that kind of code can disturb: how fast the main content appears, how quickly the page responds, and whether things jump around. This guide explains the three metrics in plain terms, shows how embeds affect each one, and walks through measuring and fixing the impact on a small site, including an honest look at how our own Instagram feed widget behaves.
Updated October 12, 2026

Core Web Vitals in one minute
Core Web Vitals are three metrics that Google’s web.dev site describes as measuring loading, interactivity and visual stability. Each has a threshold for a “good” experience:
| Metric | What it measures | Good | Needs improvement | Poor |
|---|---|---|---|---|
| Largest Contentful Paint (LCP) | When the largest image or text block in view finishes rendering | 2.5 s or less | Up to 4 s | Over 4 s |
| Interaction to Next Paint (INP) | How quickly the page visibly responds to clicks, taps and key presses | 200 ms or less | Up to 500 ms | Over 500 ms |
| Cumulative Layout Shift (CLS) | How much visible content moves unexpectedly | 0.1 or less | Up to 0.25 | Over 0.25 |
Two details matter when you read your own results. First, web.dev recommends judging each metric at the 75th percentile of page loads, separately for mobile and desktop. A page passes when three out of four visits meet the target, not when your own fast laptop does. Second, INP replaced an older metric, First Input Delay (FID), and became a stable Core Web Vital in 2024. Older articles and tools that talk about FID are out of date.
If you’re wondering whether any of this affects search, our article does an Instagram feed help SEO? covers what Google says about page experience and rankings. This guide focuses on the mechanics and the fixes.
How an embed gets onto your page
Almost every embed follows the same pattern. You paste a snippet, usually a script tag or an iframe. When a visitor loads the page, the browser fetches the provider’s code, runs it, and the code adds content: images, video, text or a whole framed page. That process costs three things, and each maps neatly onto one metric:
| Cost | What happens | Metric most affected |
|---|---|---|
| Network | The browser downloads the script and then the images, video or frames it asks for, often from several servers | LCP |
| Main thread | The browser parses and runs the embed’s JavaScript, which competes with everything else the page does | INP |
| Layout | The new content appears after the rest of the page has already been laid out, and pushes things around | CLS |
The size of each cost depends on the embed. An iframe-based embed loads a whole separate page. web.dev’s article on embed best practices notes, for example, that Instagram’s own post embed script injects an iframe that can exceed 100 KB gzipped. A lighter script that writes images directly into your page avoids the separate page, but still downloads images and still adds content after the page has started to display.
LCP: when embeds slow down the main content
LCP looks at the largest element visible in the viewport while the page loads. According to web.dev, the eligible elements include images, the poster or first frame of a video, elements with a CSS background image, and blocks of text. Only what is in view counts, so an embed far down the page isn’t a candidate when the page first loads.
An embed affects LCP in two ways:
- The embed becomes the LCP element. If a feed, video or large widget sits near the top of the page, one of its images may be the largest thing in view. Embed images arrive late by nature: first the script must download and run, and only then can the image request start. An image written directly into your page’s HTML starts loading much earlier.
- The embed delays your own LCP element. Even when your hero image or headline is the LCP element, an embed placed above it in the page’s code, or one that downloads a lot at the start, competes for bandwidth and processing time.
web.dev’s guidance on lazy loading adds a rule worth remembering: don’t lazy-load images that are likely to be in view when the page loads, especially the LCP image. Lazy loading is for content further down. That applies to your own images and to how you judge an embed’s settings.
INP: when embeds make the page feel sluggish
INP watches the clicks, taps and key presses a visitor makes during the whole visit and reports a value that most of those interactions fall beneath. web.dev splits each interaction into three phases:
| Phase | What it is | How embeds affect it |
|---|---|---|
| Input delay | Time before the page can start handling the interaction | If an embed’s script is running when the visitor clicks, the click waits |
| Processing | Time spent in the code that responds to the interaction | Clicking inside an embed runs the embed’s own code |
| Presentation delay | Time until the browser paints the next frame | A large page with many elements takes longer to repaint |
Hovering, scrolling and zooming aren’t counted, according to web.dev. Clicking a menu, a button or a tile in a feed is.
The most common way embeds hurt INP on small sites is input delay during loading. Several scripts download and run at once: analytics, a chat widget, a cookie banner, a feed, a video player. If a visitor taps the menu while that work is happening, the tap waits. web.dev’s advice on optimizing INP points out that script evaluation can create long tasks that delay responses to input, and that large pages take more work to render. Each embed adds a little; several embeds add up.
Lab tools can’t measure INP directly, because there’s no real visitor clicking. Lighthouse uses Total Blocking Time (TBT) instead, which measures how long the main thread was blocked during loading. A high TBT is a useful early warning for INP problems.
CLS: when embeds push your content around
CLS is the metric embeds affect most often, and the one site owners notice: you start reading, and the text jumps down because something appeared above it. web.dev lists the usual causes, including images or videos without known dimensions, third-party widgets that resize themselves after loading, and content added dynamically above existing content. Embeds can tick all three boxes.
A few details explain why some shifts count and others don’t:
- Session windows. CLS groups shifts that happen less than one second apart into a window of up to five seconds, and reports the worst window. A feed appearing and then its images settling a moment later can land in the same window.
- Shifts after input are excluded. Shifts within 500 milliseconds of a click, tap or key press are treated as expected. Opening something in response to a click is usually fine. Scrolling doesn’t count as input, so content that shifts while the visitor scrolls does count.
- Position matters. Content inserted near the top of the visible area moves more of the page than content near the bottom.
The fix web.dev recommends for embeds is to reserve space: give the container a fixed size or a minimum height so the page doesn’t move when the embed arrives. Our article on where to put an Instagram feed includes a minimum-height example and explains the trade-offs, so we won’t repeat it here. The short version: reserve space, or place the embed lower on the page.
Which embeds tend to affect which metric
Every product is different, so treat this as a starting point for testing, not a verdict:
| Type of embed | Typical concern | First thing to try |
|---|---|---|
| Video player (iframe) | Download size; LCP if near the top | A lightweight facade or loading="lazy" on the iframe |
| Single social post (iframe) | Download size; CLS while the frame sizes itself | Reserve space; lazy-load if below the fold |
| Social feed (script) | CLS when it appears; images if near the top | Place below the main content; reserve space |
| Chat or help widget | Main-thread work on every page; INP | Load it only on pages that need it |
| Review or rating carousel | CLS and motion | Reserve space; avoid auto-advancing |
| Map | Download size | A static image linking to the full map |
A “facade”, in web.dev’s embed guidance, is a lightweight placeholder, such as a preview image with a play button, that loads the real embed only when the visitor clicks. It trades one extra click for a much lighter initial page. Lightweight YouTube players built this way are a common example.
How Social Feed loads, and what that means for your vitals
We make Social Feed by grip space, an Instagram feed widget, so here is exactly how it loads. This comes from the widget’s code, not marketing material:
| Behavior | Details | Effect on Core Web Vitals |
|---|---|---|
| One script tag | The embed code is a single script tag. The feed’s settings and post list come with the script, so no second data request is needed | Fewer round trips before images can start loading |
| No iframe | The feed is written directly into your page next to the script tag | No separate framed page to download |
| Regular script, not async | The browser pauses reading the HTML at the tag until the script has downloaded and run, so the feed appears exactly where you put it | Place the tag below your main content so it doesn’t hold up anything above it |
| Fresh on every page view | The script isn’t cached by the browser, so setting changes show up immediately | A small download on every visit |
| Images from Instagram | Photos and video thumbnails load directly from Instagram’s servers, using the image files Instagram provides | Large tiles near the top could become the LCP element |
| Lazy loading in the grid | The first row of a grid loads right away; later rows use the browser’s lazy loading | Images below the first row don’t compete with your main content |
| Slider loads all images | In the slider layout every image loads right away, so slides aren’t blank when visitors use the arrows | More image data on the initial load; keep the post count moderate |
| Square tiles with a fixed shape | Each tile keeps a square shape before its image arrives | Images loading inside the feed don’t move the feed itself |
| Feed height unknown before it runs | The feed’s height depends on posts, columns and the space available | Content below the feed moves down when it appears, unless you reserve space |
| Lightbox on top of the page | The lightbox opens in a layer over the page after a click | No layout shift; the work happens only after a click |
| Videos load on demand | Videos play only in the lightbox; the feed shows still thumbnails | No video data on the initial load |
Put together: the main thing to watch with our widget is CLS from the feed appearing, and, if it sits high on the page, image loading competing with your LCP. Both have the same simple fix: place the feed below your main content. For the image side, a grid with a moderate number of posts is lighter than a slider with many; grid or slider covers that choice.
We recommend pasting the embed code exactly as provided rather than editing the script tag. It’s designed to render right where it is placed.
Measuring: field data versus lab data
There are two kinds of performance data, and small sites need to understand both:
| Field data | Lab data | |
|---|---|---|
| Source | Real visitors using Chrome, collected in the Chrome User Experience Report (CrUX) | A simulated page load by Lighthouse |
| Time span | The previous 28 days | A single run, right now |
| Metrics | LCP, INP, CLS and more | LCP, CLS, TBT and more; no INP |
| Good for | Knowing what visitors actually experience | Testing a change before and after; finding causes |
| Catch for small sites | Needs enough traffic; may not exist for your pages | One device and network; can differ from reality |
Google’s PageSpeed Insights documentation explains that if a page doesn’t have enough field data, it falls back to data for your whole origin, and if the origin doesn’t either, no field data is shown. That’s common for small sites, and it’s nothing to worry about. It simply means lab tests and careful observation are your main tools.
Tools to use
- PageSpeed Insights. Enter a URL to see field data at the top, when available, and a Lighthouse lab test below. Check the mobile tab first; it simulates a mid-range phone on a mobile network.
- Search Console’s Core Web Vitals report. If your site is verified in Search Console, this report groups similar pages and shows their status from field data, for mobile and desktop. Only indexed pages with enough data appear. After a fix, you can start a 28-day validation period.
- Chrome DevTools. Built into Chrome, it can measure Core Web Vitals for your own visits and record a page load so you can see what happened, and when.
- Lighthouse audits for third parties. In the lab report, look for the audit about reducing the impact of third-party code, which lists each third-party provider with its transfer size and main-thread blocking time.
- The web-vitals JavaScript library. For sites with a developer, this library measures all three metrics from real visits, so you can collect your own field data.
A before-and-after test for any embed
The most reliable way to know what an embed costs on your site is to compare the same page with and without it:
- Pick the page where you want the embed. Run PageSpeed Insights on mobile three times and note LCP, CLS and TBT from each run. Lab results vary from run to run, so use the middle value.
- Add the embed where you plan to keep it, publish, and run the same three tests.
- Compare the middle values. In the report’s diagnostics, check which element was the LCP element and which elements shifted, to see whether the embed is involved.
- If CLS rose, move the embed lower or reserve space, then test again.
- If LCP rose and the LCP element is now an embed image, move the embed below the first screen.
- If TBT rose sharply, check the third-party audit to see which provider is responsible.
- A few weeks later, check field data in PageSpeed Insights or Search Console, if your site has enough traffic to show it.
With Social Feed, you can also use the widget’s Published/Unpublished switch to compare: unpublish it, test, publish it again, test. The script tag stays in place, but an unpublished widget shows nothing. See hiding your feed temporarily for how that works.
Practical fixes, roughly in order of effort
- Move embeds below the main content. This is the single most effective change. Below the first screen, an embed can’t be the LCP element, and the content it pushes down is usually out of view.
- Use fewer embeds per page. Ask whether each one earns its place. A page with a feed, a video, a review carousel and a chat widget pays all four costs on every visit.
- Load embeds only where they’re useful. A chat widget or feed added site-wide through a theme setting runs on every page, including ones where nobody uses it.
- Reserve space. Give the embed’s container a minimum height close to its final height, adjusted for phones and computers.
- Keep post counts moderate. For feeds, fewer posts means fewer images and a smaller page. Eight or twelve posts usually show enough.
- Use facades and lazy loading for heavy iframes. For video and map embeds, web.dev recommends loading="lazy" on iframes and click-to-load placeholders.
- Prefer async or defer where the provider supports it. web.dev advises loading third-party scripts with async or defer unless they are needed for the first render. Follow each provider’s instructions, since some scripts, ours included, are designed to run where they are placed.
- Audit periodically. web.dev notes that embed code changes over time. Re-test after adding new embeds or redesigning a page.
Troubleshooting common results
| What you see | Likely cause | What to try |
|---|---|---|
| CLS above 0.1 after adding an embed | The embed appears and pushes content down | Move it lower or reserve space |
| LCP element is an image inside the embed | The embed is in view when the page loads | Move it below the first screen |
| High TBT with a long third-party list | Several scripts run during loading | Remove embeds that aren’t needed on this page |
| Lab results fine, field results poor | Real visitors use slower phones and networks | Trust field data; test on a real mid-range phone |
| No field data at all | Not enough Chrome visits to the page or site | Rely on lab tests and the before-and-after method |
| Results differ on every run | Normal variation in lab tests | Run several tests and compare middle values |
If the feed doesn’t appear at all during testing, that’s a different problem; see Instagram feed not showing on your website.
Frequently asked questions
Will one social feed fail my Core Web Vitals? Not necessarily. Placed below the main content with a moderate number of posts, a feed usually has a small effect. Measure your page before and after to know for sure.
Is an iframe embed better or worse than a script embed? Neither is automatically better. An iframe isolates the embed’s code but loads a whole separate page. A script that writes directly into your page avoids that, but runs on your page’s main thread. Measure the specific embed.
Does the Social Feed lightbox affect INP? Opening the lightbox is an interaction, so it counts. The work it does is small: it builds the lightbox and loads one image or video. Videos load only when the lightbox opens.
Does the free plan’s credit link affect performance? The “Powered by Social Feed” credit is a small text link with an inline logo. It doesn’t load extra files.
Why does PageSpeed Insights show different numbers from Search Console? They may show different data: a single lab run versus 28 days of field data, or one page versus a group of similar pages.
Should I chase a perfect Lighthouse score? No. The score is a lab summary. Aim for good field results, or good lab results if you have no field data, and a page that feels fast on a real phone.
Get started
If you’d like a feed that’s easy to place well, create a free Social Feed account, add the embed below your main content, and run the before-and-after test above. The setup guides for WordPress, Shopify, Wix, Squarespace, Webflow and plain HTML show where the code goes. Plans and limits are on the pricing section. Questions about performance on your site? Write to info@grip-space.co.jp.
Sources
- web.dev, “Web Vitals”: https://web.dev/articles/vitals
- web.dev, “Largest Contentful Paint (LCP)”: https://web.dev/articles/lcp
- web.dev, “Interaction to Next Paint (INP)”: https://web.dev/articles/inp
- web.dev, “Optimize Interaction to Next Paint”: https://web.dev/articles/optimize-inp
- web.dev, “Cumulative Layout Shift (CLS)”: https://web.dev/articles/cls
- web.dev, “Best practices for using third-party embeds”: https://web.dev/articles/embed-best-practices
- web.dev, “Loading Third-Party JavaScript”: https://web.dev/articles/optimizing-content-efficiency-loading-third-party-javascript
- web.dev, “Browser-level image lazy loading for the web”: https://web.dev/articles/browser-level-image-lazy-loading
- Google, “About PageSpeed Insights”: https://developers.google.com/speed/docs/insights/v5/about
- Google Search Console Help, “Core Web Vitals report”: https://support.google.com/webmasters/answer/9205520
Get your embed code in a few minutes. The Free plan needs no credit card.
Sign up freeMore articles

Instagram embed vs. feed widget speed: what each one loads on your page
What Instagram’s native embed loads (embed.js plus an iframe per post) compared with a feed widget (one script plus images), and how to measure both yourself.
Read the article →
How to add an Instagram feed to Carrd
Add an auto-updating Instagram feed to a Carrd site with the Embed element (Pro Standard or higher): steps, layout tips, sections, columns and fixes.
Read the article →
How to show only Instagram Reels on your website
Set up a Reels-only Instagram feed on your website: the Reels filter, how videos play, layout tips, and why some Reels show as still images.
Read the article →
How to show only recent Instagram posts on your website
Keep your website’s Instagram feed current: show only posts from the last 30 days, 90 days or year, how the date range is measured, and seasonal tips.
Read the article →
How to show different Instagram feeds on different pages of one website
Run several Instagram feeds on one website: one widget per page, Duplicate to copy settings, per-page filters, plan widget limits and how views are counted.
Read the article →
How to hide your website’s Instagram feed temporarily without removing the code
Switch your Instagram feed off for a closure, rebrand or account cleanup, then back on later, without touching the embed code on your website.
Read the article →