Live Preview Options

Help

How to install the App

To install the App, you simply need to go to https://apps.shopify.com/infinite-live-preview-options, and click on the Add App button. Accept the app permissions as well as the monthly charge to complete the installation. You then need to click on the Activate App Embed button to turn on the app on your theme. The app should work fine and requires no coding. (If you have issues, please contact us and we'll solve the problem for you)
No programming or coding skills are necessary to install or to use the App.

Make sure to click on the save button in your theme customizer after you activate the app embed.

Demonstration

You can find a demonstration store showing several customizable products that were all built using the Live Preview Options app:
https://infinite-live-preview-options.myshopify.com/

Video tutorials

In this section there are several video tutorial that show how to create customizable products. Watching these videos is very recommended so that you can understand how the app behaves.

Customizable Bottle

Customizable T-Shirt

Customizable Watch


Frequently Asked Questions

I made changes in the app but it is not updating on my store

Modifications made through the app take a dozen minutes before they propagate to the live store.

The options are not showing at the right location

The app automatically detects where is the product form and adds the product options there. If you want to manually add the options at a specific location in your product page form, you need to add this line of code at that specific location: <div class="webyze-infinitelivepreviewoptions-form"></div>

Is it possible to use my own fonts in the app?

Yes, you can upload your own TTF fonts in the app and they will be used to generate the live preview image.

I would like to have multiple live previews

Unfortunately, the app only supports one live preview image. If you need to show multiple views of the same product, we recommend trying to add all the different views on the same image.

I am unable to download the image my customers have uploaded

Depending on the browser you are using, the Shopify platform might serve you the image in the WebP format. The solution to this is to add ?format=jpg to the URL so that you can retrieve the image in JPG format (it also works with PNG). So to download the image in JPG format, you can simply copy the image link from the order page and add ?format=jpg at the end of the URL.
Example:
https://cdn.shopify.com/s/files/1/1930/5847/uploads/bc97518a8cba5836cea0a546af698c5f.jpg Becomes: https://cdn.shopify.com/s/files/1/1930/5847/uploads/bc97518a8cba5836cea0a546af698c5f.jpg?format=jpg

The Live Preview is covering my menu

This problem might be an incompatibility with your theme. Usually to solve it, you need to add this CSS code to your theme's stylesheet in the assets folder (the file is usually called styles.scss.liquid): .webyze-ilpo-preview-wrapper { z-index:5 !important; }

The customizations are not appearing in the packing slip?

