stay.{brand}.com) e non ha il contesto. Leggila prima di toccare un sito che parla con KrossBooking e ogni volta che arriva l’avviso «cache token Kross non a posto».
Il problema in tre righe
- KrossBooking ammette al massimo 50 sessioni attive per struttura (identificativo struttura,
hotel_id). Ogni accesso all’API apre una sessione (un token). - Le sessioni non si chiudono e non si revocano: scadono da sole 7 giorni dopo l’ultimo uso.
- Oltre le 50, Kross risponde 401 con
error_code 12(«too many active tokens») a ogni chiamata di quella struttura: il sito non mostra più disponibilità e prezzi, e smettono di funzionare anche gli altri sistemi che usano la stessa struttura (per esempio gli strumenti dell’assistente). Non è un problema di credenziali e non passa in pochi minuti.
Come è fatta la cache
Ogni sito ha una delle due cache (alcuni le hanno entrambe):Eccezione voluta alla regola «niente nomi di variabili d’ambiente» (decisione di Francesco, 08/10/2026): questa pagina serve al supporto tecnico interno, e senza i nomi esatti chi deve sistemare un sito non sa cosa impostare. Qui ci sono solo i nomi, mai i valori: i valori stanno nel Vault e su Vercel, non si scrivono in nessuna pagina né in chat.
Basta una delle due cache completa, con valori non vuoti. Nei siti la cui cache è solo la tabella condivisa (nessun modulo KV nel codice) le due variabili KV non contano: la build si ferma comunque se manca il trio.
Come lavora, in breve: il sito chiede prima il token alla cache; se c’è lo usa (nessuna chiamata a Kross); se manca, una sola istanza alla volta prende un «turno», si autentica e pubblica il token, le altre aspettano qualche secondo e lo riusano.
Le regole del token (uguali per siti, gateway e piattaforma, dal 08/10/2026)
Con la cache condivisa Mattone i siti seguono le stesse regole dell’assistente e della piattaforma, descritte in Token Kross (pool da 50):- il token in cache si riusa anche quando la sua scadenza stimata è passata: lo decide Kross, rispondendo «token scaduto» (
error_code 2); - una nuova autenticazione si fa solo se la cache la concede (nessun altro sta autenticando, nessun freno, tetto non raggiunto) e ogni autenticazione riuscita viene registrata;
- su
error_code 12si apre un freno condiviso di 15 minuti che ferma tutti i sistemi su quella struttura, e il token in mano non si butta (è l’unico che funziona); - c’è un tetto di 40 autenticazioni in 7 giorni per struttura, sotto i 50 di Kross: superato, nessuno crea token finché una persona non capisce chi li sta consumando;
- su
error_code 2il token si sostituisce una volta e la richiesta si ritenta una volta, mai in loop.
Le tre difese (dal 08/10/2026)
1. La build di produzione si ferma
Se il sito ha le credenziali Kross e non ha una cache completa (le tre impostazioni della cache condivisa oppure le due dello store KV, con valori non vuoti), la build di produzione fallisce con un messaggio che dice cosa impostare. Le anteprime e lo sviluppo locale non sono toccati.- Gira come passo
prebuild, quindi solo con il comando di build predefinito di Vercel (npm run build). Se qualcuno lo sostituisce connext build, il controllo salta: non farlo. - Si può provare a mano dal repository con
PREFLIGHT_FORCE=1 npm run prebuild. - La build controlla che le impostazioni ci siano, non che funzionino: per quello c’è il controllo di salute.
2. Il controllo di salute dice la verità
GET https://<dominio del sito>/api/health riporta il campo kross_token_cache:
Cose da sapere per leggerlo:
- Il controllo della cache non chiama mai KrossBooking: scrive e rilegge una riga di prova dedicata, mai il token vero.
- Con la cache condivisa, la sola lettura non basta a dimostrare niente: con un segreto sbagliato la lettura risponde «vuoto», identica a «nessun token ancora». Per questo il controllo scrive: la scrittura è l’unica operazione che rifiuta esplicitamente un segreto sbagliato.
- Gli altri campi (
krossbooking,stripe, …) non cambiano significato e non decidono lo status: un 503 dell’health oggi vuol dire «cache del token», non «Kross giù». - L’header
x-health-kross-token-cacheriporta lo stesso valore.
3. Il log urla, una volta per istanza
A runtime ogni istanza scrive unconsole.error che inizia con [kross-token-cache] la prima volta che trova la cache assente, una chiamata alla cache fallita, o il segreto rifiutato. Nei log runtime di Vercel del progetto, filtra per quella stringa.
L’avviso giornaliero
Ogni giorno alle 07:00 UTC la piattaforma Mattone trova da sola i siti di prenotazione diretta: guarda tutti i progetti del team su Vercel e tiene quelli attivi, con un deploy di produzione, che hanno le credenziali Kross del template fra le impostazioni. Per ognuno chiama l’health sul dominio di produzione (o sull’indirizzo Vercel del progetto<progetto>.vercel.app, se il dominio non risolve nel DNS) e, se un sito non risponde 200 con kross_token_cache: "ok", scrive nel canale Slack del team tecnico (#mattone-coding) un messaggio «Siti di prenotazione diretta: cache token Kross non a posto», con un punto per ogni sito e la diagnosi.
- I siti nuovi vengono sorvegliati in automatico: un sito creato dal template entra nel controllo dal primo deploy di produzione, senza aggiungerlo da nessuna parte.
- Un sito che usa Kross ma non espone il campo (fork vecchio, senza le difese di questa pagina) viene segnalato, come uno che non risponde.
- I progetti in pausa non vengono controllati.
- Dominio che non risponde, sito sano: un dominio può risolvere nel DNS e non servire il sito (agganciato a Vercel ma con il certificato non ancora pronto, o non più usato dallo studente). Se il dominio non dà nessuna risposta, l’avviso riprova sull’indirizzo
<progetto>.vercel.app: se lì l’health è 200 conok, il sito è considerato sano (la cache funziona) e il dominio diventa solo una nota informativa nel riepilogo del controllo, mai un allarme da sola; compare in coda come ℹ️ solo se quel giorno parte un avviso per un altro sito. Se non risponde neanche l’indirizzo Vercel, arriva l’allarme con entrambi gli indirizzi. Un dominio che risponde con un errore (per esempio 503) resta un allarme: è il sito che risponde, non il dominio. - Se la ricerca dei siti fallisce, arriva comunque un avviso «scoperta automatica FALLITA»: il silenzio vuol dire solo «tutti a posto».
Cosa fare quando arriva l’avviso
1
Rileggi l'health a mano
Apri l’indirizzo dell’health indicato nel messaggio. Annota status HTTP e valore di
kross_token_cache: l’avviso fotografa le 07:00, il sito potrebbe essere già cambiato.2
«nessuna risposta»
Non hanno risposto né il dominio né l’indirizzo
<progetto>.vercel.app (l’avviso li cita tutti e due): il sito è giù. Non è la cache: controlla l’ultimo deploy di produzione sul progetto Vercel. Se invece non risponde solo il dominio e l’indirizzo Vercel è sano, l’allarme non parte (resta la nota nel riepilogo): DNS e certificato del dominio si controllano su Vercel senza urgenza.3
«senza campo kross_token_cache»
Il deploy in produzione è precedente alle difese di questa pagina (o l’health è rotto). Controlla che l’ultimo commit di
main sia quello in produzione; se non lo è, verifica perché il deploy da main non è partito o non è finito.4
not_configured
Mancano le impostazioni della cache in Production sul progetto Vercel. Impostale (
SUPABASE_URL + SUPABASE_ANON_KEY + GATEWAY_SHARED_SECRET per i siti del team, KV_REST_API_URL + KV_REST_API_TOKEN da uno store collegato per i siti degli studenti), poi rideploya da main: le impostazioni valgono solo per i deploy nuovi. Mai vercel deploy --prod dal computer.5
error
La cache c’è ma non risponde. Apri i log runtime del progetto e cerca
[kross-token-cache]: il messaggio dice quale passo fallisce (segreto rifiutato, funzione assente, timeout, store KV). Il caso più comune è il segreto copiato male (GATEWAY_SHARED_SECRET): si reimposta il valore giusto e si rideploya.6
Ricontrolla
Dopo il deploy, l’health deve tornare 200 con
ok. Solo allora rispondi nel thread dell’avviso con cosa hai fatto.Checklist: sito nuovo dal template
Da seguire insieme alla Procedura guidata, fase 7.- Scegli la cache: store KV del progetto se il deploy è dello studente; cache condivisa Mattone solo se il sito lo opera il team.
- Per lo store KV: Vercel → progetto → Storage → crea e collega lo store, così le impostazioni arrivano da sole. Per la cache condivisa: le tre impostazioni le configura il team, mai incollate in chat.
- Imposta tutto in Production (e in Preview, se le anteprime parlano con Kross), con il comando di build predefinito.
- Deploy da
main. Se la build si ferma con «NO Kross token cache», manca il punto 2: non aggirarla. - Apri
/api/healthsul dominio vero: 200 ekross_token_cache: "ok". - Non serve aggiungere il sito da nessuna parte: l’avviso giornaliero lo trova da solo. Il giorno dopo, verifica che non l’abbia segnalato.
Direct Booking: come si crea
Stack, template, vincoli
Kross: rate limit e trappole
I limiti per struttura