diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java
index 7807b5571..54fe716cc 100644
--- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java
+++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java
@@ -146,6 +146,13 @@ public void trackEvent(String name, ReadableMap dataFields) {
         }
     }
 
+    @ReactMethod
+    public void updateCart(ReadableArray items) {
+        IterableLogger.v(TAG, "UpdateCart API");
+
+        IterableApi.getInstance().updateCart(Serialization.commerceItemsFromReadableArray(items));
+    }
+
     @ReactMethod
     public void trackPurchase(Double total, ReadableArray items, ReadableMap dataFields) {
         IterableLogger.v(TAG, "TrackPurchase API");
diff --git a/android/src/main/java/com/iterable/reactnative/Serialization.java b/android/src/main/java/com/iterable/reactnative/Serialization.java
index f8376f674..189c8fe0e 100644
--- a/android/src/main/java/com/iterable/reactnative/Serialization.java
+++ b/android/src/main/java/com/iterable/reactnative/Serialization.java
@@ -81,9 +81,9 @@ static List<CommerceItem> commerceItemsFromReadableArray(ReadableArray array) {
     }
 
     static CommerceItem commerceItemFromMap(JSONObject itemMap) throws JSONException {
-
         String[] categories = null;
         JSONArray categoriesArray = itemMap.optJSONArray("categories");
+
         if (categoriesArray != null) {
             for (int i = 0; i < categoriesArray.length(); i++) {
                 if (categories == null) {
@@ -92,6 +92,7 @@ static CommerceItem commerceItemFromMap(JSONObject itemMap) throws JSONException
                 categories[i] = categoriesArray.getString(i);
             }
         }
+        
         return new CommerceItem(itemMap.getString("id"),
                 itemMap.getString("name"),
                 itemMap.getDouble("price"),
@@ -100,7 +101,8 @@ static CommerceItem commerceItemFromMap(JSONObject itemMap) throws JSONException
                 itemMap.optString("description", null),
                 itemMap.optString("url", null),
                 itemMap.optString("imageUrl", null),
-                categories
+                categories,
+                itemMap.optJSONObject("dataFields")
         );
     }
 
diff --git a/ios/RNIterableAPI/RNIterableAPI.m b/ios/RNIterableAPI/RNIterableAPI.m
index bbebb9f4c..924fab64c 100644
--- a/ios/RNIterableAPI/RNIterableAPI.m
+++ b/ios/RNIterableAPI/RNIterableAPI.m
@@ -50,6 +50,8 @@ @interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject)
                   appAlreadyRunning: (BOOL) appAlreadyRunning
                   dataFields: (NSDictionary *) dataFields)
 
+RCT_EXTERN_METHOD(updateCart: (NSArray *) items)
+
 RCT_EXTERN_METHOD(trackPurchase: (nonnull NSNumber *) total
                   items: (NSArray *) items
                   dataFields: (NSDictionary *) dataFields)
diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift
index 3c19813b7..fe8c11d76 100644
--- a/ios/RNIterableAPI/ReactIterableAPI.swift
+++ b/ios/RNIterableAPI/ReactIterableAPI.swift
@@ -166,6 +166,13 @@ class ReactIterableAPI: RCTEventEmitter {
                           appAlreadyRunning: appAlreadyRunning,
                           dataFields: dataFields)
     }
+
+    @objc(updateCart:)
+    func updateCart(items: [[AnyHashable: Any]]) {
+        ITBInfo()
+
+        IterableAPI.updateCart(items: items.compactMap(CommerceItem.from(dict:)))
+    }
     
     @objc(trackPurchase:items:dataFields:)
     func trackPurchase(total: NSNumber,
diff --git a/ios/RNIterableAPI/Serialization.swift b/ios/RNIterableAPI/Serialization.swift
index 8f5cfac61..67b18ad2f 100644
--- a/ios/RNIterableAPI/Serialization.swift
+++ b/ios/RNIterableAPI/Serialization.swift
@@ -90,6 +90,7 @@ extension CommerceItem {
         let url = dict["url"] as? String
         let imageUrl = dict["imageUrl"] as? String
         let categories = dict["categories"] as? [String]
+        let dataFields = dict["dataFields"] as? [AnyHashable: Any]
         
         return CommerceItem(id: id,
                             name: name,
@@ -99,7 +100,8 @@ extension CommerceItem {
                             description: description,
                             url: url,
                             imageUrl: imageUrl,
-                            categories: categories)
+                            categories: categories,
+                            dataFields: dataFields)
     }
 }
 
diff --git a/ts/Iterable.ts b/ts/Iterable.ts
index 3be08087b..934ae323e 100644
--- a/ts/Iterable.ts
+++ b/ts/Iterable.ts
@@ -170,8 +170,9 @@ class IterableCommerceItem {
   url?: string
   imageUrl?: string
   categories?: Array<string>
+  dataFields?: any
 
-  constructor(id: string, name: string, price: number, quantity: number, sku?: string, description?: string, url?: string, imageUrl?: string, categories?: Array<string>) {
+  constructor(id: string, name: string, price: number, quantity: number, sku?: string, description?: string, url?: string, imageUrl?: string, categories?: Array<string>, dataFields?: any | undefined) {
     this.id = id
     this.name = name
     this.price = price
@@ -181,6 +182,7 @@ class IterableCommerceItem {
     this.url = url
     this.imageUrl = imageUrl
     this.categories = categories
+    this.dataFields = dataFields
   }
 }
 
@@ -302,6 +304,15 @@ class Iterable {
     RNIterableAPI.trackPushOpenWithCampaignId(campaignId, templateId, messageId, appAlreadyRunning, dataFields)
   }
 
+  /**
+   * 
+   * @param {Array<IterableCommerceItem>} items
+   */
+  static updateCart(items: Array<IterableCommerceItem>) {
+    console.log("updateCart")
+    RNIterableAPI.updateCart(items)
+  }
+
   /**
   * 
   * @param {number} total 
diff --git a/ts/__mocks__/MockRNIterableAPI.ts b/ts/__mocks__/MockRNIterableAPI.ts
index cf036a1cd..4015cf672 100644
--- a/ts/__mocks__/MockRNIterableAPI.ts
+++ b/ts/__mocks__/MockRNIterableAPI.ts
@@ -31,6 +31,8 @@ export class MockRNIterableAPI {
 
   static trackPushOpenWithCampaignId = jest.fn()
 
+  static updateCart = jest.fn()
+
   static trackPurchase = jest.fn()
 
   static trackInAppOpen = jest.fn()
diff --git a/ts/__tests__/Iterable.spec.ts b/ts/__tests__/Iterable.spec.ts
index 4c851b507..2b1d70318 100644
--- a/ts/__tests__/Iterable.spec.ts
+++ b/ts/__tests__/Iterable.spec.ts
@@ -57,6 +57,14 @@ test("trackPushOpenWithCampaignId", () => {
   )
 })
 
+test("updateCart", () => {
+  Iterable.updateCart([new IterableCommerceItem("id1", "Boba Tea", 18, 26)])
+
+  expect(MockRNIterableAPI.updateCart).toBeCalledWith(
+    [new IterableCommerceItem("id1", "Boba Tea", 18, 26)]
+  )
+})
+
 test("trackPurchase", () => {
   Iterable.trackPurchase(
     10,