Skip to content

Cognipeer Webchat Integration ​

Complete guide for integrating Cognipeer Webchat into your website or application using the official SDK.

Overview ​

The Cognipeer SDK provides three flexible ways to integrate webchat:

  1. Iframe Embed - Embed chat directly in a container element
  2. URL Generation - Generate URLs with custom parameters and handle events
  3. Floating Widget - Add a floating chat button (like Intercom/Drift)

Installation ​

NPM/Yarn (TypeScript/JavaScript projects) ​

bash
npm install @cognipeer/sdk
# or
yarn add @cognipeer/sdk

CDN (Direct browser usage) ​

html
<script src="https://unpkg.com/@cognipeer/sdk@latest/dist/webchat-browser.min.js"></script>

Method 1: Iframe Embed ​

Embed the webchat directly into a container element on your page.

Basic Example ​

typescript
import { CognipeerWebchat } from '@cognipeer/sdk';

const webchat = new CognipeerWebchat({
  hookId: 'your-hook-id',
  containerId: 'chat-container',
  width: '100%',
  height: '600px'
});

webchat.mount();

HTML Setup ​

html
<div id="chat-container"></div>

With Custom Theme ​

typescript
const webchat = new CognipeerWebchat({
  hookId: 'your-hook-id',
  containerId: 'chat-container',
  theme: {
    primary: '#00b5a5',
    headerBG: '#ffffff',
    mainBG: '#f5f5f5',
    radius: '12px',
    fontFamily: 'Inter, sans-serif'
  },
  logo: {
    src: 'https://example.com/logo.png',
    width: 120,
    height: 40
  }
});

webchat.mount();

With Context and Parameters ​

typescript
const webchat = new CognipeerWebchat({
  hookId: 'your-hook-id',
  containerId: 'chat-container',
  contact: {
    email: 'user@example.com',
    name: 'John Doe'
  },
  context: {
    userId: '12345',
    plan: 'premium',
    customData: { foo: 'bar' }
  },
  params: {
    source: 'landing-page',
    campaign: 'summer-2024'
  }
});

webchat.mount();

Method 2: URL Generation with Events ​

Generate webchat URLs and handle events for custom integrations.

Basic URL Generation ​

typescript
import { CognipeerWebchat } from '@cognipeer/sdk';

const webchat = new CognipeerWebchat({
  hookId: 'your-hook-id'
});

// Generate URL with parameters
const url = webchat.generateUrl({
  contact: { email: 'user@example.com' },
  context: { userId: '123' },
  params: { source: 'website' }
});

console.log(url);
// https://app.cognipeer.com/webchat/your-hook-id?contact=...&context=...

Opening in New Window ​

typescript
const url = webchat.generateUrl();
window.open(url, 'Cognipeer Chat', 'width=400,height=600');

Event Listening ​

Listen to webchat events for deeper integration:

typescript
const webchat = new CognipeerWebchat({
  hookId: 'your-hook-id',
  containerId: 'chat-container'
});

// Listen for ready event
webchat.on('ready', (event) => {
  console.log('Webchat is ready!');
});

// Listen for messages
webchat.on('message-received', (event) => {
  console.log('New message:', event.data.content);
  console.log('Conversation ID:', event.data.conversationId);
});

// Listen for conversation creation
webchat.on('conversation-created', (event) => {
  console.log('Conversation created:', event.data.conversationId);
  // Store conversation ID in your database
  saveConversationId(event.data.conversationId);
});

// Listen for errors
webchat.on('error', (event) => {
  console.error('Chat error:', event.data.message);
});

webchat.mount();

Client Tool Execution ​

Handle tool calls from the AI to execute functions on the client side:

typescript
const webchat = new CognipeerWebchat({
  hookId: 'your-hook-id',
  containerId: 'chat-container'
});

// Listen for tool calls
webchat.on('tool-call', async (event) => {
  const { executionId, toolName, args } = event.data;
  
  console.log(`AI requested tool: ${toolName}`, args);
  
  try {
    let result;
    
    // Execute the requested tool
    switch (toolName) {
      case 'getCurrentUser':
        result = await fetchCurrentUser();
        break;
      case 'getOrderStatus':
        result = await fetchOrderStatus(args.orderId);
        break;
      case 'submitFeedback':
        result = await submitFeedback(args);
        break;
      default:
        throw new Error(`Unknown tool: ${toolName}`);
    }
    
    // Send result back to webchat
    webchat.sendToolResult({
      executionId,
      success: true,
      output: JSON.stringify(result)
    });
  } catch (error) {
    // Send error back
    webchat.sendToolResult({
      executionId,
      success: false,
      output: '',
      error: error.message
    });
  }
});

webchat.mount();

Programmatic Control ​

