Free Gift Products in Shopping Cart
Published on April 30th, 2024
Adding Free Gift Products to the cart automatically
Shopify by default does not have an option to automatically add a free gift product to the cart. There is however a way to make this work.
To start, create a new file snippets/free-product.liquid
and add the following code:
{% assign freegift_product1 = all_products['free-gift-1'].variants.first.id %} {% assign freegift_product2 = all_products['free-gift-2'].variants.first.id %} <script type="text/javascript"> window.freeProductEnabled = true; window.freeProducts = function(product, quantity) { addToCart(product, quantity); } window.productLinesWithFreeGift = { 'Product Type 1': [{{ freegift_product1 }}], 'Product Type 2': [{{ freegift_product2 }}], }; function addToCart(product_id, quantity) { const config = fetchConfig('javascript'); config.headers['X-Requested-With'] = 'XMLHttpRequest'; delete config.headers['Content-Type']; const formData = new FormData(); formData.append('quantity', quantity); formData.append('form_type', 'product'); formData.append('id', product_id); const cart = document.querySelector('cart-drawer'); if (cart) { formData.append('sections', cart.getSectionsToRender().map((section) => section.id)); formData.append('sections_url', window.location.pathname); cart.setActiveElement(document.activeElement); } config.body = formData; fetch(`${routes.cart_add_url}`, config) .then((response) => response.json()) .then((response) => { cart.renderContents(response); }) .catch((e) => { console.error(e); }) .finally(() => { if (cart && cart.classList.contains('is-empty')) cart.classList.remove('is-empty'); cart.querySelector('.loading-overlay__spinner').classList.add('hidden'); }); } </script>
Replace the free gift products (line 1 and 2) with the ones you want to give to your customer. Then also replace the product types (line 9 and 10) with the products you want the free gifts to apply to. You can enter the names, or a part of the name of those products.
Then we need to add a piece of code to the bottom of the following code in assets/product-form.js
:
} else { this.cart.renderContents(response); }
You need to add the following code:
if(window.freeProductEnabled) { const quantity = document.querySelector('product-info .quantity__input') ? document.querySelector('product-info .quantity__input').value : 1; for(const productName in window.productLinesWithFreeGift) { const products = window.productLinesWithFreeGift[productName]; for(let i = 0; i < products.length; i++) { const product = products[i]; if(response.title.includes(productName)) { setTimeout(function(){ window.freeProducts(product, quantity); }, i*250); // Add a delay. If we add cart items too fast, only the last item will be added } } } }
Then finally add the discount rules that give a 100% discount on the free gift products.