The Products page is where you can manage your store’s merchandise, complete with images, pricing parameters, shipping values, and more. This guide will go over some of the definitions and values surrounding adding a product, while the Tutorials will walk you through more specifics and advanced set up. Lastly, the Cheat Sheet will give you some specs surrounding a Product .CSV import, and some code examples for displaying in themes.

Finding a Product

Our List Views tabbed structure makes finding a product a cinch. See below for an example of our list, which you can filter by category using the tabs and by product name and other text fields using the search bar. You can also sort by columns and there's a fancy floating bar for selected products that allows you to perform bulk actions such as enabling, disabling, cloning/copying and deleting products:

Adding a Product - Tutorial Video

Product Values

Name: The value inputted here will be the name displayed for your product on the front-end of your store.

Enabled: This toggle determines whether the product is visible in your store.

Short Description and Long Description: Values of these fields can appear on the front-end website, depending on implementation of the product list and product page.

Pricing Values

Base Price: The price of the product before taxes and discounts. If your store is tax-inclusive, then enter the base price with the tax applied.

Tax Class: Specifies the tax class that a product belongs to. A tax class determines the rate of tax to apply to the product price, depending on customer shipping address. You can configure tax classes from the Business Settings > Tax Classes page.

Cost: The product cost is used to calculate the revenue value for the reports. This field is not visible on the store front-end.

On Sale: Check this box to enable a sale price for the product and show the product as on sale in the front-end of your store. Checking this box will also make the "Sale Price or Discount" field appear in the pricing section.

Sale Price or Discount: The sale price or discount amount for the product. Only available if the product is set to "On Sale". Amount can be a fixed price (e.g. 5.00), a discount amount (e.g. -5.00) or a discount percentage (e.g. 5.00%).

Sell By Subscription

Only sell this product by subscription: If checked then the product can only be purchased on a recurring subscription. If unchecked, but one or more subscription billing plans are checked (below), then it will be possible to purchase this product as a one-time standard retail purchase as well as on subscription.

Plans: A list of all subscription billing plans for this store will be displayed. For any billing plans which are checked, they'll show up as billing plan selection options for purchasing this product on subscription on the store's product page. If no plans are checked, this product can not be sold on subscription and no selection options will be displayed on the store's product page. 

Product Details

SKU: A unique identifier of a product.

URL name: The URL name parameter is a string which identifies a product in URLs. A value of this parameter must be unique.

Manufacturer: You can assign a manufacturer to each product and display the information on the product page of your site.

Product Type: This field lets you assign a product type which controls if the product is shippable if it has downloadable files. It can also be applied as a filter for different types of discount rules

Barcode: This field lets you optionally add a numeric barcode, UPC Code or GTIN for your product. 

Uploading Images

You can upload one or more product images to show off your product to prospective customers. All image uploads should be in JPG, GIF, or PNG formats. You can add alternative text and descriptions, and click the 3 horizontal bars to drag to sort the order of your images. Note that different themes may make use of multiple product images differently. 

Volume Pricing

Volume Pricing: With this feature, you can set a different price for different customer groups or quantity tiers. The volume pricing will apply per order, per cart item. When determining the product price, LS will use the lowest price that applies. For an example, check Volume Pricing in the Tutorial section.

Category Values

Categories: A list of categories the product belongs to. A product can belong to one or more categories. In the above example, the parent category is "Men's", and the subcategory is "Tops".

Inventory Settings

Track Product Inventory: Enables inventory tracking for the product.

Hide When Out of Stock: When enabled the product will not show up on the front-end of your store when out of stock.

Allow Negative Stock: When enabled allows the product to have negative stock.

Out of Stock Threshold: The number of units at which the product is considered "out of stock".

Allow Pre-Order: Allows the product to be purchased even when out of stock.

Inventory Tracking

If the Track Product Inventory setting is enabled as described above, this section allows you to track and adjust inventory levels for your product.

Units in Stock: The current amount of units in stock for the product. Cannot be altered directly.