Control the webchat programmatically:

typescript
// Send a message
webchat.sendMessage('Hello from the parent app!');

// Open chat (in widget mode)
webchat.open();

// Close chat
webchat.close();

// Start new conversation
webchat.newConversation();

// Cleanup
webchat.destroy();

Method 3: Floating Widget ​

Add a floating chat widget button to your website (similar to Intercom, Drift, etc.).

Basic Widget ​

typescript
import { CognipeerWebchat } from '@cognipeer/sdk';

const widget = CognipeerWebchat.createWidget({
  hookId: 'your-hook-id',
  position: 'bottom-right'
});

Customized Widget ​

typescript
const widget = CognipeerWebchat.createWidget({
  hookId: 'your-hook-id',
  position: 'bottom-right',
  size: 60,
  buttonColor: '#00b5a5',
  iconColor: '#ffffff',
  autoOpen: false,
  zIndex: 9999,
  theme: {
    primary: '#00b5a5',
    headerBG: '#ffffff',
    mainBG: '#f9fafb'
  },
  contact: {
    email: 'user@example.com',
    name: 'John Doe'
  }
});

Widget Positions ​

typescript
// Bottom right (default)
position: 'bottom-right'

// Bottom left
position: 'bottom-left'

// Top right
position: 'top-right'

// Top left
position: 'top-left'

Custom Icon ​

typescript
const widget = CognipeerWebchat.createWidget({
  hookId: 'your-hook-id',
  icon: `
    <svg width="24" height="24" viewBox="0 0 24 24">
      <!-- Your custom SVG icon -->
    </svg>
  `
});

Widget with Events ​

typescript
const widget = CognipeerWebchat.createWidget({
  hookId: 'your-hook-id',
  position: 'bottom-right'
});

// Listen to widget events
widget.on('open', () => {
  console.log('Widget opened');
  // Track analytics
  analytics.track('Chat Opened');
});

widget.on('close', () => {
  console.log('Widget closed');
});

widget.on('message-sent', (event) => {
  console.log('User sent message:', event.data.content);
});

// Destroy widget
widget.destroy();

CDN Usage (Vanilla JavaScript) ​

For plain HTML/JavaScript projects without a build system:

html
<!DOCTYPE html>
<html>
<head>
  <title>Cognipeer Webchat</title>
</head>
<body>
  <!-- Option 1: Iframe Embed -->
  <div id="chat-container" style="width: 100%; height: 600px;"></div>

  <!-- Load Cognipeer Webchat -->
  <script src="https://unpkg.com/@cognipeer/sdk@latest/dist/webchat-browser.min.js"></script>
  
  <script>
    // Iframe embed
    var webchat = new CognipeerWebchat({
      hookId: 'your-hook-id',
      containerId: 'chat-container'
    });
    webchat.mount();

    // OR: Floating widget
    // var widget = CognipeerWebchat.createWidget({
    //   hookId: 'your-hook-id',
    //   position: 'bottom-right'
    // });
  </script>
</body>
</html>

React Integration ​

Iframe Component ​

tsx
import { useEffect, useRef } from 'react';
import { CognipeerWebchat } from '@cognipeer/sdk';

export function ChatComponent() {
  const webchatRef = useRef<CognipeerWebchat | null>(null);

  useEffect(() => {
    webchatRef.current = new CognipeerWebchat({
      hookId: 'your-hook-id',
      containerId: 'chat-container',
      theme: {
        primary: '#00b5a5'
      }
    });

    webchatRef.current.mount();

    // Cleanup
    return () => {
      webchatRef.current?.destroy();
    };
  }, []);

  return <div id="chat-container" style={{ width: '100%', height: '600px' }} />;
}

Widget Component ​

tsx
import { useEffect, useRef } from 'react';
import { CognipeerWebchat } from '@cognipeer/sdk';

export function ChatWidget() {
  const widgetRef = useRef<CognipeerWebchat | null>(null);

  useEffect(() => {
    widgetRef.current = CognipeerWebchat.createWidget({
      hookId: 'your-hook-id',
      position: 'bottom-right'
    });

    // Cleanup
    return () => {
      widgetRef.current?.destroy();
    };
  }, []);

  return null; // Widget is positioned fixed
}

Vue.js Integration ​

vue
<template>
  <div id="chat-container" style="width: 100%; height: 600px"></div>
</template>

<script>
import { CognipeerWebchat } from '@cognipeer/sdk';

export default {
  name: 'ChatComponent',
  data() {
    return {
      webchat: null
    };
  },
  mounted() {
    this.webchat = new CognipeerWebchat({
      hookId: 'your-hook-id',
      containerId: 'chat-container'
    });
    this.webchat.mount();
  },
  beforeUnmount() {
    this.webchat?.destroy();
  }
};
</script>

