api_secret은 대소문자를 구분합니다. Google 애널리틱스 UI의 api_secret이
코드에서 사용 중인 것과 정확하게 동일한지 다시 한번
확인하세요.
advertising_id는 사용하지 마세요.
advertising_id는 유효한 기기 식별자로 지원되지 않습니다. Firebase를
사용 중인 경우 app_instance_id를 사용하고, gtag.js를 사용 중인 경우에는 client_id를
사용하세요.
잘못된 ID
측정 프로토콜은 Firebase용 Google 애널리틱스 SDK 및 gtag.js의 ID를 지원하므로 올바른 ID를 사용해야 합니다. Firebase용 Google 애널리틱스 SDK와 gtag.js 중 무엇을 사용하는지에 따라 사용해야 하는 ID가 달라집니다. 아래에 어떤 ID를 사용해야 하는지 나와 있습니다.
Firebase용 Google 애널리틱스 SDK
Firebase용 Google 애널리틱스 SDK를 사용하는 경우 사용해야 하는 ID는
다음과 같습니다.
firebase_app_id - 요청의 쿼리 매개변수에 이 ID를
포함합니다. 이 ID로 개발자의 Firebase 앱을 고유하게 식별할 수 있습니다. 개발자의 모든 사용자는
동일한 firebase_app_id를 갖습니다. Firebase Console에서 다음과 같이 이동하여
찾을 수 있습니다. 프로젝트 설정 > 일반 > 내 앱 > 앱 ID
app_instance_id - 요청의 POST 본문에 이 ID를 포함합니다. 이
ID로 특정 Firebase 앱 설치를 고유하게 식별할 수 있습니다. 이 값은
앱을 설치할 때마다 다르며, 각 Firebase 플랫폼에 대해
이 값을 요청하는 메서드는 다음과 같습니다.
firebase_instance_id - 이 ID를 요청에 포함하면 안 됩니다.
이 ID는 앱의 특정 인스턴스를 식별하는 데 사용되지만,
Firebase 전용입니다. FCM 메시지와 같은 작업에 사용됩니다.
gtag.js
gtag.js를 사용하는 경우 사용해야 하는 ID는 다음과 같습니다.
measurement_id - 요청의 쿼리 매개변수에 이 ID를
포함합니다. 이 ID로 데이터 스트림을 고유하게 식별할 수 있습니다. 웹사이트의 모든 사용자는
동일한 measurement_id를 갖습니다. Google 애널리틱스 UI에서
다음과 같이 이동하여 찾을 수 있습니다. 관리 > 데이터 스트림 > 스트림 선택 > 측정 ID
client_id - 요청의 POST 본문에 이 ID를 포함합니다. 이 ID로
웹 클라이언트의 특정 사용자 인스턴스를 고유하게 식별할 수 있습니다. 이 값은
앱의 사용자마다 다릅니다. 이 값을 검색하는 방법은 예시를 참고하세요.
서버 측 태그 지정 이벤트 누락
측정 프로토콜 클라이언트가 있는 서버 측 태그 관리자 설치를 사용하면 측정 프로토콜 형식의 이벤트를 컨테이너로 전송할 수 있습니다. 그러면 컨테이너는 다른 모든 SGTM 이벤트와 동일한 메커니즘을 사용하여 이러한 이벤트를 Google 애널리틱스로 전송합니다.
측정 프로토콜의 모든 기능을 사용하려면 컨테이너 대신 측정 프로토콜에 이벤트를 직접 전송하세요.
[null,null,["최종 업데이트: 2025-07-26(UTC)"],[[["\u003cp\u003eThis guide helps troubleshoot common Google Analytics 4 Measurement Protocol implementation errors, focusing on missing events and invalid user/device IDs.\u003c/p\u003e\n"],["\u003cp\u003eIf events aren't appearing, ensure your \u003ccode\u003eapi_secret\u003c/code\u003e is correct, valid, accurately copied, and you're using the appropriate device identifier (\u003ccode\u003eapp_instance_id\u003c/code\u003e or \u003ccode\u003eclient_id\u003c/code\u003e, not \u003ccode\u003eadvertising_id\u003c/code\u003e).\u003c/p\u003e\n"],["\u003cp\u003eWhen using the Measurement Protocol, select the correct IDs based on whether you're implementing via Firebase or gtag.js, as outlined in the guide.\u003c/p\u003e\n"],["\u003cp\u003eFor Firebase, utilize \u003ccode\u003efirebase_app_id\u003c/code\u003e and \u003ccode\u003eapp_instance_id\u003c/code\u003e, avoiding \u003ccode\u003efirebase_instance_id\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eFor gtag.js, use \u003ccode\u003emeasurement_id\u003c/code\u003e and \u003ccode\u003eclient_id\u003c/code\u003e for proper event tracking.\u003c/p\u003e\n"]]],["To resolve event visibility issues in Google Analytics, verify the correct `api_secret` is used, valid, and copied accurately, and avoid using `advertising_id`. For Firebase, use `firebase_app_id` in query parameters and `app_instance_id` in the POST body; retrieve `app_instance_id` using the appropriate platform's method. For gtag.js, utilize `measurement_id` in query parameters and `client_id` in the POST body. Both `client_id` and `app_instance_id` should differ for each user.\n"],null,["# Troubleshooting\n\nThis guide outlines common troubleshooting steps to fix common implementation\nerrors.\n\nNo events\n---------\n\nIf your events aren't showing up in Google Analytics, there are a few common\nissues you should look for.\n\nFirst choose your client: \nFirebase gtag.js\n\n\u003cbr /\u003e\n\n- Are you using the correct [api_secret](/analytics/devguides/collection/protocol/ga4/reference#api_secret)?\n\n Check that you're using the `api_secret` for the right stream. If you set up\n the measurement protocol for multiple streams, each stream will have its own\n secret.\n- Is your [api_secret](/analytics/devguides/collection/protocol/ga4/reference#api_secret) still valid?\n\n In order to help combat spam, you're able to revoke `api_secret`s. Make sure\n that the `api_secret` you are using is still valid. It's possible that\n another user with access to your stream may have revoked access to it by\n mistake.\n- Is your [api_secret](/analytics/devguides/collection/protocol/ga4/reference#api_secret) copied correctly?\n\n `api_secret` is case-sensitive. Double check that the `api_secret` in the\n Google Analytics UI is *exactly* the same as the one you're using in your\n code.\n- Don't use `advertising_id`.\n\n `advertising_id` is not supported as a valid device identifier. Use\n `app_instance_id` if you're using Firebase and `client_id` if you're using\n gtag.js.\n\nInvalid IDs\n-----------\n\nSince the Measurement Procotol supports IDs from the Google Analytics for\nFirebase SDK and gtag.js, make sure you use the right ID. **The IDs you should\nuse changes depending on whether you are using the Google Analytics for Firebase\nSDK or gtag.js.** The following outlines which IDs you should be using:\n\n**Google Analytics for Firebase SDK**\n\nIf you're using the Google Analytics for Firebase SDK the IDs you *should* use\nare:\n\n- [`firebase_app_id`](/analytics/devguides/collection/protocol/ga4/reference?client_type=firebase#firebase_app_id) - Include this ID in the query parameters for the request. This ID uniquely identifies your Firebase App. All users of your app will have the same `firebase_app_id`. Found in the Firebase console under: \n **Project Settings** \\\u003e **General** \\\u003e **Your Apps** \\\u003e **App ID**\n- [`app_instance_id`](/analytics/devguides/collection/protocol/ga4/reference?client_type=firebase#app_instance_id) - Include this ID in the POST body for the request. This\n ID uniquely identifies a given installation of a Firebase App. This value\n will be different for every installation of your app. The methods to request\n this value for each Firebase platform are as follows:\n\n - [Android - getAppInstanceId()](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics#public-taskstring-getappinstanceid)\n - [Kotlin - getAppInstanceId()](https://firebase.google.com/docs/reference/kotlin/com/google/firebase/analytics/FirebaseAnalytics#getappinstanceid)\n - [Swift - appInstanceID()](https://firebase.google.com/docs/reference/swift/firebaseanalytics/api/reference/Classes/Analytics#appinstanceid)\n - [Objective-C - appInstanceID](https://firebase.google.com/docs/reference/ios/firebaseanalytics/api/reference/Classes/FIRAnalytics#+appinstanceid)\n - [C++ - GetAnalyticsInstanceId()](https://firebase.google.com/docs/reference/cpp/namespace/firebase/analytics#getanalyticsinstanceid)\n - [Unity - GetAnalyticsInstanceIdAsync()](https://firebase.google.com/docs/reference/unity/class/firebase/analytics/firebase-analytics#getanalyticsinstanceidasync)\n\nYou should *not* use the following:\n\n- `firebase_instance_id` - This ID *should not* be included in your request. This ID is used for identifiying a given instance of the app, but is Firebase specific. It's used for tasks such as FCM messages.\n\n**gtag.js**\n\nIf you're using gtag.js, the IDs you *should* use are:\n\n- [`measurement_id`](/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#measurement_id) - Include this ID in the query parameters for the request. This ID uniquely identifies a Data Stream. All users of your website will have the same `measurement_id`. Found in the Google Analytics UI under: \n **Admin** \\\u003e **Data Streams** \\\u003e **choose your stream** \\\u003e **Measurement ID**\n- [`client_id`](/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#client_id) - Include this ID in the POST body for the request. This ID uniquely identifies a given user instance of a web client. This value will be different for every user of your app. See [these examples](/gtagjs/reference/api#get) for how to retrieve this value.\n\nServer-side tagging events missing\n----------------------------------\n\nA [Server-side Tag Manager installation with a Measurement Protocol\nclient](/tag-platform/tag-manager/server-side/send-data#server-to-server_apps) lets you send events in the Measurement Protocol *format* to a\ncontainer. The container then sends those events to Google Analytics using the\nsame mechanism as all other SGTM events.\n| **Note:** It *doesn't* send those events to the Measurement Protocol endpoint, and therefore doesn't support all the features of the Measurement Protocol endpoint, such as deriving [geographic and device information](/analytics/devguides/collection/protocol/ga4#geo_device) from tagging events.\n\nIf you want all the features of the Measurement Protocol, send events directly to the\nMeasurement Protocol instead of your container."]]