Google Analytics Data API v1 מאפשר לכם ליצור דוחות משפך. ניתוח משפך מאפשר לכם לראות בצורה חזותית את השלבים שהמשתמשים עוברים כדי להשלים משימה, ולבדוק במהירות אם הם מצליחים להשלים כל שלב או לא.
תכונות משותפות עם דוחות הליבה
לבקשות דיווח על משפך יש סמנטיקה זהה לבקשות דיווח ליבה עבור תכונות משותפות רבות. לדוגמה, חלוקה לדפים, מסנני מאפיינים ומאפייני משתמש מתנהגים בדוחות משפך בדיוק כמו בדוחות הליבה. המדריך הזה מתמקד בתכונות הדיווח על משפך המרות. כדי להכיר את הפונקציונליות של דוחות הליבה ב-Data API v1, כדאי לקרוא את המדריך בנושא יסודות הדיווח ואת המדריך בנושא תרחישי שימוש מתקדמים.
שיטת הדיווח של משפך
Data API v1 תומך ביכולות של דוחות משפך בשיטה runFunnelReport. השיטה הזו מחזירה דוח משפך מותאם אישית של נתוני האירועים ב-Google Analytics.
בחירת ישות לדיווח
בכל השיטות של Data API v1 צריך לציין את מזהה הנכס ב-Google Analytics בנתיב של בקשת URL, בצורה הבאה: properties/GA_PROPERTY_ID, למשל:
POST https://analyticsdata.googleapis.com/v1alpha/properties/GA_PROPERTY_ID:runFunnelReport
הדוח שיתקבל ייווצר על סמך נתוני האירועים ב-Google Analytics שנאספו בנכס Google Analytics שצוין.
אם אתם משתמשים באחת מספריות הלקוח של Data API, אין צורך לשנות את נתיב ה-URL של הבקשה באופן ידני. ברוב הלקוחות של API יש פרמטר property שמצפה למחרוזת בפורמט properties/GA_PROPERTY_ID. דוגמאות לשימוש בספריות הלקוח מופיעות במדריך למתחילים.
בקשה לדוח משפך
כדי לבקש דוח משפך, אפשר ליצור אובייקט RunFunnelReportRequest. מומלץ להתחיל עם הפרמטרים הבאים של הבקשה:
ערך תקין בשדה
dateRangesהגדרה תקינה של משפך בשדה
funnel
מפרט המשפך
הגדרת משפך בשדה funnel של אובייקט RunFunnelReportRequest מגדירה את התהליך שהמשתמש עובר שאתם רוצים למדוד, על ידי תיאור steps של המשפך הזה.
שלבי המשפך מכילים תנאי אחד או יותר שהמשתמשים צריכים לעמוד בו כדי להיכלל באותו שלב במשפך. אפשר לתאר את התנאים להכללה בכל שלב בשדה filterExpression של כל שלב.
כל ביטוי סינון של משפך הוא שילוב של שני סוגים של מסננים:
funnelFieldFilterיוצר מסנן למאפיין או למדד.
funnelEventFilterיוצר מסנן שתואם לאירועים עם שם אירוע יחיד. אם מציינים שדה אופציונליfunnelParameterFilterExpression, רק קבוצת המשנה של האירועים שתואמים גם לשם האירוע היחיד וגם לביטויי הסינון של הפרמטרים תתאים למסנן האירועים הזה.
אפשר לשלב בין מסננים באמצעות AND, OR, קבוצות וגם לשלול אותם באמצעות ביטוי NOT.
תוצאות הדוח לכל שלב במשפך יפורטו על סמך המאפיין שצוין בשדה funnelBreakdown.
דוגמה לדוח משפך
בדוגמה הבאה אנחנו משתמשים ב-Google Analytics Data API v1 כדי לשחזר את דוח המשפך שמופיע כברירת מחדל בתבנית ניתוח משפך בממשק האינטרנט של Google Analytics:

