Back to Blog
Strategy

Social Commerce Trends: Track Shopping Data Across Pinterest, TikTok & Instagram

May 8, 2026
7 min read
S
By SociaVault Team
Social CommerceShoppingPinterestTikTok ShopInstagramAPI

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

FactorPinterestTikTokInstagramFacebook
Purchase intentVery High (planning)Medium (impulse)High (discovery)Medium (remarketing)
Avg order value$50-150$15-50$30-100$40-120
Discovery methodSearch-drivenAlgorithm-drivenExplore + StoriesGroups + Marketplace
Best forHome, fashion, weddingBeauty, gadgets, noveltyFashion, beauty, lifestyleLocal, used goods
Content formatPins, idea pinsShort-form videoReels, Stories, Shop tabPosts, Marketplace listings
AttributionStrong (Pin clicks)Weak (impulse, no link)Medium (tap to shop)Strong (pixel/CAPI)

Social Commerce Metrics to Track

MetricDefinitionGood Benchmark
Share-to-view ratioShares / views>0.5% = strong purchase intent
Save rateSaves / impressions>2% = high purchase planning
Shopping post penaltyEng drop vs organic<20% drop is excellent
Click-through rateProfile visits / impressions>1% from shopping content
UGC-to-brand ratioOrganic reviews / your branded posts>3:1 = healthy social proof

Get Started

Sign up free — start tracking social commerce trends across every platform.


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.