Inventory Correction: Using the inventory correction you can add or remove units from the product stock. Positive number increase stock, negative number decrease stock.

Shipping Values

Dimensions: These fields are used for evaluating the cost of shipping. Units for the length and weight are configured on the Settings/Shipping Config page under the Units section. Product weights are rounded to two decimal points. 

Per-Product Shipping Rate: This allows you to specify a shipping rate for a specific product. In the case that a cart contains only a product with a per-product shipping rate, the quote for that rate will appear itself as a selectable shipping option. Otherwise, the rate quoted for the individual product will be added to shipping quotes yielded for a set of checkout items. The rates are enforced in the same nature as table rates, in that their order determines their precedence, and therefore the rate you'll be quoted for a given location. If a product exists in a cart in multiple quantities, the rate quoted will be multiplied by that quantity (for example - two baseball caps with a per-product shipping rate of $5.00 are added to a cart - the resulting quote provided would be $10). If your per product shipping rates are taxable, you can assign a tax class if desired.

SEO Settings

Title Tag: Set the title for the product's page. If left empty, the product name will be used.

Meta Description: Enter a meta description to be used on the product's page.

Meta Keywords: Set the meta keywords to be used on the product's page.

Product Attributes

Attributes are structured text information assigned to a product and displayed on the product details page. To add an attribute to the product, click the "add attribute" button, and the attribute's name and value fields will appear. If you want to have multiple attributes you can just click the plus sign again to bring up more attribute fields.

Attribute Name: This field will display the name of the attribute on the product page of your store.

Value: The value is used to describe the attribute.

Product Options

Product Options are product parameters which a customer can select from the drop-down menus, and you will see them in the order details.

To add a new option to the product, click the insert row button under the options heading. This will create a new row where you can specify the name and values of the option.

Name: This column describes the option available for the product.

Values: This column allows you to enter multiple values for the customer to choose from. After entering a value press the Enter key to finish editing the value and to start a new one. The values are NOT comma separated.

Generate Product Variants: This button will generate a list of all possible combinations for each option.

This is what the front end of your site might look like once you add Attributes and Product Options:

Product Variants

The Product Variants feature allows you to quickly create products based on combinations of product options, which allows you to have individual stock management, price and images for each option combination. See the Tutorial section for more information on adding a Product Variant.

SKU: A unique identifier of a product variant.

Status: This toggle determines whether the product variant is visible in your store.

Dimensions: These fields overwrite the product dimensions if the variant is selected.

Base Price: Overwrites base price of the product if the variant is selected.

Cost: Overwrites cost of the product if the variant is selected.

On Sale: Check this box to enable a sale price for the product variant and show the product variant as on sale in the front-end of your store. Checking this box will also make the "Sale Price or Discount" field appear in the pricing section.

Sale Price or Discount: The sale price or discount amount for the product variant. Only available if the product variant is set to "On Sale". Amount can be a fixed price (e.g. 5.00), a discount amount (e.g. -5.00) or a discount percentage (e.g. 5.00%).

Track Product Variant: The product variants can track their own inventory when the track variant inventory option is enabled. If it is not enabled, the variant will use the parent product's inventory.

Variant Images: You can upload product images specific to the variant in this section. If no image is uploaded the main product image will be used.

Product Extras

Product extras are like attachments for products. They are similar to products, but can only be added with a parent product. For example, a product extra could be an optional case that comes with a cell phone purchase. Product extras can be added as checkboxes on the front end of your product page. When a product extra is selected, the product view is updated with the correct price.

See the Tutorials page for Adding Product Extras, and more.

Related Products are products which are similar to the item a shopper is viewing. LemonStand's Related Products feature now includes Cross-sells and Upsells. They can be found when editing a product, on the sidebar:

Cross-Sells are standard related products with a new name. Upsells, however, let you define discount rules and display rules for related products. The Cross-Sells tab allows to relate to another products (without specifying a discount), and the floating function bar (when clicked on an added product), includes a delete button.

