Billing for Monthly Tracked Users

Billing for most Enterprise Mixpanel accounts is calculated based on Monthly Tracked Users (MTUs). This article answers some common questions about this billing process.

How Are Monthly Tracked Users Calculated?

MTUs are calculated across all projects under a specific project owner. For each project, MTUs are calculated as the number of distinct_id’s with at least one qualifying MTU event in the last month.

MTUs are calculated on a monthly basis. For instance, say you are on an MTU plan with a limit of 50 MTUs. For the first month, if you have 20 MTUs for Month 1, then 20 MTUs for Month 2, then your total MTUs is 40 out of your limit of 50.

Events that are non-qualifying and excluded from the calculation:

  • Message Sent ($campaign_delivery)
  • Message Bounced ($campaign_bounced)
  • Message Marked Spam ($campaign_marked_spam)
  • Message Suppressed ($message_suppressed)
  • Message Unsubscribed ($unsubscribe)
  • Campaign Entered ($journey_entered)
  • Updates to people profiles

Also, note that Mixpanel generated messages will not count toward your total MTU calculation. However, Message Open events will count towards MTU.

While it appears that it would be possible to calculate MTUs by viewing the "Anything" event in Retention, this method doesn't match the final definition of an MTU (because of the excluded events). As a result, your true MTU numbers aren’t expected to match the numbers in Retention.

Here is an example JQL query to calculate MTUs:

function main() {
return Events({
from_date: '2018-09-01',
to_date: '2018-09-30',
event_selectors: [{
selector: 'not (event["$event_name"] == "$campaign_delivery" \
or event["$event_name"] == "$campaign_bounced" \
or event["$event_name"] == "$campaign_marked_spam" \
or event["$event_name"] == "$journey_entered" \
or event["$event_name"] == "$message_suppressed" \
or event["$event_name"] == "$unsubscribe")'
.map(user => ({
num_triggered: user.value >= 1 ? 1 : 0,
event_count: user.value
.reduce((accumulators, users) => {
const result = {num_triggered: 0, event_count: 0};
_.each(users, user => {
result.num_triggered += user.num_triggered;
result.event_count += user.event_count;
_.each(accumulators, accumulator => {
result.num_triggered += accumulator.num_triggered;
result.event_count += accumulator.event_count;
let scale_multiplier = 0;
if (result.num_triggered !== 0) {
scale_multiplier = Math.max(1, (result.event_count / (result.num_triggered *1000)));
result.total_mtus = parseInt(result.num_triggered * scale_multiplier);
return result;


How Are Customers Alerted of Overages?

The billing owner will be sent an overage alert email if their account has exceeded their plan volume by the following percentages: 85%, 100%, 110% and 120%. Email addresses that are cc-ed on invoices will also be cc-ed on overage alert emails. In order to qualify for an alert, a customer must not have received that alert in the same calendar month.

If the billing owner logs into, they will see a popup if their account has exceeded their plan volume by the following percentages: 100%, 110% and 120%.

Is this article helpful?
4 out of 4 found this helpful



Please sign in to leave a comment.