借助 Google Analytics Data API v1,您可以生成漏斗报告。 借助漏斗探索,您可以直观了解用户为完成转化而采取的步骤 并快速了解他们在每个步骤上的状况。
核心报告的共同功能
漏斗报告请求的语义与核心报告请求相同, 许多共享功能。例如,分页、维度过滤条件和用户 媒体资源在漏斗报告中的运作方式与核心报告中相同。本次 本指南重点介绍了渠道报告功能。要熟悉 Data API v1 的核心报告功能,请参阅报告基础知识指南, 以及高级用例指南。
漏斗报告方法
Data API v1 支持 runFunnelReport
中的漏斗报告功能
方法。此方法会返回 Google Analytics 的自定义漏斗报告
事件数据。
选择一个报告实体
Data API v1 的所有方法都需要 Google Analytics 媒体资源标识符
在网址请求路径内指定,格式为
properties/GA_PROPERTY_ID
,例如:
POST https://analyticsdata.googleapis.com/v1alpha/properties/GA_PROPERTY_ID:runFunnelReport
生成的报告将根据 Google Analytics 事件数据生成 特定 Google Analytics 媒体资源中收集的信息。
如果您使用的是 Data API 客户端库之一,则无需手动操作请求网址路径。大多数 API 客户端都会提供一个 property
参数,该参数需要 properties/GA_PROPERTY_ID
形式的字符串。如需查看有关如何使用客户端库的示例,请参阅快速入门指南。
漏斗报告请求
如需请求漏斗报告,您可以构建 RunFunnelReportRequest
对象。建议从以下请求参数开始:
dateRanges
中的有效条目 字段。funnel
中的有效漏斗规范 字段。
漏斗规范
funnel
中的漏斗规范
RunFunnelReportRequest
的相应字段
对象通过描述 steps
来定义要衡量的用户体验历程
此漏斗的各个阶段
漏斗步骤包含一个或多个条件,用户必须满足这些条件
添加到漏斗历程的相应步骤中。添加到每个
有关步骤的说明,请参见
filterExpression
字段。
每个漏斗过滤条件表达式都是两种类型的过滤条件的组合:
funnelFieldFilter
用于创建维度或指标的过滤器。funnelEventFilter
会创建一个过滤器,用于匹配单个事件名称的事件。如果funnelParameterFilterExpression
字段,则仅指定与单个事件都匹配的事件子集 参数过滤器表达式与此事件过滤器匹配。
您可以使用 AND
合并过滤条件,
或
组,以及使用 NOT
表达式进行否定。
每个漏斗步骤的报告结果将根据维度细分
并在
funnelBreakdown
字段。
漏斗报告示例
以下示例使用 Google Analytics Data API v1 重现默认漏斗 提供的报告 此模板的“探索”模板中, Google Analytics 网络界面:
漏斗步骤
上述漏斗配置包含以下步骤:
# | 步骤名称 | 条件 |
---|---|---|
1 | 首次打开/访问 | 事件名称为 first_open 或 first_visit 。 |
2 | 以自然方式进行访问的用户 | 有 firstUserMedium 个维度包含“自然”一词。 |
3 | 会话开始 | 事件名称为“session_start ”。 |
4 | 浏览过屏幕/网页 | 事件名称为 screen_view 或 page_view 。 |
5 | 购买 | 事件名称为 purchase 或 in_app_purchase 。 |
漏斗的第 1 步(首次打开/访问)包括首次打开/访问之后的所有用户
用户与网站或应用的互动,例如
first_open
或 first_visit
事件。
为了实现此行为,以下代码段使用FunnelStep
filterExpression
字段。
过滤条件表达式字段是一个 FunnelFilterExpression
对象
通过将两个
FunnelEventFilter
实体,这些实体使用或
群组。
{
"name": "Purchase",
"filterExpression": {
"orGroup": {
"expressions": [
{
"funnelEventFilter": {
"eventName": "first_open"
}
},
{
"funnelEventFilter": {
"eventName": "first_visit"
}
}
]
}
}
}
漏斗第 2 步(自然访问者)包含其首个媒介的用户
使用了“自然”一词。在以下代码段中,fieldName
FunnelFieldFilter
的字段
用于指示过滤器与 firstUserMedium
维度匹配。
stringFilter
字段包含一个条件,该条件仅包含
包含字词“自然”的维度。
{
"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"
}
}
]
}
}
}
]
}
}
举报响应
漏斗报告响应
由两个主要部分组成,两者均返回
以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)