For example, you could offer someone a 20% discount if they purchase some pants and a related t-shirt together. You can even choose to only show the t-shirt discount if they've already added the pants to their shopping cart if you want. 

This feature gives you even more promotion tools to drive more sales!

The Upsells tab has 3 additional settings: limit cart quantity to 1 item (if checked will not allow more than 1 to be purchased at a discount), discount (either an amount or % value), and display (always show/only show when product in cart).

See our theme documentation to see how Upsells work in theming the Product Page.

Displaying Related Products

You can easily display related products on the product page with a little bit of theme code. If the product does not have any related products, the code is simply ignored. The example below also ensures that any related products are enabled before displaying them.

{% set enabledProdCount = 0 %}
{% if product.related.count %}
    {% for relatedProduct in product.related %} 
        {% if relatedProduct.enabled %} 
            {% set enabledProdCount = enabledProdCount + 1 %} 
        {% endif %} 
    {% endfor %}
{% endif %} 
{% if product.related.count and enabledProdCount > 0 %} 
<h1>Related products</h1>
<ul class="row">
  {% for relatedProduct in product.related %}
    {% if relatedProduct.enabled %}
    <li class="four columns mobile-two">
        {% if relatedProduct.image %}
            <img temprop="image"  class="lazy product-img" alt="{{ relatedProduct.image.title }}" src="{{ relatedProduct.image.thumbnail(64, 'auto') }}" />
        {% endif %}
        <a href="{{ site_url('/product') }}/{{ relatedProduct.url_name }}">{{ }}</a>
    {% endif %}
  {% endfor %}
{% endif %}

You can use the same Twig variables as you normally do for products. For example, in the example above, you could add {{ relatedProduct.price }}

Volume Pricing

Okay, let’s set up some Volume Pricing.

For example, let's look at a product priced at $39.99; a customer in the "Registered" customer group will get the maximum price of $35.95. If they purchase 5 or more of the product in an order, it will be priced at $29.99. For any other customer, if they buy 1 or 2 of the product, they will be paying $39.99 (full price) per product. If they buy 3 or 4 of the product, the price will be $32.99. If they purchase 5 or more in an order, it will be priced at $29.99.

A wholesale customer group, however, is only charged 50% of the original price, at $20.00, no matter the quantity.

Adding Product Variants

Product Variants take product options, such as Color and Size, a step further. A product in LemonStand can have Options such as Color, Size, or anything else that you define. Each Option can have any number of values, such as Red, Green and Blue, or Small, Medium and Large. You can use these options on their own, or you can use them to build a list of Variants, which are like virtual-products with their own characteristics such as SKU, price, images, etc.

Step 1 - Setting Up Variants

Start by going to Product Catalog > Products, and creating a new product. It's best to set up the base product by entering a name, price, SKU, description, some images, selecting a category, and clicking save.

Now you're ready to set up some options, and then variants!

Step 2 - Adding Options

Expand the Options section while editing a Product, and click the button to add an Option. Give it a name such as "Colour". Then click the black plus icon, or hit Tab on your keyboard to add some Values. After typing in a value's name such as "White", just hit Enter on your keyboard. Add as many Options and values for each that you want.

Here's an example of what you could end up with:

From there, click the "Generate product variants" button below your options. This will generate a variant for every possible combination of options. In this example, there are 2 Colours in 3 Sizes. 2 x 3 options equals 6 variants in total.

You can now proceed to editing each variant by expanding the Variants section.

Step 3 - Editing Variants

In the example above, you would end up with a Variants section that looks like this:

From here, you can click on each individual variant and edit its characteristics. Let's edit the Yellow / Medium variant and do 3 things:

  1. Make the price higher.
  2. Add a SKU and enable inventory tracking.
  3. Upload an image specific to this variant.

Editing variants is similar to editing the base product. Any details that you fill in specific to a variant will override the base product.

For example, if you make the base product $10, we can make the Yellow/Medium shirt $16 by editing this variant's price.

