Hashtag Research Strategy: Find High-Impact, Low-Competition Tags (2025)
You post on Instagram. You add 30 hashtags. You use the same ones everyone recommends: #love #instagood #photooftheday #beautiful #happy.
Your post gets 15 likes. All from your existing followers. Zero new discovery.
Meanwhile, someone in your niche uses 10 carefully researched hashtags and gains 200 new followers from one post.
What is the difference? They understand something most people miss: popular hashtags are useless for growth. They are too competitive. Your post drowns in millions of others. The algorithm never shows it to anyone new.
The real strategy is finding hashtags in the sweet spot—popular enough to have an active audience, but not so saturated that your content disappears.
Let me show you how to find those hashtags using actual data instead of random guessing.
Why Most Hashtag Strategies Fail
Before we get into research methods, you need to understand why your current approach probably does not work.
The Saturation Problem
Look at #love on Instagram. Over 2.1 billion posts. Your post gets added to that pile. Within 60 seconds, hundreds of new posts bury yours. Nobody scrolling that hashtag ever sees your content.
Big accounts can use massive hashtags because they already have reach. When Nike uses #love, their post still gets engagement from their 200 million followers. The hashtag is just bonus exposure.
But if you have 2,000 followers? That hashtag does nothing. You need hashtags where your post stays visible long enough for discovery.
The Relevance Problem
Generic hashtags attract generic audiences who do not care about your content.
Someone scrolling #beautiful is not looking for your specific product. They are mindlessly browsing pretty pictures. Even if they see your post, they scroll past.
But someone searching #sustainablefashionblogger is actively interested in that niche. They follow accounts, they engage, they buy. Relevant hashtags bring quality followers, not vanity metrics.
The Banned Hashtag Problem
Instagram and TikTok ban hashtags that get abused by spam or inappropriate content. Using a banned hashtag makes your post invisible.
Popular hashtags get banned and reinstated constantly. #valentinesday was banned in 2023. #alone was banned for mental health concerns. #beautyblogger gets shadowbanned periodically.
If you are not checking hashtag status, you might be using banned tags and wondering why nobody sees your posts.
The Platform Difference Problem
Instagram and TikTok hashtags work completely differently.
Instagram allows 30 hashtags. TikTok recommends 3-5. Instagram hashtags drive discovery through explore pages. TikTok hashtags help the algorithm categorize your content for the For You page.
Using the same strategy on both platforms fails.
The Hashtag Sweet Spot
Here is the framework that actually works.
The Size Range
Hashtags fall into categories by post count:
Mega hashtags (over 1 million posts): Too competitive. Your post disappears instantly. Avoid these unless you already have massive reach.
Large hashtags (100k - 1 million posts): Still very competitive but potentially useful if highly relevant to your niche.
Medium hashtags (10k - 100k posts): The sweet spot for most accounts. Active audience, manageable competition.
Small hashtags (1k - 10k posts): Great for niche targeting. Less traffic but highly engaged audiences.
Micro hashtags (under 1k posts): Very specific. Use a few for ultra-targeted reach.
The best strategy: Mix sizes. Use mostly medium and small hashtags with a few large ones for broader reach.
The Relevance Test
Every hashtag must pass this test: Would someone searching this hashtag actually want to see my content?
If you are a fitness coach posting workout videos, #fitness is too broad. But #homeworkoutideas is perfect—people searching that want exactly what you offer.
If you are a food blogger posting vegan recipes, #food is useless. But #vegandinnerideas brings your exact target audience.
Relevance beats popularity every time.
The Engagement Check
Some hashtags have high post counts but low engagement. People use them but nobody actually searches them or interacts.
You need hashtags where:
- Posts get likes and comments
- Recent posts show variety (not all spam)
- Top posts have engagement relative to follower count
We will extract this data in a minute.
Extract Hashtag Data
Stop guessing. Start measuring. Here is how to get real hashtag data.
Method 1: Analyze Instagram Hashtags
Let me show you how to extract Instagram hashtag data with SociaVault:
const axios = require('axios');
async function analyzeHashtag(hashtag) {
try {
const response = await axios.get(
'https://api.sociavault.com/instagram/hashtag',
{
params: {
hashtag: hashtag,
amount: 50 // Get top 50 posts
},
headers: {
'X-API-Key': process.env.SOCIAVAULT_API_KEY
}
}
);
const posts = response.data.posts;
const totalPosts = response.data.totalPosts;
// Calculate engagement metrics
const avgLikes = posts.reduce((sum, p) => sum + p.likesCount, 0) / posts.length;
const avgComments = posts.reduce((sum, p) => sum + p.commentsCount, 0) / posts.length;
const avgEngagement = avgLikes + avgComments;
// Calculate engagement rate relative to follower count
const engagementRates = posts.map(p => {
const engagement = p.likesCount + p.commentsCount;
return (engagement / p.ownerFollowers) * 100;
});
const avgEngagementRate = engagementRates.reduce((a, b) => a + b, 0) / engagementRates.length;
return {
hashtag,
totalPosts,
avgEngagement: Math.round(avgEngagement),
avgEngagementRate: avgEngagementRate.toFixed(2),
category: categorizeHashtag(totalPosts),
posts: posts.slice(0, 10) // Keep top 10 for analysis
};
} catch (error) {
console.error(`Failed to analyze #${hashtag}:`, error.message);
return null;
}
}
function categorizeHashtag(postCount) {
if (postCount > 1000000) return 'MEGA - Too competitive';
if (postCount > 100000) return 'LARGE - Very competitive';
if (postCount > 10000) return 'MEDIUM - Sweet spot';
if (postCount > 1000) return 'SMALL - Niche targeting';
return 'MICRO - Ultra specific';
}
// Analyze multiple hashtags
async function compareHashtags(hashtags) {
console.log('Analyzing hashtags...\n');
const results = [];
for (const tag of hashtags) {
const data = await analyzeHashtag(tag);
if (data) {
results.push(data);
console.log(`#${data.hashtag}:`);
console.log(` Posts: ${data.totalPosts.toLocaleString()}`);
console.log(` Category: ${data.category}`);
console.log(` Avg Engagement: ${data.avgEngagement}`);
console.log(` Avg Engagement Rate: ${data.avgEngagementRate}%`);
console.log('');
// Small delay to avoid rate limits
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
return results;
}
// Usage
const candidateHashtags = [
'fitness',
'homeworkout',
'homeworkoutideas',
'quickworkout',
'apartmentworkout'
];
const analysis = await compareHashtags(candidateHashtags);
This shows you exactly which hashtags have the right size and engagement level.
Method 2: Find Related Hashtags
Discover hashtags you did not know existed:
async function findRelatedHashtags(seedHashtag) {
// Get posts using seed hashtag
const response = await axios.get(
'https://api.sociavault.com/instagram/hashtag',
{
params: { hashtag: seedHashtag, amount: 100 },
headers: { 'X-API-Key': process.env.SOCIAVAULT_API_KEY }
}
);
const posts = response.data.posts;
// Extract all hashtags from captions
const allHashtags = new Map();
posts.forEach(post => {
if (!post.caption) return;
// Find hashtags in caption
const hashtagMatches = post.caption.match(/#[\w]+/g) || [];
hashtagMatches.forEach(tag => {
const cleanTag = tag.substring(1).toLowerCase(); // Remove # and lowercase
if (cleanTag === seedHashtag.toLowerCase()) return; // Skip seed
if (allHashtags.has(cleanTag)) {
allHashtags.set(cleanTag, allHashtags.get(cleanTag) + 1);
} else {
allHashtags.set(cleanTag, 1);
}
});
});
// Sort by frequency
const sorted = Array.from(allHashtags.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, 20);
console.log(`\nHashtags commonly used with #${seedHashtag}:\n`);
sorted.forEach(([tag, count]) => {
console.log(`#${tag} - Used ${count} times`);
});
return sorted.map(([tag]) => tag);
}
// Discover hashtags related to your niche
const relatedTags = await findRelatedHashtags('veganrecipes');
// Now analyze those discovered hashtags
const analyzed = await compareHashtags(relatedTags.slice(0, 10));
This discovers hashtags that successful posts in your niche are already using.
Method 3: Competitor Hashtag Analysis
See what hashtags work for your competitors:
async function analyzeCompetitorHashtags(competitors) {
const hashtagPerformance = new Map();
for (const competitor of competitors) {
console.log(`Analyzing @${competitor}...`);
// Get competitor posts
const response = await axios.get(
'https://api.sociavault.com/instagram/posts',
{
params: { handle: competitor, amount: 50 },
headers: { 'X-API-Key': process.env.SOCIAVAULT_API_KEY }
}
);
const posts = response.data.posts;
// Analyze each post's hashtags and engagement
posts.forEach(post => {
if (!post.caption) return;
const engagement = post.likesCount + post.commentsCount;
const hashtags = post.caption.match(/#[\w]+/g) || [];
hashtags.forEach(tag => {
const cleanTag = tag.substring(1).toLowerCase();
if (!hashtagPerformance.has(cleanTag)) {
hashtagPerformance.set(cleanTag, {
uses: 0,
totalEngagement: 0,
avgEngagement: 0
});
}
const data = hashtagPerformance.get(cleanTag);
data.uses++;
data.totalEngagement += engagement;
data.avgEngagement = data.totalEngagement / data.uses;
});
});
await new Promise(resolve => setTimeout(resolve, 2000));
}
// Sort by average engagement
const topHashtags = Array.from(hashtagPerformance.entries())
.filter(([tag, data]) => data.uses >= 3) // Used at least 3 times
.sort((a, b) => b[1].avgEngagement - a[1].avgEngagement)
.slice(0, 30);
console.log('\nTop performing hashtags from competitors:\n');
topHashtags.forEach(([tag, data]) => {
console.log(`#${tag}:`);
console.log(` Used ${data.uses} times`);
console.log(` Avg engagement: ${Math.round(data.avgEngagement)}`);
console.log('');
});
return topHashtags.map(([tag]) => tag);
}
// Analyze your top 3 competitors
const competitorHandles = [
'competitor1',
'competitor2',
'competitor3'
];
const competitorHashtags = await analyzeCompetitorHashtags(competitorHandles);
This reveals which hashtags drive real engagement for similar accounts.
Python Version for Data Analysis
If you prefer Python for deeper analysis:
import requests
import pandas as pd
from collections import Counter
import re
def analyze_hashtag(hashtag, api_key):
"""Get hashtag data and calculate metrics"""
response = requests.get(
f'https://api.sociavault.com/instagram/hashtag',
params={'hashtag': hashtag, 'amount': 50},
headers={'X-API-Key': api_key}
)
data = response.json()
posts = data['posts']
# Create DataFrame
df = pd.DataFrame([{
'likes': p['likesCount'],
'comments': p['commentsCount'],
'engagement': p['likesCount'] + p['commentsCount'],
'followers': p['ownerFollowers'],
'engagement_rate': ((p['likesCount'] + p['commentsCount']) / p['ownerFollowers']) * 100
} for p in posts])
return {
'hashtag': hashtag,
'total_posts': data['totalPosts'],
'avg_engagement': df['engagement'].mean(),
'median_engagement': df['engagement'].median(),
'avg_engagement_rate': df['engagement_rate'].mean(),
'top_posts': df.nlargest(10, 'engagement')
}
def compare_hashtags(hashtags, api_key):
"""Compare multiple hashtags"""
results = []
for tag in hashtags:
print(f"Analyzing #{tag}...")
data = analyze_hashtag(tag, api_key)
results.append(data)
# Create comparison DataFrame
comparison = pd.DataFrame([{
'Hashtag': r['hashtag'],
'Total Posts': r['total_posts'],
'Avg Engagement': round(r['avg_engagement']),
'Median Engagement': round(r['median_engagement']),
'Avg Engagement Rate': round(r['avg_engagement_rate'], 2),
'Category': categorize_hashtag(r['total_posts'])
} for r in results])
comparison = comparison.sort_values('Avg Engagement', ascending=False)
print("\n=== HASHTAG COMPARISON ===\n")
print(comparison.to_string(index=False))
return comparison
def categorize_hashtag(post_count):
"""Categorize hashtag by size"""
if post_count > 1000000:
return 'MEGA'
elif post_count > 100000:
return 'LARGE'
elif post_count > 10000:
return 'MEDIUM'
elif post_count > 1000:
return 'SMALL'
else:
return 'MICRO'
# Usage
api_key = 'YOUR_API_KEY'
hashtags = [
'veganfood',
'veganrecipes',
'plantbasedrecipes',
'vegandinnerideas',
'quickveganmeals'
]
comparison = compare_hashtags(hashtags, api_key)
This gives you a clean comparison table for decision making.
Build Your Hashtag Strategy
Now that you have data, turn it into a strategy.
The 30-Hashtag Formula (Instagram)
Instagram allows 30 hashtags. Here is how to use them:
5 Large hashtags (100k - 1M posts)
- Broader reach, high competition
- Example: #veganfood #plantbased #healthyeating #foodblogger #veganrecipes
10 Medium hashtags (10k - 100k posts)
- Your main discovery engine
- Example: #vegandinnerideas #plantbasedmeals #veganlunch #veganbreakfast #quickveganrecipes
10 Small hashtags (1k - 10k posts)
- Niche targeting, highly engaged
- Example: #veganbowls #plantbasedfoodie #veganmealprep #vegancooking #veganfoodie
5 Micro hashtags (under 1k posts)
- Ultra specific, low competition
- Example: #veganbudgetmeals #lazyveganrecipes #vegancomfortfood #plantbasedbeginners #veganfamilymeals
This mix gives you broad reach while staying discoverable.
The 3-5 Hashtag Formula (TikTok)
TikTok recommends fewer, more targeted hashtags:
1 Broad hashtag: Category placement (#cooking) 2-3 Niche hashtags: Target audience (#veganrecipes #plantbasedcooking) 1 Trending hashtag: Ride current trends (check TikTok discover page)
TikTok's algorithm focuses more on content quality and engagement than hashtag quantity.
Create Hashtag Groups
Organize hashtags into themed groups for different content types:
const hashtagGroups = {
recipes: [
'veganrecipes', 'plantbasedrecipes', 'veganfood', 'plantbasedfood',
'vegandinnerideas', 'veganlunch', 'veganbreakfast', 'vegandessert',
'quickveganmeals', 'easyveganrecipes', 'healthyveganfood'
],
mealPrep: [
'veganmealprep', 'mealprepsunday', 'plantbasedmealprep', 'veganbatch cooking',
'veganlunchideas', 'plantbasedlunch', 'veganbowls', 'healthymealprep'
],
lifestyle: [
'veganlifestyle', 'plantbasedlife', 'vegancommunity', 'crueltyfree',
'plantpowered', 'vegansofig', 'veganlife', 'govegan'
],
tips: [
'vegantips', 'plantbasedtips', 'veganforbeginners', 'howtogov egan',
'vegannutrition', 'plantbasednutrition', 'veganprotein'
]
};
function getHashtagsForPost(contentType) {
// Get hashtags for content type
const primary = hashtagGroups[contentType] || [];
// Add some from lifestyle for variety
const lifestyle = hashtagGroups.lifestyle.slice(0, 5);
// Combine and limit to 30
const combined = [...primary, ...lifestyle].slice(0, 30);
return combined.map(tag => `#${tag}`).join(' ');
}
// Usage
const recipeHashtags = getHashtagsForPost('recipes');
console.log(recipeHashtags);
This ensures you always have relevant, tested hashtags ready.
Test and Optimize
Hashtag performance changes. Test and adjust regularly.
Track Hashtag Performance
async function trackHashtagPerformance() {
// Get your recent posts
const response = await axios.get(
'https://api.sociavault.com/instagram/posts',
{
params: { handle: 'yourbrand', amount: 30 },
headers: { 'X-API-Key': process.env.SOCIAVAULT_API_KEY }
}
);
const posts = response.data.posts;
// Extract hashtags and their post performance
const hashtagPerformance = new Map();
posts.forEach(post => {
if (!post.caption) return;
const engagement = post.likesCount + post.commentsCount;
const hashtags = post.caption.match(/#[\w]+/g) || [];
hashtags.forEach(tag => {
const cleanTag = tag.substring(1).toLowerCase();
if (!hashtagPerformance.has(cleanTag)) {
hashtagPerformance.set(cleanTag, {
uses: 0,
totalEngagement: 0,
avgEngagement: 0,
posts: []
});
}
const data = hashtagPerformance.get(cleanTag);
data.uses++;
data.totalEngagement += engagement;
data.avgEngagement = data.totalEngagement / data.uses;
data.posts.push({ id: post.id, engagement });
});
});
// Find best and worst performers
const sorted = Array.from(hashtagPerformance.entries())
.filter(([tag, data]) => data.uses >= 3)
.sort((a, b) => b[1].avgEngagement - a[1].avgEngagement);
console.log('\n=== TOP PERFORMING HASHTAGS ===\n');
sorted.slice(0, 10).forEach(([tag, data]) => {
console.log(`#${tag}: ${Math.round(data.avgEngagement)} avg (used ${data.uses} times)`);
});
console.log('\n=== WORST PERFORMING HASHTAGS ===\n');
sorted.slice(-10).forEach(([tag, data]) => {
console.log(`#${tag}: ${Math.round(data.avgEngagement)} avg (used ${data.uses} times)`);
});
return sorted;
}
const performance = await trackHashtagPerformance();
This shows which hashtags correlate with higher engagement for YOUR content.
A/B Test Hashtag Sets
Test different hashtag combinations:
const testGroups = {
control: [
// Your current hashtag set
'veganfood', 'plantbased', 'vegan', 'healthyeating', 'foodblogger'
],
testA: [
// More niche hashtags
'vegandinnerideas', 'plantbasedmeals', 'veganbowls', 'quickveganrecipes'
],
testB: [
// Mix of sizes
'veganfood', 'plantbasedrecipes', 'veganmealprep', 'vegancooking'
]
};
// Use different sets on different posts, track results
// After 10 posts per group, compare engagement
Run tests for 2-4 weeks to get meaningful data.
Common Mistakes to Avoid
Let me save you from these hashtag failures:
Mistake 1: Using banned hashtags Always check if a hashtag is active. Search it on Instagram—if no recent posts appear in the Top section, it might be shadowbanned.
Mistake 2: Repeating the exact same hashtags Instagram penalizes repetitive behavior. Rotate your hashtags. Have 5-10 groups and alternate.
Mistake 3: Ignoring hashtag relevance Do not add #love just because it is popular. Every hashtag should relate to your content and attract your target audience.
Mistake 4: Using hashtags in comments Instagram treats caption hashtags differently than comment hashtags. Put hashtags in your caption for better reach.
Mistake 5: Not updating your strategy Hashtag trends shift. What worked 6 months ago might be saturated now. Review and update quarterly.
Real Results from Strategic Hashtags
Let me show you what happens when you use data-driven hashtags.
Case 1: Food Blogger
Before: Using generic hashtags (#food #yummy #delicious #foodporn)
- Avg reach per post: 800
- New followers from hashtags: 5-10 per week
After: Using targeted hashtags (#vegancomfortfood #plantbasedmeals #veganbowlrecipes)
- Avg reach per post: 3,200
- New followers from hashtags: 40-60 per week
Result: 4x reach, 6x follower growth from hashtags
Case 2: Fitness Coach
Before: Mega hashtags (#fitness #workout #gym #motivation)
- Posts appeared in hashtag feeds for under 5 minutes
- Hashtag traffic: 2% of total reach
After: Sweet spot hashtags (#homeworkoutideas #apartmentworkout #quickworkout)
- Posts stayed visible for 2+ hours
- Hashtag traffic: 35% of total reach
Result: 17x improvement in hashtag-driven reach
Case 3: Small Business
Before: Random mix with no research
- Could not track what worked
- Inconsistent results
After: Data-driven hashtag groups tested and optimized
- Clear understanding of performance
- Consistent 25-30% reach from hashtags
Result: Predictable, scalable hashtag strategy
These are real improvements from switching to researched hashtags.
Your Action Plan
Here is what to do right now:
- Extract your top competitors' posts and analyze their hashtags
- Test 5-10 candidate hashtags with the analysis code above
- Build 3-5 hashtag groups for different content types
- Use your new hashtags for 2 weeks and track engagement
- Analyze results and iterate
Stop using the same tired hashtags everyone recommends. Start using data to find hashtags that actually work for YOUR niche.
Get your SociaVault API key and start your hashtag research today. Find the hashtags that will get your content discovered.
Your audience is searching. Make sure they find you.
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API