Skip to main content

Web channel troubleshooting

Platform-specific integrations

WordPress

WordPress and other CMS platforms may add attributes that interfere with script loading.

Issue: Script defer attribute

WordPress may add defer attribute to scripts, causing initialization to fail.

Solution:

Wait for DOM to be ready before initializing:

<script src="https://web.moveo.ai/web-client.min.js"></script>
<script>
window.addEventListener("DOMContentLoaded", function () {
MoveoAI.init({
integrationId: "YOUR_INTEGRATION_ID",
version: "v2",
})
.then((instance) => console.log("connected"))
.catch((error) => console.error(error));
});
</script>

WordPress plugin approach

For better integration, add to your theme's functions.php:

function add_moveo_chat() {
?>
<script src="https://web.moveo.ai/web-client.min.js"></script>
<script>
window.addEventListener("DOMContentLoaded", function () {
MoveoAI.init({
integrationId: "<?php echo get_option('moveo_integration_id'); ?>",
version: "v2"
})
.then((instance) => console.log("Moveo connected"))
.catch((error) => console.error(error));
});
</script>
<?php
}
add_action('wp_footer', 'add_moveo_chat');

Google Tag Manager

GTM requires specific configuration for external scripts.

Step 1: Create trigger

  1. Go to Triggers → New
  2. Choose trigger type: DOM Ready
  3. Name it: "Moveo Chat Trigger"

GTM Trigger Setup

Step 2: Create custom HTML tag

  1. Go to Tags → New
  2. Choose tag type: Custom HTML
  3. Add the following code:
<script src="https://web.moveo.ai/web-client.min.js"></script>
<script>
// GTM doesn't support ES6 arrow functions
MoveoAI.init({
integrationId: "YOUR_INTEGRATION_ID",
version: "v2",
})
.then(function (instance) {
console.log("connected");
// Push event to dataLayer
window.dataLayer.push({
event: "moveo_chat_loaded",
});
})
.catch(function (error) {
console.error(error);
window.dataLayer.push({
event: "moveo_chat_error",
error_message: error.message,
});
});
</script>
  1. Select the "Moveo Chat Trigger" you created
  2. Save and publish
Google Tag Manager doesn't support ES6 features. Use function syntax instead of arrow

functions.

Magento

Magento uses RequireJS which can conflict with standard script loading.

Solution with RequireJS:

<script src="https://requirejs.org/docs/release/2.3.7/minified/require.js"></script>
<script>
require(["https://web.moveo.ai/web-client.min.js"], function (MoveoAI) {
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
})
.then(function () {
console.log("Moveo Connected");
})
.catch(function (error) {
console.error(error);
});
});
</script>

Alternative: Add to Magento layout XML:

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<body>
<referenceContainer name="before.body.end">
<block class="Magento\Framework\View\Element\Template"
name="moveo.chat"
template="Vendor_Module::moveo-chat.phtml"/>
</referenceContainer>
</body>
</page>

Shopify

Add the web channel to your Shopify store.

Option 1: Theme editor

  1. Go to Online Store → Themes
  2. Click "Actions" → "Edit code"
  3. Open layout/theme.liquid
  4. Add before </body>:
{% if customer %}
<script src="https://web.moveo.ai/web-client.min.js"></script>
<script>
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
}).then(function (instance) {
instance.updateContext({
user: {
email: "{{ customer.email }}",
display_name: "{{ customer.first_name }} {{ customer.last_name }}",
},
customer_id: "{{ customer.id }}",
});
});
</script>
{% else %}
<script src="https://web.moveo.ai/web-client.min.js"></script>
<script>
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
});
</script>
{% endif %}

Option 2: Script tag API

Use Shopify's Script Tag API for dynamic installation:

POST /admin/api/2024-01/script_tags.json
{
"script_tag": {
"event": "onload",
"src": "https://your-server.com/moveo-shopify-integration.js"
}
}

React applications

Integrate with React using hooks.

React hook implementation:

import { useEffect, useState } from "react";

function useMoveoChat(config) {
const [instance, setInstance] = useState(null);
const [error, setError] = useState(null);

useEffect(() => {
// Load script dynamically
const script = document.createElement("script");
script.src = "https://web.moveo.ai/web-client.min.js";

script.onload = () => {
window.MoveoAI.init(config).then(setInstance).catch(setError);
};

script.onerror = () => setError(new Error("Failed to load Moveo script"));
document.body.appendChild(script);

// Cleanup
return () => {
if (instance) {
instance.destroy();
}
document.body.removeChild(script);
};
}, []);

return { instance, error };
}

// Usage
function App() {
const { instance, error } = useMoveoChat({
integrationId: "YOUR-INTEGRATION-ID",
});

useEffect(() => {
if (instance) {
// Use instance methods
instance.updateContext({ page: "home" });
}
}, [instance]);

return <div>Your app content</div>;
}