We can add a SKU specific to this variant, and enable inventory tracking for this variant as well.

Images can also be uploaded specific to variants, which will be displayed to your customers when they select the options that match that particular variant.

What the customer would see:

Once you've edited your variant, click the blue save button and you'll be taken back to the parent product, where you can click on another variant and edit its characteristics if you want.

Tips For Product Variants

  • By default, variants inherit the characteristics of the parent product. For example, if price is set to $10 for the parent product, all variants will also be $10 unless you specifically set them to be a different price.
  • Anything that is defined specifically for a variant will override the base product. For example, if you set the weight of the base product to 3lbs, but set the weight of a variant to 1lbs, the variant's weight (1lbs) will be used for things such as shipping calculation.
  • If you do not sell a particular combination of options, for example Black / Small, you can click on that variant and disable it using the toggle. This will prevent customers from ordering it.
  • Variants can be added and updated via the CSV import feature, or the API.

Adding Product Extras

You can add extras on the product page, under the tab "Extras".

The only required field for a product extra is the "Name". If no other fields are entered then the price is 0.00, and the extra will be disabled. After you enter a product extra and save the product you can edit it further. You can see the product extra now has a "Edit" link which will direct to a page with more options.

Sale Price

As of right now, sale pricing is not available for product extras. Currently, when a product is on sale, the price of an extra is added to the product price without any discount applied. For example, if you have a product set to $100, and the sale is set to 10%, and you add an extra where the price is $5, the total checkout price for that product will be (100 - (100 * 0.1)) + 5, which is $95. That is the sale price of the product, added with the base price of the extra. In the future we will support sale prices for individual product extras as well.


Product extras for variants are currently not available. However, this will be implemented as soon as possible.

Importing Products via CSV

LemonStand offers the ability to import products via a CSV file. Allowing users to import large batches of new products, as well as update existing products, in a quick and efficient way. The product CSV import tool also supports the import of product images via a corresponding ZIP file and related column in your CSV file.

To better understand the products CSV import process, let's work through an example import that will include product images.

Example Resources

You will need to download our example CSV file as well as our example-images zip file. You can download these files here:


See the supported columns on the Product Cheat Sheet page.

Import The Example Files

To import a products CSV into LemonStand, first click on the Product Catalog button in the sidebar and then click the Products link under the Product Catalog menu.

You will now be on the Products Page. Click on the Import button located to the right of the + button.

This will now bring you to the Products CSV Import page.

The first section is the CSV File section, this is where we will select the CSV file that we want to import. Click on the upload button and find our example.csv file in the location you saved it to on your computer. LemonStand will now upload the CSV file, preparing it for import. Once this is complete you will see a notification next to the upload button that says File example.csv uploaded.

Update existing products

The next section on our Products CSV import page is the Update existing products section which contains a checkbox. Checking this box will cause the import to update any products in the system that match a record in the CSV file. This match is made based on the product SKU.

Create new categories

The next section is the Create new categories section, which also contains a checkbox. Selecting this checkbox will cause the import tool to create a new category in the LemonStand system when it encounters one in the CSV file that currently does not exist. Let's check this box for our example.

In our example CSV file we have indicated that we want our first record, on line 2, to import the product as belonging to the Snowboards category which will be a child of the Sporting goods category. This is done by setting our category in the CSV file as Sporting goods=>Snowboards. the =>symbol indicates the child/parent relationship, and in this case since the Snowboards category does not exist, it will be created on import. For multiple categories, use the pipe "|" to separate them.

Importing images

The next section is the Images section.

The LemonStand Products CSV import tool allows for the import of associated product images. Let's have a look at our file and our example.csv file to examine how this is taking place.

Our example.csv file contains 7 records, as well as the first line which contains our column headers. Let's have a look at the first line which is our column headers as well as our 2nd line which contains the first set of data to import.

name, sku, base_price, images, categories, product_type, in_stock_amount
Green Snowboard, sku_green_snowboard, 159.99,"/snowboards/snowboard-1.png", Sporting goods=>Snowboards, Product, 10

