Guides
AI Targeting
Outfame's AI targeting figures out which users are most likely to follow you back — and keeps getting better at it over time. This guide explains how the model actually works under the hood, how to tune it for your account, and how to run A/B tests to find your best targeting setup.
How the model works
There are three layers to how the targeting engine makes decisions:
1. Audience graph analysis
When you add competitor accounts, hashtags, and locations, the model maps out a graph of potential target users. For each person, it looks at:
- Profile signals — Bio text, how often they post, follower-to-following ratio, account age.
- Content signals — What they post about, caption sentiment, which hashtags they use and how.
- Engagement signals — How they interact with content — liking, commenting, story viewing patterns.
- Network signals — Who they follow, who follows them, mutual connections with your existing audience.
2. Quality scoring
Every potential target gets a quality score between 0.0 and 1.0. It's a prediction: how likely is this person to follow you back and actually stick around? The model is a gradient-boosted decision tree trained on 400M+ historical interactions across the platform.
| Score range | Classification | Expected follow-back rate |
|---|---|---|
| 0.9 - 1.0 | Excellent | 35-50% |
| 0.7 - 0.9 | Good | 20-35% |
| 0.5 - 0.7 | Fair | 10-20% |
| 0.3 - 0.5 | Low | 5-10% |
| 0.0 - 0.3 | Excluded | Filtered out automatically |
3. Dynamic optimization
The model doesn't just score once and call it a day — it adjusts in real time based on what's actually happening. If followers from a particular competitor account are converting well, it leans into that source harder. If a hashtag keeps producing followers who unfollow within a week, it dials that source down. You don't need to do anything — this happens automatically.
// View how the AI is distributing your targeting
const stats = await outfame.engagement.stats("acc_7Gx2kLm9Qr");
console.log("Average quality score:", stats.avg_quality_score);
// 0.84 — Higher is better. Aim for 0.75+
// View per-source quality in activity logs
const activities = await outfame.engagement.activity("acc_7Gx2kLm9Qr", {
limit: 100
});
// Group by source to see which targeting inputs perform best
const sourcePerformance = {};
activities.data.forEach(act => {
if (!sourcePerformance[act.source]) {
sourcePerformance[act.source] = { total: 0, totalScore: 0 };
}
sourcePerformance[act.source].total++;
sourcePerformance[act.source].totalScore += act.quality_score;
});Configuring AI optimization
The ai_optimization object in your targeting config controls how much freedom the AI has to adjust things on its own.
{
"ai_optimization": {
"enabled": true,
"mode": "balanced",
"quality_threshold": 0.7
}
}Modes
| Mode | Behavior | Best for |
|---|---|---|
conservative | Only filters out clearly bad targets. Won't go beyond your manually configured sources. | Established brands that know exactly who their audience is. |
balanced | Refines within your parameters and may suggest new sources. This is the default. | Most accounts. Good tradeoff between growth speed and audience quality. |
aggressive | Actively explores new audience segments, tests new hashtags, and goes beyond your initial config. | New accounts, accounts ready to scale, or when you want the AI to discover audiences you haven't thought of. |
Quality threshold
The quality_threshold is your minimum score cutoff. Anyone below this score won't be targeted. Crank it up and you'll get fewer but higher-quality targets. Lower it and you'll get more volume but a lower follow-back rate. It's a tradeoff — here's how it plays out in practice:
| Threshold | Pool size | Follow-back rate | Growth speed |
|---|---|---|---|
| 0.5 | Large | ~15% | Fast |
| 0.7 | Medium | ~22% | Moderate (recommended) |
| 0.85 | Small | ~30% | Slow but very high quality |
| 0.95 | Very small | ~40% | Minimal daily actions, premium audience only |
Custom audience segments
On the Turbo plan, you can split your targeting into named segments that the AI optimizes independently. This is useful when you want to reach different audience types with different strategies — say, a core audience vs. an expansion audience — without them competing for the same budget of daily actions.
curl -X PUT https://api.outfame.com/v1/targeting/config \
-H "Authorization: Bearer sk_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"account_id": "acc_7Gx2kLm9Qr",
"segments": [
{
"name": "Core audience",
"weight": 0.6,
"competitor_accounts": ["direct_competitor_1", "direct_competitor_2"],
"hashtags": ["yourindustry", "yourproduct"],
"filters": {
"age_range": { "min": 25, "max": 40 },
"activity_level": "high"
}
},
{
"name": "Expansion audience",
"weight": 0.3,
"competitor_accounts": ["adjacent_brand_1"],
"hashtags": ["broaderindustry", "relatedtopic"],
"filters": {
"age_range": { "min": 18, "max": 50 },
"activity_level": "medium"
}
},
{
"name": "Local fans",
"weight": 0.1,
"locations": [{ "name": "Los Angeles, CA", "radius_km": 30 }],
"hashtags": ["losangeles", "lalife"],
"filters": {
"activity_level": "high"
}
}
]
}'The weight field controls what percentage of your daily engagement actions go to each segment. Set core to 0.6 and it gets 60% of all actions. The AI optimizes within each segment on its own — so your "Core audience" and "Expansion audience" develop independently.
A/B testing targeting strategies
Want to know for sure which targeting approach works best? Run a real test. If you manage multiple accounts (or use Turbo's segment feature), you can set up controlled experiments.
Experiment design
// Create two accounts with different targeting strategies
const accountA = await outfame.accounts.create({
instagram_username: "brand_test_a",
platform: "instagram",
targeting_config: {
competitor_accounts: ["competitor_x", "competitor_y"],
hashtags: ["broad_hashtag_1", "broad_hashtag_2"],
filters: { activity_level: "medium" },
ai_optimization: { enabled: true, mode: "aggressive" }
}
});
const accountB = await outfame.accounts.create({
instagram_username: "brand_test_b",
platform: "instagram",
targeting_config: {
competitor_accounts: ["niche_creator_1", "niche_creator_2"],
hashtags: ["specific_hashtag_1", "specific_hashtag_2"],
filters: { activity_level: "high", min_engagement_rate: 2.0 },
ai_optimization: { enabled: true, mode: "conservative" }
}
});
// After 14 days, compare results
const analyticsA = await outfame.analytics.overview(accountA.id, { period: "14d" });
const analyticsB = await outfame.analytics.overview(accountB.id, { period: "14d" });
console.log("Strategy A - Net growth:", analyticsA.net_growth);
console.log("Strategy A - Engagement:", analyticsA.engagement_rate);
console.log("Strategy B - Net growth:", analyticsB.net_growth);
console.log("Strategy B - Engagement:", analyticsB.engagement_rate);What to compare
- Follow-back rate — Your primary quality signal. Higher = better targeting.
- 30-day retention — Are these new followers still around a month later? This separates good growth from vanity metrics.
- Engagement rate — Do new followers actually like and comment on your stuff, or are they ghosts?
- Net growth — Followers gained minus lost. The number that actually matters at the end of the day.
- Quality score trend — Is the AI's average score going up over time? That means it's learning what works for your account.
Using AI suggestions
The targeting suggestions endpoint gives you weekly recommendations based on what the model has learned. Here's how to review and auto-apply suggestions programmatically:
// Fetch suggestions with reasoning
const suggestions = await outfame.targeting.suggestions("acc_7Gx2kLm9Qr", {
goal: "balanced",
include_reasoning: true
});
// Auto-apply high-confidence suggestions
if (suggestions.confidence > 0.85) {
const currentConfig = await outfame.targeting.config("acc_7Gx2kLm9Qr");
// Add suggested competitors
const newCompetitors = [
...currentConfig.competitor_accounts,
...suggestions.suggestions.add_competitors.map(s => s.username)
];
// Add suggested hashtags
const newHashtags = [
...currentConfig.hashtags,
...suggestions.suggestions.add_hashtags.map(s => s.tag)
];
// Remove underperforming sources
const toRemove = suggestions.suggestions.remove_suggestions;
const cleanedHashtags = newHashtags.filter(h =>
!toRemove.some(r => r.type === "hashtag" && r.value === h)
);
await outfame.targeting.update("acc_7Gx2kLm9Qr", {
competitor_accounts: newCompetitors,
hashtags: cleanedHashtags
});
console.log("Applied AI suggestions. Estimated impact:",
suggestions.estimated_impact);
}Model updates
The targeting model retrains every week using fresh engagement data from across the platform. Updates roll out automatically — you don't need to change anything in your integration. If you're curious which version is live:
curl https://api.outfame.com/v1/targeting/model-info \
-H "Authorization: Bearer sk_live_your_api_key"
// Response
{
"model_version": "v3.14.2",
"last_trained": "2026-02-07T02:00:00Z",
"training_data_size": "412M interactions",
"accuracy_metrics": {
"follow_back_prediction_auc": 0.891,
"quality_score_correlation": 0.847
}
}