Beauty & Cosmetics Brand Social Intelligence: Track Trends, Creators & Competitors
Beauty is the most social-media-driven industry on the planet. A single TikTok review can sell out a product in 24 hours. Skincare routines go viral. A swatch video can make or break a new lipstick shade.
Here's how beauty brands and marketers can use social data to stay ahead.
Track Beauty Trends in Real Time
See what products and routines are trending right now:
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 trackBeautyTrends(categories) {
const trends = [];
for (const category of categories) {
// TikTok ā where beauty trends start
const tkRes = await fetch(
`${BASE}/tiktok/search?query=${encodeURIComponent(category)}`,
{ headers }
);
const videos = (await tkRes.json()).data || [];
const totalViews = videos.reduce((s, v) => s + (v.stats?.playCount || 0), 0);
const totalLikes = videos.reduce((s, v) => s + (v.stats?.diggCount || 0), 0);
const totalShares = videos.reduce((s, v) => s + (v.stats?.shareCount || 0), 0);
// Extract product mentions from descriptions
const descriptions = videos.map(v => v.desc || '').join(' ').toLowerCase();
const brandMentions = {};
const beautyBrands = [
'cerave', 'the ordinary', 'drunk elephant', 'tatcha', 'glow recipe',
'fenty', 'rare beauty', 'charlotte tilbury', 'nars', 'mac', 'glossier',
'elf', 'nyx', 'maybelline', 'loreal', 'neutrogena', 'olay', 'la roche posay'
];
for (const brand of beautyBrands) {
const count = (descriptions.match(new RegExp(brand, 'gi')) || []).length;
if (count > 0) brandMentions[brand] = count;
}
// Find top creators in this category
const creatorMap = new Map();
videos.forEach(v => {
const username = v.author?.uniqueId;
if (username) {
const existing = creatorMap.get(username) || { views: 0, count: 0 };
existing.views += v.stats?.playCount || 0;
existing.count++;
existing.followers = v.author?.stats?.followerCount || v.authorStats?.followerCount || existing.followers || 0;
creatorMap.set(username, existing);
}
});
const topCreators = [...creatorMap.entries()]
.sort((a, b) => b[1].views - a[1].views)
.slice(0, 5);
trends.push({
category,
videoCount: videos.length,
totalViews,
totalLikes,
totalShares,
shareRatio: totalViews > 0 ? (totalShares / totalViews * 100).toFixed(3) : 0,
brandMentions: Object.entries(brandMentions).sort((a, b) => b[1] - a[1]),
topCreators
});
await new Promise(r => setTimeout(r, 1500));
}
// Sort by views
trends.sort((a, b) => b.totalViews - a.totalViews);
console.log('\nš Beauty Trend Report');
console.log('ā'.repeat(60));
trends.forEach(t => {
console.log(`\n ${t.category}:`);
console.log(` Videos: ${t.videoCount} | Views: ${t.totalViews.toLocaleString()} | Shares: ${t.totalShares.toLocaleString()}`);
console.log(` Share ratio: ${t.shareRatio}% (higher = more purchase intent)`);
if (t.brandMentions.length > 0) {
console.log(` Top brands: ${t.brandMentions.slice(0, 5).map(([b, c]) => `${b} (${c})`).join(', ')}`);
}
console.log(` Top creators: ${t.topCreators.map(([u]) => '@' + u).join(', ')}`);
});
return trends;
}
trackBeautyTrends([
'skincare routine morning',
'makeup tutorial grwm',
'hair care routine',
'lip liner hack',
'sunscreen review',
'retinol before and after',
'clean beauty products',
'drugstore dupes'
]);
Compare Beauty Brands
See how brands stack up across platforms:
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 compare_beauty_brands(brands):
"""Compare beauty brands across Instagram, TikTok, and YouTube"""
results = []
for brand in brands:
entry = {"name": brand["name"], "ig": {}, "tk": {}, "yt": {}}
# Instagram
if brand.get("instagram"):
r = requests.get(f"{BASE}/instagram/profile", headers=HEADERS,
params={"username": brand["instagram"]})
data = r.json().get("data", {})
entry["ig"]["followers"] = data.get("follower_count", 0)
entry["ig"]["posts"] = data.get("media_count", 0)
time.sleep(1)
r = requests.get(f"{BASE}/instagram/posts", headers=HEADERS,
params={"username": brand["instagram"]})
posts = r.json().get("data", [])
if posts:
entry["ig"]["avg_likes"] = sum(p.get("like_count", 0) for p in posts) // max(len(posts), 1)
entry["ig"]["avg_comments"] = sum(p.get("comment_count", 0) for p in posts) // max(len(posts), 1)
entry["ig"]["eng_rate"] = round(
(entry["ig"]["avg_likes"] + entry["ig"]["avg_comments"]) /
max(entry["ig"]["followers"], 1) * 100, 2
)
time.sleep(1)
# TikTok
if brand.get("tiktok"):
r = requests.get(f"{BASE}/tiktok/profile", headers=HEADERS,
params={"username": brand["tiktok"]})
data = r.json().get("data", {})
entry["tk"]["followers"] = (data.get("stats") or {}).get("followerCount", 0)
entry["tk"]["likes"] = (data.get("stats") or {}).get("heartCount", 0)
time.sleep(1)
r = requests.get(f"{BASE}/tiktok/user/posts", headers=HEADERS,
params={"username": brand["tiktok"]})
videos = r.json().get("data", [])
if videos:
entry["tk"]["avg_views"] = sum(
(v.get("stats") or {}).get("playCount", 0) for v in videos
) // max(len(videos), 1)
time.sleep(1)
# YouTube
if brand.get("youtube"):
r = requests.get(f"{BASE}/youtube/channel", headers=HEADERS,
params={"url": brand["youtube"]})
data = r.json().get("data", {})
stats = data.get("statistics", {})
entry["yt"]["subscribers"] = int(stats.get("subscriberCount", 0))
entry["yt"]["views"] = int(stats.get("viewCount", 0))
time.sleep(1)
# Total reach
entry["total_reach"] = (
entry["ig"].get("followers", 0) +
entry["tk"].get("followers", 0) +
entry["yt"].get("subscribers", 0)
)
results.append(entry)
# Sort by total reach
results.sort(key=lambda x: x["total_reach"], reverse=True)
print("\nš Beauty Brand Comparison")
print("=" * 65)
print(f"\n {'Brand':<22} {'Instagram':>12} {'TikTok':>12} {'YouTube':>12} {'Total':>12}")
print(f" {'ā' * 60}")
for r in results:
ig = f"{r['ig'].get('followers', 0):,}"
tk = f"{r['tk'].get('followers', 0):,}"
yt = f"{r['yt'].get('subscribers', 0):,}"
total = f"{r['total_reach']:,}"
print(f" {r['name']:<22} {ig:>12} {tk:>12} {yt:>12} {total:>12}")
# Engagement ranking
print(f"\n Engagement Rate Ranking (Instagram):")
ig_ranked = sorted(
[r for r in results if r["ig"].get("eng_rate")],
key=lambda x: x["ig"]["eng_rate"],
reverse=True
)
for i, r in enumerate(ig_ranked, 1):
print(f" {i}. {r['name']}: {r['ig']['eng_rate']}% "
f"({r['ig'].get('avg_likes', 0):,} avg likes)")
return results
compare_beauty_brands([
{"name": "Rare Beauty", "instagram": "rarebeauty", "tiktok": "rarebeauty",
"youtube": "https://www.youtube.com/@rarebeauty"},
{"name": "Fenty Beauty", "instagram": "fentybeauty", "tiktok": "fentybeauty",
"youtube": "https://www.youtube.com/@fentybeauty"},
{"name": "Glossier", "instagram": "glossier", "tiktok": "glossier",
"youtube": "https://www.youtube.com/@glossier"},
{"name": "Charlotte Tilbury", "instagram": "charlottetilbury", "tiktok": "charlottetilbury",
"youtube": "https://www.youtube.com/@CharlotteTilbury"},
{"name": "e.l.f. Cosmetics", "instagram": "elfcosmetics", "tiktok": "elfyeah",
"youtube": "https://www.youtube.com/@elfcosmetics"},
])
Find Beauty Influencers by Sub-Niche
Beauty isn't one niche. It's dozens:
async function findBeautyCreators(subNiches) {
const allCreators = [];
for (const niche of subNiches) {
const res = await fetch(
`${BASE}/tiktok/search?query=${encodeURIComponent(niche)}`,
{ headers }
);
const videos = (await res.json()).data || [];
const seen = new Set();
for (const v of videos) {
const username = v.author?.uniqueId;
if (!username || seen.has(username)) continue;
seen.add(username);
allCreators.push({
username,
niche,
followers: v.author?.stats?.followerCount || v.authorStats?.followerCount || 0,
sampleViews: v.stats?.playCount || 0,
sampleLikes: v.stats?.diggCount || 0
});
}
await new Promise(r => setTimeout(r, 1500));
}
// Group by niche
const byNiche = {};
allCreators.forEach(c => {
if (!byNiche[c.niche]) byNiche[c.niche] = [];
byNiche[c.niche].push(c);
});
console.log('\nš
Beauty Creators by Sub-Niche');
console.log('ā'.repeat(55));
for (const [niche, creators] of Object.entries(byNiche)) {
const sorted = creators.sort((a, b) => b.followers - a.followers);
console.log(`\n ${niche}:`);
sorted.slice(0, 5).forEach((c, i) => {
console.log(` ${i + 1}. @${c.username} (${c.followers.toLocaleString()} followers)`);
});
}
return byNiche;
}
findBeautyCreators([
'skincare dermatologist',
'drugstore makeup',
'clean beauty natural',
'nail art tutorial',
'hair transformation',
'fragrance review perfume',
'makeup for dark skin',
'korean skincare routine',
'mature skin makeup over 40'
]);
Beauty Content Benchmarks
| Content Type | Avg Engagement Rate | Virality Potential | Sales Impact |
|---|---|---|---|
| Get Ready With Me (GRWM) | 4-8% | Very High | High ā product showcasing |
| Before/After results | 5-12% | Very High | Very High ā social proof |
| Drugstore dupes | 3-7% | High | High ā price comparison |
| Ingredient breakdowns | 2-5% | Medium | Medium ā education |
| Haul/unboxing | 3-6% | Medium | Medium ā discovery |
| Brand comparison | 4-8% | High | High ā direct comparison |
| Routine (morning/night) | 3-6% | Medium | High ā multiple products |
| Swatch videos | 2-4% | Medium | Very High ā purchase decision |
Beauty Industry Social Metrics
| Metric | What It Tells You | Benchmark |
|---|---|---|
| Share-to-view ratio | Purchase intent | >0.5% = product will sell |
| Save rate | Research intent | >3% = people planning to buy |
| Comment sentiment | Product reception | >70% positive = winner |
| UGC-to-brand ratio | Organic love vs paid | >5:1 = cult following |
| Dupe mention volume | Price sensitivity | Rising = opportunity for affordable option |
Platform Roles in Beauty
| Platform | Role in Beauty Purchase Journey |
|---|---|
| TikTok | Discovery ("TikTok made me buy it") |
| Aspiration + visual research | |
| YouTube | Deep reviews + tutorials |
| Planning + routine building | |
| Reddit (r/SkincareAddiction, r/MakeupAddiction) | Honest reviews + ingredient analysis |
Get Started
Sign up free ā start tracking beauty trends, finding influencers, and monitoring competitors with real data.
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.