skills/marketing-growth/video-commerce-integration/SKILL.md
Enable shoppable video experiences with live shopping events, interactive product hotspots, and one-click checkout directly from video and livestream content
npx skillsauth add finsilabs/awesome-ecommerce-skills video-commerce-integrationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Video commerce transforms passive video content into direct purchase experiences by embedding product links, interactive hotspots, and one-click checkout into video players and live streams. Shoppable video on-site increases product page conversion by up to 40% compared to static image PDPs. Live shopping events — popularized by TikTok and Instagram LIVE — create urgency and interactivity that no static page can replicate. Dedicated video commerce platforms (Tolstoy, Videowise, Firework) handle the embedding, hotspot authoring, and analytics without custom development for most stores.
| Platform | Best For | Shopify | WooCommerce | BigCommerce | Price | |----------|---------|---------|-------------|-------------|-------| | Tolstoy | Shoppable video stories and feeds, Shopify-native | App Store | Via JS embed | Via JS embed | Free tier; $19+/mo | | Videowise | High-performance shoppable video with LCP optimization | App Store | — | — | $99+/mo | | Firework | Enterprise live shopping + shoppable short video | Via JS | Via JS | Via JS | Custom pricing | | YouTube Shopping | Link YouTube videos to product catalog | Google & YouTube channel | Via Google Listings & Ads plugin | Via Channel Manager | Free | | TikTok Shop | Native TikTok LIVE shopping + video product tags | TikTok channel | TikTok plugin | Via TikTok channel | Free (commission-based) |
Recommendation: Use Tolstoy for Shopify if your goal is shoppable video stories and product page embeds — it requires no code and integrates with your Shopify catalog automatically. Use YouTube Shopping if you already have a YouTube channel with product review or tutorial content. For enterprise live shopping experiences, use Firework.
functions.php via wp_enqueue_script()For headless stores, build shoppable video with a custom player component and product hotspot overlay:
interface VideoHotspot {
id: string;
productId: string;
timestamp: number; // seconds into video when hotspot appears
displayDuration: number; // how long it stays visible (seconds)
position: { x: number; y: number }; // % from top-left (0–100)
}
interface ShoppableVideo {
id: string;
videoUrl: string; // HLS (.m3u8) or MP4 URL from CDN
thumbnailUrl: string;
hotspots: VideoHotspot[];
type: 'recorded' | 'live';
}
// React shoppable video player with time-based hotspot detection
import { useRef, useState, useEffect } from 'react';
function ShoppableVideoPlayer({ video }: { video: ShoppableVideo }) {
const videoRef = useRef<HTMLVideoElement>(null);
const [activeHotspot, setActiveHotspot] = useState<VideoHotspot | null>(null);
const [hotspotProduct, setHotspotProduct] = useState<Product | null>(null);
useEffect(() => {
const el = videoRef.current;
if (!el) return;
const onTimeUpdate = () => {
const t = el.currentTime;
const active = video.hotspots.find(h =>
t >= h.timestamp && t <= h.timestamp + h.displayDuration
) ?? null;
if (active?.id !== activeHotspot?.id) {
setActiveHotspot(active);
if (active) {
fetch(`/api/products/${active.productId}`)
.then(r => r.json())
.then(setHotspotProduct);
} else {
setHotspotProduct(null);
}
}
};
el.addEventListener('timeupdate', onTimeUpdate);
return () => el.removeEventListener('timeupdate', onTimeUpdate);
}, [video.hotspots, activeHotspot]);
return (
<div style={{ position: 'relative' }}>
<video ref={videoRef} src={video.videoUrl} poster={video.thumbnailUrl}
controls playsInline style={{ width: '100%' }} />
{activeHotspot && hotspotProduct && (
<div style={{
position: 'absolute',
left: `${activeHotspot.position.x}%`,
top: `${activeHotspot.position.y}%`,
transform: 'translate(-50%, -100%)',
background: 'white',
padding: '12px',
borderRadius: '8px',
boxShadow: '0 4px 12px rgba(0,0,0,0.15)',
zIndex: 10,
minWidth: '200px',
}}>
<p style={{ fontWeight: 600 }}>{hotspotProduct.name}</p>
<p style={{ color: '#666' }}>${hotspotProduct.price.toFixed(2)}</p>
<button onClick={() => addToCart(hotspotProduct.id)}>Add to cart</button>
</div>
)}
</div>
);
}
For LIVE shopping, use Mux for HLS stream creation and WebSockets to push the currently featured product to all viewers:
async function createLiveShoppingEvent(title: string, productIds: string[]) {
const stream = await muxClient.Video.LiveStreams.create({
playback_policy: 'public',
new_asset_settings: { playback_policy: 'public' },
});
return db.liveShoppingEvents.create({
title,
streamKey: stream.stream_key, // configure in OBS/Restream
playbackUrl: `https://stream.mux.com/${stream.playback_ids[0].id}.m3u8`,
featuredProducts: productIds,
status: 'scheduled',
});
}
// Broadcast the currently featured product to all live viewers
async function featureProductInLive(eventId: string, productId: string) {
const product = await db.products.findById(productId);
await wsServer.broadcast(`live:${eventId}`, {
type: 'feature-product',
product: { id: product.id, name: product.name, price: product.price,
imageUrl: product.images[0]?.url },
});
}
For stores already using TikTok Shop or Instagram Shopping, native LIVE is the lowest-friction path:
TikTok LIVE Shopping:
Instagram Live Shopping:
On-site LIVE with Firework:
| Metric | Where to Find | |--------|---------------| | Video play rate | Tolstoy Analytics / Firework Dashboard | | Hotspot click-through rate | Tolstoy Analytics → Interactions | | Add-to-cart from video | Tolstoy / Firework → Conversions | | Revenue attributed to video | Tolstoy → Revenue (uses UTM attribution) | | LIVE shopping orders | TikTok Seller Center → Analytics / Firework → Live Reports |
| Problem | Solution | |---------|----------| | Hotspot position drifts on mobile | Use percentage-based positioning (% from top-left), not pixel coordinates — percentages scale with the video element | | Live stream delay causes product reveal mismatch | Use low-latency RTMP settings in OBS (5s latency) or enable WHIP for sub-second latency | | Video not loading on iOS Safari | Ensure videos use H.264 codec and AAC audio; VP9 is not universally supported on iOS | | Tolstoy video slowing page load | Tolstoy lazy-loads by default — ensure you are using the Tolstoy Shopify app block, not a custom embed that bypasses their performance optimizations | | LIVE shopping products not showing | Products must be in Active status before the event; for TikTok, review takes 24–48 hours — activate products the day before |
tools
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion