How to Calculate Monthly Active Users: Rolling vs Fixed Windows, SQL, and Real Benchmarks

How to Count Monthly Active Users Without Inflating the Number

To calculate monthly active users, you count the number of distinct user identifiers that log at least one predefined ‘active’ event within a 30-day window. That window can be a fixed calendar month (e.g., April 1–30) or a rolling 30-day slice (e.g., last 30 days from today). The core mechanic is deduplication: one user who visits 50 times still equals one MAU. If you skip the deduplication step, you are measuring sessions, not users.

I learned this the hard way when I first built a mobile game dashboard. Our raw event table showed 2.1 million activity rows in a month, and I initially reported that as MAU. The real deduplicated count was 340,000. That 6x gap embarrassed me in a stakeholder meeting, but it forged a habit of always writing COUNT(DISTINCT user_id) before anything else.

Defining ‘Active’: The Step Most Teams Rush

Before you can calculate active users, you must define what ‘active’ means for your product. In a B2C social app, opening the app might qualify. In a B2B analytics tool, only users who run a query or create a report should count. The thing nobody tells you about MAU is that the metric is only as honest as this definition.

When I audited a fintech client’s dashboard, they counted any page view as active. That included bots and forgotten tabs left open overnight. After we restricted ‘active’ to a completed funds transfer or a login with MFA, their MAU dropped 22% overnight. That wasn’t a loss of users; it was a correction of noise.

For practical calculation, map each product surface to a minimal valuable action. Use a table or enum in your event schema. This clarity also helps answer the common question of how to calculate active users across multiple features: sum distinct users per action, then deduplicate again at the user level.

Calendar Month vs Rolling 30-Day MAU: The Trade-Offs

Most competitors mention ‘count unique users in a month’ but gloss over the two fundamentally different windows. A calendar-month MAU resets on the 1st; a rolling 30-day MAU slides daily. They answer different business questions.

Fixed Calendar Window

Calendar MAU aligns with finance and board reporting. It’s stable, comparable month over month, and easy to explain. The downside: a user active on March 31 and April 1 counts in both months, creating overlap that hides churn. I’ve seen growth teams celebrate ‘back-to-back growth’ that was just calendar boundary artifacts.

Rolling 30-Day Window

Rolling MAU smooths seasonality and reflects current engagement. It’s better for operational alerts. But it can be 5–15% higher than calendar MAU for the same period because of overlapping cohorts. Most people don’t realize that rolling windows make month-over-month deltas smaller and can mask a slow leak if you only watch the headline number.

Here’s a quick decision matrix I use with clients:

  • Choose calendar MAU if you report to executives, need month-level comparability, or tie metrics to billing cycles.
  • Choose rolling MAU if you run growth experiments, monitor retention weekly, or need to trigger lifecycle campaigns based on recent activity.
  • Track both if you have the analytics bandwidth; the gap between them is itself a churn signal.

Step-by-Step: Calculating MAU from Raw Event Data

If you store events in a warehouse (Snowflake, BigQuery, Postgres), you can compute MAU directly. Below is a copy-paste SQL query for event-level MAU with deduplication. It assumes a table events with columns user_id, event_time, and event_name.

Calendar Month MAU Query

Use this to count distinct active users in a given month:

SELECT
  DATE_TRUNC(‘month’, event_time) AS month,
  COUNT(DISTINCT user_id) AS mau
FROM events
WHERE event_name IN (‘app_open’,’complete_profile’,’purchase’)
  AND event_time >= ‘2024-01-01’
  AND event_time < ‘2024-02-01’
GROUP BY 1;

Replace the event list with your own defined active actions. The COUNT(DISTINCT user_id) is the non-negotiable line. Without it, you’re measuring events, not users.

Rolling 30-Day MAU Query

For a rolling window ending today:

SELECT
  COUNT(DISTINCT user_id) AS rolling_mau
FROM events
WHERE event_name IN (‘app_open’,’complete_profile’,’purchase’)
  AND event_time >= DATEADD(day, -30, CURRENT_DATE)
  AND event_time < CURRENT_DATE;

In BigQuery, swap DATEADD for DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY). The logic stays identical. If you want a daily series of rolling MAU, wrap it in a window function or a date spine join.

Spreadsheet Method for Small Datasets

If you export a list of user IDs and timestamps to CSV, use Excel or Google Sheets: create a pivot table with user ID as rows, filter to your date range and active events, then count unique IDs with =COUNTUNIQUE(A2:A10000). This is clunky past 100k rows but works for early-stage validation. For anything larger, our Monthly Active Users (MAU) Calculator handles the deduplication automatically.

Cross-Device and Anonymous User Deduplication

The biggest hidden error in MAU calculation is counting the same human twice because they switched devices. In a B2C app, a user on iPhone and web should be one MAU, not two. You need a stable identity graph: either a logged-in user_id or a probabilistic match.

In one B2B rollout, we had SSO accounts plus anonymous trial sessions. Until we stitched anonymous sessions to the eventual converted account via a temporary cookie key, our MAU was overstated by 18%. The fix was a weekly identity resolution job that mapped device_ids to account_ids post-login.

For privacy-safe deduplication, avoid relying on device IDs alone after consent revocation. More on that below.

Event Schema Design for Reliable MAU

Your ability to calculate monthly active users cleanly starts at instrumentation. I insist on a three-column minimum: user_id (never null for authenticated), anonymous_id (for pre-login), and event_name (enumerated). If your warehouse mixes these, you’ll struggle.

