React (Vite)
Zainstaluj snippet śledzący Selgeo w aplikacji single-page React zbudowanej z Vite. Zalecaną ścieżką jest zwykły tag <script> w index.html — ten sam jednolinijkowiec, który renderuje panel. Alternatywa oparta na useEffect jest udokumentowana na końcu tej strony dla projektów, które nie mogą edytować index.html.
Wersja API: v1
Jeśli nie używasz Vite + React, zobacz przewodnik HTML / zwykłego skryptu, przewodnik Next.js lub przewodnik WordPress.
Dlaczego index.html?
W SPA Vite index.html jest kanonicznym punktem wejścia: jest dostarczany do przeglądarki przed uruchomieniem jakiegokolwiek kodu React, każda trasa jest serwowana z tego samego pliku, a przeglądarka automatycznie obsługuje deduplikację <script>. Umieszczenie snippeta tutaj oznacza:
- Snippet jest dostępny przed hydratacją React, więc początkowe
?ref=…jest wychwytywane nawet przy zimnej pamięci podręcznej. - Bez
useEffect, bez ryzyka podwójnego montowania, bez niespodzianek z React Strict Mode. - Jedno źródło prawdy — nie trzeba pamiętać o wstrzykiwaniu snippeta w każdym komponencie layoutu.
Ponieważ snippet jest bez ciasteczek i oparty na sessionStorage, można go bezpiecznie ładować na każdej stronie SPA Vite bez zmiany zachowania aplikacji React.
Instalacja — zalecana ścieżka
Krok 1: Otwórz index.html
Projekty Vite trzymają index.html w katalogu głównym projektu (obok vite.config.ts), nie wewnątrz public/. Otwórz go w swoim edytorze.
Krok 2: Dodaj snippet przed modułem aplikacji
Umieść <script> Selgeo przed <script type="module" src="/src/main.tsx"></script>, aby żądanie async snippetu było już w drodze, zanim moduł aplikacji React rozpocznie ewaluację. Dzięki temu Selgeo widzi początkowe ?ref=… przy pierwszym paint, zanim React, router lub jakiekolwiek przepisanie po stronie klienta dotkną adresu URL.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Your App</title>
</head>
<body>
<div id="root"></div>
<script
async
src="https://cdn.selgeo.com/v1/selgeo.js"
data-merchant="pk_test_YOUR_KEY"
></script>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
Zastąp pk_test_YOUR_KEY swoim publicznym kluczem API z Ustawienia > Klucze API w panelu Selgeo.

Krok 3: Zrestartuj serwer deweloperski
pnpm dev
# lub
npm run dev
Vite odbiera zmiany index.html przy zimnym starcie. Hot-module-reload czasami pomija edycje HTML, więc restart jest najbezpieczniejszą opcją.
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 React. |
data-debug | Nie | 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. |
Nawigacja single-page
Snippet nasłuchuje na zdarzenia popstate, history.pushState i history.replaceState. Jeśli używasz TanStack Routera, React Routera lub dowolnego innego routera po stronie klienta, dalsza konfiguracja nie jest potrzebna — parametr ?ref=… wprowadzony na dowolnej trasie jest wychwytywany automatycznie.
Weryfikacja instalacji
- Uruchom serwer deweloperski (
pnpm dev). - Utwórz link śledzący w panelu Selgeo w Programy > Linki śledzące.
- Otwórz link śledzący w nowej karcie przeglądarki:
http://localhost:5173/?ref=TWOJ_TESTOWY_REF
- Otwórz Narzędzia deweloperskie (F12) i sprawdź konsolę. Z tymczasowo dodanym
data-debugzobaczysz:[selgeo] ref detected TWOJ_TESTOWY_REF[selgeo] click_id stored xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - Wykonaj w konsoli:
Powinno to zwrócić ciąg UUID.__selgeo.getClickId()
- Otwórz panel Selgeo. Kliknięcie powinno pojawić się w Analytics w ciągu kilku sekund.

