Analytics

FloatMessage tracks every interaction with your floating messages, chat widget, forms, surveys, and landing pages so you can measure what's working. Events are sent from the embed script in batches via navigator.sendBeacon, so they reach the server even when the visitor closes the tab.

Dashboard analytics page

Open /dashboard/analytics for a single, filterable view of activity across every product surface. The page is scoped to the domain you have selected in the global nav switcher - switch domains there to change the data set.

Tabs

The page is split into one tab per product so each has its own KPI row, charts, and breakdowns:

TabWhat you see
Float MessagesImpressions, clicks, CTR, dismissals, chat opens, chat messages. Daily activity line chart. Top pages (the URLs where messages were loaded), top countries, impressions-by-device donut. Top messages table with deep-link to the editor.
Live ChatConversations (only those with at least one exchanged message), open count, AI vs human takeover, new visitors. Conversations-per-day bar chart, AI/human donut.
Landing PagesTotal pages, published count, lifetime views, leads in range, conversion %, daily-leads bar chart. Top pages by views and top pages by leads.
Contact FormsTotal submissions in range, average per day, submissions-per-day bar chart, top forms ranked by submission count.
SurveysTotal responses, average per day, responses-per-day bar chart, top surveys ranked by response count.

Filters

  • Date range - quick presets for last 7 / 30 / 90 days, plus a custom from → to picker. Defaults to 30 days.
  • Messages (Float Messages tab only) - multi-select to drill into specific banners. Switching tabs clears it.
  • Domain - comes from the global domain switcher in the dashboard nav, not the analytics page itself. Switch domains there to change what the analytics show.

Filters live in the URL query string, so the view is shareable. Sending a teammate /dashboard/analytics?tab=chat&range=7d drops them straight into the same slice.

Top pages

On the Float Messages tab, the "Top pages" card lists the actual URLs where each impression was recorded - host + pathname, sorted by count. Use it to see which pages are driving the most exposure or to spot a runaway script tag on a host you don't expect.

Per-device split

Each impression is tagged desktop, tablet, or mobile by the embed script (UA + touch + viewport heuristics). The Float Messages tab donut breaks down impressions by device for the selected range; each row in the messages list also shows its own three-segment device bar so you can see the split per banner.

Event types

EventFired when…
impressionA floating message renders on a visitor's page (after all targeting / scheduling / dismiss checks pass).
clickA visitor clicks any element with the fm-cta class. Also fires on contact form submissions and survey responses.
dismissA visitor closes the message via the fm-close button.
chat_openA visitor opens the chat panel (clicks the chat bubble or it auto-opens).
chat_messageA visitor sends a chat message.

How events are sent

  • Events are queued in memory inside the embed script and flushed in batches of up to 25.
  • Each batch is POSTed to /api/embed/events using navigator.sendBeacon when supported, falling back to fetch(... keepalive: true).
  • Each event includes: type, messageId (if applicable), pageUrl, country, device (desktop|tablet|mobile), and a stable visitorId stored in localStorage.
  • Country is detected server-side from the Cloudflare CF-IPCountry header. Device is detected client-side by the embed and falls back to the User-Agent header on legacy embeds.

Per-message stats

Each message in your dashboard shows running totals for views (impressions) and clicks. These are denormalized counters maintained from the events table - they update within seconds of new traffic.

The conversion rate is implicitly clicks / views - useful for comparing template effectiveness or optimizing copy.

Triggering CTA tracking

For templates you build yourself, attach the fm-cta class to the element you want to track as a click:

<button class="fm-cta">Get the discount</button>

The embed script intercepts the click, fires a click analytics event, also emits a cta:click JS event (see the JavaScript API) and dismisses the message.

Privacy

  • FloatMessage does not set any third-party tracking cookies.
  • The fm_vid visitor ID lives in localStorage on the visitor's own browser - not a cookie, not cross-site, never shared.
  • No PII is captured automatically. The data attached to each event is: event type, message ID, page URL, country, visitor ID. That's it.
  • To collect richer visitor data (name, plan, account ID), use the FloatMessage.setCustomData() JS API after the visitor logs in.