Παρακολούθηση E-Commerce
Τα Joryio SDK περιλαμβάνουν ενσωματωμένη παρακολούθηση e-commerce για αλληλεπίδραση με προϊόντα, δραστηριότητα καλαθιού και αγορές. Ο tracker λειτουργεί με τον ίδιο τρόπο σε κάθε πλατφόρμα: ίδιες μέθοδοι, ίδια τυπικά ονόματα συμβάντων και ίδια σημασιολογία ιδιοτήτων - διαφέρει μόνο η σύνταξη της γλώσσας.
Επιλέξτε την πλατφόρμα σας σε οποιοδήποτε παράδειγμα κώδικα παρακάτω· η επιλογή συγχρονίζεται σε όλη τη σελίδα. Για εγκατάσταση και ρυθμίσεις, δείτε τους οδηγούς πλατφόρμας: Web SDK, iOS SDK, Android SDK, React Native SDK. Το React Native δεν διαθέτει αποκλειστικό tracker - η καρτέλα του δείχνει τις ισοδύναμες κλήσεις Joryio.track() (δείτε React Native παρακάτω).
Σύμβαση ονοματοδοσίας ID
Το Joryio χρησιμοποιεί σαφή σύμβαση ονοματοδοσίας για αναγνωριστικά:
| Το ID σας | Περιγραφή | Παράδειγμα |
|---|---|---|
productId | Αναγνωριστικό προϊόντος (SKU ή ID προϊόντος από την πλατφόρμα e-commerce σας) | "SKU-12345" |
orderId | Αναγνωριστικό παραγγελίας (αριθμός παραγγελίας από την πλατφόρμα σας) | "ORD-2024-001" |
userId | Αναγνωριστικό χρήστη (περνά στο identify()) | "user-123" |
Χρησιμοποιήστε τα δικά σας αναγνωριστικά φυσικά - δεν απαιτούνται ειδικά προθέματα.
Αρχικοποίηση του E-Commerce Tracker
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Get the e-commerce tracker from your SDK instance
// (joryio is the instance created with `new JoryioSDK({ sdkKey: ... })`)
const ecommerce = joryio.ecommerce({
currency: 'USD' // Default currency for all events
});
// Get the e-commerce tracker with default currency
let ecommerce = Joryio.shared.ecommerce(config: EcommerceConfig(currency: "USD"))
import io.joryio.sdk.ecommerce.*
// Get the e-commerce tracker with default currency
val ecommerce = Joryio.getInstance().ecommerce(EcommerceConfig(currency = "USD"))
// The React Native SDK has a typed e-commerce tracker, same as web, iOS and
// Android. Use it rather than Joryio.track() with hand-written names: it
// applies the platform's canonical event names and property keys for you, and
// a name that is close but not exact is stored verbatim and matches no report.
import Joryio from '@joryio/react-native-sdk';
const product = {
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
category: 'Clothing/T-Shirts',
brand: 'Acme Apparel',
imageUrl: 'https://example.com/images/blue-tshirt.jpg',
url: 'https://example.com/products/blue-tshirt',
};
Παρακολούθηση προβολών προϊόντων και αναζήτησης
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// When user views a product page
ecommerce.viewProduct({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
category: 'Clothing/T-Shirts',
brand: 'Acme Apparel',
imageUrl: 'https://example.com/images/blue-tshirt.jpg',
url: 'https://example.com/products/blue-tshirt'
});
// When user views a category page
ecommerce.viewCategory('tshirts', 'T-Shirts');
// When user searches
ecommerce.search('blue shirts', 42); // query, result count
// Track product view
let product = EcommerceProduct(
productId: "SKU-12345",
name: "Classic Blue T-Shirt",
price: 29.99,
category: "Clothing",
brand: "Acme Apparel",
variant: "Size M",
sku: "BTS-001-M"
)
ecommerce.viewProduct(product)
// Track category view
ecommerce.viewCategory(categoryId: "cat_123", categoryName: "T-Shirts", properties: [
"sort_by": "popularity"
])
// Track product search
ecommerce.search(query: "blue shirts", resultCount: 42)
// Track product view
val product = EcommerceProduct(
productId = "SKU-12345",
name = "Classic Blue T-Shirt",
price = 29.99,
category = "Clothing",
brand = "Acme Apparel",
variant = "Size M",
sku = "BTS-001-M"
)
ecommerce.viewProduct(product)
// Track category view
ecommerce.viewCategory(
categoryId = "cat_123",
categoryName = "T-Shirts",
properties = mapOf("sort_by" to "popularity")
)
// Track product search
ecommerce.search(query = "blue shirts", resultCount = 42)
// When user views a product page
Joryio.ecommerce.viewProduct(product);
// When user views a category page
Joryio.ecommerce.viewCategory('tshirts', 'T-Shirts');
// When user searches
Joryio.ecommerce.search('blue shirts', 42);
Παρακολούθηση δραστηριότητας καλαθιού
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Add item to cart
ecommerce.addToCart({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
quantity: 1,
variantId: 'var-medium',
sku: 'BTS-001-M'
}, 59.98); // Optional: current cart value
// Remove item from cart
ecommerce.removeFromCart({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99
}, 1); // quantity to remove
// Update entire cart
ecommerce.updateCart([
{ productId: 'SKU-12345', name: 'Blue T-Shirt', price: 29.99, quantity: 2 },
{ productId: 'SKU-67890', name: 'Black Jeans', price: 49.99, quantity: 1 }
], 109.97); // items array, total cart value
// Add item to cart
let cartItem = EcommerceCartItem(
productId: "SKU-12345",
name: "Classic Blue T-Shirt",
price: 29.99,
quantity: 2,
category: "Clothing"
)
ecommerce.addToCart(item: cartItem, cartValue: 59.98)
// Remove from cart
ecommerce.removeFromCart(product: product, quantity: 1)
// Update cart
ecommerce.updateCart(items: [cartItem1, cartItem2], cartValue: 89.97)
// Add item to cart
val cartItem = EcommerceCartItem(
productId = "SKU-12345",
name = "Classic Blue T-Shirt",
price = 29.99,
quantity = 2,
category = "Clothing"
)
ecommerce.addToCart(item = cartItem, cartValue = 59.98)
// Remove from cart
ecommerce.removeFromCart(product = product, quantity = 1)
// Update cart
ecommerce.updateCart(items = listOf(cartItem1, cartItem2), cartValue = 89.97)
// Add item to cart
Joryio.ecommerce.addToCart({...product, quantity: 2}, 59.98);
// Remove item from cart
Joryio.ecommerce.removeFromCart(product, 1);
// Cart contents changed
Joryio.ecommerce.updateCart([{...product, quantity: 2}], 59.98);
Παρακολούθηση ροής checkout
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// When user starts checkout
ecommerce.startCheckout([
{ productId: 'SKU-12345', name: 'Blue T-Shirt', price: 29.99, quantity: 2 },
{ productId: 'SKU-67890', name: 'Black Jeans', price: 49.99, quantity: 1 }
], 109.97); // items, cart value
// When user adds payment info
ecommerce.addPaymentInfo('credit_card');
// Start checkout
ecommerce.startCheckout(items: cartItems, cartValue: 59.98)
// Add payment info
ecommerce.addPaymentInfo(paymentMethod: "credit_card", properties: [
"card_type": "visa"
])
// Start checkout
ecommerce.startCheckout(items = cartItems, cartValue = 59.98)
// Add payment info
ecommerce.addPaymentInfo(paymentMethod = "credit_card", properties = mapOf(
"card_type" to "visa"
))
// When user starts checkout
Joryio.ecommerce.startCheckout([{...product, quantity: 2}], 65.97);
// When payment details are entered
Joryio.ecommerce.addPaymentInfo('credit_card');
Παρακολούθηση αγορών
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// When order is completed
ecommerce.purchase({
orderId: 'ORD-2024-001',
items: [
{
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
quantity: 2,
category: 'Clothing',
brand: 'Acme'
},
{
productId: 'SKU-67890',
name: 'Black Jeans',
price: 49.99,
quantity: 1
}
],
value: 109.97,
currency: 'USD',
shipping: 5.99,
tax: 8.80,
discount: 10.00,
coupon: 'SAVE10'
});
// Complete purchase
let order = EcommerceOrder(
orderId: "ORD-2024-001",
items: cartItems,
value: 59.98,
currency: "USD",
shipping: 5.99,
tax: 4.80,
discount: 10.00,
coupon: "SAVE10"
)
ecommerce.purchase(order: order)
// Complete purchase
val order = EcommerceOrder(
orderId = "ORD-2024-001",
items = cartItems,
value = 59.98,
currency = "USD",
shipping = 5.99,
tax = 4.80,
discount = 10.00,
coupon = "SAVE10"
)
ecommerce.purchase(order)
// When order is completed.
//
// `value` here is the ORDER OBJECT's field name; the tracker sends it as the
// `total` property the revenue pipeline reads. Sending a raw event with
// `value` instead would record the order at $0 - there is deliberately no
// alias layer, so a near-miss is stored verbatim and read by nothing.
Joryio.ecommerce.purchase({
orderId: 'ORD-2024-001',
items: [
{productId: 'SKU-12345', name: 'Classic Blue T-Shirt', price: 29.99, quantity: 2},
{productId: 'SKU-67890', name: 'Black Jeans', price: 49.99, quantity: 1},
],
value: 109.97,
currency: 'USD',
shipping: 5.99,
tax: 8.8,
discount: 10.0,
coupon: 'SAVE10',
});
Η μέθοδος purchase() απαιτεί να περάσετε ρητά τα προϊόντα της παραγγελίας. Το SDK δεν αποθηκεύει την κατάσταση καλαθιού στον client ούτε αντλεί αυτόματα προϊόντα από το καταγεγραμμένο καλάθι ή τον διακομιστή. Αυτό εξασφαλίζει ακρίβεια, επειδή η σελίδα ή η οθόνη επιβεβαίωσης παραγγελίας γνωρίζει τα ακριβή προϊόντα που αγοράστηκαν.
Παρακολούθηση αλλαγών κατάστασης παραγγελίας
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Order shipped
ecommerce.orderFulfilled('ORD-2024-001', '1Z999AA10123456784', 'UPS');
// Order delivered
ecommerce.orderDelivered('ORD-2024-001');
// Order cancelled
ecommerce.orderCancelled('ORD-2024-001', 'Customer requested');
// Order refunded
ecommerce.orderRefunded('ORD-2024-001', 29.99, 'Product defective');
// Order fulfilled (shipped)
ecommerce.orderFulfilled(orderId: "ORD-2024-001", trackingNumber: "1Z999AA10123456784", carrier: "UPS")
// Order delivered
ecommerce.orderDelivered(orderId: "ORD-2024-001")
// Order cancelled
ecommerce.orderCancelled(orderId: "ORD-2024-001", reason: "Customer requested cancellation")
// Order refunded
ecommerce.orderRefunded(orderId: "ORD-2024-001", refundAmount: 29.99, reason: "Product defective")
// Order fulfilled (shipped)
ecommerce.orderFulfilled(orderId = "ORD-2024-001", trackingNumber = "1Z999AA10123456784", carrier = "UPS")
// Order delivered
ecommerce.orderDelivered(orderId = "ORD-2024-001")
// Order cancelled
ecommerce.orderCancelled(orderId = "ORD-2024-001", reason = "Customer requested cancellation")
// Order refunded
ecommerce.orderRefunded(orderId = "ORD-2024-001", refundAmount = 29.99, reason = "Product defective")
// Order shipped
Joryio.ecommerce.orderFulfilled('ORD-2024-001', '1Z999AA10123456784', 'UPS');
// Order delivered
Joryio.ecommerce.orderDelivered('ORD-2024-001');
// Order cancelled or refunded
Joryio.ecommerce.orderCancelled('ORD-2024-001', 'customer_request');
Joryio.ecommerce.orderRefunded('ORD-2024-001', 29.99, 'damaged');
Παρακολούθηση λίστας επιθυμιών και κοινοποίησης
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Add to wishlist
ecommerce.addToWishlist({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99
});
// Share product
ecommerce.shareProduct({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt'
}, 'facebook'); // share method
// Wishlist
ecommerce.addToWishlist(product: product)
ecommerce.removeFromWishlist(product: product)
// Share product
ecommerce.shareProduct(product: product, shareMethod: "twitter")
// Wishlist
ecommerce.addToWishlist(product)
ecommerce.removeFromWishlist(product)
// Share product
ecommerce.shareProduct(product, shareMethod = "twitter")
// Add to wishlist
Joryio.ecommerce.addToWishlist(product);
// Remove from wishlist
Joryio.ecommerce.removeFromWishlist(product);
// Share a product
Joryio.ecommerce.shareProduct(product, 'whatsapp');
Παρακολούθηση κουπονιών
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Coupon applied
ecommerce.applyCoupon('SAVE10', 10.00, 'percentage');
// Coupon removed
ecommerce.removeCoupon('SAVE10');
// Coupon
ecommerce.applyCoupon(couponCode: "SAVE10", discountAmount: 10.00, discountType: "percentage")
ecommerce.removeCoupon(couponCode: "SAVE10")
// Coupon
ecommerce.applyCoupon(couponCode = "SAVE10", discountAmount = 10.00, discountType = "percentage")
ecommerce.removeCoupon(couponCode = "SAVE10")
// Coupon applied
Joryio.ecommerce.applyCoupon('SAVE10', 10.0, 'percentage');
// Coupon removed
Joryio.ecommerce.removeCoupon('SAVE10');
Παρακολούθηση αξιολογήσεων
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Product review submitted
ecommerce.submitReview('SKU-12345', 5, 'Great quality shirt!');
// Review
ecommerce.submitReview(productId: "SKU-12345", rating: 5, reviewText: "Great product!")
// Review
ecommerce.submitReview(productId = "SKU-12345", rating = 5, reviewText = "Great product!")
// Product review submitted
Joryio.ecommerce.submitReview('SKU-12345', 5, 'Great shirt, true to size.');
Τυπικά συμβάντα E-Commerce
Ο e-commerce tracker στέλνει τα ίδια τυπικά συμβάντα σε κάθε πλατφόρμα:
| Όνομα συμβάντος | Περιγραφή |
|---|---|
Product Viewed | Ο χρήστης προβάλλει σελίδα προϊόντος |
Product List Viewed | Ο χρήστης προβάλλει σελίδα κατηγορίας |
Products Searched | Ο χρήστης αναζητά προϊόντα |
Product Added | Προϊόν προστέθηκε στο καλάθι |
Product Removed | Προϊόν αφαιρέθηκε από το καλάθι |
Cart Updated | Το περιεχόμενο του καλαθιού άλλαξε |
Checkout Started | Ο χρήστης ξεκινά checkout |
Payment Info Entered | Ο χρήστης προσθέτει μέθοδο πληρωμής |
Order Completed | Η παραγγελία ολοκληρώθηκε |
Order Fulfilled | Η παραγγελία στάλθηκε |
Order Delivered | Η παραγγελία παραδόθηκε |
Order Cancelled | Η παραγγελία ακυρώθηκε |
Order Refunded | Η παραγγελία επιστράφηκε |
Product Added to Wishlist | Προϊόν προστέθηκε στη λίστα επιθυμιών |
Product Removed from Wishlist | Προϊόν αφαιρέθηκε από τη λίστα επιθυμιών |
Product Shared | Το προϊόν κοινοποιήθηκε |
Coupon Applied | Εφαρμόστηκε κωδικός κουπονιού |
Coupon Removed | Αφαιρέθηκε κωδικός κουπονιού |
Product Reviewed | Υποβλήθηκε αξιολόγηση προϊόντος |
React Native
Το React Native SDK δεν περιλαμβάνει αποκλειστικό e-commerce tracker. Οι εφαρμογές React Native στέλνουν ακριβώς τα ίδια τυπικά συμβάντα με Joryio.track(), χρησιμοποιώντας τα ίδια ονόματα συμβάντων και τα ίδια ονόματα ιδιοτήτων στο wire που εκπέμπουν οι trackers των άλλων SDK (οι trackers μετατρέπουν τα inputs camelCase σε ιδιότητες συμβάντων snake_case στο wire). Η καρτέλα React Native σε κάθε ενότητα παραπάνω δείχνει την ισοδύναμη κλήση Joryio.track() για κάθε μέθοδο tracker.
Όταν ένα κατάστημα (Shopify, WooCommerce, Magento) ή το Orders API στέλνει τις παραγγελίες σας, το Joryio δημιουργεί μόνο του τα Order Refunded και Order Cancelled - μην καλείτε επίσης τα orderRefunded / orderCancelled για αυτές τις παραγγελίες, αλλιώς κάθε επιστροφή καταγράφεται δύο φορές. Τα συμβάντα του διακομιστή χρησιμοποιούν τα ίδια κλειδιά order_id, refund_amount και reason με τους trackers, οπότε μία συνθήκη journey ταιριάζει και στα δύο. Δείτε Συμβάντα επιστροφής και ακύρωσης.
Υποχρεωτικά ορίσματα
Κάθε tracker απορρίπτει μια ελλιπή κλήση με τον ίδιο τρόπο, σε κάθε SDK: καταγράφει μια προειδοποίηση και δεν στέλνει τίποτα - ποτέ ένα συμβάν με κενό αναγνωριστικό ή μηδενικό ποσό, που μια αναφορά εσόδων θα μετρούσε ως πραγματικό. Καμία κλήση δεν προκαλεί εξαίρεση.
| Κλήση | Υποχρεωτικά |
|---|---|
viewProduct, removeFromCart, addToWishlist, removeFromWishlist | Ένα προϊόν με productId και πεπερασμένη price |
addToCart | Ένα είδος με productId και πεπερασμένη price |
shareProduct | Ένα προϊόν όπως παραπάνω, και shareMethod |
viewCategory | categoryId και categoryName |
search | query |
cartViewed, updateCart, startCheckout | Ένας πίνακας items, κάθε είδος με productId και πεπερασμένη price, και πεπερασμένο cartValue |
addPaymentInfo | paymentMethod |
purchase | Ένα orderId, ένας πίνακας items (μπορεί να είναι κενός· κάθε είδος όπως παραπάνω) και πεπερασμένη value |
orderFulfilled, orderDelivered, orderCancelled, orderRefunded | orderId |
applyCoupon, removeCoupon | couponCode |
submitReview | productId |
Ένα αναγνωριστικό ή μια ετικέτα που είναι κενά ή περιέχουν μόνο κενά διαστήματα θεωρούνται ότι λείπουν. Ένα προαιρετικό ποσό - cartValue στο addToCart, shipping, tax και discount σε μια παραγγελία, refundAmount, discountAmount - μπορεί να παραλειφθεί, αλλά όποιο δίνετε πρέπει να είναι πεπερασμένος αριθμός: NaN ή άπειρο απορρίπτει ολόκληρη την κλήση, αντί να τη στείλει χωρίς αυτό το ποσό.
Οι προσαρμοσμένες ιδιότητες που περνάτε μαζί ακολουθούν τον γενικό κανόνα: μια τιμή NaN ή άπειρη εκεί αφαιρείται με προειδοποίηση και η κλήση στέλνεται χωρίς αυτό το κλειδί - δείτε Ιδιότητες και τύποι δεδομένων.
Στο Unity τα ονόματα είναι σε PascalCase (ViewProduct, ProductId)· οι κανόνες είναι ίδιοι.
Επόμενα βήματα
- Web SDK - Εγκατάσταση, ρυθμίσεις και πλήρης αναφορά API
- iOS SDK - Ενσωμάτωση του iOS SDK
- Android SDK - Ενσωμάτωση του Android SDK
- React Native SDK - Ενσωμάτωση του React Native SDK
- Προσαρμοσμένα συμβάντα - Παρακολούθηση προσαρμοσμένων συμβάντων
- E-Commerce API - E-commerce ενσωμάτωση από την πλευρά του διακομιστή