שלב במשפך
הגדרת המשפך שלמעלה כוללת את השלבים הבאים:
| # | שם השלב | תנאי |
|---|---|---|
| 1 | פתיחה ראשונה/ביקור ראשון | שם האירוע הוא first_open או first_visit. |
| 2 | מבקרים מחיפוש אורגני | המאפיין firstUserMedium מכיל את המונח organic. |
| 3 | התחלת סשן | שם האירוע הוא session_start. |
| 4 | צפייה במסך/דף | שם האירוע הוא screen_view או page_view. |
| 5 | רכישה | שם האירוע הוא purchase או in_app_purchase. |
שלב 1 (הפתיחה או הביקור הראשונים) במשפך כולל את כל המשתמשים אחרי האינטראקציה הראשונה שלהם עם אתר או אפליקציה, כמו משתמשים שהפעילו אירועים מסוג first_open או first_visit.
כדי להטמיע את ההתנהגות הזו, בקטע הקוד הבא מצוין אובייקט FunnelStep עם השדה filterExpression.
שדה ביטוי הסינון הוא אובייקט FunnelFilterExpression שנבנה משילוב של שני ישויות FunnelEventFilter באמצעות קבוצת OR.
{
"name": "Purchase",
"filterExpression": {
"orGroup": {
"expressions": [
{
"funnelEventFilter": {
"eventName": "first_open"
}
},
{
"funnelEventFilter": {
"eventName": "first_visit"
}
}
]
}
}
}
שלב 2 (מבקרים אורגניים) במשפך כולל משתמשים שאמצעי ההגעה לאתר הראשון שלהם כולל את המונח 'אורגני'. בקטע הקוד הבא, השדה fieldName של FunnelFieldFilter מורה למסנן להתאים למאפיין firstUserMedium.
השדה stringFilter מכיל תנאי שכולל רק את הערכים של המאפיין שמכילים את המונח organic.
{
"name": "Organic visitors",
"filterExpression": {
"funnelFieldFilter": {
"fieldName": "firstUserMedium",
"stringFilter": {
"matchType": "CONTAINS",
"caseSensitive": false,
"value": "organic"
}
}
}
}
אפשר לציין את שאר השלבים במשפך באופן דומה.
מאפיין פירוט
אפשר לציין מאפיין פירוט אופציונלי (deviceCategory בדוגמה הזו) באמצעות אובייקט FunnelBreakdown:
"funnelBreakdown": {
"breakdownDimension": {
"name": "deviceCategory"
}
}
כברירת מחדל, בדוח נכללים רק 5 הערכים הייחודיים הראשונים של מאפיין הפירוט. כדי לשנות את ההתנהגות הזו, אפשר להשתמש בשדה limit של אובייקט FunnelBreakdown.
שאילתה של דוח משפך מלא
הנה שאילתה מלאה שיוצרת דוח משפך:
HTTP
POST https://analyticsdata.googleapis.com/v1alpha/properties/GA_PROPERTY_ID:runFunnelReport
{
"dateRanges": [
{
"startDate": "30daysAgo",
"endDate": "today"
}
],
"funnelBreakdown": {
"breakdownDimension": {
"name": "deviceCategory"
}
},
"funnel": {
"steps": [
{
"name": "First open/visit",
"filterExpression": {
"orGroup": {
"expressions": [
{
"funnelEventFilter": {
"eventName": "first_open"
}
},
{
"funnelEventFilter": {
"eventName": "first_visit"
}
}
]
}
}
},
{
"name": "Organic visitors",
"filterExpression": {
"funnelFieldFilter": {
"fieldName": "firstUserMedium",
"stringFilter": {
"matchType": "CONTAINS",
"caseSensitive": false,
"value": "organic"
}
}
}
},
{
"name": "Session start",
"filterExpression": {
"funnelEventFilter": {
"eventName": "session_start"
}
}
},
{
"name": "Screen/Page view",
"filterExpression": {
"orGroup": {
"expressions": [
{
"funnelEventFilter": {
"eventName": "screen_view"
}
},
{
"funnelEventFilter": {
"eventName": "page_view"
}
}
]
}
}
},
{
"name": "Purchase",
"filterExpression": {
"orGroup": {
"expressions": [
{
"funnelEventFilter": {
"eventName": "purchase"
}
},
{
"funnelEventFilter": {
"eventName": "in_app_purchase"
}
}
]
}
}
}
]
}
}
דיווח על תגובה
התגובה של דוח המשפך לבקשת API של דוח משפך מורכבת משני חלקים עיקריים, שניהם מוחזרים כאובייקט FunnelSubReport: תרשים המשפך וטבלת המשפך.
הצגת נתוני משפך
הדוח 'הצגת נתוני משפך', שמוחזר בשדה funnelVisualization של התגובה לדוח משפך, מכיל סקירה כללית של דוח המשפך. התצוגה הזו שימושית, כי היא מאפשרת לראות במהירות את הדוח על משפך ההמרה שנוצר.
כל שורה בטבלת ההמחשה של המשפך מכילה חלק מהשדות הבאים או את כולם:
שם השלב במשפך (מאפיין
funnelStepName).ספירת משתמשים פעילים (
activeUsersמדד).פלח (מאפיין
segment). הפרמטר הזה מופיע רק אםSegmentמצוין בשאילתת המשפך.תאריך (מאפיין
date). מוצג רק אם סוג הוויזואליזציהTRENDED_FUNNELצוין בשאילתה.מאפיין הפעולה הבאה (מאפיין
funnelStepNextAction). המאפיין הזה מוצג רק אםFunnelNextActionצוין בשאילתת המשפך.
כך ייראה קטע ההדמיה של המשפך בדוגמה לדוח במדריך הזה בממשק האינטרנט של Google Analytics:

