Send Measurement Protocol events to Google Analytics

  • This guide explains how to send web and app stream events to a Google Analytics server using the Measurement Protocol.

  • You must format the request as an HTTP POST request and include your API Secret and Measurement ID in the URL.

  • The request body should contain client ID, optional user ID and consent settings, timestamp, and an array of events.

  • Events can include parameters like engagement_time_msec and session_id to display user activity in Realtime reports.

  • The Measurement Protocol has limitations on the number of events, parameters, and user properties allowed in a single request.

This guide explains how you can send Google Analytics Measurement Protocol web and app stream events to a Google Analytics server, so that you can view Measurement Protocol events in your Google Analytics reports.

Choose the platform you want to see in this guide:

Format the request

The Google Analytics Measurement Protocol only supports HTTP POST requests.

To send an event, use the following format:

POST /mp/collect HTTP/1.1
HOST: www.google-analytics.com
Content-Type: application/json

PAYLOAD_DATA

You must provide the following in the request URL:

  • api_secret: The API SECRET generated in the Google Analytics UI.

    To create a new secret, navigate to Admin > Data collection and modification > Data streams > choose your stream > Measurement Protocol API secrets > Create.

  • firebase_app_id: The Firebase App ID, found in the Firebase console under Project Settings > General > Your Apps > App ID.

    The firebase_app_id isn't the same as the app_instance_id. The firebase_app_id identifies your app, whereas app_instance_id identifies a single installation of the app.

You must provide a request body in the JSON POST body format for the Measurement Protocol. Here's an example:

  {
   "app_instance_id": "APP_INSTANCE_ID",
   "events": [
      {
        "name": "login",
        "params": {
          "method": "Google",
          "session_id": "SESSION_ID",
          "engagement_time_msec": 100
        }
      }
   ]
  }

While session_start is a reserved event name, creating a new session_id creates a new session without the need to send session_start. Understand how sessions are counted.

Try it

Here's an example you can use to send multiple events at once. This example sends a tutorial_begin event and a join_group event to your Google Analytics server, includes geographic information using the user_location field, and includes device information using the device field.

const firebaseAppId = "FIREBASE_APP_ID";
const apiSecret = "API_SECRET";

fetch(`https://www.google-analytics.com/mp/collect?firebase_app_id=${firebaseAppId}&api_secret=${apiSecret}`, {
  method: "POST",
  body: JSON.stringify({
    app_instance_id: "APP_INSTANCE_ID",
    events: [
      {
        name: "tutorial_begin",
        params: {
          "session_id": "SESSION_ID",
          "engagement_time_msec": 100
        }
      },
      {
        name: "join_group",
        params: {
          "group_id": "G_12345",
          "session_id": "SESSION_ID",
          "engagement_time_msec": 150
        }
      }
    ],
    user_location: {
      city: "Mountain View",
      region_id: "US-CA",
      country_id: "US",
      subcontinent_id: "021",
      continent_id: "019"
    },
    device: {
      category: "mobile",
      language: "en",
      screen_resolution: "1280x2856",
      operating_system: "Android",
      operating_system_version: "14",
      model: "Pixel 9 Pro",
      brand: "Google",
      browser: "Chrome",
      browser_version: "136.0.7103.60"
    }
  })
});

The format of firebase_app_id is platform specific. See Application ID under Firebase config files and objects.

Override timestamp

The Measurement Protocol uses the first timestamp it finds in the following list for each event and user property in the request:

  1. The timestamp_micros of the event or user property.
  2. The timestamp_micros of the request.
  3. The time that the Measurement Protocol receives the request.

The following example sends a request-level timestamp that applies to all of the events and user properties in the request. As a result, the Measurement Protocol assigns a timestamp of requestUnixEpochTimeInMicros to the tutorial_begin and join_group events and the customer_tier user property.

{
  "timestamp_micros": requestUnixEpochTimeInMicros,
  "events": [
    {
      "name": "tutorial_begin"
    },
    {
      "name": "join_group",
      "params": {
        "group_id": "G_12345",
      }
    }
  ],
  "user_properties": {
    "customer_tier": {
      "value": "PREMIUM"
    }
  }
}

The following example sends a request-level timestamp, an event-level timestamp, and a user property-level timestamp. As a result, the Measurement Protocol assigns the following timestamps:

  • tutorialBeginUnixEpochTimeInMicros for the tutorial_begin event
  • customerTierUnixEpochTimeInMicros for the customer_tier user property
  • requestUnixEpochTimeInMicros for the join_group event and the newsletter_reader user property.
{
  "timestamp_micros": requestUnixEpochTimeInMicros,
  "events": [
    {
      "name": "tutorial_begin",
      "timestamp_micros": tutorialBeginUnixEpochTimeInMicros
    },
    {
      "name": "join_group",
      "params": {
        "group_id": "G_12345",
      }
    }
  ],
  "user_properties": {
    "customer_tier": {
      "value": "PREMIUM",
      "timestamp_micros": customerTierUnixEpochTimeInMicros
    },
    "newsletter_reader": {
      "value": "true"
    }
  }
}

Validation behavior for past events and user properties

Events and user properties can be backdated up to 72 hours. If the timestamp_micros value is earlier than 72 hours ago, the Measurement Protocol accepts or rejects the event or user property as follows:

  • If the validation_behavior is not set or is set to RELAXED, the Measurement Protocol accepts the event or user property but overrides its timestamp to 72 hours ago.
  • If the validation_behavior is set to ENFORCE_RECOMMENDATIONS, the Measurement Protocol rejects the event or user property.

Limitations

The following limitations apply to sending Measurement Protocol events to Google Analytics:

  • Requests can have a maximum of 25 events.
  • Events can have a maximum of 25 parameters.
  • Events can have a maximum of 25 user properties.
  • User property names must be 24 characters or fewer.
  • User property values must be 36 characters or fewer.
  • Event names must be 40 characters or fewer, can only contain alphanumeric characters and underscores, and must start with an alphabetic character.
  • Parameter names including item parameters must be 40 characters or fewer, can only contain alphanumeric characters and underscores, and must start with an alphabetic character.
  • Parameter values including item parameter values must be 100 characters or fewer for a standard Google Analytics property, and 500 characters or fewer for a Google Analytics 360 property.
  • Item parameters can have a maximum of 10 custom parameters.
  • The post body must be smaller than 130kB.
  • The timestamp must be within the last 72 hours. See Validation behavior for past events for details.
  • App Measurement Protocol events sent to Google Analytics don't populate Search audiences in Google Ads for app users.

For additional requirements of each use case, see common use cases.