I'm sorry, but the knowledge sources do not contain enough information to provide a confident answer about shifting a time breakdown within an Insights report to a different timezone than the project timezone. What the knowledge sources do confirm is:
All dates and times in Mixpanel reports reflect the project timezone. [Date Range]
Changing the project timezone only affects how Mixpanel outputs results โ it does not alter stored data. [Managing Projects]
Based on this, the most straightforward option available would be to change your project's timezone to GMT in Project Settings:
Navigate to Settings โ Project Settings.
Click the pencil icon next to the Timezone field.
Select GMT and click Save.
This would cause all report outputs (including your hourly breakdown) to display in GMT. However, this would affect all reports in the project, not just the one board.
โ ๏ธ There is no information in the knowledge sources about a way to override the timezone on a per-report or per-board basis within the Insights UI.
For more nuanced options (e.g., per-report timezone offsets), I'd recommend reaching out to Mixpanel Support or checking the Mixpanel Community for the latest guidance.
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Thank you for clarifying โ you're already using inline filters correctly. Given that setup, here are a few things that could still explain the unexpected results:
Possible Cause: Conversion Window & Re-Entry
With a choice_selected event used for all steps, Mixpanel needs to match the right occurrences of that event in sequence. If a user fires choice_selected events rapidly (e.g., multiple questions in quick succession), the funnel may be matching events out of the intended logical flow โ particularly if the conversion window is wide enough to pick up events from a different question path. Check: Tighten your conversion window to reflect the realistic time a user takes to go through your question sequence.
Possible Cause: The Two-Second Grace Period
Mixpanel has a built-in two-second grace period where consecutive steps with timestamps within two seconds of each other are considered interchangeable. If your choice_selected events fire very close together, steps could be matched in an unintended order. [Funnels FAQ]
Possible Cause: Breakdown Attribution
When you break down Step 3 by property D, the breakdown value is determined by property attribution (First Step Defined, Last Step Defined, or per-step). If attribution is pulling the property value from a different step than expected, it could surface values that seem inconsistent with the prior steps. Check: Click on the attribution selector below the funnel chart and ensure it is set to the specific step you want (e.g., "Step 3") rather than "First Step Defined" or "Last Step Defined". [Property Attribution]
What the Knowledge Sources Don't Cover
I want to be transparent: the knowledge sources don't explicitly address a scenario where inline filters on repeated same-event funnels still produce logically impossible combinations. This may be a nuanced data or implementation issue โ for example:
Whether your inline filter properties are event properties (tied to the specific event) vs. user properties (which don't change per step)
Whether the choice_selected events are being fired with the correct properties attached at the time of the event
If the above suggestions don't resolve it, I'd recommend reaching out to Mixpanel Support directly, as they can inspect your actual event data and funnel configuration.
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Ensuring Funnel Steps Are Respected in Mixpanel
The issue you're describing โ seeing results for choices that shouldn't be possible given prior selections โ is likely related to how your funnel's counting method and property attribution work together. Here are the key things to check and configure:
1. Use "Specific Order" (Default)
Make sure your funnel is set to Specific Order, not "Any Order". Specific Order requires each step to be completed in sequence before the next one counts. [Funnel Ordering]
2. Use Inline Filters (Pre-Query) on Each Step
This is likely the most important fix for your situation. You need to apply inline filters to each funnel step to restrict which choice_selected events qualify at each step. For example:
Step 1: choice_selected where question = "experience"
Step 2: choice_selected where choice = "rosรฉ" (inline filter)
Step 3: choice_selected where question = "other flavors" (inline filter)
Inline filters are applied pre-query, meaning only events matching the filter criteria are even considered for that step. This prevents events from unrelated questions or invalid choices from being counted. [Funnel Filters]
Without inline filters, Mixpanel may pick up any choice_selected event for a step, regardless of which question it belongs to.
3. Hold Property Constant (If Applicable)
If your choice_selected events share a property that ties them to a specific question flow (e.g., a session_id or flow_id), you can hold that property constant to ensure all steps in the funnel belong to the same user journey through the same question path. [Hold Property Constant]
4. Understand the Difference: Inline vs. Global Filters
Inline filters (pre-query): Restrict which events qualify per step โ this is what you want.
Global filters (post-query): Applied after the funnel is calculated, based on property attribution. These do not restrict which events enter each step. [Inline vs Global Filtering]
If you're currently using global filters to try to restrict steps, that's likely why invalid choices are appearing โ the funnel calculates first, then filters.
Summary
Problem | Solution |
Invalid choices appearing at a step | Add inline filters to each step specifying the valid choice or question values |
Steps not respecting prior selections | Ensure Specific Order is enabled |
Cross-session contamination | Use Hold Property Constant on a session/flow identifier |
The core fix is to use inline filters on each funnel step to tightly define which choice_selected events are valid at that point in the flow.
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Yes, both types of cohorts are kept dynamically updated over time. Here's how it works: Cohorts are computed dynamically, not as static snapshots. Every time you use a cohort in a query, Mixpanel freshly computes the set of users who currently qualify for that cohort at the time the query is run. [How Cohorts Are Computed] This applies regardless of whether the cohort is defined by:
Events (e.g., "users who watched more than 10 videos in the last 7 days") โ built via the Cohort Builder
Funnels (e.g., users saved directly from a Funnels report) โ created by clicking into a funnel result and saving that group as a cohort
In both cases, the cohort reflects users who qualify as of right now, not a historical snapshot of users who ever qualified. [How Cohorts Are Computed] One important distinction to keep in mind:
Event-based cohorts use a rolling window (e.g., "last 7 days"), so the membership continuously shifts as users perform or stop performing the relevant actions.
Funnel-based cohorts and event-based cohorts can give different answers when time windows matter. A cohort looks at users who meet criteria over a defined past period, while a funnel tracks whether users convert within a forward-looking conversion window. If you care about a specific conversion window, funnels may give a more accurate answer. [How Cohorts Are Computed]
Exception โ CSV-based cohorts: If you create a cohort by uploading a CSV, that cohort is static and will not update over time, since it's tied to a fixed user property set at upload time. [Creating a Cohort via CSV]
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
The "Is Set" Filter in Mixpanel
When you apply the "is set" filter to a property on an event, it means you are only including events where that property has a defined, non-null value. In other words, the event must have been tracked with that property present and containing a value โ it excludes any events where the property is:
Not sent along with the event
Null (intentional absence of a value)
Undefined (property was not included in the event at all)
Practical Example
Say you have a Page View event and you filter by Campaign ID is set:
โ Included โ Page View events where Campaign ID = "summer_promo" (property exists and has a value)
โ Excluded โ Page View events where Campaign ID was not sent (shows as (not set) in reports)
โ Excluded โ Page View events where Campaign ID = null
When Is It Useful?
To remove "(not set)" or null values from your analysis and focus only on events with complete data
To filter out organic traffic and focus only on events that came from a campaign (where UTM parameters are set)
To ensure your breakdown or aggregation is based on clean, complete data only
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Importing Same Event with Different/Additional Properties
Based on the knowledge sources, I need to be transparent about the limitations of what's documented.
What the Knowledge Sources Confirm
Mixpanel's deduplication logic treats events as duplicates when all four of these match:
event_name
time
distinct_id
$insert_id
"Events with identical values for (event, time, distinct_id, $insert_id) are considered duplicates; only the latest ingested one will be considered in queries." [Ingestion API]
What This Implies
If all four fields match but properties differ, Mixpanel keeps the latest ingested version โ which theoretically means the new properties could replace the old ones. However:
Question | Knowledge Source Answer |
Does it accept same event with new properties? | โ ๏ธ Not explicitly documented |
Does it update/merge properties? | โ ๏ธ Not explicitly documented |
Is there a time range limit for this? | โ ๏ธ Not explicitly documented |
What I Cannot Confirm
The knowledge sources do not explicitly cover:
Whether Mixpanel merges new properties with existing ones or fully replaces the event
Whether there is a time window limit for deduplication to apply (e.g., only within 7 days of ingestion)
My Recommendation
Given that you previously observed property updates happening within a 10-minute window (from our earlier discussion), but the behavior for older events or property merging vs. replacing is unclear, I strongly recommend:
Testing with a small batch of events before doing a full import
Contacting Mixpanel Support directly to confirm:
Whether property updates via deduplication are guaranteed
Whether there is a deduplication time window limit
Whether properties are merged or fully replaced
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Investigating the Event Count Mismatch After Migration
This is a complex situation with multiple layers. Let me break down each discrepancy.
Summary of Your Numbers
Source | Event Count | Unique $insert_id |
Old project export (deduped) | 284,035 | 284,035 |
New project Insights | 273,077 | โ |
New project Raw Export | 285,313 | 274,440 |
Duplicate rows in new project | 10,873 | โ |
Issue 1: Why Does New Project Raw Export Have MORE Rows (285,313) Than Imported (284,035)?
The extra 1,278 rows (285,313 - 284,035) likely come from late-arriving data that was ingested into the new project independently โ not from your import. This can happen if:
The same events were sent to the new project through another pipeline or SDK
Mobile clients sent delayed events after your import
"Late data can arrive multiple days later due to a mobile client being offline. The import API can add data to previous days." [Data Sync]
Issue 2: Why Are There 10,873 Duplicate $insert_ids in the New Project?
Your imported file had no duplicate $insert_ids, yet the new project shows duplicates. This strongly suggests those duplicate rows came from a separate data source (e.g., SDK, another import, or pipeline) that sent the same events independently โ resulting in the same $insert_id arriving via two different ingestion paths.
"Events exported via pipelines (i.e. raw exports) can contain duplicates. Deduplication should be performed using 4 event properties: event_name, time, distinct_id, and insert_id." [Common SQL Queries]
Issue 3: Why Does Insights Show Only 273,077 vs. 274,440 Unique $insert_ids?
The gap of ~1,363 events between Insights (273,077) and unique $insert_ids (274,440) in the raw export is likely caused by:
1. Timezone Differences
Data is exported in UTC from the Raw Export API, but Insights displays data in your project's timezone. Events near the day boundary (midnight) may fall on a different date in Insights vs. Raw Export.
"The from_date and to_date params are interpreted using UTC timezones. For projects created before 1 January 2023, the from_date and to_date params are interpreted using your current project timezone." [Export Methods]
2. Hidden Events
Insights only shows visible events. If any events were hidden via Lexicon, they won't appear in Insights but will still appear in Raw Export.
"Mixpanel exports all events to your destination, even ones that are hidden in the UI via Lexicon." [Data Pipelines FAQ]
3. Different Counting Methods
Insights may be counting by unique users or sessions rather than total event count, which would produce a lower number.
"It's important to look out for comparisons between unique user count vs. total event count." [Debugging]
Recommended Debugging Steps
Check Insights counting method โ ensure it is set to Total Events, not Unique Users or Sessions
Verify timezone alignment โ confirm your Raw Export query date range matches the Insights report timezone
Check for hidden events in Lexicon that may be excluded from Insights
Identify the source of duplicates โ check if another SDK/pipeline is also sending the same events to the new project
Use mp_processing_time_ms to distinguish originally imported events from late-arriving ones
"You can also check if you have imported data or if data was ingested later by breaking down a report by the property mp_processing_time_ms." [Debugging]
Key Takeaway
The most likely root cause is that another data source is also sending events to the new project, creating duplicates with the same $insert_id but arriving via a different ingestion path โ bypassing deduplication. I'd recommend contacting Mixpanel Support with these specific numbers for deeper investigation.
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Restricting Access to a Specific Property
You can use Data Classification to restrict access to a specific property within your project. This feature allows you to mark a property as "classified" so only certain users can view it.
Steps to Classify a Property
Navigate to Lexicon in your project
Go to the Event Properties or User Profile Properties tab
Select the specific property you want to restrict
Click Mark Classified
Confirm the action in the pop-up [Data Classification]
Then Grant Viewing Access
For individual users:
Go to Project Settings โ Project Users
Find the user in the Current Users table
Check the Can View checkbox in the Classified Data column [Data Classification]
For teams:
Go to Organization Settings โ Users & Teams
Select the team
Enable the Classified Data checkbox for the relevant project [Teams]
Important Notes
This feature requires an Enterprise plan [Data Classification]
Users without Can View access will:
See the property is classified in Lexicon, but cannot use it as a filter or breakdown
See a warning when opening reports that contain the classified property
As of April 2026, classified data access is managed through Custom Roles under the "Classified Data Access" permission, rather than a separate per-user toggle [Custom Roles]
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Yes, that is correct. A user must first be a project member before they can be added to a Data View. As stated in the Data Views documentation, when you click + Add User inside a Data View:
"The modal shows only users that are part of your project."
[Data Views] So the workflow is always:
First, invite the user to the project (via Project Settings โ Project Users)
Then, add them to the desired Data View (via Project Settings โ Data Views โ Add User)
Alternatively, if you manage users via Teams, you can add a team to a Data View, and all project members within that team will automatically get access to it. [Teams]
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
Data View Users vs. Project Users
Project Users
Project Users are all members who have access to the entire project and its data. They are assigned a project-level role (Owner, Admin, Analyst, or Consumer) that determines what actions they can perform. [Project Roles]
They can see all events and properties in the project by default
Their permissions are governed by their role (e.g., Analysts can create reports, Consumers can only view)
Managed via Project Settings โ Project Users
Data View Users
Data View Users are project members who have been granted access to a specific Data View, which acts as a filtered subset of the project data. [Data Views]
They only see the events and properties defined by the Data View filters
They still retain their project role permissions, but applied within the filtered data scope
Managed via Project Settings โ Data Views โ Add User
Key Differences
| Project Users | Data View Users |
Data access | All project data | Only filtered data in the Data View |
Scope | Entire project | Specific Data View |
Default | "All Project Data" view | A restricted subset |
Who manages | Project Owners & Admins | Project Owners & Admins |
Plan required | Any plan | Growth plan or above |
Important Notes
Every project has a default "All Project Data" Data View with no filters, which is equivalent to standard project access. [Data Views Overview]
A user can be a project member and be assigned to one or more Data Views simultaneously.
You can also add entire Teams to a Data View instead of individual users. [Manage Visibility]
โน๏ธย Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.
