Social Commerce Trends: Track Shopping Data Across Pinterest, TikTok & Instagram
Social commerce is projected to hit $2.9 trillion by 2026. Platforms aren't just awareness channels anymore ā they're storefronts. Pinterest users plan purchases, TikTok users impulse-buy, and Instagram users discover brands. Each platform drives commerce differently, and the data proves it.
Here's how to track social commerce trends with real data.
Pinterest: The Purchase Intent Platform
Pinterest users are planners. 85% of weekly Pinners have bought something based on Pins. Track what's trending in product categories:
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = 'https://api.sociavault.com/v1/scrape';
const headers = { 'X-API-Key': API_KEY };
async function trackPinterestShoppingTrends(categories) {
const trends = [];
for (const category of categories) {
const res = await fetch(
`${BASE}/pinterest/search?query=${encodeURIComponent(category + ' buy')}`,
{ headers }
);
const pins = (await res.json()).data || [];
// Analyze pin characteristics
const withPrice = pins.filter(p =>
(p.title || '').match(/\$[\d,.]+/) ||
(p.description || '').match(/\$[\d,.]+/) ||
p.price_value
);
const shopPins = pins.filter(p =>
p.is_promotable || p.product_pin_data || p.link?.includes('shop')
);
const engagement = pins.reduce((sum, p) => {
return sum + (p.repin_count || p.save_count || 0);
}, 0);
// Extract trending products
const titles = pins.map(p => p.title || p.grid_title || '').filter(Boolean);
const words = titles.join(' ').toLowerCase().split(/\s+/);
const wordFreq = {};
words.forEach(w => {
if (w.length > 3 && !['this', 'that', 'with', 'from', 'your', 'more'].includes(w)) {
wordFreq[w] = (wordFreq[w] || 0) + 1;
}
});
const topKeywords = Object.entries(wordFreq)
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.map(([word, count]) => ({ word, count }));
trends.push({
category,
totalPins: pins.length,
shoppablePins: shopPins.length,
withPricing: withPrice.length,
totalSaves: engagement,
topKeywords
});
await new Promise(r => setTimeout(r, 1200));
}
console.log('\nšļø Pinterest Shopping Trends');
console.log('ā'.repeat(55));
trends.forEach(t => {
console.log(`\n ${t.category}:`);
console.log(` Pins found: ${t.totalPins} | Shoppable: ${t.shoppablePins} | With price: ${t.withPricing}`);
console.log(` Total saves: ${t.totalSaves.toLocaleString()}`);
console.log(` Trending keywords: ${t.topKeywords.map(k => k.word).join(', ')}`);
});
return trends;
}
trackPinterestShoppingTrends([
'home decor', 'skincare routine',
'kitchen gadgets', 'workout outfit',
'wedding gifts', 'nursery design'
]);
TikTok: The Impulse Buy Engine
TikTok drives purchases through entertainment. Track what products are getting organic attention:
import os
import time
import requests
API_KEY = os.environ["SOCIAVAULT_API_KEY"]
BASE = "https://api.sociavault.com/v1/scrape"
HEADERS = {"X-API-Key": API_KEY}
def track_tiktok_commerce_trends(product_categories):
"""Track product discussion volume and engagement on TikTok"""
results = []
for category in product_categories:
queries = [
f"{category} must have",
f"{category} review",
f"tiktok made me buy {category}"
]
all_videos = []
for q in queries:
r = requests.get(f"{BASE}/tiktok/search", headers=HEADERS,
params={"query": q})
videos = r.json().get("data", [])
all_videos.extend(videos)
time.sleep(1)
# Deduplicate by video ID
seen = set()
unique = []
for v in all_videos:
vid = v.get("id")
if vid and vid not in seen:
seen.add(vid)
unique.append(v)
total_views = sum((v.get("stats") or {}).get("playCount", 0) for v in unique)
total_likes = sum((v.get("stats") or {}).get("diggCount", 0) for v in unique)
total_shares = sum((v.get("stats") or {}).get("shareCount", 0) for v in unique)
total_comments = sum((v.get("stats") or {}).get("commentCount", 0) for v in unique)
# Share-to-view ratio = purchase intent signal
share_ratio = total_views > 0 and total_shares / total_views * 100 or 0
# Find top creators in this category
creator_views = {}
for v in unique:
creator = (v.get("author") or {}).get("uniqueId", "unknown")
creator_views[creator] = creator_views.get(creator, 0) + \
(v.get("stats") or {}).get("playCount", 0)
top_creators = sorted(creator_views.items(), key=lambda x: x[1], reverse=True)[:5]
results.append({
"category": category,
"videos": len(unique),
"total_views": total_views,
"total_likes": total_likes,
"total_shares": total_shares,
"total_comments": total_comments,
"share_ratio": round(share_ratio, 3),
"top_creators": top_creators
})
# Print report
print("\nš± TikTok Commerce Trends")
print("=" * 55)
# Sort by share ratio (purchase intent)
results.sort(key=lambda x: x["share_ratio"], reverse=True)
for r in results:
print(f"\n {r['category']}:")
print(f" Videos: {r['videos']} | Views: {r['total_views']:,}")
print(f" Likes: {r['total_likes']:,} | Shares: {r['total_shares']:,}")
print(f" Share ratio: {r['share_ratio']}% (higher = stronger purchase intent)")
print(f" Top creators: {', '.join('@' + c[0] for c in r['top_creators'][:3])}")
# Commerce readiness ranking
print("\n Commerce Readiness Ranking (by share ratio):")
for i, r in enumerate(results, 1):
bar = "ā" * min(int(r["share_ratio"] * 100), 30)
print(f" {i}. {r['category']}: {bar} {r['share_ratio']}%")
return results
track_tiktok_commerce_trends([
"protein powder", "ring light",
"air fryer", "running shoes",
"desk setup", "face serum",
"phone case", "water bottle"
])
Instagram Shopping Content Analysis
Track how shopping content performs versus organic content on any Instagram account:
async function analyzeShoppingContent(username) {
const profileRes = await fetch(
`${BASE}/instagram/profile?username=${encodeURIComponent(username)}`,
{ headers }
);
const profile = (await profileRes.json()).data;
const postsRes = await fetch(
`${BASE}/instagram/posts?username=${encodeURIComponent(username)}`,
{ headers }
);
const posts = (await postsRes.json()).data || [];
const shoppingKeywords = [
'link in bio', 'shop now', 'available at', 'use code',
'discount', 'sale', 'limited edition', 'new arrival',
'drop', 'launching', 'buy', 'order', 'price'
];
const shopping = [];
const organic = [];
for (const post of posts) {
const caption = ((post.caption?.text) || '').toLowerCase();
const isShopping = shoppingKeywords.some(k => caption.includes(k));
const entry = {
likes: post.like_count || 0,
comments: post.comment_count || 0,
caption: caption.slice(0, 80)
};
(isShopping ? shopping : organic).push(entry);
}
const avgShopLikes = shopping.length > 0
? Math.round(shopping.reduce((s, p) => s + p.likes, 0) / shopping.length) : 0;
const avgOrgLikes = organic.length > 0
? Math.round(organic.reduce((s, p) => s + p.likes, 0) / organic.length) : 0;
const avgShopComments = shopping.length > 0
? Math.round(shopping.reduce((s, p) => s + p.comments, 0) / shopping.length) : 0;
const avgOrgComments = organic.length > 0
? Math.round(organic.reduce((s, p) => s + p.comments, 0) / organic.length) : 0;
const followers = profile?.follower_count || 1;
const shopEngRate = avgShopLikes > 0 ? ((avgShopLikes + avgShopComments) / followers * 100).toFixed(2) : 0;
const orgEngRate = avgOrgLikes > 0 ? ((avgOrgLikes + avgOrgComments) / followers * 100).toFixed(2) : 0;
console.log(`\nš Shopping Content Analysis: @${username}`);
console.log('ā'.repeat(50));
console.log(` Followers: ${followers.toLocaleString()}`);
console.log(`\n Shopping Content (${shopping.length} posts):`);
console.log(` Avg likes: ${avgShopLikes.toLocaleString()}`);
console.log(` Avg comments: ${avgShopComments}`);
console.log(` Eng rate: ${shopEngRate}%`);
console.log(`\n Organic Content (${organic.length} posts):`);
console.log(` Avg likes: ${avgOrgLikes.toLocaleString()}`);
console.log(` Avg comments: ${avgOrgComments}`);
console.log(` Eng rate: ${orgEngRate}%`);
console.log(`\n Shopping penalty: ${avgOrgLikes > 0 ? (100 - (avgShopLikes / avgOrgLikes * 100)).toFixed(0) : 0}% less engagement`);
return { shopEngRate, orgEngRate, shoppingPosts: shopping.length, organicPosts: organic.length };
}
analyzeShoppingContent('glossier');
Social Commerce Platform Comparison
| Factor | TikTok | |||
|---|---|---|---|---|
| Purchase intent | Very High (planning) | Medium (impulse) | High (discovery) | Medium (remarketing) |
| Avg order value | $50-150 | $15-50 | $30-100 | $40-120 |
| Discovery method | Search-driven | Algorithm-driven | Explore + Stories | Groups + Marketplace |
| Best for | Home, fashion, wedding | Beauty, gadgets, novelty | Fashion, beauty, lifestyle | Local, used goods |
| Content format | Pins, idea pins | Short-form video | Reels, Stories, Shop tab | Posts, Marketplace listings |
| Attribution | Strong (Pin clicks) | Weak (impulse, no link) | Medium (tap to shop) | Strong (pixel/CAPI) |
Social Commerce Metrics to Track
| Metric | Definition | Good Benchmark |
|---|---|---|
| Share-to-view ratio | Shares / views | >0.5% = strong purchase intent |
| Save rate | Saves / impressions | >2% = high purchase planning |
| Shopping post penalty | Eng drop vs organic | <20% drop is excellent |
| Click-through rate | Profile visits / impressions | >1% from shopping content |
| UGC-to-brand ratio | Organic reviews / your branded posts | >3:1 = healthy social proof |
Get Started
Sign up free ā start tracking social commerce trends across every platform.
Related Reading
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.