Table of contents
- Onboarding
Learn where to find a helpful setup guide in the app. - Initial Setup
Configure your theme and sync your products with the app. - General Settings
Configure general settings, including price display, duration, block rendering, text and design configuration. - Products
Check the products and their prices, and customize each product price settings if needed. - Price History
View the history of product price changes. - Adding the lowest price block to non-product pages
View the history of product price changes. - Troubleshooting
Explore a workaround used when the theme doesn’t allow you to add the lowest price block during the initial app setup. - FAQ
After installation, you’ll land to the Pricing page to choose a subscription plan. Next, you’ll go through a brief onboarding process. There you’ll find a detailed video guide and quick access buttons to add the lowest price block to your theme and sync your products. You can skip these steps during onboarding and complete them later from the app interface.
Please note that product syncing is required for the app to collect product data and display the lowest price. The syncing process may take a few minutes.
Initial Setup
Add the Lowest Price Block to Your Theme
To add the lowest price block to your theme, go to Shopify Admin > Online Store > Themes. Select your theme and click Customize to open the Theme Customization page. (Or, simply click the Add Lowest Price Block button during onboarding to access this page directly.)
From your theme customization page, click on the homepage dropdown menu at the top of the page, then go to the Products tab and choose Default product.
In the left sidebar, under Product Information, hover over the template structure and click the plus icon (Add Block). From the list that appears, click Apps tab and select the Lowest Price.
Note
Some themes don’t support adding new snippets or blocks. If you encounter this, there’s a workaround to bypass the restrictions. Please refer to the Troubleshooting section at the end of this guide for more details.
The newly added block will show up in the sidebar. Arrange its placement using drag-and-drop, positioning it where you want to display the 'Lowest price’ (for example, under the main product price). Upon saving, the block will be added to all products.
Sync Your Products
Once you've finished configuring the block, return to Omnibus Insight app to synchronize the application with your products. For it, open Products page and click Start syncing button. Congratulations, the initial setup of the application is now complete!
General Settings
Price display preferences - customize how prices appear to suit your needs. Decide if you want to show the lowest prices and whether you prefer to see prices for all products or just those with discounts.
Show lowest price - enable the setting to display the lowest price block on the frontend.
Note: Please note that the block will only be displayed after it has been added to templates.
Show only for discounted products - display the lowest price on products with valid discounts only.
- Yes: Display the lowest price only on products with valid discounts.
- No: Display the lowest price on all applicable products.
If "Show only for discounted products" is set to "No," the following option becomes available:
Show for new products:
- Yes: The lowest price will be displayed for newly added products (including duplicated ones). For these products, the current price will be shown as the lowest price until historical pricing data becomes available.
- No: The lowest price widget will not be displayed for newly added products (including duplicated ones) until they have established pricing history.
Percentage mode - choose the behavior for the percentage display.
Options:
- Show always except zero
- Never show percentages
- Show only when positive
- Show only when negative
Shopify Markets - This setting allows you to incorporate your Shopify Markets price lists into the calculation of your product's minimum price.
- No (Default) - The application will continue to calculate the minimum price based solely on the pricing data from your store's primary price list.
- Yes - The application will periodically synchronize with your Shopify Markets price lists to gather the most up-to-date pricing information, including any special market-specific discounts.
Note: Marketplace syncing is hourly. Changes to market status, catalog status, or product pricing will reflect within 60 minutes, so don’t worry if they’re not visible right away.
Note: When the global "Use Shopify Markets prices" setting is enabled, a new section will appear within the individual product settings, providing a detailed breakdown of your market-specific prices.
Duration settings - enter the number of days the application considers for the lowest prices and specify how often the data is refreshed.
Period in days - period for which the application considers the lowest price for the product.
Cleaning period in days - specify the number of days after which old price history records will be removed from the history.
Block rendering strategy - when displaying product blocks, you may notice a short delay depending on how many products you have. Here are two strategies you can choose from to manage how these blocks appear during that delay:
- Shopify metafields (Recommended) - If you store your block information in Shopify metafields, it will show up without any delays. However, keep in mind that specific configurations — like text settings and customization — might take a little longer to appear on the frontend. Fortunately, this delay is only temporary and happens just once for a setup change. After that, updates will appear instantly without any delays.
- On-demand data access - If you choose this option, the block will take a bit longer to show up on the frontend initially and each time you update the app. However, when it does appear, it will have all your configurations ready to go.
Note: These strategies only affect global settings and do not change how prices are calculated or how individual configurations are displayed.
Label - adjust the text that will be displayed on the front end for customers. If the setting is empty, the default value will be displayed. The variable {X} represents the period specified in the 'Period in Days' setting.
To add translations of the label, click Add language, choose a language, enter the translated text, and click Add. The translation will automatically appear for customers in the relevant locale. You can remove it anytime by clicking the trash icon.
Design Configuration - these settings allow you to tailor the appearance of the lowest price block according to your preferences or requirements. You can also review your design changes right here, ensuring a seamless and personalized look that matches your preferences or requirements.
Products
Note
If you see a "Sync your products" notification, you’ll need to sync your products first. Syncing is essential for the app to gather product data and display the lowest price. Simply click the Start Syncing button to begin.
On the product grid, you can see all the products currently in the store, including their current price, lowest price, and percentage difference. Furthermore, you have the option to search for products by name.
Customize each product price settings right from the grid by clicking 'Edit' button. Customized products stand out on the grid with a 'custom configuration' label for easy recognition and management.
Shopify Markets Price Details - This table will only appear if the global "Use Shopify Markets prices" setting is enabled and will display the following information for each of your active Shopify Markets:
- Market Name
- Current Price: The current price of the product in that specific market.
- Lowest Price: The lowest price recorded for the product in that specific market.
- Catalog: This column shows which catalog the price change originated from. This allows you to easily view and filter price changes based on their source.
Note: Prices for both "Current Price" and "Lowest Price" are displayed in the currency that Shopify provides for that specific market, so the currencies in these fields may differ.
Price History
Within the price history, only products that have undergone price changes are showcased. You can access details about the product name, its most recent price, new price, context, the catalog where the change occurred , and the date of the modifications. This helps you quickly pinpoint not just what changed, but also where that change originated.
Note: the Price history begins accumulating data only after the installation and activation of the application; any prior changes are not included.
Adding the lowest price block to non-product pages
Adding the lowest price block to Homepage and Collections
For the lowest price block, you have the option to include it on the Home page or Category pages.
Here's how you can do it: head to the theme settings, and then click on 'Edit code'.
After that, in the sidebar menu under Snippets, select 'Add a new snippet'.
Name it 'am-lowest-price' and click 'Done'.
In the open window, paste the provided content and save.
<div id="am-omnibus-container-{{ product.id }}"></div>
<script>
(async()=>{let{shop:e,locale:t,currency:r,country:l}=window.Shopify;if(!e)return;let i="{{ product.id }}";if(!i||void 0===window.ShopifyAnalytics)return;let n="{{ product.selected_or_first_available_variant.price }}"*.01,a="{{ product.selected_or_first_available_variant.compare_at_price }}"*.01,o=`{{ product.metafields["app--80349265921"].am_lowest_price.value | json }}`,c=`{{ product.selected_or_first_available_variant.metafields["app--80349265921"].am_lowest_price.value | json }}`,s=null,u=null;if("null"!==o)try{s=JSON.parse(o)}catch(p){console.log(p)}if("null"!==c)try{u=JSON.parse(c)}catch(f){console.log(f)}let y="{{ product.selected_or_first_available_variant.id }}",{page:d}=window.ShopifyAnalytics.meta,{pageType:m}=d,h=e=>{if("object"!=typeof e)return;let r=e.settings;if(!r||"object"!=typeof r)return;let{show_lowest:o,display_only_at_discount:c,percentage_mode:s,period:u,languages:p,translations:f,css:y}=r;if(!o)return;let d=e.shopCurrency,m=window.Shopify?.currency,h=m?.active,$=m?.rate,b,g,v,_,j=l?e?.markets?.countries?.[l]:null,w=j?j.prices:null,S=j?j.lowest:null;if(w&&S){let A=w&&h?w[h]?.original:null;if(A)b=A.amount,_=A.currency;else{if(!(d===S.original?.currency&&S.original?.amount))return;b=S.original.amount*$,_=h}g=n,v=!!(a&&a>n)}else b=e.lowest_price,e.currency===h?(_=h,g=n,v=!!(a&&a>n)):(_=e.currency,g=e.price,v=!!e.at_discount);if(_&&_!==d){if(!m||"object"!=typeof m)return;if(h&&_===h)$=1;else{if(!h||d!==h)return;b*=$=m.rate}}if(void 0===b||c&&!v)return;let k=g<b,T=g>b,x="inherit",C="";T?(C="+",x="rgb(214, 123, 123)"):k&&(C="-",x="rgb(110, 221, 168)");let P=`color: ${x}`,q,E;0!==b?E=` <span style="${P}">(${C}${q=Math.abs(q=parseFloat(q=(g/b-1)*100).toFixed(2))}%)</span>`:(q=0,E=""),("dont"===s||"positive"===s&&k||"zero_or_negative"===s&&T||0===q)&&(E=""),h&&h!==d&&$&&1!=+$&&(b*=$);let F=new Intl.NumberFormat(t,{style:"currency",currency:h}).format(b);F||(F=`${b} ${h}`);let H=f.lowest;if(p&&p.length>0)for(let L of p)L.code&&L.code===t&&L.text&&(H=L.text);let M,X,z;H?(H.includes("{X}")&&(H=H.replaceAll("{X}",u)),M=`<p class="caption" style="${y}">${H}: ${F}${E}</p>`):M=`<p class="caption" style="${y}">${X="The lowest price from last"} ${u} ${z="days"}: ${F}${E}</p>`;let I=`#am-omnibus-container-${i}`,N=document.querySelectorAll(I);N&&0!==N.length&&N.forEach(e=>{e.innerHTML=M})},$=e=>"object"==typeof e&&Object.keys(e).length>0;if(["collection","home","searchresults"].includes(m)){var b,g;if(y&&null!==u&&"object"==typeof(b=u)&&Object.keys(b).length>0)return h(u);if(null!==s&&"object"==typeof(g=s)&&Object.keys(g).length>0)return h(s);let v=await fetch("/apps/am-omnibus-price",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({shop:e,productId:i,variantId:y,locale:t,currency:r,country:l,realPrice:n,realComparePrice:a})});if(!v.ok)return;let{lowestPriceHtml:_}=await v.json();if(!_)return;let j=`#am-omnibus-container-${i}`,w=document.querySelectorAll(j);if(!w||0===w.length)return;w.forEach(e=>{e.innerHTML=_})}})();
</script>
Then, locate price.liquid in the snippets, paste {%- render 'am-lowest-price', product:product -%}
at the end, and save (we recommend using this snippet, since it is responsible for displaying the price).
Note:
Some third-party themes may use a different product variable name, which can cause the price.liquid code to not work. If you encounter this issue, try {%- render 'am-lowest-price', product:target -%}
or {%- render 'am-lowest-price', product:product_ref -%}
. If none of these work, please contact us for assistance at help-center@amasty.com.

