Sign inGet started
← Back to all data apps

End-of-month and what-if scenario analysis for gaming studios

By Katerina Hynkova

Updated on May 19, 2025

What-if analysis enables gaming studios to simulate future outcomes by adjusting key variables (monetization strategies, user engagement, content updates), providing critical insights for data-driven decisions before EOM closes and helping teams prepare contingency plans for market fluctuations.

Use template ->

Core gaming KPIs

User engagement metrics

  • Daily active users (DAU): Count of unique players who engage with the game in a 24-hour period. DAU trends provide immediate insight into game health, with sustained declines indicating urgent issues requiring intervention.
def calculate_dau(events_df, target_date):
    """Calculate DAU for a specific date"""
    daily_events = events_df[events_df['timestamp'].dt.date == target_date]
    return daily_events['user_id'].nunique()

DAU trends offer instant insights into game performance, with persistent declines signaling serious problems requiring immediate action. Breaking down DAU by acquisition channel, device type, or geographic region reveals valuable information about audience demographics and helps identify targeted marketing opportunities.

  • Monthly active users (MAU): Total unique players who accessed the game within the past month. MAU growth indicates expanding audience reach, while the DAU/MAU ratio reveals player engagement frequency.
def calculate_mau(events_df, end_date):
    """Calculate MAU for a 30-day period ending on specified date"""
    start_date = end_date - pd.Timedelta(days=30)
    monthly_events = events_df[(events_df['timestamp'].dt.date >= start_date) &
                            (events_df['timestamp'].dt.date <= end_date)]
    return monthly_events['user_id'].nunique()

When used alongside DAU, the DAU/MAU ratio (often called "stickiness") indicates how frequently an average user returns:

def calculate_stickiness(dau, mau):
    """Calculate DAU/MAU ratio (stickiness)"""
    return dau / mau if mau > 0 else 0

# Example: A stickiness of 0.2 means users engage approximately 6 days per month

Session metrics

Behavioral indicators tracking how players interact with the game. Session length measures time spent per play session, while session frequency shows how often players return. The correlation between these metrics reveals engagement patterns among different player segments.

Tracking sessions over time allows to detect changes in user engagement patterns. For example, decreasing session length might indicate content fatigue, while increasing session frequency could signal successful re-engagement campaigns.

stažený soubor (12) (1).png

The trend graph shows session length (orange) increasing over time from approximately 6-7 minutes in April 2024 to 10-12 minutes in April 2025, with a major spike to 22 minutes in December. Session frequency (pink) has remained relatively stable between 2-3 sessions throughout the year.

Monetization metrics

  • Conversion rate: Percentage of players who make purchases, indicating monetization effectiveness. Platform-specific conversion rates highlight which environments generate better paying user conversion, informing platform prioritization decisions.
def calculate_conversion_rate(paying_users_count, total_users_count):
    """Calculate the conversion rate as a percentage"""
    return (paying_users_count / total_users_count * 100) if total_users_count > 0 else 0

# Example: Platform-specific conversion rates
def calculate_platform_conversion(df):
    """Calculate conversion rates segmented by platform"""
    result = {}
    for platform in df['platform'].unique():
        platform_data = df[df['platform'] == platform]
        paying = platform_data[platform_data['paying_user'] == True]['user_id'].nunique()
        total = platform_data['user_id'].nunique()
        result[platform] = calculate_conversion_rate(paying, total)
    return result

The industry average for mobile game conversion rates typically ranges from 2-5%, with variation by genre and monetization model.

  • ARPPU & ARPDAU: ARPPU and ARPDAU are financial metrics that measure how effectively a game generates revenue from different user segments. ARPPU (Average Revenue Per Paying User) reveals how much money paying customers typically spend, while ARPDAU (Average Revenue Per Daily Active User) shows the average revenue generated by the entire player base.
def calculate_arppu(total_revenue, paying_users_count):
    """Calculate Average Revenue Per Paying User"""
    return total_revenue / paying_users_count if paying_users_count > 0 else 0
def calculate_arpdau(total_revenue, dau):
    """Calculate Average Revenue Per Daily Active User"""
    return total_revenue / dau if dau > 0 else 0

The ratio between ARPPU and ARPDAU provides insight into your monetization concentration:

def monetization_concentration(arppu, arpdau):
    """Calculate ratio between ARPPU and ARPDAU"""
    return arppu / arpdau if arpdau > 0 else 0

