Wdróż widget Meetlead
Skonfiguruj witrynę, osadź skrypt i bezpiecznie połącz anonimowe wizyty z kontami zalogowanych klientów.
Szybki start
Integracja w czterech krokach
To minimalna ścieżka od pustej konfiguracji do pierwszej testowej rozmowy.
- 01Utwórz witrynę
Otrzymasz osobny
clientIddla tej konfiguracji. - 02Dodaj domeny
Wpisz każdy dokładny host, na którym działa widget.
- 03Wklej skrypt
Dodaj jeden tag do kodu strony lub głównego layoutu.
- 04Wyślij wiadomość
Potwierdź, że rozmowa pojawia się w Skrzynce Meetlead.
Konfiguracja
Konfiguracja witryny
Witryna określa domeny, wygląd, reguły i kontekst danych odwiedzających.
- Otwórz Ustawienia → Witryny
Wybierz istniejącą witrynę albo utwórz nową dla serwisu, na którym instalujesz widget.
- Dodaj dozwolone domeny
Wpisuj dokładne hosty bez ścieżek.
sklep.pliwww.sklep.pldodaj osobno. Wildcardy nie są obsługiwane. - Skopiuj clientId
Każda witryna ma własny publiczny identyfikator. Nie używaj clientId innej witryny, bo dane trafią do niewłaściwego kontekstu.
Dodaj również host środowiska staging. W produkcji usuń domeny, których nie używasz.
Osadzenie
Instalacja widgetu
Wklej skrypt w sekcji <head>. Atrybut async sprawia, że widget nie blokuje renderowania treści.
<script
src="https://widget.meetlead.eu/widget.js"
data-client-id="TWÓJ_CLIENT_ID"
async
></script>TWÓJ_CLIENT_ID wartością skopiowaną z wybranej witryny. clientId jest publiczny — nie jest sekretem.WordPressbez modyfikowania widgetu
Dodaj bazowy snippet przez narzędzie do kodu w nagłówku albo w pliku header.php motywu potomnego, przed </head>. Po zmianie wyczyść cache strony.
React / Vue / inne SPAnajprostsza ścieżka
Dodaj bazowy snippet raz w głównym pliku HTML aplikacji. Nie montuj go ponownie przy każdej zmianie routingu.
Next.jsApp Router i Pages Router
import Script from 'next/script';
export default function RootLayout({ children }) {
return (
<html lang="pl">
<body>
{children}
<Script
src="https://widget.meetlead.eu/widget.js"
data-client-id="TWÓJ_CLIENT_ID"
strategy="afterInteractive"
/>
</body>
</html>
);
}import Script from 'next/script';
import type { AppProps } from 'next/app';
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Component {...pageProps} />
<Script
src="https://widget.meetlead.eu/widget.js"
data-client-id="TWÓJ_CLIENT_ID"
strategy="afterInteractive"
/>
</>
);
}Sprawdź uruchomienie
- odśwież stronę bez aktywnego blokowania cache,
- sprawdź, czy launcher Meetlead pojawił się w wybranej pozycji,
- w narzędziach deweloperskich potwierdź pobranie
widget.js, - wyślij testową wiadomość i sprawdź rozmowę w Skrzynce.
Klienci
Połącz wizytę z klientem
Po zalogowaniu lub rejestracji wywołaj meetlead.identify(). Stabilny userId przypisuje wizyty i zdarzenia do profilu w bieżącej witrynie. Sekret i podpis HMAC nie są wymagane.
Wynik accepted potwierdza przypisanie profilu, a nie uprawnienie do czytania rozmów. Dostęp do wcześniejszych rozmów wymaga zweryfikowanej sesji albo podpisanej tożsamości. Gdy odzyskiwanie kodem e-mail jest dostępne dla Witryny, wymaga osobnej weryfikacji i daje dostęp wyłącznie do dozwolonych wątków.
Krok 1. Pobierz profil aktywnego konta
Udostępnij profil przez endpoint wymagający zalogowania. Zwracaj stabilny identyfikator zapisany w bazie i stosuj Cache-Control: no-store.
// Endpoint wymaga aktywnej sesji użytkownika.
// Nie używaj identyfikatora przekazanego w body żądania.
response.setHeader('Cache-Control', 'no-store');
return {
userId: String(authenticatedUser.id),
email: authenticatedUser.email,
name: authenticatedUser.name
};Krok 2. Przekaż tożsamość w przeglądarce
Wywołaj integrację po ustaleniu zalogowanego użytkownika. Ten wariant działa również wtedy, gdy asynchroniczny skrypt widgetu jeszcze się ładuje.
(() => {
const identity = {
userId: currentUser.userId,
email: currentUser.email,
name: currentUser.name,
attributes: { plan: currentUser.plan }
};
const options = {
requestId: crypto.randomUUID(),
onResult(result) {
// accepted potwierdza zapis profilu; nie daje dostępu do historii.
if (result.status === 'accepted') console.log('Profil przypisany');
}
};
const meetlead = window.meetlead || (window.meetlead = { q: [] });
if (typeof meetlead.identify === 'function') {
meetlead.identify(identity, options);
} else {
meetlead.q.push(['identify', identity, options]);
}
})();| Pole | Wymaganie | Zastosowanie |
|---|---|---|
email | e-mail lub userId | kontakt i wyszukiwanie klienta |
userId | e-mail lub userId | stabilny identyfikator z Twojego systemu |
userHash | opcjonalny, starsze integracje | podpisana identyfikacja; sekret pozostaje na backendzie |
name, phone, company | opcjonalne | dane widoczne przy profilu i rozmowie |
attributes | opcjonalne | do 20 własnych atrybutów tekstowych, liczbowych lub logicznych |
Potwierdzenie i ponawianie
onResult zwraca accepted, rejected albo timeout oraz requestId, clientId i identityVerified. Zapisuj lokalny znacznik przypisania dopiero po pasującym potwierdzeniu. Błąd sieci ponów bez wylogowania; późny wynik starego konta ignoruj. Scalanie przez operatora nie nadaje dostępu do historii w przeglądarce.
Wylogowanie użytkownika
Po wylogowaniu z Twojej aplikacji wyczyść również tożsamość Meetlead. Następna osoba korzystająca z tej samej przeglądarki otrzyma nową sesję odwiedzającego.
(() => {
const meetlead = window.meetlead || (window.meetlead = { q: [] });
if (typeof meetlead.logout === 'function') {
meetlead.logout();
} else {
meetlead.q.push(['logout']);
}
})();Architektura
Wiele witryn, osobne profile klientów
Każda witryna ma własny clientId, domeny, konfigurację widgetu i odseparowane dane operacyjne.
- używaj clientId odpowiadającego domenie, na której działa skrypt,
- ten sam userId przypisuje profil tylko w bieżącej witrynie; profile różnych witryn pozostają osobne,
- stan widgetu i sesja odwiedzającego są przechowywane osobno dla każdego clientId.
Wyniki
Cele i ocena obsługi
Te integracje są opcjonalne. Cel zapisuj po wyniku biznesowym, a CSAT wyłącznie po świadomym wysłaniu oceny przez klienta.
// Cel musi być wcześniej utworzony i aktywny w Meetlead.
(() => {
const meetlead = window.meetlead || (window.meetlead = { q: [] });
const goalOptions = { value: 249, currency: 'PLN' };
if (typeof meetlead.goal === 'function') {
meetlead.goal('purchase', goalOptions);
} else {
meetlead.q.push(['goal', 'purchase', goalOptions]);
}
})();Klucz celu używa małych liter, cyfr oraz znaków ., _ i -. Waluta ma trzyznakowy kod, np. PLN lub EUR.
Ocena obsługi po rozmowie
Podłącz funkcję do formularza oceny. Nie wywołuj jej automatycznie przy zakupie, wyświetleniu strony ani zakończeniu rozmowy.
function submitMeetleadCsat(score, comment) {
const meetlead = window.meetlead || (window.meetlead = { q: [] });
if (typeof meetlead.csat === 'function') {
meetlead.csat(score, comment);
} else {
meetlead.q.push(['csat', score, comment]);
}
}
// Wywołaj dopiero po świadomym wysłaniu oceny 1–5 przez klienta.
// submitMeetleadCsat(customerScore, customerComment);Produkcja
Prywatność i bezpieczeństwo
Dopasuj rejestrowanie zachowania, sposób uruchamiania widgetu i politykę CSP do zasad obowiązujących w Twoim serwisie.
W Widget Studio ustaw selektory pól i obszarów, które mają być maskowane lub wyłączone z nagrań.
Opisz zakres działania Meetlead oraz dane, które przekazujesz przez formularze i identify().
Jeśli konfiguracja wymaga zgody, załaduj skrypt dopiero po jej uzyskaniu w używanym CMP.
Content Security Policy
Jeśli serwis używa CSP, dodaj źródła Meetlead do istniejących dyrektyw. Nie zastępuj całej swojej polityki gotowym nagłówkiem.
| Dyrektywa | Źródła Meetlead | Zastosowanie |
|---|---|---|
script-src | https://widget.meetlead.eu | widget.js oraz doładowywane w tle widget-recorder.js, widget-heatmap.js i widget-call.js |
connect-src | https://api.meetlead.eu wss://api.meetlead.eu https://fonts.googleapis.com | konfiguracja, połączenie realtime i pobranie definicji fontów |
font-src | https://meetlead.eu https://fonts.gstatic.com | fonty interfejsu widgetu (Plus Jakarta Sans, JetBrains Mono, Material Symbols) |
media-src | blob: | odtwarzanie nagrań rozmów w widgecie |
Widget umieszcza swój arkusz CSS w Shadow DOM. Polityka blokująca style inline może zatrzymać renderowanie interfejsu. Nie dodawaj szerokiego 'unsafe-inline' bez analizy — najpierw przetestuj integrację w trybie Report-Only i dopasuj politykę bezpieczeństwa swojego serwisu.
img-src.connect-src, dopisz też adresy serwerów STUN/TURN podane w panelu.Checklista przed publikacją
- Produkcyjny host znajduje się na liście dozwolonych domen.
- Skrypt używa clientId właściwej witryny.
- Po wylogowaniu, zmianie konta i wygaśnięciu sesji wywoływane jest meetlead.logout().
- Pola wrażliwe są zamaskowane lub wyłączone z nagrań.
- Testowa rozmowa i identyfikacja są widoczne w panelu.
Pomoc
Najczęstsze problemy
Zacznij od komunikatów w konsoli przeglądarki i ustawień wybranej witryny.
Widget nie pojawia się na stronie
Sprawdź, czy skrypt pobrał się bez błędu, czy ma poprawny clientId oraz czy widget jest włączony w Widget Studio.
Konsola zgłasza niedozwoloną domenę
Dodaj dokładny host bieżącej strony do witryny. Hosty z www i bez www są różnymi wpisami.
Ten sam userId ma osobne profile w kilku witrynach
To oczekiwane zachowanie: profile klientów, ich rozmowy i historia są izolowane per witryna. Podpisany userId scala wyłącznie kolejne wizyty tej samej witryny.
Po zmianie kodu nadal działa stara wersja
Wyczyść cache aplikacji, CDN lub wtyczki optymalizacyjnej. Potem wykonaj pełne odświeżenie i sprawdź źródło dokumentu.
Potrzebujesz drugiej pary oczu?
Sprawdzimy domeny, instalację, identyfikację i pierwszą testową rozmowę.