La FlowHunt JS API ti offre il pieno controllo su come il tuo chatbot si integra con il tuo sito web. Utilizzando il codice di integrazione v2, puoi incorporare il chatbot, iscriverti agli eventi di ciclo di vita e interazione, passare dati dinamici tramite variabili di flusso, attivare il trigger Chat Hook a metà conversazione con sendHook(), tracciare le interazioni con parametri URL e controllare la finestra di chat in modo programmatico.
Questa guida copre ogni aspetto della JS API con esempi di codice che puoi copiare e adattare al tuo progetto.
Codice di integrazione (v2)
Copia e incolla lo snippet qui sotto nel tuo HTML subito prima del tag di chiusura </body>. Sostituisci YOUR_CHATBOT_ID e YOUR_WORKSPACE_ID con i valori dalle impostazioni del tuo chatbot FlowHunt.
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
// The chatbot is ready — use chatbotManager here
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
L’ID del chatbot nel nome della variabile globale (window.FHChatbot_YOUR_CHATBOT_ID) utilizza underscore al posto dei trattini.
Sovrascrivere la configurazione con setConfig()
Prima di chiamare init(), puoi sovrascrivere le impostazioni predefinite del chatbot usando setConfig():
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
headerTitle: 'Support Assistant',
maxWindowWidth: '700px',
showChatButton: false,
flowVariables: {
userId: '12345',
plan: 'enterprise',
},
urlSuffix: '?utm_source=chatbot',
});
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
// Chatbot initialised with custom config
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
Opzioni di configurazione disponibili
| Opzione | Tipo | Descrizione |
|---|
headerTitle | string | Testo personalizzato del titolo dell’intestazione |
maxWindowWidth | string | Larghezza massima della finestra di chat (ad esempio, "700px") |
maxWindowHeight | string | Altezza massima della finestra di chat |
inputPlaceholder | string | Testo segnaposto per il campo di inserimento dei messaggi |
showChatButton | boolean | Mostra o nascondi il pulsante di chat flottante predefinito |
openChatPanel | boolean | Apri automaticamente il pannello di chat al caricamento della pagina |
flowVariables | object | Coppie chiave-valore di dati personalizzati passati al flusso. I valori possono essere di qualsiasi tipo serializzabile in JSON (string, number, boolean, object, array). |
urlSuffix | string | Stringa di query aggiunta a tutti gli URL generati dal chatbot |
cookieConsent | boolean | Abilita la persistenza della sessione tramite cookie |
embedded | string | Attiva la modalità incorporata (nessun pulsante di chiusura) |
theme | string | Modalità tema |
Variabili di flusso: passare dati dinamici
flowVariables vengono unite a ogni sessione creata dal chatbot. Vengono tipicamente utilizzate come contesto statico (noto al caricamento della pagina): l’ID dell’utente, il piano, la lingua corrente, ecc.
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
flowVariables: {
userId: getCurrentUserId(),
userEmail: getCurrentUserEmail(),
currentPage: window.location.pathname,
plan: 'enterprise',
},
});
Se l’utente naviga dopo che la chat è stata aperta, i valori passati qui diventano obsoleti. Per aggiornarli a metà conversazione, chiama chatbotManager.sendHook() con options.flowVariables — vedi Comunicazione host → flusso a metà conversazione qui sotto.
Suffisso URL: tracciare le interazioni del chatbot
Il parametro urlSuffix aggiunge una stringa di query a ogni URL generato dal chatbot. Questo è utile per tracciare il traffico originato dal chatbot negli strumenti di analisi:
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
urlSuffix: '?utm_source=chatbot&utm_medium=widget',
});
Casi d’uso:
- Tracciare le conversioni dalle interazioni del chatbot in Google Analytics.
- Analizzare il comportamento degli utenti dopo aver interagito con il chatbot.
- Attribuire le campagne che stimolano l’engagement del chatbot.
Pronto a far crescere il tuo business?
Inizia oggi la tua prova gratuita e vedi i risultati in pochi giorni.
Comunicazione host → flusso a metà conversazione
Aggiunto in aprile 2026 come parte della funzionalità FlowHunt Chat Hook.
Nelle applicazioni a pagina singola la finestra di chat in genere rimane aperta mentre l’utente naviga tra le schermate. Una volta che la chat è in esecuzione, le flowVariables passate tramite setConfig() diventano obsolete e non c’è modo di informare il flusso su qualcosa che è accaduto sulla pagina host. Un singolo metodo del gestore — sendHook(name, payload, options?) — copre entrambi i casi d’uso “attiva un trigger” e “aggiorna semplicemente il contesto”:
- Passa un
name e (opzionalmente) un payload per attivare il trigger Chat Hook del flusso. L’autore del flusso inserisce un nodo Chat Hook sul canvas e si dirama su {ChatHook.hook_name} per decidere cosa fare. - Passa
options.flowVariables per unire le variabili di sessione contemporaneamente — i valori vengono persistiti prima che il trigger si attivi e rimangono disponibili per il resto della sessione. - Se il flusso non ha un trigger Chat Hook, la chiamata è un no-op silenzioso 200:
options.flowVariables viene comunque unito, ma nessun trigger viene eseguito e nessun credito viene addebitato. Questo significa che le pagine host possono chiamare sendHook() in modo ottimistico senza sapere se l’autore del flusso ha già collegato un trigger.
sendHook() è un no-op sicuro prima che la sessione esista (memorizzato internamente in un buffer e svuotato una volta creata la sessione) e non lancia mai eccezioni alla pagina host — gli errori di rete vengono registrati solo tramite console.warn.
Limiti lato server e lato client che si applicano a sendHook(). Violarli non è un crash — il backend restituisce HTTP 422 e il gestore registra tramite console.warn senza lanciare eccezioni.
| Vincolo | Limite | Dove viene applicato | In caso di violazione |
|---|
Lunghezza di name in sendHook | 1–256 caratteri | Backend (Pydantic) | HTTP 422, il trigger non si attiva |
Numero di chiavi in options.flowVariables | ≤ 64 | Backend (Pydantic) | HTTP 422, nulla viene persistito |
Lunghezza di ogni chiave in options.flowVariables | ≤ 128 caratteri | Backend (Pydantic) | HTTP 422, nulla viene persistito |
| Chiamate pre-sessione bufferizzate dal gestore | 50 | Widget (nel browser) | La chiamata in coda più vecchia viene scartata e viene registrato un console.warn |
Il limite del buffer pre-sessione conta solo nelle pagine in cui la creazione della sessione fallisce indefinitamente (ad esempio, un errore di rete permanente). In condizioni normali la coda viene svuotata non appena si attiva onFHChatbotSessionCreated.
1. Aggiungere un trigger Chat Hook (lato autore del flusso)
- Apri il flusso associato al tuo chatbot nell’editor FlowHunt.
- Trascina un nodo trigger Chat Hook sul canvas. L’editor impone un singolo trigger per flusso — non sono consentiti più trigger.
- (Opzionale) Attiva Validate Payload Schema e definisci un JSON Schema a cui il payload in entrata deve corrispondere. La validazione viene eseguita all’interno dello step — una mancata corrispondenza emerge come evento di errore del flusso (l’endpoint restituisce comunque 200; l’errore è visibile tramite
onFHError). - Collega gli output del trigger (
hook_name, payload, flow_variables) agli step downstream che desideri attivare (Generator, Chat Output, Tool Calls, diramazioni condizionali su hook_name, ecc.). - Pubblica il flusso.
2. Diramazione su nomi di hook diversi all’interno del flusso
Il name che la pagina host passa a sendHook() è un’etichetta su cui il tuo flusso può diramarsi, non una chiave di routing — il backend non confronta i nomi con i nodi. Invece, il singolo trigger Chat Hook del flusso si attiva ed espone il nome come {ChatHook.hook_name}, che fai riferimento nella logica del tuo flusso per decidere cosa fare.
Esempio di prompt di sistema:
If {ChatHook.hook_name} is "screen_changed", briefly summarise the page at
{ChatHook.payload.url}. If it is "user_action", acknowledge the action and
update memory. Otherwise, continue the conversation normally.
Per un routing più complesso, collega uno step condizionale su {ChatHook.hook_name} e diramati in più percorsi downstream.
3. chatbotManager.sendHook(name, payload, options?)
chatbotManager.sendHook(
name: string,
payload?: Record<string, unknown>,
options?: { flowVariables?: Record<string, unknown> }
): Promise<void>;
Argomenti
| Argomento | Tipo | Obbligatorio | Descrizione |
|---|
name | string | sì | Etichetta inoltrata al flusso come {ChatHook.hook_name}. Il trigger si attiva indipendentemente dal valore; la logica del tuo flusso si dirama su di esso. |
payload | object | no | Payload JSON consegnato al trigger come {ChatHook.payload}. Validato rispetto allo schema del nodo se abilitato. Predefinito {}. |
options.flowVariables | object | no | Variabili di sessione da unire prima che il trigger si attivi. Disponibili agli step downstream e ai futuri messaggi dell’utente. |
Comportamento
- Chiamare prima di
onFHChatbotSessionCreated è sicuro; la chiamata viene bufferizzata e svuotata una volta che la sessione esiste. Il buffer ha un limite — vedi Limiti di input sopra. - Se il flusso non ha un trigger Chat Hook, la richiesta è un no-op silenzioso 200 — quindi le pagine host possono chiamare
sendHook() in modo ottimistico prima che l’autore del flusso colleghi un trigger. options.flowVariables viene comunque persistito anche in quel caso, quindi la stessa chiamata serve come aggiornamento del solo contesto. - Se il trigger Chat Hook ha la validazione dello schema abilitata e il payload non la supera, la validazione viene eseguita all’interno dello step — l’endpoint restituisce 200 ma il flusso emette un evento di errore dello step (osservabile tramite
onFHError). name e options.flowVariables sono limitati — vedi Limiti di input sopra. Le violazioni restituiscono HTTP 422 e nulla viene persistito.- Le chiamate riuscite emettono un evento
onFHChatbotFlowVariablesUpdate se è stato fornito options.flowVariables (vedi Riferimento degli eventi). - Non lancia mai eccezioni. I fallimenti di rete e le risposte non-2xx vengono registrati tramite
console.warn.
Esempio — suggerimento proattivo sulla navigazione SPA
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
window.addEventListener('hashchange', function () {
chatbotManager.sendHook('screen_changed', {
url: window.location.href,
screen_name: getScreenName(),
}, {
flowVariables: { current_page_url: window.location.href },
});
});
});
Esempio — aggiornamento del solo contesto (nessun Chat Hook collegato)
Se il flusso non ha un trigger Chat Hook, la chiamata è un 200 silenzioso — quindi la stessa API può mantenere flow_variables sincronizzate senza attivare nulla:
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
window.addEventListener('hashchange', function () {
chatbotManager.sendHook('navigate', {}, {
flowVariables: {
current_page_url: window.location.href,
screen_name: getScreenName(),
},
});
});
});
4. Come l’autore del flusso utilizza questi valori
{ChatHook.hook_name} e {ChatHook.payload.foo} — i valori passati tramite sendHook('x', { foo: 1 }) sono esposti sul percorso di esecuzione del trigger Chat Hook. Disponibili solo sul percorso avviato dall’attivazione dell’hook.{flow_variables.foo} — i valori passati tramite options.flowVariables vengono uniti al bag delle variabili della sessione prima che il trigger si attivi. Ogni percorso di esecuzione (inclusi i normali messaggi utente attivati da Chat Input) può leggerli.
Se vuoi che il prossimo messaggio dell’utente veda un nuovo valore, mettilo in options.flowVariables — il payload da solo influisce solo sull’esecuzione avviata da quell’hook.
Riferimento degli eventi
La FlowHunt JS API invia 11 eventi personalizzati sull’oggetto window. Tutti gli eventi utilizzano l’API CustomEvent
con bubbles: true e composed: true.
onFHChatbotReady
Viene attivato quando il widget del chatbot è completamente renderizzato e pronto per l’uso.
- Dati dell’evento: nessuno.
- Quando: dopo che il DOM del widget è montato e il pulsante di chat è visibile.
onFHChatbotSessionCreated
Viene attivato quando viene creata una nuova sessione di chat sul server.
- Dati dell’evento:
event.detail.sessionId — l’ID della sessione appena creata. - Quando: dopo una chiamata API di creazione sessione riuscita.
onFHChatbotWindowOpened
Viene attivato quando l’utente apre la finestra di chat. Non viene attivato in modalità incorporata.
onFHChatbotWindowClosed
Viene attivato quando l’utente chiude la finestra di chat. Non viene attivato in modalità incorporata.
onFHMessageSent
Viene attivato quando l’utente invia un messaggio.
event.detail.metadata = {
content: 'Hello, I need help with...',
createdAt: '2026-02-19T10:30:00.000Z',
};
onFHMessageReceived
Viene attivato quando il chatbot riceve e visualizza una risposta.
event.detail.metadata = {
flow_id: 'abc123',
message_id: 'msg_456',
message: 'Sure, I can help you with that!',
sender: {
sender_name: 'Support Agent',
sender_avatar: 'https://example.com/avatar.png',
},
};
sender è opzionale e presente solo quando è coinvolto un agente umano.
Viene attivato quando l’utente invia dati del modulo tramite il chatbot.
event.detail.metadata = {
objectData: { name: 'John', email: 'john@example.com' },
createdAt: '2026-02-19T10:31:00.000Z',
};
onFHFeedback
Viene attivato quando un utente dà un feedback positivo o negativo su un messaggio del chatbot.
event.detail.metadata = {
message_id: 'msg_456',
content: 'Optional feedback text',
feedback: 'P', // 'P' = positive, 'N' = negative
};
Viene attivato quando uno strumento o un’azione viene eseguito durante l’elaborazione del flusso. Attivato solo nelle modalità flowAssistant e flowAssistantV3.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_789',
message: 'Calling search API...',
},
createdAt: '2026-02-19T10:32:00.000Z',
};
onFHError
Viene attivato quando si verifica un errore durante il funzionamento del chatbot.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_err',
message: 'Flow execution failed',
},
createdAt: '2026-02-19T10:33:00.000Z',
};
onFHChatbotFlowVariablesUpdate
Aggiunto in aprile 2026.
Viene attivato dopo una chiamata chatbotManager.sendHook(...) riuscita che ha fornito options.flowVariables. Non viene attivato per chiamate sendHook() che omettono flowVariables.
event.detail = {
variables: {
current_page_url: 'https://example.com/products',
screen_name: 'products',
},
};
Usalo per osservare le variabili unite (ad esempio per sincronizzare il tuo stato lato host, per il debug o per ri-renderizzare un elemento UI che dipende dagli stessi dati).
Iscriviti alla nostra newsletter
Ricevi gratuitamente gli ultimi consigli, tendenze e offerte.
Iscrizione agli eventi
Ci sono due modi per iscriversi agli eventi del chatbot.
Metodo 1: Listener di eventi Window
Usa window.addEventListener ovunque nella tua pagina. Questo funziona anche prima del caricamento del chatbot:
<script>
document.addEventListener('DOMContentLoaded', function () {
window.addEventListener('onFHChatbotReady', function () {
console.log('Chatbot is ready');
});
window.addEventListener('onFHChatbotSessionCreated', function (event) {
console.log('Session created:', event.detail.sessionId);
});
window.addEventListener('onFHChatbotWindowOpened', function () {
console.log('Chat window opened');
});
window.addEventListener('onFHChatbotWindowClosed', function () {
console.log('Chat window closed');
});
window.addEventListener('onFHMessageSent', function (event) {
console.log('User sent:', event.detail.metadata.content);
});
window.addEventListener('onFHMessageReceived', function (event) {
console.log('Bot replied:', event.detail.metadata.message);
});
window.addEventListener('onFHFormDataSent', function (event) {
console.log('Form submitted:', event.detail.metadata.objectData);
});
window.addEventListener('onFHFeedback', function (event) {
var fb = event.detail.metadata;
console.log('Feedback on message', fb.message_id, ':', fb.feedback);
});
window.addEventListener('onFHToolCall', function (event) {
console.log('Tool called:', event.detail.metadata);
});
window.addEventListener('onFHError', function (event) {
console.error('Chatbot error:', event.detail.metadata);
});
window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
console.log('Variables merged:', event.detail.variables);
});
});
</script>
Per rimuovere un listener, mantieni il riferimento al gestore:
var handleMessage = function (event) {
console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later …
window.removeEventListener('onFHMessageReceived', handleMessage);
Metodo 2: Metodi di callback del gestore
All’interno del callback init(), usa i metodi integrati del gestore del chatbot:
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
chatbotManager.onSessionCreated(function () {
console.log('Session created');
});
chatbotManager.onWindowOpened(function () {
console.log('Window opened');
});
chatbotManager.onWindowClosed(function () {
console.log('Window closed');
});
chatbotManager.onMessageSent(function (event) {
console.log('User sent:', event.metadata);
});
chatbotManager.onMessageReceived(function (event) {
console.log('Bot replied:', event.metadata);
});
chatbotManager.onFormDataSent(function (event) {
console.log('Form data:', event.metadata);
});
chatbotManager.onFeedback(function (event) {
console.log('Feedback:', event.metadata);
});
chatbotManager.onToolCall(function (event) {
console.log('Tool call:', event.metadata);
});
chatbotManager.onError(function (event) {
console.error('Error:', event.metadata);
});
});
Riferimento dei metodi del gestore
| Metodo | Parametri | Descrizione |
|---|
onSessionCreated(fn) | fn: () => void | Ascolta la creazione della sessione |
onWindowOpened(fn) | fn: () => void | Ascolta l’apertura della finestra |
onWindowClosed(fn) | fn: () => void | Ascolta la chiusura della finestra |
onMessageSent(fn) | fn: (event) => void | Ascolta i messaggi dell’utente |
onMessageReceived(fn) | fn: (event) => void | Ascolta le risposte del bot |
onFormDataSent(fn) | fn: (event) => void | Ascolta gli invii di moduli |
onFeedback(fn) | fn: (event) => void | Ascolta il feedback dell’utente |
onToolCall(fn) | fn: (event) => void | Ascolta le esecuzioni degli strumenti |
onError(fn) | fn: (event) => void | Ascolta gli errori |
openChat() | — | Apre il pannello di chat |
closeChat() | — | Chiude il pannello di chat |
sendHook(name, payload?, options?) (nuovo) | name: string, payload?: object, options?: { flowVariables?: object } | Attiva il trigger Chat Hook nel flusso in esecuzione (oppure unisce silenziosamente options.flowVariables se nessun trigger è collegato) |
Attivazione personalizzata della chat: nascondere il pulsante e aprire al clic
Per controllare completamente quando il chatbot appare, nascondi il pulsante flottante predefinito e apri la chat in modo programmatico — ad esempio, dal tuo pulsante personalizzato.
<button id="my-chat-button">Chat with us</button>
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
document.getElementById('my-chat-button')
.addEventListener('click', function () {
chatbotManager.openChat();
});
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
Mostrare un pulsante personalizzato solo quando il chatbot è pronto
Puoi combinare l’attivazione nascosta con i listener di eventi per creare interazioni avanzate:
<button id="open-chat" style="display:none;">Need help?</button>
<script>
window.addEventListener('onFHChatbotReady', function () {
document.getElementById('open-chat').style.display = 'block';
});
</script>
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
document.getElementById('open-chat')
.addEventListener('click', function () {
chatbotManager.openChat();
});
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
Esempio di integrazione completo
Un esempio funzionante completo che dimostra le sovrascritture di configurazione, il tracciamento degli eventi, l’attivazione personalizzata della chat e il nuovo metodo sendHook() insieme:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FlowHunt Chatbot Integration</title>
</head>
<body>
<h1>My Website</h1>
<button id="open-chat-btn">Talk to our AI assistant</button>
<button id="close-chat-btn">Close chat</button>
<!-- Subscribe to events before the chatbot loads -->
<script>
document.addEventListener('DOMContentLoaded', function () {
window.addEventListener('onFHChatbotReady', function () {
console.log('Chatbot widget is ready');
});
window.addEventListener('onFHChatbotSessionCreated', function (event) {
console.log('New chat session started:', event.detail.sessionId);
});
window.addEventListener('onFHMessageSent', function (event) {
console.log('User message:', event.detail.metadata.content);
});
window.addEventListener('onFHMessageReceived', function (event) {
console.log('Bot response:', event.detail.metadata.message);
});
window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
console.log('Context updated:', event.detail.variables);
});
window.addEventListener('onFHError', function (event) {
console.error('Chatbot error:', event.detail.metadata);
});
});
</script>
<!-- FlowHunt integration -->
<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
var currentScript = document.currentScript
|| document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');
var script = document.createElement('script');
script.async = true;
script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
+ '?workspace_id=YOUR_WORKSPACE_ID&v=2';
script.onload = function () {
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
showChatButton: false,
headerTitle: 'AI Assistant',
maxWindowWidth: '600px',
flowVariables: {
source: 'website',
current_page_url: window.location.href,
},
urlSuffix: '?utm_source=chatbot',
});
window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
// Open / close from custom buttons
document.getElementById('open-chat-btn')
.addEventListener('click', function () {
chatbotManager.openChat();
});
document.getElementById('close-chat-btn')
.addEventListener('click', function () {
chatbotManager.closeChat();
});
// Keep the flow's context in sync with SPA navigation and
// optionally fire the Chat Hook trigger (if the flow has one wired).
// If the flow has no Chat Hook, the call is a silent 200 — the
// flow_variables still get merged, so the same line covers both
// "notify the flow" and "just update context".
window.addEventListener('hashchange', function () {
chatbotManager.sendHook('screen_changed', {
url: window.location.href,
}, {
flowVariables: { current_page_url: window.location.href },
});
});
});
};
if (currentScript && currentScript.parentNode) {
currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
} else {
document.head.appendChild(script);
}
</script>
</body>
</html>