# Example: A ratio of 50 means paying users spend 50x more than the average user
  • VIP revenue share: Percentage of total revenue generated by top-spending players. This metric reveals revenue concentration risk, with healthier games showing broader monetization distribution rather than dependency on a small group.

    stažený soubor (13).png
  • VIP revenue share fluctuates between 70-87% throughout the year, with the highest peaks in early 2024. The overall trend shows slight decline, suggesting growing monetization among non-VIP players, which indicates healthier revenue distribution.

    A healthy game typically maintains VIP revenue share below 80%, with lower percentages indicating broader monetization success.

  • Player retention metrics: : Measurements of player return rates after specific time periods (D1=1 day, D7=7 days, D30=30 days). Strong retention curves indicate compelling gameplay and effective re-engagement mechanisms, with platform-specific retention highlighting technical or UX issues.

def calculate_retention(df, cohort_date, retention_day):
    """
    Calculate retention rate for a specific day

    Parameters:
    - df: DataFrame with user_id and date columns
    - cohort_date: The date of the original cohort
    - retention_day: The day to check retention for (e.g., 1, 7, 30)

    Returns:
    - Retention rate as a percentage
    """
# Identify users in the original cohort
    cohort_users = df[df['date'] == cohort_date]['user_id'].unique()

    if len(cohort_users) == 0:
        return 0

# Calculate target date for retention checking
    target_date = cohort_date + pd.Timedelta(days=retention_day)

# Count users who returned on the target date
    returning_users = df[(df['date'] == target_date) &
                       (df['user_id'].isin(cohort_users))]['user_id'].nunique()

# Calculate retention rate
    retention_rate = returning_users / len(cohort_users)

    return retention_rate * 100# Convert to percentage

Building a comprehensive retention curve allows user to identify critical drop-off points in a player lifecycle:

def generate_retention_curve(df, cohort_date, days=30):
    """Generate complete retention curve for a cohort"""
    retention_curve = {}
    for day in range(1, days + 1):
        retention_curve[day] = calculate_retention(df, cohort_date, day)
    return retention_curve
  • Regional analysis and churn: Churn rate is a critical metric that measures the percentage of players who stop engaging with a game over a specific period. Understanding churn patterns helps studios identify at-risk segments and implement targeted retention strategies.

    The formula for calculating churn rate is:

Churn rate = (Number of churned users / Initial number of users) × 100
newplot (3).png

Regional churn analysis reveals how player attrition varies by geographic location, uncovering cultural, economic, and competitive factors affecting retention. As shown in the app, North America demonstrates the lowest churn rate at 2.4%, while Latin America experiences significantly higher churn at 3.6%, with Asia Pacific showing moderate levels at 3.0%.

  • Reactivation rate metrics: Reactivation rate measures the percentage of previously inactive players who return to the game, providing insights into the effectiveness of win-back campaigns and content updates.

    newplot (2) (1).png

    The app shows reactivation rates ranging from 1.5-1.9% across regions, with Middle East and Asia Pacific leading at 1.9%. The upward trends in early 2025 indicate successful win-back strategies or compelling new content releases.

  • Ad monetization analytics: Ad monetization metrics track revenue and performance of in-game advertising, a crucial revenue stream particularly for free-to-play titles.

    • eCPM analysis (effective cost per mille) measures the ad revenue generated per 1,000 impressions. The app shows eCPM growth from $3.5 to $5.5+ over a year, with a peak of $6.5 in January 2025, indicating improved ad implementation and optimization.
    def calculate_ecpm(ad_revenue, impressions):
        """
        Calculate eCPM (effective Cost Per Mille)
    
        Parameters:
        - ad_revenue: Total ad revenue in the period
        - impressions: Total ad impressions in the period
    
        Returns:
        - eCPM value
        """
        if impressions == 0:
            return 0
    
    # Formula: (Total Ad Revenue / Total Impressions) × 1000
        ecpm = (ad_revenue / impressions) * 1000
        return ecpm
    

    Tracking eCPM trends helps identify high-performing ad formats, optimal placement strategies, and seasonal variations. The correlation between ad revenue spikes and eCPM increases (as seen in January 2025) suggests that both ad volume and quality improved simultaneously.

What-if scenario analysis

What-if analysis is a powerful simulation technique allowing gaming studios to test variables before implementation, reducing risk and optimizing decision-making.

VIP notification boost scenario