One project used a free-text event label; six months later ‘purchase’ and ‘purchased’ were counted separately, splitting cohorts. Use a controlled vocabulary. This is a mundane but high-leverage fix that most articles skip.

Industry Benchmarks: What Is the Average Number of Monthly Active Users?

The question ‘What is the average number of monthly active users?’ has no single answer because scale varies by business model. A solo developer’s app may have 500 MAU; a public social network reports billions. To give practical context, I’ve compiled typical MAU ranges by sector from my consulting engagements and public disclosures.

According to SEC filings, Meta’s Facebook property reported roughly 3.07 billion monthly active users in late 2023, illustrating the top end of consumer social. In contrast, a mid-stage B2B SaaS typically sees 5,000–50,000 MAU. The table below shows my working benchmarks:

Industry Typical MAU Range (established product) Notes
Consumer Social 1M – 3B+ Network effects drive huge scale; averages distorted by giants
B2B SaaS (Mid-market) 5K – 50K Per-seat products; MAU often lower than total accounts
E-commerce Marketplace 10K – 100M Seasonal spikes (Q4) can double MAU
Mobile Games (mid-core) 50K – 20M High churn; rolling MAU preferred
Fintech App 20K – 500M Regulated; active = verified action

These are directional, not definitive. Average MAU for a given industry depends on funding stage, geography, and whether you count inactive logged-in sessions. Always benchmark against your own cohort retention first.

B2B vs B2C: The Nuances That Change Your Calculation

In B2C, MAU often approximates the total reachable audience. In B2B, an ‘account’ may have 200 seats but only 30 active users in a month. Calculating active users at the user level is critical; reporting account-level activity masks low adoption.

I once advised a DevOps tool where 90% of MAU came from 10% of accounts. The naive MAU looked healthy at 12,000, but the concentration meant churn risk was high. Segment MAU by account size to avoid false comfort.

Also, B2B activity is bursty: users log in weekly for reporting, not daily. A rolling 7-day window might be more diagnostic than 30-day. Don’t force a consumer template onto enterprise data.

Privacy, Consent, and the Quiet Erosion of MAU Accuracy

Since Apple’s App Tracking Transparency framework rolled out, described in their privacy documentation, device-level identifiers have become unreliable for cross-app deduplication. GDPR and similar laws restrict logging personal data without consent, per GDPR.eu.

The practical impact: your MAU may silently drop not because users left, but because you lost the ability to recognize returning anonymous visitors. Most teams blame product decline and panic. The fix is a first-party login strategy and a consent-aware event schema that only counts authenticated actions.

Be transparent in your measurement plan. If you cannot legally process a cookie ID, exclude it from MAU rather than risk non-compliance. An undercounted but legal metric beats an inflated illegal one.

Common MAU Calculation Errors: A Practitioner’s Checklist

Use this checklist before you ship any MAU report. I keep it pinned in our analytics wiki:

  • Double-counting events as users – always use DISTINCT on user_id.
  • Mixing calendar and rolling windows – label your chart axis explicitly.
  • Vague ‘active’ definition – list allowed event names in your SQL WHERE clause.
  • Ignoring cross-device stitching – resolve identity before counting.
  • Counting bots or internal staff – filter known IPs and service accounts.
  • Timezone drift – pick UTC or local consistently; a 2-hour shift can move a user across month boundary.
  • Privacy non-compliance – drop unconsented identifiers.

Any one of these can swing MAU by double digits. The most dangerous are the silent ones: timezone and bot filters, because they don’t throw errors.

DAU/MAU Ratio: Why MAU Alone Can Mislead

MAU tells you reach, not depth. The stickiness ratio (DAU divided by MAU) reveals engagement quality. For a social app, 50% is excellent; for B2B, 10–20% is normal. When you calculate active users daily and monthly with the same definition, the ratio becomes trustworthy.

I once presented MAU growth of 12% that looked great, but DAU/MAU fell from 30% to 22%. The growth came from low-intent users. Always pair MAU with a depth metric.

Validating Your MAU Number: Three Practitioner Tests

Before publishing, I run these checks:

  • The distinct-check: compare COUNT(*) vs COUNT(DISTINCT user_id); if they’re close, your filter is broken.
  • The boundary test: count users active on the 1st of month; ensure they appear in both adjacent months if using calendar (expected) but not if using rolling with strict less-than.
  • The source-of-truth test: reconcile MAU from product DB vs analytics warehouse; discrepancies >5% need investigation.

These take 10 minutes and have saved me from false narratives multiple times.

Case Study: Fixing a 30% Inflated MAU in a Marketplace

A client selling crafts reported 120,000 MAU. On audit, we found three issues: bot crawlers (15%), duplicate device IDs (10%), and a calendar window that double-counted cross-month buyers (5%). After applying the checklist, true MAU was 84,000.

The founder initially panicked, but we reframed: the cleaned number gave a realistic base for LTV modeling. We used the spending calculator to project revenue correctly. Six months later, honest MAU grew to 95,000—real growth, not artifact.

When to Use a Calculator Versus Writing Your Own Query

If you’re a founder needing a quick sanity check, our Monthly Active Users (MAU) Calculator lets you input raw event counts and dedupe assumptions without SQL. For monetization modeling, the Monthly Spending vs Free-to-Play Calculator helps translate MAU into revenue scenarios.

But if you have event-level data and need auditability, writing the query yourself is superior. You control the definition of active and can version-control the logic. My rule: calculators for brainstorming, SQL for board decks.

Leave a Reply

Your email address will not be published. Required fields are marked *