As you can see from our column headers row, the 4th column is images, this means on line 2, after the 3rd comma we will indicate the location of the image we want to use for our product, based on where it is inside our file.

In this case, the image we are referencing is not in the root of the zip archive but rather it is in a folder in the archive named snowboards. So we indicate that the image to be used for this product is located at "/snowboards/snowboard-1.png".

Let's now click on the upload button in the images section and then locate our file. Once the upload is complete you will see a status message that says File uploaded.

Ready to import!

We are now ready to run the import.

Click the Import button at the top of the page. After the import process is complete you will see a section at the bottom of the page that will reflect the outcome of the import process. In our case, we should see that that the import was successful and added 7 items.

If you navigate to the front-end of our store you will now see your newly imported products, images and categories.

Supported CSV Columns

The first line of the CSV file you are importing should always contain the column headings you will be using. The import process will fail if these column headings are not present.

  • name
  • sku
  • barcode
  • description
  • short_description
  • meta_keywords
  • meta_description
  • title
  • manufacturer
  • categories
  • tax_class
  • url_name
  • base_price
  • cost
  • depth
  • width
  • height
  • weight
  • enabled
  • track_inventory
  • allow_preorder
  • in_stock_amount
  • hide_out_of_stock
  • out_of_stock_threshold
  • allow_negative_stock
  • product_type
  • images
  • options
  • extras
  • is_on_sale
  • sale_price_or_discount
  • attributes
  • product_variant_flag
  • product_variant_parent_sku
  • track_variant_inventory
  • sort_order

Columns with special considerations

product_type: if column is not supplied or is supplied but the value is empty, the default product type is used for new products and the product type of existing products is unchanged; if the supplied product type does not exist, it will not be updated (for existing products) or the product will not be created (for new products)

tax_class: same as product_type, if column is not supplied or is supplied but the value is empty, the default tax class is used for new products and the tax class of existing products is unchanged; if the supplied tax class does not exist, it will not be updated (for existing products) or the product will not be created (for new products)

manufacturer: use manufacturer name, if a manufacturer with the specified name (case insensitive) is not found, a new one is created and used

images: to use, a zip file containing the images should be uploaded during import, multiple images should be separated with a comma, the image files can include a folder name if the folder is included in the archive (eg. "/fruits/banana.jpg"). If column is empty, images are not updated. If value is set to dash (-), all existing images are removed. If value is an image or multiple, any existing product images are deleted and replaced with the listed images.

in_stock_amount: if column is missing or has no value, stock will not be updated; if a value is set and is different than the current stock amount (assumed 0 for new products), an inventory correction will be created for the difference between the current stock amount and new stock amount

options: for base products (not variants) - a list of options and all possible values:
Color: Red|Green|Blue
Size: Small|Large|Giant

For product variants - a list of option values defining the product variant:
Color: Red
Size: Small

extras: multiple extras are separated by a double pipe (||) and each extra must have a 'Name' and a 'Base Price' separated by a single pipe (|).

"Case|14.99 || Book|29.99"

product_variant_flag: Indicates whether the row defines a base product or a product variant. Boolean value.

product_variant_parent_sku: the SKU of a product variant's base product

track_variant_inventory: enables inventory tracking for the product variant

attributes: Expected format: Attribute 1: Value 1|Attribute 2: Value 2
If column is present in the CSV and empty, then existing product attributes will be deleted. If column is not present, attributes remain unchanged.

categories: the => symbol indicates the child/parent relationship, and multiple categories are seperated using the pipe "|" character. For example, "Industrial Networking => Ethernet Switches | Dinrail | Managed".

Required Columns

1. sku for new and existing products.
2. name, base_price for new products.

Boolean Columns

There are also optional boolean columns available as follows:

enabled, enabled_backend, track_inventory, track_variant_inventory, allow_preorder, hide_out_of_stock, allow_negative_stock, is_on_sale

For boolean columns, the following values will be considered as 'on': yes, y, enabled, active, 1, true

