Skip to main content

How it works

The FMV widget emits structured analytics events as the user progresses through the Builder. Events travel from the widget iframe to fmv.js on your page via postMessage. From there, they are automatically pushed to window.dataLayer (if it exists) for Google Tag Manager, and emitted through the FMV.on('track:...') JavaScript listener API for custom integrations.
Widget iframe  →  postMessage  →  fmv.js (your page)
                                    ├→ window.dataLayer.push()   (GTM)
                                    └→ FMV.on('track:...')        (JS)
Events contain only Builder metadata — step names, counts, and totals. No personally identifiable information (PII) is included in any event payload.

Available events

Event nameTriggerData fields
fmv_startedBuilder loadsbuilderId
fmv_step_completedUser clicks NextbuilderId, stepIndex, stepName
fmv_summary_viewedSummary page mountsbuilderId, itemCount, totalPrice
fmv_quote_submittedQuote API returns successbuilderId, quoteId

Google Tag Manager (dataLayer)

If window.dataLayer exists on your page when fmv.js loads, events are automatically pushed — no FMV configuration needed. Each push follows this shape:
window.dataLayer.push({
  event: "fmv_step_completed",
  fmv: {
    builderId: "abc123",
    stepIndex: 2,
    stepName: "Accessories"
  }
});

GTM setup

  1. Create a Custom Event trigger — set the event name to the FMV event you want to capture (e.g. fmv_step_completed).
  2. Create Data Layer Variables — map each field under the fmv object (e.g. fmv.builderId, fmv.stepIndex).
  3. Attach to your tag — wire the trigger and variables to your GA4, Meta, or other marketing tag.
Repeat for each event you want to track.

JavaScript listener

Use FMV.on() to listen for events directly in JavaScript:
FMV.on('track:started', function (data) {
  console.log('Builder started:', data.builderId);
});

FMV.on('track:step_completed', function (data) {
  console.log('Step completed:', data.stepName);
});

FMV.on('track:summary_viewed', function (data) {
  console.log('Summary viewed — items:', data.itemCount, 'total:', data.totalPrice);
});

FMV.on('track:quote_submitted', function (data) {
  console.log('Quote submitted:', data.quoteId);
});
Naming convention: dataLayer events use the fmv_ prefix (e.g. fmv_step_completed), while JavaScript listeners use the track: prefix without fmv_ (e.g. track:step_completed).

Wix limitation

Wix sandboxes custom HTML blocks inside their own iframe, which means window.dataLayer pushes from fmv.js may not reach the main page’s GTM container. If you’re on Wix, use the JavaScript listener approach or install GTM inside the same Wix HTML embed block as the FMV script.

Privacy

Analytics events stay entirely on your page — FMV does not send event data to any third party. For more on how FMV handles data, see Data & Privacy.