Tài liệu này cung cấp thông tin tổng quan về cách đo lường doanh thu và khoản thanh toán trong ứng dụng bằng Google Analytics SDK phiên bản 4 dành cho Android.
Tổng quan
Tính năng đo lường thương mại điện tử cho phép bạn gửi các lượt mua hàng trong ứng dụng và
lượt bán hàng đến Google Analytics. Dữ liệu thương mại điện tử trong Google Analytics
bao gồm các lượt truy cập giao dịch và mặt hàng, có liên quan với một mã giao dịch được chia sẻ.
Giao dịch có các trường sau:
Tên trường
Loại
Bắt buộc
Nội dung mô tả
Mã giao dịch
String
Có
Mã nhận dạng duy nhất đại diện cho giao dịch. Mã nhận dạng này không được trùng
với các mã giao dịch khác.
Đơn vị liên kết
String
Có
Pháp nhân mà giao dịch phải được liên kết (ví dụ: một cửa hàng cụ thể)
Doanh thu
Double
Có
Tổng doanh thu của một giao dịch, bao gồm cả thuế và phí giao hàng
Thuế
Double
Có
Tổng thuế của một giao dịch
Vận chuyển
Double
Có
Tổng chi phí vận chuyển cho một giao dịch
Mã đơn vị tiền tệ
String
Không
Nội tệ của một giao dịch. Giá trị mặc định là đơn vị tiền tệ của
chế độ xem (hồ sơ) mà người dùng sử dụng để xem các giao dịch.
Mục có các trường sau đây:
Tên trường
Loại
Bắt buộc
Nội dung mô tả
Mã giao dịch
String
Có
Mã giao dịch cần liên kết với mặt hàng
Tên
String
Có
Tên sản phẩm
SKU
String
Có
SKU của sản phẩm
Danh mục
String
Không
Danh mục chứa sản phẩm
Giá
Double
Có
Giá của một sản phẩm
Số lượng
Long
Có
Số lượng của một sản phẩm
Mã đơn vị tiền tệ
String
Không
Nội tệ của một giao dịch. Mặc định là đơn vị tiền tệ của chế độ xem (hồ sơ) mà các giao dịch được báo cáo
Dữ liệu thương mại điện tử được dùng chính trong các báo cáo chuẩn sau:
Tổng quan về thương mại điện tử
Hiệu suất sản phẩm
Hiệu suất bán hàng
Giao dịch
Thời gian mua hàng
Triển khai
TransactionBuilder
và ItemBuilder
được dùng để
gửi dữ liệu giao dịch và mặt hàng đến Google Analytics. Mỗi trường thương mại điện tử sẽ được thiết lập bằng các phương thức trợ giúp. Ví dụ:
// Build the transaction.
sendDataToTwoTrackers(new HitBuilders.TransactionBuilder()
.setTransactionId(getOrderId())
.setAffiliation(getStoreName())
.setRevenue(getTotalOrder())
.setTax(getTotalTax())
.setShipping(getShippingCost())
.setCurrencyCode("USD")
.build());
// Build an item.
sendDataToTwoTrackers(new HitBuilders.ItemBuilder()
.setTransactionId(getOrderId())
.setName(getItemName(1))
.setSku(getItemSku(1))
.setCategory(getItemCategory(1))
.setPrice(getItemPrice(getView(), 1))
.setQuantity(getItemQuantity(getView(), 1))
.setCurrencyCode("USD")
.build());
// Sends the ecommerce data.
private void sendDataToTwoTrackers(Map<String, String> params) {
AnalyticsSampleApp app = ((AnalyticsSampleApp) getActivity().getApplication());
Tracker appTracker = app.getTracker(TrackerName.APP_TRACKER);
Tracker ecommerceTracker = app.getTracker(TrackerName.ECOMMERCE_TRACKER);
appTracker.send(params);
ecommerceTracker.send(params);
}
Xem phần
Cấu hình nâng cao để biết thông tin chi tiết về phương thức getTracker
.
Xem đoạn mã từ ứng dụng mẫu
Đoạn mã sau đây cho thấy một ví dụ đầy đủ về thương mại điện tử:
package com.google.android.apps.mobileplayground;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.apps.mobileplayground.AnalyticsSampleApp.TrackerName;
import com.google.android.apps.mobileplayground.MobilePlayground.UserInputException;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import java.util.Map;
/**
* Class to exercise Ecommerce hits.
*/
public class EcommerceFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.ecommerce, container, false);
setUniqueOrderId(view);
calculate(view);
setupAutoCalculate(view, R.id.item1Quantity);
setupAutoCalculate(view, R.id.item1Price);
setupAutoCalculate(view, R.id.item2Quantity);
setupAutoCalculate(view, R.id.item2Price);
final Button sendButton = (Button) view.findViewById(R.id.ecommerceSend);
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sendEcommerce();
}
});
final Button dispatchButton = (Button) view.findViewById(R.id.ecommerceDispatch);
dispatchButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Manually start a dispatch (Unnecessary if the tracker has a dispatch interval).
GoogleAnalytics.getInstance(getActivity().getBaseContext()).dispatchLocalHits();
}
});
return view;
}
private void sendEcommerce() {
try {
// Build the transaction.
sendDataToTwoTrackers(new HitBuilders.TransactionBuilder()
.setTransactionId(getOrderId())
.setAffiliation(getStoreName())
.setRevenue(getTotalOrder())
.setTax(getTotalTax())
.setShipping(getShippingCost())
.setCurrencyCode("USD")
.build());
// Build an item.
sendDataToTwoTrackers(new HitBuilders.ItemBuilder()
.setTransactionId(getOrderId())
.setName(getItemName(1))
.setSku(getItemSku(1))
.setCategory(getItemCategory(1))
.setPrice(getItemPrice(getView(), 1))
.setQuantity(getItemQuantity(getView(), 1))
.setCurrencyCode("USD")
.build());
sendDataToTwoTrackers(new HitBuilders.ItemBuilder()
.setTransactionId(getOrderId())
.setName(getItemName(2))
.setSku(getItemSku(2))
.setCategory(getItemCategory(2))
.setPrice(getItemPrice(getView(), 2))
.setQuantity(getItemQuantity(getView(), 2))
.setCurrencyCode("USD")
.build());
} catch (UserInputException e) {
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
setUniqueOrderId(getView());
}
private void sendDataToTwoTrackers(Map<String, String> params) {
AnalyticsSampleApp app = ((AnalyticsSampleApp) getActivity().getApplication());
Tracker appTracker = app.getTracker(TrackerName.APP_TRACKER);
Tracker ecommerceTracker = app.getTracker(TrackerName.ECOMMERCE_TRACKER);
appTracker.send(params);
ecommerceTracker.send(params);
}
private double calculate(View view) {
double item1Total = getItemQuantity(view, 1) * getItemPrice(view, 1);
((TextView) view.findViewById(R.id.item1Total)).setText(Double.toString(item1Total));
double item2Total = getItemQuantity(view, 2) * getItemPrice(view, 2);
((TextView) view.findViewById(R.id.item2Total)).setText(Double.toString(item2Total));
double itemTotal = item1Total + item2Total;
((TextView) view.findViewById(R.id.itemTotal)).setText(Double.toString(itemTotal));
return itemTotal;
}
private void setUniqueOrderId(View view) {
final EditText orderIdButton = (EditText) view.findViewById(R.id.orderId);
orderIdButton.setText(getString(R.string.orderId) + System.currentTimeMillis());
}
private void setupAutoCalculate(View view, int editTextId) {
final EditText editText = (EditText) view.findViewById(editTextId);
editText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
calculate(getView());
return false;
}
});
}
private String getStoreName() {
String storeName =
((EditText) getView().findViewById(R.id.storeName)).getText().toString().trim();
if (storeName.length() == 0) {
return null;
}
return storeName;
}
private String getOrderId() throws UserInputException {
String orderId = ((EditText) getView().findViewById(R.id.orderId)).getText().toString().trim();
if (orderId.length() == 0) {
throw new UserInputException(getString(R.string.orderIdWarning));
}
return orderId;
}
private double getTotalOrder() {
String total = ((TextView) getView().findViewById(R.id.itemTotal)).getText().toString().trim();
if (total.length() == 0) {
return 0;
}
return Double.valueOf(total);
}
private double getTotalTax() {
String tax = ((EditText) getView().findViewById(R.id.totalTax)).getText().toString().trim();
if (tax.length() == 0) {
return 0;
}
return Double.valueOf(tax);
}
private double getShippingCost() {
String shipping =
((EditText) getView().findViewById(R.id.shippingCost)).getText().toString().trim();
if (shipping.length() == 0) {
return 0;
}
return Double.valueOf(shipping);
}
private String getItemName(int index) {
int buttonId = index == 1 ? R.id.item1Name : R.id.item2Name;
String name = ((EditText) getView().findViewById(buttonId)).getText().toString().trim();
if (name.length() == 0) {
return null;
}
return name;
}
private String getItemCategory(int index) {
int buttonId = index == 1 ? R.id.item1Category : R.id.item2Category;
String name = ((EditText) getView().findViewById(buttonId)).getText().toString().trim();
if (name.length() == 0) {
return null;
}
return name;
}
private String getItemSku(int index) throws UserInputException {
int buttonId = index == 1 ? R.id.item1Sku : R.id.item2Sku;
String sku = ((EditText) getView().findViewById(buttonId)).getText().toString().trim();
if (sku.length() == 0) {
int warningId = index == 1 ? R.string.item1SkuWarning : R.string.item2SkuWarning;
throw new UserInputException(getString(warningId));
}
return sku;
}
private long getItemQuantity(View view, int index) {
int buttonId = index == 1 ? R.id.item1Quantity : R.id.item2Quantity;
String quantity = ((EditText) view.findViewById(buttonId)).getText().toString().trim();
if (quantity.length() == 0) {
return 0;
}
return Long.valueOf(quantity);
}
private double getItemPrice(View view, int index) {
int buttonId = index == 1 ? R.id.item1Price : R.id.item2Price;
String price = ((EditText) view.findViewById(buttonId)).getText().toString().trim();
if (price.length() == 0) {
return 0;
}
return Double.valueOf(price);
}
}
Các trường đơn vị tiền tệ thương mại điện tử hỗ trợ giá trị đơn vị tiền tệ âm, có thể là cần thiết trong trường hợp hoàn tiền hoặc trả lại hàng.
Thận trọng: Đừng dùng ký hiệu tiền tệ hoặc dấu phẩy trong trường đơn vị tiền tệ.
Chỉ định đơn vị tiền tệ
Theo mặc định, giá trị giao dịch được giả định bằng đơn vị tiền tệ
của chế độ xem (hồ sơ) mà giá trị đó được báo cáo.
Để ghi đè nội tệ của một giao dịch và mọi sản phẩm được liên kết,
hãy đặt trường mã đơn vị tiền tệ của các lượt truy cập giao dịch và mặt hàng bằng
mã đơn vị tiền tệ mới. Để biết danh sách đầy đủ các đơn vị tiền tệ và mã đơn vị tiền tệ được hỗ trợ, hãy xem
Tài liệu tham khảo về đơn vị tiền tệ được hỗ trợ .