diff -Nuar a/vendor/magento/module-offline-shipping/Model/Carrier/Freeshipping.php b/vendor/magento/module-offline-shipping/Model/Carrier/Freeshipping.php
index 674e6b80897..a1fca2b155f 100644
--- a/vendor/magento/module-offline-shipping/Model/Carrier/Freeshipping.php
+++ b/vendor/magento/module-offline-shipping/Model/Carrier/Freeshipping.php
@@ -64,6 +64,24 @@ class Freeshipping extends \Magento\Shipping\Model\Carrier\AbstractCarrier imple
     }
 
     /**
+     * Check subtotal for allowed free shipping
+     *
+     * @param RateRequest $request
+     *
+     * @return bool
+     */
+    private function isFreeShippingRequired(RateRequest $request): bool
+    {
+        $minSubtotal = $request->getPackageValueWithDiscount();
+        if ($request->getBaseSubtotalWithDiscountInclTax()
+            && $this->getConfigFlag('tax_including')) {
+            $minSubtotal = $request->getBaseSubtotalWithDiscountInclTax();
+        }
+
+        return $minSubtotal >= $this->getConfigData('free_shipping_subtotal');
+    }
+
+    /**
      * FreeShipping Rates Collector
      *
      * @param RateRequest $request
@@ -80,10 +98,7 @@ class Freeshipping extends \Magento\Shipping\Model\Carrier\AbstractCarrier imple
 
         $this->_updateFreeMethodQuote($request);
 
-        if ($request->getFreeShipping() || $request->getPackageValueWithDiscount() >= $this->getConfigData(
-            'free_shipping_subtotal'
-        )
-        ) {
+        if ($request->getFreeShipping() || $this->isFreeShippingRequired($request)) {
             /** @var \Magento\Quote\Model\Quote\Address\RateResult\Method $method */
             $method = $this->_rateMethodFactory->create();
 
diff -Nuar a/vendor/magento/module-offline-shipping/etc/adminhtml/system.xml b/vendor/magento/module-offline-shipping/etc/adminhtml/system.xml
index 2b29d2211b9..cb75bddf4d7 100644
--- a/vendor/magento/module-offline-shipping/etc/adminhtml/system.xml
+++ b/vendor/magento/module-offline-shipping/etc/adminhtml/system.xml
@@ -127,6 +127,10 @@
                     <label>Minimum Order Amount</label>
                     <validate>validate-number validate-zero-or-greater</validate>
                 </field>
+                <field id="tax_including" translate="label" sortOrder="5" type="select" showInDefault="1" showInWebsite="1" showInStore="0" canRestore="1">
+                    <label>Include Tax to Amount</label>
+                    <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
+                </field>
                 <field id="name" translate="label" type="text" sortOrder="3" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">
                     <label>Method Name</label>
                 </field>
diff -Nuar a/vendor/magento/module-quote/Model/Quote/Address.php b/vendor/magento/module-quote/Model/Quote/Address.php
index 4f1a0a07d4b..4f52f5310db 100644
--- a/vendor/magento/module-quote/Model/Quote/Address.php
+++ b/vendor/magento/module-quote/Model/Quote/Address.php
@@ -1022,6 +1022,7 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress implements
         $request->setLimitCarrier($this->getLimitCarrier());
         $baseSubtotalInclTax = $this->getBaseSubtotalTotalInclTax();
         $request->setBaseSubtotalInclTax($baseSubtotalInclTax);
+        $request->setBaseSubtotalWithDiscountInclTax($this->getBaseSubtotalWithDiscount() + $this->getBaseTaxAmount());
 
         $result = $this->_rateCollector->create()->collectRates($request)->getResult();
 
diff -Nuar a/vendor/magento/module-tax/Model/Sales/Total/Quote/CommonTaxCollector.php b/vendor/magento/module-tax/Model/Sales/Total/Quote/CommonTaxCollector.php
index 77b3cfa3a08..c70c715d32c 100644
--- a/vendor/magento/module-tax/Model/Sales/Total/Quote/CommonTaxCollector.php
+++ b/vendor/magento/module-tax/Model/Sales/Total/Quote/CommonTaxCollector.php
@@ -383,6 +383,7 @@ class CommonTaxCollector extends AbstractTotal
                         $priceIncludesTax,
                         $useBaseCurrency
                     );
+                    //phpcs:ignore Magento2.Performance.ForeachArrayMerge
                     $itemDataObjects = array_merge($itemDataObjects, $extraTaxableItems);
                 }
             } else {
@@ -394,6 +395,7 @@ class CommonTaxCollector extends AbstractTotal
                     $priceIncludesTax,
                     $useBaseCurrency
                 );
+                //phpcs:ignore Magento2.Performance.ForeachArrayMerge
                 $itemDataObjects = array_merge($itemDataObjects, $extraTaxableItems);
             }
         }
@@ -592,6 +594,7 @@ class CommonTaxCollector extends AbstractTotal
         $total->setBaseSubtotalTotalInclTax($baseSubtotalInclTax);
         $total->setBaseSubtotalInclTax($baseSubtotalInclTax);
         $shippingAssignment->getShipping()->getAddress()->setBaseSubtotalTotalInclTax($baseSubtotalInclTax);
+        $shippingAssignment->getShipping()->getAddress()->setBaseTaxAmount($baseTax);
 
         return $this;
     }
@@ -799,6 +802,7 @@ class CommonTaxCollector extends AbstractTotal
                 'rates' => $rates,
             ];
             if (!empty($extraInfo)) {
+                //phpcs:ignore Magento2.Performance.ForeachArrayMerge
                 $appliedTaxArray = array_merge($appliedTaxArray, $extraInfo);
             }
 