The result on the front-end:
Note: If you uninstall the app, it won't automatically undo the changes. You'll need to manually delete any unnecessary info or blocks.
Adding the lowest price block to Related Products Block
To add lowest price block on Home or Category page, head to the theme settings, and then click on 'Edit code'.
After that, in the sidebar menu under Snippets, select 'Add a new snippet'.
Name it 'am-lowest-price-for-related-products' and click 'Done'.
In the open window, paste the provided content and save.
<div id="am-omnibus-container-{{ product.id }}"></div>
<img alt="lowest price" width="0" height="0" style="display: none" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" onload='
(async()=>{let e="product",{shop:t,locale:r,currency:i,country:l}=window.Shopify;if(!t)return;let n="{{ product.id }}";if(!n||void 0===window.ShopifyAnalytics)return;let a="{{ product.selected_or_first_available_variant.price }}"*.01,o="{{ product.selected_or_first_available_variant.compare_at_price }}"*.01,c=`{{ product.metafields["app--80349265921"].am_lowest_price.value | json }}`,s=`{{ product.selected_or_first_available_variant.metafields["app--80349265921"].am_lowest_price.value | json }}`,p=null,u=null;if("null"!==c)try{p=JSON.parse(c)}catch(f){console.log(f)}if("null"!==s)try{u=JSON.parse(s)}catch(y){console.log(y)}let d="{{ product.selected_or_first_available_variant.id }}",{page:m}=window.ShopifyAnalytics.meta,{pageType:h}=m;if(h===e&&n==window.ShopifyAnalytics?.meta?.product?.id)return;let b=e=>{if("object"!=typeof e)return;let t=e.settings;if(!t||"object"!=typeof t)return;let{show_lowest:i,display_only_at_discount:c,percentage_mode:s,period:p,languages:u,translations:f,css:y}=t;if(!i)return;let d=e.shopCurrency,m=window.Shopify?.currency,h=m?.active,b=m?.rate,v,$,g,_,j=l?e?.markets?.countries?.[l]:null,w=j?j.prices:null,S=j?j.lowest:null;if(w&&S){let k=w&&h?w[h]?.original:null;if(k)v=k.amount,_=k.currency;else{if(!(d===S.original?.currency&&S.original?.amount))return;v=S.original.amount*b,_=h}$=a,g=!!(o&&o>a)}else v=e.lowest_price,e.currency===h?(_=h,$=a,g=!!(o&&o>a)):(_=e.currency,$=e.price,g=!!e.at_discount);if(_&&_!==d){if(!m||"object"!=typeof m)return;if(h&&_===h)b=1;else{if(!h||d!==h)return;v*=b=m.rate}}if(void 0===v||c&&!g)return;let A=$<v,T=$>v,C="inherit",x="";T?(x="+",C="rgb(214, 123, 123)"):A&&(x="-",C="rgb(110, 221, 168)");let I=`color: ${C}`,P,B;0!==v?B=` <span style="${I}">(${x}${P=Math.abs(P=parseFloat(P=($/v-1)*100).toFixed(2))}%)</span>`:(P=0,B=""),("dont"===s||"positive"===s&&A||"zero_or_negative"===s&&T||0===P)&&(B=""),h&&h!==d&&b&&1!=+b&&(v*=b);let E=new Intl.NumberFormat(r,{style:"currency",currency:h}).format(v);E||(E=`${v} ${h}`);let F=f.lowest;if(u&&u.length>0)for(let H of u)H.code&&H.code===r&&H.text&&(F=H.text);let L,M,N;F?(F.includes("{X}")&&(F=F.replaceAll("{X}",p)),L=`<p class="caption" style="${y}">${F}: ${E}${B}</p>`):L=`<p class="caption" style="${y}">${M="The lowest price from last"} ${p} ${N="days"}: ${E}${B}</p>`;let X=`am-omnibus-container-${n}`,z=document.getElementById(X);z&&(z.innerHTML=L)},v=e=>"object"==typeof e&&Object.keys(e).length>0;if(h===e){var $,g;if(d&&null!==u&&"object"==typeof($=u)&&Object.keys($).length>0)return b(u);if(null!==p&&"object"==typeof(g=p)&&Object.keys(g).length>0)return b(p);let _=await fetch("/apps/am-omnibus-price",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({shop:t,productId:n,variantId:d,locale:r,currency:i,country:l,realPrice:a,realComparePrice:o})});if(!_.ok)return;let{lowestPriceHtml:j}=await _.json();if(!j)return;let w=`am-omnibus-container-${n}`,S=document.getElementById(w);if(!S)return;S.innerHTML=j}})();this.parentNode.removeChild(this);
'/>
Open price.liquid in the snippets and paste {%- render 'am-lowest-price-for-related-products', product:product -%}
at the end, and save (we recommend using this snippet, since it is responsible for displaying the price).
Note:
Some third-party themes may use a different product variable name, which can cause the price.liquid code to not work. If you encounter this issue, try {%- render 'am-lowest-price', product:target -%}
or {%- render 'am-lowest-price', product:product_ref -%}
. If none of these work, please contact us for assistance at help-center@amasty.com.
Note: If you uninstall the app, it won't automatically undo the changes. You'll need to manually delete any unnecessary info or blocks.
Troubleshooting
If your theme doesn’t allow you to add the lowest price block during the initial app setup, there’s a workaround you can use to resolve this issue.
1. From Shopify Admin, go to Online store > Themes > Customize.
2. Click … > Edit code.
3. Find a folder called snippets and click Add a new snippet.
4. Name it ‘product-page-lowest-price’ and click Done.
5. Insert there the following content and Save it.
<div id="am-omnibus-container-{{ product.id }}"></div>
<script>
(async()=>{let{shop:e,locale:t,currency:r,country:l}=window.Shopify;if(!e)return;let i="{{ product.id }}";if(!i||void 0===window.ShopifyAnalytics)return;let n="{{ product.selected_or_first_available_variant.price }}"*.01,a="{{ product.selected_or_first_available_variant.compare_at_price }}"*.01,o=`{{ product.metafields["app--80349265921"].am_lowest_price.value | json }}`,c=`{{ product.selected_or_first_available_variant.metafields["app--80349265921"].am_lowest_price.value | json }}`,s=null,p=null;if("null"!==o)try{s=JSON.parse(o)}catch(u){console.log(u)}if("null"!==c)try{p=JSON.parse(c)}catch(f){console.log(f)}let y="{{ product.selected_or_first_available_variant.id }}",{page:d}=window.ShopifyAnalytics.meta,{pageType:m}=d,b=e=>{if("object"!=typeof e)return;let r=e.settings;if(!r||"object"!=typeof r)return;let{show_lowest:o,display_only_at_discount:c,percentage_mode:s,period:p,languages:u,translations:f,css:y}=r;if(!o)return;let d=e.shopCurrency,m=window.Shopify?.currency,b=m?.active,$=m?.rate,g,v,h,_,j=l?e?.markets?.countries?.[l]:null,w=j?j.prices:null,S=j?j.lowest:null;if(w&&S){let T=w&&b?w[b]?.original:null;if(T)g=T.amount,_=T.currency;else{if(!(d===S.original?.currency&&S.original?.amount))return;g=S.original.amount*$,_=b}v=n,h=!!(a&&a>n)}else g=e.lowest_price,e.currency===b?(_=b,v=n,h=!!(a&&a>n)):(_=e.currency,v=e.price,h=!!e.at_discount);if(_&&_!==d){if(!m||"object"!=typeof m)return;if(b&&_===b)$=1;else{if(!b||d!==b)return;g*=$=m.rate}}if(void 0===g||c&&!h)return;let E=v<g,k=v>g,A="inherit",C="";k?(C="+",A="rgb(214, 123, 123)"):E&&(C="-",A="rgb(110, 221, 168)");let I=`color: ${A}`,P,L;0!==g?L=` <span style="${I}">(${C}${P=Math.abs(P=parseFloat(P=(v/g-1)*100).toFixed(2))}%)</span>`:(P=0,L=""),("dont"===s||"positive"===s&&E||"zero_or_negative"===s&&k||0===P)&&(L=""),b&&b!==d&&$&&1!=+$&&(g*=$);let x=new Intl.NumberFormat(t,{style:"currency",currency:b}).format(g);x||(x=`${g} ${b}`);let O=f.lowest;if(u&&u.length>0)for(let B of u)B.code&&B.code===t&&B.text&&(O=B.text);let F,H,M;O?(O.includes("{X}")&&(O=O.replaceAll("{X}",p)),F=O.includes("{LOWEST_PRICE}")?`<p class="caption" style="${y}">${O=O.replaceAll("{LOWEST_PRICE}",`${x}${L}`)}</p>`:`<p class="caption" style="${y}">${O}: ${x}${L}</p>`):F=`<p class="caption" style="${y}">${H="The lowest price from last"} ${p} ${M="days"}: ${x}${L}</p>`;let R=`am-omnibus-container-${i}`,W=document.getElementById(R);W&&(W.innerHTML=F)},$=e=>"object"==typeof e&&Object.keys(e).length>0;if("product"===m){var g,v;if(y&&null!==p&&"object"==typeof(g=p)&&Object.keys(g).length>0)return b(p);if(null!==s&&"object"==typeof(v=s)&&Object.keys(v).length>0)return b(s);let h=await fetch("/apps/am-omnibus-price",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({shop:e,productId:i,variantId:y,locale:t,currency:r,country:l,realPrice:n,realComparePrice:a})});if(!h.ok)return;let{lowestPriceHtml:_}=await h.json();if(!_)return;let j=`am-omnibus-container-${i}`,w=document.getElementById(j);if(!w)return;w.innerHTML=_}})();
</script>
6. In the left sidebar, find product-price.liquid and add the following line to the end of the code:
{%- render 'product-page-lowest-price', product:product -%}
7. Save changes.