Skip to main content

Embedding Interfaces

Deploy your chat and form interfaces anywhere with multiple embedding options.

Chat Interface Embedding​

The simplest way to add a chat widget to your website:

<script src="https://app.flowmaestro.com/widget/{your-slug}.js" async></script>

The widget automatically:

  • Loads configuration from your interface settings
  • Appears as a floating button
  • Handles sessions and persistence
  • Streams responses in real-time

Configuration Attributes​

Customize behavior with data attributes:

<script
src="https://app.flowmaestro.com/widget/{your-slug}.js"
data-auto-init="true"
data-position="bottom-right"
data-initial-state="collapsed"
async
></script>
AttributeValuesDescription
data-auto-inittrue, falseAuto-initialize on load
data-positionbottom-right, bottom-leftWidget position
data-initial-statecollapsed, expandedStarting state

JavaScript API​

Control the widget programmatically:

// Wait for widget to load
window.addEventListener("flowmaestro:ready", () => {
// Open chat
FlowMaestroWidget.open();

// Close chat
FlowMaestroWidget.close();

// Toggle visibility
FlowMaestroWidget.toggle();

// Check if open
const isOpen = FlowMaestroWidget.isOpen();

// Destroy widget
FlowMaestroWidget.destroy();
});

Event Listeners​

Listen to widget events:

window.addEventListener("flowmaestro:open", () => {
console.log("Chat opened");
});

window.addEventListener("flowmaestro:close", () => {
console.log("Chat closed");
});

window.addEventListener("flowmaestro:message", (event) => {
console.log("New message:", event.detail);
});

Manual Initialization​

For more control, disable auto-init:

<script
src="https://app.flowmaestro.com/widget/{your-slug}.js"
data-auto-init="false"
async
></script>

<script>
window.addEventListener("flowmaestro:loaded", () => {
// Custom initialization logic
if (userIsLoggedIn) {
FlowMaestroWidget.init({
position: "bottom-left",
initialState: "expanded",
// Pass user context
metadata: {
userId: currentUser.id,
plan: currentUser.plan
}
});
}
});
</script>

Iframe Embedding​

Full Page​

Embed the full chat experience in an iframe:

<iframe
src="https://app.flowmaestro.com/embed/chat/{your-slug}"
width="100%"
height="600"
frameborder="0"
allow="clipboard-write"
></iframe>

Inline Container​

Place the chat in a specific location:

<div class="chat-container">
<iframe
src="https://app.flowmaestro.com/embed/chat/{your-slug}"
style="width: 400px; height: 600px; border: 1px solid #e5e7eb; border-radius: 12px;"
allow="clipboard-write"
></iframe>
</div>

PostMessage Communication​

Communicate with the embedded interface:

const iframe = document.querySelector("iframe");

// Send message to iframe
iframe.contentWindow.postMessage(
{
type: "flowmaestro:sendMessage",
payload: { message: "Hello!" }
},
"https://app.flowmaestro.com"
);

// Receive messages from iframe
window.addEventListener("message", (event) => {
if (event.origin !== "https://app.flowmaestro.com") return;

if (event.data.type === "flowmaestro:newMessage") {
console.log("New message:", event.data.payload);
}
});

React Integration​

Using the Widget SDK​

Install the FlowMaestro widget package:

npm install @flowmaestro/widget

Use in your React app:

import { FlowMaestroChatWidget } from "@flowmaestro/widget/react";

function App() {
return (
<div>
<h1>My App</h1>

<FlowMaestroChatWidget
slug="your-slug"
position="bottom-right"
initialState="collapsed"
onOpen={() => console.log("Opened")}
onClose={() => console.log("Closed")}
onMessage={(msg) => console.log("Message:", msg)}
/>
</div>
);
}

Inline Chat Component​

Embed chat directly in your layout:

import { FlowMaestroChat } from "@flowmaestro/widget/react";

function SupportPage() {
return (
<div className="support-container">
<h1>Contact Support</h1>

<FlowMaestroChat
slug="support-bot"
style={{ height: "500px" }}
className="chat-embed"
/>
</div>
);
}

TypeScript Types​

The package includes TypeScript definitions:

import type { ChatWidgetProps, ChatMessage, WidgetConfig } from "@flowmaestro/widget";

Form Interface Embedding​

Share the form URL:

https://app.flowmaestro.com/form/{your-slug}

Iframe​

Embed forms in your website:

<iframe
src="https://app.flowmaestro.com/form/{your-slug}"
width="100%"
height="800"
frameborder="0"
style="border-radius: 8px;"
></iframe>

Responsive Sizing​

Make the iframe responsive:

<div style="position: relative; padding-bottom: 75%; height: 0;">
<iframe
src="https://app.flowmaestro.com/form/{your-slug}"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"
frameborder="0"
></iframe>
</div>

Custom Domains​

Host interfaces on your own domain for white-label deployments.

Setup​

  1. Add a CNAME record pointing to custom.flowmaestro.com
  2. Configure the domain in your interface settings
  3. FlowMaestro handles SSL certificates automatically

DNS Configuration​

Type: CNAME
Name: chat (or your subdomain)
Value: custom.flowmaestro.com
TTL: 300

Verification​

After DNS propagation, your interface will be available at:

https://chat.yourdomain.com

Security Considerations​

Content Security Policy​

If your site uses CSP, allow FlowMaestro:

Content-Security-Policy:
frame-src https://app.flowmaestro.com;
script-src https://app.flowmaestro.com;

Allowed Origins​

Configure allowed origins in your interface settings to restrict where the widget can be embedded.

CORS​

FlowMaestro APIs support CORS for browser-based requests from allowed origins.

Mobile Considerations​

Responsive Widget​

The chat widget is mobile-responsive by default:

  • Full-screen on small devices
  • Floating button positions adjust
  • Touch-optimized interactions

Mobile-Specific Options​

<script
src="https://app.flowmaestro.com/widget/{your-slug}.js"
data-mobile-fullscreen="true"
data-mobile-position="bottom-center"
async
></script>

Performance​

Lazy Loading​

Load the widget only when needed:

// Load on user interaction
document.querySelector(".help-button").addEventListener("click", () => {
const script = document.createElement("script");
script.src = "https://app.flowmaestro.com/widget/{your-slug}.js";
document.body.appendChild(script);
});

Preloading​

Preload for faster initial display:

<link rel="preload" href="https://app.flowmaestro.com/widget/{your-slug}.js" as="script" />

Troubleshooting​

Widget Not Appearing​

  1. Check the script URL is correct
  2. Verify the interface is published
  3. Check browser console for errors
  4. Ensure no CSP blocking

Session Issues​

  1. Check cookie settings
  2. Verify local storage is enabled
  3. Test in incognito mode

Styling Conflicts​

If your site's CSS conflicts with the widget:

/* Reset styles for widget container */
#flowmaestro-widget {
all: initial;
}