Vue.js applications

Vue.js plugin for web channel integration.

// moveo-chat-plugin.js
export default {
install(app, options) {
const script = document.createElement('script');
script.src = 'https://web.moveo.ai/web-client.min.js';

script.onload = () => {
window.MoveoAI.init(options)
.then((instance) => {
app.config.globalProperties.$moveoChat = instance;
})
.catch(console.error);
};

document.body.appendChild(script);
}
};

// main.js
import MoveoChat from './moveo-chat-plugin';

app.use(MoveoChat, {
integrationId: 'YOUR-INTEGRATION-ID',
});

// Component usage
export default {
mounted() {
if (this.$moveoChat) {
this.$moveoChat.openWindow();
}
}
};

Common issues and solutions

Issue: Chat not appearing

Symptoms: Script loads but web channel doesn't appear

Solutions:

  1. Check trusted domains:

    • Verify your domain is in the trusted domains list
    • Include both www and non-www versions
    • Check for typos in domain configuration
  2. Verify integration ID:

    // Check console for errors
    console.log("Integration ID:", "YOUR-INTEGRATION-ID");
  3. Check browser console:

    • Look for CORS errors
    • Check for JavaScript errors
    • Verify network requests succeed

Issue: CORS errors

Error: Access to script has been blocked by CORS policy

Solutions:

  1. Use the CDN URL exactly as provided
  2. Don't modify script headers
  3. Ensure HTTPS is used
  4. Check firewall/proxy settings

Issue: Multiple instances

Symptoms: Chat initializes multiple times

Solution:

// Prevent multiple initializations
if (!window.moveoChatInitialized) {
MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
}).then((instance) => {
window.moveoChatInstance = instance;
window.moveoChatInitialized = true;
});
}

Issue: Local development

Error: Chat doesn't load on localhost

Solution:

Use 127.0.0.1 instead of localhost:

// Development configuration
const isDev = window.location.hostname === "127.0.0.1";
const integrationId = isDev ? "DEV-ID" : "PROD-ID";

MoveoAI.init({
integrationId,
version: "v2",
});

Issue: Authentication failures

Symptoms: JWT rejected, session creation errors

Solutions:

  1. Check token expiration:

    // Token must expire within 5 minutes
    const payload = {
    sub: userId,
    iss: domain,
    exp: Math.floor(Date.now() / 1000) + 300, // 5 minutes
    };
  2. Verify RSA keys match:

    • Public key in Moveo must match private key on server
    • Re-generate keys if unsure
  3. Test token generation:

    // Debug token
    const token = generateToken();
    console.log("Token:", token);

    // Decode to check claims
    const decoded = jwt.decode(token);
    console.log("Claims:", decoded);

Issue: Messages not sending

Symptoms: User types but messages don't send

Possible causes:

  1. Session expired: Reinitialize chat
  2. Network issues: Check connectivity
  3. Rate limiting: Implement throttling
  4. Integration paused: Check Moveo dashboard

Issue: Style conflicts

Symptoms: Chat looks broken or unstyled

Solutions:

  1. CSS specificity:

    /* Increase specificity if needed */
    body .web-client-container {
    z-index: 999999 !important;
    }
  2. Reset conflicting styles:

    .web-client-container * {
    box-sizing: border-box;
    }
  3. Use shadow DOM isolation (if supported)

Mobile-specific issues

iOS Safari

Issue: Viewport sizing problems

<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
/>

Android WebView

Issue: File upload not working

Enable file access in WebView:

webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);

Performance optimization

Lazy loading

Load chat only when needed:

// Intersection Observer approach
const observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
loadMoveoChat();
observer.disconnect();
}
});

// Observe a trigger element
observer.observe(document.getElementById("chat-trigger-section"));

Bundle size optimization

For production builds:

// Load web client
const script = document.createElement("script");
script.src = "https://web.moveo.ai/web-client.min.js";

Debugging tools

Enable debug mode

MoveoAI.init({
integrationId: "YOUR-INTEGRATION-ID",
version: "v2",
debug: true, // If supported
}).then((instance) => {
// Expose for debugging
window.DEBUG_CHAT = instance;
});

Network monitoring

Monitor WebSocket connections:

// Override WebSocket for debugging
const OriginalWebSocket = window.WebSocket;
window.WebSocket = function (...args) {
console.log("WebSocket connection:", args[0]);
const ws = new OriginalWebSocket(...args);

ws.addEventListener("message", (e) => {
console.log("WebSocket message:", e.data);
});

return ws;
};

Getting help

If you continue experiencing issues:

  1. Check browser console for errors
  2. Verify integration settings in Moveo dashboard
  3. Test in incognito/private mode
  4. Try a different browser
  5. Contact Moveo support with:
    • Integration ID
    • Error messages
    • Browser/platform details
    • Steps to reproduce