Making Compatible Imports and Exports

Currently the csv export template does not match the import template. However, you can export products via Twig in such a way that they are import ready. This allows for easy product modification via CSV. 

1. Create a new site template with the following setup:

2. Create a new page using the site template we just created. Set the page's action to "products". Set a URL for your page.

3. Place the following code in your new page's content block:

<span id="csvContent">name,sku,product_variant_parent_sku,product_variant_flag,url,base_price,categories,product_type,track_inventory,in_stock_amount,hide_out_of_stock,options,enabled,tax_class,extras,attributes{% for product in products %}

"{{ }}","{{ product.sku }}",{# Empty spots, because they are for variants #},,"{{ product.url_name }}","{{ product.base_price }}","{% for category in product.categories %}{% if category.shop_category_id %}{% set path = '' %}{% tree categories %}{% set break = false %}{% for catx in tree.items if not break %}{% set tempPath = path %}{% set path = path ~ %}{% if == %}{{path|escape}}{% set break = true %}{% else %}{% set path = path ~ '=>' %}{% branch catx.children %}{% set path = tempPath %}{% endif %}{% endfor %}{% endtree %}{% else %}{{}}{% endif %}{% if not loop.last %}|{% endif %}{% endfor %}","{{}}","{{product.track_inventory}}","{{product.in_stock_amount}}","{{product.hide_out_of_stock}}","{% for option in product.options %}{{}}:{% for value in option.values %}{{value}}{% if not loop.last %}|{% endif %}{% endfor %}{% if not loop.last %}

{% endif %}{% endfor %}","{{product.enabled}}","{{}}","{% for extra in product.extras %}{{}}|{{extra.price}}{% if not loop.last %} || {% endif %}{% endfor %}","{% for attribute in product.productAttributes %}{{}}:{{attribute.value}}{% if not loop.last %}|{% endif %}{% endfor %}"{% if product.productVariants is not empty %}   {% for variant in product.productVariants %}

,,"{{product.sku}}",1,,,,,{{variant.track_inventory}},{{variant.in_stock_amount}},{{variant.hide_out_of_stock}},"{% for name, value in variant.getVariantOptions %}{{ name }}:{{ value }}{% if not loop.last %}

{% endif %}{% endfor %}",{{variant.enabled}},,,{% endfor %}{% endif %}{% endfor %}</span>

    var csvContent = document.getElementById("csvContent").innerHTML;
    var link = window.document.createElement("a");
    link.setAttribute("href", "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURI(csvContent));
    link.setAttribute("download", "upload_data.csv");;

Now when you go to your new page on the front end it will automatically download a .csv file of your products. This .csv file will have compatibility with our product import system. 

So if you want to adjust inventory of all your products, you can download a .csv file through this method, open the .csv file in a spreadsheet editor and adjust all your inventory easily. Then just import the CSV back into LemonStand.

Render Product Extras

Add a partial to your product page to render the product extras:

{% if product.extras.count %}
  <div class="clearfix">
    {% for index, extra in product.extras %}
       <div class="extra">
            <label class="title" for="{{ 'extra-'~index }}">{{ }} ({{ extra.price|currency }})</label>
            {% if extra.enabled %}
                <input type="checkbox" id="{{ 'extra-'~index }}" {{ checkbox_state(postedExtras[], }} name="extras[{{ }}]" data-ajax-handler="shop:product" data-ajax-update="#product-page=shop-product">
            {% else %}
                <input type="checkbox" disabled="disabled">
            {% endif %}
    {% endfor %}
{% endif %}

You can also add some code to your cart items partial, to indicate that extras are included with the product.

{% set extras = item.extrasString() %}{% if extras %}
     {{ extras|unescape }}
{% endif %}

You can show the product price without the price of the extras included by calling the priceNoExtras method, or the fullPriceNoExtras method which returns the price with sale and tax as well

{{ item.fullPriceNoExtras()|currency }}
{{ item.priceNoExtras()|currency }}