diff --git a/docs.json b/docs.json index 7c36c87d..4d65aabe 100644 --- a/docs.json +++ b/docs.json @@ -362,8 +362,7 @@ "docs/features/revenue-analytics", "docs/features/saved-metrics-and-behaviors", "docs/features/sessions", - "docs/features/slack-integration", - "docs/features/spark" + "docs/features/slack-integration" ] } ] @@ -423,7 +422,13 @@ "docs/access-security/single-sign-on/google" ] }, - "docs/access-security/audit-log" + { + "group": "Audit Log", + "root": "docs/access-security/audit-log", + "pages": [ + "docs/access-security/audit-log-reference" + ] + } ] }, { @@ -611,6 +616,7 @@ "guides/guides-by-use-case/empower-your-team/mcp/integrations" ] }, + "guides/guides-by-use-case/empower-your-team/headless", "guides/guides-by-use-case/empower-your-team/close-strategy-execution-gap", "guides/guides-by-use-case/empower-your-team/see-replays" ] @@ -649,6 +655,17 @@ } ] }, + { + "group": "MIXPANEL AI", + "icon": "/icons/flower.svg", + "pages": [ + "guides/guides-by-use-case/empower-your-team/mixpanel-agent", + "guides/guides-by-use-case/empower-your-team/mcp", + "guides/guides-by-use-case/empower-your-team/mcp/mcp-by-industry", + "guides/guides-by-use-case/empower-your-team/mcp/integrations", + "guides/guides-by-use-case/empower-your-team/headless" + ] + }, { "group": "PLAYBOOKS", "icon": "/icons/note.svg", @@ -3918,6 +3935,10 @@ { "source": "/troubleshooting/docs/tracking-best-practices/traffic-attribution", "destination": "/docs/tracking-best-practices/traffic-attribution" + }, + { + "source": "/docs/features/spark", + "destination": "/docs/mixpanel-agent" } ] } \ No newline at end of file diff --git a/docs/access-security/audit-log-reference.mdx b/docs/access-security/audit-log-reference.mdx new file mode 100644 index 00000000..bd343eae --- /dev/null +++ b/docs/access-security/audit-log-reference.mdx @@ -0,0 +1,228 @@ +--- +title: "Audit Log Reference" +--- + +Mixpanel's Audit Log tracks activity within your organization and projects, providing visibility into who made changes, when they occurred, and what was modified. This page is the authoritative catalog of every event type the Audit Log records. + +For an overview of the Audit Log — how to access it in the UI, retention by plan, the CSV export workflow, and FAQ — see the [Audit Log overview](/docs/access-security/audit-log). + +The events Mixpanel records are listed below. The **Available Since** date on each event is the first calendar day on which the event is available. + +## Events + +### Agentic Workflows + +| Event Type | Display Name | Description | Scope | Available Since | +| ---------------------- | -------------------------- | --------------------------------------------------------------------------------------------- | ------------------------ | --------------- | +| `agent_flow.activated` | Agent Automation Activated | An agentic automation was activated. | Project and organization | June 9, 2026 | +| `agent_flow.created` | Agent Automation Created | A new agentic automation was created. | Project and organization | June 9, 2026 | +| `agent_flow.deleted` | Agent Automation Deleted | An agentic automation was deleted. | Project and organization | June 9, 2026 | +| `agent_flow.paused` | Agent Automation Paused | An active agentic automation was paused. | Project and organization | June 9, 2026 | +| `agent_flow.triggered` | Agent Automation Triggered | An agentic automation run was triggered, either manually or based on the configured schedule. | Project and organization | June 9, 2026 | +| `agent_flow.updated` | Agent Automation Updated | An existing agentic automation was updated. | Project and organization | June 9, 2026 | + +### Alerts + +| Event Type | Display Name | Description | Scope | Available Since | +| ----------------- | --------------- | ------------------------------------------ | ------------------------ | ---------------- | +| `alert.created` | Alert Created | A new alert was created on a report. | Project and organization | February 1, 2026 | +| `alert.deleted` | Alert Deleted | An alert was removed. | Project and organization | February 1, 2026 | +| `alert.updated` | Alert Modified | An existing alert's settings were changed. | Project and organization | February 1, 2026 | +| `alert.triggered` | Alert Triggered | An alert condition was met and triggered. | Project and organization | February 7, 2026 | + +### Billing Info + +| Event Type | Display Name | Description | Scope | Available Since | +| ------------------------------------------ | ----------------------------------- | ----------------------------------------- | ----------------- | --------------- | +| `billing_info.receipt_preferences_updated` | Billing Invoice Preferences Updated | Billing invoice preferences were updated. | Organization only | May 20, 2026 | +| `billing_info.payment_info_updated` | Billing Payment Information Updated | Billing payment information was modified. | Organization only | May 20, 2026 | +| `billing_info.tax_info_updated` | Billing Tax Information Updated | Billing tax information was modified. | Organization only | May 20, 2026 | + +### Boards + +| Event Type | Display Name | Description | Scope | Available Since | +| ----------------------------- | --------------------------- | ------------------------------------------------- | ------------------------ | --------------- | +| `board.created` | Board Created | A new board was created. | Project and organization | April 5, 2026 | +| `board.deleted` | Board Deleted | A board was permanently removed. | Project and organization | April 5, 2026 | +| `board.duplicated` | Board Duplicated | A copy of an existing board was created. | Project and organization | April 5, 2026 | +| `board.exported` | Board Exported | Board data was exported. | Project and organization | April 5, 2026 | +| `board.shared` | Board Shared | A board was shared with users or teams. | Project and organization | April 5, 2026 | +| `board_subscription.created` | Board Subscription Created | A scheduled board email subscription was set up. | Project and organization | April 5, 2026 | +| `board_subscription.deleted` | Board Subscription Deleted | A board subscription was removed. | Project and organization | April 5, 2026 | +| `board.unshared` | Board Unshared | Sharing access to a board was revoked. | Project and organization | April 5, 2026 | +| `board.updated` | Board Updated | Board settings or content were modified. | Project and organization | April 5, 2026 | +| `board.public_access_updated` | Public Board Access Updated | Public sharing settings for a board were changed. | Project and organization | April 5, 2026 | + +### Cohorts + +| Event Type | Display Name | Description | Scope | Available Since | +| --------------------- | ------------------- | --------------------------------------------- | ------------------------ | --------------- | +| `cohort.created` | Cohort Created | A new cohort was created. | Project and organization | April 5, 2026 | +| `cohort.deleted` | Cohort Deleted | A cohort was removed. | Project and organization | April 5, 2026 | +| `cohort.shared` | Cohort Shared | A cohort was shared with users or teams. | Project and organization | April 5, 2026 | +| `cohort_sync.created` | Cohort Sync Created | A new cohort sync integration was configured. | Project and organization | May 20, 2026 | +| `cohort_sync.updated` | Cohort Sync Updated | Cohort sync settings were modified. | Project and organization | May 20, 2026 | +| `cohort.unshared` | Cohort Unshared | Sharing access to a cohort was revoked. | Project and organization | April 5, 2026 | +| `cohort.updated` | Cohort Updated | Cohort criteria or settings were modified. | Project and organization | April 5, 2026 | + +### Custom Roles + +| Event Type | Display Name | Description | Scope | Available Since | +| --------------------- | ------------------- | ------------------------------------------------------ | ------------------------ | --------------- | +| `custom_role.created` | Custom Role Created | A new custom role was created. | Project and organization | April 5, 2026 | +| `custom_role.deleted` | Custom Role Deleted | A custom role was deleted. | Project and organization | April 5, 2026 | +| `custom_role.updated` | Custom Role Updated | A custom role's permissions or settings were modified. | Project and organization | April 5, 2026 | + +### Data Exports + +| Event Type | Display Name | Description | Scope | Available Since | +| ----------------------------- | --------------------------- | ----------------------------------------- | ------------------------ | --------------- | +| `audit_log_export.created` | Audit Log Export Created | An audit log export was initiated. | Project and organization | April 5, 2026 | +| `audit_log_export.downloaded` | Audit Log Export Downloaded | An audit log export file was downloaded. | Project and organization | April 5, 2026 | +| `event_export.downloaded` | Events Exported | Event data was exported from the project. | Project and organization | April 5, 2026 | +| `profile_export.downloaded` | Profile Data Exported | User profile data was exported. | Project and organization | April 5, 2026 | +| `raw_event_export.requested` | Raw Event Export Requested | A raw event export was requested. | Project and organization | May 20, 2026 | +| `user_data_export.created` | User Data Export Requested | A user data export request was submitted. | Project and organization | April 5, 2026 | + +### Data Management + +| Event Type | Display Name | Description | Scope | Available Since | +| ----------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | --------------- | +| `event_definition.created` | Event Definition Created | A new event definition was created. | Project and organization | May 20, 2026 | +| `event_definition.deleted` | Event Definition Deleted | An event definition was deleted. | Project and organization | May 20, 2026 | +| `event_definition.updated` | Event Definition Updated | An event definition was modified. | Project and organization | May 20, 2026 | +| `event_deletion.canceled` | Event Deletion Canceled | A pending event deletion request was canceled. | Project and organization | April 5, 2026 | +| `event_deletion.created` | Event Deletion Requested | A request to delete events was submitted. | Project and organization | April 5, 2026 | +| `profile.deleted` | Profile Deleted | A user profile was removed. Only tracked when initiated through the Mixpanel web application. API calls and direct updates using the Mixpanel SDK are not currently logged. | Project and organization | May 20, 2026 | +| `profile.updated` | Profile Updated | A user profile was updated. Only tracked when initiated through the Mixpanel web application. API calls and direct updates using the Mixpanel SDK are not currently logged. | Project and organization | May 20, 2026 | +| `profile.batch_deleted` | Profiles Batch Deleted | A batch of user profiles were removed. Only tracked when initiated through the Mixpanel web application. API calls and direct updates using the Mixpanel SDK are not currently logged. | Project and organization | May 20, 2026 | +| `profile.batch_updated` | Profiles Batch Updated | A batch of user profiles were updated. Only tracked when initiated through the Mixpanel web application. API calls and direct updates using the Mixpanel SDK are not currently logged. | Project and organization | May 20, 2026 | +| `property_definition.created` | Property Definition Created | A new property definition was created. | Project and organization | May 20, 2026 | +| `property_definition.updated` | Property Definition Updated | A property definition was modified. | Project and organization | May 20, 2026 | +| `user_data_deletion.canceled` | User Data Deletion Canceled | A pending user data deletion request was canceled. | Project and organization | April 5, 2026 | +| `user_data_deletion.created` | User Data Deletion Requested | A request to delete user profile data was submitted. | Project and organization | April 5, 2026 | + +### Data Pipelines + +| Event Type | Display Name | Description | Scope | Available Since | +| ----------------------- | --------------------- | ------------------------------------------- | ------------------------ | --------------- | +| `data_pipeline.created` | Data Pipeline Created | A new data pipeline integration was set up. | Project and organization | April 5, 2026 | +| `data_pipeline.deleted` | Data Pipeline Deleted | A data pipeline was removed. | Project and organization | April 5, 2026 | +| `data_pipeline.updated` | Data Pipeline Updated | Data pipeline configuration was modified. | Project and organization | April 5, 2026 | + +### Data Views + +| Event Type | Display Name | Description | Scope | Available Since | +| ------------------------ | --------------------------- | ----------------------------------------- | ------------------------ | --------------- | +| `workspace.team_added` | Team Added to Data View | A team was granted access to a data view. | Project and organization | May 20, 2026 | +| `workspace.team_removed` | Team Removed from Data View | A team's data view access was revoked. | Project and organization | May 20, 2026 | +| `workspace.user_added` | User Added to Data View | A user was granted access to a data view. | Project and organization | May 20, 2026 | +| `workspace.user_removed` | User Removed from Data View | A user's data view access was revoked. | Project and organization | May 20, 2026 | + +### Experiments + +| Event Type | Display Name | Description | Scope | Available Since | +| ----------------------- | ---------------------------- | ------------------------------------- | ------------------------ | --------------- | +| `experiment.archived` | Experiment Archived | An experiment was archived. | Project and organization | May 20, 2026 | +| `experiment.concluded` | Experiment Concluded | An experiment was concluded. | Project and organization | May 20, 2026 | +| `experiment.created` | Experiment Created | A new experiment was created. | Project and organization | May 20, 2026 | +| `experiment.decided` | Experiment Decision Recorded | A decision was made on an experiment. | Project and organization | May 20, 2026 | +| `experiment.deleted` | Experiment Deleted | An experiment was deleted. | Project and organization | May 20, 2026 | +| `experiment.duplicated` | Experiment Duplicated | An experiment was duplicated. | Project and organization | May 20, 2026 | +| `experiment.launched` | Experiment Launched | An experiment was launched. | Project and organization | May 20, 2026 | +| `experiment.restored` | Experiment Restored | An archived experiment was restored. | Project and organization | May 20, 2026 | +| `experiment.updated` | Experiment Updated | Experiment settings were modified. | Project and organization | May 20, 2026 | + +### Feature Flags + +| Event Type | Display Name | Description | Scope | Available Since | +| ------------------------- | ----------------------- | -------------------------------------- | ------------------------ | --------------- | +| `feature_flag.archived` | Feature Flag Archived | A feature flag was archived. | Project and organization | May 20, 2026 | +| `feature_flag.created` | Feature Flag Created | A new feature flag was created. | Project and organization | May 20, 2026 | +| `feature_flag.deleted` | Feature Flag Deleted | A feature flag was deleted. | Project and organization | May 20, 2026 | +| `feature_flag.duplicated` | Feature Flag Duplicated | A feature flag was duplicated. | Project and organization | May 20, 2026 | +| `feature_flag.restored` | Feature Flag Restored | An archived feature flag was restored. | Project and organization | May 20, 2026 | +| `feature_flag.updated` | Feature Flag Updated | Feature flag settings were modified. | Project and organization | May 20, 2026 | + +### Organization Settings + +| Event Type | Display Name | Description | Scope | Available Since | +| ------------------------------------------------- | ------------------------------------- | --------------------------------------------------------- | ----------------- | --------------- | +| `organization_spark_setting.updated` | Organization AI Settings Changed | Organization AI settings were updated. | Organization only | May 20, 2026 | +| `organization_setting.updated` | Organization Settings Changed | Organization settings were modified. | Organization only | May 20, 2026 | +| `organization_access_security.twofactor_disabled` | Organization Two-Factor Auth Disabled | Organization-wide two-factor authentication was disabled. | Organization only | May 20, 2026 | +| `organization_access_security.twofactor_enabled` | Organization Two-Factor Auth Enabled | Organization-wide two-factor authentication was enabled. | Organization only | May 20, 2026 | + +### Project Settings + +| Event Type | Display Name | Description | Scope | Available Since | +| --------------------- | ------------------- | --------------------------------------------------------------- | ------------------------ | --------------- | +| `project.transferred` | Project Transferred | A project was transferred to a different organization or owner. | Project and organization | May 20, 2026 | + +### Reports + +| Event Type | Display Name | Description | Scope | Available Since | +| -------------------------------- | ---------------------------- | ------------------------------------------------- | ------------------------ | --------------- | +| `bookmark.deleted` | Report Deleted | A saved report was removed. | Project and organization | April 5, 2026 | +| `bookmark.moved` | Report Moved | A saved report was moved to a different location. | Project and organization | May 20, 2026 | +| `bookmark.created` | Report Saved | A new report was saved to a dashboard. | Project and organization | April 5, 2026 | +| `bookmark.screenshot_downloaded` | Report Screenshot Downloaded | A screenshot of a report was downloaded. | Project and organization | May 20, 2026 | +| `bookmark.updated` | Report Updated | A saved report's configuration was changed. | Project and organization | April 5, 2026 | + +### Service Accounts + +| Event Type | Display Name | Description | Scope | Available Since | +| -------------------------------------- | ------------------------------------ | ------------------------------------------------------ | ------------------------ | --------------- | +| `service_account.added_to_project` | Service Account Added to Project | A service account was granted access to a project. | Project and organization | April 5, 2026 | +| `service_account.created` | Service Account Created | A new service account was created. | Organization only | April 5, 2026 | +| `service_account.deleted` | Service Account Deleted | A service account was removed. | Organization only | April 5, 2026 | +| `service_account.removed_from_project` | Service Account Removed from Project | A service account's project access was revoked. | Project and organization | April 5, 2026 | +| `service_account.role_changed` | Service Account Role Changed | A service account's role or permissions were modified. | Project and organization | April 5, 2026 | + +### Teams + +| Event Type | Display Name | Description | Scope | Available Since | +| ------------------------------ | --------------------------------- | ------------------------------------------ | ----------------- | --------------- | +| `team.service_account_added` | Service Account Added to Team | A service account was added to a team. | Organization only | May 20, 2026 | +| `team.service_account_removed` | Service Account Removed from Team | A service account was removed from a team. | Organization only | May 20, 2026 | +| `team.created` | Team Created | A new team was created. | Organization only | May 20, 2026 | +| `team.deleted` | Team Deleted | A team was deleted. | Organization only | May 20, 2026 | +| `team.updated` | Team Updated | Team settings were modified. | Organization only | May 20, 2026 | +| `team.user_added` | User Added to Team | A user was added to a team. | Organization only | May 20, 2026 | +| `team.user_removed` | User Removed from Team | A user was removed from a team. | Organization only | May 20, 2026 | + +### User Authentication + +| Event Type | Display Name | Description | Scope | Available Since | +| ------------------------ | ---------------------------- | ------------------------------------------------- | ----------------- | --------------- | +| `user.twofactor_enabled` | User Enabled Two-Factor Auth | A user activated two-factor authentication. | Organization only | April 5, 2026 | +| `session.logged_in` | User Logged In | A user successfully logged into the organization. | Organization only | April 5, 2026 | +| `session.logged_out` | User Logged Out | A user logged out of the organization. | Organization only | April 5, 2026 | +| `session.login_failed` | User Login Failed | A user login attempt failed. | Organization only | May 20, 2026 | + +### User Management + +| Event Type | Display Name | Description | Scope | Available Since | +| -------------------------------- | ------------------------------ | ------------------------------------------------------ | ------------------------ | --------------- | +| `invitation.accepted` | Accepted Invitation | A user accepted an invitation to the organization. | Organization only | May 20, 2026 | +| `project.default_access_granted` | Default Project Access Granted | Default access for all users to a project was granted. | Project and organization | May 20, 2026 | +| `project.default_access_revoked` | Default Project Access Revoked | Default access for all users to a project was revoked. | Project and organization | May 20, 2026 | +| `invitation.sent` | Invited User to Organization | An invitation was sent to a new user. | Organization only | May 20, 2026 | +| `project.team_added` | Team Added to Project | A team was granted access to a project. | Project and organization | May 20, 2026 | +| `project.team_removed` | Team Removed from Project | A team's project access was revoked. | Project and organization | May 20, 2026 | +| `organization.user_added` | User Added to Organization | A user was added to the organization. | Organization only | May 20, 2026 | +| `project.user_added` | User Added to Project | A user was granted access to a project. | Project and organization | May 20, 2026 | +| `organization.user_removed` | User Removed from Organization | A user was removed from the organization. | Organization only | May 20, 2026 | +| `project.user_removed` | User Removed from Project | A user's project access was revoked. | Project and organization | May 20, 2026 | +| `user.role_changed` | User Role Changed | A user's role or permissions were modified. | Project and organization | May 20, 2026 | + +### Warehouse Sources + +| Event Type | Display Name | Description | Scope | Available Since | +| ------------------------------- | ----------------------------- | ------------------------------------------------- | ------------------------ | --------------- | +| `warehouse_source.created` | Warehouse Source Created | A new warehouse data source was connected. | Project and organization | April 5, 2026 | +| `warehouse_source.deleted` | Warehouse Source Deleted | A warehouse source connection was removed. | Project and organization | April 5, 2026 | +| `warehouse_source_sync.created` | Warehouse Source Sync Created | A warehouse source sync job was created. | Project and organization | May 20, 2026 | +| `warehouse_source_sync.deleted` | Warehouse Source Sync Deleted | A warehouse source sync job was deleted. | Project and organization | May 20, 2026 | +| `warehouse_source_sync.updated` | Warehouse Source Sync Updated | Warehouse source sync configuration was modified. | Project and organization | May 20, 2026 | +| `warehouse_source.updated` | Warehouse Source Updated | Warehouse source configuration was changed. | Project and organization | April 5, 2026 | diff --git a/docs/access-security/audit-log.mdx b/docs/access-security/audit-log.mdx index 86afddf2..8d8bce01 100644 --- a/docs/access-security/audit-log.mdx +++ b/docs/access-security/audit-log.mdx @@ -2,20 +2,20 @@ title: "Audit Log" --- -Mixpanel's Audit Log tracks activity within your organization and projects, providing visibility into who made changes, when they occurred, and what was modified. Audit log helps teams maintain security, troubleshoot issues, and meet compliance requirements. +Mixpanel's audit log tracks activity within your organization and projects, providing visibility into who made changes, when they occurred, and what was modified. The audit log helps teams maintain security, troubleshoot issues, and meet compliance requirements. -Audit log is available on all plans. Free and Growth plans retain logs for 90 days. Enterprise plans retain logs for 2 years. See our [pricing page](https://mixpanel.com/pricing/) for more details. +The audit log is available on all plans. Free and Growth plans retain logs for 90 days. Enterprise plans retain logs for 2 years. See our [pricing page](https://mixpanel.com/pricing/) for more details. -## Accessing Audit Log +## Accessing the Audit Log -Audit log can be accessed at two levels: +You can access the audit log at two levels: - **Organization-level logs** — Found in Organization Settings. Accessible to organization admins and owners, these log all events across the organization, including user authentication, service account management, and more. - **Project-level logs** — Found in Project Settings. Accessible to project admins and owners, these logs include project-specific events like report creation and data exports. -Some events are tracked only at the organization level, while most are available in both organization and project logs. +Some events appear only at the organization level. Most appear in both organization and project logs. 1. **Navigate to Organization Settings or Project Settings** by clicking the gear icon in the bottom left navigation > Settings. 2. **Select Audit Log** from the sidebar menu. @@ -27,226 +27,14 @@ Some events are tracked only at the organization level, while most are available ## Tracked Events -The current audit logging contains only actions made within the Mixpanel UI. Each line in the UI will contain information on the Date and Time, User, Action, IP and Project or Org if available. Clicking on each log item you'll be able to see a raw view with additional information. +See [Audit Log Reference](/docs/access-security/audit-log-reference) for a complete list of all tracked events, including descriptions and availability dates. -Mixpanel tracks the following events in your Audit Log. The "Available Since" column indicates when audit logging began for each event type: +## Exporting the Audit Log -### Alerts +You can export the audit log to CSV or NDJSON (newline-delimited JSON) for further analysis or archival. The export contains the raw data for each event. CSV is convenient for spreadsheets and quick analysis. NDJSON preserves the full nested structure of each event, which suits programmatic processing or ingestion into log pipelines. -| Event Type | Display Name | Description | Available Since | -| ----------------- | --------------- | ----------------------------------------- | ---------------- | -| `alert.created` | Alert Created | A new alert was created on a report | February 1, 2026 | -| `alert.deleted` | Alert Deleted | An alert was removed | February 1, 2026 | -| `alert.triggered` | Alert Triggered | An alert condition was met and triggered | February 7, 2026 | -| `alert.updated` | Alert Modified | An existing alert's settings were changed | February 1, 2026 | - -### Boards - -| Event Type | Display Name | Description | Available Since | -| ----------------------------- | --------------------------- | ------------------------------------------------ | --------------- | -| `board.created` | Board Created | A new board was created | April 5, 2026 | -| `board.deleted` | Board Deleted | A board was permanently removed | April 5, 2026 | -| `board.duplicated` | Board Duplicated | A copy of an existing board was created | April 5, 2026 | -| `board.exported` | Board Exported | Board data was exported | April 5, 2026 | -| `board.public_access_updated` | Public Board Access Updated | Public sharing settings for a board were changed | April 5, 2026 | -| `board.shared` | Board Shared | A board was shared with users or teams | April 5, 2026 | -| `board.unshared` | Board Unshared | Sharing access to a board was revoked | April 5, 2026 | -| `board.updated` | Board Updated | Board settings or content were modified | April 5, 2026 | - -### Board Subscriptions - -| Event Type | Display Name | Description | Available Since | -| ---------------------------- | -------------------------- | ----------------------------------------------- | --------------- | -| `board_subscription.created` | Board Subscription Created | A scheduled board email subscription was set up | April 5, 2026 | -| `board_subscription.deleted` | Board Subscription Deleted | A board subscription was removed | April 5, 2026 | - -### Reports - -| Event Type | Display Name | Description | Available Since | -| -------------------------------- | ---------------------------- | ------------------------------------------------ | --------------- | -| `bookmark.created` | Report Created | A new saved report was created | April 5, 2026 | -| `bookmark.deleted` | Report Deleted | A saved report was removed | April 5, 2026 | -| `bookmark.moved` | Report Moved | A saved report was moved to a different location | May 20, 2026 | -| `bookmark.screenshot_downloaded` | Report Screenshot Downloaded | A screenshot of a report was downloaded | May 20, 2026 | -| `bookmark.updated` | Report Updated | A saved report's configuration was changed | April 5, 2026 | - -### Cohorts - -| Event Type | Display Name | Description | Available Since | -| ----------------- | --------------- | ----------------------------------------- | --------------- | -| `cohort.created` | Cohort Created | A new cohort was created | April 5, 2026 | -| `cohort.deleted` | Cohort Deleted | A cohort was removed | April 5, 2026 | -| `cohort.shared` | Cohort Shared | A cohort was shared with users or teams | April 5, 2026 | -| `cohort.unshared` | Cohort Unshared | Sharing access to a cohort was revoked | April 5, 2026 | -| `cohort.updated` | Cohort Updated | Cohort criteria or settings were modified | April 5, 2026 | - -### Cohort Syncs - -| Event Type | Display Name | Description | Available Since | -| --------------------- | ------------------- | -------------------------------------------- | --------------- | -| `cohort_sync.created` | Cohort Sync Created | A new cohort sync integration was configured | May 20, 2026 | -| `cohort_sync.updated` | Cohort Sync Updated | Cohort sync settings were modified | May 20, 2026 | - -### Data Pipelines - -| Event Type | Display Name | Description | Available Since | -| ----------------------- | --------------------- | ------------------------------------------ | --------------- | -| `data_pipeline.created` | Data Pipeline Created | A new data pipeline integration was set up | April 5, 2026 | -| `data_pipeline.deleted` | Data Pipeline Deleted | A data pipeline was removed | April 5, 2026 | -| `data_pipeline.updated` | Data Pipeline Updated | Data pipeline configuration was modified | April 5, 2026 | - -### Warehouse Sources - -| Event Type | Display Name | Description | Available Since | -| ------------------------------- | ----------------------------- | ------------------------------------------------ | --------------- | -| `warehouse_source.created` | Warehouse Source Created | A new warehouse data source was connected | April 5, 2026 | -| `warehouse_source.deleted` | Warehouse Source Deleted | A warehouse source connection was removed | April 5, 2026 | -| `warehouse_source.updated` | Warehouse Source Updated | Warehouse source configuration was changed | April 5, 2026 | -| `warehouse_source_sync.created` | Warehouse Source Sync Created | A warehouse source sync job was created | May 20, 2026 | -| `warehouse_source_sync.deleted` | Warehouse Source Sync Deleted | A warehouse source sync job was deleted | May 20, 2026 | -| `warehouse_source_sync.updated` | Warehouse Source Sync Updated | Warehouse source sync configuration was modified | May 20, 2026 | - -### Data Management - -| Event Type | Display Name | Description | Available Since | -| ----------------------------- | ---------------------------- | --------------------------------------------------- | --------------- | -| `event_definition.created` | Event Definition Created | A new event definition was created | May 20, 2026 | -| `event_definition.deleted` | Event Definition Deleted | An event definition was deleted | May 20, 2026 | -| `event_definition.updated` | Event Definition Updated | An event definition was modified | May 20, 2026 | -| `event_deletion.canceled` | Event Deletion Canceled | A pending event deletion request was canceled | April 5, 2026 | -| `event_deletion.created` | Event Deletion Requested | A request to delete events was submitted | April 5, 2026 | -| `profile.batch_deleted` | Profile Deleted | A batch of user profiles were removed | May 20, 2026 | -| `profile.batch_updated` | Profile Updated | A batch of user profiles were updated | May 20, 2026 | -| `profile.deleted` | Profile Deleted | A user profile was removed | May 20, 2026 | -| `profile.updated` | Profile Updated | A user profile was updated | May 20, 2026 | -| `property_definition.created` | Property Definition Created | A new property definition was created | May 20, 2026 | -| `property_definition.updated` | Property Definition Updated | A property definition was modified | May 20, 2026 | -| `user_data_deletion.canceled` | User Data Deletion Canceled | A pending user data deletion request was canceled | April 5, 2026 | -| `user_data_deletion.created` | User Data Deletion Requested | A request to delete user profile data was submitted | April 5, 2026 | - -> **Note:** Profile updates (`profile.deleted`, `profile.updated`) are only tracked when initiated through the Mixpanel web application. API calls and direct updates using the Mixpanel SDK are not currently logged in the audit log. - -### Data Exports - -| Event Type | Display Name | Description | Available Since | -| ----------------------------- | --------------------------- | ---------------------------------------- | --------------- | -| `audit_log_export.created` | Audit Log Export Created | An audit log export was initiated | April 5, 2026 | -| `audit_log_export.downloaded` | Audit Log Export Downloaded | An audit log export file was downloaded | April 5, 2026 | -| `event_export.downloaded` | Events Exported | Event data was exported from the project | April 5, 2026 | -| `profile_export.downloaded` | Profile Data Exported | User profile data was exported | April 5, 2026 | -| `raw_event_export.requested` | Raw Event Export Requested | A raw event export was requested | May 20, 2026 | -| `user_data_export.created` | User Data Export Requested | A user data export request was submitted | April 5, 2026 | - -### Service Accounts - -| Event Type | Display Name | Description | Scope | Available Since | -| -------------------------------------- | ------------------------------------ | ----------------------------------------------------- | ----------------- | --------------- | -| `service_account.added_to_project` | Service Account Added to Project | A service account was granted access to a project | Both | April 5, 2026 | -| `service_account.created` | Service Account Created | A new service account was created | Organization only | April 5, 2026 | -| `service_account.deleted` | Service Account Deleted | A service account was removed | Organization only | April 5, 2026 | -| `service_account.removed_from_project` | Service Account Removed from Project | A service account's project access was revoked | Both | April 5, 2026 | -| `service_account.role_changed` | Service Account Role Changed | A service account's role or permissions were modified | Both | April 5, 2026 | - -### User Authentication - -| Event Type | Display Name | Description | Scope | Available Since | -| ------------------------ | ---------------------------- | ------------------------------------------------ | ----------------- | --------------- | -| `session.logged_in` | User Logged In | A user successfully logged into the organization | Organization only | April 5, 2026 | -| `session.logged_out` | User Logged Out | A user logged out of the organization | Organization only | April 5, 2026 | -| `session.login_failed` | User Login Failed | A user login attempt failed | Organization only | May 20, 2026 | -| `user.twofactor_enabled` | User Enabled Two-Factor Auth | A user activated two-factor authentication | Organization only | April 5, 2026 | - -### Billing Info - -| Event Type | Display Name | Description | Scope | Available Since | -| ------------------------------------------ | ----------------------------------- | ---------------------------------------- | ----------------- | --------------- | -| `billing_info.payment_info_updated` | Billing Payment Information Updated | Billing payment information was modified | Organization only | May 20, 2026 | -| `billing_info.receipt_preferences_updated` | Billing Invoice Preferences Updated | Billing invoice preferences were updated | Organization only | May 20, 2026 | -| `billing_info.tax_info_updated` | Billing Tax Information Updated | Billing tax information was modified | Organization only | May 20, 2026 | - -### Experiments - -| Event Type | Display Name | Description | Available Since | -| ----------------------- | ---------------------------- | ------------------------------------ | --------------- | -| `experiment.archived` | Experiment Archived | An experiment was archived | May 20, 2026 | -| `experiment.concluded` | Experiment Concluded | An experiment was concluded | May 20, 2026 | -| `experiment.created` | Experiment Created | A new experiment was created | May 20, 2026 | -| `experiment.decided` | Experiment Decision Recorded | A decision was made on an experiment | May 20, 2026 | -| `experiment.deleted` | Experiment Deleted | An experiment was deleted | May 20, 2026 | -| `experiment.duplicated` | Experiment Duplicated | An experiment was duplicated | May 20, 2026 | -| `experiment.launched` | Experiment Launched | An experiment was launched | May 20, 2026 | -| `experiment.restored` | Experiment Restored | An archived experiment was restored | May 20, 2026 | -| `experiment.updated` | Experiment Updated | Experiment settings were modified | May 20, 2026 | - -### Feature Flags - -| Event Type | Display Name | Description | Available Since | -| ------------------------- | ----------------------- | ------------------------------------- | --------------- | -| `feature_flag.archived` | Feature Flag Archived | A feature flag was archived | May 20, 2026 | -| `feature_flag.created` | Feature Flag Created | A new feature flag was created | May 20, 2026 | -| `feature_flag.deleted` | Feature Flag Deleted | A feature flag was deleted | May 20, 2026 | -| `feature_flag.duplicated` | Feature Flag Duplicated | A feature flag was duplicated | May 20, 2026 | -| `feature_flag.restored` | Feature Flag Restored | An archived feature flag was restored | May 20, 2026 | -| `feature_flag.updated` | Feature Flag Updated | Feature flag settings were modified | May 20, 2026 | - -### Organization Settings - -| Event Type | Display Name | Description | Scope | Available Since | -| ------------------------------------------------- | ------------------------------------- | -------------------------------------------------------- | ----------------- | --------------- | -| `organization_access_security.twofactor_disabled` | Organization Two-Factor Auth Disabled | Organization-wide two-factor authentication was disabled | Organization only | May 20, 2026 | -| `organization_access_security.twofactor_enabled` | Organization Two-Factor Auth Enabled | Organization-wide two-factor authentication was enabled | Organization only | May 20, 2026 | -| `organization_setting.updated` | Organization Settings Changed | Organization settings were modified | Organization only | May 20, 2026 | -| `organization_spark_setting.updated` | Organization AI Settings Changed | Organization AI settings were updated | Organization only | May 20, 2026 | - -### Project Settings - -| Event Type | Display Name | Description | Available Since | -| --------------------- | ------------------- | -------------------------------------------------------------- | --------------- | -| `project.transferred` | Project Transferred | A project was transferred to a different organization or owner | May 20, 2026 | - -### Teams - -| Event Type | Display Name | Description | Scope | Available Since | -| ------------------------------ | --------------------------------- | ----------------------------------------- | ----------------- | --------------- | -| `team.created` | Team Created | A new team was created | Organization only | May 20, 2026 | -| `team.deleted` | Team Deleted | A team was deleted | Organization only | May 20, 2026 | -| `team.service_account_added` | Service Account Added to Team | A service account was added to a team | Organization only | May 20, 2026 | -| `team.service_account_removed` | Service Account Removed from Team | A service account was removed from a team | Organization only | May 20, 2026 | -| `team.updated` | Team Updated | Team settings were modified | Organization only | May 20, 2026 | -| `team.user_added` | User Added to Team | A user was added to a team | Organization only | May 20, 2026 | -| `team.user_removed` | User Removed from Team | A user was removed from a team | Organization only | May 20, 2026 | - -### User Management - -| Event Type | Display Name | Description | Scope | Available Since | -| -------------------------------- | ------------------------------ | ----------------------------------------------------- | ----------------- | --------------- | -| `invitation.accepted` | Accepted Invitation | A user accepted an invitation to the organization | Organization only | May 20, 2026 | -| `invitation.sent` | Invited User to Organization | An invitation was sent to a new user | Organization only | May 20, 2026 | -| `organization.user_added` | User Added to Organization | A user was added to the organization | Organization only | May 20, 2026 | -| `organization.user_removed` | User Removed from Organization | A user was removed from the organization | Organization only | May 20, 2026 | -| `project.default_access_granted` | Default Project Access Granted | Default access for all users to a project was granted | Both | May 20, 2026 | -| `project.default_access_revoked` | Default Project Access Revoked | Default access for all users to a project was revoked | Both | May 20, 2026 | -| `project.team_added` | Team Added to Project | A team was granted access to a project | Both | May 20, 2026 | -| `project.team_removed` | Team Removed from Project | A team's project access was revoked | Both | May 20, 2026 | -| `project.user_added` | User Added to Project | A user was granted access to a project | Both | May 20, 2026 | -| `project.user_removed` | User Removed from Project | A user's project access was revoked | Both | May 20, 2026 | -| `user.role_changed` | User Role Changed | A user's role or permissions were modified | Both | May 20, 2026 | - -### Workspaces - -| Event Type | Display Name | Description | Available Since | -| ------------------------ | --------------------------- | ---------------------------------------- | --------------- | -| `workspace.team_added` | Team Added to Data View | A team was granted access to a data view | May 20, 2026 | -| `workspace.team_removed` | Team Removed from Data View | A team's data view access was revoked | May 20, 2026 | -| `workspace.user_added` | User Added to Data View | A user was granted access to a data view | May 20, 2026 | -| `workspace.user_removed` | User Removed from Data View | A user's data view access was revoked | May 20, 2026 | - -## Exporting Audit Log - -You can export your audit log info to CSV format for further analysis or archival purposes. The export will contain the raw data information for each event. - -1. **Navigate to the Audit Log** page in Organization Settings or Project Settings. -2. **Click the CSV Export button** to download the current view of Audit Log. +1. **Navigate to the audit log** page in Organization Settings or Project Settings. +2. **Click the Export button** and choose your format—**CSV** or **NDJSON**—from the dropdown to download the current view of the audit log. 3. The export includes all visible events within the selected time range. ## Limitations @@ -258,14 +46,14 @@ You can export your audit log info to CSV format for further analysis or archiva ## FAQ -#### Who can access Audit Log? +#### Who can access the audit log? -Only users with Admin or Owner roles in an organization or project can view the audit log for that organization or project. Custom roles can be configured to include audit log access as well. +Only users with Admin or Owner roles in an organization or project can view the audit log for that organization or project. You can configure custom roles to include audit log access as well. -#### Can I filter Audit Log by event type or user? +#### Can I filter the audit log by event type or user? -Yes, the Audit Log interface provides filtering options to help you find specific events or actions by particular users. +Yes, the audit log interface provides filtering options to help you find specific events or actions by particular users. -#### What's the difference between organization and project Audit Log? +#### What's the difference between the organization and project audit logs? -Most events appear in both places. Organization Audit Log contains additional organization-wide events like user authentication and service account creation. Project Audit Log is limited to project-specific events. The tables with a scope field say which audit log will contain the event. If there is not scope column in a table, the event should show up in both organization and project audit logs. \ No newline at end of file +Most events appear in both places. The organization audit log contains additional organization-wide events like user authentication and service account creation. The project audit log is limited to project-specific events. The scope field on the audit log reference page indicates which audit log will contain the event. If there is no scope column in a table, the event appears in both the organization and project audit logs. diff --git a/docs/agentic-automations.mdx b/docs/agentic-automations.mdx index 95b933b6..945c99a4 100644 --- a/docs/agentic-automations.mdx +++ b/docs/agentic-automations.mdx @@ -33,14 +33,21 @@ Click '+ Create New' button in your side navigation bar. At the bottom of the 'A + + +Digests can be delivered daily, weekly, or monthly. Pick the rhythm that matches how your team operates. Weekly is a balanced default cadence for most teams. + + Choose any Insights-style event metric — sums, counts, or unique counts over an event you've already instrumented. The agent will use the metric's existing definition as the source of truth for what it watches. - + + +Use the **Instructions** field to tell the agent how to interpret results and what to call out. For example: "Flag anything that deviates more than 2 standard deviations from the 30-day average" or "Focus on week-over-week change, not absolute values." -Digests can be delivered daily, weekly, or monthly. Pick the rhythm that matches how your team operates — daily is a good default for most active KPIs. +Instructions shape the digest's commentary, not the underlying query. The agent runs a single, fixed query based on the metric you selected. It cannot run additional queries, pull in other metrics, or take actions. Instructions guide how the agent frames its summary: which comparisons to emphasize, what thresholds matter to you, and what language to use when describing shifts. diff --git a/docs/data-governance/lexicon.mdx b/docs/data-governance/lexicon.mdx index 08ee3fe7..973be8a2 100644 --- a/docs/data-governance/lexicon.mdx +++ b/docs/data-governance/lexicon.mdx @@ -146,7 +146,7 @@ This data lets you easily discover the parts of your implementation that are mos Only project owners may block and unblock data from the Lexicon. Learn more about [Roles and Permissions](/docs/orgs-and-projects/roles-and-permissions). -In Lexicon, you can intercept and block incoming events or properties. Mixpanel won’t store any **new data** for the event or property you select to block. **Warning: You cannot recover event data after you block it.** +In Lexicon, you can intercept and block incoming events or properties. Mixpanel won't store any **new data** for the event or property you select to block. **Warning: You cannot recover event data after you block it.** When an event is blocked, all events of that type that have previously been ingested (before blocking it) will still show in the interface. Only project owners can block events and properties. **Note: It takes a few hours for Mixpanel to process the blocked event.** @@ -160,6 +160,10 @@ Sample use cases for blocking events and properties are: **Blocking Events** + +Previously, Block was called "Drop" in Lexicon. Events that formerly showed a "Dropped" status now show a "Blocked" status. + + By blocking an event, you can intercept and block incoming events. Mixpanel will not store any new data for the event you select to block. To block an event in Lexicon: @@ -355,7 +359,7 @@ For Session Replay setup and configuration, see our [Session Replay documentatio ## Export and Import Lexicon Data -Mixpanel supports exporting and importing Lexicon data dictionaries. Project owners, admins, analysts, and consumers can click **Export** in Lexicon to receive a CSV file via email that contains the events and properties, and/or user profile properties data from a project. +Mixpanel supports exporting and importing Lexicon data dictionaries. Project owners, admins, and analysts can click **Export** in Lexicon to receive a CSV file via email that contains the events and properties, and/or user profile properties data from a project. ![Lexicon Export](/images/lexiconExport.png) diff --git a/docs/data-pipelines.mdx b/docs/data-pipelines.mdx index ede6726f..d6c7d0ea 100644 --- a/docs/data-pipelines.mdx +++ b/docs/data-pipelines.mdx @@ -17,7 +17,7 @@ Data Pipelines is a feature that continuously exports data from your Mixpanel pr Setting up Data Pipelines involves two main steps: 1. Configuring your destination to accept data writes from Mixpanel. -2. Creating data pipelines through the **Integrations** page in the UI. +2. Creating data pipelines through the **Destinations** page in the UI. We offer a 30-day free trial of the Data Pipelines add-on. For details on activation, refer to the [FAQ](#how-does-the-free-trial-work). @@ -60,12 +60,11 @@ For detailed setup guides per destination, see: After configuring your destination to accept data exported from Mixpanel, we must initiate the pipeline from the Mixpanel UI. -After configuring your destination, initiate data export in **Integrations** page on your Mixpanel project > **Create Pipeline** > fill in necessary configurations. You can choose different data sources including events, people and identity and other advanced options. See [Data Pipelines](/docs/data-pipelines/json-pipelines) for more details. +After configuring your destination, initiate the data export in the **Destinations** page on your Mixpanel project -> **Create Pipeline** -> fill in the necessary configurations. You can choose different data sources, including events, people and identity, and other advanced options. See [Data Pipelines](/docs/data-pipelines/json-pipelines) for more details. - - + ![create_pipeline1](/images/create_pipeline1.png) @@ -93,7 +92,7 @@ After configuring your destination, initiate data export in **Integrations** pag To delete, pause, or unpause a JSON pipeline: -1. Go to the **Integrations** page +1. Go to the **Destinations** page 2. Find the pipeline you want to manage 3. Click the **3-dot** menu on the right side of the pipeline 4. Select **Delete Pipeline**, **Pause Pipeline**, or **Unpause Pipeline** as needed @@ -102,7 +101,7 @@ Note: JSON pipelines can only be managed through the UI, not via the data pipeli ### Backfilling Historical Data -You can schedule an initial backfill when creating a pipeline. This ensures that historical data is also exported to the data warehouse. Note that the `from_date` must be within 6 months in the past. +You can schedule an initial backfill when creating a pipeline. This ensures that historical data is also exported to the data warehouse. Note that the `from_date` value must be within 6 months in the past. The completion time for a backfill depends on the number of days and the amount of data in the project. Larger backfills can take up to multiple weeks. @@ -110,9 +109,9 @@ The completion time for a backfill depends on the number of days and the amount To check a pipeline's configuration: -1. Go to the **Integrations** page +1. Go to the **Destinations** page 2. Either: - - Click on the pipeline name to view configuration at the top of the page, or + - Click on the pipeline name to view the configuration at the top of the page, or - Click the **3-dot** menu and select **View Configuration** ### Why does the number of events in Mixpanel not match the number of exported events to my destination? @@ -122,7 +121,7 @@ Discrepancies between the event counts in Mixpanel and those exported to your de - **Data Sync**: If [Events Data Sync](/docs/data-pipelines/json-pipelines#events-data-sync) is not enabled or is unsupported for your pipeline, this could prevent some data from being exported. - **Data Delay**: Late-arriving data may take up to one day to sync from Mixpanel to your destination, leading to temporary discrepancies. - **Hidden Events**: Mixpanel exports all events, including those hidden in the Mixpanel UI via Lexicon. To reconcile differences in counts, check if the events in your destination include those hidden in the Mixpanel UI. -- **Timezone Differences**: Data is exported to your warehouse in UTC, whereas data displayed in Mixpanel is in your project timezone. +- **Timezone Differences**: Data is exported to your warehouse in UTC, whereas data displayed in Mixpanel is in your project's timezone. ### What timezone is the data exported in? @@ -138,10 +137,10 @@ Mixpanel offers a 30-day free trial of the Data Pipelines, allowing you to creat **Trial limitations**: -- Exports are scheduled on a daily basis only. +- Exports are scheduled daily only. - Data synchronization feature is not available. - Only one pipeline can be created per data source per project. -- Backfilled data is limited to one day prior to the creation date of the pipeline. +- Backfilled data is limited to one day before the creation date of the pipeline. ### Why can’t I delete my trial pipeline? @@ -149,13 +148,13 @@ You can’t delete a trial pipeline in Mixpanel — this is intentional. Each pr ### What is Active Pipeline Limit -Each project can have 2 recurring pipelines and 1 date ranged backfill pipeline active. Multiple pipelines cannot write to the same destination or for the same date range in a destination. Recurring pipelines must have different frequencies. +Each project can have two recurring pipelines and one date-ranged backfill pipeline active. Multiple pipelines cannot write to the same destination or for the same date range in a destination. Recurring pipelines must have different frequencies. To maintain optimal performance across our services, we limit the number of concurrently running pipeline steps to one per project. This approach ensures that each job, including those involving substantial backfills, waits its turn, preventing any single project from monopolizing resources and thus promoting fair scheduling among all customers. ### Is it possible to specify when pipeline exports run? -No. Hourly pipelines are targeted to run 30 minutes past the hour to be exported, and daily pipelines are targeted to run 30 minutes past the day to be exported (e.g. 00:30 AM) in the project’s timezone. For example, a project in the Pacific timezone with a daily events pipeline will start the export for data from 5/22 on 5/23 00:30 AM PT. +No. Hourly pipelines are targeted to run 30 minutes past the hour to be exported, and daily pipelines are targeted to run 30 minutes past the day to be exported (e.g., 00:30 AM) in the project’s timezone. For example, a project in the Pacific timezone with a daily events pipeline will start the export for data from 5/22 on 5/23 00:30 AM PT. Please note that the [24-hour SLA](/docs/data-pipelines#what-is-the-service-level-agreement) applies. @@ -163,7 +162,7 @@ Please note that the [24-hour SLA](/docs/data-pipelines#what-is-the-service-leve Our Service Level Agreement (SLA) stipulates a latency policy for exported events of up to 24 hours end-to-end, with an additional 24-hour allowance for late-arriving data. -**Note**: Mixpanel classifies late data as any data point or user profile update that reaches Mixpanel servers more than two hours after the end of the export window. Late-arriving event data is exported only for pipelines that with **sync** enabled. +**Note**: Mixpanel classifies late data as any data point or user profile update that reaches Mixpanel servers more than two hours after the end of the export window. Late-arriving event data is exported only for pipelines that have **sync** enabled. For hourly pipelines, data that arrives on time is expected to be exported within 24 hours from the moment it is ingested by Mixpanel. For daily pipelines, this 24-hour period begins at the start of the next calendar day based on project time (e.g., data ingested on January 1st is scheduled to be exported from the start of January 2nd midnight to the end of the day on January 3rd). @@ -171,11 +170,11 @@ Data arriving late is handled during a daily sync process the following day afte ### What should I set for the Account Name and Storage Integration when creating a Snowflake pipeline? -The Account Name should be set to your unique account identifier Eg. "blah2321.us-west-2" while the Storage Integration should be set to the name of the storage integration you created in Snowflake Eg. "MIXPANEL_EXPORT_STORAGE_INTEGRATION". +The Account Name should be set to your unique account identifier, e.g., "example1234.us-west-2", while the Storage Integration should be set to the name of the storage integration you created in Snowflake Eg. "MIXPANEL_EXPORT_STORAGE_INTEGRATION". ### What happens to late-arriving data? For [incremental JSON pipelines](/docs/data-pipelines/json-pipelines#incremental-pipelines), late-arriving data will be exported as it's ingested. However, that is not the case for Raw and Schematized pipelines without [sync](/docs/data-pipelines/json-pipelines#events-data-sync) enabled — manual intervention will be needed to export late-arriving data into your data warehouse. ### Can I change the destination of an existing pipeline? -No, you cannot. If you need to change the destination, you would need to create a new pipeline. \ No newline at end of file +No, you cannot. If you need to change the destination, you would need to create a new pipeline. diff --git a/docs/experiments.mdx b/docs/experiments.mdx index d0be6b19..b4d67ba0 100644 --- a/docs/experiments.mdx +++ b/docs/experiments.mdx @@ -270,6 +270,32 @@ Normalizing by exposed users (not just converters or funnel entrants) helps you **Custom Formula Metrics:** For complex metrics using formulas like `Revenue per User = Total Revenue ÷ Unique Users`, Mixpanel uses propagation of uncertainty to estimate variance. This combines the variances of the component metrics (Total Revenue and Unique Users) to calculate the overall metric's statistical significance. The system assumes metrics in formulas are uncorrelated for these calculations. +### Segment your results + +Segmentation lets you break your experiment results down by a property (such as country, platform, plan type, or device) to see how the treatment effect varies across groups of users. This is useful for spotting cases where a change helps one segment but hurts another, which an aggregate result can hide. + +**How to use it:** Use the **breakdown picker** above the results table to choose a property to segment by. Mixpanel then computes a separate result (lift, p-value, and confidence) for each value of that property and lays them out in a table, so you can compare the variants within every segment. Each segment row reads exactly like the overall results: green for a significant positive difference, red for a significant negative one, and gray for differences that aren't statistically significant. + +This breakdown happens natively inside the Experiment report and is distinct from clicking **Analyze** on a metric, which opens a separate Insights report (see [Diagnosing experiments further](#diagnosing-experiments-further-in-regular-mixpanel-reports)). + +#### The risk of post-hoc segmentation + +Breaking results down after an experiment has run is a form of *post-hoc analysis*, and it carries a real statistical risk. Every additional segment you inspect is another chance to see a "significant" result that is actually just noise. This is the same multiple-comparisons problem described under [Bonferroni](#bonferroni-correction) and [Benjamini-Hochberg](#benjamini-hochberg-correction), but it's especially easy to fall into when you slice the same results many different ways looking for something that "worked." + +This practice is often called *p-hacking*: if you test enough segments, you will eventually find one with a low p-value purely by chance. Reporting that segment as a win, and constructing a story around why that particular group responded, can lead you to ship a change based on a false positive. + + +Treat a winning segment as a **lead to investigate, not a conclusion**. If a segment looks promising, the rigorous next step is to run a fresh experiment that targets that segment specifically and confirms the effect. + + +#### Why Mixpanel corrects segmented results by default + +Because segmenting multiplies the number of comparisons being made, Mixpanel corrects segmented results by default. When you don't already have a [Multiple Testing Correction](#bonferroni-correction) enabled, adding a breakdown turns on the [Benjamini-Hochberg correction](#benjamini-hochberg-correction) across its segments. If you already have Bonferroni enabled, Mixpanel keeps it rather than switching to Benjamini-Hochberg, since Bonferroni is the stricter check. Either way the correction is recommended but optional, and you can turn it off from the results if you want to see the uncorrected numbers. + +Benjamini-Hochberg controls the **false discovery rate**, the share of your flagged winners that are actually false positives. It does this by making the significance threshold stricter as you add more segments, so a segment still highlighted as a winner after correction is more trustworthy. Segments that only looked significant because you tested many of them are filtered out. See the [Benjamini-Hochberg Correction](#benjamini-hochberg-correction) section for a worked example of how the procedure ranks and thresholds p-values. + +This correction operates on the values in your breakdown, which is a different axis from the [Multiple Testing Correction](#bonferroni-correction) you apply across metrics and variants. That means adding more breakdown values doesn't inflate your false positive rate. + ### When do we say the Experiment is ready to review? Once the ‘Test Duration’ setup during configuration is complete, we show a banner that says “Experiment is ready to review”. @@ -286,6 +312,57 @@ Click 'Analyze' on a metric to dive deeper into the results. This will open a no You can also add the experiment breakdowns and filters directly in a report via the Experiments tab in the query builder. This lets you do on-the-fly analysis with the experiment groups. Under the hood, the experiment breakdown and filter work the same as the Experiment report. + +## Multiple Environments + +Multiple Environments lets you treat separate Mixpanel projects as development, staging, and production environments for the same experiment or feature flag. Build and iterate on an experiment (and its underlying flag) in one project, then push it to another project when you're ready — without recreating it by hand. Linked experiments and flags stay connected so you can continue pushing updates over time. + +### Other Environments Selector + +The "Other Environments" selector appears under the **Configuration** tab of an experiment, inside the **More** section. This panel lets you manage an experiment's links to copies of itself in other projects. + +#### Pushing changes + +Pushing changes copies the full configuration of the source (original) experiment to the linked destination experiment in the other project. Any changes that exist only on the destination experiment will be overwritten. + +#### Other Environments Menu + +This menu lists the experiments in other projects that are linked to the current experiment. From here, you can navigate to a linked experiment, push the source experiment's current configuration to it, or remove the connection. + +#### Duplicate To Project + +To duplicate an experiment to another project, open the Other Environments menu and select **Duplicate To Project**. In the dialog, choose the destination project. + +This flow is for duplicating across projects only — to duplicate within the same project, use the existing **Duplicate** option within the experiment's overflow (`...`) menu in the top-right of the experiment page. + +Once duplicated, the new experiment is linked to the original and can be managed from the "Other Environments" menu. + +#### Feature Flags + +If an experiment is linked to a **Mixpanel** Feature Flag, the underlying flag cannot be duplicated on its own from the Feature Flags page — use the experiment's Duplicate flow to copy the experiment and flag together. If your experiment uses a **third-party** flag instead, you can duplicate the experiment directly; no flag duplication step is involved. + +When duplicating an experiment that is linked to a Mixpanel Flag to another project, you will be prompted to confirm whether you also want to duplicate the linked flag. If you do, the new experiment will be linked to the new flag, and the new flag will also appear in the "Other Environments" menu of the original flag. + +When pushing changes, if both the source and destination experiments are linked to flags that are also linked (i.e., you chose to duplicate the flag as well), you can choose to push any changes from the source flag to the destination project's flag at the same time. + +#### Permissions + +To duplicate an experiment to another project, you need permission to create and edit experiments in **both** the source and destination projects. The required permission level in the destination project is the same as what's needed to manually create a new experiment there — governed by that project's roles and custom roles. + +#### What to expect after duplicating + +When an experiment is duplicated to another project, time-based settings (such as the experiment period and day counts) reset to the day the duplicate was created — the same behavior as duplicating within a project. + +If your experiment targets a cohort, Mixpanel assumes the event properties referenced by that cohort exist in the destination project. It does not validate property availability at copy time, so verify that your destination project collects the same events and properties before running the experiment there. + +#### Removing a connection + +Removing an inter-project connection from the "Other Environments" menu unlinks the two experiments — it does **not** delete the experiment in the destination project. The copied experiment remains in the destination project and continues to function independently; it simply loses its link to the original. + + + **Billing across projects:** You aren't double-charged for using the same feature flag across multiple projects. Mixpanel charges based on active feature flag keys, so the same flag-key shared across projects is counted once. + + ## Advanced Statistical Methods Mixpanel offers several advanced statistical options to help you get more reliable experiment results. These features address common challenges in experimentation: controlling for multiple comparisons, handling outliers, validating experiment setup, and reducing variance to reach significance faster. @@ -294,7 +371,8 @@ Mixpanel offers several advanced statistical options to help you get more reliab | Technique | What It Does | When to Use | Actions to Take | | --- | --- | --- | --- | -| **Bonferroni Correction** | Makes significance thresholds stricter to account for testing multiple metrics/variants at once | You're tracking multiple metrics or testing multiple variants | If a metric loses significance after correction, don't treat it as a confirmed winner. Run a follow-up experiment focused on that metric alone. | +| **Bonferroni Correction** | Makes significance thresholds stricter to account for testing multiple metrics/variants at once | You're tracking multiple metrics or testing multiple variants and want maximum protection against any false positive | If a metric loses significance after correction, don't treat it as a confirmed winner. Run a follow-up experiment focused on that metric alone. | +| **Benjamini-Hochberg Correction** | Controls the proportion of significant results that are false positives (false discovery rate) | You're tracking many metrics and want to correct for multiple comparisons without being overly conservative | Treat the surviving significant results as your set of likely winners, knowing a small share may still be false positives. Validate the most important ones in a follow-up. | | **Winsorization** | Caps extreme outlier values at a percentile you choose | Revenue or value-based metrics where outliers are common | If results change substantially after Winsorization, this indicates your original results were driven by outliers. Decide whether your business decision is about typical users or extreme ones. | | **SRM** | Checks whether your variant split matches the configured allocation | Always on as a health check | Pause the experiment. Identify and fix the root cause of the mismatch, then restart the experiment. | | **Pre-Experiment Bias** | Checks whether variant groups were already different *before* the experiment started | Always on as a health check | Your groups had pre-existing bias. Consider enabling CUPED to correct for it. Investigate your assignment logic to prevent it in future experiments. | @@ -314,7 +392,37 @@ Bonferroni Correction addresses this by making the significance threshold strict - You have multiple treatment variants competing against control - You want higher confidence that significant results are real -Bonferroni Correction is conservative. It reduces false positives but also makes it harder to detect true effects. If you have a single metric that matters most to you, you may prefer to focus on that primary metric without correction. +Bonferroni Correction is conservative. It reduces false positives but also makes it harder to detect true effects. If you have a single metric that matters most to you, you may prefer to focus on that primary metric without correction. If you're testing many metrics and Bonferroni feels too strict, consider Benjamini-Hochberg below. + +### Benjamini-Hochberg Correction + +Benjamini-Hochberg (BH) is a more balanced alternative to Bonferroni for handling multiple comparisons. Instead of controlling the probability that *any* significant result is a false positive (the family-wise error rate that Bonferroni targets), BH controls the **false discovery rate** — the expected *proportion* of your "winners" that are actually false positives. + +This better matches how experiment decisions are actually made. You only ship winners, so what matters is the share of those winners that are real. If you have 4 significant metrics and on average 1 is a false positive, your false discovery rate is 25% — regardless of how many metrics you tested in total. + +**How it works:** Mixpanel ranks all p-values for the experiment from smallest to largest. Each p-value is compared to a threshold of (rank / total tests) × α, where α is determined by your confidence level. The largest p-value that passes its threshold — and every smaller p-value — is marked significant. + +For example, with 5 metrics at a 95% confidence level (α = 0.05): + +| Metric | P-value | Rank | BH Threshold (0.05 × rank / 5) | Significant? | +| --- | --- | --- | --- | --- | +| Revenue | 0.003 | 1 | 0.010 | ✅ | +| Signups | 0.012 | 2 | 0.020 | ✅ | +| Click-through | 0.018 | 3 | 0.030 | ✅ | +| Time on page | 0.041 | 4 | 0.040 | ❌ | +| Bounce rate | 0.062 | 5 | 0.050 | ❌ | + +Under BH, the first three metrics are significant. Under Bonferroni at the same confidence level, only Revenue would pass. + +**When to use Benjamini-Hochberg Correction:** + +- You're tracking many metrics and want correction without sacrificing too much statistical power +- You're comfortable accepting that a small proportion of your significant results may be false positives, in exchange for catching more real effects +- You want a correction method that scales gracefully as you add metrics + +A small proportion of significant results may still be false positives under BH, but you are much more likely to detect real effects than with Bonferroni. BH is the recommended choice when you're tracking many metrics or running multi-variant experiments and want to preserve statistical power. + +You can only apply one correction method at a time. Choose Bonferroni when the cost of acting on any false winner is high, and Benjamini-Hochberg when you're testing many metrics and want a more balanced trade-off between false positives and missed effects. ### Winsorization @@ -368,6 +476,8 @@ The core insight is that users who had high engagement or revenue *before* the e **How it works:** For each user, Mixpanel looks at their metric value during a pre-exposure period of your choosing and their metric value during the experiment. If these values are strongly correlated (users with high pre-experiment values tend to have high post-experiment values), CUPED uses this relationship to reduce variance in the experiment results. The mean values remain unchanged—CUPED only tightens the confidence intervals. This is applied to all metric categories: primary, secondary, and guardrail metrics. +**Configuring the pre-exposure period:** When you enable CUPED, you can choose the lookback window under **Configuration → CUPED Pre-Exposure Period**. The available options are **1 Week**, **2 Weeks** (default), **4 Weeks**, **60 Days**, and **90 Days**. A longer window queries further back in time, which picks up more users and more historical signal. Choose a window that is long enough to capture your users' typical behavior — if some users are only active once a month, a 1-week window may miss them entirely. Avoid windows that overlap with previous experiments on the same user population, as shared exposure can reduce sensitivity and introduce bias. That said, a longer window is not always better: behavior from far in the past can be less predictive of current behavior, and users with no activity in the window are assigned a pre-exposure value of zero, which dilutes the variance reduction benefit. Two weeks is a good default for most experiments. + **Handling users without pre-experiment data:** Not all users in your experiment will have activity during the pre-exposure period. New users, or users who simply didn't perform the relevant event before the experiment, are assigned a value of zero for the pre-exposure metric. This allows all experiment users to be included while still benefiting from variance reduction for users who do have historical data. **When to use CUPED:** @@ -406,7 +516,7 @@ An example track call would look like this: `mixpanel.track('$experiment_started', {'Experiment name': 'Test', 'Variant name': 'v1'})` -You can specify the event and property that should be used as the exposure event, name, and variant in the project settings in the Overview tab under 'Experiment Event Settings'. This allows you to use an experiment event that you're already tracking, for example, via a 3rd party feature flagging tool. Note, only string properties should be used for the 'Name' and 'Variant'. +You can specify the event and property that should be used as the exposure event, name, and variant. Go to **Settings → Project → Experimentation**. This allows you to use an experiment event that you're already tracking, for example, via a 3rd party feature flagging tool. Note, only string properties should be used for the 'Name' and 'Variant'. ![image](/images/exp_settings_rescale.png) diff --git a/docs/featureflags.mdx b/docs/featureflags.mdx index b70fbaad..520b19d4 100644 --- a/docs/featureflags.mdx +++ b/docs/featureflags.mdx @@ -109,6 +109,7 @@ When the Variant Assignment Key is set to a group key (e.g., `company_id`, `acco - Cohorts used in feature flag targeting refresh on a periodic cadence (~every 2 hours). So once a user or group entity qualifies for a cohort, it can take up to 2 hours before they see a desired experience. - If you want users or groups to continue seeing the same variant even if they disqualify from the cohort in the future, couple this with **Sticky Variants.** This will ensure they continue to see the new experience until the flag is turned off. + - For the optimal performance, cohorts used in feature flag targeting are officially limited to 20 million users. @@ -218,21 +219,6 @@ This section allows you to whitelist users who will receive the experience, vs r > > **Debugging tip:** to verify which ID was saved for a QA tester, inspect the `/flags/` network request in your browser's developer tools. The response payload includes a `test_users` field listing the saved IDs. Compare these against the `distinct_id` your SDK is sending — if they don't match, that's the source of the issue. You can also see this in the dropdown when searching for users. -### Testing Environment - -Use separate Mixpanel projects, which are connected to your different environments, to reduce risk and promote safety. You might have just 1 or 2 of these, which is also fine: - -1. **Dev** **Project** — rapid iteration; permissive targeting -2. **Staging Project** — mirrors prod cohorts; dry runs for promotion -3. **Prod Project** — customer-facing - -Recommended workflow: -- Create the flag in **dev** with a consistent **Flag Key**. Validate eligibility, variants, etc. -- Create the same flag in **staging.** Use the same **Flag Key.** QA Test in this mode -- Lastly, create the same flag in **prod.** Use the same **Flag Key.** Ensure the right edit permissions are provided, and the right rollout % is set. - -[Coming soon]: Ability to push a flag from Dev or Staging project to Prod project in one click. - ## Performance, Reliability & security **Privacy** @@ -395,6 +381,55 @@ The Feature Flags tab on a user's profile page will display the most recently vi If a user later sees a new variant, that will be displayed instead. If the flag is tied to an experiment, clicking on the right arrow will open a menu allowing the user to navigate to the feature flag page of the associated flag, or the related experiment page. +## Multiple Environments + +Multiple Environments lets you treat separate Mixpanel projects as development, staging, and production environments for the same feature flag or experiment. Build and iterate on a flag (and any experiment it's tied to) in one project, then push it to another project when you're ready — without recreating it by hand. Linked flags and experiments stay connected so you can continue pushing updates over time. + +### Other Environments Selector + +The "Other Environments" selector appears under the **Configuration** tab of a feature flag, inside the **More** section. This panel lets you manage a flag's links to copies of itself in other projects. + +#### Pushing changes + +Pushing changes copies the full configuration of the source (original) flag to the linked destination flag in the other project. Any changes that exist only on the destination flag will be overwritten. + +#### Other Environments Menu + +This menu lists the feature flags in other projects that are linked to the current flag. From here, you can navigate to a linked flag, push the source flag's current configuration to it, or remove the connection. + +#### Duplicate To Project + +To duplicate a feature flag to another project, open the Other Environments menu and select **Duplicate To Project**. In the dialog, choose the destination project. + +This flow is for duplicating across projects only — to duplicate within the same project, use the same **Duplicate** option within flag's overflow (`...`) menu in the top-right of the flag page . + +Note that flags created as part of an experiment (experiment-type flags) cannot be duplicated from the Feature Flags page — duplicate the parent experiment instead, which will optionally duplicate the linked flag with it. + +Once duplicated, the new flag is linked to the original and can be managed from the "Other Environments" menu. + +#### Permissions + +To duplicate a flag to another project, you need permission to create and edit feature flags in **both** the source and destination projects. The required permission level in the destination project is the same as what's needed to manually create a new flag there — governed by that project's roles and custom roles. + +#### What to expect after duplicating + +When a flag is duplicated to another project, time-based settings reset to the day the duplicate was created — the same behavior as duplicating within a project. + +If your flag targets a cohort, Mixpanel assumes the event properties referenced by that cohort exist in the destination project. It does not validate property availability at copy time, so verify that your destination project collects the same events and properties before using the flag there. + +#### Removing a connection + +Removing an inter-project connection from the "Other Environments" menu unlinks the two flags — it does **not** delete the flag in the destination project. The copied flag remains in the destination project and continues to function independently; it simply loses its link to the original. + +#### Data Groups + +Feature Flag rollouts may include configuration that references data groups in a given project. For instance, if you change the +"Assignment Key" of a flag to a data group key, both the source and destination projects _must_ include the referenced data group in order to duplicate or push changes. +If the assignment key is _not_ present in the destination project, the operation will fail. + + + **Billing across projects:** You aren't double-charged for using the same feature flag across multiple projects. Mixpanel charges based on active feature flag keys, so the same flag-key shared across projects is counted once. + ## Feature Flagging Pricing FAQ diff --git a/docs/features.mdx b/docs/features.mdx index bf02575c..d6b4353a 100644 --- a/docs/features.mdx +++ b/docs/features.mdx @@ -15,5 +15,4 @@ title: "Features" - diff --git a/docs/features/spark.mdx b/docs/features/spark.mdx deleted file mode 100644 index 8ba9bbf7..00000000 --- a/docs/features/spark.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Spark" ---- - - -**Meet Mixpanel Agent** – the next evolution of Spark. Mixpanel Agent goes beyond report creation to become your AI analyst, helping you analyze data, build boards, create cohorts, review session replays, and more.
[Learn more about Mixpanel Agent →](/docs/mixpanel-agent) - -Spark will continue to work as-is while we roll out Mixpanel Agent to all customers. -
- -## Overview - -Spark is Mixpanel’s natural language report creation tool. Launch Spark from your dashboard and ask any question about your data. You can create Insights, Funnels, Retention and Flows reports from the dashboard. You can also iterate on any prompt to drill deeper. - -## Using Spark - -To open Spark, navigate to a Board, click "Add Content", then click "Launch Spark" from the list of content options. - - -![spark 1](/images/spark-1.png) - - -You’ll be presented with some example prompts if you’re not sure where to get started, but you can also type in your own prompt. - - -![spark 2](/images/spark-2.png) - - -Spark will return a chart representing the answer to your question. You can click in to see what was generated, you can choose to save the report to your Board, or you can follow up with another prompt to iterate. - - -![spark 3](/images/spark-3.png) - - -You can see a list of previous prompts by pressing the history button at right side of the prompt entry. - - -![spark 4](/images/spark-4.png) - - -When you’re happy with the result, you can press “Save” and save it to your board and create your next card. - -## Limits - -You have a limited number of Spark requests per month, depending on your plan. - -| Plan Type | Spark Requests per month | -| --- | --- | -| Free | 30 | -| Growth | 60 | -| Enterprise | 300 | - -You can see the current number of remaining Spark requests through the Billing page under Organization settings. - - -![spark 5](/images/spark-5.png) - - -## Enabling / Disabling Spark - -Spark can be enabled or disabled by your organization owner and admins. This is accessed through the Overview tab under Organization settings. - - -![spark 6](/images/spark-6.png) - - -For most organizations, Spark will be enabled by default. - -## Privacy - -An overview relating to data privacy, compliance, and security for Mixpanel’s generative AI features can be seen [here](https://mixpanel.com/legal/gen-ai-features/). - -You can also see the legal addendum [here](https://mixpanel.com/legal/gen-ai-service-addendum/). - -## FAQ - -### What Generative AI service does Mixpanel use? - -OpenAI - -### Does Mixpanel use customer data to train? - -By default no. You can enable the option to have Mixpanel train your data in settings. - - -![spark 6](/images/spark-6.png) - diff --git a/docs/mcp.mdx b/docs/mcp.mdx index cb6ee1da..a29a638c 100644 --- a/docs/mcp.mdx +++ b/docs/mcp.mdx @@ -86,12 +86,30 @@ Once enabled, any Mixpanel user in your organization can connect. Users authenti ## Connecting to the MCP Server +Mixpanel's MCP server supports two authentication methods: + +- **OAuth** — Users sign in through a browser with their Mixpanel credentials. Best for interactive use in AI assistants like Claude, ChatGPT, or Cursor. +- **Service Accounts** *(Beta)* — A static credential header with no browser login required. Best for CI/CD pipelines, automated agents, and shared team setups. + +Choose the method that fits your use case below. + +## Connecting with OAuth + ### Claude [Add Mixpanel to Claude](https://claude.ai/directory/connectors/29d60a67-6f16-489b-8a1e-efdcece8d1f6) and complete the Mixpanel OAuth flow. For EU or IN regions, use **Settings → Connectors → Add Custom Connector** instead, and enter your [MCP Server URL](#mcp-server-urls). +### Claude Code + +[Claude Code MCP docs](https://code.claude.com/docs/en/mcp) + +```bash +claude mcp add --transport http mixpanel https://mcp.mixpanel.com/mcp +``` + +Then authenticate by running `/mcp` inside Claude Code and completing the Mixpanel OAuth flow in your browser. ### ChatGPT @@ -126,10 +144,10 @@ codex mcp login mixpanel ### Notion -1. Go to **Settings → Connections → + Add custom MCP** -2. Enter your [MCP Server URL](#mcp-server-urls) and give it a name -3. Click **Connect** and complete the Mixpanel OAuth flow - +1. Create a new Agent from the **Agents** section in the Notion sidebar +2. In the Agent's **Settings**, go to **Tools and Access → + Add Connection** +3. Select **Mixpanel** and complete the OAuth flow + ### Gemini CLI @@ -172,6 +190,172 @@ Or edit `~/.gemini/settings.json` manually and add: Any client that supports the MCP JSON config format, including Microsoft Copilot, can connect using the same JSON snippet from the Cursor section above. The first time it connects it will prompt you to authorize with Mixpanel. +## Connecting with Service Accounts + + + **Beta.** Service account authentication for MCP is in beta. The interface may change. + + +[Service accounts](/reference/Mixpanel%20APIs/authentication/service-accounts) are non-human Mixpanel users designed for scripts, back-end services, and automated workflows. They authenticate via a static header — no browser-based login is required. + +Use service accounts when you need a headless MCP connection, such as CI/CD pipelines, automated agents, or shared team setups. The service account's project permissions apply: it can only access projects it has been added to. + +### Prerequisites + +1. **Create a service account** in your [Organization settings](https://mixpanel.com/settings/org#serviceaccounts) or [Project settings](https://mixpanel.com/settings/project#serviceaccounts). You need Owner or Admin permissions to do this. +2. **Save the username and secret** — you won't be able to view the secret again after creation. +3. **Ensure the service account has access** to the projects you want to query via MCP. +4. **MCP must be enabled** by an org admin in **Settings → Org → Overview**. + +### Generating the Authorization Header + +Encode the service account credentials as a base64 string and construct the authorization header: + +```bash +echo -n ":" | base64 +``` + +This outputs a base64-encoded string. The full header value is: + +``` +Authorization: Bearer Basic +``` + +For example, if your username is `my-sa.abc123.mp-service-account` and your secret is `my-secret`, run: + +```bash +echo -n "my-sa.abc123.mp-service-account:my-secret" | base64 +# Output: bXktc2EuYWJjMTIzLm1wLXNlcnZpY2UtYWNjb3VudDpteS1zZWNyZXQ= +``` + +The header would be: `Authorization: Bearer Basic bXktc2EuYWJjMTIzLm1wLXNlcnZpY2UtYWNjb3VudDpteS1zZWNyZXQ=` + + + Treat the base64-encoded credentials like a password. Use environment variables or secret managers instead of hardcoding them in config files. + + +### Claude + +[Claude Desktop MCP docs](https://support.claude.com/en/articles/10949351-getting-started-with-local-mcp-servers-on-claude-desktop) + +Open your config file via **Settings → Developer → Edit Config** and add the following (use the EU or IN URL if needed): + +```json +{ + "mcpServers": { + "mixpanel": { + "url": "https://mcp.mixpanel.com/mcp", + "headers": { + "Authorization": "Bearer Basic " + } + } + } +} +``` + +Restart Claude Desktop after saving the file. + +### Claude Code + +[Claude Code MCP docs](https://code.claude.com/docs/en/mcp) + +```bash +claude mcp add --transport http mixpanel https://mcp.mixpanel.com/mcp \ + --header "Authorization: Bearer Basic " +``` + +Or add it to your `.mcp.json` file using an environment variable: + +```json +{ + "mcpServers": { + "mixpanel": { + "type": "http", + "url": "https://mcp.mixpanel.com/mcp", + "headers": { + "Authorization": "Bearer Basic ${MIXPANEL_SA_TOKEN}" + } + } + } +} +``` + +Set `MIXPANEL_SA_TOKEN` to your base64-encoded credentials before starting Claude Code. + +### Codex + +1. Go to **Settings → MCP Servers → + Add Server** +2. Provide a name (e.g. Mixpanel) and select **Streamable HTTP** +3. Enter your [MCP Server URL](#mcp-server-urls) +4. Add the [authorization header](#generating-the-authorization-header) and click **Save** + +### Codex CLI + +Add the following to `~/.codex/config.toml` (use the EU or IN URL if needed): + +```toml +[mcp_servers.mixpanel] +url = "https://mcp.mixpanel.com/mcp" +headers = { Authorization = "Bearer Basic " } +``` + +### Notion + +Service accounts are not supported through the Notion agent connector. Use [Cursor](#cursor-1) or another client that supports custom headers instead. + +### Gemini CLI + +```bash +gemini mcp add mixpanel npx -y mcp-remote https://mcp.mixpanel.com/mcp \ + --header "Authorization:Bearer Basic " +``` + +Or edit `~/.gemini/settings.json` manually and add (use the EU or IN URL if needed): + +```json +{ + "mcpServers": { + "mixpanel": { + "command": "npx", + "args": [ + "-y", "mcp-remote", + "https://mcp.mixpanel.com/mcp", + "--header", "Authorization:${AUTH_HEADER}" + ], + "env": { + "AUTH_HEADER": "Bearer Basic " + } + } + } +} +``` + +### Cursor + +[Cursor MCP docs](https://cursor.com/docs/mcp) + +1. Go to **Settings → Tools & MCP → New MCP Server** to open `~/.cursor/mcp.json` +2. Add the following (use the EU or IN URL if needed): + +```json +{ + "mcpServers": { + "mixpanel": { + "url": "https://mcp.mixpanel.com/mcp", + "headers": { + "Authorization": "Bearer Basic ${env:MIXPANEL_SA_TOKEN}" + } + } + } +} +``` + +3. Set the `MIXPANEL_SA_TOKEN` environment variable to your base64-encoded credentials + +### Microsoft Copilot (JSON-configured clients) + +Any client that supports the MCP JSON config format, including Microsoft Copilot, can connect using the same JSON snippet from the Cursor section above — adding the `headers` object with the [authorization header](#generating-the-authorization-header). + ## Example Queries Once connected, try asking your AI assistant: @@ -290,7 +474,7 @@ projects analysis events insights segmentation retention data:read funnels flows **Optional:** ``` -dashboard_reports bookmarks user_details +dashboard_reports bookmarks user_details business_context ``` diff --git a/docs/mixpanel-agent.mdx b/docs/mixpanel-agent.mdx index 9f12ec6a..8d60cf10 100644 --- a/docs/mixpanel-agent.mdx +++ b/docs/mixpanel-agent.mdx @@ -7,10 +7,6 @@ tags: [mixpanel agent, agent, ai, spark, copilot, subagent, llm] Mixpanel Agent is an AI analyst built into Mixpanel. Ask it questions or give it tasks and the Agent interprets your intent and selects the right tools automatically. A single prompt can run an analysis, build a report, create a cohort, or walk you through a user's session replays without you specifying each step. - -Mixpanel Agent is currently in beta and is coming to all customers soon. - - ## Core Capabilities The Mixpanel Agent has access to a broad set of Mixpanel capabilities and selects tools automatically based on what you ask. @@ -106,39 +102,34 @@ When unverified data is excluded from a response, users are notified that additi ## Security & Privacy -**Your data stays within your existing access.** Enabling the Agent doesn't change any data or user permissions. - -**Your data is not used to train AI models.** Queries are processed by a third-party AI provider to generate responses, but customer data is not used for model training. Additionally, Mixpanel's contracts with third-parties prohibit them from using your data to train or improve their models. - -**Disabling Mixpanel AI.** Mixpanel AI features can be disabled at any time from Organization settings. This removes access for all users. - - -![Mixpanel AI Settings](/images/mixpanel-ai-settings.png) - - -AI features are disabled by default for customers that have enrolled in EU or India Data Residency, but can be enabled by your Mixpanel admin. AI features are disabled for signed Business Associate Addenda (BAAs) with Mixpanel (and cannot be enabled). - -For more details: -- [Mixpanel Agent Beta Service Addendum](https://mixpanel.com/legal/supplemental-terms/#mixpanel-agent-beta-service-addendum) -- [Mixpanel's Data Processing Addendum](https://mixpanel.com/legal/dpa/) +Mixpanel’s AI is built with privacy-by-design principles. For details: +- [Mixpanel AI Compliance](https://mixpanel.com/legal/ai-compliance/) +- [Mixpanel’s Data Processing Addendum](https://mixpanel.com/legal/dpa/) ## FAQ -**1. Is the Agent free?**
-Mixpanel Agent is free to use during beta. - -**2. What AI models does it use?**
+**1. What AI models does it use?**
The Mixpanel Agent is powered by Claude. -**3. How can I influence what Mixpanel Agent surfaces?**
-Adding Organization and Project [Business Context](/docs/business-context). Saving [Metrics and Behaviors](docs/features/saved-metrics-and-behaviors). [Verifying Data](/docs/data-governance/lexicon#verify-data). The Agent uses all this context you provide to craft the best response for your prompt. +**2. How can I influence what Mixpanel Agent surfaces?**
+Adding Organization and Project [Business Context](/docs/business-context). Saving [Metrics and Behaviors](/docs/features/saved-metrics-and-behaviors). [Verifying Data](/docs/data-governance/lexicon#verify-data). The Agent uses all this context you provide to craft the best response for your prompt. -**4. How do I share feedback or request new capabilities?**
+**3. How do I share feedback or request new capabilities?**
Use the feedback buttons inside the Agent experience to share what's working, what's missing, or what you'd like to see. We're actively building. Your feedback directly shapes the roadmap. ![Mixpanel Agent Feedback](/images/mixpanel-agent-feedback.png) -**5. What happened to Spark?**
-Mixpanel Agent is the next evolution of [Spark](/docs/features/spark). If you still have access to Spark, you'll get Mixpanel Agent as soon as we complete the rollout to all customers. +**5. How can I disable AI features?**
+Mixpanel AI features can be disabled at any time from Organization settings. This removes access for all users. + +![Mixpanel AI Settings](/images/mixpanel-ai-settings.png) + +**6. What happened to Spark?**
+Mixpanel Agent is the next evolution of Spark. If you still have access to Spark, you'll get Mixpanel Agent as soon as we complete the rollout to all customers. + + + + Looking for Spark? This is the right page. Spark is now Mixpanel Agent, with all of Spark's original capabilities and more. + diff --git a/docs/orgs-and-projects/organizations.mdx b/docs/orgs-and-projects/organizations.mdx index d3333b21..cecad69d 100644 --- a/docs/orgs-and-projects/organizations.mdx +++ b/docs/orgs-and-projects/organizations.mdx @@ -76,8 +76,24 @@ To make a new person the owner of your organization, follow these steps: 5. They will receive an email to create a user account and, afterwards, have full control of the organization. ## Deleting an Organization -Organization Owners may request the closure of the organization under the Overview tab in the Organization Settings, which would delete your organization, all existing projects, and all the data contained within them. Users will maintain access to your organization for 90 days, after which it will be deleted. After 90 days, organization projects will be **permanently** deleted and cannot be recovered. -Learn more about privacy and compliance [here](/docs/privacy). + +Only **Organization Owners** may delete an organization. Learn more about [Roles and Permissions](/docs/orgs-and-projects/roles-and-permissions). + -[Contact the Support team](https://mixpanel.com/get-support) if you have any questions regarding the deletion of your organization/data. + +Deleting an organization will remove all existing projects and all data contained within them. **This action is irreversible.** + + +To delete your organization: + +1. Go to **Organization Settings** (from the left nav, select→ **Settings** → **Organization Settings**). +2. Open the **Overview** tab. +3. Click the **Delete Organization** button. +4. Confirm the deletion. + +Users will maintain access for **90 days** before the organization and all its data are permanently deleted. + +Learn more about [privacy and compliance](https://docs.mixpanel.com/docs/privacy). + +[Contact the Support team](https://mixpanel.com/get-support) if you have any questions about deleting your organization or its data. diff --git a/docs/orgs-and-projects/roles-and-permissions.mdx b/docs/orgs-and-projects/roles-and-permissions.mdx index 818d99f8..53ca165a 100644 --- a/docs/orgs-and-projects/roles-and-permissions.mdx +++ b/docs/orgs-and-projects/roles-and-permissions.mdx @@ -224,7 +224,7 @@ The table below is an overview of the permissions per role for reports and other | Add Tags in Lexicon | ✅ | ✅ | ❌ | ❌ | | Merge Data in Lexicon | ✅ | ❌ | ❌ | ❌ | | Drop Data in Lexicon | ✅ | ❌ | ❌ | ❌ | -| Download CSV in Lexicon | ✅ | ✅ | ✅ | ✅ | +| Download CSV in Lexicon | ✅ | ✅ | ✅ | ❌ | **Owner** diff --git a/docs/pricing.mdx b/docs/pricing.mdx index cedd57a4..4b075f7c 100644 --- a/docs/pricing.mdx +++ b/docs/pricing.mdx @@ -140,7 +140,7 @@ You can also check the top events contributing towards your event count by creat If you go over your plan's events, Mixpanel won't stop collecting your data: -- If you're using a Free plan, Mixpanel caps you at 1M monthly events, but doesn't charge overages. Once you hit the limit, you will be blocked from viewing your reports until you either upgrade to a Growth plan that supports your current usage or wait until the following month, when your allowance automatically resets. +- If you're using a Free plan, Mixpanel limits your platform access once you reach 1M monthly events, but doesn't charge overages. Once you hit the limit, you will be blocked from viewing your reports until you either upgrade to a Growth plan that supports your current usage or wait until the following month, when your allowance automatically resets. - If you're using a Growth plan, the additional cost will be charged at the beginning of the next month based on your À La Carte rate, which you can find in the "Plan Details & Billing" section in your Organization Settings. On the contrary, if you want to avoid paying for overages, you can either [downgrade your paid plan to the Free one](/docs/pricing#downgrade-your-plan-to-free) or upgrade to one that covers your additional usage before the end of the billing cycle - the more events your plan includes, the less you pay per event. diff --git a/docs/privacy/end-user-data-management.mdx b/docs/privacy/end-user-data-management.mdx index 294d7fc7..34684cde 100644 --- a/docs/privacy/end-user-data-management.mdx +++ b/docs/privacy/end-user-data-management.mdx @@ -66,7 +66,7 @@ You must submit a deletion request to delete end user data. This is done to sati - Select a project in the "Project" dropdown. - Select to delete data for a single user or multiple users. - For a single user, provide the distinct_id of the user. - - For multiple users, upload a list of distinct_ids as a CSV file. There is a limit of 500 users per request. + - For multiple users, upload a list of distinct_ids as a CSV file. There is a limit of 2000 users per request, which may be lower if your project uses Group Analytics. 3. Click Submit Request. Note that requests can take up to several weeks to process. diff --git a/docs/reports/insights.mdx b/docs/reports/insights.mdx index 069d34e9..a712cc3e 100644 --- a/docs/reports/insights.mdx +++ b/docs/reports/insights.mdx @@ -402,9 +402,9 @@ The following functions have additional aggregation options which you will be pr | Function | Aggregation options | | --- | --- | -| Frequency per User | Total Per User | -| Aggregate Property | Sum
Average
Median
[Distinct Count](https://www.loom.com/share/7d0e42f847c24b3c8720d5b6a6bedeb4)
Percentiles (P25,P75,P90,P99)
Minimum
Maximum | -| Aggregate Property per User | Sum
Average
Distinct value count
Minimum
Maximum | +| Frequency per User | Distribution
Average
Median
Percentiles (P25,P75,P90,Nth)
Minimum
Maximum | +| Aggregate Property | Sum
Average
Median
[Distinct Count](https://www.loom.com/share/7d0e42f847c24b3c8720d5b6a6bedeb4)
Percentiles (P25,P75,P90,P99,Nth)
Minimum
Maximum | +| Aggregate Property per User | Average
Sum
Distribution
Median
Percentiles (P25,P75,P90,Nth)
Minimum
Maximum | These functions provide additional aggregation options following the initial calculation because they are “per user” calculations. “Per user” calculations first calculate the value per user, which is an unhelpful query in its raw form, but becomes useful when you perform an aggregation on that calculation. diff --git a/docs/root-cause-analysis.mdx b/docs/root-cause-analysis.mdx index 636908a3..bad70c8d 100644 --- a/docs/root-cause-analysis.mdx +++ b/docs/root-cause-analysis.mdx @@ -17,10 +17,10 @@ Mixpanel's **AI-Powered Root Cause Analysis (RCA)** feature does that work for y When you run an RCA, Mixpanel immediately launches a new Board and exposes the agent's reasoning as it works: -1. **Validates the anomaly.** Confirms there's a meaningful change to explain before going further. +1. **Validates the anomaly.** Confirms there's a real change to explain before going further, using a z-score to check the change is well outside normal day-to-day variation rather than routine noise or seasonality. 2. **Selects properties to analyze.** An LLM agent picks which properties to break down on, combining properties Mixpanel suggests for the event with any you've prioritized in [Custom RCA Settings](#custom-rca-settings). It spreads picks across plausible cause categories (acquisition, audience, platform, data quality, user identity), filters out high-cardinality identifiers and near-duplicates, and factors in your project's business context. 3. **Runs breakdowns.** Executes the chosen breakdowns to see which segments actually moved. -4. **Writes an interpretation.** Fills the Board with contribution factor analysis, ranked dimensions, an AI-written explanation of the likely cause, a confidence level, and suggested next steps. +4. **Writes an interpretation.** Fills the Board with contribution factor analysis (each segment's share of the total change), ranked dimensions, an AI-written explanation of the likely cause, a confidence level, and suggested next steps. Cards stream into the Board as each step completes, with a live progress banner at the top while the agent is still working. @@ -54,6 +54,10 @@ Oftentimes, customers know which properties matter for their business and want t In the AI Settings tab of your Project Settings, you can specify which event properties RCA should prioritize during analysis. For example, a marketing team that knows anomalies usually trace back to `utm_campaign_id` can point RCA at that dimension so it's always considered first. Properties you prioritize are combined with Mixpanel's automatic suggestions, so you never lose the agent's broader view — you just guide it toward the dimensions you care most about. + + These settings only influence which properties RCA prioritizes. They don't control RCA's analysis sequencing or methodology — regardless of the instructions you provide, the agent still validates the anomaly, runs its breakdowns, ranks contributing dimensions, and writes up its interpretation the same way. + + ## Feedback Every generated Board has a thumbs-up / thumbs-down feedback widget. We use this signal to evaluate RCA quality and improve future runs. If RCA missed the mark, please rate it — it's the most direct way to influence what we work on next. diff --git a/docs/tracking-methods/sdks/android/android-replay.mdx b/docs/tracking-methods/sdks/android/android-replay.mdx index e8253425..fe003020 100644 --- a/docs/tracking-methods/sdks/android/android-replay.mdx +++ b/docs/tracking-methods/sdks/android/android-replay.mdx @@ -65,6 +65,42 @@ private fun initializeMixpanel() { } ``` +## Data Residency + + +Available in Session Replay SDK version `1.4.0` and later. + + +If your Mixpanel project lives in the EU or India data center, or you route all Mixpanel traffic through a self-hosted proxy, set `serverUrl` on `MPSessionReplayConfig`. The SDK exposes a `DataResidency` object with the managed region URLs so you don't have to hardcode them. + +| Region | `DataResidency` constant | URL | +| --- | --- | --- | +| US (default) | `DataResidency.US` | `https://api.mixpanel.com` | +| EU | `DataResidency.EU` | `https://api-eu.mixpanel.com` | +| India | `DataResidency.IN` | `https://api-in.mixpanel.com` | + +**Example Usage** + +```kotlin Kotlin +import com.mixpanel.android.sessionreplay.utils.DataResidency + +val config = MPSessionReplayConfig( + wifiOnly = false, + serverUrl = DataResidency.EU +) +MPSessionReplay.initialize(this, token, mixpanel.distinctId, config) +``` + +You can also pass any fully-qualified HTTPS URL — useful when routing replay traffic through a self-hosted proxy: + +```kotlin Kotlin +val config = MPSessionReplayConfig( + serverUrl = "https://mixpanel-proxy.yourcompany.com" +) +``` + +Learn more about [EU Data Residency](/docs/privacy/eu-residency) and [India Data Residency](/docs/privacy/in-residency). + ## Capturing Replays diff --git a/docs/tracking-methods/sdks/flutter.mdx b/docs/tracking-methods/sdks/flutter.mdx index 22191ba4..8f152111 100644 --- a/docs/tracking-methods/sdks/flutter.mdx +++ b/docs/tracking-methods/sdks/flutter.mdx @@ -536,7 +536,19 @@ mixpanel.optInTracking(); ``` ### EU Data Residency -Route data to Mixpanel's EU servers by setting the `serverURL` property after initializing the client. +Route data to Mixpanel's EU servers by passing the `serverURL` parameter when initializing the client. This ensures every request is routed to the correct region from the very first event. + +**Example Usage** +```dart +// route data to Mixpanel's EU domain at initialization +mixpanel = await Mixpanel.init( + "YOUR_PROJECT_TOKEN", + trackAutomaticEvents: false, + serverURL: "https://api-eu.mixpanel.com", +); +``` + +Alternatively, you can set the `serverURL` property after initializing the client. **Example Usage** ```dart @@ -546,7 +558,19 @@ mixpanel.setServerURL("https://api-eu.mixpanel.com"); ### India Data Residency -Route data to Mixpanel's India servers by setting the `serverURL` property after initializing the client. +Route data to Mixpanel's India servers by passing the `serverURL` parameter when initializing the client. This ensures every request is routed to the correct region from the very first event. + +**Example Usage** +```dart +// route data to Mixpanel's India domain at initialization +mixpanel = await Mixpanel.init( + "YOUR_PROJECT_TOKEN", + trackAutomaticEvents: false, + serverURL: "https://api-in.mixpanel.com", +); +``` + +Alternatively, you can set the `serverURL` property after initializing the client. **Example Usage** ```dart @@ -582,7 +606,19 @@ There are two steps: setting up a proxy server and pointing the SDK at your serv The simplest way is to use our [sample nginx config](https://github.com/mixpanel/tracking-proxy). This config redirects any calls made to your proxy server to Mixpanel. **Step 2: Point Flutter SDK at your server** -Add the following line, replacing `YOUR_PROXY_DOMAIN` with your proxy server's domain. +Pass the `serverURL` parameter when initializing the client, replacing `YOUR_PROXY_DOMAIN` with your proxy server's domain. This ensures every request is routed to your proxy from the very first event. + +**Example Usage** +```dart +// route data to your proxy server at initialization +mixpanel = await Mixpanel.init( + "YOUR_PROJECT_TOKEN", + trackAutomaticEvents: false, + serverURL: "https://", +); +``` + +Alternatively, you can set the `serverURL` property after initializing the client. **Example Usage** ```dart diff --git a/docs/tracking-methods/sdks/flutter/flutter-replay.mdx b/docs/tracking-methods/sdks/flutter/flutter-replay.mdx index c5c2d8c1..ee684d90 100644 --- a/docs/tracking-methods/sdks/flutter/flutter-replay.mdx +++ b/docs/tracking-methods/sdks/flutter/flutter-replay.mdx @@ -7,10 +7,6 @@ sidebarTitle: "Session Replay (Flutter)" This developer guide will assist you in configuring your Flutter app for [Session Replay](/docs/session-replay) using the [Session Replay SDK (Flutter)](https://github.com/mixpanel/mixpanel-flutter-session-replay). Learn more about [viewing captured Replays in your project here](/docs/session-replay). - - Flutter Session Replay is currently in **Public Beta**. Please reach out to your Account Manager for any questions about Session Replay or the beta. - - ## Best Practices Session Replay provides powerful insights into user behavior, but it also introduces risks, especially on mobile. These risks are not unique to Mixpanel; they are common across the entire session replay product category. Because SDKs run on end-user devices and screen content may include sensitive data, we recommend implementing / testing Session Replay carefully. Be especially cautious with masking, edge-case testing, and rollout strategies. For more information on risk categories and best practices, read more [here](/docs/session-replay#best-practices). @@ -84,6 +80,41 @@ class _MyAppState extends State { } ``` +## Data Residency + +If your Mixpanel project lives in the EU or India data center, or you route all Mixpanel traffic through a self-hosted proxy, set `serverUrl` on `SessionReplayOptions`. The SDK exposes a `DataResidency` class with the managed region URLs so you don't have to hardcode them. + +| Region | `DataResidency` constant | URL | +| --- | --- | --- | +| US (default) | `DataResidency.us` | `https://api.mixpanel.com` | +| EU | `DataResidency.eu` | `https://api-eu.mixpanel.com` | +| India | `DataResidency.india` | `https://api-in.mixpanel.com` | + +**Example Usage** + +```dart +import 'package:mixpanel_flutter_session_replay/mixpanel_flutter_session_replay.dart'; + +final result = await MixpanelSessionReplay.initialize( + token: 'YOUR_MIXPANEL_TOKEN', + distinctId: 'user_123', + options: SessionReplayOptions( + autoRecordSessionsPercent: 100.0, + serverUrl: DataResidency.eu, + ), +); +``` + +You can also pass any fully-qualified HTTPS URL — useful when routing replay traffic through a self-hosted proxy: + +```dart +options: SessionReplayOptions( + serverUrl: 'https://mixpanel-proxy.yourcompany.com', +) +``` + +Learn more about [EU Data Residency](/docs/privacy/eu-residency) and [India Data Residency](/docs/privacy/in-residency). + ## Quick Start Here's a quick overview of some available controls. For a more in-depth guide, continue reading. @@ -566,10 +597,6 @@ Without any masking directive, auto-masking applies based on `autoMaskedViews` c By default, Mixpanel retains Session Replays for 30 days from the date the replay is ingested and becomes available for viewing within Mixpanel. Customers on our [Enterprise plan](https://mixpanel.com/pricing/) can customize this retention period between 7 days and 360 days. Once a replay is expired, there is no way to view that replay. -## Legal (Beta Terms) - -Our Session Replay Beta Service Addendum can be found [here](https://mixpanel.com/legal/session-replay-beta-service-addendum/). - ## FAQ #### How does Session Replay work in Flutter? @@ -615,4 +642,4 @@ Key Considerations: - The Mixpanel Session Replay SDK is separate from the standard Mixpanel tracking SDK. You do not need the regular SDK, but the Replay SDK must be configured with a `distinctId` and project token. - Events can be linked to replays either by: - Manually attaching the current replay ID (`$mp_replay_id`) to each event - - Using server-side stitching after the fact \ No newline at end of file + - Using server-side stitching after the fact diff --git a/docs/tracking-methods/sdks/javascript/javascript-replay.mdx b/docs/tracking-methods/sdks/javascript/javascript-replay.mdx index 09c8225c..e75879d4 100644 --- a/docs/tracking-methods/sdks/javascript/javascript-replay.mdx +++ b/docs/tracking-methods/sdks/javascript/javascript-replay.mdx @@ -13,6 +13,30 @@ By default, Session Replay is disabled and will not be loaded into your applicat You are a Mixpanel customer and have the latest version of the Mixpanel Javascript SDK installed (minimum supported version is [`v2.50.0`](https://github.com/mixpanel/mixpanel-js/releases/tag/v2.50.0)). If not, please follow [this doc](/docs/quickstart/install-mixpanel) to install the SDK. +## Data Residency + +If your Mixpanel project lives in the EU or India data center, or you route all Mixpanel traffic through a self-hosted proxy, set `api_host` when you initialize the JavaScript SDK. Session Replay reuses the same `api_host` — there is no separate replay endpoint to configure. + +| Region | `api_host` value | +| --- | --- | +| US (default) | `https://api.mixpanel.com` | +| EU | `https://api-eu.mixpanel.com` | +| India | `https://api-in.mixpanel.com` | + +**Example Usage** + +```javascript Javascript +// Route Session Replay (and all other Mixpanel traffic) to the EU data center +mixpanel.init('YOUR_PROJECT_TOKEN', { + api_host: 'https://api-eu.mixpanel.com', + record_sessions_percent: 100 +}); +``` + +For self-hosted proxies, pass your proxy URL as `api_host`. If you also need the SDK to load its async module bundles (including the recorder) through your proxy instead of `cdn.mxpnl.com`, see [Self-Hosted Proxy](/docs/tracking-methods/sdks/javascript#self-hosted-proxy) for the full setup. + +Learn more about [EU Data Residency](/docs/privacy/eu-residency) and [India Data Residency](/docs/privacy/in-residency). + ## Capturing Replays @@ -539,18 +563,21 @@ mixpanel.init('MIXPANEL-PROJECT-TOKEN', { // Disabled initially to prevent race condition with RudderStack ID binding. // Remove this line if you are not using heatmaps. record_heatmap_data: false, - - + autocapture: false, //optional set to true if using Autocapture loaded: function (mixpanel) { window.rudderanalytics.ready(function() { const rudderAnonymousId = rudderanalytics.getAnonymousId(); - if (rudderAnonymousId) { - mixpanel.register({ $device_id: rudderAnonymousId, distinct_id : "$device:"+rudderAnonymousId }); - - // Enable heatmap data now that the correct device_id is registered. - // Remove this line if you are not using heatmaps. + if (rudderAnonymousId) { + // Idempotency guard prevents double-prefixing on repeat page loads. + if (!rudderAnonymousId.startsWith('$device:')) { + rudderanalytics.setAnonymousId('$device:' + rudderAnonymousId); + } + + mixpanel.register({ + $device_id: rudderAnonymousId, + distinct_id: '$device:' + rudderAnonymousId, + }); mixpanel.set_config({ record_heatmap_data: true }); - } // Patch track method to include sessionReplayProperties diff --git a/docs/tracking-methods/sdks/react-native.mdx b/docs/tracking-methods/sdks/react-native.mdx index bf4c6898..757e674e 100644 --- a/docs/tracking-methods/sdks/react-native.mdx +++ b/docs/tracking-methods/sdks/react-native.mdx @@ -654,24 +654,42 @@ mixpanel.track('some_other_event'); ``` ### EU Data Residency -Route data to Mixpanel's EU servers by calling `.setServerURL()` to set the `serverURL` to `https://api-eu.mixpanel.com` after initializing the client. +Route data to Mixpanel's EU servers by setting the `serverURL` to `https://api-eu.mixpanel.com`. + +The recommended approach is to pass the `serverURL` to `.init()` so it is set before any events are sent. The `.init()` method accepts the `serverURL` as its third argument (available in SDK v3.3.0 and above). Learn more about [EU Data Residency](/docs/privacy/eu-residency). **Example Usage** +```javascript +// set the server URL at initialization to use Mixpanel's EU domain +mixpanel.init(false, {}, 'https://api-eu.mixpanel.com'); +``` + +Alternatively, you can call `.setServerURL()` to change the `serverURL` after initializing the client. + ```javascript // set the Mixpanel instance to send data using Mixpanel's EU domain mixpanel.setServerURL('https://api-eu.mixpanel.com'); ``` ### India Data Residency -Route data to Mixpanel's India servers by calling `.setServerURL()` to set the `serverURL` to `https://api-in.mixpanel.com` after initializing the client. +Route data to Mixpanel's India servers by setting the `serverURL` to `https://api-in.mixpanel.com`. + +The recommended approach is to pass the `serverURL` to `.init()` so it is set before any events are sent. The `.init()` method accepts the `serverURL` as its third argument (available in SDK v3.3.0 and above). Learn more about [India Data Residency](/docs/privacy/in-residency). **Example Usage** ```javascript -// set the Mixpanel instance to send data using Mixpanel's EU domain +// set the server URL at initialization to use Mixpanel's India domain +mixpanel.init(false, {}, 'https://api-in.mixpanel.com'); +``` + +Alternatively, you can call `.setServerURL()` to change the `serverURL` after initializing the client. + +```javascript +// set the Mixpanel instance to send data using Mixpanel's India domain mixpanel.setServerURL('https://api-in.mixpanel.com'); ``` diff --git a/docs/tracking-methods/sdks/react-native/react-native-replay.mdx b/docs/tracking-methods/sdks/react-native/react-native-replay.mdx index f0dd495e..8e49726d 100644 --- a/docs/tracking-methods/sdks/react-native/react-native-replay.mdx +++ b/docs/tracking-methods/sdks/react-native/react-native-replay.mdx @@ -84,6 +84,47 @@ await MPSessionReplay.stopRecording(); const recording = await MPSessionReplay.isRecording(); ``` +## Data Residency + + +Available in React Native Session Replay SDK version `1.3.0` and later. + + +If your Mixpanel project lives in the EU or India data center, or you route all Mixpanel traffic through a self-hosted proxy, set `serverURL` on `MPSessionReplayConfig`. The SDK exposes a `MPDataResidency` constant set with the managed region URLs so you don't have to hardcode them. + +| Region | `MPDataResidency` constant | URL | +| --- | --- | --- | +| US (default) | `MPDataResidency.US` | `https://api.mixpanel.com` | +| EU | `MPDataResidency.EU` | `https://api-eu.mixpanel.com` | +| India | `MPDataResidency.IN` | `https://api-in.mixpanel.com` | + +**Example Usage** + +```typescript +import { + MPSessionReplay, + MPSessionReplayConfig, + MPDataResidency, +} from "@mixpanel/react-native-session-replay"; + +const config = new MPSessionReplayConfig({ + recordingSessionsPercent: 100, + serverURL: MPDataResidency.EU, +}); + +await MPSessionReplay.initialize(token, distinctId, config); +``` + +You can also pass any fully-qualified HTTPS URL — useful when routing replay traffic through a self-hosted proxy: + +```typescript +const config = new MPSessionReplayConfig({ + serverURL: "https://mixpanel-proxy.yourcompany.com", +}); +``` + +Learn more about [EU Data Residency](/docs/privacy/eu-residency) and [India Data Residency](/docs/privacy/in-residency). + ## Configuration The `MPSessionReplayConfig` class provides comprehensive control over session replay behavior: diff --git a/docs/tracking-methods/sdks/swift/swift-replay.mdx b/docs/tracking-methods/sdks/swift/swift-replay.mdx index 32f0b076..1a76b743 100644 --- a/docs/tracking-methods/sdks/swift/swift-replay.mdx +++ b/docs/tracking-methods/sdks/swift/swift-replay.mdx @@ -98,6 +98,47 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } } ``` + +## Data Residency + + +Available in Session Replay SDK version `1.5.1` and later. + + +If your Mixpanel project lives in the EU or India data center, or you route all Mixpanel traffic through a self-hosted proxy, set the `serverURL` on `MPSessionReplayConfig`. The SDK exposes a `DataResidency` enum with the managed region URLs so you don't have to hardcode them. + +| Region | `DataResidency` constant | URL | +| --- | --- | --- | +| US (default) | `DataResidency.us` | `https://api.mixpanel.com` | +| EU | `DataResidency.eu` | `https://api-eu.mixpanel.com` | +| India | `DataResidency.in` | `https://api-in.mixpanel.com` | + +**Example Usage** + +```swift Swift +import MixpanelSessionReplay + +let config = MPSessionReplayConfig( + wifiOnly: false, + serverURL: DataResidency.eu +) +MPSessionReplay.initialize( + token: Mixpanel.mainInstance().apiToken, + distinctId: Mixpanel.mainInstance().distinctId, + config: config +) +``` + +You can also pass any fully-qualified HTTPS URL — useful when routing replay traffic through a self-hosted proxy: + +```swift Swift +let config = MPSessionReplayConfig( + serverURL: "https://mixpanel-proxy.yourcompany.com" +) +``` + +Learn more about [EU Data Residency](/docs/privacy/eu-residency) and [India Data Residency](/docs/privacy/in-residency). + ## Capturing Replays diff --git a/guides/guides-by-topic/features.mdx b/guides/guides-by-topic/features.mdx index 5a1446ef..05b97917 100644 --- a/guides/guides-by-topic/features.mdx +++ b/guides/guides-by-topic/features.mdx @@ -7,6 +7,7 @@ title: "Features" + ## Experiments and Feature Flags diff --git a/guides/guides-by-use-case.mdx b/guides/guides-by-use-case.mdx index 271706c9..85548189 100644 --- a/guides/guides-by-use-case.mdx +++ b/guides/guides-by-use-case.mdx @@ -19,6 +19,7 @@ title: "Guides by Use Case" + diff --git a/guides/guides-by-use-case/empower-your-team/headless.mdx b/guides/guides-by-use-case/empower-your-team/headless.mdx new file mode 100644 index 00000000..742a356d --- /dev/null +++ b/guides/guides-by-use-case/empower-your-team/headless.mdx @@ -0,0 +1,70 @@ +--- +title: "Mixpanel Headless: Programmatic access to your analytics" +sidebarTitle: "Use Mixpanel Headless" +--- + +Mixpanel has always been built for builders. But until now, the only way to drive it was through a UI. + +Headless changes that. It's a Python SDK that gives you direct, code-level access to the full Mixpanel product surface. If you're an engineer or data analyst who wants to automate analysis, build agents, or integrate Mixpanel into a pipeline, this is where you start. + +## Multiple interfaces, one data layer + +Headless doesn't replace the Mixpanel you already use. It extends it. Think of Mixpanel as a single data layer, now accessible through multiple interfaces depending on what you're building and where you're working: + +- **Mixpanel Agent** is for exploration inside the product. Ask a question in plain language, get an answer from your data. No code required. +- **Mixpanel MCP** is for AI tools. Connect Claude, ChatGPT, Gemini, Cursor, and [other supported tools](/docs/mcp) to your Mixpanel project and query it from your existing AI workflow. +- **Mixpanel Headless** is for builders. Write Python that reads and acts on your Mixpanel data. + +The same retention curve, the same funnel, the same cohort: available through whichever interface fits the job. What's new isn't the data. It's the surface area. + +## What Headless is + +At its core, Headless is a typed Python SDK. You authenticate once, instantiate a `Workspace` object, and every Mixpanel capability is available as a method call. Query results come back as structured Python objects with a `.df` property for DataFrame access. + +Here's what makes it different from querying the REST API directly: + +- **Typed results.** You get structured objects back, not raw JSON. Funnel results have `.overall_conversion_rate`. Retention results have a cohort-shaped DataFrame. You don't parse. You use. +- **Built-in discovery.** Before writing a query, you can inspect the project: list events, enumerate properties and their values, browse cohorts and boards. This matters especially when building agents that need to understand a project's shape before querying it. +- **Full product surface.** MCP exposes around 30 curated tools designed for natural-language sessions. Headless exposes everything: every report type, every configuration, every asset. If Mixpanel can do it, Headless can express it in code. + +See the [Headless documentation](https://mixpanel.github.io/mixpanel-headless/) for the full picture. + +## When to use Headless + +Headless is the right tool when you're writing Python and need programmatic access to Mixpanel data. Below are a few patterns where it fits well. + +### Automating repetitive analysis. + +If you're building the same report week over week, a script can do it for you. Query the data, format the output, send it to Slack or email. No board required. + +### Feeding AI agents. + +Agents need a surface they can query without human mediation. Headless gives them typed access to the full Mixpanel product. An agent can discover what events exist, run the right query, interpret the result, and take action, all in code. + +### Keeping Lexicon in sync. + +Every Mixpanel project has a [Lexicon](/docs/data-governance/lexicon): a dictionary of events and properties with descriptions, ownership, status, and type metadata. + +In the UI, keeping it current is a manual task. With Headless, it's automatable. You can read the current state, diff it against a tracking plan or warehouse schema, and write updates back from a script. + +Tracking plan changes propagate automatically. New events get described on deploy. Stale events get flagged on a schedule. + +For teams where Lexicon maintenance has slipped, Headless gives you the tools to automate it. See the [Data Governance docs](https://mixpanel.github.io/mixpanel-headless/guide/data-governance/) for implementation details. + +### Cross-project tooling. + +Query multiple projects in the same script. Useful for organizations managing several products, regions, or environments from a single codebase. + + +If you want to query Mixpanel from a chat interface rather than code, [Mixpanel MCP](/guides/guides-by-use-case/empower-your-team/mcp) is the better fit. For AI-assisted analysis inside Mixpanel itself, see [Mixpanel Agent](/guides/guides-by-use-case/empower-your-team/mixpanel-agent). + + +## What's next + +The direction is toward a fully agentic analytics layer: a Mixpanel that doesn't just answer questions when asked, but actively surfaces what matters, integrates into the tools teams already use, and runs without anyone having to open a browser. Headless is the foundation. + + +**Early access:** Headless is in early access. The current rate limit is 60 requests per 60 minutes. Keep this in mind when designing workflows that run at scale or on a tight schedule. The API is under active development; expect changes before 1.0. + + +👉 **Ready to build?** [Request access](https://mixpanel.com/ai/headless), then start with the [installation](https://mixpanel.github.io/mixpanel-headless/getting-started/installation/) and [quick start](https://mixpanel.github.io/mixpanel-headless/getting-started/quickstart/) guides to get credentials and your first query running. diff --git a/openapi/feature-flags.openapi.yaml b/openapi/feature-flags.openapi.yaml index 64bcc7de..976447cc 100644 --- a/openapi/feature-flags.openapi.yaml +++ b/openapi/feature-flags.openapi.yaml @@ -2,52 +2,42 @@ openapi: 3.1.0 x-readme-deploy-id: feature-flags-api info: title: Feature Flags API - description: Use the Feature Flags API to evaluate feature flags for users and retrieve feature flag definitions. + description: >- + Use the Feature Flags API to evaluate feature flags for users and retrieve feature flag definitions. contact: - url: https://mixpanel.com/get-support + url: 'https://mixpanel.com/get-support' license: name: MIT url: https://opensource.org/licenses/MIT version: 1.0.0 servers: -- url: https://{regionAndDomain}.com - description: Mixpanel's feature flags API server. - variables: - regionAndDomain: - default: api.mixpanel - enum: - - api.mixpanel - - api-eu.mixpanel - - api-in.mixpanel - description: "The server location to be used:\n * `api.mixpanel` - The default (US) servers used for most projects\n\ - \ * `api-eu.mixpanel` - EU servers if you are enrolled in EU Data Residency\n * `api-in.mixpanel` - India servers\ - \ if you are enrolled in India Data Residency\n" + - $ref: ./common/feature-flags-api.yaml#/server tags: -- name: Get Variant Assignments - description: Evaluate feature flags for a specific user -- name: Get Flag Definitions - description: Retrieve feature flag definitions + - name: Get Variant Assignments + description: Evaluate feature flags for a specific user + - name: Get Flag Definitions + description: Retrieve feature flag definitions paths: /flags: get: operationId: get-variant-assignments security: - - ProjectSecret: [] + - ProjectSecret: [] + - ServiceAccount: [] parameters: - - $ref: '#/components/parameters/ProjectToken' - - name: context - in: query - description: URL-encoded JSON object containing evaluation context with distinct_id (required) and optional device_id - and custom_properties object - required: true - schema: - type: string - example: '%7B++%22distinct_id%22%3A%22user123%22%2C++%22device_id%22%3A%22device456%22%2C++%22custom_properties%22%3A+%7B++++%22some_key%22%3A+%22some_value%22%2C++++%22another_key%22%3A+32++%7D%7D%22' + - $ref: '#/components/parameters/ProjectToken' + - $ref: '#/components/parameters/ProjectId' + - name: context + in: query + description: 'URL-encoded JSON object containing evaluation context with distinct_id (required) and optional device_id and custom_properties object' + required: true + schema: + type: string + example: '%7B++%22distinct_id%22%3A%22user123%22%2C++%22device_id%22%3A%22device456%22%2C++%22custom_properties%22%3A+%7B++++%22some_key%22%3A+%22some_value%22%2C++++%22another_key%22%3A+32++%7D%7D%22' tags: - - Get Variant Assignments + - Get Variant Assignments summary: Evaluate Feature Flags (GET) - description: Evaluate all enabled feature flags for a user with the provided context. Returns selected variants for - flags the user is eligible for. + description: Evaluate all enabled feature flags for a user with the provided context. Returns selected variants for flags the user is eligible for. responses: '200': description: Success @@ -56,59 +46,24 @@ paths: schema: $ref: '#/components/schemas/EvaluateFlagsResponse' '400': - description: Bad request - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: Details about the error that occurred - status: - type: string - enum: - - error + $ref: ./common/responses.yaml#/400BadRequest '401': - description: Unauthorized - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: Details about the error that occurred - status: - type: string - enum: - - error + $ref: ./common/responses.yaml#/401Unauthorized '403': - description: Forbidden - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: Details about the error that occurred - status: - type: string - enum: - - error + $ref: ./common/responses.yaml#/403Forbidden /flags/definitions: get: operationId: get-flag-definitions security: - - ProjectSecret: [] + - ProjectSecret: [] + - ServiceAccount: [] parameters: - - $ref: '#/components/parameters/ProjectToken' + - $ref: '#/components/parameters/ProjectToken' + - $ref: '#/components/parameters/ProjectId' tags: - - Get Flag Definitions + - Get Flag Definitions summary: Get Feature Flag Definitions - description: Retrieve all enabled feature flag definitions for the authenticated project. Returns complete flag metadata - including rulesets, variants, and rollout configurations. + description: Retrieve all enabled feature flag definitions for the authenticated project. Returns complete flag metadata including rulesets, variants, and rollout configurations. responses: '200': description: Success @@ -117,62 +72,34 @@ paths: schema: $ref: '#/components/schemas/FlagDefinitionsResponse' '401': - description: Unauthorized - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: Details about the error that occurred - status: - type: string - enum: - - error + $ref: ./common/responses.yaml#/401Unauthorized '403': - description: Forbidden - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: Details about the error that occurred - status: - type: string - enum: - - error + $ref: ./common/responses.yaml#/403Forbidden components: securitySchemes: - ServiceAccount: - type: http - scheme: basic - description: Service Account - ProjectSecret: - type: http - scheme: basic - description: Project Secret - OAuthToken: - type: http - scheme: bearer - description: OAuth Token + $ref: ./common/securitySchemes.yaml parameters: ProjectToken: name: token in: query schema: type: string - description: Your project token - required: true + description: 'Your project token' + required: false + ProjectId: + name: project_id + in: query + schema: + type: string + description: The Mixpanel project_id. Provide if using service account auth. + required: false schemas: EvaluateFlagsRequest: title: EvaluateFlagsRequest description: Request body for feature flag evaluation type: object required: - - context + - context properties: context: $ref: '#/components/schemas/EvaluationContext' @@ -181,29 +108,29 @@ components: description: Context object containing user information and properties for flag evaluation type: object required: - - distinct_id + - distinct_id properties: distinct_id: type: string description: The distinct ID of the user to evaluate flags for - example: user123 + example: 'user123' device_id: type: string description: Optional device ID. If not provided, distinct_id will be used - example: device456 + example: 'device456' custom_properties: type: object description: Optional runtime parameters for evaluation by runtime_evaluation_rule in rollout definitions additionalProperties: true example: - country: US - platform: web + country: 'US' + platform: 'web' EvaluateFlagsResponse: title: EvaluateFlagsResponse description: Response containing evaluated feature flags for the user type: object required: - - flags + - flags properties: flags: type: object @@ -212,34 +139,34 @@ components: description: Map of flag keys to their selected variants example: new_checkout_flow: - variant_key: treatment + variant_key: 'treatment' variant_value: true - experiment_id: exp_123 + experiment_id: 'exp_123' is_experiment_active: true SelectedVariant: title: SelectedVariant description: The selected variant for a feature flag type: object required: - - variant_key - - variant_value + - variant_key + - variant_value properties: variant_key: type: string description: The key of the selected variant - example: treatment + example: 'treatment' variant_value: description: The value of the selected variant (can be any type) oneOf: - - type: string - - type: number - - type: boolean - - type: object + - type: string + - type: number + - type: boolean + - type: object example: true experiment_id: type: string description: The ID of the associated experiment, if any - example: exp_123 + example: 'exp_123' is_experiment_active: type: boolean description: Whether the associated experiment is currently active @@ -253,7 +180,7 @@ components: description: Response containing all enabled feature flag definitions type: object required: - - flags + - flags properties: flags: type: array @@ -265,35 +192,32 @@ components: description: Complete metadata for a feature flag type: object required: - - id - - name - - key - - status - - project_id - - workspace_id - - ruleset - - context + - id + - name + - key + - status + - project_id + - workspace_id + - ruleset + - context properties: id: type: string description: Unique identifier for the flag - example: flag_abc123 + example: 'flag_abc123' name: type: string description: Human-readable name of the flag - example: New Checkout Flow + example: 'New Checkout Flow' key: type: string description: Unique key used to reference the flag - example: new_checkout_flow + example: 'new_checkout_flow' status: type: string - enum: - - enabled - - disabled - - archived + enum: ['enabled', 'disabled', 'archived'] description: Current status of the flag - example: enabled + example: 'enabled' project_id: type: integer format: int32 @@ -309,11 +233,11 @@ components: context: type: string description: The context variable used for flag evaluation (e.g., distinct_id, device_id) - example: device_id + example: 'device_id' experiment_id: type: string description: ID of the associated experiment, if any - example: exp_123 + example: 'exp_123' is_experiment_active: type: boolean description: Whether the associated experiment is currently active @@ -323,8 +247,8 @@ components: description: Complete ruleset for a feature flag including variants and rollout configuration type: object required: - - variants - - rollout + - variants + - rollout properties: variants: type: array @@ -343,22 +267,22 @@ components: description: A variant definition for a feature flag type: object required: - - key - - value - - is_control - - split + - key + - value + - is_control + - split properties: key: type: string description: Unique key for this variant - example: treatment + example: 'treatment' value: description: The value for this variant (can be any type) oneOf: - - type: string - - type: number - - type: boolean - - type: object + - type: string + - type: number + - type: boolean + - type: object example: true is_control: type: boolean @@ -378,7 +302,7 @@ components: description: A rollout rule defining how a flag is distributed to a cohort type: object required: - - rollout_percentage + - rollout_percentage properties: rollout_percentage: type: number @@ -388,21 +312,20 @@ components: cohort_hash: type: string description: Hash of the cohort definition for lookup - example: cohort_abc123 + example: 'cohort_abc123' runtime_evaluation_rule: type: object additionalProperties: true description: JsonLogic rule that's evaluated at request time based on runtime parameters in the request example: - platform: web + platform: 'web' runtime_evaluation_definition: deprecated: true type: object additionalProperties: true - description: Key-value pairs that are evaluated at request time for cohort matching, replaced by the more powerful - runtime_evaluation_rule + description: Key-value pairs that are evaluated at request time for cohort matching, replaced by the more powerful runtime_evaluation_rule example: - platform: web + platform: 'web' variant_splits: type: object additionalProperties: @@ -424,7 +347,7 @@ components: key: type: string description: The variant key to force - example: treatment + example: 'treatment' TestUsers: title: TestUsers description: Mapping of test users to their assigned variants @@ -436,5 +359,5 @@ components: type: string description: Map of distinct_id to variant_key for QA testing example: - qa_user_1: treatment - qa_user_2: control + qa_user_1: 'treatment' + qa_user_2: 'control' diff --git a/openapi/query.openapi.yaml b/openapi/query.openapi.yaml index 88aef546..17690109 100644 --- a/openapi/query.openapi.yaml +++ b/openapi/query.openapi.yaml @@ -1009,8 +1009,12 @@ paths: summary: Profile Event Activity tags: - Activity Feed - description: This endpoint returns the activity feed for specified users. The Query API has a rate limit of 60 queries - per hour and a maximum of 5 concurrent queries. + description: | + > ❗️stream/query is currently in maintenance mode. + + This endpoint returns the activity feed for specified users. + + **Note:** The Query API has a rate limit of 60 queries per hour and a maximum of 5 concurrent queries. parameters: - in: query name: project_id diff --git a/snippets/changelogs/2024-03-27-spark.mdx b/snippets/changelogs/2024-03-27-spark.mdx index 8fb43375..3162e496 100644 --- a/snippets/changelogs/2024-03-27-spark.mdx +++ b/snippets/changelogs/2024-03-27-spark.mdx @@ -14,6 +14,10 @@ thumbnail: "/changelog/spark-changelog.png" ![spark](/images/changelog/spark-changelog.png) + +2026 Update: Spark is now Mixpanel Agent. [Check out the docs](/docs/mixpanel-agent). + + Spark is now available on Boards. Launch a Spark card and use it to ask any question in natural language. You’ll be able to iterate on the prompt and jump in to see what was produced. {/*