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 2008+ 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: @2. 2Setup2 @2.4.4. Forcing the install routine to run again @2. 2Setup2
<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"/>-->
<add key="BackEndIpLock" value=""/>
<add key="TaxRegime" value="EU" />
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 |
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.
ObjectConfigBLL.GetValue("K:product.addtobasketqty", 99)
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).
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.
Kartris contains a number of features that enable you to draw attention to particular items or provide special prices that will encourage purchases.
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 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.
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:
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.
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.
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 @5.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.
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.
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 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.
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
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
<appSettings>
<add key="KartrisWebAPISecretKey" value="[YourSecretKeyHere]" />
</appSettings>
...
<baseAddresses>
<add baseAddress="[YourWebShopURLHere]Protected/KartrisWebAPI.svc" />
</baseAddresses>
'''<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>
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
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.
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>
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>
<%@ 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" />
<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>"
Dim strSampleValue As String = ObjectConfigBLL.GetValue("K:product.myobjectname", numProductID)
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.
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"
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:
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.
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).
method1 POST
url1 http://www.mydomainnamegoeshere.com/callback.aspx?g=securetrading&p=stpassword
fields1 orderref, streference, email, amount, stresult
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.
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 address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://www.kartris.com/protected/KartrisWebAPI.svc"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
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%; }