Alternatywa: wstrzyknięcie przez useEffect
Korzystaj z tej ścieżki tylko, jeśli nie możesz edytować index.html — na przykład, gdy index.html jest generowany przez framework wyższego poziomu lub osadzasz snippet w mikrofrontendzie, którego warstwy HTML nie posiadasz.
Ten wzorzec niesie ze sobą jedną dodatkową kwestię: w React 18+ Strict Mode (domyślnie w szablonach Vite) efekty wykonują się dwukrotnie w trybie deweloperskim. Bez zabezpieczenia snippet zostałby wstrzyknięty dwukrotnie i mogłoby zostać zarejestrowane zduplikowane kliknięcie. Użyj stabilnego id elementu plus zwarcia z document.getElementById:
// src/components/SelgeoSnippet.tsx
import { useEffect } from 'react';
const SELGEO_SCRIPT_ID = 'selgeo-snippet';
export function SelgeoSnippet() {
useEffect(() => {
if (document.getElementById(SELGEO_SCRIPT_ID)) {
return;
}
const script = document.createElement('script');
script.id = SELGEO_SCRIPT_ID;
script.async = true;
script.src = 'https://cdn.selgeo.com/v1/selgeo.js';
script.setAttribute('data-merchant', 'pk_test_YOUR_KEY');
document.body.appendChild(script);
}, []);
return null;
}
Zamontuj <SelgeoSnippet /> raz blisko korzenia drzewa komponentów (typowo w App.tsx, obok providera routera).
Dlaczego zabezpieczenie ma znaczenie:
- React 18+ Strict Mode celowo wywołuje efekty dwukrotnie w trybie deweloperskim, aby ujawnić błędy efektów ubocznych.
- Bez zwarcia z
document.getElementByIdzostałyby dołączone dwa elementy<script>, oba zostałyby wykonane, a snippet zarejestrowałby dwa kliknięcia dla tego samego odwiedzającego. - Stabilny
id="selgeo-snippet"pozwala zabezpieczeniu działać przez hot-reloady, zmiany tras i ponowne montowanie komponentów.
Ten wzorzec jest także użyteczny, gdy zarządzanie zgodami lub feature flagi muszą warunkować ładowanie snippeta — owiń ciało efektu w swój warunek.
Rozwiązywanie problemów
Snippet nie został załadowany
- Potwierdź, że
<script>znajduje się wewnątrz<body>, nie w<head>(index.htmlVite powinien już mieć<body>). - Uruchom
pnpm buildi obejrzyjdist/index.html. Snippet powinien pojawić się w zbudowanym HTML-u. - Jeśli używasz niestandardowej wtyczki Vite, która przepisuje
index.html, upewnij się, że zachowuje dodane przez użytkownika tagi<script>. - Sprawdź żądanie
selgeo.jsw karcie Network przeglądarki — błąd CORS lub CSP wskazuje na problem konfiguracji (zobacz poniżej).
Kliknięcie nie zostało zarejestrowane
- Odwiedzający musi przybyć z
?ref=…przy początkowym ładowaniu strony. Przeładowania usuwają parametr (snippet przepisuje URL przy przechwyceniu) — wydaj nowy link śledzący, jeśli aktualny został już użyty. - Potwierdź, że
data-merchantzawiera prawidłowy kluczpk_test_*lubpk_live_*. - Jeśli używasz alternatywy z
useEffect, potwierdź, że zabezpieczeniedocument.getElementByIdjest na miejscu, aSELGEO_SCRIPT_IDjest unikalne na stronie. - Sprawdź tryb panelu (test vs. live) — niezgodność po cichu odrzuca kliknięcie.
Blokowanie przez CSP
Jeśli ustawiasz Content-Security-Policy przez wtyczkę Vite, meta-tag lub serwer pochodzenia, 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.
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.