Templates
FloatMessage ships with 19 professionally designed templates. Each template is fully customizable from the dashboard — colors, text, images, buttons, and layout can all be configured without writing code.
Available Templates
| ID | Name | Description |
|---|---|---|
banner | Welcome Banner | Gradient banner with heading, text, and CTA button |
notification | Social Proof | Compact notification card with icon and text |
newsletter | Newsletter CTA | Email signup form with label, heading, and input |
square | Square Card | Centered card with badge, price, CTA, and timer |
image-message | Image Message | Card with hero image, text, and button |
center-modal | Center Modal | Full-width modal with backdrop |
blur-overlay | Blur Overlay | Glassmorphism-style overlay card |
sticky-footer | Sticky Footer Bar | Full-width bar at bottom of viewport |
top-banner | Sticky Top Banner | Full-width bar at top of viewport |
image-bg | Image Background | Card with full background image |
modal-image | Modal with Image | Side-by-side image and content modal |
image-only | Image Only | Clickable image with optional link |
story | Story Carousel | Instagram-style vertical story with slides |
cookie-banner | Cookie Banner | GDPR cookie consent bar with accept/decline buttons |
chat-cta | Chat CTA | Prompt that opens the live chat widget on click |
contact-form | Contact Form | Form with configurable fields, submissions stored and forwarded via webhook |
survey | Survey | Multi-question survey with NPS, ratings, multiple choice, and text answers |
book-appointment | Book Appointment | Visitor calendar grid + slot picker. Bookings appear in the dashboard and email confirmations include an .ics + Google/Outlook deep links. |
timecounter | Countdown Timer | Live D / H / M / S countdown to a deadline you set, with headline, paragraph, and CTA button. |
Story Carousel Details
The Story Carousel template creates an Instagram-style vertical story experience. It is designed for rich, multi-slide narratives and promotions.
Key Features
- 9:16 aspect ratio — Optimized for vertical, mobile-first content.
- Multiple slides — Add as many slides as you need to tell your story.
- Progress bar — A segmented progress indicator at the top shows the visitor which slide they are on.
- Auto-advance — Slides automatically advance after a configurable duration.
- Swipe gestures — Visitors can swipe left/right on touch devices to navigate between slides.
- Per-slide configuration — Each slide can have its own background image, text, button, and link.
Story Slide Structure
Each slide in a story supports the following fields:
| Field | Description |
|---|---|
| Background image | Full-bleed image behind the slide content |
| Heading | Large title text overlaid on the slide |
| Body text | Supporting copy below the heading |
| CTA button | Action button with configurable label and link |
| Duration | How long the slide is shown before auto-advancing (in seconds) |
Cookie Banner Details
The Cookie Banner is a full-width consent bar at the bottom of the page with “Accept” and “Decline” buttons.
How It Works
- Accept button has the
fm-ctaclass — clicking it fires thecta:clickevent and dismisses the banner - Decline button has the
fm-closeclass — clicking it dismisses the banner without firing the CTA event - Use the dismiss behavior setting to control when the banner reappears (permanent, session, duration)
Loading Scripts After Consent
Use FloatMessage.on("cta:click") to load Google Tag Manager or other scripts only after the visitor clicks Accept. See the JavaScript API docs for the full example.
Chat CTA Details
The Chat CTA template displays a compact prompt that encourages visitors to open the live chat. When the visitor clicks the “Chat Now” button, it automatically opens the chat panel.
Requirements
- Live Chat must be enabled in Chat Settings
- JavaScript API must be enabled in Chat Settings
- The CTA button uses
onclick="FloatMessage.openChat()"which runs in the global scope
Use Cases
- Prompt visitors to chat on high-intent pages (pricing, checkout)
- Offer help after a delay or scroll trigger
- Combine with geo-targeting to show localized chat prompts
Contact Form Details
The Contact Form template lets visitors submit information directly from a floating message. Submissions are stored in your dashboard and can be forwarded to a webhook.
Default Fields
The template includes three fields by default: Name, Email, and Message. All fields are required.
How Submissions Work
- Visitor fills out the form and clicks Send Message
- The embed script collects all input values and POSTs to
/api/forms/submit - Server validates required fields, stores the submission in the database
- If a webhook URL is configured, the data is forwarded as a JSON POST
- The form shows a success message and the input fields are hidden
Configuration
| Field | Description |
|---|---|
| Form Fields | JSON array defining each field: name, label, type (text, email, phone, textarea, select), and whether it’s required |
| Webhook URL | URL to POST submissions to. Works with Slack, Zapier, Make, or any endpoint that accepts JSON |
| Notify Email | Email address to receive submission notifications (coming soon) |
| Success Message | Custom text shown after successful submission (default: “Thanks! We’ll be in touch soon.”) |
Webhook Payload
When a webhook URL is configured, each submission sends a POST request with this payload:
{
"messageId": "abc123",
"data": {
"name": "John Doe",
"email": "john@example.com",
"message": "I'd like to learn more..."
},
"pageUrl": "https://example.com/contact",
"country": "US",
"submittedAt": "2026-04-08T12:00:00.000Z"
}Viewing Submissions
All submissions are available in Dashboard → Submissions. You can view details (name, email, message, page URL, country, date) and export to CSV.
HTML Structure
The embed script looks for these CSS classes inside the form template:
fm-form-input— all input, textarea, and select elements. Must have anameattributefm-form-submit— the submit buttonfm-form-success— shown after successful submission (initially hidden)fm-form-fields— container for fields (hidden after submit)
Survey Details
The Survey template is an all-in-one builder for collecting structured feedback. Use it for NPS, satisfaction ratings, polls, multi-question surveys, or open-ended research — all from the same template.
Question Types
| Type | Description |
|---|---|
| NPS | 0–10 scale with “Not likely” / “Very likely” labels. Aggregated as Net Promoter Score |
| Star rating | 1–N stars (configurable max, 3–10). Aggregated as average rating |
| Single choice | Radio-style selection from a list of custom options |
| Multi choice | Checkbox-style selection allowing multiple answers |
| Short text | Single-line free-text answer |
| Long text | Multi-line textarea for longer feedback |
Multi-Step Surveys
Add multiple questions to one survey. Visitors see one question at a time with Back and Next buttons, plus a progress indicator. Required questions block advancement until answered.
How Responses Work
- Visitor answers each step and clicks Submit on the last one
- The embed script POSTs the answers to
/api/surveys/submit - Server validates required answers against the survey config and stores them in the database
- Question text is snapshotted with the response, so editing the survey later does not break old responses
- If a webhook URL is configured on the message, the response is forwarded as JSON
- The visitor sees the configured thank-you message
Viewing Responses
All survey responses live under Dashboard → Surveys. The page shows aggregation cards (NPS score, rating average, choice distribution, recent text answers) plus the raw responses table with CSV export.
Book Appointment Details
The Book Appointment template gives visitors an inline calendar grid + slot picker, so they can self-book a meeting without leaving your site. Bookings appear in Dashboard → Appointments, the visitor gets a confirmation email with an attached .ics file plus Google / Outlook / Office 365 add-to-calendar buttons, and the owner gets an email notification (if configured).
Configuring availability
Each book-appointment message has its own schedule — you can have multiple booking widgets (e.g. "30-min discovery call" and "60-min strategy session") with different hours.
- Slot length: 15, 20, 30, 45, 60, 90, or 120 minutes
- Buffer between slots: 0–30 minutes of padding after each booking
- Owner timezone: any IANA name (defaults to your browser's)
- Weekly hours: per-weekday open/close times. Days without an entry are closed.
- Earliest lead time: how soon a visitor may book — e.g. 1 hour from now
- Future window: how far ahead they may book — e.g. 30 days
- Custom fields: extra questions beyond name + email (text, email, phone, or long text)
How bookings work
- Visitor opens the message, picks a day from the calendar grid, and chooses a slot from the list (slots are filtered against existing bookings + the buffer)
- Visitor enters name, email, optional notes + any custom fields
- The embed POSTs to
/api/embed/appointments/submit; the server re-validates that the slot is still open - If two visitors race for the same slot, the oldest write wins; the loser receives a
409and the embed refreshes availability - Visitor sees the success view with a
Download .icsbutton + Google / Outlook / Office 365 calendar buttons - Confirmation email goes to the visitor (with the .ics attached); notification email goes to the owner (if
appointmentNotifyEmailis set) - If a webhook URL is configured, the booking is forwarded as JSON
JS API event
After a successful booking, the embed emits an appointment_booked event you can listen to:
FloatMessage.on("appointment_booked", function (detail) {
console.log(detail.bookingId, detail.slotStart, detail.slotEnd);
// detail.messageId === <message id>
});Viewing & managing bookings
Bookings live under Dashboard → Appointments. The page shows a month-grid calendar with daily booking counts; click any day to see the visitor list. From there you can copy emails, send manual messages, or cancel a booking (which frees the slot back up).