Angular Integration ​

typescript
import { Component, OnInit, OnDestroy } from '@angular/core';
import { CognipeerWebchat } from '@cognipeer/sdk';

@Component({
  selector: 'app-chat',
  template: '<div id="chat-container" style="width: 100%; height: 600px"></div>'
})
export class ChatComponent implements OnInit, OnDestroy {
  private webchat?: CognipeerWebchat;

  ngOnInit() {
    this.webchat = new CognipeerWebchat({
      hookId: 'your-hook-id',
      containerId: 'chat-container'
    });
    this.webchat.mount();
  }

  ngOnDestroy() {
    this.webchat?.destroy();
  }
}

Configuration Options ​

WebchatConfig ​

OptionTypeDescriptionDefault
hookIdstringRequired. Hook ID for the webchat channel-
apiUrlstringAPI base URL'https://app.cognipeer.com'
containerIdstringDOM element ID for iframe mounting-
widthstringIframe width'100%'
heightstringIframe height'600px'
themeWebchatThemeTheme customization-
logoWebchatLogoLogo customization-
contactWebchatContactPre-fill contact info-
contextRecord<string, any>Additional context-
paramsRecord<string, any>Parameters for peer-
welcomeMessagestringWelcome message-
showPoweredBybooleanShow Cognipeer badgefalse
allowAttachmentsbooleanAllow file uploadsfalse
maxAttachmentsnumberMax attachment count5

WebchatTheme ​

OptionTypeDescriptionDefault
primarystringPrimary color (hex)'#00b5a5'
headerBGstringHeader background'#ffffff'
mainBGstringMain background'#ffffff'
footerBGstringFooter background'#ffffff'
radiusstringBorder radius'7px'
fontFamilystringFont family'Helvetica, Arial, sans-serif'

WebchatWidgetConfig ​

All WebchatConfig options plus:

OptionTypeDescriptionDefault
position'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'Widget position'bottom-right'
sizenumberButton size (px)60
buttonColorstringButton background colortheme.primary or '#00b5a5'
iconColorstringIcon color'#ffffff'
autoOpenbooleanAuto-open on loadfalse
zIndexnumberZ-index for widget9999

Events ​

EventDescriptionData
readyWebchat initialized-
openChat opened-
closeChat closed-
message-sentUser sent message{ content, conversationId }
message-receivedAI sent message{ content, conversationId, messageId }
conversation-createdNew conversation{ conversationId, contactId }
tool-callAI requests tool execution{ conversationId, messageId, executionId, toolName, args }
errorError occurred{ message, code }

Best Practices ​

1. Store Conversation IDs ​

typescript
webchat.on('conversation-created', (event) => {
  // Store for future reference
  localStorage.setItem('cognipeer_conversation_id', event.data.conversationId);
  
  // Or send to your backend
  fetch('/api/save-conversation', {
    method: 'POST',
    body: JSON.stringify({ conversationId: event.data.conversationId })
  });
});

2. Pre-fill User Context ​

typescript
const webchat = new CognipeerWebchat({
  hookId: 'your-hook-id',
  contact: {
    email: currentUser.email,
    name: currentUser.name
  },
  context: {
    userId: currentUser.id,
    plan: currentUser.subscription.plan,
    // Add any relevant context
  }
});

3. Handle Tool Calls Gracefully ​

typescript
webchat.on('tool-call', async (event) => {
  try {
    const result = await executeToolSafely(event.data.toolName, event.data.args);
    webchat.sendToolResult({
      executionId: event.data.executionId,
      success: true,
      output: JSON.stringify(result)
    });
  } catch (error) {
    console.error('Tool execution failed:', error);
    webchat.sendToolResult({
      executionId: event.data.executionId,
      success: false,
      output: '',
      error: 'Failed to execute tool'
    });
  }
});

4. Cleanup on Unmount ​

Always call destroy() when removing the webchat:

typescript
useEffect(() => {
  const webchat = new CognipeerWebchat({ ... });
  webchat.mount();
  
  return () => {
    webchat.destroy(); // Cleanup listeners and iframe
  };
}, []);

Troubleshooting ​

Iframe Not Loading ​

  • Verify your hookId is correct
  • Check browser console for errors
  • Ensure the container element exists in DOM

Events Not Firing ​

  • Verify postMessage listeners are set up correctly
  • Check browser security settings
  • Ensure iframe origin is allowed

Styling Issues ​

  • Use style property to override iframe styles
  • Check for CSS conflicts with your page
  • Use theme customization for internal styling

Support ​

For issues, questions, or feature requests:

Studio · Pulse · Console · Agent SDK and more — the Cognipeer documentation hub