טבלת המשפך
טבלת המשפך, שמוחזרת בשדה funnelTable של התגובה של דוח המשפך, מייצגת את החלק העיקרי של הדוח. כל שורה בטבלה
כוללת חלק מהשדות הבאים או את כולם:
שם השלב במשפך (מאפיין
funnelStepName).מאפיין פירוט.
ספירת משתמשים פעילים (
activeUsersמדד).שיעור השלמת הצפייה (
funnelStepCompletionRateמדד).מספר הנטישות בשלב (מדד
funnelStepAbandonments).שיעור הנטישה בשלב (
funnelStepAbandonmentRateמדד).שם הפלח (מאפיין
segment). הפרמטר הזה מופיע רק אםSegmentמצוין בשאילתת המשפך.
הערכים הכוללים מוחזרים בשורה נפרדת עם RESERVED_TOTAL כערך של מאפיין פירוט.
דוגמה לטבלת משפך שמוצגת בממשק האינטרנט של Google Analytics:

תשובה גולמית
בקטע הקוד הבא אפשר לראות דוגמה לנתונים גולמיים שמוחזרים בתגובה לשאילתת runFunnelReport.
בהתאם לנתונים שנאספים בנכס, בדוח לדוגמה יופיעו הנתונים הבאים שמציגים את מספר המשתמשים הפעילים שנכללים בכל שלב במשפך.
{
"funnelTable": {
"dimensionHeaders": [
{
"name": "funnelStepName"
},
{
"name": "deviceCategory"
}
],
"metricHeaders": [
{
"name": "activeUsers",
"type": "TYPE_INTEGER"
},
{
"name": "funnelStepCompletionRate",
"type": "TYPE_INTEGER"
},
{
"name": "funnelStepAbandonments",
"type": "TYPE_INTEGER"
},
{
"name": "funnelStepAbandonmentRate",
"type": "TYPE_INTEGER"
}
],
"rows": [
{
"dimensionValues": [
{
"value": "1. First open/visit"
},
{
"value": "RESERVED_TOTAL"
}
],
"metricValues": [
{
"value": "4621565"
},
{
"value": "0.27780178359495106"
},
{
"value": "3337686"
},
{
"value": "0.72219821640504889"
}
]
},
{
"dimensionValues": [
{
"value": "1. First open/visit"
},
{
"value": "desktop"
}
],
"metricValues": [
{
"value": "4015959"
},
{
"value": "0.27425279989163237"
},
{
"value": "2914571"
},
{
"value": "0.72574720010836768"
}
]
},
{
"dimensionValues": [
{
"value": "1. First open/visit"
},
{
"value": "mobile"
}
],
"metricValues": [
{
"value": "595760"
},
{
"value": "0.29156035987646034"
},
{
"value": "422060"
},
{
"value": "0.70843964012353966"
}
]
},
{
"dimensionValues": [
{
"value": "1. First open/visit"
},
{
"value": "tablet"
}
],
"metricValues": [
{
"value": "33638"
},
{
"value": "0.205571080325822"
},
{
"value": "26723"
},
{
"value": "0.79442891967417806"
}
]
},
...
],
"metadata": {
"samplingMetadatas": [
{
"samplesReadCount": "9917254",
"samplingSpaceSize": "1162365416"
}
]
}
},
"funnelVisualization": {
"dimensionHeaders": [
{
"name": "funnelStepName"
}
],
"metricHeaders": [
{
"name": "activeUsers",
"type": "TYPE_INTEGER"
}
],
"rows": [
{
"dimensionValues": [
{
"value": "1. First open/visit"
}
],
"metricValues": [
{
"value": "4621565"
}
]
},
...
],
"metadata": {
"samplingMetadatas": [
{
"samplesReadCount": "9917254",
"samplingSpaceSize": "1162365416"
}
]
}
},
"kind": "analyticsData#runFunnelReport"
}
ספריות לקוח
במדריך למתחילים מוסבר איך להתקין ולהגדיר ספריות לקוח.
הנה דוגמאות לשימוש בספריות לקוח שמריצות שאילתת המרה ומדפיסות את התשובה.
Java
import com.google.analytics.data.v1alpha.AlphaAnalyticsDataClient; import com.google.analytics.data.v1alpha.DateRange; import com.google.analytics.data.v1alpha.Dimension; import com.google.analytics.data.v1alpha.DimensionHeader; import com.google.analytics.data.v1alpha.FunnelBreakdown; import com.google.analytics.data.v1alpha.FunnelEventFilter; import com.google.analytics.data.v1alpha.FunnelFieldFilter; import com.google.analytics.data.v1alpha.FunnelFilterExpression; import com.google.analytics.data.v1alpha.FunnelFilterExpressionList; import com.google.analytics.data.v1alpha.FunnelStep; import com.google.analytics.data.v1alpha.FunnelSubReport; import com.google.analytics.data.v1alpha.MetricHeader; import com.google.analytics.data.v1alpha.Row; import com.google.analytics.data.v1alpha.RunFunnelReportRequest; import com.google.analytics.data.v1alpha.RunFunnelReportResponse; import com.google.analytics.data.v1alpha.SamplingMetadata; import com.google.analytics.data.v1alpha.StringFilter; import com.google.analytics.data.v1alpha.StringFilter.MatchType; /** * Google Analytics Data API sample application demonstrating the creation of a funnel report. * * <p>See * https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1alpha/properties/runFunnelReport * for more information. * * <p>Before you start the application, please review the comments starting with "TODO(developer)" * and update the code to use correct values. * * <p>To run this sample using Maven: * * <pre>{@code * cd google-analytics-data * mvn compile exec:java -Dexec.mainClass="com.google.analytics.data.samples.RunFunnelReportSample" * }</pre> */ public class RunFunnelReportSample { public static void main(String... args) throws Exception { /** * TODO(developer): Replace this variable with your Google Analytics 4 property ID before * running the sample. */ String propertyId = "YOUR-GA4-PROPERTY-ID"; sampleRunFunnelReport(propertyId); } /** * Runs a funnel query to build a report with 5 funnel steps. * * <ol> * <li>First open/visit (event name is `first_open` or `first_visit`). * <li>Organic visitors (`firstUserMedium` dimension contains the term "organic"). * <li>Session start (event name is `session_start`). * <li>Screen/Page view (event name is `screen_view` or `page_view`). * <li>Purchase (event name is `purchase` or `in_app_purchase`). * </ol> * * The report configuration reproduces the default funnel report provided in the Funnel * Exploration template of the Google Analytics UI. See more at * https://support.google.com/analytics/answer/9327974 */ static void sampleRunFunnelReport(String propertyId) throws Exception { // Using a default constructor instructs the client to use the credentials // specified in GOOGLE_APPLICATION_CREDENTIALS environment variable. try (AlphaAnalyticsDataClient analyticsData = AlphaAnalyticsDataClient.create()) { RunFunnelReportRequest.Builder requestBuilder = RunFunnelReportRequest.newBuilder() .setProperty("properties/" + propertyId) .addDateRanges(DateRange.newBuilder().setStartDate("30daysAgo").setEndDate("today")) .setFunnelBreakdown( FunnelBreakdown.newBuilder() .setBreakdownDimension(Dimension.newBuilder().setName("deviceCategory"))); // Adds each step of the funnel. requestBuilder .getFunnelBuilder() .addSteps( FunnelStep.newBuilder() .setName("First open/visit") .setFilterExpression( FunnelFilterExpression.newBuilder() .setOrGroup( FunnelFilterExpressionList.newBuilder() .addExpressions( FunnelFilterExpression.newBuilder() .setFunnelEventFilter( FunnelEventFilter.newBuilder() .setEventName("first_open"))) .addExpressions( FunnelFilterExpression.newBuilder() .setFunnelEventFilter( FunnelEventFilter.newBuilder() .setEventName("first_visit")))))); requestBuilder .getFunnelBuilder() .addSteps( FunnelStep.newBuilder() .setName("Organic visitors") .setFilterExpression( FunnelFilterExpression.newBuilder() .setFunnelFieldFilter( FunnelFieldFilter.newBuilder() .setFieldName("firstUserMedium") .setStringFilter( StringFilter.newBuilder() .setMatchType(MatchType.CONTAINS) .setCaseSensitive(false) .setValue("organic"))))); requestBuilder .getFunnelBuilder() .addSteps( FunnelStep.newBuilder() .setName("Session start") .setFilterExpression( FunnelFilterExpression.newBuilder() .setFunnelEventFilter( FunnelEventFilter.newBuilder().setEventName("session_start")))); requestBuilder .getFunnelBuilder() .addSteps( FunnelStep.newBuilder() .setName("Screen/Page view") .setFilterExpression( FunnelFilterExpression.newBuilder() .setOrGroup( FunnelFilterExpressionList.newBuilder() .addExpressions( FunnelFilterExpression.newBuilder() .setFunnelEventFilter( FunnelEventFilter.newBuilder() .setEventName("screen_view"))) .addExpressions( FunnelFilterExpression.newBuilder() .setFunnelEventFilter( FunnelEventFilter.newBuilder() .setEventName("page_view")))))); requestBuilder .getFunnelBuilder() .addSteps( FunnelStep.newBuilder() .setName("Purchase") .setFilterExpression( FunnelFilterExpression.newBuilder() .setOrGroup( FunnelFilterExpressionList.newBuilder() .addExpressions( FunnelFilterExpression.newBuilder() .setFunnelEventFilter( FunnelEventFilter.newBuilder() .setEventName("purchase"))) .addExpressions( FunnelFilterExpression.newBuilder() .setFunnelEventFilter( FunnelEventFilter.newBuilder() .setEventName("in_app_purchase")))))); // Make the request. RunFunnelReportResponse response = analyticsData.runFunnelReport(requestBuilder.build()); printRunFunnelReportResponse(response); } } /** Prints results of a runFunnelReport call. */ static void printRunFunnelReportResponse(RunFunnelReportResponse response) { System.out.println("Report result:"); System.out.println("=== FUNNEL VISUALIZATION ==="); printFunnelSubReport(response.getFunnelVisualization()); System.out.println("=== FUNNEL TABLE ==="); printFunnelSubReport(response.getFunnelTable()); } /** Prints the contents of a FunnelSubReport object. */ private static void printFunnelSubReport(FunnelSubReport funnelSubReport) { System.out.println("Dimension headers:"); for (DimensionHeader dimensionHeader : funnelSubReport.getDimensionHeadersList()) { System.out.println(dimensionHeader.getName()); } System.out.println(); System.out.println("Metric headers:"); for (MetricHeader metricHeader : funnelSubReport.getMetricHeadersList()) { System.out.println(metricHeader.getName()); } System.out.println(); System.out.println("Dimension and metric values for each row in the report:"); for (int rowIndex = 0; rowIndex < funnelSubReport.getRowsCount(); rowIndex++) { Row row = funnelSubReport.getRows(rowIndex); for (int fieldIndex = 0; fieldIndex < row.getDimensionValuesCount(); fieldIndex++) { System.out.printf( "%s: '%s'%n", funnelSubReport.getDimensionHeaders(fieldIndex).getName(), row.getDimensionValues(fieldIndex).getValue()); } for (int fieldIndex = 0; fieldIndex < row.getMetricValuesCount(); fieldIndex++) { System.out.printf( "%s: '%s'%n", funnelSubReport.getMetricHeaders(fieldIndex).getName(), row.getMetricValues(fieldIndex).getValue()); } } System.out.println(); System.out.println("Sampling metadata for each date range:"); for (int metadataIndex = 0; metadataIndex < funnelSubReport.getMetadata().getSamplingMetadatasCount(); metadataIndex++) { SamplingMetadata samplingMetadata = funnelSubReport.getMetadata().getSamplingMetadatas(metadataIndex); System.out.printf( "Sampling metadata for date range #%d: samplesReadCount=%d, samplingSpaceSize=%d%n", metadataIndex, samplingMetadata.getSamplesReadCount(), samplingMetadata.getSamplingSpaceSize()); } } }
PHP
use Google\Analytics\Data\V1alpha\Client\AlphaAnalyticsDataClient; use Google\Analytics\Data\V1alpha\DateRange; use Google\Analytics\Data\V1alpha\Dimension; use Google\Analytics\Data\V1alpha\FunnelBreakdown; use Google\Analytics\Data\V1alpha\FunnelEventFilter; use Google\Analytics\Data\V1alpha\FunnelFieldFilter; use Google\Analytics\Data\V1alpha\FunnelFilterExpression; use Google\Analytics\Data\V1alpha\FunnelFilterExpressionList; use Google\Analytics\Data\V1alpha\FunnelStep; use Google\Analytics\Data\V1alpha\Funnel; use Google\Analytics\Data\V1alpha\FunnelSubReport; use Google\Analytics\Data\V1alpha\RunFunnelReportRequest; use Google\Analytics\Data\V1alpha\RunFunnelReportResponse; use Google\Analytics\Data\V1alpha\StringFilter; use Google\Analytics\Data\V1alpha\StringFilter\MatchType; /** * Runs a funnel query to build a report with 5 funnel steps. * * Step 1: First open/visit (event name is `first_open` or `first_visit`). * Step 2: Organic visitors (`firstUserMedium` dimension contains the term "organic"). * Step 3: Session start (event name is `session_start`). * Step 4: Screen/Page view (event name is `screen_view` or `page_view`). * Step 5: Purchase (event name is `purchase` or `in_app_purchase`). * * The report configuration reproduces the default funnel report provided in the Funnel * Exploration template of the Google Analytics UI. See more at * https://support.google.com/analytics/answer/9327974 * * @param string $propertyId Your GA-4 Property ID */ function run_funnel_report(string $propertyId) { // Create an instance of the Google Analytics Data API client library. $client = new AlphaAnalyticsDataClient(); // Create the funnel report request. $request = (new RunFunnelReportRequest()) ->setProperty('properties/' . $propertyId) ->setDateRanges([ new DateRange([ 'start_date' => '30daysAgo', 'end_date' => 'today', ]), ]) ->setFunnelBreakdown( new FunnelBreakdown([ 'breakdown_dimension' => new Dimension([ 'name' => 'deviceCategory' ]) ]) ) ->setFunnel(new Funnel()); // Add funnel steps to the funnel. // 1. Add first open/visit step. $request->getFunnel()->getSteps()[] = new FunnelStep([ 'name' => 'First open/visit', 'filter_expression' => new FunnelFilterExpression([ 'or_group' => new FunnelFilterExpressionList([ 'expressions' => [ new FunnelFilterExpression([ 'funnel_event_filter' => new FunnelEventFilter([ 'event_name' => 'first_open', ]) ]), new FunnelFilterExpression([ 'funnel_event_filter' => new FunnelEventFilter([ 'event_name' => 'first_visit' ]) ]) ] ]) ]) ]); // 2. Add organic visitors step. $request->getFunnel()->getSteps()[] = new FunnelStep([ 'name' => 'Organic visitors', 'filter_expression' => new FunnelFilterExpression([ 'funnel_field_filter' => new FunnelFieldFilter([ 'field_name' => 'firstUserMedium', 'string_filter' => new StringFilter([ 'match_type' => MatchType::CONTAINS, 'case_sensitive' => false, 'value' => 'organic', ]) ]) ]) ]); // 3. Add session start step. $request->getFunnel()->getSteps()[] = new FunnelStep([ 'name' => 'Session start', 'filter_expression' => new FunnelFilterExpression([ 'funnel_event_filter' => new FunnelEventFilter([ 'event_name' => 'session_start', ]) ]) ]); // 4. Add screen/page view step. $request->getFunnel()->getSteps()[] = new FunnelStep([ 'name' => 'Screen/Page view', 'filter_expression' => new FunnelFilterExpression([ 'or_group' => new FunnelFilterExpressionList([ 'expressions' => [ new FunnelFilterExpression([ 'funnel_event_filter' => new FunnelEventFilter([ 'event_name' => 'screen_view', ]) ]), new FunnelFilterExpression([ 'funnel_event_filter' => new FunnelEventFilter([ 'event_name' => 'page_view' ]) ]) ] ]) ]) ]); // 5. Add purchase step. $request->getFunnel()->getSteps()[] = new FunnelStep([ 'name' => 'Purchase', 'filter_expression' => new FunnelFilterExpression([ 'or_group' => new FunnelFilterExpressionList([ 'expressions' => [ new FunnelFilterExpression([ 'funnel_event_filter' => new FunnelEventFilter([ 'event_name' => 'purchase', ]) ]), new FunnelFilterExpression([ 'funnel_event_filter' => new FunnelEventFilter([ 'event_name' => 'in_app_purchase' ]) ]) ] ]) ]) ]); // Make an API call. $response = $client->runFunnelReport($request); printRunFunnelReportResponse($response); } /** * Print results of a runFunnelReport call. * @param RunFunnelReportResponse $response */ function printRunFunnelReportResponse(RunFunnelReportResponse $response) { print 'Report result: ' . PHP_EOL; print '=== FUNNEL VISUALIZATION ===' . PHP_EOL; printFunnelSubReport($response->getFunnelVisualization()); print '=== FUNNEL TABLE ===' . PHP_EOL; printFunnelSubReport($response->getFunnelTable()); } /** * Print the contents of a FunnelSubReport object. * @param FunnelSubReport $subReport */ function printFunnelSubReport(FunnelSubReport $subReport) { print 'Dimension headers:' . PHP_EOL; foreach ($subReport->getDimensionHeaders() as $dimensionHeader) { print $dimensionHeader->getName() . PHP_EOL; } print PHP_EOL . 'Metric headers:' . PHP_EOL; foreach ($subReport->getMetricHeaders() as $metricHeader) { print $metricHeader->getName() . PHP_EOL; } print PHP_EOL . 'Dimension and metric values for each row in the report:'; foreach ($subReport->getRows() as $rowIndex => $row) { print PHP_EOL . 'Row #' . $rowIndex . PHP_EOL; foreach ($row->getDimensionValues() as $dimIndex => $dimValue) { $dimName = $subReport->getDimensionHeaders()[$dimIndex]->getName(); print $dimName . ": '" . $dimValue->getValue() . "'" . PHP_EOL; } foreach ($row->getMetricValues() as $metricIndex => $metricValue) { $metricName = $subReport->getMetricHeaders()[$metricIndex]->getName(); print $metricName . ": '" . $metricValue->getValue() . "'" . PHP_EOL; } } print PHP_EOL . 'Sampling metadata for each date range:' . PHP_EOL; foreach ($subReport->getMetadata()->getSamplingMetadatas() as $metadataIndex => $metadata) { printf('Sampling metadata for date range #%d: samplesReadCount=%d' . 'samplingSpaceSize=%d%s', $metadataIndex, $metadata->getSamplesReadCount(), $metadata->getSamplingSpaceSize(), PHP_EOL); } }
Python
from google.analytics.data_v1alpha import AlphaAnalyticsDataClient from google.analytics.data_v1alpha.types import ( DateRange, Dimension, Funnel, FunnelBreakdown, FunnelEventFilter, FunnelFieldFilter, FunnelFilterExpression, FunnelFilterExpressionList, FunnelStep, RunFunnelReportRequest, StringFilter, ) def run_sample(): """Runs the sample.""" # TODO(developer): Replace this variable with your Google Analytics 4 # property ID before running the sample. property_id = "YOUR-GA4-PROPERTY-ID" run_funnel_report(property_id) def run_funnel_report(property_id="YOUR-GA4-PROPERTY-ID"): """Runs a funnel query to build a report with 5 funnel steps. Step 1: First open/visit (event name is `first_open` or `first_visit`). Step 2: Organic visitors (`firstUserMedium` dimension contains the term "organic"). Step 3: Session start (event name is `session_start`). Step 4: Screen/Page view (event name is `screen_view` or `page_view`). Step 5: Purchase (event name is `purchase` or `in_app_purchase`). The report configuration reproduces the default funnel report provided in the Funnel Exploration template of the Google Analytics UI. See more at https://support.google.com/analytics/answer/9327974 """ client = AlphaAnalyticsDataClient() request = RunFunnelReportRequest( property=f"properties/{property_id}", date_ranges=[DateRange(start_date="30daysAgo", end_date="today")], funnel_breakdown=FunnelBreakdown( breakdown_dimension=Dimension(name="deviceCategory") ), funnel=Funnel( steps=[ FunnelStep( name="First open/visit", filter_expression=FunnelFilterExpression( or_group=FunnelFilterExpressionList( expressions=[ FunnelFilterExpression( funnel_event_filter=FunnelEventFilter( event_name="first_open" ) ), FunnelFilterExpression( funnel_event_filter=FunnelEventFilter( event_name="first_visit" ) ), ] ) ), ), FunnelStep( name="Organic visitors", filter_expression=FunnelFilterExpression( funnel_field_filter=FunnelFieldFilter( field_name="firstUserMedium", string_filter=StringFilter( match_type=StringFilter.MatchType.CONTAINS, case_sensitive=False, value="organic", ), ) ), ), FunnelStep( name="Session start", filter_expression=FunnelFilterExpression( funnel_event_filter=FunnelEventFilter( event_name="session_start" ) ), ), FunnelStep( name="Screen/Page view", filter_expression=FunnelFilterExpression( or_group=FunnelFilterExpressionList( expressions=[ FunnelFilterExpression( funnel_event_filter=FunnelEventFilter( event_name="screen_view" ) ), FunnelFilterExpression( funnel_event_filter=FunnelEventFilter( event_name="page_view" ) ), ] ) ), ), FunnelStep( name="Purchase", filter_expression=FunnelFilterExpression( or_group=FunnelFilterExpressionList( expressions=[ FunnelFilterExpression( funnel_event_filter=FunnelEventFilter( event_name="purchase" ) ), FunnelFilterExpression( funnel_event_filter=FunnelEventFilter( event_name="in_app_purchase" ) ), ] ) ), ), ] ), ) response = client.run_funnel_report(request) print_run_funnel_report_response(response) def print_funnel_sub_report(funnel_sub_report): """Prints the contents of a FunnelSubReport object.""" print("Dimension headers:") for dimension_header in funnel_sub_report.dimension_headers: print(dimension_header.name) print("\nMetric headers:") for metric_header in funnel_sub_report.metric_headers: print(metric_header.name) print("\nDimensions and metric values for each row in the report:") for row_idx, row in enumerate(funnel_sub_report.rows): print("\nRow #{}".format(row_idx)) for field_idx, dimension_value in enumerate(row.dimension_values): dimension_name = funnel_sub_report.dimension_headers[field_idx].name print("{}: '{}'".format(dimension_name, dimension_value.value)) for field_idx, metric_value in enumerate(row.metric_values): metric_name = funnel_sub_report.metric_headers[field_idx].name print("{}: '{}'".format(metric_name, metric_value.value)) print("\nSampling metadata for each date range:") for metadata_idx, metadata in enumerate( funnel_sub_report.metadata.sampling_metadatas ): print( "Sampling metadata for date range #{}: samplesReadCount={}, " "samplingSpaceSize={}".format( metadata_idx, metadata.samples_read_count, metadata.sampling_space_size ) ) def print_run_funnel_report_response(response): """Prints results of a runFunnelReport call.""" print("Report result:") print("=== FUNNEL VISUALIZATION ===") print_funnel_sub_report(response.funnel_visualization) print("=== FUNNEL TABLE ===") print_funnel_sub_report(response.funnel_table)