এই দস্তাবেজটি Android এর জন্য Google Analytics SDK v4 ব্যবহার করে অ্যাপ-মধ্যস্থ অর্থপ্রদান এবং আয় কীভাবে পরিমাপ করতে হয় তার একটি ওভারভিউ প্রদান করে।
ওভারভিউ ইকমার্স পরিমাপ আপনাকে Google Analytics-এ অ্যাপ-মধ্যস্থ কেনাকাটা এবং বিক্রয় পাঠাতে দেয়। Google Analytics-এ ইকমার্স ডেটা লেনদেন এবং আইটেম হিট নিয়ে গঠিত, একটি শেয়ার করা লেনদেন আইডি দ্বারা সম্পর্কিত।
লেনদেনের নিম্নলিখিত ক্ষেত্র রয়েছে:
ক্ষেত্র নাম টাইপ প্রয়োজন বর্ণনা লেনদেন নাম্বার String
হ্যাঁ লেনদেনের প্রতিনিধিত্বকারী একটি অনন্য আইডি। এই আইডিটি অন্য লেনদেন আইডিগুলির সাথে সংঘর্ষ করা উচিত নয়। অধিভুক্তি String
হ্যাঁ একটি সত্তা যার সাথে লেনদেনটি অনুমোদিত হওয়া উচিত (যেমন একটি নির্দিষ্ট দোকান) রাজস্ব Double
হ্যাঁ ট্যাক্স এবং শিপিং সহ একটি লেনদেনের মোট আয় ট্যাক্স Double
হ্যাঁ একটি লেনদেনের জন্য মোট কর পাঠানো Double
হ্যাঁ একটি লেনদেনের জন্য শিপিংয়ের মোট খরচ মুদ্রা কোড String
না একটি লেনদেনের স্থানীয় মুদ্রা। যে ভিউ (প্রোফাইল) এর মুদ্রায় ডিফল্ট যা লেনদেনগুলি দেখা হচ্ছে৷
আইটেমগুলির নিম্নলিখিত ক্ষেত্র রয়েছে:
ক্ষেত্র নাম টাইপ প্রয়োজন বর্ণনা লেনদেন নাম্বার String
হ্যাঁ লেনদেন আইডি যার সাথে আইটেমটি যুক্ত করা উচিত নাম String
হ্যাঁ পণ্যের নাম এসকেইউ String
হ্যাঁ একটি পণ্যের SKU শ্রেণী String
না পণ্যটি অন্তর্গত একটি বিভাগ দাম Double
হ্যাঁ একটি পণ্যের দাম পরিমাণ Long
হ্যাঁ একটি পণ্যের পরিমাণ মুদ্রা কোড String
না একটি লেনদেনের স্থানীয় মুদ্রা। যে ভিউ (প্রোফাইল) এর মুদ্রার ডিফল্ট যেখানে লেনদেন রিপোর্ট করা হয়
নিম্নলিখিত স্ট্যান্ডার্ড রিপোর্টে প্রাথমিকভাবে ইকমার্স ডেটা ব্যবহার করা হয়:
ইকমার্স ওভারভিউ পণ্য কর্মক্ষমতা বিক্রয় কর্মক্ষমতা লেনদেন ক্রয় করার সময় বাস্তবায়ন TransactionBuilder
এবং ItemBuilder
Google Analytics-এ লেনদেন এবং আইটেম ডেটা পাঠাতে ব্যবহৃত হয়। প্রতিটি ইকমার্স ক্ষেত্র সহায়ক পদ্ধতি ব্যবহার করে সেট করা হয়। উদাহরণ স্বরূপ:
// 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
পদ্ধতির বিস্তারিত জানার জন্য উন্নত কনফিগারেশন দেখুন।
নমুনা অ্যাপ্লিকেশন থেকে একটি কোড স্নিপেট দেখুন নিম্নলিখিত স্নিপেট একটি সম্পূর্ণ ইকমার্স উদাহরণ দেখায়:
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);
}
}
ইকমার্স কারেন্সি ফিল্ড নেতিবাচক মুদ্রার মানকে সমর্থন করে, যেমনটি রিফান্ড বা রিটার্নের ক্ষেত্রে প্রয়োজন হতে পারে।
সতর্কতা: মুদ্রার ক্ষেত্রে মুদ্রার প্রতীক বা কমা অন্তর্ভুক্ত করবেন না। মুদ্রা নির্দিষ্ট করা ডিফল্টরূপে, লেনদেনের মানগুলি যে ভিউ (প্রোফাইল) এর মুদ্রায় বলে ধরে নেওয়া হয় যেখানে সেগুলি রিপোর্ট করা হয়েছে৷
একটি লেনদেনের স্থানীয় মুদ্রা এবং যেকোনো সংশ্লিষ্ট পণ্যকে ওভাররাইড করতে, লেনদেনের কারেন্সি কোড ফিল্ড সেট করুন এবং নতুন কারেন্সি কোডের সাথে আইটেম হিট করুন। সমর্থিত মুদ্রা এবং মুদ্রা কোডের সম্পূর্ণ তালিকার জন্য, সমর্থিত মুদ্রার রেফারেন্স দেখুন।