zważyliśmy 7 widgetów czatu

Postawiliśmy siedem widgetów czatu na tej samej stronie i zmierzyliśmy wszystko, co każdy ściąga, zanim odwiedzający czegokolwiek dotknie. Spookat zrobił 1 request i przesłał 2,0 kb. Pozostałe robiły do 23 requestów i przesyłały do nieco ponad 1 mb, zależnie od widgetu i od tego, czy w ogóle pozwolił sobie wystartować. Oto liczby, skąd się wzięły i co znaczą dla twojej strony.
w skrócie
Każda liczba poniżej to mediana z 7 przebiegów, zmierzona 27 września 2026 w Chrome 153, za każdym razem z pustym cache i świeżym profilem. Wiersz Spookata zmierzyliśmy jeszcze raz później tego ranka, po trzech zmianach: widget dostał poprawki, przez które przytył o pół kilobajta (czat otwiera się szybciej, nigdy nie zasłania dolnego paska sklepu i przechodzi axe na czysto), potem launcher, który niesie tylko styl danej strony zamiast wszystkich ośmiu, a do tego chudsze nagłówki odpowiedzi. Razem zeszło to z launcherem z 2,1 kb do 2,0. „Przesłane” to to, co przyszło przez sieć, skompresowane. „Po rozpakowaniu” to to, co przeglądarka musiała rozpakować, sparsować, a w przypadku JavaScriptu także wykonać.
Na naszej stronie testowej, bez liczenia samej strony:
| widget | requesty | przesłane | po rozpakowaniu | wystartował u nas |
|---|---|---|---|---|
| Spookat | 1 | 2,0 kb | 3,4 kb | tak |
| Tawk.to | 18 (+1 websocket) | 255,8 kb | 730,1 kb | tak |
| Tidio | 10 (+1 websocket) | 510,9 kb | 1166,4 kb | tak |
| Intercom | 6 | 285,6 kb | 1192,9 kb | nie, domena niedozwolona |
| Crisp | 6 (+1 websocket) | 102,6 kb | 406,9 kb | nie, „Invalid website” |
| LiveChat | 4 | 38,1 kb | 114,3 kb | nie, domena niedozwolona |
| Chatwoot | 2 | 6,2 kb | 21,5 kb | nie, iframe zablokowany |
Na stronie samego vendora, licząc tylko requesty widgetu:
| widget | requesty | przesłane | po rozpakowaniu |
|---|---|---|---|
| Intercom (intercom.com) | 19 (+1 websocket) | 1006,3 kb | 4473,7 kb |
| LiveChat (livechat.com) | 23 (+1 websocket) | 358,0 kb | 1138,6 kb |
| Crisp (crisp.chat) | 12 (+1 websocket) | 121,1 kb | 444,4 kb |
| Chatwoot (help center chatwoot.com) | 27 (+1 websocket) | 864,1 kb | 3079,8 kb |
Te dwie tabele mierzą różne rzeczy, a następna sekcja tłumaczy, czemu w ogóle są dwie.
czemu dwie tabele
Użyliśmy snippetu instalacyjnego z dokumentacji każdego vendora i id widgetu, które vendor sam trzyma na swojej stronie głównej. Nigdzie nie zakładaliśmy kont. Cały setup jest w jak testujemy.
Cztery z sześciu konkurentów sprawdzają domenę, na której działają, a id, których mogliśmy użyć, należą do stron vendorów. Na naszej stronie testowej Crisp pokazuje więc czerwone „Invalid website”, serwer Intercomu odpowiada 403, LiveChat loguje, że domena nie jest dozwolona, i się wyłącza, a okno czatu Chatwoota blokuje jego własna polityka bezpieczeństwa. To, co te cztery ładują, zanim się poddadzą, jest prawdziwe i jest w pierwszej tabeli. To jednak dolna granica, a nie pełna waga.
Dla tych czterech załadowaliśmy więc też stronę główną vendora, jak każdy odwiedzający, i policzyliśmy tylko requesty pod własne adresy widgetu. Każdy policzony URL jest w surowych danych. To druga tabela. Przychodzi z ustawieniami vendora: Intercom wypycha na swojej stronie wiadomość do nowych odwiedzających, LiveChat pokazuje kartę powitalną, a zwykła instalacja na twojej stronie może ładować trochę mniej albo trochę więcej.
Crisp wymaga przypisu. Na crisp.chat jego widget po kilku wizytach z rzędu przestał startować dla naszej maszyny. Z 90 sekundami przerwy między wizytami startował za każdym razem, a 7 przebiegów z tabeli wyszło identycznie.
spookat: 1 request, 2,0 kb
Launcher to jeden skrypt z cdn.spookat.com: 3478 bajtów JavaScriptu, 1772 bajty po kablu z brotli, 2,0 kb razem z nagłówkami odpowiedzi. Rysuje przycisk w shadow root, trzyma go z dala od dolnego paska strony, sprawdzając układ najwyżej co 300 ms, i czeka.
To cała lista. Żadnego drugiego requestu, websocketu, fontu, obrazka ani wywołania api.spookat.com. Panel czatu (16,8 kb po gzipie) i CSS stylu (około 2 kb) ładują się dopiero, gdy ktoś wciśnie przycisk, a połączenie z naszym serwerem dopiero po kliknięciu. Nic nie ląduje w cookies, localStorage, sessionStorage ani IndexedDB, ani przed kliknięciem, ani po nim, dopóki odwiedzający nie wyśle wiadomości. Wtedy to jeden klucz w localStorage z losowym tokenem czatu, i dalej żadnych cookies.
Jeden uczciwy szczegół: cdn.spookat.com jest nasz. Kiedy serwuje launcher, sam mówi naszemu API, że załadował się launcher z tym kluczem strony, żebyśmy mogli powiedzieć właścicielowi, że snippet działa. Przeglądarka odwiedzającego nie robi do tego żadnego requestu do naszego API i żaden adres IP nie jest zapisywany.
tawk.to: 18 requestów, 255,8 kb
Tawk.to startuje wszędzie, więc to jego pełna waga na prawdziwej stronie. Pierwszy request to loader na 1 kb. Po nim idzie twk-main.js (121 kb przesłane, 325 kb po rozpakowaniu), dwa pliki językowe, ustawienia widgetu i start sesji z va.tawk.to, potem osiem kolejnych chunków skryptu, cztery arkusze stylów i SVG do dymka „we are here”. Otwiera też websocket do serwera tawk.to.
Dziewięć z 18 requestów to JavaScript: 213 kb przesłane, 580 kb do sparsowania. Przed jakimkolwiek kliknięciem Tawk.to ustawia trzy cookies na domenie samej strony (jedno trzymane 180 dni) i zapisuje dwa klucze w localStorage i jeden w sessionStorage.
tidio: 10 requestów, 510,9 kb
Własny widget Tidio jest na tidio.com ustawiony jako ukryty, więc nasza strona przed kliknięciem wołała udokumentowane tidioChatApi.show(), żeby pokazać zwykły launcher. Cała reszta to standardowa instalacja.
Tidio to najcięższy widget, który startuje na naszej stronie. Dwa duże skrypty (228 kb i 154 kb przesłane), dwa fonty (27 kb i 73 kb) i dwa pliki dźwiękowe (7,5 kb i 28,6 kb), czyli dźwięki powiadomień, pobrane, zanim cokolwiek mogło zadźwięczeć. Jeden websocket do socket.tidio.co. Zero cookies, jeden klucz w localStorage ze stanem widgetu.
intercom: 285,6 kb odrzucony, 1 mb na intercom.com
Na naszej stronie Intercom ładuje loader na 2,5 kb, potem frame-modern.js (192 kb przesłane, 858 kb po rozpakowaniu) i vendor-modern.js (95 kb, 358 kb), pyta o ustawienia launchera i dostaje 403 na pingu: domena niedozwolona. To 285,6 kb, zanim się zatrzyma, i 1,19 mb JavaScriptu do sparsowania.
Na intercom.com startuje w pełni: pięć kolejnych dużych paczek skryptów, obrazki, websocket, a około 14. sekundy wiadomość, którą strona Intercomu wypycha do nowych odwiedzających, z własnym skryptem i dźwiękiem powiadomienia. Razem 19 requestów, 1006,3 kb przesłane i 4,47 mb po rozpakowaniu, z czego 4,38 mb to JavaScript. Część z tego to wypchnięta wiadomość. Większość nie: po 3 sekundach, przed wiadomością, widget miał już ponad 950 kb.
Przed jakimkolwiek kliknięciem na intercom.com widget ustawił trzy cookies na domenie strony: id i id urządzenia trzymane 270 dni oraz sesję trzymaną 7 dni.
crisp: 102,6 kb odrzucony, 121,1 kb na crisp.chat
Crisp to najlżejszy z konkurentów, których widzieliśmy w akcji. Na naszej stronie ładuje loader, skrypt na 76 kb, arkusz stylów na 14 kb (130 kb po rozpakowaniu), plik językowy i font, otwiera websocket, a potem pokazuje „Invalid website”. Na crisp.chat pełny start dokłada ustawienia strony, drugą grubość fontu i cztery małe avatary: 12 requestów, 121,1 kb.
Przed jakimkolwiek kliknięciem na crisp.chat ustawił jedno cookie na domenie strony, trzymane 182 dni, i cztery klucze w localStorage.
livechat: 38,1 kb odrzucony, 358 kb na livechat.com
Loader LiveChata ma 36 kb. Na naszej stronie pobiera region i konfigurację, widzi, że domena nie jest dozwolona, i staje na 38,1 kb. Na livechat.com idzie dalej: lokalizacja, iframe z secure.livechatinc.com, 15 kolejnych skryptów widgetu i token klienta: 23 requesty, 358 kb przesłane, 1,14 mb po rozpakowaniu. Jeden websocket.
Jego cookies mieszkają na accounts.livechatinc.com, czyli domenie trzeciej z punktu widzenia strony: dwa partycjonowane cookies trzymane 400 dni, ustawione przed kliknięciem. Iframe widgetu zapisuje też cztery klucze w localStorage i jeden w sessionStorage.
chatwoot: 6,2 kb odrzucony, 864 kb na chatwoot.com
Na naszej stronie Chatwoot ładuje swoje SDK na 6 kb i próbuje otworzyć iframe z czatem, który blokuje jego własna polityka frame-ancestors. To całe 6,2 kb.
Strona główna Chatwoota nie załadowała widgetu w żadnej z naszych trzech prób, więc użyliśmy help center Chatwoota na tej samej domenie, gdzie ładował się za każdym razem. Widget ściąga tam swoje SDK, dokument iframe, 15 skryptów i 2 arkusze stylów z CDN na CloudFront, pięć wywołań swojego API, avatar i jeden websocket: 27 requestów, 864,1 kb przesłane, 3,08 mb po rozpakowaniu.
Większość z tego to dwie rzeczy. Arkusz stylów widgetu to 153 kb przesłane i 1,57 mb po rozpakowaniu. A 491 kb to jeden plik JSON z artykułami z help center, który widget pobiera, żeby pokazać sześć z nich na swoim ekranie startowym; z zablokowanym widgetem strona w ogóle o niego nie prosi. Pięć skryptów załadowało już wcześniej samo help center, zbudowane zresztą na Chatwoocie, więc przyszły z cache i liczą się jako 0 przesłanych. Traktuj ten wiersz jako dolną granicę.
Przed jakimkolwiek kliknięciem Chatwoot ustawił cookie trzymane 365 dni na domenie strony i cookie sesyjne na app.chatwoot.com oraz zapisał sześć kluczy w localStorage.
z czego są te bajty
W podziale na typy, dla każdego widgetu w stanie, w którym w pełni wystartował (nasza strona testowa dla Spookata, Tawk.to i Tidio, strona vendora dla reszty), przesłane / po rozpakowaniu:
| widget | JavaScript | CSS | fonty | dźwięki i obrazki | wywołania API |
|---|---|---|---|---|---|
| Spookat | 2,0 / 3,4 kb | brak | brak | brak | brak |
| Tawk.to | 213 / 580 kb | 24 / 101 kb | brak | 7 / 22 kb | 11,5 / 28 kb |
| Tidio | 377 / 1034 kb | brak | 99 / 98 kb | 35 / 35 kb | brak |
| Crisp | 83 / 272 kb | 14 / 130 kb | 11 / 10 kb | 5 / 4 kb | 8 / 29 kb |
| Intercom | 938 / 4379 kb | brak | brak | 54 / 53 kb | 14 / 42 kb |
| LiveChat | 355 / 1136 kb | brak | brak | brak | 3 / 3 kb |
| Chatwoot | 203 / 1042 kb | 150 / 1533 kb | brak | 13 / 12 kb | 484 / 480 kb |
Wszędzie większość to JavaScript, a to ważne, bo tylko ten rodzaj bajtów kosztuje czas procesora ponad czas pobierania. Dwa wiersze łamią ten wzór: Tidio wydaje mniej więcej ćwierć swojej wagi na fonty i dźwięki powiadomień, a największe pojedyncze rzeczy Chatwoota to arkusz stylów i lista artykułów pomocy.
kiedy przychodzą bajty
Waga to tylko połowa. Druga połowa to moment, w którym przychodzi, bo widget, który ściąga się, gdy twoja strona jeszcze się ładuje, konkuruje z twoimi obrazkami i skryptami o to samo łącze.
Na naszej stronie testowej Tawk.to zrobił pierwszy request 98 ms po starcie nawigacji, a ostatni po 925 ms. Tidio zaczął po 28 ms i skończył po 787 ms. Oba ładują się w tej samej sekundzie co sama strona. Na stronach vendorów timing zależy od strony: intercom.com odpala widget po 1,4 s (snippet Intercomu czeka na event load strony), livechat.com po 0,26 s, help center chatwoot.com po 1,2 s, a crisp.chat trzyma swój widget aż do około 8,7 s. Ostatni request Intercomu przyszedł po 14,3 s, razem z wypchniętą wiadomością.
Jedyny request Spookata przyszedł po 107 ms (mediana z 7 przebiegów) i nic po nim nie było.
jak wystarczają 2 kb
Launcher przed kliknięciem musi zrobić dwie rzeczy: pokazać przycisk i wiedzieć, co załadować po jego naciśnięciu. Nasz robi dokładnie to.
- Przycisk i jego CSS siedzą w tym jednym skrypcie, narysowane w shadow root, więc style strony go nie dosięgną, a jego style nie wyciekną na zewnątrz.
- Wygląd strony (styl, kolor, strona ekranu, napis) wpisuje do skryptu nasz CDN, osobno dla każdej strony, więc nie ma requestu o ustawienia. Tak samo CSS stylu danej strony: skrypt niesie styl domyślny plus ten jeden, a nie wszystkie osiem.
- Skrypt zna nazwy plików panelu czatu i arkusza stylów twojego stylu. Kiedy ktoś wciśnie przycisk, zaczyna pobierać oba. To pierwszy moment, kiedy cokolwiek innego się pobiera.
- Nasz build mierzy launcher tak, jak dostają go odwiedzający, wypełniony i po gzipie, i się wywala, jeśli przekroczy 4 kb.
co te liczby znaczą dla twojej strony
Najdroższy jest JavaScript po rozpakowaniu. Przesłane bajty płaci pakiet danych odwiedzającego. JavaScript po rozpakowaniu płaci procesor jego telefonu: każdy bajt jest parsowany i kompilowany, a kod startowy chodzi na tym samym wątku, który obsługuje dotyk i scroll. 730 kb JavaScriptu od Tawk.to albo 4,4 mb od Intercomu na jego własnej stronie to robota, którą średni telefon wykonuje przy każdym wyświetleniu strony, także dla każdego, kto nigdy nie otworzy czatu.
Każda nowa domena kosztuje połączenie. Request do domeny, z którą strona jeszcze nie gadała, potrzebuje zapytania DNS, połączenia TCP i handshake’u TLS, zanim przyjdzie pierwszy bajt. Na telefonie przy słabym zasięgu każde z nich to round trip. Pełne starty Intercomu i LiveChata gadają z czterema hostami każdy.
Websocket przed kliknięciem to połączenie trzymane dla nikogo. Każdy konkurent otworzył go przed kliknięciem, kiedy już mógł wystartować. Spookat nie otwiera żadnego aż do kliknięcia.
Storage przed kliknięciem ma konsekwencje. Cookies i local storage zapisane, zanim ktokolwiek dotknie widgetu, to rzecz, nad którą musi się zastanowić twój baner cookies. Porządnie przejdziemy przez to w teście cookies.
co mierzą kolejne testy
Czy którakolwiek z tych rzeczy spowalnia twoją stronę w sposób, który userzy czują, to inne pytanie. Bajty to nie milisekundy, zwłaszcza kiedy widget ładuje się, gdy strona jest już interaktywna. To test Lighthouse. Jak szybko otwiera się czat, kiedy ktoś jednak kliknie, to test klik do otwarcia. Oba są w tej serii.
sprawdź sam
Surowe dane leżą w /research/weigh-in-2026-09.json: każdy przebieg, każdy request z hostem, ścieżką, typem, statusem i rozmiarami, każdy websocket, dokładne snippety i id widgetów, wersje Chrome i narzędzi. Strona cookies i storage jest w /research/cookies-2026-09.json.
Skrypty, które je wyprodukowały, są pod /research/widget-lab/: bun run weigh-in powtarza cały test. Nie potrzebujesz ich jednak, żeby sprawdzić widget. Otwórz stronę vendora albo swój staging, otwórz DevTools, zaznacz „Disable cache”, przeładuj i przefiltruj zakładkę Network po domenach widgetu. Poczekaj 25 sekund, zanim odczytasz sumę: kilka widgetów ładuje się długo po tym, jak strona wygląda na gotową. Nasz poradnik o dodaniu czatu bez spowalniania strony pokazuje krok po kroku, gdzie patrzeć.
no to który
Jeśli waga przed kliknięciem ma dla ciebie znaczenie, różnica jest duża. 2,0 kb Spookata to mniej niż sam loader każdego testowanego widgetu poza Tawk.to, którego pierwszy request ma 1 kb: loader Intercomu ma 2,5 kb, Tidio 3,0, Crispa 3,3, Chatwoota 6,4, a LiveChata 36. I od 60 do 510 razy mniej niż to, co pozostałe przesyłają, kiedy już działają. To nie przypadek tego testu: launcher ma budżet 4 kb, który wywala nam build, a cała reszta czeka na kliknięcie.
Wrzuć wersję na 2 kb na swoją stronę: 14 dni za darmo, bez karty.