> ## Documentation Index
> Fetch the complete documentation index at: https://docs.permutive.com/llms.txt
> Use this file to discover all available pages before exploring further.

# mParticle

> Integrate with mParticle for customer data platform functionality

export const NoBadge = () => {
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.5rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: '#F7D0E2',
    color: '#1A1A1A',
    fontWeight: '500'
  }}>
      No
    </span>;
};

export const YesBadge = () => {
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.5rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: '#C7E8F9',
    color: '#1A1A1A',
    fontWeight: '500'
  }}>
      Yes
    </span>;
};

export const BadgeRowCenter = ({label, children}) => {
  return <div style={{
    display: 'flex',
    justifyContent: 'space-between',
    alignItems: 'center',
    marginBottom: '0.5rem'
  }}>
      <span style={{
    fontSize: '0.625rem',
    color: '#6b7280',
    textTransform: 'uppercase',
    fontWeight: '500',
    letterSpacing: '0.05em'
  }}>
        {label}
      </span>
      {children}
    </div>;
};

export const BadgeRow = ({label, children}) => {
  return <div style={{
    display: 'flex',
    justifyContent: 'space-between',
    alignItems: 'flex-start',
    marginBottom: '0.5rem'
  }}>
      <span style={{
    fontSize: '0.625rem',
    color: '#6b7280',
    textTransform: 'uppercase',
    fontWeight: '500',
    letterSpacing: '0.05em'
  }}>
        {label}
      </span>
      {children}
    </div>;
};

export const BadgeContainer = ({children}) => {
  return <div style={{
    display: 'flex',
    gap: '0.25rem',
    flexWrap: 'wrap',
    justifyContent: 'flex-end',
    minWidth: '0',
    flex: '1'
  }}>
      {children}
    </div>;
};

export const ProductRequiredBadge = ({product}) => {
  const getBadgeStyle = product => {
    switch (product) {
      case 'Core Platform':
        return {
          background: '#CB88FC',
          color: '#1A1A1A'
        };
        --purple;
      case 'Routing':
        return {
          background: '#CB88FC',
          color: '#1A1A1A'
        };
        --purple;
      case 'Contextual':
        return {
          background: '#CB88FC',
          color: '#1A1A1A'
        };
        --purple;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(product);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500'
  }}>
      {product}
    </span>;
};

export const SdkRequiredBadge = ({required}) => {
  const getBadgeStyle = required => {
    switch (required) {
      case 'Yes':
        return {
          background: '#C7E8F9',
          color: '#1A1A1A'
        };
        --blue;
      case 'No':
        return {
          background: '#F7D0E2',
          color: '#1A1A1A'
        };
        --pink;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(required);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500'
  }}>
      {required}
    </span>;
};

export const CapabilityBadge = ({capability}) => {
  const getBadgeStyle = capability => {
    switch (capability) {
      case 'Event Collection':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Cohort Activation':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Campaign Optimization':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Identity Signal':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Contextual Signal':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Connectivity':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Routing':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Data Collaboration':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(capability);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500',
    whiteSpace: 'nowrap'
  }}>
      {capability}
    </span>;
};

export const EnvironmentBadge = ({environment}) => {
  const getBadgeStyle = environment => {
    switch (environment) {
      case 'Web':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'iOS':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'Android':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'CTV':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'API Direct':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(environment);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500',
    whiteSpace: 'nowrap'
  }}>
      {environment}
    </span>;
};

export const DirectionBadge = ({direction}) => {
  const getBadgeStyle = direction => {
    switch (direction) {
      case 'Bidirectional':
        return {
          background: '#FA8784',
          color: '#1A1A1A'
        };
        --tomato;
      case 'Destination':
        return {
          background: '#FA8784',
          color: '#1A1A1A'
        };
        --tomato;
      case 'Source':
        return {
          background: '#FA8784',
          color: '#1A1A1A'
        };
        --tomato;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(direction);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500'
  }}>
      {direction}
    </span>;
};