This scenario tests the impact of increasing push notifications to inactive high-value players by 20%. The app shows a consistent daily revenue of $100 with cumulative additional revenue reaching $698.54 after 7 days, reactivating 8 VIPs with average revenue of $85.81 per reactivated player.

def simulate_vip_notification_boost(df, notification_increase_pct=20, vip_threshold_percentile=0.05):
    """
    Simulate the impact of increased notifications to lapsed VIPs

    Parameters:
    - df: DataFrame with player metrics
    - notification_increase_pct: Percentage increase in notifications
    - vip_threshold_percentile: Percentile threshold for VIP identification

    Returns:
    - Dictionary with simulation results
    """
# Identify VIPs based on spending
    player_spending = df.groupby('user_id')['revenue'].sum().reset_index()
    vip_threshold = player_spending['revenue'].quantile(1 - vip_threshold_percentile)
    vips = player_spending[player_spending['revenue'] >= vip_threshold]['user_id'].tolist()

# Identify lapsed VIPs
    recent_active = set(df[df['date'] >= (df['date'].max() - pd.Timedelta(days=14))]['user_id'])
    lapsed_vips = [vip for vip in vips if vip not in recent_active]

# Current reactivation metrics
    baseline_reactivation_rate = 0.05# Baseline VIP reactivation rate
    avg_revenue_per_vip = player_spending[player_spending['user_id'].isin(vips)]['revenue'].mean()

# Calculate impact of increased notifications
    new_reactivation_rate = baseline_reactivation_rate * (1 + notification_increase_pct/100)
    additional_reactivations = len(lapsed_vips) * (new_reactivation_rate - baseline_reactivation_rate)
    additional_revenue = additional_reactivations * avg_revenue_per_vip

    return {
        'lapsed_vips': len(lapsed_vips),
        'baseline_reactivation_rate': baseline_reactivation_rate,
        'new_reactivation_rate': new_reactivation_rate,
        'additional_reactivations': additional_reactivations,
        'avg_revenue_per_reactivated_vip': avg_revenue_per_vip,
        'additional_revenue': additional_revenue,
        'roi': additional_revenue / (len(lapsed_vips) * 0.01)# Assuming notification cost
    }

This approach is particularly valuable for evaluating the ROI of notification campaigns, which can be a double-edged sword—too few might miss reactivation opportunities, while too many risk player annoyance and potential churn.

Surprise bonus pack scenario

This scenario examines the impact of offering a $5 bonus to the top 1% of VIPs. The simulation shows approximately $1,000 daily net revenue impact, with cumulative impact reaching over $7,000 by the end of the 7-day period, demonstrating an impressive 16.9x ROI.

stažený soubor (7).png

The graph illustrates a consistent daily net revenue impact of approximately $1,000 from offering a $5 surprise bonus to the top 1% of VIPs, with the cumulative impact (orange line) steadily increasing to reach over $7,000 by the end of the 7-day period.

Weekend engagement drop scenario

This scenario predicts revenue impacts from a 10% decline in weekend player activity. The analysis shows revenue losses of approximately $214 per day on Saturday and Sunday, with cumulative revenue impact reaching -$428.72 (2.9% of weekly revenue).

def simulate_weekend_engagement_drop(df, engagement_drop_pct=10):
    """
    Predict revenue impact of weekend engagement decline

    Parameters:
    - df: DataFrame with 'date', 'revenue', 'DAU' columns
    - engagement_drop_pct: Percentage drop in weekend engagement

    Returns:
    - Dictionary with simulation results
    """
# Add day of week
    df['day_of_week'] = df['date'].dt.day_name()

# Calculate average metrics by day of week
    day_metrics = df.groupby('day_of_week').agg({
        'DAU': 'mean',
        'revenue': 'mean'
    }).reset_index()

# Apply engagement drop to weekends
    weekend_days = ['Saturday', 'Sunday']
    impact = []

    for _, row in day_metrics.iterrows():
        day = row['day_of_week']
        baseline_dau = row['DAU']
        baseline_revenue = row['revenue']

        if day in weekend_days:
# Apply engagement drop
            new_dau = baseline_dau * (1 - engagement_drop_pct/100)
            new_revenue = baseline_revenue * (1 - engagement_drop_pct/100)
            revenue_impact = new_revenue - baseline_revenue
        else:
# No change for weekdays
            new_dau = baseline_dau
            new_revenue = baseline_revenue
            revenue_impact = 0

        impact.append({
            'day_of_week': day,
            'baseline_dau': baseline_dau,
            'new_dau': new_dau,
            'baseline_revenue': baseline_revenue,
            'new_revenue': new_revenue,
            'revenue_impact': revenue_impact
        })

