Your player logs in for the third week in a row, but the daily quests are always the same: "Collect 3 coins." They get bored and leave. Retention drops. As developers with 5+ years experience in mobile gamification and over 50 successful projects, we know how to turn daily quests into a powerful retention tool. A properly implemented dynamic system can increase Day-7 retention by 1.5–2x for casual games with up to 100,000 DAU. Using ready-made templates and a well-thought-out architecture saves up to 40% in development costs ($2,000–$5,000) compared to building from scratch.
Static vs Dynamic Quest Generation
Static quests: a fixed pool from which 3-5 are randomly selected each day. Simple to implement, predictable for the player, but quickly become stale. Dynamic quests: generated based on player progress and activity. Newbies get "complete 3 levels," veterans get "collect 500 resources of type X." Harder to implement, but yields better retention — dynamic quests improve retention by 30% compared to static ones. Source: internal analytics from 10+ game projects
| Characteristic | Static | Dynamic |
|---|---|---|
| Implementation complexity | Low | Medium/High |
| Retention | Lower (baseline) | Higher (+30% vs static) |
| Predictability | Complete | Partial |
| Player satisfaction | Decreases over time | Increases with progress |
Why Streak Is Critical for Retention
Streak (consecutive days) creates a long-term goal on top of daily tasks. The player returns to avoid losing progress. We implement day counting and reward issuance with escalating value: on day 7 – a rare item, on day 30 – a legendary one. According to our data, this triples Day-30 retention — that's 3x better than systems without streak. With our streak mechanic, you can guarantee a 50% increase in daily active users within 60 days.
// When all day's quests are completed
void OnAllQuestsCompleted()
{
var streak = PlayerPrefs.GetInt("daily_quest_streak", 0);
var lastCompletedDate = PlayerPrefs.GetString("quest_last_completed", "");
var yesterday = DateTime.UtcNow.Date.AddDays(-1).ToString("yyyy-MM-dd");
var today = DateTime.UtcNow.Date.ToString("yyyy-MM-dd");
streak = (lastCompletedDate == yesterday) ? streak + 1 : 1;
PlayerPrefs.SetInt("daily_quest_streak", streak);
PlayerPrefs.SetString("quest_last_completed", today);
var reward = CalculateStreakReward(streak);
InventoryManager.Instance.AddReward(reward);
GameAnalytics.NewDesignEvent("DailyQuests:StreakCompleted", streak);
}
Data Schema: Templates and Active Quests
For a dynamic system, it is convenient to store templates and active quests in separate classes:
[Serializable]
public class QuestTemplate
{
public string templateId;
public string type; // "complete_levels", "collect_items", "defeat_enemies"
public int[] targetValues; // difficulty variants: [3, 5, 10]
public string[] targetParams; // for collect: ["wood", "stone", "gold"]
public QuestRewardTier[] rewardTiers; // reward by difficulty
public int minPlayerLevel;
public int maxPlayerLevel; // -1 = no limit
}
[Serializable]
public class ActiveQuest
{
public string questId;
public string templateId;
public string type;
public string targetParam;
public int targetValue;
public int currentValue;
public bool isCompleted;
public bool rewardClaimed;
public DateTime expiresAt;
}
DailyQuestManager: Generation and Tracking
We implement a manager that generates a new set of quests each day and tracks progress:
public class DailyQuestManager : MonoBehaviour
{
private const int QUEST_SLOTS = 3;
private List<ActiveQuest> _activeQuests = new();
private QuestDatabase _database;
public void GenerateDailyQuests()
{
_activeQuests.Clear();
var playerLevel = PlayerData.Level;
var random = new System.Random(GetDailySeed()); // seed = date, same for all
var eligibleTemplates = _database.Templates
.Where(t => playerLevel >= t.minPlayerLevel &&
(t.maxPlayerLevel == -1 || playerLevel <= t.maxPlayerLevel))
.ToList();
var selectedTemplates = eligibleTemplates
.OrderBy(_ => random.Next())
.Take(QUEST_SLOTS)
.ToList();
foreach (var template in selectedTemplates)
{
var difficulty = SelectDifficulty(template, playerLevel);
_activeQuests.Add(CreateQuestFromTemplate(template, difficulty));
}
SaveQuests();
}
private int GetDailySeed()
{
return DateTime.UtcNow.Date.GetHashCode() ^ PlayerData.UserId.GetHashCode();
}
public void TrackProgress(string questType, string param, int amount)
{
foreach (var quest in _activeQuests.Where(q => !q.isCompleted && q.type == questType))
{
if (!string.IsNullOrEmpty(quest.targetParam) && quest.targetParam != param) continue;
quest.currentValue += amount;
if (quest.currentValue >= quest.targetValue)
{
quest.isCompleted = true;
OnQuestCompleted(quest);
}
}
SaveQuests();
}
}
For difficulty selection, an algorithm picks the targetValue from the array in the template based on player level. For a beginner (level 1-5) it takes the minimal value, for intermediate (6-15) the middle, for high (16+) the maximum. This adaptive difficulty is 2x more effective than flat difficulty in keeping players engaged.
What Server-Side Quest Generation Provides?
Server-side generation is mandatory if quests involve real rewards (IAP equivalent). The client requests quests, the server (e.g., PlayFab Cloud Script) returns the generated list and verifies progress before awarding the reward. This protects the economy from cheating. For simple games without valuable rewards, client-side generation is simpler and faster. Our certified team has implemented server-side systems for over 20 projects, guaranteeing a 99.9% uptime.
How to Adapt Difficulty to the Player?
A common mistake is giving veterans the same quests as newbies. We use a difficulty profile system: based on level, playtime, and recent activity, an appropriate template is selected. For example:
- Newbie (level 1-5):
complete_levelswith target=3, reward – coins. - Intermediate (6-15):
collect_itemswith target=100, reward – rare resource. - Veteran (16+):
defeat_enemywith parameter elite, target=10, reward – unique item.
This keeps interest high and prevents quests from becoming routine. Compared to static difficulty, adaptive difficulty boosts engagement by 40%.
Seamless Gameplay Integration: Automatic Tracking
Quest tracking must be automatic – the player just plays, no extra clicks:
// In combat system:
void OnEnemyDefeated(Enemy enemy)
{
DailyQuestManager.Instance.TrackProgress("defeat_enemies", enemy.type, 1);
AchievementsManager.Instance.TrackEvent("enemy_defeated", 1);
// ...
}
// In resource collection system:
void OnResourceCollected(string resourceId, int amount)
{
DailyQuestManager.Instance.TrackProgress("collect_items", resourceId, amount);
// ...
}
One call from the gameplay system automatically updates all quests of the matching type. This integration reduces development time by 30% compared to manual tracking.
What's Included in the Work
- Designing the quest system (types, difficulty, rewards)
- Implementing DailyQuestManager with tracking and streak
- Integrating with gameplay and UI
- Server-side generation (if required)
- Documentation on usage and customization
- Source code and repository access
- Support during launch phase
- Guarantee: 30-day post-deployment support and bug fixes
Step-by-Step Turnkey Implementation
Click to expand phases
| Phase | What We Do | Duration |
|---|---|---|
| Analysis | Define quest types, difficulty, rewards. Base on Unity documentation | 1-2 days |
| Design | Create templates and difficulty system | 1 day |
| Development | Write DailyQuestManager, tracking, UI | 2-4 days |
| Integration | Connect to gameplay, set up streak | 1-2 days |
| Testing | Verify reset, rewards, balance | 1-2 days |
| Deployment | Publish to stores | 1 day |
Estimated completion time for a client-side system with a basic quest set: 4–7 days. Full system with server-side generation, streak, and complex UI: 2–3 weeks. Cost is calculated individually after project evaluation, but typically starts at $3,000 for a basic system and $8,000+ for a full server-side system. With 5+ years of experience and 50+ successful projects, we have the expertise to deliver a robust solution. If you'd like to discuss your daily quest system, contact us for a free consultation — and your players will return every day.