<Card title="">
  <div style={{ display: 'flex', alignItems: 'center', marginBottom: '1rem' }}>
    <div style={{ width: '32px', height: '32px', marginRight: '0.75rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>
      <img src="https://mintcdn.com/permutive/pNhz39ducTVcQczh/images/integrations/logos/mparticle.svg?fit=max&auto=format&n=pNhz39ducTVcQczh&q=85&s=65d80ef09832ff929165c77983765f1b" alt="mParticle" style={{ maxWidth: '32px', maxHeight: '32px', display: 'block', backgroundColor: '#f3f4f6', borderRadius: '4px', padding: '2px' }} width="32" height="32" data-path="images/integrations/logos/mparticle.svg" />
    </div>

    <h3 style={{ margin: 0, fontSize: '1.125rem', fontWeight: '600' }}>mParticle</h3>
  </div>

  <div style={{ marginBottom: '1rem' }}>
    <BadgeRowCenter label="Direction">
      <DirectionBadge direction="Source" />
    </BadgeRowCenter>

    <BadgeRowCenter label="Environment">
      <BadgeContainer>
        <EnvironmentBadge environment="Web" />

        <EnvironmentBadge environment="iOS" />

        <EnvironmentBadge environment="Android" />

        <EnvironmentBadge environment="CTV" />

        <EnvironmentBadge environment="API Direct" />
      </BadgeContainer>
    </BadgeRowCenter>

    <BadgeRowCenter label="Capability">
      <BadgeContainer>
        <CapabilityBadge capability="Connectivity" />
      </BadgeContainer>
    </BadgeRowCenter>

    <BadgeRowCenter label="SDK Required">
      <SdkRequiredBadge required="No" />
    </BadgeRowCenter>

    <BadgeRowCenter label="Product(s) Required">
      <ProductRequiredBadge product="Core Platform" />
    </BadgeRowCenter>
  </div>

  <p style={{ margin: 0, fontSize: '0.875rem', color: '#6b7280', lineHeight: '1.5' }}>
    mParticle enables publishers to unify customer data from multiple sources for better personalization and ad targeting.
  </p>
</Card>

<CardGroup cols={2}>
  <Card title="Setup" href="#setup" icon="gear" />

  <Card title="Troubleshooting" href="#troubleshooting" icon="wrench" />
</CardGroup>

## Overview

mParticle is a customer data platform (CDP) that enables publishers to collect, unify, and activate customer data across multiple channels and platforms. The Permutive integration with mParticle allows publishers to import audience segments from mParticle into Permutive for use in cohort building and activation.

This integration is a Source integration:

* **Source:** Permutive receives audience membership data from mParticle, allowing you to use mParticle audiences as segments within Permutive for targeting and activation.

Use cases include:

* Import audience segments from mParticle to combine with first-party data in Permutive
* Use mParticle audiences as building blocks for more complex cohorts in Permutive
* Activate mParticle-sourced audiences through Permutive's activation integrations (GAM, SSPs, DSPs)

## Environment Compatibility

| Environment    | Supported    | Notes |
| -------------- | ------------ | ----- |
| **Web**        | <YesBadge /> | --    |
| **iOS**        | <YesBadge /> | --    |
| **Android**    | <YesBadge /> | --    |
| **CTV**        | <YesBadge /> | --    |
| **API Direct** | <YesBadge /> | --    |

## Prerequisites

* **mParticle Account**: You must have an active mParticle account with access to the mParticle dashboard and the ability to configure integrations.
* **mParticle Audience Outputs**: You should have audiences configured in mParticle that you want to send to Permutive.
* **Permutive Workspace**: You must have access to the Permutive dashboard with permissions to configure integrations.
* **BigQuery or GCS Access**: The integration uses BigQuery or Google Cloud Storage (GCS) to transfer audience data from mParticle to Permutive.

## Setup

<Steps>
  <Step title="Enable in Permutive Dashboard">
    Contact your Permutive Customer Success team to enable the mParticle integration for your workspace. The integration requires backend configuration to establish the connection between mParticle and Permutive.

    Technical Services will provide you with the necessary connection details and configure the data pipeline to receive audience updates from mParticle.
  </Step>

  <Step title="Configure mParticle Audience Output">
    In the mParticle dashboard, configure your audience outputs to send data to Permutive:

    1. Navigate to **Audiences** in mParticle
    2. Select the audience you want to send to Permutive
    3. Configure the output to send audience membership updates to the designated BigQuery dataset or GCS bucket provided by Permutive
    4. Enable the audience output

    <Info>
      Permutive receives audience membership changes as add and delete updates. When a user enters an mParticle audience, an `add` update is sent. When a user exits an audience, a `delete` update is sent.
    </Info>
  </Step>

  <Step title="Map mParticle User Identifiers">
    Ensure that your mParticle configuration includes user identifiers that can be matched with Permutive data:

    * The integration uses the **mParticle ID (mpId)** as the primary identifier
    * Additional identifiers (email, customer ID, etc.) can be used for identity resolution

    Work with your Permutive Customer Success team to confirm the identifier mapping strategy.
  </Step>

  <Step title="Verify Setup">
    Once the integration is configured:

    1. Navigate to the **Data Imports** section in the Permutive dashboard
    2. Verify that mParticle audiences are appearing as data sources
    3. Check that audience membership data is being received and updated

    <Note>
      Audience data updates may take up to 24 hours to propagate from mParticle to Permutive, depending on your mParticle configuration.
    </Note>
  </Step>
</Steps>

## Data Types

With your mParticle integration setup, Permutive receives audience membership data from mParticle. The integration imports audience segments rather than individual events.

<AccordionGroup>
  <Accordion title="Audience Membership Updates">
    mParticle sends audience membership updates to Permutive when users enter or exit audiences. These updates include:

    <ResponseField name="mpId" type="string">
      The mParticle user identifier. This is the primary identifier used to match users between mParticle and Permutive.
    </ResponseField>

    <ResponseField name="audience_id" type="string">
      The unique identifier for the mParticle audience.
    </ResponseField>

    <ResponseField name="audience_name" type="string">
      The human-readable name of the mParticle audience.
    </ResponseField>

    <ResponseField name="membership_action" type="string">
      Indicates whether the user is being added to or removed from the audience. Values are `add` or `delete`.
    </ResponseField>

    <ResponseField name="timestamp" type="timestamp">
      The time when the audience membership change occurred.
    </ResponseField>
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="mParticle audiences not appearing in Permutive">
    If your mParticle audiences are not appearing in the Permutive dashboard:

    * Verify that the mParticle audience output is correctly configured and enabled in the mParticle dashboard
    * Confirm that the BigQuery dataset or GCS bucket connection is properly configured
    * Check that audience updates are being sent from mParticle (you can verify this in mParticle's audience output logs)
    * Contact your Permutive Customer Success team to verify the backend integration configuration

    <Note>
      Audience data may take up to 24 hours to appear in Permutive after initial configuration.
    </Note>
  </Accordion>

  <Accordion title="Audience membership data not updating">
    If audience membership updates are not being reflected in Permutive:

    * Verify that users have valid mParticle IDs (mpId) that can be matched in Permutive
    * Check the data staleness SLO: audience updates should be available within 1 hour under normal conditions
    * Review the mParticle output configuration to ensure both `add` and `delete` updates are being sent
    * Confirm that the audience is actively receiving membership changes in mParticle

    If issues persist, contact Permutive support with specific audience IDs and user identifiers for investigation.
  </Accordion>

  <Accordion title="Users not being matched between mParticle and Permutive">
    Identity resolution issues can prevent audience data from being properly associated with Permutive users:

    * Ensure that the mParticle ID (mpId) is being sent with audience updates
    * Verify that the same user identifiers are being collected in both mParticle and Permutive
    * Review your identity resolution strategy with your Permutive Customer Success team
    * Consider implementing additional identifier mapping (email, customer ID) for improved match rates

    <Info>
      The integration supports standard identifiers including mpId, email, and custom customer IDs. Work with [Technical Services](mailto:technical-services@permutive.com) to configure the optimal identifier strategy for your use case.
    </Info>
  </Accordion>

  <Accordion title="Audience data deletion not working as expected">
    When users exit an mParticle audience, the delete update should remove the audience membership from Permutive:

    * Verify that mParticle is configured to send `delete` updates (not just `add` updates)
    * Check the deletion SLO: audience membership deletions should be processed within 7 days
    * Confirm that the user-to-audience mapping exists in Permutive before the delete update is sent
    * Review mParticle's audience configuration to ensure proper exit conditions are defined

    Contact Permutive support if audience memberships are not being removed after the expected timeframe.
  </Accordion>
</AccordionGroup>

## Changelog

<Info>
  For detailed changelog information, visit our [Changelog](https://changelog.permutive.com/).
</Info>