# Calculate overall impact
    impact_df = pd.DataFrame(impact)
    weekly_revenue = impact_df['baseline_revenue'].sum()
    total_impact = impact_df['revenue_impact'].sum()
    weekend_impact = impact_df[impact_df['day_of_week'].isin(weekend_days)]['revenue_impact'].sum()

    return {
        'daily_impact': impact_df,
        'weekend_impact': weekend_impact,
        'total_weekly_impact': total_impact,
        'impact_percentage': (total_impact / weekly_revenue) * 100
    }

This analysis helps studios prepare for expected weekend engagement fluctuations and develop compensatory strategies like special weekend events or bonuses to maintain revenue.

VIP tier impact forecast

This scenario tests promotions targeting mid-spending "dolphin" players (51,201 users) with a 10% value bonus pack. The forecast shows highest revenue boost on day one (over $4,000) that gradually diminishes over two weeks, with cumulative impact reaching approximately $14,000 and a strong 3.1x ROI.

stažený soubor (8).png

The graph shows the forecasted daily revenue impact of offering a 10% value bonus pack to mid-tier spenders, with highest revenue boost on day one (over $4,000) that gradually diminishes over two weeks, while the cumulative impact (orange line) steadily rises to approximately $14,000 by the forecast end.

Sensitivity analysis

Sensitivity analysis identifies which metrics most significantly impact revenue, helping studios prioritize improvement initiatives.

stažený soubor (9).png

The app shows that conversion rate is the most powerful revenue lever, with a 1% improvement generating $21.44 in additional revenue, followed by D1 retention ($17.15) and D7 retention ($10.72). Focusing on the top 3 metrics, a 5% improvement in each could yield a total impact of $246.52 in additional revenue.

This analysis provides a prioritization framework for resource allocation, highlighting high-ROI improvement opportunities.

Early warning system

An early warning system monitors game performance against targets to identify issues before they impact month-end results.

stažený soubor (10).png

The app's early warning system reveals D1 retention exceeding targets (121.2%), VIP revenue share on track (99.9%), conversion rate slightly underperforming (87.3%), and alarming shortfalls in total revenue (21.9%) and DAU (3.7%).

Color-coding (green, orange, red) provides an intuitive visualization of performance status, helping teams quickly identify metrics requiring intervention. This proactive approach allows studios to address issues before they significantly impact month-end results.

Conclusion

EOM and what-if analysis tools help gaming studios make smarter decisions by using real data instead of guesswork, allowing them to better understand how players behave, spot ways to boost revenue, and quickly fix issues as they arise. By analyzing key metrics like player activity, in-game purchases, and retention rates, studios can see which improvements-such as raising conversion rates-will have the biggest impact, and test different strategies before spending time or money on them.

As competition in gaming grows, using real-time analytics and early warning systems is becoming essential for keeping players happy, improving games, and staying successful in a fast-changing market.

FAQ

What is what-if analysis in the context of gaming studios?

What-if analysis allows studios to simulate the impact of changes (e.g., pricing, features, marketing spend) on key metrics like revenue, retention, or engagement before implementing them.

How does EOM (End-of-Month) reporting benefit game studios?

EOM reporting provides a comprehensive summary of performance metrics, enabling studios to assess monthly trends, identify issues, and make informed strategic decisions.

What are the main use cases for scenario analysis in gaming?

Scenario analysis helps with forecasting revenue, optimizing monetization strategies, planning live ops events, and assessing the impact of design changes or market shifts.

Which metrics are most important to track in gaming analytics?

Key metrics include DAU/MAU (daily/monthly active users), ARPDAU (average revenue per daily active user), retention rates, churn, and conversion rates.

Can what-if analysis be automated for real-time decision-making?

Yes, AI-based tools can automate scenario analysis and anomaly detection, enabling studios to respond quickly to changes in player behavior or monetization performance.

How do studios use scenario analysis for monetization?

By modeling different pricing strategies, ad placements, or in-app purchase offers, studios can predict potential revenue outcomes and select the most effective approach.

Resources

Katerina Hynkova

That’s it, time to try Deepnote

Get started – it’s free
Book a demo

Footer

Solutions

  • Notebook
  • Data apps
  • Machine learning
  • Data teams

Product

Company

Comparisons

Resources

  • Privacy
  • Terms

© Deepnote