Next.js
Zainstaluj snippet śledzący Selgeo w aplikacji Next.js, korzystając z natywnego komponentu frameworka next/script. Niniejszy przewodnik obejmuje zarówno App Router (app/layout.tsx), jak i Pages Router (pages/_app.tsx).
Wersja API: v1
Jeśli nie używasz Next.js, zobacz przewodnik HTML / zwykłego skryptu, przewodnik React (Vite) lub przewodnik WordPress.
Dlaczego next/script?
Goły tag <script> w komponencie React nie zachowuje się tak, jak w zwykłym HTML — Next.js paczkuje JavaScript dla każdej trasy i hydratuje strony stopniowo. Oficjalny komponent next/script:
- Ładuje snippet dokładnie raz w trakcie nawigacji po stronie klienta (brak podwójnego wykonania).
- Respektuje wybraną przez Ciebie
strategyładowania (używamyafterInteractive). - Dobrze współpracuje ze strumieniowym SSR Next.js i Partial Prerendering.
Używamy strategy="afterInteractive" zamiast lazyOnload, aby snippet był gotowy przed przetworzeniem pierwszego parametru ?ref=. Dokładność atrybucji jest ważniejsza niż marginalna poprawa Lighthouse — lazyOnload grozi przeoczeniem wczesnego kliknięcia, które konwertuje natychmiast.
Instalacja — App Router (app/layout.tsx)
Dla projektów na Next.js 13+ używających katalogu app/.
Krok 1: Dodaj snippet do głównego layoutu
Otwórz app/layout.tsx i dodaj import Script oraz element JSX:
import Script from 'next/script';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
{children}
<Script
async
src="https://cdn.selgeo.com/v1/selgeo.js"
data-merchant="pk_test_YOUR_KEY"
strategy="afterInteractive"
/>
</body>
</html>
);
}
Zastąp pk_test_YOUR_KEY swoim publicznym kluczem API z Ustawienia > Klucze API w panelu Selgeo.

Krok 2: Zapisz i uruchom
pnpm dev
# lub
npm run dev
Otwórz stronę w przeglądarce. Snippet ładuje się teraz na każdej stronie renderowanej przez App Router.
Instalacja — Pages Router (pages/_app.tsx)
Dla projektów na starszym katalogu pages/.
Krok 1: Dodaj snippet do niestandardowego komponentu App
Otwórz (lub utwórz) pages/_app.tsx:
import type { AppProps } from 'next/app';
import Script from 'next/script';
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Component {...pageProps} />
<Script
async
src="https://cdn.selgeo.com/v1/selgeo.js"
data-merchant="pk_test_YOUR_KEY"
strategy="afterInteractive"
/>
</>
);
}
Krok 2: Zrestartuj serwer deweloperski
pnpm dev
Projekty Pages Router muszą zrestartować serwer deweloperski przy pierwszym utworzeniu _app.tsx. Późniejsze edycje są normalnie ładowane na gorąco.

Atrybuty wymagane i opcjonalne
| Atrybut | Wymagany | Opis |
|---|---|---|
src | Tak | URL CDN. Zawsze https://cdn.selgeo.com/v1/selgeo.js. |
data-merchant | Tak | Twój publiczny klucz API (pk_test_* lub pk_live_*). |
async | Tak | Asynchroniczne ładowanie; nie blokuje hydratacji. |
strategy | Tak | Użyj "afterInteractive". Nie przełączaj na "lazyOnload" — wczesne kliknięcia poleceń mogą zostać pominięte. |
data-debug | Nie | Włącza obszerne logowanie w konsoli. Usuń przed wdrożeniem produkcyjnym. |
data-api-url | Nie | Nadpisuje endpoint API. Obecny tylko w workspace'ach staging / dev — panel Selgeo wstrzykuje go automatycznie, gdy jest potrzebny. |
Weryfikacja instalacji
- Zbuduj i uruchom projekt (
pnpm devlubpnpm build && pnpm start). - Utwórz link śledzący w panelu Selgeo w Programy > Linki śledzące.
- Odwiedź swoją stronę za pomocą linku śledzącego, na przykład:
https://twoja-strona.com/?ref=TWOJ_TESTOWY_REF
- Otwórz Narzędzia deweloperskie (F12) i sprawdź konsolę. Z tymczasowo dodanym
data-debugpowinno wyświetlić się:[selgeo] ref detected TWOJ_TESTOWY_REF[selgeo] click_id stored xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - W konsoli przeglądarki wykonaj:
Powinno to zwrócić ciąg UUID.__selgeo.getClickId()
nulloznacza, że snippet nie wykrył parametru?ref=. - Otwórz panel Selgeo. Kliknięcie powinno pojawić się w Analytics w ciągu kilku sekund.

Rozwiązywanie problemów
Snippet nie został załadowany
- Potwierdź, że
app/layout.tsx(App Router) lubpages/_app.tsx(Pages Router) faktycznie zawiera blok<Script>— przypadkowe duplikowanie do pojedynczego pliku strony to najczęstszy błąd. - Sprawdź, że
srcto dokładniehttps://cdn.selgeo.com/v1/selgeo.js. Literówka powoduje ciche niepowodzenie ładowania skryptu. - Otwórz kartę Network i filtruj po
selgeo.js. Czerwony wpis ze statusem 0 lub błędem CORS zwykle wskazuje na naruszenie CSP — zobacz poniżej. - Jeśli działasz w trybie eksportu statycznego (
output: 'export'), upewnij się, że snippet jest zawarty w wyeksportowanym HTML-u.next/scriptzstrategy="afterInteractive"jest zachowywany w eksporcie statycznym.
Kliknięcie nie zostało zarejestrowane
- Odwiedzający musi przybyć z
?ref=…przy początkowym ładowaniu strony. Po przechwyceniu kliknięcia przez snippet URL jest przepisywany i parametr przestaje się pojawiać. Załaduj stronę ponownie z nowym linkiem śledzącym, jeśli aktualny został już użyty. - Potwierdź, że
data-merchantzawiera prawidłowy kluczpk_test_*lubpk_live_*. Skrócona lub poprzedzona spacją wartość spowoduje ciche niedziałanie. - Jeśli używasz React Strict Mode, upewnij się, że snippet jest w
app/layout.tsxlubpages/_app.tsx, a nie w efekcie, który może uruchomić się dwukrotnie.next/scriptjuż prawidłowo deduplikuje. - Sprawdź tryb panelu Selgeo (test vs. live). Klucz
pk_live_*na linku śledzącym wydanym w trybie testowym nie zarejestruje kliknięcia.
Blokowanie przez CSP
Jeśli Twój projekt Next.js ustawia nagłówek Content-Security-Policy (next.config.js headers(), middleware lub wpis w vercel.json), zezwól na pochodzenia Selgeo:
script-src 'self' https://cdn.selgeo.com;
connect-src 'self' https://api.selgeo.com;
Dla workspace'ów staging / dev, gdzie data-api-url wskazuje gdzie indziej, dodaj również to pochodzenie do connect-src. Jeśli nie możesz złagodzić CSP, rozważ routowanie snippeta przez własne pochodzenie (zaawansowane, poza zakresem tego przewodnika).
Następne kroki
- Stripe Payment Links — integracja Stripe bez backendu.
- Stripe Checkout — przekazuj
click_iddo Checkout Sessions ze swojego serwera. - Conversion API — śledź konwersje spoza Stripe.
- Konfiguracja snippeta — pełna referencja atrybutów i bazowy tag HTML.