Flutter Ecommerce Activity Tracking

Reteno's e-commerce activity tracking helps to learn about the customer journey and use this data in your analytics.

This guide shows how to track e-commerce activity in your Flutter application using a single entry-point method:

Future<void> logEcommerceEvent(RetenoEcommerceEvent event)

Supported Events

Event classWhen to fire it
RetenoEcommerceProductViewedA user opens a product card
RetenoEcommerceProductCategoryViewedA user opens a product-category (listing) page
RetenoEcommerceProductAddedToWishlistA user adds a product to a wishlist
RetenoEcommerceCartUpdatedItems in the shopping cart change (add / remove / quantity update)
RetenoEcommerceOrderCreatedA new order is created
RetenoEcommerceOrderUpdatedAn order is updated after creation
RetenoEcommerceOrderDeliveredOrder status becomes DELIVERED
RetenoEcommerceOrderCancelledOrder status becomes CANCELLED
RetenoEcommerceSearchRequestA catalogue search request is performed

All event classes are defined in reteno_ecommerce_event.dart and extend the sealed base class RetenoEcommerceEvent.


Usage Pattern

  1. Construct the appropriate event object.
  2. Pass it to logEcommerceEvent() and await the result.
  3. Repeat this process for every interaction you want to track.

The SDK automatically timestamps events, so you do not need to provide a date parameter.

final product = RetenoEcommerceProduct(
  productId: 'PRODUCT_ID',
  price: 20.0,
  inStock: true,
  attributes: {
    'size': ['23', '42'],
    'color': ['white', 'orange'],
  },
);

await logEcommerceEvent(
  RetenoEcommerceProductViewed(
    product: product,
    currency: 'UAH',
  ),
);

Event Reference

Product Viewed

Fire when a user sees a product card.

ParameterTypeDescription
productRetenoEcommerceProductRequired. Product being viewed
currencyString? (ISO-4217)Optional (USD, EUR, UAH). Uses org default if null

RetenoEcommerceProduct

PropertyTypeDescription
productIdStringUnique identifier of the product in your catalog.
pricedoubleCurrent product price including taxes and discounts.
inStockbooltrue if the product is available for purchase.
attributesMap<String, List<String>>?Arbitrary attribute map for segmentation (e.g. { 'size': ['M'], 'color': ['blue'] }).

Product Category Viewed

Fire when a user opens a category or listing page.

final category = RetenoEcommerceCategory(
  productCategoryId: 'CATEGORY_ID',
  attributes: {
    'gender': ['kids'],
  },
);

await logEcommerceEvent(
  RetenoEcommerceProductCategoryViewed(category: category),
);
PropertyTypeDescription
productCategoryIdStringCategory identifier (slug, code or UUID).
attributesMap<String, List<String>>?Additional category metadata (e.g. { 'gender': ['men'] }).

Product Added to Wishlist

await logEcommerceEvent(
  RetenoEcommerceProductAddedToWishlist(
    product: product,
    currency: 'EUR',
  ),
);

RetenoEcommerceProduct

PropertyTypeDescription
productIdStringProduct identifier
pricedoubleUnit price before discount.
quantityintNumber of units in the cart.
discountdouble?Discount per unit (absolute, optional).
nameString?Human‑readable product name (optional).
categoryString?Product category name or ID (optional).
attributesMap<String, List<String>>?Extra attributes (e.g. selected options).

Cart Updated

Track any changes to the shopping cart contents.

final cartProducts = [
  const RetenoEcommerceProductInCart(
    productId: 'uut',
    price: 20.0,
    quantity: 1,
  ),
  const RetenoEcommerceProductInCart(
    productId: 'lk',
    price: 100.0,
    quantity: 3,
  ),
];

await logEcommerceEvent(
  RetenoEcommerceCartUpdated(
    cartId: 'CART_ID',
    products: cartProducts,
    currency: 'UAH',
  ),
);

RetenoEcommerceProductInCart

PropertyTypeDescription
productIdStringProduct identifier
pricedoubleUnit price before discount.
quantityintNumber of units in the cart.
discountdouble?Discount per unit (absolute, optional).
nameString?Human‑readable product name (optional).
categoryString?Product category name or ID (optional).
attributesMap<String, List<String>>?Extra attributes (e.g. selected options).

Order Created or Updated

Both RetenoEcommerceOrderCreated and RetenoEcommerceOrderUpdated use the same payload.

final order = RetenoEcommerceOrder(
  externalOrderId: 'ORDER_ID',
  totalCost: 300.0,
  status: RetenoEcommerceOrderStatus.initialized,
  date: DateTime.now().toIso8601String(),
  cartId: 'CART_ID',
);

await logEcommerceEvent(
  RetenoEcommerceOrderCreated(
    order: order,
    currency: 'UAH',
  ),
);

RetenoEcommerceOrder

PropertyTypeDescription
externalOrderIdStringOrder ID from your commerce back‑end.
totalCostdoubleGrand total amount charged to the customer.
statusRetenoEcommerceOrderStatusCurrent order state (initialized, inProgress, delivered, cancelled).
dateString (ISO‑8601)Date/time when the order was placed.
externalCustomerIdString?Customer ID in your system (optional).
cartIdString?Shopping cart identifier that generated the order (optional).

RetenoEcommerceOrderStatus (enum)

ValueMeaning
initializedOrder was created but not paid yet.
inProgressPayment confirmed / order is being processed.
deliveredOrder delivered to the customer.
cancelledOrder was cancelled or refunded.

Order Delivered or Cancelled

await logEcommerceEvent(
  const RetenoEcommerceOrderDelivered(externalOrderId: 'ORDER_ID'),
);

await logEcommerceEvent(
  const RetenoEcommerceOrderCancelled(externalOrderId: 'ORDER_ID'),
);

Search Request

await logEcommerceEvent(
  const RetenoEcommerceSearchRequest(
    query: 'iphone',
    isFound: true,
  ),
);

Custom Events

If your use case doesn’t match a predefined RetenoEcommerceEvent, use the generic logging API:

await Reteno.logEvent(
  eventTypeKey: 'custom_event_type',
  parameters: {
    'parameter_name': 'value',
  },
);

Currency Codes

Use valid ISO‑4217 codes: USD, EUR, or UAH. If no currency is provided, your organization’s default is used.