React (Vite)
Installa lo snippet di tracciamento Selgeo in una single-page application React costruita con Vite. Il percorso consigliato è un semplice tag <script> in index.html — la stessa riga unica che la dashboard renderizza. Un fallback basato su useEffect è documentato alla fine di questa pagina per progetti che non possono modificare index.html.
Versione API: v1
Se non usi Vite + React, consulta invece la guida HTML / script semplice, la guida Next.js o la guida WordPress.
Perché index.html?
In una SPA Vite, index.html è il punto di ingresso canonico: viene inviato al browser prima che venga eseguito qualunque codice React, ogni rotta viene servita dallo stesso file e il browser gestisce automaticamente la deduplicazione dei <script>. Posizionare lo snippet qui significa:
- Lo snippet è disponibile prima che React idrati, quindi un
?ref=…iniziale viene catturato anche a cache freddo. - Niente
useEffect, nessun rischio di doppio mount, nessuna sorpresa con React Strict Mode. - Un'unica fonte di verità — non serve ricordarsi di iniettare lo snippet in ogni componente di layout.
Poiché lo snippet è senza cookie e basato su sessionStorage, è sicuro caricarlo su ogni pagina di una SPA Vite senza alterare il comportamento della tua app React.
Installazione — percorso consigliato
Passaggio 1: apri index.html
I progetti Vite mantengono index.html nella radice del progetto (accanto a vite.config.ts), non dentro public/. Aprilo nel tuo editor.
Passaggio 2: aggiungi lo snippet prima del modulo dell'app
Posiziona il <script> di Selgeo prima di <script type="module" src="/src/main.tsx"></script>, in modo che la richiesta async dello snippet sia già in volo prima che il modulo dell'app React inizi a essere valutato. È ciò che permette a Selgeo di vedere il ?ref=… iniziale al primo paint, prima che React, il router o qualsiasi riscrittura lato client tocchino l'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>
Sostituisci pk_test_YOUR_KEY con la tua chiave API pubblica da Impostazioni > Chiavi API nella dashboard Selgeo.

Passaggio 3: riavvia il server di sviluppo
pnpm dev
# oppure
npm run dev
Vite recepisce le modifiche di index.html all'avvio a freddo. L'hot-module-reload occasionalmente manca le modifiche all'HTML, quindi un riavvio è l'opzione più sicura.
Attributi obbligatori e opzionali
| Attributo | Obbligatorio | Descrizione |
|---|---|---|
src | Sì | URL del CDN. Sempre https://cdn.selgeo.com/v1/selgeo.js. |
data-merchant | Sì | La tua chiave API pubblica (pk_test_* o pk_live_*). |
async | Sì | Caricamento asincrono; non blocca l'idratazione di React. |
data-debug | No | Logging verboso nella console. Rimuovi prima del go-live. |
data-api-url | No | Sovrascrive l'endpoint API. Presente solo nei workspace staging / sviluppo — la dashboard Selgeo lo inietta automaticamente quando necessario. |
Navigazione single-page
Lo snippet ascolta gli eventi popstate, history.pushState e history.replaceState. Se usi TanStack Router, React Router o qualsiasi altro router lato client, non serve ulteriore configurazione — un parametro ?ref=… introdotto su qualsiasi rotta viene catturato automaticamente.
Verifica dell'installazione
- Avvia il server di sviluppo (
pnpm dev). - Crea un link di tracciamento nella dashboard Selgeo sotto Programmi > Link di tracciamento.
- Apri il link di tracciamento in una nuova scheda del browser:
http://localhost:5173/?ref=TUO_REF_DI_TEST
- Apri gli Strumenti per sviluppatori (F12) e controlla la Console. Con
data-debugaggiunto temporaneamente, vedrai:[selgeo] ref detected TUO_REF_DI_TEST[selgeo] click_id stored xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - Esegui nella console:
Questo dovrebbe restituire una stringa UUID.__selgeo.getClickId()
- Apri la dashboard Selgeo. Il clic dovrebbe apparire in Analytics entro pochi secondi.

Alternativa: iniezione tramite useEffect
Usa questo percorso solo se non puoi modificare index.html — ad esempio, se il tuo index.html è generato da un framework di livello superiore, o se stai incorporando lo snippet in un micro-frontend del quale non possiedi il layer HTML.
Questo pattern porta con sé una preoccupazione aggiuntiva: in React 18+ Strict Mode (predefinito nei template Vite), gli effetti vengono eseguiti due volte in sviluppo. Senza una protezione, lo snippet verrebbe iniettato due volte e potrebbe essere registrato un clic duplicato. Usa un id stabile dell'elemento più un cortocircuito 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;
}
Monta <SelgeoSnippet /> una sola volta vicino alla radice del tuo albero di componenti (tipicamente in App.tsx, accanto al tuo router provider).
Perché la protezione è importante:
- React 18+ Strict Mode invoca intenzionalmente gli effetti due volte in sviluppo per far emergere bug di effetti collaterali.
- Senza il cortocircuito
document.getElementById, verrebbero aggiunti due elementi<script>, entrambi eseguirebbero, e lo snippet registrerebbe due clic per lo stesso visitatore. - L'
id="selgeo-snippet"stabile permette alla protezione di funzionare attraverso hot-reload, cambi di rotta e remount dei componenti.
Questo pattern è utile anche quando la gestione del consenso o i feature flag devono condizionare il caricamento dello snippet — racchiudi il corpo dell'effetto nella tua condizione.
Risoluzione dei problemi
Lo snippet non viene caricato
- Verifica che il
<script>sia all'interno di<body>, non in<head>(l'index.htmldi Vite dovrebbe già avere<body>). - Esegui
pnpm builde ispezionadist/index.html. Lo snippet dovrebbe apparire nell'HTML compilato. - Se usi un plugin Vite personalizzato che riscrive
index.html, assicurati che preservi i tag<script>aggiunti dall'utente. - Controlla nella scheda Network del browser la richiesta
selgeo.js— un errore CORS o CSP indica un problema di configurazione (vedi sotto).
Il clic non viene tracciato
- Il visitatore deve arrivare con
?ref=…al caricamento iniziale della pagina. I ricaricamenti rimuovono il parametro (lo snippet riscrive l'URL alla cattura) — emetti un link di tracciamento nuovo se hai già consumato quello attuale. - Verifica che
data-merchantcontenga una chiavepk_test_*opk_live_*valida. - Se usi l'alternativa
useEffect, conferma che la protezionedocument.getElementByIdsia in atto e cheSELGEO_SCRIPT_IDsia univoco nella pagina. - Verifica la modalità della dashboard (test vs. live) — un disallineamento scarta silenziosamente il clic.
Blocco CSP
Se imposti una Content-Security-Policy tramite un plugin Vite, un meta tag o il server di origine, consenti le origini Selgeo:
script-src 'self' https://cdn.selgeo.com;
connect-src 'self' https://api.selgeo.com;
Per i workspace staging / dev dove data-api-url punta altrove, aggiungi anche quell'origine a connect-src.
Passi successivi
- Stripe Payment Links — integrazione Stripe senza backend.
- Stripe Checkout — passa
click_idalle Checkout Session dal tuo server. - Conversion API — traccia conversioni non Stripe.
- Configurazione snippet — riferimento completo agli attributi e al tag HTML sottostante.