skills/marketing-growth/social-proof-widgets/SKILL.md
Display real-time social proof including recent purchases, review counts, visitor counts, and verified buyer badges to build trust and boost conversions
npx skillsauth add finsilabs/awesome-ecommerce-skills social-proof-widgetsInstall 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.
Social proof widgets — recent purchase notifications, visitor counts, review badges, and low-stock indicators — reduce purchase anxiety and increase conversion rates by 10–30% on product pages. For Shopify and WooCommerce, dedicated apps (Fomo, TrustPulse, ProveSource) install these widgets without code. Building custom widgets is only necessary for headless stores with specific design requirements.
| Platform | Best For | Shopify | WooCommerce | BigCommerce | Price | |----------|---------|---------|-------------|-------------|-------| | Fomo | Real-time purchase notifications | App Store | Plugin | Via JS | $19+/mo | | TrustPulse | Recent purchases + live visitor count | — | Plugin | Via JS | $5+/mo | | ProveSource | All platforms, highly customizable | App Store | Via JS | Via JS | Free tier; $20+/mo | | Judge.me | Review count badge + verified buyer badge | App Store | Plugin | App Marketplace | Free tier; $15/mo | | Custom | Headless stores, specific design needs | Via API | Via API | Via API | Dev cost |
Recommendation: Use Fomo for Shopify (best purchase notifications) and TrustPulse for WooCommerce. For review badges, use your existing review platform (Judge.me, Yotpo) — they include star rating badges automatically.
/products/)For headless stores, build a social proof API and client widget:
// GET /api/products/:id/social-proof
// Returns real data only — never fabricate counts
export async function getProductSocialProof(req: Request, res: Response) {
const productId = req.params.id;
const [recentOrders, reviewSummary, stockLevel] = await Promise.all([
db.orderLineItems.findAll({
where: { productId, createdAt: { gte: subHours(new Date(), 48) } },
include: ['order.shippingAddress'],
limit: 10,
}),
db.productReviews.aggregate(productId),
db.productVariants.findMinStock(productId),
]);
// Anonymize PII — first name and city only
const recentPurchases = recentOrders.map(item => ({
firstName: item.order.shippingAddress.firstName,
location: `${item.order.shippingAddress.city}, ${item.order.shippingAddress.stateCode}`,
timeAgo: formatTimeAgo(item.createdAt),
productName: item.productName,
}));
return res.json({
recentPurchases,
reviews: { average: reviewSummary.avgRating, total: reviewSummary.total },
stockLevel: {
isLow: stockLevel > 0 && stockLevel <= 5,
quantity: stockLevel,
isSoldOut: stockLevel === 0,
},
});
}
Client-side purchase notification toast — using DOM methods to prevent XSS:
class SocialProofToast {
private queue: Array<{ firstName: string; location: string; productName: string; timeAgo: string }> = [];
private isShowing = false;
async init(productId: string) {
const response = await fetch(`/api/products/${productId}/social-proof`);
const data = await response.json();
this.queue = data.recentPurchases.slice(0, 5);
this.showNext();
}
private showNext() {
if (this.queue.length === 0 || this.isShowing) return;
const purchase = this.queue.shift()!;
this.isShowing = true;
const toast = document.createElement('div');
toast.className = 'sp-toast';
const strong = document.createElement('strong');
strong.textContent = `${purchase.firstName} from ${purchase.location}`; // textContent prevents XSS
const span = document.createElement('span');
span.textContent = ` purchased ${purchase.productName}`;
const time = document.createElement('time');
time.textContent = purchase.timeAgo;
toast.appendChild(strong);
toast.appendChild(span);
toast.appendChild(time);
document.body.appendChild(toast);
setTimeout(() => {
toast.remove();
this.isShowing = false;
setTimeout(() => this.showNext(), 8000); // 8-second gap between toasts
}, 5000);
}
}
Low-stock messaging ("Only 3 left!") drives urgency effectively — but only show real inventory counts. Fake urgency destroys trust when customers notice it.
In Shopify: Install Urgency Bear or Hurrify from the Shopify App Store — they read your actual Shopify inventory and display "Only X left" messages on product pages.
In WooCommerce: Enable WooCommerce's built-in low-stock display:
Custom thresholds: Use CSS to style the low-stock message based on quantity levels.
Always test before deploying sitewide. Both Fomo and TrustPulse have built-in A/B testing.
For manual A/B testing:
requestIdleCallback; never block the critical render pathtextContent for all customer-derived data — prevents XSS vulnerabilities; never use innerHTML with customer names or locations| Problem | Solution |
|---------|----------|
| Toast notifications feel spammy | Limit to 3 per session; add 8-second gaps; hide on cart/checkout |
| Widget hurts conversion (A/B test shows negative lift) | Disable immediately; test with different placement, copy, or timing before abandoning |
| Review badge not appearing in Google search results | Ensure AggregateRating schema is server-rendered (not just client-side JS); verify with Google Rich Results Test |
| Low-stock indicator showing wrong quantity | Subscribe to inventory change webhooks rather than polling; stale data creates false urgency |
| Social proof widget slowing page load | Load all social proof widgets asynchronously after page interactive; use requestIdleCallback or setTimeout(fn, 0) |
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