このドキュメントでは、Android 向け Google アナリティクス SDK v4 を使って、アプリ内の決済と収益を測定する方法の概要を説明します。
概要
e コマースの測定では、アプリ内購入と売上のデータを Google アナリティクスに送信できます。Google アナリティクスの e コマースデータにはトランザクションとアイテムのヒットが含まれ、それぞれが共通のトランザクション ID で結び付けられます。
トランザクションには次のフィールドがあります。
フィールド名 |
型 |
必須 |
説明 |
Transaction ID |
String |
必須 |
トランザクションを表す固有の ID です。他のトランザクション ID と重ならないようにしてください。 |
Affiliation |
String |
必須 |
トランザクションに関わる当事者です(特定のショップなど)。 |
Revenue |
Double |
必須 |
トランザクションの収益の合計額です(税金と送料を含む)。 |
Tax |
Double |
必須 |
トランザクションに伴う税金の合計額です。 |
Shipping |
Double |
必須 |
トランザクションに伴う送料の合計額です。 |
Currency code |
String |
いいえ |
トランザクションで使用されるローカル通貨です。デフォルトでは、そのトランザクション データが表示される
ビュー(旧プロファイル)の通貨になります。 |
アイテムには次のフィールドがあります。
フィールド名 |
型 |
必須 |
説明 |
Transaction ID |
String |
必須 |
アイテムに関連するトランザクション ID です。 |
Name |
String |
必須 |
商品の名前です。 |
SKU |
String |
必須 |
商品の SKU です。 |
Category |
String |
いいえ |
商品が属するカテゴリです。 |
Price |
Double |
必須 |
商品の価格です。 |
Quantity |
Long |
必須 |
商品の数量です。 |
Currency code |
String |
いいえ |
トランザクションで使用されるローカル通貨です。デフォルトでは、そのトランザクション データが表示されるビュー(旧プロファイル)の通貨になります。 |
e コマースデータは、主に次の標準レポートで使用されます。
- e コマースの概要
- 商品の販売状況
- 販売実績
- トランザクション
- 購入までの間隔
実装
Google アナリティクスにトランザクションとアイテムのデータを送るには、TransactionBuilder
と ItemBuilder
を使用します。これらの e コマース フィールドは、ヘルパー メソッドを使って設定します。次の例をご覧ください。
// 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);
}
getTracker
メソッドの詳細については、高度な設定の説明をご覧ください。
サンプルアプリのコード スニペット
次のコード スニペットは、e コマースの全機能を網羅したサンプルです。
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);
}
}
e コマースの通貨フィールドは負の値に対応しています。払い戻しや返品で必要となる
場合があるためです。
通貨の指定
デフォルトでは、トランザクションの値は表示されるビュー(旧プロファイル)の通貨と
みなされます。
トランザクションとその商品のローカル通貨を上書きするには、
トランザクションとアイテムのヒットの通貨コード フィールドに
新しい通貨コードを設定します。サポートされている通貨と通貨コードの一覧については、利用可能な通貨のリファレンスをご覧ください。