اختَر المنصة التي تريد الاطّلاع عليها في هذا الدليل:
تهيئة الطلب
لا يتيح برنامج Measurement Protocol في "إحصاءات Google" سوى طلبات HTTP POST.
لإرسال حدث، استخدِم التنسيق التالي:
POST /mp/collect HTTP/1.1
HOST: www.google-analytics.com
Content-Type: application/json
PAYLOAD_DATA
يجب توفير ما يلي في عنوان URL للطلب:
api_secret: واجهة برمجة التطبيقات السرّية التي تم إنشاؤها في واجهة مستخدم "إحصاءات Google".
لإنشاء مفتاح سرّي جديد، انتقِل إلى المشرف > جمع البيانات وتعديلها > مصادر البيانات > اختَر مصدر بياناتك > المفاتيح السرية لواجهة برمجة التطبيقات Measurement Protocol > إنشاء.
استبدِل measurement_id برقم تعريف القياس المرتبط بمصدر بيانات، والذي يمكن العثور عليه في واجهة مستخدم "إحصاءات Google" ضمن المشرف > مصادر البيانات > اختَر مصدر بياناتك > رقم تعريف القياس.
measurement_id ليس رقم تعريف مصدر البيانات.
يجب تقديم نص الطلب بتنسيق نص POST بتنسيق JSON لبروتوكول القياس. وفي ما يلي مثال لذلك:
مع أنّ session_start هو اسم حدث محجوز، فإنّ إنشاء session_id جديد يؤدي إلى إنشاء جلسة جديدة بدون الحاجة إلى إرسال session_start. تعرَّف على كيفية احتساب الجلسات.
التجربة الآن
في ما يلي مثال يمكنك استخدامه لإرسال أحداث متعددة في وقت واحد. يرسل هذا المثال الحدث tutorial_begin والحدث join_group إلى خادم "إحصاءات Google"، ويتضمّن معلومات جغرافية باستخدام الحقل user_location، ويتضمّن معلومات الجهاز باستخدام الحقل device.
يستخدِم Measurement Protocol الطابع الزمني الأول الذي يعثر عليه في القائمة التالية
لكل حدث في الطلب:
تمثّل هذه السمة timestamp_micros الفعالية.
timestamp_micros الطلب
الوقت الذي تتلقّى فيه منصّة Measurement Protocol الطلب
يرسل المثال التالي طابعًا زمنيًا على مستوى الطلب ينطبق على جميع الأحداث في الطلب. نتيجةً لذلك، يحدّد Measurement Protocol الطابع الزمني requestUnixEpochTimeInMicros لكلّ من الحدثَين tutorial_begin وjoin_group.
يرسل المثال التالي طابعًا زمنيًا على مستوى الطلب وطابعًا زمنيًا على مستوى الحدث. نتيجةً لذلك، يحدّد Measurement Protocol الطابع الزمني tutorialBeginUnixEpochTimeInMicros للحدث tutorial_begin، والطابع الزمني requestUnixEpochTimeInMicros للحدث join_group.
تنطبق القيود التالية على إرسال أحداث Measurement Protocol إلى "إحصاءات Google":
يمكن أن تتضمّن الطلبات 25 حدثًا كحدّ أقصى.
يمكن أن تحتوي الأحداث على 25 معلَمة كحدّ أقصى.
يمكن أن تحتوي الأحداث على 25 خاصيّة مستخدم كحدّ أقصى.
يجب أن تحتوي أسماء خصائص المستخدمين على 24 حرفًا أو أقل.
يجب أن تحتوي قيم خصائص المستخدمين على 36 حرفًا أو أقل.
يجب أن تحتوي أسماء الأحداث على 40 حرفًا أو أقل، وأن تحتوي على أحرف أبجدية رقمية وشرطات سفلية فقط، ويجب أن تبدأ بحرف أبجدي.
يجب أن تحتوي أسماء المَعلمات، بما في ذلك مَعلمات السلع، على 40 حرفًا أو أقل، وأن تحتوي على أحرف أبجدية رقمية وشرطات سفلية فقط، ويجب أن تبدأ بحرف أبجدي.
يجب أن تحتوي قيم المَعلمات، بما في ذلك قيم مَعلمات السلع، على 100 حرف أو أقلّ في موقع عادي على "إحصاءات Google"، و500 حرف أو أقلّ في موقع على "إحصاءات Google 360".
يمكن أن تحتوي مَعلمات المنتجات أو الخدمات على 10 مَعلمات مخصّصة كحدّ أقصى.
يجب أن يكون حجم نص المشاركة أقل من 130 كيلوبايت.
لا تملأ أحداث App Measurement Protocol المُرسَلة إلى "إحصاءات Google" شرائح جمهور "بحث Google" في "إعلانات Google" لمستخدمي التطبيق.
تاريخ التعديل الأخير: 2025-09-01 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-09-01 (حسب التوقيت العالمي المتفَّق عليه)"],[[["\u003cp\u003eThis guide explains how to send web and app stream events to a Google Analytics server using the Measurement Protocol.\u003c/p\u003e\n"],["\u003cp\u003eYou must format the request as an HTTP POST request and include your API Secret and Measurement ID in the URL.\u003c/p\u003e\n"],["\u003cp\u003eThe request body should contain client ID, optional user ID and consent settings, timestamp, and an array of events.\u003c/p\u003e\n"],["\u003cp\u003eEvents can include parameters like \u003ccode\u003eengagement_time_msec\u003c/code\u003e and \u003ccode\u003esession_id\u003c/code\u003e to display user activity in Realtime reports.\u003c/p\u003e\n"],["\u003cp\u003eThe Measurement Protocol has limitations on the number of events, parameters, and user properties allowed in a single request.\u003c/p\u003e\n"]]],["To send events to Google Analytics, use HTTP `POST` requests to `www.google-analytics.com/mp/collect`. Include `api_secret` and `measurement_id` in the URL. The request body should include `client_id`, and optionally `user_id`, `consent`, and `timestamp_micros`. Send events as an array within the `events` key. For real-time reporting, include `engagement_time_msec` and `session_id` in the event parameters. Timestamps can be set per event or at the request level. There are limitations on request size, event, and parameter counts.\n"],null,["This guide explains how you can send\n[Google Analytics Measurement Protocol](/analytics/devguides/collection/protocol/ga4) web and app stream\n[events](/analytics/devguides/collection/protocol/ga4/reference/events) to a\nGoogle Analytics server, so that you can view Measurement Protocol events in your\n[Google Analytics reports](/analytics/devguides/reporting/data/v1/basics).\n\nChoose the platform you want to see in this guide: \nFirebase gtag.js\n\nFormat the request\n\nThe Google Analytics Measurement Protocol only supports HTTP `POST` requests.\n\nTo send an event, use the following format: \n\n POST /mp/collect HTTP/1.1\n HOST: www.google-analytics.com\n Content-Type: application/json\n\n \u003cvar translate=\"no\"\u003ePAYLOAD_DATA\u003c/var\u003e\n\n| **Tip:** If you want your data to be collected in the EU, change the `HOST` in the example to `region1.google-analytics.com`.\n\nYou must provide the following in the request URL:\n\n- `api_secret`: The **API SECRET** generated in the Google Analytics UI.\n\n To create a new secret, navigate to\n **Admin** \\\u003e **Data collection and modification** \\\u003e **Data streams** \\\u003e\n **choose your stream** \\\u003e **Measurement Protocol API secrets** \\\u003e **Create**.\n\n\u003cbr /\u003e\n\n- `measurement_id`: The measurement ID associated with a stream, found in the\n Google Analytics UI under **Admin** \\\u003e **Data Streams** \\\u003e **choose your\n stream** \\\u003e **Measurement ID**.\n\n The `measurement_id` isn't your **Stream ID**.\n\nYou must provide a request body in the [JSON POST body](/analytics/devguides/collection/protocol/ga4/reference#payload_post_body) format for\nthe Measurement Protocol. Here's an example:\n\n\u003cbr /\u003e\n\n {\n \"client_id\": \"\u003cvar translate=\"no\"\u003eCLIENT_ID\u003c/var\u003e\",\n \"events\": [\n {\n \"name\": \"login\",\n \"params\": {\n \"method\": \"Google\",\n \"session_id\": \"\u003cvar translate=\"no\"\u003eSESSION_ID\u003c/var\u003e\",\n \"engagement_time_msec\": 100\n }\n }\n ]\n }\n\nWhile `session_start` is a [reserved event\nname](/analytics/devguides/collection/protocol/ga4/reference#reserved_names),\ncreating a new `session_id` creates a new session without the need to send\n`session_start`. Understand how [sessions are\ncounted](//support.google.com/analytics/answer/9191807).\n\nTry it\n\nHere's an example you can use to send multiple events at once. This example\nsends a [`tutorial_begin`](/analytics/devguides/collection/protocol/ga4/reference/events?tech=aw_measurement_protocol#tutorial_begin) event and a\n[`join_group`](/analytics/devguides/collection/protocol/ga4/reference/events?tech=aw_measurement_protocol#join_group) event to your Google Analytics server, includes [geographic\ninformation](/analytics/devguides/collection/protocol/ga4/reference#payload_geo_info) using the `user_location` field, and includes [device information](/analytics/devguides/collection/protocol/ga4/reference#payload_device_info)\nusing the `device` field.\n\n\u003cbr /\u003e\n\n const measurementId = \"\u003cvar translate=\"no\"\u003eMEASUREMENT_ID\u003c/var\u003e\";\n const apiSecret = \"\u003cvar translate=\"no\"\u003eAPI_SECRET\u003c/var\u003e\";\n\n fetch(`https://www.google-analytics.com/mp/collect?measurement_id=${measurementId}&api_secret=${apiSecret}`, {\n method: \"POST\",\n body: JSON.stringify({\n client_id: \"\u003cvar translate=\"no\"\u003eCLIENT_ID\u003c/var\u003e\",\n events: [\n {\n name: \"tutorial_begin\",\n params: {\n \"session_id\": \"\u003cvar translate=\"no\"\u003eSESSION_ID\u003c/var\u003e\",\n \"engagement_time_msec\": 100\n }\n },\n {\n name: \"join_group\",\n params: {\n \"group_id\": \"G_12345\",\n \"session_id\": \"\u003cvar translate=\"no\"\u003eSESSION_ID\u003c/var\u003e\",\n \"engagement_time_msec\": 150\n }\n }\n ],\n user_location: {\n city: \"Mountain View\",\n region_id: \"US-CA\",\n country_id: \"US\",\n subcontinent_id: \"021\",\n continent_id: \"019\"\n },\n device: {\n category: \"mobile\",\n language: \"en\",\n screen_resolution: \"1280x2856\",\n operating_system: \"Android\",\n operating_system_version: \"14\",\n model: \"Pixel 9 Pro\",\n brand: \"Google\",\n browser: \"Chrome\",\n browser_version: \"136.0.7103.60\"\n }\n })\n });\n\nOverride timestamp\n\nThe Measurement Protocol uses the *first* timestamp it finds in the following list\nfor each event in the request:\n\n1. The `timestamp_micros` of the event.\n2. The `timestamp_micros` of the request.\n3. The time that the Measurement Protocol receives the request.\n\nThe following example sends a request-level timestamp that applies to all of the\nevents in the request. As a result, the Measurement Protocol assigns both the\n`tutorial_begin` and `join_group` events a timestamp of\n`requestUnixEpochTimeInMicros`. \n\n {\n \"timestamp_micros\": requestUnixEpochTimeInMicros,\n \"events\": [\n {\n \"name\": \"tutorial_begin\"\n },\n {\n \"name\": \"join_group\",\n \"params\": {\n \"group_id\": \"G_12345\",\n }\n }\n ]\n }\n\nThe following example sends both a request-level timestamp and an event-level\ntimestamp. As a result, the Measurement Protocol assigns the `tutorial_begin`\nevent a timestamp of `tutorialBeginUnixEpochTimeInMicros`, and the `join_group`\nevent a timestamp of `requestUnixEpochTimeInMicros`. \n\n {\n \"timestamp_micros\": requestUnixEpochTimeInMicros,\n \"events\": [\n {\n \"name\": \"tutorial_begin\",\n \"timestamp_micros\": tutorialBeginUnixEpochTimeInMicros\n },\n {\n \"name\": \"join_group\",\n \"params\": {\n \"group_id\": \"G_12345\",\n }\n }\n ]\n }\n\nLimitations\n\nThe following limitations apply to sending Measurement Protocol events to Google\nAnalytics:\n| **Note:** For information on the limitations of 360 features, see [Google Analytics\n| 360](//support.google.com/analytics/answer/11202874).\n\n- Requests can have a maximum of 25 events.\n- Events can have a maximum of 25 parameters.\n- Events can have a maximum of 25 user properties.\n- User property names must be 24 characters or fewer.\n- User property values must be 36 characters or fewer.\n- Event names must be 40 characters or fewer, can only contain alphanumeric characters and underscores, and must start with an alphabetic character.\n- 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.\n- 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.\n- Item parameters can have a maximum of 10 custom parameters.\n- The post body must be smaller than 130kB.\n- App Measurement Protocol events sent to Google Analytics don't populate Search audiences in Google Ads for app users.\n\nFor additional requirements of each use case, see [common use cases](/analytics/devguides/collection/protocol/ga4/use-cases)."]]