本文档简要介绍了如何使用 Android 版 Google Analytics(分析)SDK v4 来衡量应用内电子商务相关操作和展示。
概览
增强型电子商务功能可让您衡量用户在其购物历程中与产品的互动,包括产品展示、产品点击、查看产品详情、将产品添加到购物车、开始结账流程、交易以及退款。
实现
增强型电子商务衡量要求您使用 HitBuilder
类及其中的一组方法来发送商品、展示和促销的电子商务数据。另外还有一组 Google Analytics(分析)电子商务类 ,用于构建电子商务相关信息。
使用增强型电子商务功能,您可以:
衡量电子商务活动
典型的增强型电子商务实现将会衡量产品展示次数以及以下任一操作:
选择产品。
查看产品详情。
内部促销信息的展示和选择。
向购物车中添加产品或从中移除产品。
开始产品结账流程。
购买和退款。
注意 :增强型电子商务数据只能与现有命中一起发送,例如 screenview
或 event
。如果您设置了电子商务值但不发送任何命中,或是在电子商务值设置之前发送命中,则不会发送电子商务数据。
衡量展示
如需衡量产品展示,请构建 Product
对象,并使用 addImpression
方法随命中发送此对象。Product
必须具有 name 或 id 值。其他所有值都不是必需的,可以不设置。
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("Black")
.setPosition(1)
.setCustomDimension(1, "Member");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addImpression(product, "Search Results");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("searchResults");
t.send(builder.build());
如需详细了解 getTracker
方法,请参阅
高级配置 。
衡量操作
操作的衡量方法如下:使用 addProduct
方法和 Product
对象来添加产品详情,并使用 setProductAction
方法和 ProductAction
对象来指定用户执行的操作。
例如,以下代码衡量对搜索结果列表中展示的某个产品的选择:
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("Black")
.setPosition(1)
.setCustomDimension(1, "Member");
ProductAction productAction = new ProductAction(ProductAction.ACTION_CLICK)
.setProductActionList("Search Results");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("searchResults");
t.send(builder.build());
合并展示和操作数据
既有产品展示又有操作时,可以将两者合并到同一次命中中进行衡量。
下例显示了如何衡量一次在相关产品部分中的展示以及一次产品详情查看:
// The product from a related products section.
Product relatedProduct = new Product()
.setId("P12346")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("White")
.setPosition(1);
// The product being viewed.
Product viewedProduct = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("Black")
.setPosition(1);
ProductAction productAction = new ProductAction(ProductAction.ACTION_DETAIL);
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addImpression(relatedProduct, "Related Products")
.addProduct(viewedProduct)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("product");
t.send(builder.build());
衡量交易
交易的衡量方法如下:使用 addProduct
方法和 Product
对象添加产品详情,并使用 setProductAction
方法和 ProductAction
对象指定购买操作。总收入、税费、运费等交易级详情在 ProductAction
对象中提供。
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("black")
.setPrice(29.20)
.setCouponCode("APPARELSALE")
.setQuantity(1);
ProductAction productAction = new ProductAction(ProductAction.ACTION_PURCHASE)
.setTransactionId("T12345")
.setTransactionAffiliation("Google Store - Online")
.setTransactionRevenue(37.39)
.setTransactionTax(2.85)
.setTransactionShipping(5.34)
.setTransactionCouponCode("SUMMER2013");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("transaction");
t.send(builder.build());
指定货币
默认情况下,您可以通过 Google Analytics(分析)的管理网页界面为所有交易和商品配置一种通用的全局货币。
本地货币必须按 ISO 4217
标准指定。如需查看支持的转换货币的完整列表,请参阅货币代码参考 。
局部货币使用 currencyCode 跟踪器属性来指定。例如,以下跟踪器将以欧元发送货币金额值:
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("transaction");
t.set("&cu", "EUR"); // Set tracker currency to Euros.
t.send(builder.build());
要详细了解 Google Analytics(分析)中的货币转换机制,请参阅电子商务功能参考中的多种货币 部分。
衡量退款情况
如需为整个交易退款,请使用 setProductAction
方法和 ProductAction
对象来指定交易 ID 和退款操作类型:
// Refund an entire transaction.
ProductAction productAction = new ProductAction(ProductAction.ACTION_REFUND)
.setTransactionId("T12345"); // Transaction ID is only required field for a full refund.
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("refund");
t.send(builder.build());
如果未找到相符的交易,则退款将不会得到处理。
如需衡量部分退款情况,请使用 setProductAction
方法和 ProductAction
对象来指定要退款的交易 ID、产品 ID 和产品数量:
// Refund a single product.
Product product = new Product()
.setId("P12345") // Product ID is required for partial refund.
.setQuantity(1); // Quanity is required for partial refund.
ProductAction productAction = new ProductAction(ProductAction.ACTION_REFUND)
.setTransactionId("T12345"); // Transaction ID is required for partial refund.
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("refundProduct");
t.send(builder.build());
为退款使用非互动事件
如果您需要使用事件来发送退款数据,但该事件不属于通常衡量的行为(即并非由用户发起),则建议您发送非互动 事件。这可让特定指标免受该事件的影响。例如:
// Refund an entire transaction.
ProductAction productAction = new ProductAction(ProductAction.ACTION_REFUND)
.setTransactionId("T12345");
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
.setProductAction(productAction)
.setNonInteraction(true)
.setCategory("Ecommerce")
.setAction("Refund");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.send(builder.build());
衡量结账流程
为衡量结账流程中的每个步骤,请按以下步骤操作:
添加跟踪代码,以衡量结账流程中的每一步。
如果适用,添加跟踪代码以衡量结账选项。
(可选)设置直观易懂的步骤名称以用于结账渠道报告,方法是在网页界面的“管理”部分中配置电子商务设置 。
1. 衡量结账步骤
对于结账流程中的每一步,您都需要实现相应的跟踪代码,以便向 Google Analytics(分析)发送数据。
Step
字段
对于要衡量的每一个结账步骤,您都应添加 step
值。此值用于将结账操作映射到您在电子商务设置 中为每个步骤配置的标签。
注意 :如果您的结账流程只有一步,或是您没有在电子商务设置 中配置结账漏斗,则可以不设置 step
字段。
Option
字段
在衡量某个指定结账步骤时,如果您有关于此步骤的更多信息,则可为 option
字段设置 checkout
操作,以捕获此信息,例如用户的默认付款方式(如“Visa”)。
衡量某个结账步骤
如需衡量某个结账步骤,请使用 addProduct
方法和 Product
对象添加商品详情,并使用 setProductAction
方法和 ProductAction
对象指示结账操作。如果适用,还可以为结账设置 step
和 option
。
下例显示了如何衡量结账流程的第一步(涉及一个产品以及关于付款方式的额外信息):
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("black")
.setPrice(29.20)
.setQuantity(1);
// Add the step number and additional info about the checkout to the action.
ProductAction productAction = new ProductAction(ProductAction.ACTION_CHECKOUT)
.setCheckoutStep(1)
.setCheckoutOptions("Visa");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("checkoutStep1");
t.send(builder.build());
2. 衡量结账选项
结账选项可让您衡量关于结账状态的额外信息。有时您已经衡量了某个结账步骤,但在用户设置了选项之后,关于此步骤有了新的额外信息,在这种情况下,结账选项就可以派上用场。例如,用户选择了配送方式。
如需衡量某个结账选项,请使用 setAction
来指示某个结账选项,并加入步骤序号和选项说明信息。
您很可能希望在用户执行特定操作进入结账流程中的下一步时衡量此操作。例如:
// (On "Next" button click.)
ProductAction productAction = new ProductAction(ProductAction.ACTION_CHECKOUT_OPTIONS)
.setCheckoutStep(1)
.setCheckoutOptions("FedEx");
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
.setProductAction(productAction)
.setCategory("Checkout")
.setAction("Option");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.send(builder.build());
// Advance to next page.
3. 结账漏斗配置
您可以为结账流程中的每一步指定一个描述性的名称,以在报告中使用。要配置此类名称,请转到 Google Analytics(分析)网络界面的管理 部分,选择相应数据视图(配置文件),然后点击电子商务设置 。请按照相应电子商务设置说明,为要跟踪的每个结账步骤设置标签。
注意 :如果您不配置结账步骤名称,它们将直接显示为第 1 步、第 2 步、第 3 步等。
图 1 :电子商务设置 - 结账漏斗
增强型电子商务功能支持对内部促销信息的展示次数和点击次数进行衡量,例如对促销活动进行宣传的横幅。
内部推广活动的展示一般在初始屏幕浏览期间衡量,方法是使用 addPromotion
方法和 Promotion
对象指定推广活动的详情。例如:
Promotion promotion = new Promotion()
.setId("PROMO_1234")
.setName("Summer Sale")
.setCreative("summer_banner2")
.setPosition("banner_slot1");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addPromotion(promotion);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("promotions");
t.send(builder.build());
重要提示 :虽然可以为促销信息展示设置操作,但该操作不能是促销信息点击操作。如果您要衡量促销信息点击操作,应在促销信息展示之后,在单独的命中中衡量该操作。
内部推广活动的点击可以通过使用 addPromotion
方法并具有 Promotion
对象,并将 setPromotionAction
方法设置为 Promotion.ACTION_CLICK
或 Promotion.ACTION_VIEW
(分别表示推广活动的点击或查看)来衡量。例如:
Promotion promotion = new Promotion()
.setId("PROMO_1234")
.setName("Summer Sale")
.setCreative("summer_banner2")
.setPosition("banner_slot1");
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
.addPromotion(promotion)
.setPromotionAction(Promotion.ACTION_CLICK)
.setCategory("Internal Promotions")
.setAction("click")
.setLabel("Summer Sale");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.send(builder.build());
来自样本应用的参考代码段
以下代码段显示了一个完整的增强型电子商务示例:
package com.google.android.apps.mobileplayground;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import com.google.android.apps.mobileplayground.AnalyticsSampleApp.TrackerName;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.google.android.gms.analytics.ecommerce.Product;
import com.google.android.gms.analytics.ecommerce.ProductAction;
import com.google.android.gms.analytics.ecommerce.Promotion;
/**
* Class to exercise Enhanced Ecommerce hits.
*/
public class EnhancedEcommerceFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.enhanced_ecommerce, container, false);
Button button = (Button) view.findViewById(R.id.enhancedEcommerceImpression);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureImpression();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceAction);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureAction();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceImpressionAndAction);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureImpressionAndAction();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceTransaction);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureTransaction();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceRefundTransaction);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureRefundTransaction();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceRefundProduct);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureRefundProduct();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceRefundNonInteraction);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureRefundNonInteraction();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceCheckoutStep);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureCheckoutStep();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommerceCheckoutOption);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureCheckoutOption();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommercePromotionImpression);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measurePromotionImpression();
}
});
button = (Button) view.findViewById(R.id.enhancedEcommercePromotionClick);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measurePromotionClick();
}
});
return view;
}
private void measureImpression() {
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("Black")
.setPosition(1)
.setCustomDimension(1, "Member");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addImpression(product, "Search Results");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("searchResults");
t.send(builder.build());
}
private void measureAction() {
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("Black")
.setPosition(1)
.setCustomDimension(1, "Member");
ProductAction productAction = new ProductAction(ProductAction.ACTION_CLICK)
.setProductActionList("Search Results");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("searchResults");
t.send(builder.build());
}
private void measureImpressionAndAction() {
// The product from a related products section.
Product relatedProduct = new Product()
.setId("P12346")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("White")
.setPosition(1);
// The product being viewed.
Product viewedProduct = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("Black")
.setPosition(1);
ProductAction productAction = new ProductAction(ProductAction.ACTION_DETAIL);
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addImpression(relatedProduct, "Related Products")
.addProduct(viewedProduct)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("product");
t.send(builder.build());
}
private void measureTransaction() {
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("black")
.setPrice(29.20)
.setCouponCode("APPARELSALE")
.setQuantity(1);
ProductAction productAction = new ProductAction(ProductAction.ACTION_PURCHASE)
.setTransactionId("T12345")
.setTransactionAffiliation("Google Store - Online")
.setTransactionRevenue(37.39)
.setTransactionTax(2.85)
.setTransactionShipping(5.34)
.setTransactionCouponCode("SUMMER2013");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("transaction");
t.send(builder.build());
}
private void measureRefundTransaction() {
// Refund an entire transaction.
ProductAction productAction = new ProductAction(ProductAction.ACTION_REFUND)
.setTransactionId("T12345"); // Transaction ID is only required field for a full refund.
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("refund");
t.send(builder.build());
}
private void measureRefundProduct() {
// Refund a single product.
Product product = new Product()
.setId("P12345") // Product ID is required for partial refund.
.setQuantity(1); // Quanity is required for partial refund.
ProductAction productAction = new ProductAction(ProductAction.ACTION_REFUND)
.setTransactionId("T12345"); // Transaction ID is required for partial refund.
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("refundProduct");
t.send(builder.build());
}
private void measureRefundNonInteraction() {
// Refund an entire transaction.
ProductAction productAction = new ProductAction(ProductAction.ACTION_REFUND)
.setTransactionId("T12345");
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
.setProductAction(productAction)
.setNonInteraction(true)
.setCategory("Ecommerce")
.setAction("Refund");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.send(builder.build());
}
private void measureCheckoutStep() {
Product product = new Product()
.setId("P12345")
.setName("Android Warhol T-Shirt")
.setCategory("Apparel/T-Shirts")
.setBrand("Google")
.setVariant("black")
.setPrice(29.20)
.setQuantity(1);
// Add the step number and additional info about the checkout to the action.
ProductAction productAction = new ProductAction(ProductAction.ACTION_CHECKOUT)
.setCheckoutStep(1)
.setCheckoutOptions("Visa");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addProduct(product)
.setProductAction(productAction);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("checkoutStep1");
t.send(builder.build());
}
private void measureCheckoutOption() {
// (On "Next" button click.)
ProductAction productAction = new ProductAction(ProductAction.ACTION_CHECKOUT_OPTIONS)
.setCheckoutStep(1)
.setCheckoutOptions("FedEx");
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
.setProductAction(productAction)
.setCategory("Checkout")
.setAction("Option");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.send(builder.build());
// Advance to next page.
}
private void measurePromotionImpression() {
Promotion promotion = new Promotion()
.setId("PROMO_1234")
.setName("Summer Sale")
.setCreative("summer_banner2")
.setPosition("banner_slot1");
HitBuilders.ScreenViewBuilder builder = new HitBuilders.ScreenViewBuilder()
.addPromotion(promotion);
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.setScreenName("promotions");
t.send(builder.build());
}
private void measurePromotionClick() {
Promotion promotion = new Promotion()
.setId("PROMO_1234")
.setName("Summer Sale")
.setCreative("summer_banner2")
.setPosition("banner_slot1");
HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder()
.addPromotion(promotion)
.setPromotionAction(Promotion.ACTION_CLICK)
.setCategory("Internal Promotions")
.setAction("click")
.setLabel("Summer Sale");
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
TrackerName.APP_TRACKER);
t.send(builder.build());
}
}