diff --git a/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js b/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
index 8c88a8c..c4f4d9e 100644
--- a/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
+++ b/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
@@ -21,6 +21,14 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
       return;
     }
 
+    OB.MobileApp.model.receipt.off('calculatedReceipt', null, OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF']);
+    OB.MobileApp.model.receipt.on('calculatedReceipt', function () {
+      OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'].discountedUnits = {};
+      OB.MobileApp.model.receipt.unset('receiptConsumedForFreeProduct');
+      receipt.off('calculatedReceipt', null, OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF']);
+    }, OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF']);
+
+
     OB.Dal.find(OB.Model.FreeProduct, {
       'promotionDiscount': discountRule.get('id')
     }, function (freeProducts) {
@@ -32,6 +40,9 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
           // total is bigger than min, let's check if there are free items
           // in the ticket to apply the promo
           for (i = 0; i < preprocess.linesToCompute.length; i++) {
+            if (receipt.get('receiptConsumedForFreeProduct')) {
+              break;
+            }
             if (OB.Model.Discounts.DISCT.isFreeProduct(preprocess.linesToCompute[i].line.get('product'), freeProducts) && (preprocess.total - preprocess.linesToCompute[i].total >= discountRule.get('disctTotalreceipt'))) {
               shouldApply = true;
               break;
@@ -52,7 +63,7 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
 
             fp = OB.Model.Discounts.DISCT.isFreeProduct(l.get('product'), freeProducts);
             if (fp) {
-              fpId = fp.get('product');
+              fpId = fp.get('product') + '-' + discountRule.id
 
               // a product can be in more than one line, keep count of how many units
               // have already been discounted
@@ -76,6 +87,7 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
                 receipt.addPromotion(l, discountRule, {
                   amt: OB.DEC.mul(l.get('discountedLinePrice') || l.get('price'), unitsToDiscount)
                 });
+                receipt.set('receiptConsumedForFreeProduct', true);
               }
             }
           });
