Die FlowHunt JS API gibt Ihnen die volle Kontrolle darüber, wie sich Ihr Chatbot in Ihre Website integriert. Mit dem v2-Integrationscode können Sie den Chatbot einbetten, Lebenszyklus- und Interaktions-Events abonnieren, dynamische Daten über Flow-Variablen übergeben, den Chat-Hook-Trigger mitten im Gespräch mit sendHook() auslösen, Interaktionen mit URL-Parametern verfolgen und das Chat-Fenster programmatisch steuern.
Dieser Leitfaden behandelt jeden Aspekt der JS API mit Codebeispielen, die Sie kopieren und an Ihr Projekt anpassen können.
Integrationscode (v2)
Kopieren Sie das untenstehende Snippet und fügen Sie es in Ihr HTML direkt vor dem schließenden </body>-Tag ein. Ersetzen Sie YOUR_CHATBOT_ID und YOUR_WORKSPACE_ID durch die Werte aus Ihren FlowHunt-Chatbot-Einstellungen.
<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>
Die Chatbot-ID im globalen Variablennamen (window.FHChatbot_YOUR_CHATBOT_ID) verwendet Unterstriche anstelle von Bindestrichen.
Konfiguration mit setConfig() überschreiben
Bevor Sie init() aufrufen, können Sie die Standard-Chatbot-Einstellungen mit setConfig() überschreiben:
<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>
Verfügbare Konfigurationsoptionen
| Option | Type | Beschreibung |
|---|
headerTitle | string | Benutzerdefinierter Header-Titeltext |
maxWindowWidth | string | Maximale Breite des Chat-Fensters (z. B. "700px") |
maxWindowHeight | string | Maximale Höhe des Chat-Fensters |
inputPlaceholder | string | Platzhaltertext für das Nachrichteneingabefeld |
showChatButton | boolean | Standard-Schwebenden-Chat-Button anzeigen oder ausblenden |
openChatPanel | boolean | Chat-Panel beim Seitenaufruf automatisch öffnen |
flowVariables | object | Schlüssel-Wert-Paare mit benutzerdefinierten Daten, die an den Flow übergeben werden. Werte können beliebige JSON-serialisierbare Typen sein (string, number, boolean, object, array). |
urlSuffix | string | Abfragezeichenfolge, die an alle vom Chatbot generierten URLs angehängt wird |
cookieConsent | boolean | Sitzungspersistenz über Cookies aktivieren |
embedded | string | Eingebetteten Modus aktivieren (kein Schließen-Button) |
theme | string | Designmodus |
Flow-Variablen: Dynamische Daten übergeben
flowVariables werden in jede Sitzung zusammengeführt, die der Chatbot erstellt. Sie werden typischerweise als statischer Kontext verwendet (bekannt beim Seitenaufruf): Benutzer-ID, Plan, aktuelle Sprache usw.
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
flowVariables: {
userId: getCurrentUserId(),
userEmail: getCurrentUserEmail(),
currentPage: window.location.pathname,
plan: 'enterprise',
},
});
Wenn der Benutzer navigiert, nachdem der Chat geöffnet wurde, werden hier übergebene Werte veraltet. Um sie mitten im Gespräch zu aktualisieren, rufen Sie chatbotManager.sendHook() mit options.flowVariables auf — siehe Host → Flow-Kommunikation mitten im Gespräch unten.
URL-Suffix: Chatbot-Interaktionen verfolgen
Der Parameter urlSuffix hängt eine Abfragezeichenfolge an jede vom Chatbot generierte URL an. Dies ist nützlich, um chatbot-bezogenen Traffic in Analysetools zu verfolgen:
window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
urlSuffix: '?utm_source=chatbot&utm_medium=widget',
});
Anwendungsfälle:
- Konversionen verfolgen von Chatbot-Interaktionen in Google Analytics.
- Benutzerverhalten analysieren nach der Interaktion mit dem Chatbot.
- Kampagnen zuordnen, die das Chatbot-Engagement fördern.
Bereit, Ihr Geschäft zu erweitern?
Starten Sie heute Ihre kostenlose Testversion und sehen Sie innerhalb weniger Tage Ergebnisse.
Host → Flow-Kommunikation mitten im Gespräch
Im April 2026 als Teil der FlowHunt-Chat-Hook-Funktion hinzugefügt.
In Single-Page-Anwendungen bleibt das Chat-Fenster typischerweise geöffnet, während der Benutzer zwischen Bildschirmen navigiert. Sobald der Chat läuft, werden die über setConfig() übergebenen flowVariables veraltet, und es gibt keine Möglichkeit, den Flow über etwas zu informieren, das auf der Host-Seite passiert ist. Eine einzelne Manager-Methode — sendHook(name, payload, options?) — deckt sowohl die Anwendungsfälle „Trigger auslösen" als auch „nur Kontext aktualisieren" ab:
- Übergeben Sie einen
name und (optional) einen payload, um den Chat-Hook-Trigger des Flows auszulösen. Der Flow-Autor platziert einen einzelnen Chat-Hook-Knoten auf dem Canvas und verzweigt anhand von {ChatHook.hook_name}, um zu entscheiden, was zu tun ist. - Übergeben Sie
options.flowVariables, um gleichzeitig Sitzungsvariablen zusammenzuführen — die Werte werden persistiert, bevor der Trigger ausgelöst wird, und bleiben für den Rest der Sitzung verfügbar. - Wenn der Flow keinen Chat-Hook-Trigger besitzt, ist der Aufruf ein stiller 200-No-Op:
options.flowVariables wird trotzdem zusammengeführt, aber kein Trigger läuft und es werden keine Credits berechnet. Das bedeutet, dass Host-Seiten sendHook() optimistisch aufrufen können, ohne zu wissen, ob der Flow-Autor bereits einen Trigger verdrahtet hat.
sendHook() ist ein sicherer No-Op, bevor die Sitzung existiert (intern gepuffert und abgearbeitet, sobald die Sitzung erstellt ist) und wirft niemals eine Ausnahme an die Host-Seite — Netzwerkfehler werden nur über console.warn protokolliert.
Eingabelimits
Server- und clientseitige Grenzen, die für sendHook() gelten. Eine Verletzung führt nicht zu einem Absturz — das Backend gibt HTTP 422 zurück und der Manager protokolliert über console.warn, ohne eine Ausnahme zu werfen.
| Einschränkung | Limit | Wo durchgesetzt | Bei Verletzung |
|---|
sendHook name-Länge | 1–256 Zeichen | Backend (Pydantic) | HTTP 422, Trigger wird nicht ausgelöst |
Anzahl der Schlüssel in options.flowVariables | ≤ 64 | Backend (Pydantic) | HTTP 422, nichts persistiert |
Länge jedes Schlüssels in options.flowVariables | ≤ 128 Zeichen | Backend (Pydantic) | HTTP 422, nichts persistiert |
| Vom Manager gepufferte Aufrufe vor Sitzungsstart | 50 | Widget (im Browser) | Ältester Aufruf in der Warteschlange wird verworfen und ein console.warn wird protokolliert |
Das Pre-Session-Puffer-Limit ist nur auf Seiten relevant, auf denen die Sitzungserstellung dauerhaft fehlschlägt (z. B. ein permanenter Netzwerkfehler). Unter normalen Bedingungen wird die Warteschlange abgearbeitet, sobald onFHChatbotSessionCreated ausgelöst wird.
1. Chat-Hook-Trigger hinzufügen (Seite des Flow-Autors)
- Öffnen Sie den mit Ihrem Chatbot verknüpften Flow im FlowHunt-Editor.
- Ziehen Sie einen Chat-Hook-Trigger-Knoten auf den Canvas. Der Editor erzwingt einen einzelnen Trigger pro Flow — mehrere sind nicht erlaubt.
- (Optional) Aktivieren Sie Validate Payload Schema und definieren Sie ein JSON-Schema, dem der eingehende Payload entsprechen muss. Die Validierung läuft innerhalb des Schritts — eine Nichtübereinstimmung erscheint als Flow-Fehler-Event (der Endpunkt gibt weiterhin 200 zurück; der Fehler ist über
onFHError sichtbar). - Verbinden Sie die Ausgaben des Triggers (
hook_name, payload, flow_variables) mit den nachgelagerten Schritten, die ausgelöst werden sollen (Generator, Chat Output, Tool Calls, bedingte Verzweigungen auf hook_name usw.). - Veröffentlichen Sie den Flow.
2. Verzweigung anhand verschiedener Hook-Namen innerhalb des Flows
Der name, den die Host-Seite an sendHook() übergibt, ist ein Label, anhand dessen Ihr Flow verzweigen kann, kein Routing-Schlüssel — das Backend gleicht Namen nicht mit Knoten ab. Stattdessen wird der einzelne Chat-Hook-Trigger des Flows ausgelöst und stellt den Namen als {ChatHook.hook_name} bereit, auf den Sie in Ihrer Flow-Logik verweisen, um zu entscheiden, was zu tun ist.
Beispiel-System-Prompt:
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.
Für komplexeres Routing verbinden Sie einen bedingten Schritt mit {ChatHook.hook_name} und verzweigen Sie in mehrere nachgelagerte Pfade.
3. chatbotManager.sendHook(name, payload, options?)
chatbotManager.sendHook(
name: string,
payload?: Record<string, unknown>,
options?: { flowVariables?: Record<string, unknown> }
): Promise<void>;
Argumente
| Argument | Typ | Erforderlich | Beschreibung |
|---|
name | string | ja | Label, das an den Flow als {ChatHook.hook_name} weitergegeben wird. Der Trigger wird unabhängig vom Wert ausgelöst; Ihre Flow-Logik verzweigt darauf. |
payload | object | nein | JSON-Payload, der dem Trigger als {ChatHook.payload} übergeben wird. Wird gegen das Schema des Knotens validiert, falls aktiviert. Standard {}. |
options.flowVariables | object | nein | Sitzungsvariablen, die zusammengeführt werden, bevor der Trigger ausgelöst wird. Verfügbar für nachgelagerte Schritte und zukünftige Benutzernachrichten. |
Verhalten
- Ein Aufruf vor
onFHChatbotSessionCreated ist sicher; der Aufruf wird gepuffert und abgearbeitet, sobald die Sitzung existiert. Der Puffer ist begrenzt — siehe Eingabelimits oben. - Wenn der Flow keinen Chat-Hook-Trigger besitzt, ist die Anfrage ein stiller 200-No-Op — sodass Host-Seiten
sendHook() optimistisch aufrufen können, bevor der Flow-Autor einen Trigger verdrahtet hat. options.flowVariables wird auch in diesem Fall persistiert, sodass derselbe Aufruf als reine Kontext-Aktualisierung dient. - Wenn beim Chat-Hook-Trigger die Schemavalidierung aktiviert ist und der Payload sie nicht besteht, läuft die Validierung innerhalb des Schritts — der Endpunkt gibt 200 zurück, aber der Flow gibt ein Schritt-Fehler-Event aus (beobachtbar über
onFHError). name und options.flowVariables sind begrenzt — siehe Eingabelimits oben. Verstöße geben HTTP 422 zurück und es wird nichts persistiert.- Erfolgreiche Aufrufe lösen ein
onFHChatbotFlowVariablesUpdate-Event aus, falls options.flowVariables übergeben wurde (siehe Event-Referenz). - Wirft niemals eine Ausnahme. Netzwerkfehler und Nicht-2xx-Antworten werden über
console.warn protokolliert.
Beispiel — proaktiver Vorschlag bei SPA-Navigation
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 },
});
});
});
Beispiel — reine Kontext-Aktualisierung (kein Chat-Hook verdrahtet)
Wenn der Flow keinen Chat-Hook-Trigger besitzt, ist der Aufruf ein stiller 200 — dieselbe API kann also flow_variables synchron halten, ohne irgendetwas auszulösen:
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. Wie der Flow-Autor diese Werte konsumiert
{ChatHook.hook_name} und {ChatHook.payload.foo} — Werte, die über sendHook('x', { foo: 1 }) übergeben werden, sind auf dem Ausführungspfad des Chat-Hook-Triggers verfügbar. Nur auf dem Pfad verfügbar, der durch das Auslösen des Hooks gestartet wurde.{flow_variables.foo} — Werte, die über options.flowVariables übergeben werden, werden in den Variablen-Container der Sitzung zusammengeführt, bevor der Trigger ausgelöst wird. Jeder Ausführungspfad (einschließlich normaler durch Chat Input ausgelöster Benutzernachrichten) kann sie lesen.
Wenn die nächste Benutzernachricht einen neuen Wert sehen soll, legen Sie ihn in options.flowVariables ab — der payload allein wirkt sich nur auf den Ausführungslauf aus, der von diesem Hook gestartet wurde.
Event-Referenz
Die FlowHunt JS API löst 11 benutzerdefinierte Events auf dem window-Objekt aus. Alle Events verwenden die CustomEvent
-API mit bubbles: true und composed: true.
onFHChatbotReady
Wird ausgelöst, wenn das Chatbot-Widget vollständig gerendert und einsatzbereit ist.
- Event-Daten: keine.
- Wann: nachdem das Widget-DOM eingehängt und der Chat-Button sichtbar ist.
onFHChatbotSessionCreated
Wird ausgelöst, wenn eine neue Chat-Sitzung auf dem Server erstellt wird.
- Event-Daten:
event.detail.sessionId — die ID der neu erstellten Sitzung. - Wann: nach einem erfolgreichen API-Aufruf zur Sitzungserstellung.
onFHChatbotWindowOpened
Wird ausgelöst, wenn der Benutzer das Chat-Fenster öffnet. Wird im eingebetteten Modus nicht ausgelöst.
onFHChatbotWindowClosed
Wird ausgelöst, wenn der Benutzer das Chat-Fenster schließt. Wird im eingebetteten Modus nicht ausgelöst.
onFHMessageSent
Wird ausgelöst, wenn der Benutzer eine Nachricht sendet.
event.detail.metadata = {
content: 'Hello, I need help with...',
createdAt: '2026-02-19T10:30:00.000Z',
};
onFHMessageReceived
Wird ausgelöst, wenn der Chatbot eine Antwort empfängt und anzeigt.
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 ist optional und nur vorhanden, wenn ein menschlicher Agent beteiligt ist.
Wird ausgelöst, wenn der Benutzer Formulardaten über den Chatbot übermittelt.
event.detail.metadata = {
objectData: { name: 'John', email: 'john@example.com' },
createdAt: '2026-02-19T10:31:00.000Z',
};
onFHFeedback
Wird ausgelöst, wenn ein Benutzer eine Daumen-hoch- oder Daumen-runter-Bewertung zu einer Chatbot-Nachricht abgibt.
event.detail.metadata = {
message_id: 'msg_456',
content: 'Optional feedback text',
feedback: 'P', // 'P' = positive, 'N' = negative
};
Wird ausgelöst, wenn ein Tool oder eine Aktion während der Flow-Verarbeitung ausgeführt wird. Wird nur in den Modi flowAssistant und flowAssistantV3 ausgelöst.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_789',
message: 'Calling search API...',
},
createdAt: '2026-02-19T10:32:00.000Z',
};
onFHError
Wird ausgelöst, wenn während des Chatbot-Betriebs ein Fehler auftritt.
event.detail.metadata = {
metadata: {
flow_id: 'abc123',
message_id: 'msg_err',
message: 'Flow execution failed',
},
createdAt: '2026-02-19T10:33:00.000Z',
};
onFHChatbotFlowVariablesUpdate
Im April 2026 hinzugefügt.
Wird nach einem erfolgreichen Aufruf von chatbotManager.sendHook(...) ausgelöst, der options.flowVariables übergeben hat. Wird nicht für sendHook()-Aufrufe ausgelöst, die flowVariables weglassen.
event.detail = {
variables: {
current_page_url: 'https://example.com/products',
screen_name: 'products',
},
};
Verwenden Sie es, um zusammengeführte Variablen zu beobachten (z. B. um Ihren eigenen hostseitigen Zustand zu synchronisieren, zur Fehlersuche oder um ein UI-Element neu zu rendern, das von denselben Daten abhängt).
Abonnieren Sie unseren Newsletter
Erhalten Sie die neuesten Tipps, Trends und Angebote kostenlos.
Events abonnieren
Es gibt zwei Möglichkeiten, Chatbot-Events zu abonnieren.
Methode 1: Window-Event-Listener
Verwenden Sie window.addEventListener überall auf Ihrer Seite. Dies funktioniert auch, bevor der Chatbot geladen wurde:
<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>
Um einen Listener zu entfernen, halten Sie die Handler-Referenz fest:
var handleMessage = function (event) {
console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later …
window.removeEventListener('onFHMessageReceived', handleMessage);
Methode 2: Manager-Callback-Methoden
Innerhalb des init()-Callbacks verwenden Sie die integrierten Methoden des Chatbot-Managers:
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);
});
});
Referenz der Manager-Methoden
| Methode | Parameter | Beschreibung |
|---|
onSessionCreated(fn) | fn: () => void | Auf Sitzungserstellung lauschen |
onWindowOpened(fn) | fn: () => void | Auf Fensteröffnung lauschen |
onWindowClosed(fn) | fn: () => void | Auf Fensterschließung lauschen |
onMessageSent(fn) | fn: (event) => void | Auf Benutzernachrichten lauschen |
onMessageReceived(fn) | fn: (event) => void | Auf Bot-Antworten lauschen |
onFormDataSent(fn) | fn: (event) => void | Auf Formularübermittlungen lauschen |
onFeedback(fn) | fn: (event) => void | Auf Benutzerfeedback lauschen |
onToolCall(fn) | fn: (event) => void | Auf Tool-Ausführungen lauschen |
onError(fn) | fn: (event) => void | Auf Fehler lauschen |
openChat() | — | Öffnet das Chat-Panel |
closeChat() | — | Schließt das Chat-Panel |
sendHook(name, payload?, options?) (neu) | name: string, payload?: object, options?: { flowVariables?: object } | Löst den Chat-Hook-Trigger im laufenden Flow aus (oder führt options.flowVariables still zusammen, wenn kein Trigger verdrahtet ist) |
Um vollständig zu kontrollieren, wann der Chatbot erscheint, blenden Sie den standardmäßigen schwebenden Button aus und öffnen Sie den Chat programmatisch — zum Beispiel über Ihren eigenen benutzerdefinierten Button.
<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>
Sie können die versteckte Aktivierung mit Event-Listenern kombinieren, um erweiterte Interaktionen zu erstellen:
<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>
Vollständiges Integrationsbeispiel
Ein vollständiges Arbeitsbeispiel, das Konfigurationsüberschreibungen, Event-Tracking, benutzerdefinierte Chat-Aktivierung und die neue sendHook()-Methode zusammen demonstriert:
<!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>