Kartris is a free ASP.NET web application for running online stores. The system is fully featured e-commerce CMS (content management system) that can store and display product and other data to customers, and has the e-commerce elements that allow items to be selected and purchased, and orders to be processed.
Kartris is written in VB.NET 'web forms' with an MS SQL 2012+ database, and as such must be hosted on an MS Windows Server running the Microsoft IIS web server for production deployment, although it can be run for development and test purposes on a variety of Windows installations. The software consists of three main elements:
Kartris has a modern, user-friendly interface that makes use of AJAX to deliver a fast, feature-rich experience that works on all modern browsers.
Certain sections of this manual are highlighted either for importance, or because they refer to more technical information that is intended largely for developers. We have marked such sections in colour as follows:
Sections marked like this contain technical information intended primarily for developers and IT specialists who are setting up Kartris systems. A general user can normally ignore these sections.
Sections containing important security or other warnings are highlighted in red. All users should pay special attention to these sections.
There are two main scenarios for setup – local and remote. 'Local' means installation on a computer you have full access to such as your desktop or laptop computer, or a server if you have full admin rights. 'Remote' means a computer you can only access via FTP and MS SQL.
You must have the following software installed in order to run Kartris.
For best performance, a modern browser such as Firefox, Chrome, Safari or Edge for the back end. The front end still supports versions of Internet Explorer still under support.
NuGet is a Microsoft run service that allows you to import packages from an online repository, directly into Visual Studio. This is probably the easiest way to get hold of the latest Kartris code to set up a new local version for development.
Select Installed > Visual Basic > Web > Previous Versions from the left hand panel.
Then choose ASP.NET Empty Web Site in the main content area, and choose a name and location for your project. The version of the framework isn't so important, as that should be set later when we pull the files in. But you must have at least .NET 4.6 installed.
Next, remove any files and folders that Visual Studio 'helpfully' adds to the web site, so it really is empty.
Select Tools > NuGet Package Manager > Manage NuGet Packages for Solution.
Click the 'Browse' link/tab, then type 'Kartris' in the search box. You should find the Kartris package.
Click to select this, then check the box to install to the project you've just set up. Click the Install button.
Visual Studio will show you a list of dependencies. Click OK to proceed with the installation. You will also need to approve some licenses for dependencies. The required Kartris files will then be downloaded to your web.
In Visual Studio, click to run the web site. You will get a warning that there were errors (this is because we don't yet have a database). Click YES to run the last successful build. You should see the setup routine in your web browser.
Follow the steps through. You will get to a step that lets you setup a database. Specify the path to your SQL Server, choose a database name and select that this is a new database, and Kartris can create and populate this for you. The checkbox to add demo data adds a few sample products and orders, which make it easier to test the basic features, and can easily be deleted later.
Installing the database can take a few minutes. Once done, you should see the admin account details that the setup routine created for you. We suggest you make a note of these now somewhere safe. You can change the password later if you wish, from within the Kartris back end.
Once you get to the end of the setup process, you should see two links, to access the front and back ends of Kartris.
The setup routine will make changes to the web.config file, to include the connection string to the new database and some other minor changs.
Our site downloads page has links to download the latest zip:
https://www.kartris.com/t-Downloads.aspx
The software itself comes as a zipped file.
If you want to obtain the very latest up-to-date code, you can go to the source repository on Github (this may contain development code, unfinished work, bugs and other issues, so the version zips on our downloads page are strongly recommended).
Don't forget to unblock any zip files you download before you unzip them. More information...
The process on IIS7 and earlier will be similar, the main difference being that the web site will run as a specific Windows user rather than an app pool identity. So you will need to add that user to your SQL Server, and create Windows permissions for it.
Kartris is featured within the Microsoft Web App Gallery. Various Microsoft Tools including IIS.
Kartris - Microsoft Web App Gallery
The install routine is a series of setup screens that displays in your browser when you first upload files and successfully run Kartris. This sets some basic settings and creates an admin login password too. The steps are as follows:
For security, Kartris secures passwords for both admin and user accounts by "hashing". For a new installation, just click to proceed here and accept the new random hash salt value we've created.
For more information about Kartris's password security, see @18.4. Password security .
If you want to double check the name of your MS SQL Server instance, you can open up Microsoft SQL Server Management Studio (from your programs menu in Windows) and then check the name shown there. If your database server is running on the internet, or on your network, it might have an IP address or another name. It will normally be something like this:
localhost\sqlexpress
Where you have the MS SQL and web server running on the same machine, and if you're developing in Visual Studio, you can use Windows authentication. There is no username or password stored in the connection string; the web server app pool account should have permission to access the database. If you are using Visual Studio, in most cases that user has admin permissions for databases, so you should not specifically need to set it up.
Generally it is best to set up the database manually first on your MS SQL Server, and then enter the name here. It is also possible to create a database too but it requires sufficient permissions. If you're running in Visual Studio, it should have sufficient permissions to create a new database.
Even if you don't check this box, we add a lot of required data into your Kartris installation such as config settings, language strings and so on. But if you'd like to have a little test data in your new site such as categories, products, customers and orders, check this box. You can easily remove this test data later.
If the permissions are right, Kartris will connect to your database, run any setup scripts to create the database structure and stored procedures, and will generate an admin login. Copy and paste these details somewhere so you can access the store when setup is complete. You will be able to change the admin password or create other admin user accounts later.
Kartris should automatically pick up the web address you're using. You can also choose a tax regime and default currency.
This option is for countries that have a VAT tax system, outside of the EU. The UK, post brexit (most likely) and New Zealand can use this option, for example. Tax is calculated based on a percentage figure for each line item in an invoice, and then at the end you get a total for the goods, the tax, and a grand total.
This works similarly to the @2.6.5.1.1. VAT option above, but has some extra features. Because the EU consists of nearly 30 countries, it will set all of them to charge tax (based on the TaxRegime.config file in the root of the web, which contains a list of all EU members). VAT will be added to all orders from an EU country. But if the country is not the home country of the site, a VAT number field will show. If a valid EU VAT number is entered here, the VAT will be zeroed as the customer would declare this purchase and pay VAT in their own country at the prevailing rate.
This is a simple sales tax system where tax is calculated as a percentage of the order value, rather than on individual items. You can set the tax rates of multiple states so if you have locations in multiple locations, orders will pay the correct amount. In states where sales tax varies by county, you can also add in those locations and have the appropriate tax rate for each (this would be done after the tax setup wizard has done the basic setup).
Canada has a sales tax system with two taxes, GST and PST. In some provinces, these are combined into a single HST amount. If Canada tax is selected, there will be two tax amounts configurable for each item.
This creates a simple % sales tax to be added at the end of an order. In most cases, you will find one of the above models may more closely resemble your country, in which case it would be better to select that model, and then make country changes manually later.
The install routine will check write permissions to ensure it can operate properly. These permissions are required to ensure you can upload images, and logs of errors can be created, for example.
The install routine will show you the changes it will make to the web.config in order to set the database connection up. It will also change the resource provider (via the globalization tag) so the software will use the database for language resources rather than the file which is used by the install routine.
If Kartris cannot write/modify the web.config file, it will give provide a link for you to download the new edited file. You will then need to load this to your site, via FTP or just copying and pasting (on a local site). You may need to restart the site if the file is locked. Generally the site will restart after the web.config is updated.
If all went ok, you should see a link to the front end back ends. It may be a little slow the first time you access Kartris after it is first installed, or the server restarts. But once loaded, it should be responsive and fast.
<add name="KartrisSQLConnection" connectionString="Data Source=localhost\SQLEXPRESS;Database=BadDBName;Integrated
Security=True;connect timeout=50" providerName="System.Data.SqlClient"/>
<!--<globalization resourceProviderFactoryType="Kartris.SqlResourceProviderFactory"
culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>-->
If you wish to upgrade an existing Kartris site to the latest version, then you need to proceed as follows:
The back end is the admin section for Kartris. In some cases the terms 'back end' and 'admin section' may be used interchangeably.
User accounts can be restricted using the permissions checkboxes so that they can only access certain areas in the back end. The back end is divided into four broad areas:
This permissions structure serves two purposes. Firstly it allows you to prevent certain users from being able to make major changes to site settings, or products, for example, while allowing them to process orders. Secondly, it simplifies the back end somewhat by removing extraneous menus for users who do not need them.
The config settings should not be confused with the web.config, which is a file on the site holding basic configuration for the site including the database connection. Config settings control all kinds of things relating to the functioning of your store, from the sizes of various images to the availability of certain features to users.
Values are stored in the database (in the tblKartrisConfig table); this has a number of advantages over setting values in the web.config.
Some important config settings are set during the setup routine; most of the others are less critical and can be tweaked later once you have Kartris running and your site under development.
Once you have located a config setting, you can click to edit it. Be extremely careful to ensure that you do not set config settings to an invalid value. This can cause errors in the operation of Kartris. Great care should be taken to double check values being changed before you click to submit any changes.
It is also possible to change config setting values directly in the tblKartrisConfig table of the database. However, the new setting will only take effect after the site is restarted (this is because the actual config setting values that Kartris uses are stored as application variables which are built when the application starts from the database values - updating config settings through the Kartris back end also triggers a rebuild of these values).
frontend.users.access - this provides control over the level of access to the site that the public has.
'No' = full site viewable
'Yes' = must login to view site
'Partial' = prices & add buttons hidden until login
'Browse' = full site viewable, must login to checkout
<add key="TaxRegime" value="EU" ></add>
The possible values are:
The tax system in Kartris works differently for US/simple models, and EU tax.
The tax rates page itself is only really active when the tax regime is set to EU. It will list various rates which can be used for the various bands of VAT in your country. For example, in the UK these would be 0%, 20%, 5%, etc.
Once these are set, you can choose which tax band applies when creating or editing product versions. For example, in the UK some items such as childrens' clothes are exempt from VAT, while most items will come under the 20% tax band.
The tax settings of your store depend to a large degree on where you are based.
To simplify matters, Kartris features a 'Regional Setup Wizard' (found within the 'Regional Setup' menu). This walks you through some simple questions and then sets up the various tax settings for you, including determining which countries/states are activated and set to have tax charged to them.
Note that the tax regime used is hardcoded in this wizard. That's because it uses the tax regime specified in the web.config file, which is generally set when the store is first set up.
See @3.5.1. Tax regime for more details.
Most stores will typically show a singe price for each item, which might be either inc tax or ex tax. In this case, you should set your frontend.display.showtax config setting to 'n'. If you wish to show the tax associated with an item, set this to 'y'.
The way prices are displayed within Kartris depends on both of the following config settings:
The exact format will vary as follows:
Table to show how the two tax config settings affect the display on the site |
frontend.display.showtax |
||
y |
n |
||
general.tax.pricesinctax |
y |
Ex tax £8.51 Inc Tax £10.00 |
Price £10.00 |
n |
Ex tax £10.00 Tax 17.5% |
Price £10.00 |
You can set up any number of shipping methods for your store, such as 'standard post', 'express post', 'courier' and so on. These will allow you to set separate pricing structures for each.
Once you have created shipping zones and shipping methods, you can then start to set the rate structure denoting the cost of shipping, or link to real time shipping systems. Click the 'rates' link by each shipping method to set rates.
You can set up any number of shipping zones for your store. A shipping zone is an area which has its own shipping price levels. Countries and state records will be mapped to the appropriate shipping zone later. At the simplest, you might want a 'home' zone for orders in your own country, a 'regional' zone for countries nearby, and a 'rest of world' zone for everywhere else, for example.
If you want to subdivide your own country into various shipping zones, you can do this by having multiple regional 'country' records each mapped to their own shipping zone. So for example, a store in the UK might decide to have three shipping zones within the UK:
You would then need to have three corresponding 'country' records, each of which is mapped to its appropriate shipping zone.
You may find that some tabs referred to below are not visible when you log in. In this case, the backend.expertmode config setting is probably off. This setting hides some back end features, even to those with 'config' user permissions. You can edit the config setting to turn on expert mode, which will show advanced tabs in the db admin section.
Expert mode also allows you to edit certain field details of config settings and language strings that are normally hidden.
This provides an easy way to clear data related to products, orders or sessions. For each type of deletion, the system knows which tables should be cleared.
Where possible, avoid clearing individual tables directly in the database unless you're absolutely sure you understand the consequences. There are some tables in Kartris (such as config settings and language strings) that should always have data, even in a new install that has no products or customer records.
Deleting data from some tables without understanding the relationships can also leave orphan records behind. For example, version records always link to a parent product. If you delete all data from the products table only, you would end up with many orphan records from versions, language elements (the language specific content of products like descriptions and names), related products, etc.
This provides an easy way to run a query against the database. You can user SELECT, INSERT, DELETE or UPDATE queries.
SELECT queries will return results in a tabular format.
Custom exports are saved reports that you can run to output specific data that you need. If you go to the 'Saved Exports' tab, you can see some pre-written custom exports that come as standard within Kartris - clicking on edit will allow you to see how these are constructed. An export requires the following information:
This gives an overview of your database, and lets you back it up. Note that this fires the backup facility within MS SQL server. It does not enable a remote backup. You should discuss with your hosting provider about the best way to obtain an off-server back up of your MS SQL database.
The page shows the root of the current web, which can help you format the correct path to create the backup file in the correct location within your web in order to let you download it with FTP.
Kartris keeps logs of certain actions by admins such as logins and changes to config settings. This can be useful when diagnosing problems that you suspect were caused by admins changing settings.
Before you start entering product data, it is important to understand the way this data is structured in Kartris.
There are three basic required elements of product data structure:
A product must have at least one version, and feature in at least one category – so in this respect, all three elements of data structure are required for every product item you have.
This is similar to an options product, and is created in the same way. But once you have configured the options, you can choose to create 'combinations'. The system will then create a unique version record for each permutation of the options. This allows you to record stock level for each permutation separately, have a different SKU / item code for each permutation and set a unique price for each too.
The number of permutations will be limited to a few hundred for performance reasons. Remember that you only need to create a combinations product if you are stock tracking or need a unique SKU or price for each permutation - otherwise use an options product.
In some cases, none of the built-in Kartris product types will suit your purposes. A typical example would be a site producing bespoke curtains or signage. You would need the user to enter a height and width (which could for example be anything in mm between 30 and 3000). Options would be impractical as you'd need to create every option between 30 and 3000. Furthermore, height and width values would both be required to calculate the area of fabric needed, and then the price - but option prices can only apply to a single option selection.
Fortunately, if you're familiar with ASP.NET, it is possible to create virtually any type of product configurator and plug it into Kartris. This is done by creating a custom user control that contains all the logic needed to price and detail a product. Examples of the kind of thing that is possible with a custom user control:
For more information, see @14.3. Custom product controls
There are several options for how to format product appearance on the front end of the site in the listings. You can set this globally (for products that are set to use the global default) using the frontend.products.display.default config setting or override it at category level, which will apply to all the products displayed within that category.
This formats products into a box, typically several per row, featuring a product image, the product name and 'from' pricing (if turned on).
The template used:
/UserControls/Templates/ProductTemplateShortened.ascx
CSS class:
.products_shortened (located in sections.css)
This formats products one per row, with an image, product name and truncated description, plus the 'from' price (if turned on).
The template used:
/UserControls/Templates/ProductTemplateNormal.ascx
CSS class:
.products_normal (located in sections.css)
This formats products similarly to 'Normal', but also includes their versions, so pricing can be seen and items added to the basket directly from the product listings, without having to click through to the product page itself. Any type of product - single version, multiple version or options - can be displayed in this way, including different types on the same page. 'Out of stock', text-customization and other version features all work exactly as they would on the product page itself.
The template used:
/UserControls/Templates/ProductTemplateExtended.ascx
CSS class:
.products_extended (located in sections.css)
This is similar in terms of content and structure to 'Shortened multi-column', though has a different control and CSS class, allowing for different formatting if desired.
The template used:
/UserControls/Templates/ProductTemplateTabular.ascx
CSS class:
.products_tabular (located in sections.css)
You can set the number of products per page for each type of product display from the following config settings:
frontend.products.display.extended.pagesize
frontend.products.display.normal.pagesize
frontend.products.display.shortened.pagesize
frontend.products.display.tabular.pagesize
frontend.search.pagesize
There are three selectable types of product – single version, multiple version and options product. These are explained further in @4.1.4. Product types.
When you select the product type, some of the dropdown menus immediately below will be enabled or preset to certain values and disabled. This is because certain selections of these only apply to certain product types.
If you are editing an existing product, and find that you are not permitted to change the product type, it is most likely because the product has associated data which is incompatible with the other product types. For example, if you have a multiple-version product, it cannot be changed to a single version or options products without first deleting the extraneous versions.
This makes clear if there are any reasons why the product being viewed is not visible from the front end of the web site. The reasons include:
If you find for some reason that a product you created doesn't show up on the front end of the site, check it in the back end - this warning should provide clear guidance on the reason, and hence what steps you need to take to fix it.
Once you have created a version, you may wish to add images or media. This can only be done for multiple version type versions.
Kartris versions can have unlimited images. To add an image for a version, click the images tab and then 'Add new'.
Hit 'Browse' and navigate to an image on your local computer. Ideally, this image should be sized already for use as a 'large view' image on your site. Ideally this should be big enough to exploit the space available on large screens (e.g. 1200px or more wide) but compressed to a reasonable size (perhaps couple of hundred KB).
Once selected, click the 'upload' link to the left of the browse box.
You can upload multiple images one by one, or you can multi-select in the dialog and upload several at once. They will appear here as a list. The image order can be changed using the up/down buttons, or it can be deleted.
Where there are multiple images, only the first will display within the version listing. The others will be visible in a gallery under the first image if the image is clicked to view the large view.
You can upload or create links to media in much the same way as for products. See @4.2.2.8. The 'Media' tab for more details.
Kartris products can have unlimited images. To add an image for a product, click the images tab and then 'Add new'.
Hit 'Browse' and navigate to an image on your local computer. Ideally, this image should be sized already for use as a 'large view' image on your site. Ideally this should be big enough to exploit the space available on large screens (e.g. 1200px or more wide) but compressed to a reasonable size (perhaps couple of hundred KB).
Once selected, click the 'upload' link to the left of the browse box. The image should appear in the list.
The image aspect ratio will be maintained, and it will be reduced in size where necessary for use as various sized thumbnails, normal sized view, and large view.
You can upload multiple images one by one, or you can multi-select in the dialog and upload several at once. They will appear here as a list. The image order can be changed using the up/down buttons, or it can be deleted.
Where there are multiple images, the first will be used for the product on the front end of the site. On the product page itself, the first image will display larger, while the others will be thumbnailed below in a gallery. A large view feature is automatically provided.
If no image is included, a place-holder image may be displayed on the front end instead, depending on the frontend.display.image.products.placeholder config setting.
Kartris supports a number of different media formats that you can upload or attach to products or versions. You can also choose an icon for each media clip (for example, a screenshot), otherwise the media will be served with a default icon for whatever the type is.
Attributes will need to be set up before using this feature.
For more information on setting up attributes see @4.5. Product attributes
Check the attributes you wish to use. If they are free-text type, a text box will appear (this accepts values for all languages configured in your Kartris). If the attribute is a fix-option type, you will get a choice of selection.
The sort criteria for items is set at the parent. If you want certain products to show in a particular order, you must set this at the parent category of those products. First you set the criteria by which products will be sorted:
Sort Products By :
The last one of these should be selected if you wish to manually sort the products into exactly the order you required.
You also need to set a sort direction:
For example, sorting by 'Product Last Modified Date' and sort direction 'Descending' will show the most recently edited/added products first.
Alternatively, from v2.9014 onwards, you can also drag and drop sort too.
If sorting products manually ("Product Category Sort"), make sure you select the direction as 'ascending'. It won't work correctly if set to 'descending' as the code that tries to find the item above or below to swap with will find the wrong value.
The sorting of categories is conducted in a similar way to sorting products; subcategories sorting criteria is controlled from the parent category.
Top level categories are always manually sorted. You can click the 'view categories' toolbar button and then change the sort order of categories with the up/down buttons to the left hand side of each category.
Alternatively, from v2.9014 onwards, you can also drag and drop sort too.
On sites with fewer than 25 option groups, when you view the options tab under a product, all the options will be shown.
On sites with 25 or more option groups, only the option groups which have been selected for this product are shown, and they are collapsed by default. They can be opened to view the option values with the overlapping squares icon. Once expanded, there are two links to quickly select or deselect all the option values.
Once you have created options, you can choose to convert the options product to a combinations one. Click on the 'option combinations' tab. For more detail see @4.1.4.4. Combinations product.
Attributes are sometimes confused with 'options', but they are quite different. Options are choices that are available to a customer to select when choosing a product. Attributes on the other hand are fixed pieces of information that apply to the product and cannot be selected or deselected by a customer.
To give an example of usage, a book might have a number of attributes:
ISBN (unique book number that all books have)
Publisher
Author
Genre (thriller, romance, non-fiction, etc.)
Format (hardback, paperback, audio book, e-book)
Once created, you can enter the information for each and every book you feature on your site (although there is no requirement to enter any attributes for any item where you don't wish to).
Go to 'Product > Product Attributes'. A list of all current attributes appears. You can click to create a new attribute, or edit an existing one.
Attribute type is fixed as 'text', but other types may be supported in future.
You can control if the attribute is displayed in the product page from the checkbox – unchecking the box means the attribute is hidden from displaying there.
If all the attributes of a product are hidden in this way, the 'product details' section on the product page will be hidden.
You can control whether an attribute is searchable too, with the 'include in search' checkbox. For example, you might not want voltage to be searchable, but you would most likely want the author attribute for a book to be searchable, or the ISBN number, as customers are very likely to use these to find particular items.
The final option is 'Show on comparison table'. This sets the circumstances under which the attribute will be displayed when comparing products.
The object config system is a way of storing extra settings at product, version or category level, which can be edited from the item's page in the back end. These are kind of like config settings, but they apply just to a specific product or version.
ObjectConfigBLL.GetValue("K:product.addtobasketqty", 99)
Where 99 is the database ID of the product, version or category that the object config setting is for.
This controls the display of the 'add to basket' region of the product. The valid values are:
It should be noted that a customer can still edit the quantity of items as free text within the basket page, or click multiple times to add further items, so this setting does not create any limitation on what a user can checkout with.
Where no value is entered, the product will default to use the frontend.basket.addtobasketdisplay config setting value. So you should set that to act globally on your store, and then use this object config value on a per product basis to override it for particular items if desired.
Custom controls is an advanced developer topic. It is a prototype system that allows the normal product 'add item' section for a specific product to be replaced by a custom user control. The control can handle all the logic of displaying options, accepting text input, looking up prices from a web service or spreadsheet or new database table, making calculations and formulating the price and description of an item which can then be placed into the standard Kartris basket. This permits total flexibility in the kind of products Kartris can handle, with total freedom for skilled developers to create complex configuration tools for products. It's particularly useful for handling custom measured items such as curtains, signage, boxes, etc. where the price can be a factor of multiple dimensions which themselves have 100s or 1000s of possible values. In these cases, it's simply not possible to use options.
This object config setting holds the name of a control in the /UserControls/Custom/ folder that this product should use, for example 'SampleCustomControl.ascx' (which we include as a sample in the core Kartris zip).
Most items you sell will probably be sold as individual pieces, in which case the unit size is 1. This means the basket allows only values divisible by 1 (i.e. integer values).
But for some items, you may want to change this. If you sell cloth for example, it may be that you price it in metres, but can provide it in any length to the nearest centimetre. In this case, you can set the 'unitsize' object config for this item to 0.01 (1cm = 0.01m, the unit you're pricing in). Setting the value to 0.05 would mean only values rounding to 5cm would be accepted, and so on.
It can also work in the other direction. If you sell screws or bolts to the nearest 100 or 50, you can set the unit size to those values, so customers can only add values divisible by 100 or 50 to the basket.
The unit size can be any value, you could set it to 12 if bread rolls are priced individually but only available in 'dozens' or 0.25 if you price an item in kilograms but actually deliver it in multiples of a quarter kilo.
If a user tries to add an incompatible quantity, either from the product page, or by editing quantities in the basket, a warning is displayed indicating that the item can only be ordered in multiples of whatever value you have set.
It is important to remember though that the posted price on the web site is always for 1.000 of an item. So for cloth or rope, it would be the per metre price (even if you can choose fractions of a metre) and for screws or bolts, it would be the single item price, even if the item must be purchased in larger quantities.
Suppliers are manufacturers or resellers from whom the store purchases items it sells.
To access suppliers functionality, go to 'Products > Suppliers'.
Any suppliers you set up will be available in the 'suppliers' selection when editing or creating a product.
Setting the supplier is useful to help with managing stock in the back end of Kartris. You can list all the products from a particular supplier from the suppliers page – this makes it easy to locate all items from a particular source if you have a recall or other issue to attend to.
Also, you can filter the stock level warnings ('Products > Stock Levels') by supplier. This allows you to see which items need ordering from any particular supplier while preparing an order.
If you sell items where you have a limited number in stock, and where your resupply period might be more than a day, you will normally want to use stock tracking to ensure you don't sell items that you cannot deliver.
Stock tracking does not need to be activated globally for the store. Instead, you can apply just to the items that you need to track stock for.
When creating or editing a version, check the 'stock tracking' checkbox. There are two relevant text fields: the actual stock quantity, and the warn level.
When the stock quantity reaches the warn level or below, a stock warning will appear in the 'To Do' list on the right hand side of the back end. This way, you can re-order more stock before your supplies are exhausted.
Items which are out of stock will have their 'Add' button on the front end replaced by an 'out of stock' message to prevent the items being purchased.
You can use the frontend.orders.allowpurchaseoutofstock config setting to allow out of stock items to be purchased on your store.
Orders are accepted through the front end of Kartris. But this is just the first step. The store owner will want to review orders, possibly check for fraud or other problems, and then assuming all is well, process them.
This section deals with processing orders and the various options and settings that affect the order process.
The first step to processing an order is to find it – there are several options for this in Kartris:
There are 4 stages for orders to move through. These are indicated by 'Order Status' checkboxes when viewing an order in the back end.
The order has been sent to the store owner – this box is checked when an order is successfully placed. Sometimes we refer to this simply as 'sent'.
An invoice for payment has been issued – this box is checked manually in the admin section to record that an invoice has been issued to the customer for payment.
Payment has been received – this box indicates that payment for the order was successfully received. In the case of an online payment, the callback process normally triggers this box to be checked automatically when a successful payment is made.
The order has been dispatched – this typically signifies that the order process is complete where payment was received via the web site. It is checked manually by the store owner once the order has been shipped. For orders that have been invoiced, this is of course not the end of the order process as payment is still awaited.
The order has been cancelled (Kartris v2.0+) – checking this box retains the order in the database, but cancels it from order totals and releases any stock items back to the store.
In the most common scenario where a customer makes an online payment for the items in their basket, the first three boxes will typically be checked, leaving only the dispatch of goods to be manually changed on the order.
You can see and also adjust the status of any order by changing the status checkboxes and saving:
The 'Order Progress' box is normally updated automatically for online payments just to confirm the payment, but the admin user can add extra comments and choose whether to send the status update to the customer by email. This is a useful way of notifying the customers of shipping delays or any other issues that might affect their order. These comments can be viewed from the 'My Account's section if the customer logs in to check the order progress.
There are a few common situations which may require you to edit an order:
Rather than cancelling the order and letting the customer start again, you can choose to edit the order.
First, click to the order you wish to edit, and click the EDIT button at the top. You will see a multi-tabbed page, the first tab is the basic customer details.
The second tab is probably where most changes will be made as it lets you change the items in the order. When you first view this, the basket side to the right will be blank. Click the button to load the items from the original order into the basket.
You will need to reselect shipping - you can flick to the original order text tab to see which method was used on the original order. Remember that if you've edited the items in the order, the weight or value of the edited order might mean that the shipping cost is different to before, or even that the method used on the original order is not available.
When you click to save the order, you'll see a confirmation popup.
Clicking yes will create a new order from the edited details; the old one gets tagged as cancelled, but both remain linked. When you view either, you will see a breadcrumb trail that links them.
In many cases, if you edit basket items, the order value will change. If the customer has paid already online, you will then either need to collect more from them, or give a partial refund. Once you have done this, you can update the customers account using the payments page (Orders > Payments).
Enter the order number, click 'add' and the system will find the order and the payment required. You don't have to link payments to a specific order, so if you are giving a general account credit, or making some other adjustment, you can do that too.
If the payment is positive, that means you received more money from a customer. If you refunded a customer, show the payment as a negative value.
The process is very similar to @5.3. Editing orders, but you start the process from Orders > Create a New Order.
There is an 'Issue Invoice' link from each order. This can be used to view a print version of the invoice for printing if you require a customer be sent a print copy with their order, or by post to request payment. Note that viewing or printing this invoice does not automatically check the 'An invoice for payment has been issued' box. That box must be checked manually by the admin user to confirm that the invoice was sent to the customer.
Customers may view invoices from within their 'My Account' section in a print-ready format so some stores may decide to use this as the primary delivery method for invoices and receipts.
Although we use the term 'customers', the user records created in Kartris can actually be for people who may not have purchased anything on your site. For example, a user can create an account on the system in order to create a wish list, or save baskets, or sign up to the news letter.
If these users decide to purchase at a later date, they will use the same account that they created previously.
By keeping all user data linked to a single account (which is unique for an email address), it is easy for both the store owner and the customers themselves to see order history and access other features of the software.
You can click through to a customer from any order record in the back end.
On the Customers page ('Customers > List/Find'), you can search by part of the email address, name, company or by the ID number. If you enter a number alone that matches exactly an ID number of a customer in the database, Kartris will take you directly to that customer's user record.
If you deal with certain types of customers such as retail customers, wholesale customers, preferred customers, etc. you may find it useful to group these customers so that you can easily find all similar customers or apply certain benefits, prices and restrictions to them. The customer group functionality in Kartris can be accessed by going to 'Customers > Groups').
The interface
lists all the customer groups, and has special links to 'affiliates'
and 'mailing list', which are special built-in customer
groups.
One of the common requirements of an online store is to hide certain categories and products from all but specific customers. When editing a category, product or version, you will see a dropdown menu selection for 'Limit by group'. In this way, you can link a category, product and/or version to a specific group. In this case, only customers who are logged in to the front end and are members of the appropriate group will be able to see these items. Other customers will not see them, or be able to find them in searches.
Although you can set a % discount at customer level, you may find that this does not give you the direct control you need. You may want to individually price certain items for a specific group, so for example it might be $15.00 for retail customers, or $13.25 for wholesale clients.
Kartris has a tab under versions labelled 'Customer Group Prices' where you can override the price of any version for each customer group. Leaving the price at zero for any group will mean that the item for that group will be at normal price (and not zero!).
Of course, this functionality can enable you to have customer-specific prices too - you can create a customer group and assign just one customer to it, and then set prices for that group.
You can set a % discount for each customer if you wish. This will apply a % discount to the value of all items within the order, excluding shipping, handling and any other costs. This is in addition to any customer group discount applied so care should be taken to not give double-discounts inadvertently.
In Kartris, passwords are hashed for additional security. This means that the raw password is not stored in the database; instead, a function called a 'hash' is used to scramble the password, and this scrambled value is stored. When a customer logs in, the password they give is also scrambled and then compared to the stored scrambled password to make sure they match.
Because the raw password is not stored, the system cannot send the password to the customer as a reminder because the hash is not reversible. Similarly, you cannot find the password of a customer or an admin from the back end, or even by looking directly into the database.
Therefore if a customer loses or forgets their password, it must be reset. There are two ways to do this (1) the store owner can change any customer password from the back end (2) the customer can request a password change from the front end.
In the first case above, you should always be careful when customers request a password change on the telephone or by email that you are absolutely 100% sure that the customer is the genuine owner of the account.
In the second case (online request to change password), the customer will be sent a link to the email address of their account that is valid for a limited period (1 hour) and that will allow them to reset their password.
There is no way for a customer to change their own email address in Kartris. The email address is assumed to be unique, and therefore we use this as the username. To avoid various issues with changing email addresses (including verification of the new account to ensure that its owner accepts the change and the problem of existing accounts), we have made changing email addresses a back-end only feature at present. If a customer needs to change their email address, then their only option is to contact the store owner so that an admin can change it for them.
The Kartris back end will check that the email address is not already in use (you cannot have two accounts with the same email), but it will not check that the owner of the new email address consents to the change (i.e. that the person making the change owns the new account), or that someone requesting the change (by telephone or email) is actually the owner of that account.
For security reasons, you should always be careful when customers request an email address change that you are absolutely 100% sure that the customer is the genuine owner of both email accounts. The best way is to write to both the old and new addresses separately and get a reply from both (a reply that includes your original email text). It is vital that you don't inadvertently hand control of an account to a third party due to lax security procedures. Although they could not access credit card data, they would be able to access personal details such as address and phone number as well as order history.
Most payment gateways have a setting 'AuthorizedOnly'. If checked, this means that only customers whose accounts have the 'Approve for special payments' box checked will see this payment option at checkout. This is most commonly used for payment methods you may want to restrict to trusted customers, such as 'PO_OfflinePayment' (where a customer can order goods without a credit card and the invoice is sent to them for payment later).
If the 'AuthorizedOnly' box for a payment method is not checked, then this payment option is available to all users.
If the 'AuthorizedOnly' box for a payment method is checked, but the user is not approved for special payments, they will not see this option at checkout.
When an account is created, Kartris will store the current language in the account record so that it can be used for any communications later. It is also useful to know the preferred language in case you need to contact a customer about something.
This determines whether the user has requested to become an affiliate or not (they can do this from a link in the 'my account' section on the front end). You can approve an affiliate by giving them a % commission above zero.
Kartris operates a strict 'opt-in' mailing list. This requires not just that someone sign up to the mailing list (including by clicking a link in the 'my account' section or checking a box during checkout), but also that they respond to the confirmation email that is sent automatically, by clicking the link within it.
Over the years that we have produced e-commerce software, some customers have queried the need for the extra confirmation step, as they feel it reduces the number of sign-ups on the list. While it does indeed do this, the reason is clear: to prevent the addition of addresses by people who don't own those addresses (either accidentally or maliciously).
For example, I could sign up an email address of someone with a very similar email address to mine by accident. But I would not then receive the confirmation link, and so could not click it to confirm the address. Consequently, this bad address would not be added to the mailing list.
Your web host will not tolerate you continuing to mail to a list which has generated spam complaints because some addresses turn out to belong to people who were added without their consent, especially once they find it is because you did not confirm addresses properly. In such cases, the whole list is tainted. While 99% of the addresses might be genuine, you have no way of knowing which ones are not, and will have no choice but to discard the whole list and start again using proper opt-in confirmation.
So there is nothing to be gained from not using opt-in confirmation, because it is only a matter of time before you'd be forced to discard a tainted list and start from scratch with it.
The mailing list details are stored for reference, so that if asked by your host, you can provide the sign-up date/time and IP, and confirmation date/time and IP for any email address. You can also provide proof that your system is coded to ensure only confirmed opt-in can be used.
Affiliates are organizations and individuals who refer customers to the store via a specially coded link. In return, the affiliate will be given commission based on the sales generated by those they refer.
You can disable the affiliate system on your site (so visitors cannot see it and sign up to it) with the frontend.users.myaccount.affiliates.enabled config setting.
A customer/user record can be an affiliate if two conditions are met:
One approved as an affiliate, a user can see their status change in the 'my account – affiliate referrals' section. They are presented with a link such as: http://www.demo.xyz/?af=123
The 123 is the customer/user ID number, and can be passed to the home page.
When a new customer follows an affiliates link to a store powered by Kartris, the store sees the affiliate ID and records this in the customer's session. A 'hit' is also recorded, indicating that the link resulted in a customer visiting the site.
If the new customer goes on to make a sale, two things happen.
Firstly, the new customer's record is permanently tagged as 'belonging' to the affiliate who referred them.
Secondly, the affiliate will be credited with commission for this order, which will be the % of the total value of the order minus shipping, and any discounts.
If a new customer's record was tagged as belonging to a certain affiliate as described above, then if the return at any time in the future to make further orders, the affiliate will receive commission on these too.
If an existing customer who does not belong to any affiliate follows a referral link and subsequently makes a purchase on this visit, they will from that point on 'belong to' the affiliate whose link referred them. The affiliate will receive commission for this sale and any future sales made to the same existing customer.
It is not possible for a customer to 'belong' to multiple affiliates. Therefore, a customer who 'belongs' to a certain affiliate will remain as such regardless of whether they follow any other affiliate's links in future.
The original affiliate will receive any commissions on sales to a customer who they referred originally, even if that customer has followed another affiliate link on subsequent visits.
This is to ensure that affiliates cannot be 'poached' later to deny the original affiliate credit for a customer they referred.
A store owner may have external advertising or links that contribute traffic to his or her site. Advertising networks such as Google Adsense provide fairly detailed information on click-throughs, and even conversions when coupled with Google Analytics. However, sponsored links or forums or blogs may harder to track.
It is therefore possible to use the affiliate system to track such links, but setting up each link as a separate affiliate. This will require either using bogus email addresses, or setting up multiple new addresses. But it will mean that you can then ask your partners to use a specific URL you give them, so all incoming traffic, and the sales generated can be monitored.
Affiliates can view both hits and sales that resulted from their referrals from the 'my account – affiliate referrals' section on the front end.
Store admins can view similar information by going to 'Affiliates > Affiliate Stats'.
Payment information to the affiliate can be viewed from the 'Payments' link from the customer record in the customer listing. This will show the affiliate's total commission earned, and the value of any payments made to them.
Any commissions earned that have not been paid yet will be listed. If you pay a commission (or issue a coupon for it instead, if your terms are to pay commissions as discount coupons instead of as cash), you can check the box next to the commissions paid and click the 'Set as Paid' button. A payment for the total amount will appear below, while the commission records will disappear. If you make a mistake, or cancel a coupon/payment, just select 'Mark as Unpaid', and the commissions will be unpaid again.
Kartris contains a number of features that enable you to draw attention to particular items or provide special prices that will encourage purchases.
Featuring products on the home page is a way to highlight popular or high value items and channel traffic to them. To set a product as 'featured', go to 'Products > Featured Products' in the back end.
Enter some text in the search box, and matching products should appear in the filter list. Click to select one. In the smaller box next to this, you can set a priority value - higher values will rank items higher on the home page. You can set items with the same value if you don't want to determine an order. Values must be more than zero for an item to display.
You can set the maximum number of items to display using the frontend.featuredproducts.display.max config setting. If you have more than this number of items set with featured values above 1, this will limit the number that appear on the site.
You can set which product display format is used for featured products with the frontend.featuredproducts.display.default config setting.
Promotions are special offers that provide some benefit to customers if the order meets certain criteria. Offers such as 'buy one, get one free' are classic examples, though the Kartris system is somewhat more flexible than this.
Promotions can be created and managed by going to 'Products > Promotions' in the back end.
The basic principle of promotions is that they are two-sided. On one hand you have the item or amount required to be purchased or spent in order to trigger the promotion. On the other side, there is the saving or free product(s) that are received.
Promotions can rapidly cause major problems when they overlap, as it creates many more possible options as to what rules should be applied.
For example, if you have a buy two 'A' and get 'B' free in a store that also has buy two 'A' and get 'C' free, you are effectively giving both B and C away when the user buys two of 'A'. Other problems can occur when one of the 'free' items (B or C) in the case of the above, also earns some promotion discount. For example, if you had another promotion buy B get D free, then the item B (which is free thanks to one of the promotions above) also results in a free item 'D'. So the purchase of two 'A' now gives B, C and D for free. Probably not was intended when each promotion was created.
To limit the chance of multiple promotions, stores may wish to limit the total number of promotions that can be triggered in a single order. The config setting frontend.promotions.maximum can be set to zero for 'no limit', or any number above to limit promotions.
When clicking the 'New' link, the promotion form comes up.
The promotion can be given a name, in multiple languages if you store supports that, and a checkbox can be set to determine if the promotion is 'live' (available) or not.
You can choose a start and finish data and you can also set the maximum number of this promotion that can be applied.
The sort value helps set the priority with which a promotion will be treated if there are multiple overlapping promotions (for example, the conditions of items in the basket triggers two different promotions).
Promotions consist of two sides – the first being what the customer must spend or purchase, and the second being what they receive as a result. We refer to these as part 'A' and part 'B' for simplicity.
On the promotions page, part 'A' is set on the left hand side, and part 'B' on the right hand side.
From the first dropdown menu of part 'A', the type of promotion can be chosen. Once a type is selected, textboxes will appear to let you specify further information. For example, if you select buy [X] of [P] (buy a certain number of a certain product), a textbox appears for the quantity (X). Enter a whole number. A second textbox also appears for the product (P). Enter the name or part of a product name here, and the filtered box will display the options. Select the appropriate one, and it will be entered to the textbox. The last step is to click the 'Add' link to add this new pattern to part 'A'. It will turn into a blue link just below the dropdown menu.
Note that you can add multiple requirements to part 'A'. So you could have a requirement to buy one product D, and spend $10, for example.
The next step is to fill out what the customer receives on part 'B'. The process is similar to that for part 'A'. Again, remember to click 'Add' to register your selection. You can create multiple received items too.
Multiple Requirements: If you enter multiple requirements, e.g.
then all requirements will need to be met to unlock the promotion. In other words, it is an AND rather than OR operation. The customer must spend X AND buy 1 item from category Y.
Categories: Category-based promotions are not recursive. This means they only apply to products immediately within a category, not products nested within subcategories of the category.
It is strongly advised that you consider carefully the result of promotions and the possible ways they can potentially work in ways that seem to the detriment of either the store or the customer. The promotions system is extremely complicated, there are infinite possibilities and what might seem logical in one context doesn't in another. Some examples to avoid, or that may be problematic are outlined below.
This list is by no means exhaustive, but is a useful guide to the pitfalls and problems that can arise with promotions:
We are often asked why we don't add promotional items automatically to the basket, rather than require customers to do this.
There are several reasons. Firstly, a promotion may not give a free item. It may be buy A get 50% off B. In such cases, the user has to decide whether they want the additional item at that reduced price, or not. We cannot automatically decide for them.
Secondly, the promotion may be buy A get B free, but this 'B' might be a product with several versions or be an options product. So we have no way to know which version a user wants, or what options they might want even if we know the item will be free and so they'll almost certainly want one.
In some cases, a promotion may 'gift' a specific version for free, so there is no doubt that a user would benefit from having this item. But for consistency, we don't add it in such cases. The page where the item is, as well as the basket will highlight the promotions that are available on these items, but the ultimate decision to add items to the basket is for the customer, just as it would be in a regular supermarket. If an item is buy one, get one free, a nice cashier (if you can still find a human) might let you know about it if you only have one in your basket. But it's still up to you to go get it - they won't keep them under the till in order to add it for you.
For reference, these are the types of promotion components available:
Part 'A':
Buy [X] of version [V] – e.g. buy 2 barbecue beans, small size
Buy [X] of items from category [C] – e.g. buy 5 items from 'books'
Buy [X] of product [P] – e.g. 1 barbecue beans (any size)
Spend [£][X]
Part 'B':
Get [X] of [V] for free – e.g. get 1 barbecue beans (small size) free
Get [X]% off [V] – e.g. get 10% off barbecue beans (small size)
Get [£][X] off – e.g. get £5 off
Get [X] of [P] for free – e.g. get 1 floor mat (any colour) free
Get [X]% off [P] – e.g. get 5% off 1 floor mat (any colour)
Get [X]% off items from category [C] – e.g. get 15% off any book
Key:
[X] = a whole number
[V] = a specific version of a product
[P] = a product (any version)
[C] = a category
[£] = the default currency (£, $, etc. depending on your store)
Cross-selling means being able to sell an additional product or service to an existing customer. One powerful way to do this is targeted links between certain products that might appeal to similar buyers, or are related. For example, if you sell electronic items, you might wish to link through to the appropriate batteries or carry case.
Related product links are one-way in that if you create a link from product 'A' to product 'B', there will be no link from product 'B' to product 'A' (unless you create this separately of course). The logic is probably obvious – in the case above regarding batteries, you would not want to visit the battery page and see links to every single electronic item that links to this type of battery.
Single direction links gives you more control and choice than bi-directional links; you can always achieve bi-directional links by adding relationships on both items, if you wish.
Navigate to a product page and click the 'Related Products' tab.
In the text box, start to type the name, or part of the name of the product you wish to create a link to.
A list of products will appear – select the correct one. Then click 'Add New' and it will appear below. You can repeat the same process to relate more products with this one.
You can delete any relationships from the list too.
Don't forget to click 'Save' to store the changes.
Coupons are special codes that can be entered by a customer before checkout to obtain some kind of discount (fixed or percentage). They can also unlock promotions too.
Coupons can have various restrictions on use; from the time period during which there are valid to the number of times they can be used. A fixed value coupon, if used on an order of lower value, will not give change or retain the unused value.
Navigate to 'Miscellaneous > Coupons' – you will see a list of previously created coupons (if any), and a link to create new ones.
You can choose the value of coupon discount (fixed amount or percentage), or you can select to link the coupon to any non-live promotion, which will be available only to customers who use the coupon (see @7.2.6. Linking promotions with a coupon for more details). You can also specify the start and finish date of the coupon, and whether the coupon is reusable or not. Coupons that are not reusable will expire when used.
The 'coupon code' checkbox lets you choose whether to enter the coupon code yourself. This way, you can choose something short, memorable and easy to type. This is useful if you create multiple use coupon codes to publish in and advertisement for example.
If you want to create multiple coupons of the same kind in one go, then the store will name them with pseudo-random codes.
You can disable and re-enable any coupons from the listing.
You can delete coupons only if they have not been used. Any coupon that was used for an order is protected from deletion, so the record of it will always remain.
It is a common feature of many transactions to provide discounts for quantity to encourage bulk purchases. Sometimes this is referred to as 'price breaks'.
Kartris has a flexible quantity discounts system that allows unlimited price breaks for any quantities specified. This is set at version level (since it is the version that holds the price info).
Simply click to edit a version, and then click the 'Quantity Discount' tab.
Enter the quantity break point, and the price for purchases of that number or more. Note that the price you must enter is per item, so prices should go DOWN as the quantity goes up.
Make sure you enter the discounted price PER ITEM, and not for the total number of items.
If quantity discounts are available, the user will see a link for quantity discounts on the front end when viewing the product.
If a user adds 5 items into the basket (below the price discount level) and then later adds a further 6, the system will automatically pool these together and apply the discount from that point on. Similarly, if a user adds 10 items (with discount) and then removes one from the basket, they will immediately be recalculated at the normal price.
Product reviews can provide a valuable way to encourage customer interaction. Good reviews can help reinforce the reasoning for new customers to purchase, but even negative ones can help build trust in the web site, and also give you an opportunity to address customer concerns.
There are a number of config settings relating to reviews which control how the system works.
frontend.reviews.autopostreviews
Whether to automatically set 'reviews' to live on the site. If 'n', then reviews must first be checked on the backend and set manually to live. It is highly recommended that you don't turn this feature on, in order to prevent spam or malicious postings.
frontend.reviews.dateformat
The format to use for displaying the date of a review on the front-end. You can see a full list of the formats you can use here: Microsoft Docs: Custom Date and Time
frontend.reviews.emailnotification
Whether to send the store owner an email when a new review is submitted. New reviews will show up in the 'to do list', but it can be nice to get an email alert as soon as a new review comes in if you want to ensure you can check and approve them quickly.
frontend.reviews.enabled
Site-wide change of whether to enable customer reviews - If turned on (y), this can be customized on a per-product basis.
frontend.reviews.limit
Limits the number of reviews to show on each product - e.g. 3 will only show the 3 latest reviews. Set to 0 for no limit. This is useful if your site receives a huge number of reviews, but in most cases, 0 (no limit) should work fine.
frontend.reviews.permission
Set who is allowed to add reviews to products. 'All' allows all site users to add a review; 'customersonly' only allows logged in customers; 'purchasersonly' only allows logged in customers who have purchased the product via your store.
frontend.reviews.ratings.enabled
Whether to enable customers to add rating with product reviews - 'y' to allow, 'n' to turn off, and 'r' to make them a required field (in which case there is no 'no rating' option to customers).
frontend.reviews.ratings.maxvalue
Maximum on rating scale for reviews (e.g. 5 will give the user a 1-5 selection). Unless your site is a Spinal Tap-themed amplifier store, there will be no obvious reason to change this. You should also not change this once your site has reviews, as the scores users gave will no longer make sense against a new maximum value.
frontend.reviews.title
Whether to enable customers to add a title/summary on product reviews - 'yes' to allow, 'no' to turn off titles, and 'required' for titles required (customer must enter a title).
When new reviews are added, they will generally (if you use recommended settings) be 'awaiting authorization' until you approve them. These will show up in the 'to do list':
The review listing accessible from the 'to do list' will only show reviews that are awaiting authorization.
Each product will have a reviews tab listing all reviews (of any status - awaiting authorization, live or disabled).
Navigate to 'Miscellaneous > Custom Pages'. A list will appear with existing custom pages. Click the 'New' link. A form appears into which you can enter your content.
The 'ID' field is a unique text-based ID for the page. This will form part of its URL, and it is also what appears as the name of the page when listing custom pages in the back end. So a good descriptive ID is best. The ID cannot contain spaces and special characters should be avoid. Hyphens (dashes) should be used in place of spaces. For example, these would be appropriate IDs:
Privacy-Policy
About-Us
Frequently-Asked-Questions
The text is the content of the page. HTML can be entered here too, using the HTML editor button to the bottom right of the text field. Don't forget to save the content after editing (the save button on the toolbar above).
The 'Title' field is used within the breadcrumb trail. Originally we used the page ID here, and replaced the dashes with spaces. But this means page titles cannot include dashes or other characters, and furthermore are not language specific. Hence we created a specific field for this.
SEO fields are also available to be populated.
The breadcrumb trail, as on other pages, is created automatically. The page name in this comes from the 'Title' field of the custom page.
In some cases, you will want to nest content, and have the breadcrumb trail indicate this. To do this, you can select another custom page from the 'Parent Page' control. For example, you might want the breadcrumb trail for a particular page to appear like this:
Home > Services > Repairs
I this case, you'd have to first create a page called 'Services'. You can then create 'Repairs' and select 'Services' as the parent page.
The breadcrumb trail for products, categories and custom pages is created dynamically from database data. However, pages such as the Basket, Customer Account and so on are included from the web_breadcrumb.sitemap file. If you add new physical pages (aspx files) to your site, and want them to use the breadcrumb trail, you will need to ensure references for these new pages are added to the web_breadcrumb.sitemap.
See @14.1. Adding new pages for more information.
Links to custom pages will not automatically appear on the web site. You must add them to menus manually, or create links in your skin to them.
If you look at our demo, you will see a light grey coloured menu which is triggered by the hamburger button (top left of page). The content for this comes from the web_menu.sitemap file which is in the root of Kartris. You can edit this XML file manually to create the menu structure you require.
Kartris will probably need to be restarted for changes to take effect.
We strongly recommend you back up the web_menu.sitemap file before modifying it. When modifying it, take careful note of the structure of tags, and whether a tag is self-closing or not. If you have two or more links to the same page, ASP.NET may generate an error because they are not unique. You can overcome this by appending an unused parameter to the URL, for example ?x=1, ?x=2, etc.
You can also add Hyperlink controls to the .master file to provide links to your custom pages, such as those we have in the footer. We recommend using ASP.NET Hyperlink controls rather than standard HTML <a> tags, because URLs can be specified relative to the app root using the ~/t-Sample.aspx format. These will work correctly from any friendly URL page, and whether the site is running in a subfolder of localhost, or on the root of a fully-qualified domain.
The default web_menu.sitemap file code looks like this:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization="true" >
<siteMapNode url="~/Default.aspx" title="$resources:Kartris,ContentText_Home" description="$resources:Kartris,ContentText_Home" >
<siteMapNode url="~/Customer.aspx" title="$resources:Kartris,PageTitle_MyAccount" description="$resources:Kartris,PageTitle_MyAccount" value="myaccount">
<siteMapNode url="~/Wishlist.aspx" title="$resources:Kartris,PageTitle_WishListLogin" description="$resources:Kartris,PageTitle_WishListLogin" value="wishlist" />
<siteMapNode url="~/CustomerTickets.aspx?" title="$resources:Tickets,PageTitle_SupportTickets" description="$resources:Tickets,PageTitle_SupportTickets" value="supporttickets" />
</siteMapNode>
<siteMapNode url="~/News.aspx" title="$resources:News,PageTitle_SiteNews" description="$resources:News,PageTitle_SiteNews" value="news" />
<siteMapNode url="~/Knowledgebase.aspx" title="$resources:Knowledgebase,PageTitle_Knowledgebase" description="$resources:Knowledgebase,PageTitle_Knowledgebase" value="knowledgebase" />
<siteMapNode url="~/Contact.aspx" title="$resources:Kartris,PageTitle_ContactUs" description="$resources:Kartris,PageTitle_ContactUs" />
</siteMapNode>
</siteMap>
Note carefully the structure; siteMapNodes with children such as ~/Customer.aspx are not self-closing - they have a separate close tag after the children. Child nodes like ~/Wishlist.aspx are self-closing (they have a / before the closing of the tag).
The $resources refer to language strings (see @15.2. Language strings). If your site only uses a single language, you can add links that have hardcoded text instead of references to language strings, for example:
<siteMapNode url="~/MyPage.aspx" title="MyPageTitle" description="Title of My Page" />
The Data Tool requires CSV or spreadsheet data to be suitably formatted for import. A sample spreadsheet with some correctly formatted data is included in the data tool zip, or you can download it below.
Downloadable Content: "Example Excel Spreadsheet for importing with the Kartris data tool"
This download is available at: https://tome.host:443/Downloads/2071__fs_1519051679_8531.xls/
The spreadsheet can contain categories nested up to FIVE levels deep. The first column, Cat5_Name1, holds a top level category name. The Cat4_Name1 field on the same line would hold a subcategory of this, and so on down to Cat1_Name1.
Since each product must have at least one parent category, every row of your spreadsheet should have a Cat5_Name1 value, but not necessarily any subcategories.
The P_Name1 field (product name) holds the name of the product. Product name is used by the data tool as the key for a product, therefore you should not have multiple products with the same name in a data tool spreadsheet (if you do, they will be assumed to be the same product). However, the product name will appear on multiple rows if a product has multiple versions.
image1.jpg
image1.jpg,image2.jpg,image3.jpg
image1.jpg;image2.jpg;image3.jpg
http://www.site.xyz/images/image1.jpg
http://www.site.xyz/images/image1.jpg,http://www.site.xyz/images/image2.jpg
http://www.site.xyz/images/image1.jpg;http://www.site.xyz/images/image2.jpg
The V_CodeNumber (the SKU) is the unique key for versions and must be unique.
V_Price and V_Weight should all be numerical values with no currency or weight units.
V_Type can be 'c' for combination, 'b' for base version (the base of an options product) or 'v' for version. The field is not required, if blank, 'v' will be assumed.
The T_TaxRate field for EU sites, and others using a VAT model (UK, NZ) should hold the % rate of VAT that applies. The T_TaxRate2 field should have zero.
For Canadian sites, it will hold the GST value, while the T_TaxRate2 field would hold the PST value.
The supplier field should hold the name of the supplier.
Attributes for each item can be formatted within a single field, using the following structure:
Energy {{4500kcal}} || Animal {{Cow}}
You can have multiple attributes. Each attribute contains a name, with the corresponding value after it (space separator) enclosed in double curly brackets.
Each name-value pair should be separated from the next with two vertical pipes, and spaces.
Options products can be imported into Kartris using the data tool and a spreadsheet, but the formatting is a little more complex. First, you must format the options available on the second worksheet of the spreadsheet. Each OptionGroup_Name is unique, so if you have multiple different sets called 'Colour' for example, you should rename these to avoid them all merging during import.
Because options requires a second worksheet, it's not possible to use CSV format. You must use an Excel spreadsheet format.
The options for each product should then be formatted within the regular data page of the spreadsheet in name-value pairs, similar to the format used for attributes above.
Both the names and values (for example, "Size" and "Large") must match up with options detailed in the second worksheet, the OptionGroup_Name and Option_Name respectively.
In order to import bulk data from a spreadsheet, the Data Tool needs to make some assumptions.
Because of the reasons given above, at present the Data Tool cannot handle cases where multiple products have the same name, or where a products and/or categories have multiple parents.
The Data Tool can be used both to populate a brand new store with product data and to update an existing store. In cases where you are updating a store, there are three options as to how you handle existing data already in the store:
PARAMETERS:
/MODE:[ignore|update|deleteall] -> what to do with existing product data
/FILE:[csv_or_xls_file]
/DATASHEET:[worksheet_name_of_data_in_xls_file] (XLS only)
/OPTIONSSHEET:[options_sheet_name_for_Kartris_v1.4] (XLS only)
/DBSERVER:[servername]
/USEWINDOWSAUTH (optional)
/DBUSER:[username]
/DBPASS:[password]
/DBNAME:[databasename]
/HELP (optional)
/OUTPUT:[logfile(default)|display] (optional)
/SOURCEIMAGESFOLDER:[folderpath] (optional, can use full image path in spreadsheet)
/KARTRISIMAGESFOLDER:[folderpath] (optional)
/TEST (optional) (no processing - just check if parameters are all correct)
/HASH:[hashsalt_value_from_web_config_of_site]
C:\Data Tool\KartrisDataTool.exe /mode:update /file:"c:\user\desktop\exampledata.xls" /dbserver:localhost\sqlexpress /usewindowsauth /dbname:kartrisSQL
If you have spaces in the names or paths of files submitted through command line arguments, you will need to enclose the path in double quotes. Alternatively, try to position files close to the root in a folder without spaces in the name.
This feature is intended for use by developers and experienced programmers who need to integrate third party systems with Kartris (such as EPOS or accounts systems) or add/update/remove/read data within Kartris remotely and programmatically.
To activate the web API you have to set a couple of things in your site's web.config file:
<appSettings>
<add key="KartrisWebAPISecretKey" value="[YourSecretKeyHere]" />
</appSettings>
...
<baseAddresses>
<add baseAddress="[YourWebShopURLHere]Protected/KartrisWebAPI.svc" />
</baseAddresses>
Once you have activated and configured the web API, you can access it as follows:
[YourWebShopURLHere]Protected/KartrisWebAPI.svc
The web service contains a single method called 'Execute' with two parameters:
'''<summary>
'''Execute Kartris method
'''</summary>
'''<param name="strMethod">Name of the method that you want to execute (fully
'''qualified name, case-sensitive) e.g. CKartrisBLL.WebShopURL </param>
'''<param name="strParametersXML">XML parameter array for the specified method</param>
'''<returns>XML Serialized Object</returns>
'''<remarks></remarks>
Public Function Execute(ByVal strMethod As String, ByVal strParametersXML As String) As String
set xmlhttp = WScript.CreateObject("MSXML2.ServerXMLHTTP.6.0")
xmlhttp.Open "POST", "[YourWebShopURLHere]Protected/KartrisWebAPI.svc", False
xmlhttp.setRequestHeader "Authorization", [YourSecretKeyHere]
xmlhttp.setRequestHeader "Content-Type", "text/xml"
xmlhttp.setRequestHeader "SOAPAction", "http://tempuri.org/IKartrisWebAPI/Execute"
xmlhttp.send requestDoc.xml
<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>
<s:Body>
<Execute xmlns='http://tempuri.org/'>
<strMethod>TaxBLL.GetTaxRate</strMethod>
<strParametersXML>
<?xml version="1.0" encoding="utf-8" ?>
<KartrisWebAPI>
<Parameters>
<Parameter Name="numTaxID" Type="Byte">
<Value>2</Value>
</Parameter>
</Parameters>
</KartrisWebAPI>
</strParametersXML>
</Execute>
</s:Body>
</s:Envelope>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ExecuteResponse xmlns="http://tempuri.org/">
<ExecuteResult>
<?xml version="1.0" encoding="utf-16"?>
<double>20</double>
</ExecuteResult>
</ExecuteResponse>
</s:Body>
</s:Envelope>
<?xml version="1.0" encoding="utf-8" ?>
<double>20</double>
Downloadable Content: "Kartris Web API Extensions Sample Code"
This download is available at: https://tome.host:443/Downloads/2071__fs_1541760152_8548.zip/
This sections contains a lot of information intended for developers using the Kartris software. While it is possible for users who are relatively tech savvy (familiar with HTML and CSS) to skin their own site, the majority of end users will benefit from hiring a web developer to do this for them.
A developer should not necessarily require either specialist Kartris or ASP.NET knowledge to develop a skin for Kartris, though use of, or access to a Windows computer with Kartris installed and running is essential in order to test the skin with Kartris.
If you leave either selection blank, Kartris will use the defaults (which are the skin 'Kartris' and the 'Template.master' template file).
This menu automatically picks up any new folders added to the /Skins folder within a Kartris site. So all you have to do to import or create a new skin is to place the new folder there and then select it from this menu.
Rather than modify the default Kartris skin, we suggest you clone it, and then select your new skin's name and develop from there.
Kartris v2.5 and above features a responsive interface.
The number of users accessing the web on mobile devices is increasing all the time. Although most devices have browsers which can handle web sites designed for bigger screens, the user experience is less than ideal. Kartris incorporates support for 'responsive' design, which enables a web site to dynamically reformat pages to better fit small screens, as well as optimizations for use on touch screens.
The original approach to providing support for mobile devices was to create a separate interface, and have the web site check the user-agent of the device requesting the page to decide which version of a page to send. But with the rise of smartphones as perhaps the most common web accessible device, and the increase in power allowing them to run full web browsers with javascript and web standards support, the responsive approach has become the norm.
A responsive web site sends exactly the same pages to all devices - mobile, tablet, laptop and desktop. It is the device itself which decides how to display the page, based on rules and code that is embedded within the page.
The advantages of this approach are:
This is a little more complicated. It's best to use our Template.master as a guide, but we'd strongly recommend starting with a cloned copy of our default skin, and working from there.
First, you will need to add in the extra CSS files; make sure they are in the right order (we tend to put the Foundation and associated files in first, and then override them where needed in custom.css):
<link href="foundation.css" rel="stylesheet" type="text/css" />
<link href="normalize.css" rel="stylesheet" type="text/css" />
<link href="custom.css" rel="stylesheet" type="text/css" />
<meta name="viewport" content="width=device-width" />
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" ><![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js" lang="en">
<!--<![endif]-->
<asp:Literal runat="server" ID="litZeptoJquery"></asp:Literal>
<script>
$(function () {
$(document).foundation();
})
</script>
'Add zepto/jquery tag at end of page,
'this is part of the responsive layout
Dim strWebShopFolder As String = CkartrisBLL.WebShopFolder()
litZeptoJquery.Text = "<script>" & vbCrLf & _
"document.write('<script src=JavaScript/'" & vbCrLf & _
"+ ('__proto__' in {} ? 'zepto' : 'jquery')" & vbCrLf & _
"+ '.js><\/script>');" & vbCrLf & _
"</script><script src=JavaScript/foundation.js></script>"
The Images
folder holds images used within the CSS (background images) as
well as the site logo and any other images embedded within your
.master templates.
<html>
<head>
<title>Order Confirmation</title>
</head>
<body>
[orderdetails]
</body>
</html>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<CustomerSkinRules>
<Customer ID="123" SkinName="DifferentSkin"/>
</CustomerSkinRules>
<CustomerGroupSkinRules>
<CustomerGroup ID="456" SkinName="AnotherSkin"/>
</CustomerGroupSkinRules>
<ProductSkinRules>
<Product ID="789" SkinName="SkinNumber3"/>
</ProductSkinRules>
<CategorySkinRules>
<Category ID="100" SkinName="BlackAndOrange"/>
</CategorySkinRules>
<ScriptSkinRules>
<Script Name="Basket.aspx" SkinName="BasketSkin"/>
</ScriptSkinRules>
</configuration>
Note: The tags in the Skins.config are case sensitive. If settings are not working as expected, check the case of tags carefully to ensure tag names and values match those above.
<%@ Page Language="VB" AutoEventWireup="true" MasterPageFile="~/Skins/Kartris/Template.master"
CodeFile="Product.aspx.vb" Inherits="Product" %>
<user:CategoryMenu ID="UC_CategoryMenuCSSFoldout"
runat="server" EnableViewState="False"
Visible="True" />
<user:CategoryMenuAccordion ID="UC_CategoryMenuAccordion"
runat="server" EnableViewState="False"
Visible="True" />
<user:CategoryMenuDropDownSelect ID="UC_CategoryMenuDropDownSelect"
runat="server" EnableViewState="False"
Visible="True" />
<user:CategoryMenu ID="UC_CategoryMenuCSSFoldout"
runat="server" EnableViewState="False"
RootCategoryID="1" Visible="True" />
<user:CategoryMenu ID="UC_CategoryMenuCSSFoldout2"
runat="server" EnableViewState="False"
RootCategoryID="2" Visible="True" />
Kartris is designed to run on a single domain. If multiple domains are mapped to the same web, Kartris will 301-redirect any requests to the domain set in the general.webshopurl config setting. This helps channel page rank and links towards the preferred domain.
For example, many sites have both domain.xyz and www.domain.xyz pointing to their site. Kartris will redirect to the preferred one of these if someone uses the other one where necessary. While this has no real impact from an SEO point of view (there really aren't the duplicate content issues as we'll cover later), it does ensure that all users are using the same domain always, which is important for cookies.
For more information on config settings see @3.4. Config settings.
Meta-tags are three common HTML tags that appear in the 'HEAD' section of the HTML code of most pages:
<meta name="description" content="Content Here" />
<meta name="keywords" content="Content Here" />
<title>Content Here</title>
The 'title' tag contains the text that will display at the very top window bar when the page is open in a browser. It is also the page title that a search engine will typically show as the main hyperlink in its search results.
The meta tag for 'description' gives a summary of what the page contains. Typically this will be the additional test just under the hyperlink in a search engine result.
The meta tag for 'keywords' contains extra keywords that are relevant to the page but is not displayed in search results, and is not read by Google and most search engines. So we tend to leave this blank.
Because Kartris forms pages around a standard template, these tags are not present in the template; instead the tags are created dynamically by Kartris for every page.
You can set the Kartris defaults for the meta-tags using the following language strings:
ContentText_DefaultMetaDescription
ContentText_DefaultMetaKeywords
In places where no other data is available, Kartris will fall back on the values here. But in most cases, it will find more page-specific data to use if possible. As mentioned earlier, the meta-keywords tag is not read by Google and most major search engines, so is probably best left blank so as not to increase page sizes unnecessarily.
Kartris will do a fairly good job of filling meta-tags and page title for pages automatically. For example, on a product page, it will use the product name in the title tag, and fill the description with a truncated section of text from the product description. The keywords will generally use the ContentText_DefaultMetaKeywords value.
But you can override these default values in many cases.
For example, when creating or editing a product, category, knowledgebase article or custom page, you can open extra fields with the [+]SEO link. This allows you to override the default values that Kartris will insert, and specify the exact text you want to appear.
This can be useful if you want to keep the product or category name short and concise, but have the page title itself longer and with more keywords to help improve page indexing.
You don't need to duplicate your product names and descriptions in these SEO fields. Only use these fields if you want those meta tags to be different to the actual product name and description.
Kartris can format 'friendly' URLs. You may wish to optimize the text/name part of the URL for products and categories using the URL Name box. This allows you to replace the default value (normally the item name) with whatever text you prefer to use.
You should only enter keywords or text here, not full URLs. The values entered are used for the text part of the URL. But the numeric part and file extension are required and cannot be removed.
One frequent point that SEOs raise is the so-called 'duplicate content penalty'. The claim is that having a page accessible with multiple URLs will harm search engine ranking, or even (according to some SEOs) have you booted from Google for spamming.
In reality, as the official Google blog makes clear (see link below), you will not be penalized for this. In fact, Google will even do a good job of recognizing multiple URLs that point to the same page, pooling them and their page rank.
http://googlewebmastercentral.blogspot.com/2008/09/demystifying-duplicate-content-penalty.html
But in order to eliminate any doubt, Google, Microsoft (Bing) and Yahoo all now recognize the 'canonical' tag. This lets you specify within the source of a page which URL that page should be indexed as. So even if it is reachable through multiple navigation routes, you will tell Google the preferred URL to use. Kartris forms canonical links automatically within pages, so you don't need to activate anything in this regard.
Google's official position is that it takes the canonical tag as a strong hint, rather than obeying it absolutely.
301-redirects were commonly used as a method of getting the preferred URL indexed by search engines prior to the canonical tag being introduced. The problem with using 301-redirects is that it loses 'location awareness' in a URL. For example, a product 'laptop' can be in multiple categories, and the folder hierarchy in the URL will be different for the same item depending on the route you use to navigate to it.
Using 301-redirects means that end users, as well as search engines, only get to see a single URL, and therefore lose location awareness through the hierarchy and breadcrumb trail.
Using the canonical tag is better because it allows us to pass location specific information through the URL, giving users a clear idea of where the product lies within the category structure, while at the same time notifying search engines that it is a single page, with a preferred URL.
On database driven applications like Kartris, a single page such as Product.aspx is used to display every single product in the store. Since extra information needs to be passed to it to tell it which product to display, the URLs (web addresses) typically contain extra parameters and values passed to the page.
For example:
http://www.demo.xyz/Product.aspx?ProductID=10
As more information is passed, the URL can become longer and messier.
To overcome this, Kartris at default creates 'friendly' URLs, which appear like static page addresses (rather than a single page with dynamic information passed to it as parameters). When properly configured, this will make the site appear (both to users and search engines) as a collection of 'static' pages in a folder hierarchy, just as if every product was on its very own page and these pages were sorted into folders.
Despite what many SEOs believe, there is little if any evidence that the format of the URL has any influence on search results (though it may well have done many years ago). Google's official blog says that it doesn't, and even goes as far as to suggest not rewriting URLs.
The format of Kartris's 'friendly' URLs still includes numbers, just before the .aspx at the end. It is not possible to remove this as the numbers are used by the system to locate the content. This is very similar to the URL format used by Amazon and the BBC, that uses numbers within a static format of URL.
You can turn friendly URLs on or off from the general.seofriendlyurls.enabled config setting.
<g:id>[the version code / SKU]</g:id>
<title>[the version or product name]</title>
<description>[the product description]</description>
<g:price>[the item price]</g:price>
<link>[the canonical URL of the item]</link>
<g:image_link>[link to the full size image file for the item]</g:image_link>
<g:condition>[value set in the dropdown when generating the feed]</g:condition>
One of the most common modifications developers might want to make to extend Kartris is to add new pages. For simple text pages, there is the built in CMS system (see @8. Custom Pages - Basic CMS). But if you need to add a functional page that contains some programming logic, you will need to add actual .aspx pages to the site.
In order to integrate properly into your Kartris site, you'd want the new page to inherit the Kartris skin and features such as the basket and menus. You will want the new page to appear on menus, and also in the breadcrumb trail.
Here is a guide to adding a new page, which we will call 'Test'.
First, create a new page in your root called Test.aspx, with a code behind (Test.aspx.vb). The aspx page content will be as follows:
<%@ Page Language="VB" MasterPageFile="~/Skins/Kartris/Template.master" AutoEventWireup="false"
CodeFile="Test.aspx.vb" Inherits="Test" %>
<asp:Content ID="cntMain" ContentPlaceHolderID="cntMain" runat="Server">
<user:BreadCrumbTrail ID="UC_BreadCrumbTrail" runat="server" EnableViewState="False" />
Your new content can go here
</asp:Content>
The code behind is even simpler, and will look like this:
Partial Class Test
Inherits PageBaseClass
End Class
Note that this page inherits from PageBaseClass rather than the standard System.Web.UI.Page class. This ensures it picks up all the special Kartris page features, and employs Kartris security. So for example, if your site is set to require people to login to be able to view pages, this page will enforce that rule too.
To get your pages to appear in the navigation menu, and the breadcrumb trail, you will need to add references to them in a couple of places. Firstly, the web_menu.sitemap file (see @8.4. Site menus).
For the breadcrumb trail, you will need to add references for your new page in web_breadcrumb.sitemap (also located in the root of the web).
Dim strSampleValue As String = ObjectConfigBLL.GetValue("K:product.myobjectname", numProductID)
Being database-driven, the Kartris language provider is very efficient. However, to improve performance even more, language strings are cached because in most cases they change very rarely. If you change a language string, you may find that the change does not appear immediately, even if you rebuild the caches with the button above the left hand category menu. In this case, you can force the language strings to be rebuilt by restarting the site. This can be done from the back end home page.
The easiest way to add a new language is to import it through the Data Tool. See @10.4. Importing language packs for more information.
If you later upgrade Kartris, you may find that new English language strings were added, but that your other languages lack these records. This can be addressed through the languages page - see @15.1. Languages and email setup
Once you have 'fixed' the other languages so that they have the same number of strings, you may need to translate those new English strings into the desired language. This can be done from this section. You can choose the target langauges, and filter records to find the strings you need to translate, then enter the new values.
From version 3.0 onwards, Kartris introduces multi-site functionality. This lets you set up sub sites based on a subset of data from your Kartris installation, or you can build a new set of categories and products solely for these sub sites, but share a common checkout and order processing channel.
More information on this coming soon.
Payment systems are used by Kartris to accept payment (or in some cases, a promise of payment) through the store.
Kartris supports a number of different payment systems and has a flexible open plugin architecture that allows more to be added in future. There are four broad types:
This lets you switch the operation of the payment system as follows:
Most payment systems have a process currency. If you leave this blank, Kartris will pass orders to the payment system in whatever currency the user selects on your site. For that to work, your payment system provider must support multiple currencies, and your account with them must permit orders in all the currencies available on your site.
You should set the process currency from blank, if:
The process currency (if not blank) should be a three-letter ISO code for the appropriate currency.
Customers will be alerted at the last step of the checkout that the actual amount they will pay will be converted, and they will be shown the converted amount in that currency, as well as the order total in their preferred currency. This conversion will be done at the rate in your currency settings.
In order to ensure that 2Checkout calls back your Kartris site to notify it that a payment for a particular order was made so that confirmation mails can be sent and the order can be tagged as 'paid', you need to set up a few things within your 2Checkout account.
2Checkout should now be set up and working. We would advise that you always test a site in live mode when you first open it (status = 'ON') even if all the test modes checked out ok. This confirms that everything is working with Kartris and that your account with 2Checkout is live and working. The best way is to create a low value product of a dollar which you can purchase.
Coming soon.
Some configuration to your account must be done at Authorize.Net's Web site (Authorize.Net will have supplied you with access details). This is referred to as Authorize.Net's Merchant Management System. Login at:
# bitcoin.conf configuration file. Lines beginning with # are comments.
# Network-related settings:
# Run on the test network instead of the real bitcoin network.
#testnet=0
# Connect via a socks4 proxy
#proxy=127.0.0.1:9050
##############################################################
## Quick Primer on addnode vs connect ##
## Let's say for instance you use addnode=4.2.2.4 ##
## addnode will connect you to and tell you about the ##
## nodes connected to 4.2.2.4. In addition it will tell ##
## the other nodes connected to it that you exist so ##
## they can connect to you. ##
## connect will not do the above when you 'connect' to it. ##
## It will *only* connect you to 4.2.2.4 and no one else.##
## ##
## So if you're behind a firewall, or have other problems ##
## finding nodes, add some using 'addnode'. ##
## ##
## If you want to stay private, use 'connect' to only ##
## connect to "trusted" nodes. ##
## ##
## If you run multiple nodes on a LAN, there's no need for ##
## all of them to open lots of connections. Instead ##
## 'connect' them all to one node that is port forwarded ##
## and has lots of connections. ##
## Thanks goes to [Noodle] on Freenode. ##
##############################################################
# Use as many addnode= settings as you like to connect to specific peers
#addnode=69.164.218.197
#addnode=10.0.0.2:8333
# ... or use as many connect= settings as you like to connect ONLY
# to specific peers:
#connect=69.164.218.197
#connect=10.0.0.1:8333
# Maximum number of inbound+outbound connections.
#maxconnections=
# JSON-RPC options (for controlling a running Bitcoin/bitcoind process)
server=1 tells Bitcoin-QT to accept JSON-RPC commands.
#server=0
# You must set rpcuser and rpcpassword to secure the JSON-RPC api
rpcuser=Kartris
rpcpassword=ThisShouldBeSecureAndNotThisDefaultOrYouWillGetRobbed
# How many seconds bitcoin will wait for a complete RPC HTTP request.
# after the HTTP connection is established.
#rpctimeout=30
# By default, only RPC connections from localhost are allowed. Specify
# as many rpcallowip= settings as you like to allow connections from
# other hosts (and you may use * as a wildcard character).
# NOTE: opening up the RPC port to hosts outside your local
# trusted network is NOT RECOMMENDED, because the rpcpassword
# is transmitted over the network unencrypted.
#rpcallowip=10.1.1.34
#rpcallowip=192.168.1.*
# Listen for RPC connections on this TCP port:
rpcport=8332
# You can use Bitcoin or bitcoind to send commands to Bitcoin/bitcoind
# running on another host using this option:
rpcconnect=127.0.0.1
# Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate
# with Bitcoin -server or bitcoind
#rpcssl=1
# OpenSSL settings used when rpcssl=1
#rpcsslciphers=TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH
#rpcsslcertificatechainfile=server.cert
#rpcsslprivatekeyfile=server.pem
# Miscellaneous options
# Set gen=1 to attempt to generate bitcoins
#gen=0
# Pre-generate this many public/private key pairs, so wallet backups will be valid for
# both prior transactions and several dozen future transactions.
#keypool=100
# Pay an optional transaction fee every time you send bitcoins. Transactions with fees
# are more likely than free transactions to be included in generated blocks, so may
# be validated sooner.
#paytxfee=0.00
# Allow direct connections for the 'pay via IP address' feature.
#allowreceivebyip=1
# User interface options
# Start Bitcoin minimized
min=1
# Minimize to the system tray
minimizetotray=1
'====================
'Kartris Database
'====================
strKartrisDBName = "k25008_test"
strKartrisDBServerName = "localhost\SQLExpress"
blnUseWindowsAuth = true
strKartrisDBUserName = "sa"
strKartrisDBPassword = "sa"
strKartrisDBPort = 1433
'====================
'Bitcoin Client - Should match with your Bitcoin payment gateway settings in Kartris
'====================
strBitcoinHost = "http://localhost"
strBitcoinPort = "8332"
strBitcoinUsername = "Kartris"
strBitcoinPassword = "ThisShouldBeSecureAndNotThisDefaultOrYouWillGetRobbed"
'=======================
'REQUIRED CONFIRMATIONS
'Number of confirmations for bitcoin payments to be considered 'paid'
'=======================
intRequiredConfirmation = "1"
'====================
'WORKING FOLDER PATH
'Folder where the log files will be saved to
'====================
'--don't forget to put backslash at the end (\)
strWorkingFolderPath = "C:\Users\TestUser\Desktop\"
'Whether to only log confirmed payments, will not log queries for addresses that returns 0.
'*True = smaller log file size but with less details.
blnLogConfirmedPaymentsOnly = True
'====================
'Other Settings
'====================
numCursorType = 1 'for SQL Server
strEmailMethod = "off"
strMailServer = "localhost"
strEmailFromAddress = "no_reply@mysite.xyz"
strEmailSubject = "Summary"
IMPORTANT: Although GP Webpay uses numeric currency codes, Kartris will convert to these from the three-letter ISO codes. So you should NOT enter numeric values here, only recognized three letter currency codes. Setting the process currency is useful if your merchant account only supports one currency, or if your site has currencies available to users that your merchant account cannot handle. GP Webpay itself supports these currencies (though your merchant account may not): CZK, EUR, GBP, HUF, PLN, RUB, USD.
Opayo (formerly called 'Sagepay') is one of the most popular credit card payment providers in the UK.
VSP Form is a remote-type payment system, where customers are sent to a secure page on Opayo's servers to conduct the card transaction.
The system is simple to set up, but is unusual compared to most remote type payment systems in that the 'callback' (relaying information on a successful payment back to the store) is achieved by redirecting the user's browser back to the store. Most payment systems make the callback themselves (their server calls the store's callback page directly), even if they subsequently send the user back to the store after payment. In theory, payments might not be notified back to your store if a user closes their browser immediately after the payment was made, but in practice, we rarely see this and the system seems stable and reliable.
All the required information to process an order and direct the callback back to your store is actually posted through to Opayo with the order, so no further setup is required at their end. However, you should ensure with Opayo's support that your account is live before you start processing orders.
Orders passed through your Opayo account must have unique IDs. If you experience this error when trying to checkout, it means the order ID that is being passed has been used before on your account. This can happen if you've switched to Kartris from another store system, so IDs are starting from a low level. It can also happen if you restored a older backup of your Kartris database for some reason.
Coming soon.
PaymentSense is a UK-based payment system that provides credit card payment services primarily to smaller merchants. Kartris includes a plugin for the PaymentSense 'Hosted Integration' method. This is a remote-type payment system where the transaction occurs on the payment vendor's own secure gateway pages, and a POST is made back to your Kartris site to notify it of the result.
Go to Configuration > Payment and Shipping Gateways and click to edit PaymentSense.
Enter the various acccount details given to you by PaymentSense. You may have both test and live account details, so ensure you don't mix these up. We suggest first configuring the test details, setting the status to 'test' in Kartris (this will only show the payment option for PaymentSense at checkout if you are logged in to the site as an admin) and then running through some tests with the test card details available from PaymentSense.
In older installations (up until Kartris v2.9012), the hashmethod was hardcoded into the plugin as MD5. From v2.9013 onwards, the default is SHA1, though this is changeable through a new setting called HashMethod, within the PaymentSense settings in the Kartris back end.
The PostURL may be different depending on which processor you signed up from. This is the location of the payment form on the vendor's site where the user is redirected in order to make payment.
See PaymentSense's own documentation regarding setup within their admin area.
Make sure that the hashing type matches the Kartris plugin version you are using. You can check the version of the DLL you have by navigating to it in Windows explorer, right-clicking and choosing 'properties', then viewing the details tab. Newer versions of Kartris also show this DLL version number within the list of payment systems.
If it's the older DLL (v1.x), then you should use MD5. If it's the newer v2.x DLL (introduced in Kartris v2.9013) then use SHA1 (if using this version, your Kartris should have a 'HashMethod' setting withing the PaymentSense settings).
In order to ensure that PayPal calls back your Kartris site, to notify it that a payment for a particular order was made so that confirmation mails can be sent and the order can be tagged as 'paid', you need to set up a few things within your PayPal account.
You may find that orders where data submitted contains non-English characters (such as French or German accented characters) generate an INVALID response at PayPal. To fix this:
We advise doing this even if you're in the US or UK, as it's quite possible you'll have customers with names and/or addresses either domestically or overseas that contain non-English accented characters.
Google Analytics ecommerce tracking requires that a client side javascript is run the user's browser when they complete an order. This happens in Kartris on the CheckoutComplete.aspx page right after returning from the payment gateway (see 3. above).
It cannot be done on the callback because that is called by PayPal, not the customer's browser. Unfortunately PayPal puts in a 5-second delay after a completed payment before returning the customer to the store. This inevitably results in some customers dropping out after a successful payment but before they have been redirected back to your site, and hence not being logged by Google Analytics as completed sales. There is no workaround for this; the Google Analytics code can only run on the user's browser; it must run after the payment is complete (otherwise you will log sales as successful that don't complete payment) and PayPal apparently has no way to reduce or eliminate the 5-second delay). This is not a Kartris issue alone; it is an issue with all carts that support Google Analytics when they are set up to use PayPal Web Site Payments Standard.
See also .
We would advise that even if not using the PO option on your store, you keep it set to ON but then set it as AuthorizedOnly, which will prevent the public from using it unless you specifically allow them to. This is because orders of zero value (which can occur either if some items are free, or if a coupon is used for the full value of the order) will use the PO checkout route. If you turn the PO option off, you will effectively prevent the store bypassing the payment system for zero value orders.
QuickPay is a payment provider launched in 2004 and based in Denmark. Kartris uses the "QuickPay Form" integration method.
In order to configure Kartris, some values will need to be obtained from QuickPay. These are
These can be obtained by logging into the QuickPay account control panel as detailed below.
This is stated at the top left of the control panel under the customer name
Using the left hand menu navigate to settings / users and then under system users click to select Payment Window.
To enable test transactions while testing the integration the required setting must be changed on QuickPay. Navigate to settings / integrations and ensure the setting for allow test transactions is set to yes
Before you can use Realex’s Realauth Redirect, you must first provide Realex with the URL of your callback page. This should be:
http://www.demo.xyz/Callback-Realex.aspx
(this is URL-mapped to the Callback.aspx file by Kartris)
The response URL is to be mailed to support@realexpayments.com. You can also have an HTML template uploaded to the Realex Payment servers so that the redirection should resemble the rest of the shopping experience (or else it will use Realex’s default template). You can send your template to them via same email address. For further info, check the Realex developer's guide.
In case Realauth is unable to contact your callback page, you can set a static success/failure message. This can be done at Realex's administration web site (Realex will have supplied you with access details).
IMPORTANT: Secure Trading is no longer accepting customers on this particular implementation. We are maintaining it for legacy reasons. New customers therefore should not choose to setup an account with Secure Trading as Kartris is not compatible with the version they will require you to run.
method1 POST
url1 http://www.mydomainnamegoeshere.com/callback.aspx?g=securetrading&p=stpassword
fields1 orderref, streference, email, amount, stresult
Remember, our callback.txt file is different to the standard one available from Secure Trading. You must use our version or your callbacks will fail.
If you experience problems with Secure Trading, please ensure that you revert files to the ones we provide with Kartris. The most common issues we see are bugs introduced by edits to the various template files, or use of default files provided by Secure Trading.
Stripe is a popular payment solution that supports many countries and provides a number of integration routes. Kartris implements "Stripe Checkout". Stripe support was added to Kartris with v3.3001. There are some small changes to the Checkout, CheckoutProcess, CheckoutComplete and Callback to handle it. Also, the Stripe.net library needs to be added to the bin folder too.
If you have v3.3001 or later installed, Stripe will be available in the payment gateways list already.
In addition to the general settings most gateways have, Stripe requires these particular ones:
This is the "publishable" API key that Stripe will generate for you inside your account. This key is used by Kartris when formatting the javascript that forwards user sessions over to Stripe for the payment. It will generally start with the letters "pk_". It is called "publishable" since this is used in client-side code so can be visible to users.
This is the key that Kartris uses server-side to communicate with the Stripe servers. This will not be visible to the user's browser in any way during the process, and as such is "secret". It will generally start with the letters "sk_".
Webhooks are setup in Stripe to post information back to web sites when certain events happen. In our case, we're interested in getting notification when checkout sessions are completed (i.e. customer completes payment). More detail on setting these up below. But a secret value is used to secure these, and that should be entered here.
See @17.20.2. Setup within Stripe for more details.
A client-side javascript library is used to format javascript to redirect user sessions from Kartris over to Stripe's payment pages. This is the path to that library. In future, Stripe may require we link to newer libraries, hence we have this URL in the settings so it can be changed easily.
For simplicity, we format the order as a single item with a value to send to Stripe. When users checkout, they will see this item on the left of the page with its value. The name shown to users will be [OrderDescription][OrderID]. You can change the OrderDescription part here to customize the order description to your own site's name.
To receive notifications from Stripe to your Kartris store, a webhook is required. You should configure this point to [yoursiteURL]/callback-stripe.aspx
You will have to associate at least one event. You should choose "Checkout" followed by checking the box for checkout.session.completed
A webhook endpoint secret will be generated, and you should ensure you add this into your Stripe settings in Kartris. See @17.20.1.3. WebhookEndpointSecret for more details.
This will be called "Signing secret" but you will have to click to reveal it. It should begin "whsec_".
Stripe let's you choose the version of its API that you use. We have tested our integration with both these versions (which were default, and latest, at the time of writing) and both work fine.
2022-11-15
2020-08-27
If you are developing and testing locally, Stripe provides a useful tool in the shape of the CLI (Command Line Interface). At time of writing, the latest version is here: https://github.com/stripe/stripe-cli/releases/tag/v1.13.6
Copy the Stripe.exe file to your local machine, and then use a command prompt to navigate to it. If you run your Kartris on Visual Studio's built in server, you can get Stripe's CLI to listen for webhooks and forward them to your local development site's callback page (Kartris will map requests to callback-stripe.aspx to callback.aspx?g=stripe, which tells Kartris which gateway DLL to use for processing the callback). For example, something like this:
stripe listen --forward-to http://localhost:4242/callback-stripe.aspx
The CLI will give you the webhook endpoint secret to use. You need to add this in your settings, see @17.20.1.3. WebhookEndpointSecret
Once this is set, you can move through your checkout process, select Stripe as payment method, and go through to pay. If you have Stripe set to TEST mode, you will see some dev info on the page before you go to Stripe, and have a checkout button to push. This way, you can view the page source if you need to see what is being posted during development. This page does not show in LIVE mode, Kartris will format the javascript silently and submit it immediately.
You should see the order details to the left, and a payment form to the right. Use the following test card details:
4242 4242 4242 4242
any name
a date in the future
any three digit security code
Stripe should show the transaction as complete and forward you back to your development site.
You should see the order showing as paid in your back end, with the event ID added as the reference code. In the CLI window, you should see some indication that the webhook was triggered and received a 200 ok response.
The full CLI reference is here: https://stripe.com/docs/cli
The WorldPlay plugin was updated in Nov 2023 to add the MD5 hashed signature field. If you are activating or updating WorldPay, please ensure you get the plugin DLL from the latest Kartris release. You will also have to add the new MD5Secret section from the .config file to your existing WorldPay.dll.config file.
If you are updating an existing Worldpay installation, you will need to do the following.
You may need to stop the web site in IIS first to unlock the existing DLL. Then copy the new Worldpay.dll file from the latest Kartris zip (/Kartris/Plugins/Worldpay folder) into your web, overwriting the existing file. Then you can restart the web site in IIS.
Find the Worldpay.dll.config file in the same folder as the Worldpay.dll you just changed. Open this in notepad for editing and add this new section into the settings, ideally between the CallbackPassword and InstallID ones. The new section looks like this:
<setting name="MD5Secret" serializeAs="String">
<value />
</setting>
Now, we need to add a value to this setting. Go to your Kartris back end, Configuration > Payment and Shipping Gateways and you should see Worldpay near bottom. The verson should show as 2.1.0.1 (or above). Click to edit Worldpay.
You should see the new MD5Secret field. Add a value - this should be text, between 20 and 30 characters, no spaces. It must contain at least one number, one lowercase letter, one uppercase letter and one special character. Copy this value as you'll need it in the next step.
You need to login to Worldpay, find the live account settings for the correct install ID and update a couple of fields.
First, the MD5 Secret. You should copy exactly the same value into the new MD5Secret field you just added into your Kartris back end.
You will also need to add the following to the Signature fields: instId:amount:currency:cartId
Save the settings. If there are errors reported with your MD5 Secret value, fix them, but ensure that you copy any changes back into Kartris, so your MD5 secrets in both places match.
When the browser uses a URL starting with https, rather than http, the connection is encrypted. These days, this is done using a protocol called TLS (transport layer security) although the term SSL (which was the predecessor protocol) is still widely used to refer to secure connections.
The first step is to check your web site has HTTPS enabled. To do this, simply go to the front page of your site and then edit the address in the browser so it uses HTTPS instead of HTTP. For example,
https://www.demo.xyz/
If you see an error in your browser that the site is untrusted, or that the connection was interrupted, or any other browser error, then SSL is NOT running properly on your site. You should contact the host or your developer if you believe it should be.
Only once you have verified that HTTPS support is setup and working should you attempt to activate the SSL/TLS support within Kartris.
Once logged in to the back end, find the general.security.ssl config setting. There are four possible settings ('always on' SSL was introduced in Kartris v2.7000, 'external' was introduced in Kartris v2.9008).
Scope of HTTPS
Using HTTPS puts an additional overhead on a web server and a user's browser, and so originally was used only in places where sensitive data is transferred, especially for credit card transactions. There was seen as little point applying it to all traffic such as when a casual visitor is browsing the site, or a search engine is spidering it.
However, in recent years, HTTPS has become more widespread. Many web sites such as Google use it by default, and the revelations by Edward Snowden of pervasive internet surveillance by security agencies have further highlighted the issues of eavesdropping and user-privacy. In summer 2014, Google indicated that it would start to give slight preference in its results to sites running HTTPS, which has led to a surge in the take up of 'always on' HTTPS.
With the arrival of services such as Let's Encrypt and Cloudflare, both of which can provide a free route to HTTPS, there is no reason these days not to implement it.
This is the simplest way to add SSL to your web site. You register and set up your domain with Cloudflare.com (or a similar service), then set the nameservers for your domain to point to the ones Cloudflare tells you.
We'd recommend going into the Cloudflare settings and hitting 'pause' so Cloudflare will only serve DNS for the site at first. This will ensure the site continues to work as before (without SSL) until you decide to do the switch. Leave it a day or two, and check that Cloudflare has issued the required secure certificate for your site.
Once it has, you can activate Cloudflare to handle requests for your web site. We suggest for most sites using the 'flexible' SSL setting in Cloudflare, so you can run your web server with just http, which doen't require a secure certificate, and let Cloudflare add the SSL to the front end for you.
Then in the back end of Kartris, you should set the 'general.security.ssl' config setting to 'e' (for external).
Because Kartris will no longer be able to check programmatically if a page is being called with http or https (it will actually think everything is running http, because there is no SSL at the web server itself), you need to add some page rules into Cloudflare to ensure that appropriate redirection occurs. The ones shown below will redirect http requests to https, and also requests to kartris.com to www.kartris.com. The first request bypasses Cloudflare's cache for payment gateway callbacks to Kartris. This is a good precaution to avoid any unexpected behaviour on those such as redirections, which can prevent them working properly.
Not to be confused with the security applied to the pages of your web site, Kartris must also at times call URLs securely. For example, Kartris connects to the changelog feed, shows the latest Kartris version available, the news and so on. But most importantly, some payment systems require Kartris to connect to them using TLS, and real time shipping systems like UPS and USPS also use secure connections.
In 2018, many different payment systems will be dropping support for older protocols, and will only support TLS 1.2 or above. In order for your web site to continue to be able to connect to remote systems using secure connections, you must ensure that your web site is ready.
The first step is to ensure your server has support for TLS 1.2, outgoing, as well as incoming. If you are on a shared server, you should check with your web host. If you have your own server, you will need to check and may have to make registry changes yourself. We found that Windows Server 2008 R2, for example, even with all up-to-date patches on, does not have TLS 1.2 support by default and requires registry changes.
Check the following article for further details:
Enabling TLS 1.2 on Windows Server 2008 R2
From ASP.NET 4.6 onwards, TLS 1.2 is the default. This means if your server has been kept up to date with patches and .NET updates when they've become available, and (if required) has the necessary registry changes (see @18.2.1. Server support above) then it should make outgoing secure connections using TLS 1.2 by default. The easiest way to test this is to simply try switching the web site to ASP.NET 4.6 and then test that it works. To do this, open the web.config file (in the root of the web) and find this code:
<compilation debug="false" batch="false" targetFramework="4.5">
and simply change the target framework to 4.6:
<compilation debug="false" batch="false" targetFramework="4.6">
Then reload the web site. It will take a few seconds as changes to the web.config will cause the web site code to rebuild. But you should see the web site load up and it should work exactly like it did before the change. If some page error appears, and you're sure the change you made above was done correctly, restore the original web.config file, as it seems your server does not have .NET 4.6.
You can try adding this (or check with your host if on a shared server), and then try the process above again. This avoids any code changes in Kartris.
If you are on a server where you cannot install the newer .NET versions, then you may be restricted to ASP.NET 4.5. This does support TLS 1.2, but it is not used by default. You can force this by adding this code within the Application_Start event in the Global.asax file in the root of the web:
Try
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
Catch
End Try
If you are running older versions of Kartris that are still on the ASP.NET 2.x branch (up to 3.5), then it seems Microsoft is rolling out support to these. However, we're no longer providing all payment plugins compiled for this branch, and are not supporting these older sites with updates, so we'd strongly recommend upgrading to the latest version of Kartris.
TLS 1.2 support, including for older ASP.NET versions
<add key="BackEndIpLock" value=""></add>
For security, passwords for both admin accounts and front end users (customers) are salted and hashed before being stored in the database.
For the salting, we use two separate salt values. The first is a global value, typically set during installation of Kartris, and is stored in the web.config file of the site. For example:
<add key="HashSalt" value="9e3cdce4-a52e-47e6-ba12-697e64760ce9" />
The second salt value is generated per-user, and stored with the user record. It's generated at the time a user record is created, or if the password is changed.
It is stored in the U_SaltValue field of the tblKartrisUsers table, or for back end admins, the LOGIN_SaltValue field of the tblKartrisLogins table.
Before hashing user and login passwords, the first salt string is appended to the front, and the second to the end of the user's chosen password. This whole string is then hashed using sha-256, and the result stored in the database (U_Password in the tblKartrisUsers table and LOGIN_Password in the tblKartrisLogins table).
Salting the passwords prior to hashing ensures that rainbow tables or similar methods cannot be used to brute force the passwords from the database, if it was ever obtained by an attacker. Or to put it another way, if two or more users choose an identical password, these will result in entirely different values being stored in the password field of the database (because both will have different per-user salt text appended before hashing).
Furthermore, the use of two salt strings, one which is stored in the database record and one that is stored in the web.config file adds an additional level of security, as there are two separate elements in different storage locations that would need to be obtained.
When a user logs into the site, the password they enter has the global and per-user hashes applied, the resulting string is hashed with sha-256 and compared to the stored value in the database. If they match, the password entered is correct, if they don't match, it is not and the user is not granted access.
Kartris contains built-in facilities to handle customer support through your web site.
These include a searchable knowledgebase system that you can load up with articles relating to specific products or technical issues, and a support ticket system that allows you to handle support from customers in a managed way, instead of via a slew of emails.
The knowledgebase features can be turned off (so they are hidden on the front end of your site) using the frontend.knowledgebase.enabled config setting.
To access the knowledgebase features in the back end, go to 'Support > Knowledgebase'.
Articles can be created with just a name (display title), text (details) and page-title tag (for search engines). It is also suggested to use keywords; as well as populating the meta-keywords tag on the page, these keywords are also searched as part of the knowledgebase search on the front end. It is useful to add alternative spellings or names for certain things, or common misspellings, to ensure that articles have the best chance of being found with the knowledgebase search.
The Kartris support ticket system provides a web-based alternative for dealing with technical and sales support that has a number of advantages.
Support tickets opened by customers will show up in yellow in the back end support tickets view when they are still unassigned to a staff member. Once a site admin views the ticket and assigns it to themselves (the simplest way is using the 'Me' link next to the 'Assigned to' menu), they can reply to it.
The customer will receive an email when the ticket is updated. They should enter any follow up comments through the web site rather than by responding to the email, to ensure all comments are linked to the thread. The ticket will show as light grey in the listing.
Once a customer has replied, the admin responsible for the ticket will receive an email notification. The ticket will show again as yellow, meaning that action is required.
Once an issue has been resolved, the ticket can be closed. At this point it will change colour to dark grey.
The status can also be set as 'not sure' or 'unresolved'. Tickets will generally be set to this when you wish to highlight them for future attention rather than immediate attention.
Kartris shows a number of statistics on each ticket, including the number of tickets raised by this customer, the total number of messages and the total time taken on tickets for this customer (in addition to the time taken for this ticket, which is under the ticket details on the left hand side).
<appSettings>
<!-- other settings here -->
<add key="com.kartris.livetile.Service1" value="http://livetile.kartris.com/KartrisNotificationServer.svc" />
<add key="KartrisWebAPISecretKey" value="dxuIyFt992As" />
<add key="KartrisWebAPIIPLock" value="" />
</appSettings>
<system.serviceModel>
<services>
<service behaviorConfiguration="DefaultBehavior" name="KartrisWebAPI">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="DefaultHttpBinding" contract="IKartrisWebAPI"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
<host>
<baseAddresses>
<add baseAddress="https://www.kartris.com/protected/KartrisWebAPI.svc"></add>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
The 'baseAddress' should of course contain the path to your own site's web API.
You can test if the web API is working by calling it as follows (obviously with your own domain rather than ours):
https://www.kartris.com/Protected/KartrisWebApi.svc?wsdl
MailChimp is a popular online service for running mailing lists and authoring messages to subscribers. The service is free for lists under 2000 users, and the ecommerce integration available through the v3 API is now also available to free users.
This feature requires Kartris v2.9010 or later.
First, you will need a MailChimp account. Login at https://login.mailchimp.com, or create an account if you don't have one.
Click on your username on the Right side of the Side and access the Account Menu.
Navigate to "Extras > API Keys"
Create an API Key if you don't have already one and note it down somewhere like a blank text file.
On the upper menu click "Lists" and "Create a List"
Select the created list.
Go to the "List Settings > List name and defaults"
Find and copy the List Id from the screen, it should be top of the right hand column, and look something like this: 783d4b1dda.
Login to your Kartris back end.
Navigate to the Config Settings, then enter 'mailchimp' in the search box and click the search button. You should see the required config settings listed:
general.mailchimp.apikey - this is the API key you created or copied from the MailChimp back end in @19.6.1.1. Setting up API access in MailChimp
general.mailchimp.apiurl - This is the URL of the MailChimp API. This varies by account. For example, https://us4.api.mailchimp.com/3.0/ is the one we use, but the 'us4' part depends on the data centre of your account. You can tell this from the URL in the address bar of your browser when logged into MailChimp. The data centre is the first part of the URL, for example, ours shows https://us4.admin.mailchimp.com, hence the 'us4' for the API URL.
general.mailchimp.enabled - this one is simple enough. Needs to be 'y' to activate the MailChimp integration.
general.mailchimp.listid - this is the List ID you got in @19.6.1.2. Creating a list for ecommerce users
general.mailchimp.mailinglistid - Kartris can also use MailChimp to subscribe users to a general mailing list in MailChimp. This separates users who sign up to your newsletter, from ecommerce customers who purchase things through the site. Set up a list using the same steps as in @19.6.1.2. Creating a list for ecommerce users, or use an existing mailing list if you have one already.
general.mailchimp.storeid - Each 'store' in MailChimp needs a name. You can choose this, for example 'Kartris Ecommerce'. It will be registered through the API later.
Now you have all the settings and preparation done, the final step is to connect to MailChimp and create the new integration. In the Kartris back end, go to "Miscelleneous > MailChimp". This page should show the relevant MailChimp settings you've entered. You can name the store, enter your store's domain and your email address and then push the 'Create MailChimp Store' button.
This sends a request through to the MailChimp API which actually creates the new store record there.
You should see a confirmation of the result. If you get a message saying the Id already exists, that suggests that you already created this store previously.
Once the integration is setup, MailChimp should start recording ecommerce data. You can also set MailChimp to perform other tasks with the data.
One common use for MailChimp is to send abandoned cart emails. These follow up potential customers who got all the way to the checkout and through to payment, but did not complete for whatever reason. These can provide a rich source of potentially untapped sales.
Access MailChimp, login and Select "Automation" from the Top menu.
Select "Add Automation".
Find "Abandoned Cart Series" and Select "Add Automation". You could also use "Abandoned Cart Email", but the series option is more flexible, and can send either one or several follow up emails.
The minimum period after which a mail can be sent is an hour. This should allow plenty of time for an order to be completed; a completed purchase should cancel any pending abandoned cart email.
GDPR, the 'General Data Protection Regulation' is a new pan-EU law that will protect the private data of citizens across the continent. It will take effect from 25 May 2018. For more information see the official GDPR home page.
It's important that businesses who deal with EU citizen's data are compliant; it does not just affect companies and organizations within the EU, but all those who process the data or, or deal with EU citizens.
In Kartris v2.9012 (released 16 March 2019), we have included a number of features for compliance with the GDPR regulations, and to ease the process of delivering some of the rights under GDPR.
When a customer creates an account on Kartris, we now have an extra checkbox signifying acceptance of the terms and conditions. This helps ensure that any time a record for a user is created, there is an explicit confirmation of terms and conditions.
This feature can be turned on or off using the config setting general.gdpr.enabled, though we would recommend it remains on whether you are EU based or not.
The aspect of GDPR that has perhaps been given the most publicity, is that users must explicitly opt-in to receive marketing information. It is no longer considered acceptable to imply consent because a user places an order or creates an account on a web site.
Kartris has always employed best practice with regard to adding users to mailing lists; an email confirmation is sent which the user must respond to by clicking a link, in order to confirm their addition to the mailing list. We have never considered it an acceptable practice to add users to mailing lists other that with an explicit approval, and an email verification to ensure consent is gained from the owner of the email address for this purpose. It also ensures that email addresses cannot be added to the mailing list by third parties, either maliciously, or accidentally (e.g. a typo).
The mailing list approval emails that Kartris sends are formatted using an email template, which you can find in the templates folder of a skin (see the Kartris default skin, if your own skin lacks this). Therefore, we would recommend expanding the text within this template to explain that clicking the confirmation link will give explicity consent to add your email address to the mailing list.
As well as maintaining its own internal mailing list, Kartris can also insert email addresses to Mailchimp. See @19.6. MailChimp integration for further details.
In this case, Mailchimp should handle the GDPR aspects.
EU data privacy regulations have for many years given the public the right to request a copy of all the data an organization holds on them. The organization was allowed to charge a reasonable fee for this service, typically £10 in the UK or a similar amount in Euros. The nominal fee was in most cases not enough to cover the real cost of providing the data, but was at least a deterrent to spurious and unnecessary requests.
However, the GDPR requires that organizations provide the full data held on an individual free of charge, and within 28 days. This aspect may in time be the most onerous on businesses, though at present it is not getting much attention. While there will undoubtedly be an increase in legitimate, well intentioned requests, it's also possible that requesting data could also become a practice to test or inconvenience companies that consumers may have a dispute or disagreement with. Regardless, the company is compelled to respond.
To make this process as simple as possible from Kartris, we've created a data export button on the customer edit page. If a member of the public requests data, you can extract this from Kartris by simply finding the users record in Kartris with an email search, and then using the 'GDPR export' button.
This will format a plain text file containing all data linked to that email address:
The data is formatted in a fairly raw state, with the database field name (in square brackets) followed by the value. This is to ensure that the user receives the full set of data and no fields are emitted.
The GDPR export feature can only export data held within your Kartris store. It cannot export email correspondence, accounting software records or other data you may hold on the individual.
While it may not provide a complete solution to GDPR requests, it will significantly reduce the work required. What would previously have required direct database access and perhaps an hour or so of work, can be accomplished with a single button click.
Kartris is a complex piece of software, and we have always aimed to provide extensive documentation. While developers may be used to consulting technical documentation when working with software, many end users aren't.
In 2017, we switched the Kartris technical documentation to this new tomehost platform. This improved the general speed and performance of the documentation, and also made it easier to write and publish content ourselves.
From Kartris v2.9012 onwards, we have also integrated tomehost documentation directly into the back end of Kartris. There are 'help' links near many features - an orange circle around a question mark. Clicking these will bring up a new popup window that links through to the relevant section or subsection of the Kartris documentation.
These popup help windows are not modal, so you can continue to access the other parts of the page and work on them, while reading through the documentation. You can also drag the window to another location, resize it or minimize or expand it to full screen.
There is a link in the foot of the window that will open up the full Kartris tome in a new browser window, with this section selected. This makes it possible to navigate up to the section parent, or view other parts of the documentation. We hope this feature will help users access the Kartris documentation more easily, and in particular, access the relevant parts, without having to leave the Kartris and hunt through the documentation for the relevant section.
The features can be turned on/off individually after installation with the following config settings:
powerpack.filters.enable
powerpack.searchsuggest.enable
<div class="small-12 large-3 columns filterbar">
<div class="small-12 large-9 columns">
/*
========================================================================
CATEGORY FILTERS - if you have the PowerPack installed
========================================================================
*/
.page_category #filterbar_pad { padding: 3px 10px 10px 0; background: #fff; }
.page_category #customprice { padding: 5px 0; }
.page_category .filterattributes { padding: 15px 0 10px 0; }
.page_category .shorttext { display: inline-block; }
.page_category select,
.page_category input { margin: 1px 0 3px 0; }
.page_category label,
.page_category span.attribute_title { font-size: 11px; text-transform: uppercase; display: inline-block; letter-spacing: 0px; color: #777; margin-bottom: 3px; font-weight: normal; vertical-align: top; }
.page_category table { margin: 0 0 10px 0; background: none; border-bottom: solid 1px #ccc; }
.page_category table tr td { background: #fff; padding: 1px; border: none; }
.page_category table tr td label { color: #333; text-transform: none; font-size: 100%; }
Kartris 2.0 and onwards are licensed by default with the GNU General Public License v2 (normally abbreviated to GPL v2). This is a free open-source license. Please read the license terms carefully - in particular, the license requires you to ensure that you do not remove code that displays copyright and warranty information to users. So the 'powered by' link at the foot of pages must be retained under this license.