This depends on the packing slip template you are using. You can modify your packing slip template in your Shopify admin > Shipping and delivery > Packing slip template and use this one: <div class="wrapper"> <div class="header"> <div class="shop-title"> <p class="to-uppercase"> {{ shop.name }} </p> </div> <div class="order-title"> <p class="text-align-right"> Order {{ order.name }} </p> <p class="text-align-right"> {{ order.created_at | date: "%B %e, %Y" }} </p> </div> </div> <div class="customer-addresses"> <div class="shipping-address"> <p class="subtitle-bold to-uppercase"> {% if delivery_method.instructions != blank %} Delivery to {% else %} Ship to {% endif %} </p> <p class="address-detail"> {% if shipping_address != blank %} {{ shipping_address.name }} {% if shipping_address.company != blank %} <br> {{ shipping_address.company }} {% endif %} <br> {{ shipping_address.address1 }} {% if shipping_address.address2 != blank %} <br> {{ shipping_address.address2 }} {% endif %} {% if shipping_address.city_province_zip != blank %} <br> {{ shipping_address.city_province_zip }} {% endif %} <br> {{ shipping_address.country }} {% if shipping_address.phone != blank %} <br> {{ shipping_address.phone }} {% endif %} {% else %} No shipping address {% endif %} </p> </div> <div class="billing-address"> <p class="subtitle-bold to-uppercase"> Bill to </p> <p class="address-detail"> {% if billing_address != blank %} {{ billing_address.name }} {% if billing_address.company != blank %} <br> {{ billing_address.company }} {% endif %} <br> {{ billing_address.address1 }} {% if billing_address.address2 != blank %} <br> {{ billing_address.address2 }} {% endif %} {% if billing_address.city_province_zip != blank %} <br> {{ billing_address.city_province_zip }} {% endif %} <br> {{ billing_address.country }} {% else %} No billing address {% endif %} </p> </div> </div> <hr> <div class="order-container"> <div class="order-container-header"> <div class="order-container-header-left-content"> <p class="subtitle-bold to-uppercase"> Items </p> </div> <div class="order-container-header-right-content"> <p class="subtitle-bold to-uppercase"> Quantity </p> </div> </div> {% comment %} To adjust the size of line item images, change desired_image_size. The other variables make sure your images print at high quality. {% endcomment %} {% assign desired_image_size = 58 %} {% assign resolution_adjusted_size = desired_image_size | times: 300 | divided_by: 72 | ceil %} {% capture effective_image_dimensions %} {{ resolution_adjusted_size }}x{{ resolution_adjusted_size }} {% endcapture %} {% for line_item in line_items_in_shipment %} <div class="flex-line-item"> <div class="flex-line-item-img"> {% if line_item.image != blank %} <div class="aspect-ratio aspect-ratio-square" style="width: {{ desired_image_size }}px; height: {{ desired_image_size }}px;"> {{ line_item.image | img_url: effective_image_dimensions | img_tag: '', 'aspect-ratio__content' }} </div> {% endif %} </div> <div class="flex-line-item-description"> <p> <span class="line-item-description-line"> {{ line_item.title }} </span> {% if line_item.variant_title != blank %} <span class="line-item-description-line"> {{ line_item.variant_title }} </span> {% endif %} {% if line_item.sku != blank %} <span class="line-item-description-line"> {{ line_item.sku }} </span> {% endif %} {% assign property_size = line_item.properties | size %} {% if property_size > 0 %} {% for p in line_item.properties %} {% assign first_character_in_key = p.first | truncate: 1, '' %} {% unless p.last == blank or first_character_in_key == '_' %} {{ p.first }}: {% if p.last contains '/uploads/' %} <a href="{{ p.last }}">{{ p.last | split: '/' | last }}</a> {% else %} {{ p.last }} {% endif %} <br> {% endunless %} {% endfor %} {% endif %} </p> </div> <div class="flex-line-item-quantity"> <p class="text-align-right"> {{ line_item.shipping_quantity }} of {{ line_item.quantity }} </p> </div> </div> {% endfor %} </div> {% unless includes_all_line_items_in_order %} <hr class="subdued-separator"> <p class="missing-line-items-text "> There are other items from your order not included in this shipment. </p> {% endunless %} <hr> {% if order.note != blank %} <div class="notes"> <p class="subtitle-bold to-uppercase"> Notes </p> <p class="notes-details"> {{ order.note }} </p> </div> {% endif %} {% if delivery_method.instructions != blank %} <div class="notes"> <p class="subtitle-bold to-uppercase"> Delivery instructions </p> <p class="notes-details"> {{ delivery_method.instructions }} </p> </div> {% endif %} <div class="footer"> <p> Thank you for shopping with us! </p> <p> <strong> {{ shop.name }} </strong> <br> {{ shop_address.address1 }}, {{ shop_address.city }}, {{ shop_address.province_code }}, {{ shop_address.zip }}, {{ shop_address.country }} <br> {{ shop.email }} <br> {{ shop.domain }} </p> </div> </div> <style type="text/css"> body { font-size: 15px; } * { box-sizing: border-box; } .wrapper { width: 831px; margin: auto; padding: 4em; font-family: "Noto Sans", sans-serif; font-weight: 250; } .header { width: 100%; display: -webkit-box; display: -webkit-flex; display: flex; flex-direction: row; align-items: top; } .header p { margin: 0; } .shop-title { -webkit-box-flex: 6; -webkit-flex: 6; flex: 6; font-size: 1.9em; } .order-title { -webkit-box-flex: 4; -webkit-flex: 4; flex: 4; } .customer-addresses { width: 100%; display: inline-block; margin: 2em 0; } .address-detail { margin: 0.7em 0 0; line-height: 1.5; } .subtitle-bold { font-weight: bold; margin: 0; font-size: 0.85em; } .to-uppercase { text-transform: uppercase; } .text-align-right { text-align: right; } .shipping-address { float: left; min-width: 18em; max-width: 50%; } .billing-address { padding-left: 20em; min-width: 18em; } .order-container { padding: 0 0.7em; } .order-container-header { display: inline-block; width: 100%; margin-top: 1.4em; } .order-container-header-left-content { float: left; } .order-container-header-right-content { float: right; } .flex-line-item { display: -webkit-box; display: -webkit-flex; display: flex; flex-direction: row; align-items: center; margin: 1.4em 0; page-break-inside: avoid; } .flex-line-item-img { margin-right: 1.4em; min-width: {{ desired_image_size }}px; } .flex-line-item-description { -webkit-box-flex: 7; -webkit-flex: 7; flex: 7; } .line-item-description-line { display: block; } .flex-line-item-description p { margin: 0; line-height: 1.5; } .flex-line-item-quantity { -webkit-box-flex: 3; -webkit-flex: 3; flex: 3; } .subdued-separator { height: 0.07em; border: none; color: lightgray; background-color: lightgray; margin: 0; } .missing-line-items-text { margin: 1.4em 0; padding: 0 0.7em; } .notes { margin-top: 2em; } .notes p { margin-bottom: 0; } .notes .notes-details { margin-top: 0.7em; } .footer { margin-top: 2em; text-align: center; line-height: 1.5; } .footer p { margin: 0; margin-bottom: 1.4em; } hr { height: 0.14em; border: none; color: black; background-color: black; margin: 0; } .aspect-ratio { position: relative; display: block; background: #fafbfc; padding: 0; } .aspect-ratio::before { z-index: 1; content: ""; position: absolute; top: 0; right: 0; bottom: 0; left: 0; border: 1px solid rgba(195,207,216,0.3); } .aspect-ratio--square { width: 100%; padding-bottom: 100%; } .aspect-ratio__content { position: absolute; max-width: 100%; max-height: 100%; display: block; top: 0; right: 0; bottom: 0; left: 0; margin: auto; } </style>

The app is creating duplicate products

When a user adds a custom product to his cart that has a modified price (price increase), the app will create a new temporary product with the right price. This method is the only way to have such custom pricing with the Shopify platform. Note that the app will automatically delete the duplicate usually about 30 minutes after creation. Also, these products are not visible on the live store, only in the backend.
You can thus ignore those duplicate products marked with [CUSTOM] in their title as they will automatically be detected.

My discount codes are no longer working

That is because when you use the Price Increase the app needs to create a temporary product with the right pricing. So when you setup your discount, if you restrict it to specific products, it won't apply to the temporary product the app has created. In that case, you need to make sure that the discount applies to these temporary products by applying it to a whole collection for example.

Is it possible to upload my own fonts

Yes, the text field allows you to upload your own TTF font files and use them to generate a live preview of your products which is great for monograming products.

The swatch image I uploaded is being tiled on the live preview

The pattern/image you upload when using a swatch field does get tiled up. A solution is to use an Image Selector field instead. That way you can upload an overlay image that will not be tiled up.

Feedback & Support

Feel free to leave a review for our App on the Shopify App Store. You can give us feedback and contact (provide as much information as you can) us at: contactuser@domainwebyze.extcom