diff --git a/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js b/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js
index 676f212..3c9806e 100644
--- a/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js
+++ b/web/org.openbravo.retail.discounts.bytotal/js/promotion-by-total-utils.js
@@ -55,6 +55,14 @@ OB.Model.Discounts.DISCT = {
           linesToCompute = [],
           promotionCandidates, ret, isFreeProduct = OB.Model.Discounts.DISCT.isFreeProduct(checkingLine.get('product'), freeProducts);
 
+      function checkReceiptConsumedForFreeProduct(receipt, discountRule) {
+        var receiptConsumed = receipt.get('receiptConsumedForFreeProduct') || false;
+        if (!receiptConsumed || (receiptConsumed && discountRule.get('applyNext'))) {
+          receipt.set('receiptConsumedForFreeProduct', true);
+          return true;
+        }
+        return false;
+      }
 
       function getDiscountedLinePrice(line) {
         // discounted price should be set in line.discountedLinePrice, but we cannot trust
@@ -123,6 +131,10 @@ OB.Model.Discounts.DISCT = {
           return; //continue
         }
 
+        if (discountRule.get('discountType') === '4755A35B4DA34F6CB08F15462BA123CF' && !isFreeProduct && !checkReceiptConsumedForFreeProduct(receipt, discountRule)) {
+          return; //continue
+        }
+
         linePrice = getDiscountedLinePrice(l);
 
         // total for PIT includes taxes and for no PIT does not
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..d0e81a9 100644
--- a/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
+++ b/web/org.openbravo.retail.discounts.bytotal/js/promotion-freeitemstotal.js
@@ -15,6 +15,13 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
   async: true,
   discountedUnits: {},
   implementation: function (discountRule, receipt, line, listener) {
+    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'].removeDiscountedUnits);
+    }, OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF']);
+
     if (!OB.Model.Discounts.DISCT.doProcess()) {
       // nothing to do for now
       listener.trigger('completed');
@@ -52,7 +59,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
@@ -65,7 +72,7 @@ OB.Model.Discounts.discountRules['4755A35B4DA34F6CB08F15462BA123CF'] = {
               dr.discountedUnits[fpId] += unitsToDiscount;
 
               _.each(l.get('promotions'), function (p) {
-                if (p.discountType === discountRule.get('discountType')) {
+                if (p.ruleId === discountRule.get('ruleId')) {
                   discountApplied = true;
                   return;
                 }
