Web channel developer guide
Instance methods
The web channel exposes methods to control behavior and interact with the chat programmatically.
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
}).then((instance) => {
// Use instance methods here
});
Window control
openWindow()
Opens the chat window if currently closed.
instance.openWindow();
closeWindow()
Closes the chat window if currently open.
instance.closeWindow();
Messaging
sendMessage()
Programmatically send a message to the AI Agent.
instance.sendMessage({ text: "Hello, I need help" });
// Open window after sending
instance.sendMessage({ text: "Start conversation" });
instance.openWindow();
Behavior:
- If conversation exists: sends immediately
- No conversation: overrides welcome message
- With visitor form: sends after form completion
User context
updateContext()
Update user information or session data dynamically.
instance.updateContext({
user: {
display_name: "John Doe",
email: "john@example.com",
},
customer_id: "12345",
account_type: "premium",
});
Session management
destroy()
End the conversation and hide the web channel completely.
// End session when user logs out
if (userLoggedOut) {
instance.destroy();
}
destroy()
, you can reinitialize the web channel with MoveoAI.init()
.Styling
setCSSVariables()
Dynamically update web channel appearance.
instance.setCSSVariables({
"--moveo-background-color": "#1a1a1a",
"--moveo-accent-color": "#00ff00",
"--moveo-header-height": "70px",
});
Localization
setLocale()
Change the web channel language dynamically.
instance.setLocale("es"); // Switch to Spanish
Event listeners
Subscribe to web channel events to track user interactions and session changes.
Session events
onSessionCreated
Fired when a new conversation starts.
instance.onSessionCreated(() => {
console.log("New session started");
// Track in analytics
analytics.track("Chat Started");
// Set initial context
instance.updateContext({
page_url: window.location.href,
timestamp: new Date().toISOString(),
});
});
onSessionReconnected
Fired when reconnecting to existing session (with history enabled).
instance.onSessionReconnected(() => {
console.log("Reconnected to existing session");
// Update context with new page info
instance.updateContext({
returned_user: true,
return_page: window.location.pathname,
});
});
onSessionClosed
Fired when the chat session terminates.
instance.onSessionClosed(() => {
console.log("Session terminated");
// Clean up or redirect
if (shouldRedirect) {
window.location.href = "/thank-you";
}
});
Live chat events
onConversationClosed
Fired when live chat conversation is resolved/closed.
instance.onConversationClosed(() => {
console.log("Live chat ended");
// Show feedback form
showCustomFeedbackModal();
});
onMemberLeave
Fired when an agent leaves the conversation.
instance.onMemberLeave(() => {
console.log("Agent left the conversation");
// Notify user
showNotification("Agent has disconnected");
});
Window events
onWebchatOpened
Fired when chat window opens.
instance.onWebchatOpened(() => {
// Pause video when chat opens
videoPlayer.pause();
// Track engagement
analytics.track("Chat Opened");
});
onWebchatClosed
Fired when chat window closes.
instance.onWebchatClosed(() => {
// Resume video when chat closes
videoPlayer.play();
// Save draft message if any
saveDraftMessage();
});
Activity tracking
onUserActivity
Fired on any user activity in the chat.
let inactivityTimer;
instance.onUserActivity(() => {
// Reset inactivity timer
clearTimeout(inactivityTimer);
inactivityTimer = setTimeout(() => {
console.log("User inactive for 5 minutes");
}, 300000);
});
Analytics events
Track detailed user interactions with analytics events.
Setup
instance.onAnalyticsEvent((eventData) => {
const { event, properties, timestamp } = eventData;
// Send to your analytics platform
analytics.track(event, {
...properties,
chat_session_id: properties.session_id,
timestamp: timestamp,
});
});
Available events
Interaction events
launcher_clicked
- User clicks launcherchat_expanded
- Chat window opensminimize_icon_clicked
- Minimize button clickedclose_icon_clicked
- Close button clickedmessage_click
- Message bubble clicked
Session events
session_start
- New session beginssession_end
- Session endswelcome_form_submitted
- Pre-chat form completed
Engagement events
rating_clicked
- User selects ratingrating_submitted
- Rating confirmeddownload_conversation_clicked
- Export chat
Popover events
popover_inactivity_end_chat_clicked
- End inactive chatpopover_inactivity_continue_clicked
- Continue after inactivityresolved_popover_continue_clicked
- Continue resolved chat
Event data structure
{
"timestamp": "2025-01-20T10:30:45.123Z",
"event": "launcher_clicked",
"properties": {
"session_id": "uuid-here",
"page_url": "https://example.com/products",
"user_id": "user-123" // If authenticated
}
}
Advanced integration patterns
Custom launcher
Hide default launcher and use custom button:
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
launcher: { show: false }, // Hide default launcher
}).then((instance) => {
// Custom button opens chat
document.getElementById("custom-chat-btn").addEventListener("click", () => {
instance.openWindow();
});
});
Contextual messaging
Send different messages based on page:
const pageMessages = {
"/products": "Looking for product information?",
"/pricing": "Need help choosing a plan?",
"/support": "How can we assist you today?",
};
instance.sendMessage({
text: pageMessages[window.location.pathname] || "Hello!",
});
User authentication flow
// After user logs in
async function onUserLogin(user) {
// Get fresh JWT from server
const token = await fetchUserToken(user.id);
// Destroy old session
if (window.chatInstance) {
window.chatInstance.destroy();
}
// Initialize authenticated session
window.chatInstance = await MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
identityToken: token,
version: "v2",
});
// Set user context
window.chatInstance.updateContext({
user: {
display_name: user.name,
email: user.email,
},
});
}
Analytics integration
// Google Analytics 4
instance.onAnalyticsEvent((eventData) => {
gtag("event", eventData.event, {
chat_session_id: eventData.properties.session_id,
engagement_time_msec: 100,
});
});
// Segment
instance.onAnalyticsEvent((eventData) => {
analytics.track(eventData.event, eventData.properties);
});
// Mixpanel
instance.onAnalyticsEvent((eventData) => {
mixpanel.track(eventData.event, eventData.properties);
});
Error handling
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
})
.then((instance) => {
window.chatInstance = instance;
})
.catch((error) => {
console.error("Chat initialization failed:", error);
// Show fallback contact options
document.getElementById("fallback-contact").style.display = "block";
// Report to monitoring
errorReporting.log(error);
});
Multi-language support
// Detect user language preference
const userLang =
localStorage.getItem("language") || navigator.language.substring(0, 2);
// Initialize with user's language
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
language: userLang,
version: "v2",
}).then((instance) => {
// Allow language switching
document.getElementById("lang-selector").addEventListener("change", (e) => {
instance.setLocale(e.target.value);
localStorage.setItem("language", e.target.value);
});
});
Testing and debugging
Development mode
const isDev = window.location.hostname === "localhost";
MoveoAI.init({
integrationId: isDev ? "DEV-INTEGRATION-ID" : "PROD-INTEGRATION-ID",
version: "v2",
}).then((instance) => {
if (isDev) {
// Expose instance for debugging
window.debugChat = instance;
// Log all events
instance.onAnalyticsEvent(console.log);
}
});
Event monitoring
// Monitor all chat events
const events = [
"onSessionCreated",
"onSessionReconnected",
"onSessionClosed",
"onWebchatOpened",
"onWebchatClosed",
];
events.forEach((eventName) => {
instance[eventName](() => {
console.log(`Event fired: ${eventName}`, new Date());
});
});
Performance optimization
Lazy loading
// Load chat only when needed
function loadChat() {
const script = document.createElement("script");
script.src = "https://web.moveo.ai/web-client.min.js";
script.onload = () => {
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
});
};
document.body.appendChild(script);
}
// Load on user interaction
document
.getElementById("chat-trigger")
.addEventListener("click", loadChat, { once: true });
Resource cleanup
// Clean up on page unload
window.addEventListener("beforeunload", () => {
if (window.chatInstance) {
// Save conversation state if needed
localStorage.setItem(
"chatState",
JSON.stringify({
timestamp: Date.now(),
page: window.location.href,
})
);
}
});
Security considerations
- Never expose sensitive data in client-side code
- Validate tokens server-side before passing to web channel
- Use HTTPS for all communications
- Implement rate limiting for API calls
- Sanitize user input before passing to context
- Monitor for abuse using analytics events