On this page
Does live chat slow down a website? Every widget we tested downloads code and runs scripts, so in that narrow sense yes. Whether it hurts your site in a way visitors would notice varies a lot by vendor. We measured ten widgets, including our own, and the honest answer has three parts. Before anyone clicks anything, a chat widget downloads somewhere between 49 KB and about 1 MB. On a throttled phone, the CPU time varies far more than the bytes do. And Talvo lands in the middle of the pack, not at the light end.
Here is the short version. Help Scout's Beacon was the lightest at 49.4 KB before a click, and Intercom the heaviest at 1,003.8 KB. Talvo came in at 280.1 KB before a click and 443.3 KB once opened: lighter than six of the other widgets, heavier than three (Tawk.to, Crisp and Help Scout). On widget CPU, Talvo was on the low side, at 187 ms on a simulated mid-range phone.
On Total Blocking Time (TBT), only LiveChat, HubSpot and Zendesk showed a clear increase on mobile, and Intercom was borderline. For everyone else, the effect was smaller than the noise. That does not mean the rest are free. It means this kind of test cannot see small costs on busy pages.
The rest of this post explains how we got those numbers, what they can and cannot tell you, where Talvo's own widget is wasteful, and how to run the same test on your own site in an afternoon.
How we measured, in plain words
We are one of the ten vendors in this test, so the method matters more than usual. Here it is without the jargon.
Two tools, two jobs. We used Lighthouse 12.8.2 driving Google Chrome 155.0.8059.40 to measure CPU and Total Blocking Time. We used Playwright 1.49.1 with Chromium 131 to count bytes before and after opening the chat.
Blocked-URL deltas. For each vendor, we ran Lighthouse on the page normally, then again with the widget's URLs blocked using Lighthouse's --blocked-url-patterns option. The difference between the two is the widget's effect on that page. Each arm ran five times, alternating normal and blocked, and we report the median. In total that was 220 Lighthouse runs, plus 10 runs of Talvo's no-snippet control page, run strictly one after another.
Mobile and desktop. The mobile profile is Lighthouse's Moto G Power emulation with simulated 4x CPU slowdown on a slow 4G connection (150 ms round trip, 1.6 Mbps). Mobile figures are simulated from a real load, not measured on a phone. The desktop profile has no CPU throttling.
The network split. To see what loads before and after a click, Playwright loaded each page with an empty cache and recorded every widget request for a fixed 30 seconds with no interaction. Then it clicked the launcher (or called the vendor's documented open command if the click did nothing) and recorded 19 more seconds. Three runs per widget, and we report the median. Sizes are transfer size, meaning compressed bytes on the wire including headers, and 1 KB is 1,024 bytes.
Limits of the setup. One machine, one evening (October 21, 2026), one US East location. This is lab data, not field data from real visitors. We did not click any cookie banner. Nothing here is a Core Web Vitals pass or fail.
Which pages we tested
We tested each widget on the page where we could confirm it was running. For most vendors that was their homepage. Three were different, and one is ours.
| Widget | Page tested | Why |
|---|---|---|
| Zendesk (messaging Web Widget) | support.box.com | zendesk.com does not run its own messaging widget. Box was the first site we found running it. Box shows no visible launcher. |
| Help Scout Beacon | docs.helpscout.com | The main helpscout.com site did not load Beacon in headless Chrome. |
| Freshchat | freshworks.com/freshdesk/ | The Freshdesk product page runs Freshchat. freshworks.com/live-chat-software/ runs a different product. |
| Talvo | A plain page containing only our snippet | See below. |
| Intercom, Crisp, Tidio, LiveChat, HubSpot, Tawk.to | Each vendor's own homepage | Widget confirmed in the network log and a screenshot. |
On talvo.chat itself, the widget is first-party, and its iframe reuses the JavaScript the homepage already downloaded. That makes the widget look nearly free, which is misleading, because your visitors would not have that bundle cached. So we tested Talvo on a tiny HTML page with nothing but the snippet, which is the closest thing to a customer install. For Talvo, the baseline was the identical page without the snippet.
What loads before anyone clicks
This is the table that stays true however you test it. Each figure is the median of three runs, and byte counts barely moved between runs (well under 1%), except HubSpot.
| Widget | KB before any click | Extra KB after opening | Total KB through open |
|---|---|---|---|
| Intercom (Fin messenger) | 1,003.8 | 449.0 | 1,452.8 |
| Freshchat | 988.3 | 201.1 | 1,189.4 |
| HubSpot chat | 896.9 (704.0 to 898.4 across runs) | 0.0 (0.0 to 191.2) | 896.9 |
| Tidio | 512.6 | not measured | not measured |
| Zendesk | 405.2 | 276.9 (unverified) | 682.1 (unverified) |
| LiveChat (Text) | 362.2 | 390.2 | 752.4 |
| Talvo | 280.1 | 163.0 | 443.3 |
| Tawk.to | 258.4 | 123.5 | 381.9 |
| Crisp | 127.6 | 140.0 | 267.6 |
| Help Scout Beacon | 49.4 | 243.1 | 292.5 |
Almost all of it is JavaScript. For Talvo, 259.0 KB of the 280.1 KB is script.
The spread between the lightest and heaviest is about 20 times, and the byte count tells you less than you'd expect, because the widgets split into two camps.
Help Scout loads a 49.4 KB launcher and then 243.1 KB more only when a visitor opens it. LiveChat loads 362.2 KB up front and 390.2 KB more on open. Intercom front-loads about a megabyte and then adds 449.0 KB on open. Crisp's own site waits about 8.7 seconds before it requests anything, which looks like a choice that site made rather than the default for a customer. Freshchat, HubSpot and Tidio load nearly everything up front. Talvo loads 280.1 KB up front and 163.0 KB on open, and defers nothing.

Two table cells need a warning. Tidio's page shows a modal Cookiebot dialog, so the click landed on the dialog, and its open command did not visibly open the chat either. We have no after-opening number for Tidio. For Zendesk, Box hides the launcher, so the open command sent 22 more requests but nothing visibly changed on screen. Treat 276.9 KB as unverified.
CPU varies far more than bytes
Bytes cost time and data. CPU is what makes a mid-range phone feel sticky. This table shows how much main-thread time each widget's own scripts used on the throttled mobile profile, median of five runs, with the range in brackets. It also shows the change in Total Blocking Time between the normal and blocked runs.
| Widget | Widget script CPU, ms | Change in TBT, ms (p-value) |
|---|---|---|
| HubSpot chat | 1,911 [1,780 to 2,712] | +492 (p = 0.016) |
| LiveChat (Text) | 1,539 [1,093 to 3,160] | +1,080 (p = 0.008) |
| Intercom (Fin messenger) | 1,537 [1,187 to 1,657] | +339 (p = 0.056) |
| Freshchat | 1,124 [1,073 to 1,260] | +199 (p = 0.310) |
| Zendesk | 325 [298 to 355] | +162 (p = 0.008) |
| Talvo | 187 [184 to 252] | not comparable, see below |
| Tawk.to | 115 [95 to 126] | +30 (p = 0.730) |
| Tidio | 114 [105 to 196] | -97 (p = 0.841) |
| Help Scout Beacon | 62 [59 to 88] | +1 (p = 0.802) |
| Crisp | not captured | not captured |
A few readings. The heavy-CPU group (HubSpot, LiveChat, Intercom, Freshchat) spends one to two seconds of main-thread time on a phone profile, while the light group (Help Scout, Tidio, Tawk.to) spends about a tenth of a second. Between HubSpot and Help Scout that is about a 30-fold gap in CPU, against an 18-fold gap in bytes for the same pair (and 20-fold across all ten), and the two are not tightly linked: Tidio downloads 512.6 KB yet used only 114 ms.
Lower p-values mean the with-widget and blocked runs separated more cleanly. With five runs per side, the smallest p-value possible is 0.008, which means complete separation. LiveChat and Zendesk hit that floor, and HubSpot came close at 0.016. Intercom's 339 ms at p = 0.056 is borderline.
Everyone else is "inconclusive", which is not the same as "no effect". Vendor homepages run 20 to 60 other third parties, so the page's own noise is large. On Tidio's page, main-thread time ranged from 7.2 to 22 seconds between runs in the same arm. A 100 ms effect disappears in that. Also, TBT counts only long tasks before the page becomes interactive, and a lot of widget work happens after that.
On desktop with no CPU throttling, nothing stood out except Intercom at +69 ms (p = 0.032, weak evidence). One caution on desktop CPU columns: a widget that runs in a cross-site iframe does its work in a separate process that Lighthouse does not attribute to the page, so a 0 there means "not on the page's main thread", not "free". That is why we ran the mobile profile with Chrome's site isolation off, which is closer to how Chrome on a typical Android phone behaves.
Why Talvo's TBT is not in the comparison
Talvo's measured TBT change was +6 ms on mobile. Please do not line that up against the +1,080 ms or +492 ms above. We tested Talvo on a nearly empty page, and on an empty page a widget's work only counts toward TBT if one single task runs longer than 50 ms. On a busy marketing page, the same work stretches tasks that are already running and counts for much more. The vendors were measured on busy pages, so the two sets of TBT numbers are not the same kind of number.
The comparable columns are bytes and widget script CPU, and on those, Talvo is mid-pack on bytes and low on CPU. We would rather you know the whole picture: across all main-thread work on the plain test page, the page took 428 ms with the Talvo widget against about 70 ms without it, a difference of about 360 ms.
The one LCP result we will quote
We are not quoting Largest Contentful Paint numbers, because Lighthouse's simulated LCP swung by 10 to 30 seconds between runs on several of these pages. One result held up, because the simulated and observed figures agreed. On Intercom's homepage, in 4 of 5 mobile runs with the widget, the text of the OneTrust cookie banner became the LCP element at about 31 seconds in the simulation. It never did that with the widget blocked. The observed, unthrottled LCP also rose from 470 ms to 2,790 ms (p = 0.008). The widget indirectly changed what the browser counted as the page's biggest element. That is a reminder that a widget can affect Core Web Vitals through side effects, not just by being heavy.

What the numbers do not say
Please do not turn this into "LiveChat slows your site by 1,080 ms" in a slide deck. That is the difference on LiveChat's own marketing page, under a simulated phone, on one evening. On your page, the number will be different.
Some other limits worth keeping in view:
- Crisp's CPU is missing. Its widget requests start about 8.7 seconds after navigation, after Lighthouse stopped recording. Only its 3 KB loader was captured, so its CPU and TBT figures leave out the widget. Bytes come from the separate 30-second window.
- Tidio and Zendesk after-open figures are missing and unverified, as above.
- Widget configuration differs. Proactive messages, AI greetings, sounds and attention grabbers are all configured per site. A vendor's homepage shows one setup, not the minimum.
- Region matters. On the pages we tested, cookie banners did not stop the widgets from loading in this US-located test. Visitors in the EU may get a consent-gated load that behaves differently. We did not click any banner.
- Five runs per arm is a small sample. At these noise levels, a 50 to 150 ms effect on a busy page can't be resolved.
- Talvo shipped a new build mid-test. The bundle hashes changed, but transfer sizes stayed within 1 KB.
The test also registered roughly 40 synthetic visitor sessions in Talvo's own workspace. No forms were submitted and no chat messages were sent.
Where Talvo's widget is wasteful
You are reading a post on a vendor's blog, so here are the weak spots in our own widget, as the data shows them today.
That is why a plain page pays 280.1 KB before anyone clicks. The chat iframe loads a vendor bundle of about 211 KB compressed, an app script of about 36 KB and a stylesheet of about 13 KB. The loader itself is served uncompressed (12.0 KB) with cache-control: no-cache, so the browser revalidates it on every page view.
Opening the chat was also heavier than it should have been. In our October 21 runs it fetched the full help-article list (about 100 KB) and roughly 60 KB of code written for Talvo's marketing pages that a visitor in the chat panel never sees. Since then, Talvo changed the widget so opening it fetches only a few starter article titles, under 1 KB, and the full list loads when a visitor opens the Help tab. The 163.0 KB "after opening" figure in the table was measured before that change; we'll re-run the test and update it.
The widget also kept talking after it loaded. In our runs it checked for matching proactive campaigns about every 3 seconds and sent a heartbeat about every 20 seconds, roughly 20 small requests per minute for an open tab. Each one was around 390 bytes, so the bandwidth was trivial, but on a phone the requests keep the radio busy. Talvo has since changed the campaign check: the widget asks once, a few seconds after the page loads, and asks again only at the time a campaign for that page could next match, or stops if none can. The heartbeat is unchanged.

On the credit side, the CPU is modest. 187 ms of script time on the throttled phone profile is lower than five of the competitors we could compare. The chat interface lives in its own iframe, so your page's CSS can't restyle it and its styles can't leak into your page.
Test your own site in an afternoon
Our numbers describe our test pages. The only numbers that matter for your decision are the ones from your own pages, and the method is cheap. Lighthouse's variability guide says the median Lighthouse score of five runs is twice as stable as a single run. That is why we used five runs per arm, and it is a sensible minimum for your own test.
- Pick a representative pageUse a real page with your usual tags and consent banner, not an empty test page. Test your pricing or product page, since that is where chat matters.
- Find the widget's URLsOpen DevTools, load the page, and list the requests from the chat vendor's domains in the Network tab. Note the host patterns, such as
*widget.example.com*. - Run it normally, five times
npx lighthouse https://yoursite.com/page --only-categories=performance --output=json --output-path=./with-1.json, then repeat for runs 2 to 5. Add--preset=desktopfor the desktop profile. - Run it blocked, five timesSame command plus
--blocked-url-patterns='*widget.example.com*'. Repeat the pattern flag for each host. Alternate normal and blocked runs so drift hits both. - Compare mediansTake the median TBT, total byte weight and script time for each arm. Judge whether the gap is bigger than the spread within each arm. If the ranges overlap heavily, you have your answer: the effect is smaller than your page's noise.
- Open the chat and record itIn the DevTools Performance panel, record while you click the launcher and send a message. Look for long tasks attributed to the vendor's scripts. This is the cost Lighthouse's load test does not capture.
You can do the A/B by hand without the command line. In Chrome DevTools, the Request conditions drawer (formerly Network request blocking) lets you add URL patterns with * wildcards and block them, then re-run the Lighthouse panel. WebPageTest also supports blocking requests by URL substring, running multiple runs and a repeat view for the warm-cache case.
Two version notes. Lighthouse 13 removed the third-party-facades audit with no replacement, and replaced the older "Reduce the impact of third-party code" audit with a third-parties insight. If a guide tells you to look for an audit that your Lighthouse doesn't show, that is probably why. State your Lighthouse version whenever you report results.
Also, lab tests are not your Core Web Vitals. Google's field data, from the Chrome UX Report, covers a 28-day window and only sites with enough traffic, and it can't isolate one script. If you want to know whether chat moved your real-visitor numbers, you need weeks of before-and-after traffic, and a small site may not have data at all.
How to shrink any widget's cost
If your test shows a real cost, the fix rarely means dropping chat. It usually means changing when the widget loads.
Load it after the page is done. An async script tag keeps the widget from blocking HTML parsing, but it still competes for the network and the main thread during load. Starting it from a load handler, or from idle time, moves the cost behind the content your visitor came for. Our guide to adding live chat shows how to do this in Next.js, and the install help article covers the standard snippet.
Use a facade. Google's third-party facades guidance describes a static placeholder that looks like the widget, warms up the connection when the visitor hovers, and swaps in the real widget only when they click. It lists Intercom, Drift, Help Scout and Facebook Messenger as chat embeds that suit the pattern. The catch is lost behavior: a facade can't show an unread-message badge or fire a proactive message until the real widget is loaded. We have not tested a facade with Talvo's loader, so we are not claiming it works.
Load it where chat earns its keep. Chat on every page is not mandatory. Pricing, product and signup pages are where a question tips a decision, while a long blog archive may not need a widget. Remember that the cost applies whether the thing in the corner is a chatbot or live chat, so decide what you need first. Our post on chatbot vs live chat helps with that.
- Moves all of the widget's bytes and CPU out of the page load
- Pays nothing on pages where nobody ever opens the chat
- Proactive messages and AI greetings can't fire before the widget loads
- An unread-message badge can't show until the real script is in
- The first click has a short delay while the widget downloads
- Run the five-and-five blocked-URL test on your own busiest page
- Check what loads before a click and what loads after
- Look at CPU on a mobile profile, not just bytes
- Ask whether you need chat on every page, or only on a few
- Decide which features you would lose by loading on click
- Retest after the vendor ships an update
If you are still choosing a tool, speed is one input among several. The best live chat software for small business comparison weighs price, channels and AI against each other.
If you want to see the widget for yourself, the messenger page shows what it does, and the cheapest way to judge its weight is to run the test above against it.
Frequently asked questions
Does a live chat widget slow down my website?
Every widget downloads and runs code, so it adds work. In our lab test, the amount ranged from 49.4 KB to 1,003.8 KB before a click, and from 62 ms to 1,911 ms of script time on a simulated phone. Whether visitors notice depends on the widget, your page and your visitors' devices, so measure your own page.
Which live chat widget is the lightest?
Before any click, Help Scout's Beacon was the lightest we measured at 49.4 KB, followed by Crisp at 127.6 KB and Tawk.to at 258.4 KB. Talvo was 280.1 KB. Crisp's site delays its widget by about 8.7 seconds, and Help Scout loads 243.1 KB more when a visitor opens it, so the lightest start is not the lightest total.
Does live chat affect SEO or Core Web Vitals?
It can, through page speed and side effects. We did not measure rankings or Core Web Vitals. In one case, Intercom's widget changed which element counted as the largest contentful paint, raising observed LCP from 470 ms to 2,790 ms. Lab tests like ours cannot show your real-visitor numbers; those come from field data over a 28-day window.
How do I test my site with and without a chat widget?
Run Lighthouse five times normally and five times with the widget's URLs blocked using the --blocked-url-patterns option, alternating the two, then compare medians. You can also block the widget's requests in Chrome DevTools' Request conditions drawer. Compare the gap with the spread inside each group before drawing a conclusion.
How do I lazy load a chat widget?
Start the widget's script after the page has loaded or when the browser is idle, or use a facade: a static placeholder that warms up the connection on hover and loads the real widget on click, as Google's third-party facades guidance describes. The trade-off is that proactive messages and unread badges cannot appear until the real widget loads. We have not tested a facade with Talvo's loader.
Is async loading enough to stop a chat script slowing my page?
No. An async script does not block HTML parsing, but it still uses the network and main thread while your page loads. Talvo's snippet is async, yet in our test the widget still downloaded 280.1 KB before a click and used 187 ms of script time on a simulated phone.
Why does PageSpeed Insights flag my chat widget?
Third-party scripts count toward main-thread time and byte weight, and chat widgets are often among the heaviest. Lighthouse 13 replaced the old third-party code audit with a third-parties insight and removed the third-party-facades audit, so the audit name depends on your Lighthouse version.
How heavy is Talvo's widget?
On a plain page with only our snippet, Talvo downloaded 280.1 KB before a click and 163.0 KB more on open, 443.3 KB in total, with 187 ms of widget script time on a simulated mid-range phone. That is lighter than six of the other widgets and heavier than Tawk.to, Crisp and Help Scout. The widget loads the full app bundle and is not deferred.
Sources
Other products' prices and features change. We checked these pages; if something is out of date, tell us and we'll fix it.
- Lighthouse readme: --blocked-url-patterns and presets
- Lighthouse variability guide (median of runs)
- What's new in Lighthouse 13 (third-party audits changed)
- Lazy load third-party resources with facades (Chrome / web.dev guidance)
- Chrome DevTools: block network requests
- WebPageTest instant tests (Catchpoint docs)
- Chrome UX Report methodology
- Page tested: Intercom
- Page tested: Crisp
- Page tested: Tidio
- Page tested: LiveChat
- Page tested: Zendesk messaging widget on Box's help center
- Page tested: Help Scout Beacon on Help Scout docs
- Page tested: HubSpot
- Page tested: Tawk.to
- Page tested: Freshchat on the Freshdesk product page
- Talvo: install the chat widget




