The Selektable widget emits events to the host page at key moments in the customer journey. You can listen to these events to send data to your own analytics tools like Google Analytics, Meta Pixel, Mixpanel, Segment, or any other platform.
The widget communicates with the host page using the browser’s postMessage API. Add a listener on window to receive events:
Copy
window.addEventListener('message', function (event) { var data = event.data; if (!data || !data.type) return; switch (data.type) { case 'widget:ready': console.log('Widget loaded'); break; case 'widget:modal-close': console.log('Widget closed'); break; case 'widget:error': console.error('Widget error:', data.error); break; case 'widget:add-to-cart': console.log('Add to cart:', data.product, data.quantity); break; case 'widget:view-cart': console.log('View cart clicked'); break; case 'widget:checkout': console.log('Checkout clicked'); break; }});
A product page that tracks all widget events to Google Analytics 4:
Copy
<button onclick="openWidget()">View in your room</button><script src="https://app.selektable.com/widgets/embed.js" async></script><script> function openWidget() { Selektable.open('widget_abc123', { productId: 'prod-456', productTitle: 'Modern Blue Sofa', productImage: 'https://myshop.com/images/sofa.jpg' }); } // Track all widget events window.addEventListener('message', function (event) { var data = event.data; if (!data || !data.type || data.type.indexOf('widget:') !== 0) return; // Send every widget event to GA4 gtag('event', 'selektable_' + data.type.replace('widget:', ''), { store_id: data.storeId, product_id: data.product ? data.product.id : undefined, product_name: data.product ? data.product.title : undefined, error_message: data.error || undefined }); });</script>
The postMessage listener receives messages from all iframes on the page, not just Selektable. Always check that data.type starts with widget: to avoid handling unrelated messages.