> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# Basics and technology

> The technical foundation of the shop configuration shop.config: basic settings in the Basic section, domains, templates, design and include technology, sessions and CSRF protection, SEO settings and the derivation of referers.

The shop configuration shop.config holds a shop's commercial specifications and all texts that appear in the shop. Each subshop has its own shop.config, and this is exactly what allows subshops to be tailored to specific target groups and countries. The German shop offers cash on delivery and DHL, the English one neither, but UPS instead. The file is edited in the online service area.

This page covers the technical foundation: what the shop knows about itself, which domain it runs under, which templates it uses, how content is embedded and how it behaves towards search engines.

> [!NOTE]
>
> For subshops with language- or target-group-dependent configurations, the text maintenance platform is available in the online service area. It lets you carry out translations and text changes in one place and apply them automatically to the individual configurations.

The remaining sections of the shop.config are on these pages:

| Page | Content |
| - | - |
| Texts and messages | Buttons, headings, notification and error messages |
| Customer, login and customer account | Login, password rules, customer account, customer data fields |
| Addresses and input checks | Address fields, suffix fields, input checks |
| Payment methods | All payment methods and their dependencies |
| Shipping and delivery | Shipping methods, suppliers, delivery dates, partial delivery |
| Prices, taxes and currency | VAT, currencies, price format, bonus points |
| Basket and checkout process | Basket, order conditions, order options |
| Products, catalog and search | Categories, sorting, search, stock, ratings |
| Emails | All emails sent by the shop |
| External services and interfaces | Consents, captchas, tracking, upload, interfaces |

## Basic

The `Basic` section holds the shop's overarching basic settings. It is the only section without which a shop does not run, because the main domain is defined here.

The order of the parameters in the configuration does not matter. The following sections arrange them by topic rather than alphabetically.

### Switching the shop on and off, test operation

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   ShopActive-Allow                             = yes
   TestModePassword                             = on
   TestModeAuthentication                       =
   TestModeBasicAuth                            =
   ClosedTestShop-Bypass-BasicAuth              =
   ClosedTestShop-Bypass-UserAgentContains-List =
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `ShopActive-Allow` | Switches the entire shop on or off, or into the general test mode. | `yes`, `no`, `test`. Default `yes` |
| `TestModePassword` | The password that must be specified in the `test=` request parameter to switch on test operation for the current session. | any string. Default `on` |
| `TestModeAuthentication` | Places HTTP basic authentication in front of the test mode. | `BasicAuth`. Default empty |
| `TestModeBasicAuth` | Credentials for this basic authentication. | String |
| `ClosedTestShop-Bypass-BasicAuth` | Credentials with which a closed test shop is entered without further checks. | String |
| `ClosedTestShop-Bypass-UserAgentContains-List` | List of strings in the user agent that may pass a closed test shop, intended for search engine bots. | Comma-separated list |

> [!NOTE]
>
> The last four parameters are not in the previous documentation, but the shop system reads them. They belong to closed test shops and are usually set up together with WEBSALE.

Guide: Activating/deactivating the shop, Switching the shop's test modes on/off

### Language, character set and date

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   ShopLanguage       = DEU
   Charset            = ISO-8859-1
   DateFormat         = LittleEndian
   ConvertMailsToUTF8 = no
   CatPathDelimiter   =
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `ShopLanguage` | Language of the shop. | Three-letter code according to ISO 3166, column A3, for example `DEU`, `GBR`, `FRA` |
| `Charset` | Character set in which the shop pages are created. | Valid ISO code |
| `DateFormat` | Display format for dates. | `LittleEndian` (28.07.2009), `MiddleEndian` (07-28-2009), `BigEndian` (2009-07-28). Default `LittleEndian` |
| `ConvertMailsToUTF8` | Sends the shop's emails UTF-8-encoded instead of in the character set from `Charset`. | `yes`, `no`, `test`. Default `no` |
| `CatPathDelimiter` | Separator between the categories when outputting the full category path. | any string. Default » |

> [!WARNING]
>
> An unrecognized value for `DateFormat` does not lead to an error message but silently to `LittleEndian`. A typo therefore only becomes noticeable in the date output.

> [!NOTE]
>
> If you use DKIM, set `ConvertMailsToUTF8` to `yes`. Only then is the DKIM signature calculation error-free even with special characters. With `test`, you first check the change in the general test mode.

Guide: Specifying language, character set and date format, Sending emails in UTF-8

### Domain and links

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   Domain-!                     = www.ihrshop.de
   EncodeAmpersandInLinks-Allow = yes
   hreflang                     =
   mediacode                    =
   TargetSystems                = stationary
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Domain-!` | Main domain under which the shop is accessed. | Valid domain name |
| `EncodeAmpersandInLinks-Allow` | Replaces `&` with `&amp;` in links. | `yes`, `no`. Default `yes` |
| `hreflang` | hreflang attribute of this subshop. | for example `de-DE` |
| `mediacode` | Media code of the subshop. | for example `only screen and (max-width: 640px)` |
| `TargetSystems` | Determines whether the shop content and the TopRank pages are generated for stationary or mobile systems. | `stationary`, `mobile`. Default `stationary` |

> [!WARNING]
>
> The main domain must match the stored SSL certificate. If the two differ, the shop system sends a critical error message to WEBSALE. Therefore always discuss a change to the main domain with your WEBSALE contact in advance.

> [!WARNING]
>
> If `Domain-!` is missing, the shop system reports a configuration error. Also note that `ihrshop.de` and `www.ihrshop.de` are two different domains. If both are to work, add the second spelling in the `AddDomains` section.

Guide: Configuring domains for accessing the shop, SEO optimization with TopRank, Automatic generation of the hreflang attribute

### Start page, categories and product display

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   DefaultTopCatIndex                                       =
   ShowSingleProductOnCategoryPage                          = yes
   NewProductDays                                           = 30
   UseDefaultDepVarIndex-Allow                              = no
   UseFreeSetProductPlacement-Allow                         = no
   HideProductsWithUnknownProdNumbersInCatAdvDataLists-List =
   HideForRating-Allow                                      = no
   HideForAgeRestricted-Allow                               = no
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `DefaultTopCatIndex` | Default main category as long as none has been selected, for example when the shop starts. | Category index |
| `ShowSingleProductOnCategoryPage` | Controls the behavior for categories with only one product. `yes` shows the category template, `no` jumps directly to the product template. | `yes`, `no`. Default `yes` |
| `NewProductDays` | How many days after the creation date a product is considered new. | Integer up to 365. Default 30 |
| `UseDefaultDepVarIndex-Allow` | Uses the preselection of the dependent variant combination stored in the product data. | `yes`, `no`, `test`. Default `no` |
| `UseFreeSetProductPlacement-Allow` | Allows several set products on one page and adding them to the basket from there, for example via `PR-LoadData`. | `yes`, `no`, `test`. Default `no` |
| `HideProductsWithUnknownProdNumbersInCatAdvDataLists-List` | Hides products whose product number no longer exists. | Comma-separated list of `CAT-AdvData` lists |
| `HideForRating-Allow` | Hides products that are blocked for rating. | `yes`, `no`. Default `no` |
| `HideForAgeRestricted-Allow` | Hides age-restricted products. | `yes`, `no`. Default `no` |

> [!NOTE]
>
> `HideForRating-Allow` and `HideForAgeRestricted-Allow` are not in the previous documentation, but are evaluated by the shop system.

### Session, cookies and order completion

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   KeepSessionAfterOrder-Allow                    = no
   DesignCookieDays                               = 30
   RefererCookieDays                              = 30
   AffiliateCookieDays                            = 30
   SetRefererCookie                               = no
   OnlinePriceTimeoutInSec                        = 180
   OnlinePriceNotifyPriceUpdateAtPlaceOrder-Allow = yes
   DeliveryRequiredForOrder-Allow                 = no
   OrderHistoryAllSubShops-Allow                  = no
   SavedBasket-SkipProdValidityCheck              = no
   MemoListPaging-Allow                           = no
   PrimeShoppingDefaultPeriodOfNotice             = 30
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `KeepSessionAfterOrder-Allow` | Keeps the session after an order instead of closing it. | `yes`, `no`. Default `no` |
| `DesignCookieDays` | Lifetime of the design cookies in days. | Integer. Default 30 |
| `RefererCookieDays` | Lifetime of the referer and subreferer cookies in days. | Integer. Default 30 |
| `AffiliateCookieDays` | Lifetime of the affiliate cookies in days. | Integer. Default 30 |
| `SetRefererCookie` | Stores the referer in the cookie and reads it again on subsequent visits. | `yes`, `no`. Default `no` |
| `OnlinePriceTimeoutInSec` | How long an online price remains valid in the basket. | Seconds. Default 180 |
| `OnlinePriceNotifyPriceUpdateAtPlaceOrder-Allow` | With `yes`, the order with an expired online price is not completed, the price is updated and the buyer remains on the order overview. With `no`, the order is silently completed at the new price. | `yes`, `no`. Default `yes` |
| `DeliveryRequiredForOrder-Allow` | Makes selecting a shipping method mandatory to continue the checkout process. | `yes`, `no`. Default `no` |
| `OrderHistoryAllSubShops-Allow` | Bases the order history on all subshops instead of only the one currently logged in to. | `yes`, `no`. Default `no` |
| `SavedBasket-SkipProdValidityCheck` | Skips the check whether the products still exist when loading a saved basket. | `yes`, `no`. Default `no` |
| `MemoListPaging-Allow` | Switches on paging for the memo list. | `yes`, `no`. Default `no` |
| `PrimeShoppingDefaultPeriodOfNotice` | Default notice period at the end of the term of a Prime package if none is stored in the product data. | Days. Default 30 |

> [!WARNING]
>
> Only set `KeepSessionAfterOrder-Allow` to `yes` if the shop has a clearly visible logout function. By default, the session is closed after every order for security reasons. The exception is typically B2B shops with regular customers who order several times a day.

> [!WARNING]
>
> Without `SavedBasket-SkipProdValidityCheck`, the shop system automatically deletes a product that no longer exists from the saved basket when loading it. With `yes`, the item remains, and the buyer sees a product they cannot order.

Guide: Logout, Staying logged in after an order, Online prices, Order history, Saveable basket, Prime shopping

### Quick order

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   IgnoreFastOrderConfiguration-Allow         = no
   FastOrderPreSelectConditionsAccepted-Allow = yes
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `IgnoreFastOrderConfiguration-Allow` | With `yes`, quick order is offered without activation by the buyer. | `yes`, `no`. Default `no` |
| `FastOrderPreSelectConditionsAccepted-Allow` | Preselects the checkbox for accepting the terms and conditions in quick order. | `yes`, `no`. Default `yes` |

Guide: Quick order

### Tracking interface

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   DataAnalysis-Allow              = no
   DataAnalysis-AlwaysSendBasket   = no
   DataAnalysis-AddFile1           =
   DataAnalysis-AddFile2           =
   DataAnalysis-JSID               =
   DataAnalysis-BaseHrefForJSID    =
   DataAnalysis-TargetCurrencyCode =
   AdvStatisticsID                 =
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `DataAnalysis-Allow` | Switches on the tracking interface. The file ws\_analyse.js is also required. | `yes`, `no`. Default `no` |
| `DataAnalysis-AlwaysSendBasket` | Outputs the basket information on every page. Some tracking service providers need this. | `yes`, `no`. Default `no` |
| `DataAnalysis-AddFile1`, `DataAnalysis-AddFile2` | Additional JavaScript files that are embedded at the end of every trackable page before the closing body element. | Path relative to benutzer/templates/*subshopid* |
| `DataAnalysis-JSID` | ID of a grouping. If set, the grouping is embedded instead of ws\_analyse.js. | Grouping ID, for example `tracking` |
| `DataAnalysis-BaseHrefForJSID` | Relative base path that is prepended to the path of the grouping file, for example for master shops. | Path, for example `/$WS/master/js/subshop/` |
| `DataAnalysis-TargetCurrencyCode` | Foreign currency passed to the tracking interface. | Three-letter code according to ISO 4217, for example `CHF` |
| `AdvStatisticsID` | ID for the advanced statistics. | String |

> [!WARNING]
>
> A general notice about cookies or tracking is not legally sufficient. The visitor must actively confirm that they agree to the use, and preset consents are not permitted. Functions that require consent therefore always need an opt-in. Clarify the details with your data protection officer.

> [!NOTE]
>
> `AdvStatisticsID` is not in the previous documentation, but is evaluated by the shop system.

Guide: Enabling the tracking interface, Tracking interface with PageSpeed tool. Reference: WS-ExternalStatistics

### Recommendation, glossary and ratings

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   ProdRecmdReferer-Txt             = PROD_RECMD
   Glossary-Allow                   = no
   GlossarySupportHTMLEncoding-Allow = no
   AddProdRatingSubShopList         =
   AddPIASubShopList                =
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `ProdRecmdReferer-Txt` | String used instead of the standard referer for a link to a recommended product. | any string. Default `PROD_RECMD` |
| `Glossary-Allow` | Switches on the glossary module. | `yes`, `no`. Default `no` |
| `GlossarySupportHTMLEncoding-Allow` | Allows the glossary to recognize HTML-encoded texts as well. | `yes`, `no`. Default `no` |
| `AddProdRatingSubShopList` | Subshops whose product ratings are also used. | Comma-separated list of subshop IDs |
| `AddPIASubShopList` | The same for ProductsInAction. | Comma-separated list of subshop IDs |

> [!NOTE]
>
> `GlossarySupportHTMLEncoding-Allow` and `AddPIASubShopList` are not in the previous documentation, but are evaluated by the shop system.

Guide: Integrating the "Recommend product" function, Embedding the glossary, Using ratings across subshops

### External systems and payment service providers

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Basic>
   ExternalUserDataExchangePW            =
   SecureBasicDataPW                     =
   UseSecureBasicDataWithoutNumber-Allow = no
   CtopLanguageCode                      = de
   TeleCashLanguageCode                  = de_DE
   TeleCashButtonName                    =
   OgoneLanguageCode                     = de_DE
</Basic>
```

| Parameter | Purpose | Values |
| - | - | - |
| `ExternalUserDataExchangePW` | Controls encoding and encryption of the customer data passed to external systems. Empty means hex-encoded only, `NOHEX` means unencoded, a 16-character string is used as a Blowfish password and the result is additionally hex-encoded. | empty, `NOHEX` or 16-character alphanumeric string |
| `SecureBasicDataPW` | Password for the secured transfer of master data. | String |
| `UseSecureBasicDataWithoutNumber-Allow` | Allows the secured master data transfer even without a customer number. | `yes`, `no`. Default `no` |
| `CtopLanguageCode` | Language of the external input page for credit card data with Computop. | Language code, see the list below. Default `de` |
| `TeleCashLanguageCode` | Language of the TeleCash pages with the TeleCash Connect 2.0 interface. | `de_DE`, `en_US`, `en_EN`. Default `de_DE` |
| `TeleCashButtonName` | Label of the button that leads to the TeleCash payment. | String. Default `Weiter zur Bezahlung` |
| `OgoneLanguageCode` | Language of the Ogone pages. | Language code. Default `de_DE` |

Available language codes for `CtopLanguageCode`: `al` Albanian, `at` Austrian, `cz` or `cs` Czech, `de` German, `dk` Danish, `en` English, `es` Spanish, `fi` Finnish, `fr` French, `gr` Greek, `hu` Hungarian, `it` Italian, `jp` Japanese, `nl` Dutch, `no` Norwegian, `pl` Polish, `pt` Portuguese, `ro` Romanian, `ru` Russian, `se` Swedish, `sk` Slovak, `sl` Slovenian, `tr` Turkish, `zh` Simplified Chinese.

> [!NOTE]
>
> `SecureBasicDataPW`, `UseSecureBasicDataWithoutNumber-Allow`, `TeleCashButtonName` and `OgoneLanguageCode` are not in the previous documentation, but are evaluated by the shop system.

Guide: Using external includes, "Credit card" payment method

### Deprecated parameters

| Parameter | Note |
| - | - |
| `CookieDetectionMethod` | Is no longer evaluated. The shop no longer delivers a version without cookies, so checking for cookie support is unnecessary. Former values were `javascript` and `redirect`. |
| `DCFPXEncryptBlowfishPW` | Encryption password for the DC-FPX tags, always 16 characters long. Use `DC-FPX_encrypt` or `DC-SPX_encrypt` and the `DesignControl` section instead. |

> [!NOTE]
>
> Remove deprecated parameters the next time you go through the configuration. They do not interfere with operation, but when reading they give the impression that something is set there.

Reference: DC-FPX\_encrypt, DC-SPX\_encrypt

## AddDomains

Defines additional domains under which the shop can be reached, and whether they are redirected to the main domain.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AddDomains>
   Redirect-Allow = yes
   +Domain        = ihrshop.de
   +Domain        = www.ihr-shop.de
   +Domain        = ihr-shop.de
</AddDomains>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Redirect-Allow` | Redirects requests via one of the listed domains to the main domain. | `yes`, `no`. Default `yes` |
| `+Domain` | An additional domain. One line per domain, up to 100 entries. | Valid domain name |

With `Domain-! = www.ihrshop.de` in the `Basic` section and the configuration above, a request via [www.ihrshop.de](http://www.ihrshop.de) is accepted unchanged. The three listed domains are redirected there. Any other domain is rejected.

> [!WARNING]
>
> Since all shops were switched to SSL-only, this section is no longer needed. WEBSALE system administration stores additional domains directly on the server. Contact your WEBSALE contact for further domains.

> [!NOTE]
>
> A host name is observed strictly. `ihrshop.de` and `www.ihrshop.de` are two different entries. If both spellings are to work, you need two lines.

Guide: Configuring domains for accessing the shop

## Templates

Assigns each shop state its template file. All templates are located below benutzer/templates. The name after the equals sign is the file name and can be chosen freely; the order of the lines does not matter.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Templates>
   Start       = ws_start.htm
   Category    = ws_category.htm
   Product     = ws_product.htm
   Basket      = ws_basket.htm
   PayDeliv    = ws_pay_deliv.htm
   PlaceOrder  = ws_place_order.htm
   Confirm     = ws_confirm.htm
   Login       = ws_login.htm
   UserAccount = ws_user_account.htm
   Notify      = ws_notify.htm
</Templates>
```

### The path through the shop

| Parameter | Template for |
| - | - |
| `Start` | the shop's start page |
| `Category` | the display of categories. In the WSPManager, a different template can be stored for each category |
| `Product` | the display of a single product. A different template per category is also possible here |
| `Search` | the search results and the input of the advanced search criteria |
| `Basket` | the basket |
| `PayDeliv` | the input of payment and shipping method |
| `PlaceOrder` | the order overview |
| `Confirm` | the confirmation page after submitting the order |
| `Notify` | important messages |
| `SubShopAccessDenied` | the case where the buyer has no authorization for this subshop |

### Login and customer account

| Parameter | Template for |
| - | - |
| `Login` | the login when placing the order |
| `LoginStart` | the login at shop start for closed shops |
| `Logout` | the logout |
| `UserAccount` | the customer account |
| `AddressManage` | the management of the billing address |
| `DelivAddressManage` | the management of the delivery addresses |
| `CombinedAddress` | requesting billing and delivery address on one template in the checkout |
| `MultiDeliveryManage` | the management of several delivery addresses for one order |
| `BankManage` | the management of the bank data |
| `CreditCardManage` | the management of the credit card data |
| `AutoLoginManage` | the management of the saved login |
| `MultipleAccountsOverview` | the multiple accounts overview |
| `ConnectedExternAccountsOverview` | the display of the connected external accounts |
| `TFAVerify`, `TFAManage` | the verification and management of two-factor authentication |
| `PasskeyVerify`, `PasskeyManage` | the verification and management of passkeys |
| `UserSearch` | the SuperUser's customer search |

### Additional functions

| Parameter | Template for |
| - | - |
| `MemoList` | the memo list |
| `Wishlist`, `WishlistAdmin` | the display and management of the wish list |
| `SavedBasketsManage` | the management of the saveable baskets |
| `ProductComparison` | the product comparison |
| `ProductRecmd`, `ProductRecmdConfirm` | recommending a product and the confirmation afterwards |
| `OrderHistory` | the order history |
| `ReOrder` | the reorderable products |
| `AutoOrderManage` | the management of automatic orders |
| `Subscription` | the subscription module |
| `PrimePackagesManage` | the display and management of booked Prime packages |
| `Offers` | customer-specific offers |
| `DirectOrder` | direct ordering from catalogs |
| `FastOrderConfiguration` | the configuration of quick order |
| `BonusPoints` | the display of bonus points |
| `GlossaryIndex`, `GlossaryDescr` | the index of all glossary terms and the description of a term |
| `InventoryRegister`, `InventoryRegisterConfirm` | storing the contact data for BackInStockMail and the confirmation |
| `Upload`, `UploadStart`, `UploadSendLink` | the upload module, its entry point and sending the upload link in the customer account |
| `Download`, `ExternalDownload` | the download module |
| `EBook` | the e-book output |
| `CustStatList`, `CustStatError` | the customer statistics and their error case |
| `AffilStat` | the affiliate program, display of products ordered via the partner link |

### Technical templates

| Parameter | Template for |
| - | - |
| `FastIncludes` to `FastIncludes4` | content embedded via the FastInclude technology |
| `FastIncludes_<ID>` | the same with a freely assigned ID, up to 15 files |
| `BasketAjaxSuccess`, `BasketAjaxError` | success and error when adding products via AJAX |
| `BasketPDF`, `ConfirmPDF`, `ProductPDF`, `InstantVoucherPDF` | the PDF output of basket, confirmation page, product detail view and purchase voucher |
| `CustomizedBasketPositionOrderData01` to `05` | up to five templates that generate additional data for the order data |
| `SpecialHandlingNoRedirectInfoFound` | the fallback page when no redirect to a replacement product or replacement category is possible |
| `SessionLockedForOnlineclearing` | the note that the session is locked during an online payment process |
| `PaymentPending`, `PayPalCheckoutPending` | the waiting states for online payments |
| `PayPalPlusDoCheckout` | the PayPal PLUS payment method |
| `Paymetric3DSecure`, `PaymetricHosted` | the Paymetric integration |
| `PPCVaultManage` | the management of stored PayPal Checkout payment instruments |
| `RPDE_Labelprint`, `RPDE_LabelprintNew` | the Labelprint24 integration |
| `ChangeExternalProduct` | changing an externally managed product |

> [!WARNING]
>
> If `SpecialHandlingNoRedirectInfoFound` is missing or the file does not exist, the shop system redirects to the start page in these cases. This is not an error, but the visitor then lands on the start page without explanation instead of on a page that tells them what happened to the product.

> [!WARNING]
>
> For `FastIncludes_<ID>`, 15 entries is the hard limit. Further lines are silently skipped, and an ID that has already been assigned is also skipped rather than overwritten. So the first entry wins, not the last.

> [!NOTE]
>
> The shop system evaluates the following parameters, but they are missing from the previous documentation: `Wishlist`, `WishlistAdmin`, `AutoOrderManage`, `TFAVerify`, `TFAManage`, `PasskeyVerify`, `PasskeyManage`, `PaymentPending`, `PayPalCheckoutPending`, `PaymetricHosted`, `PPCVaultManage`, `RPDE_LabelprintNew`, `EBook`, `UploadStart`, `UserSearch`, `ExternalDownload` and `ChangeExternalProduct`.

Guide: Reuse: includes

## DesignControl

Stores the IDs and secrets with which the DesignControl tags sign and encrypt data. For security reasons, passwords do not belong in the template but here. Only the ID is specified in the template.

The idea behind this is simple: data sent to a third-party system over an unsecured route should not be modifiable along the way. The sender hashes it with a shared secret, the recipient checks the hash.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DesignControl>
   <+Hash>
      ID     = datenuebertragungax24
      Secret = Jp4xullRcy6DXTPSTKBGXAvGGTaT04ii
   </+Hash>
   <+Encrypt>
      ID = datenuebertragungbc13
      PW = cuW%uH-zy6xzir-763$YMjo
   </+Encrypt>
</DesignControl>
```

| Subsection | Parameter | Purpose |
| - | - | - |
| `+Hash` | `ID` | Freely assigned ID, preferably alphanumeric. Must be unique within the section |
| `+Hash` | `Secret` | Secret string for generating the hash. May be left empty |
| `+Encrypt` | `ID` | Freely assigned ID, unique within the section |
| `+Encrypt` | `PW` | Password for encryption. At least eight characters, uppercase and lowercase letters, digits and special characters |

> [!WARNING]
>
> An `+Encrypt` entry without `PW` is skipped, whereas a `+Hash` entry without `Secret` is created. An entry without `ID` is skipped in both cases, in all cases without an error message. Therefore, after setting it up, check in the template whether the tag actually returns a value.

> [!NOTE]
>
> The number of entries is limited. Once the limit is reached, the shop system logs an error and does not read in any further entries.

Reference: DC-FPX\_hash(), DC-SPX\_hash(), DC-FPX\_encrypt(), DC-SPX\_encrypt()

## ContentControlLoadTemplates

Lists the templates for which the HTTP status code and the delivered content can be influenced via ContentControl.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<ContentControlLoadTemplates>
   +Entry = tpl_cms.htm
</ContentControlLoadTemplates>
```

| Parameter | Purpose | Values |
| - | - | - |
| `+Entry` | A template. One line per template. | File name, for example `tpl_cms.htm` |

Guide: Redirect concept for content from third-party systems

## ImageLinks

Replaces the button icons generated by the shop system with your own graphics. All files are located in benutzer/navigation/grafiken.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<ImageLinks>
   PageNumbersBack = page_numbers_back.gif
   PageNumbersNext = page_numbers_next.gif
</ImageLinks>
```

| Parameter | Purpose |
| - | - |
| `PageNumbersBack` | Button for paging back in category and product lists |
| `PageNumbersNext` | Button for paging forward |

Guide: Changing predefined graphics

## PDFGenerator

Defines the file names under which the generated PDF files reach the buyer.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<PDFGenerator>
   ProductPDFFilename        = produkt_~ProductNumber~.pdf
   BasketPDFFilename         = ihr-warenkorb.pdf
   ConfirmPDFFilename        = bestellung_~OrderNumber~.pdf
   InstantVoucherPDFFilename = gutschein.pdf
</PDFGenerator>
```

| Parameter | Purpose | Special feature |
| - | - | - |
| `ProductPDFFilename` | File name of the PDF output of the product detail view | The local tag `ProductNumber` is replaced by the product number. If it is missing, the product index takes its place |
| `BasketPDFFilename` | File name of the PDF output of the basket | |
| `ConfirmPDFFilename` | File name of the PDF output of the confirmation page | The local tag `OrderNumber` is replaced by the order number |
| `InstantVoucherPDFFilename` | File name of the PDF output of the purchase voucher | |

> [!WARNING]
>
> The PDF generator cannot process CMYK files. This mainly affects purchase vouchers, where print templates are used.

> [!NOTE]
>
> The two local tags `ProductNumber` and `OrderNumber` only apply within these parameters and have nothing to do with the shop's template tags.

Guide: PDF display of the product detail view, PDF display of the basket, PDF display of the confirmation page, Printable purchase vouchers

## ShopTimeouts

Fills the selection list through which the buyer determines the timeout of their session themselves. System-wide, the timeout is two hours by default.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<ShopTimeouts>
   10m = 10 Minuten
   20m = 20 Minuten
   30m = 30 Minuten
   1h  = 1 Stunde
   2h  = 2 Stunden
</ShopTimeouts>
```

To the left of the equals sign is the value, to the right the label in the selection list. The unit `m` stands for minutes, `h` for hours.

Guide: Setting the timeout for automatic logout

## CSRF-Protection

Controls how the shop reacts to a missing or differing antiforge token. The token prevents a third-party page from submitting forms on behalf of the logged-in buyer.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<CSRF-Protection>
   Behavior-AntiforgeTokenIsDiffering = CheckForValidReferer
   Behavior-AntiforgeTokenIsMissing   = CheckForValidReferer
   Reaction-AntiforgeCheckFailed      = DiscardAllInput
</CSRF-Protection>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Behavior-AntiforgeTokenIsDiffering` | Behavior when a token is present but does not match the stored one. | `CheckForValidReferer`, `Decline-NoFallback`. Default `CheckForValidReferer` |
| `Behavior-AntiforgeTokenIsMissing` | Behavior when the token is missing. | `CheckForValidReferer`, `Decline-NoFallback`. Default `CheckForValidReferer` |
| `Reaction-AntiforgeCheckFailed` | Reaction of the shop as soon as an error is detected. | `403-Forbidden`, `DiscardAllInput`. Default `DiscardAllInput` |

`CheckForValidReferer` checks as a second stage whether the transmitted referer and the shop address differ, and only then detects an error. `Decline-NoFallback` dispenses with this second check, so the error is established immediately.

`403-Forbidden` sends the corresponding HTTP status. `DiscardAllInput` does not send its own status, but ignores all inputs of the request and saves none of them.

> [!NOTE]
>
> The function can be switched off for a shop by WEBSALE technical staff. Contact your WEBSALE contact for this.

## TopRank

Holds the settings for the TopRank HTML pages, the XML sitemaps, the SEO URLs and the output of `WS-RobotCanonical`.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<TopRank>
   SEO-URLs-Allow                                = no
   SEO-URLs-InvalidURLWithoutRedirectInformation = 301
   TopRankDir                                    =
   SiteMapDir                                    =
   UseSeoNameForCategoryLink-Allow               = yes
   SuppressCatIndexInRobotCanonical              = no
   SuppressPageInRobotCanonical                  = no
   AddShopAndSubshopIDInRobotCanonical           = no
   SpecialHandlingNoRedirectInfoFound-Allow      = yes
   UseMinifiedCSSAndJS                           = yes
   ActivatePermanentDirectJSCSSTest              = no
</TopRank>
```

### SEO URLs and directories

| Parameter | Purpose | Values |
| - | - | - |
| `SEO-URLs-Allow` | Switches the SEO URLs on or into test mode. | `yes`, `no`, `test`. Default `no` |
| `SEO-URLs-InvalidURLWithoutRedirectInformation` | HTTP status code for invalid, unknown or old URLs for which no redirect information is available. | `301`, `401`, `404`. Default `301` |
| `TopRankDir` | Directory for the HTML TopRank pages, relative to the parent directory of the shop directory. Empty means .../artikel parallel to the shop directory. | Directory name, for example `english/artikel` |
| `SiteMapDir` | Directory for the XML sitemaps, relative to the shop's root directory. Empty means the root directory itself. | Directory name, for example `english` |
| `UseSeoNameForCategoryLink-Allow` | Uses the SEO category name for the readable part of category links. | `yes`, `no`. Default `yes` |

> [!WARNING]
>
> Search engines only accept links in a sitemap that point to the same or a lower-level directory. If the sitemap is too deep, the links in it are ignored. Therefore only set `SiteMapDir` if the root of the domain does not coincide with the directory in which the shop directory is located.

### Canonical tag

| Parameter | Purpose | Values |
| - | - | - |
| `SuppressCatIndexInRobotCanonical` | Omits the category index on the single product view from the canonical tag. | `yes`, `no`. Default `no` |
| `SuppressPageInRobotCanonical` | Omits the page number on the category view from the canonical tag. | `yes`, `no`. Default `no` |
| `AddShopAndSubshopIDInRobotCanonical` | Includes the shop and subshop ID in the canonical tag. | `yes`, `no`. Default `no` |

> [!NOTE]
>
> `SuppressCatIndexInRobotCanonical` also affects the sitemaps. With `yes`, only the canonical product URLs are included, which corresponds to Google's recommendation. With `no`, a separate URL is written for each category in which a product appears.

> [!NOTE]
>
> You only need `AddShopAndSubshopIDInRobotCanonical` if several subshops share a domain. Set it in the subshops that are not the main subshop of this domain. As a rule, each subshop gets its own domain, in which case the parameter remains `no`.

### Redirect and delivery

| Parameter | Purpose | Values |
| - | - | - |
| `SpecialHandlingNoRedirectInfoFound-Allow` | With `no`, a 404 page is delivered for products and categories that are no longer available, instead of redirecting to the fallback page or the start page. | `yes`, `no`. Default `yes` |
| `UseMinifiedCSSAndJS` | Uses the minified CSS and JavaScript files. | `yes`, `no`. Default `yes` |
| `ActivatePermanentDirectJSCSSTest` | Permanently embeds CSS and JavaScript via direct access, so that changes are visible immediately. | `yes`, `no`. Default `no` |

> [!WARNING]
>
> `ActivatePermanentDirectJSCSSTest = yes` bypasses grouping and therefore caching. This is helpful when building a shop, but costs loading time in live operation. Remove the parameter again before go-live.

### Subsection LinkOptimization

Removes superfluous parameters from the generated URLs. The subsection belongs to `TopRank` and does not stand on its own.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<TopRank>
   <LinkOptimization>
      Allow = yes
      <RemovableStartPageParameters>
         +Entry = ref
         +Entry = subref
      </RemovableStartPageParameters>
      <RemovableCategoryPageParameters>
         +Entry = ref
         +Entry = subref
      </RemovableCategoryPageParameters>
      <RemovableProductPageParameters>
         +Entry = ref
         +Entry = subref
      </RemovableProductPageParameters>
      <RemovableLoadTemplatePageParameters>
         +Entry = ref
         +Entry = subref
      </RemovableLoadTemplatePageParameters>
   </LinkOptimization>
</TopRank>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | Switches on the basic optimization of the URLs and the parameter removal. | `yes`, `no`, `test`. Default `no` |
| `RemovableStartPageParameters` | Parameters removed from the start page URL. One `+Entry` line per parameter. | Parameter names. Recommended `ref` and `subref` |
| `RemovableCategoryPageParameters` | the same for category URLs | Parameter names |
| `RemovableProductPageParameters` | the same for product URLs | Parameter names |
| `RemovableLoadTemplatePageParameters` | the same for URLs with a load parameter | Parameter names |

> [!NOTE]
>
> `Allow` is only relevant for switching from conventional URLs to SEO URLs. As soon as SEO URLs are active, the shop system sets the parameter to `yes` internally, because the function is strictly required there.

### Deprecated parameter

| Parameter | Note |
| - | - |
| `SiteMapDomain` | Is no longer supported. Remove the parameter from the configuration and instead make sure that `Domain-!` is set in the `Basic` section. |

Guide: SEO optimization with TopRank, Generating a canonical tag in the HTML head, SEO URLs, URL and link optimization, CSS, JavaScript and jQuery

## SEOProductFields

Enables the SEO fields for products and determines whether the SEO product name is used in links and in the canonical tag.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<SEOProductFields>
   Allow            = no
   Link-Allow       = no
   LegacyLink-Allow = yes
   Template         = incl_product_seo.htm
   <Password>
      +Entry =
   </Password>
</SEOProductFields>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | Allows maintaining the SEO fields and using them in the template. | `yes`, `no`. Default `no` |
| `Link-Allow` | Uses the SEO product name for link generation and for the canonical tag. | `yes`, `no`. Default `no` |
| `LegacyLink-Allow` | Also uses the SEO product name for V8 links. | `yes`, `no`, `test`. Default `yes` |
| `Template` | Template of the external module if the SEO content is maintained in the shop's SEO mode. | File name, for example `incl_product_seo.htm` |
| `Password` with `+Entry` | Up to 500 passwords for accessing the shop in SEO mode. One line per password. | any password |

> [!WARNING]
>
> `LegacyLink-Allow` only takes effect as long as `Link-Allow = yes` is set. If `Link-Allow` is `no`, `LegacyLink-Allow` has no effect, even if the default value `yes` suggests otherwise.

Guide: SEO content for products

## SEOProductFields-Text

Holds the error messages that appear when maintaining the SEO fields. Each message is output by its own tag.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<SEOProductFields-Text>
   ErrorConnectedSubshop    =
   ErrorFieldTooLong        =
   ErrorMainCatIndexTooLong =
   ErrorNameAlreadyExists   =
   ErrorNameTooLong         =
</SEOProductFields-Text>
```

| Parameter | Appears if | Output by |
| - | - | - |
| `ErrorConnectedSubshop` | the data can only be edited in the main subshop | `E-PSEO_Error` |
| `ErrorFieldTooLong` | the input in an SEO product field is longer than 4000 characters | `E-PSEO_Error_Field1…20` |
| `ErrorMainCatIndexTooLong` | the input in the main category index is longer than 255 characters | `E-PSEO_Error_MainCatIndex` |
| `ErrorNameAlreadyExists` | a product already has the same SEO product name | `E-PSEO_Error_Name` |
| `ErrorNameTooLong` | the SEO product name is longer than 127 characters | `E-PSEO_Error_Name` |

> [!NOTE]
>
> `ErrorNameAlreadyExists` and `ErrorNameTooLong` are both output via `E-PSEO_Error_Name`. Therefore word the two texts so that the editor can tell from the message itself which of the two cases applies.

Guide: SEO content for products

## LinkNameEncoding

Determines how the readable part of a URL is encoded.

By default, German umlauts are converted into readable replacement characters and not into UTF-8 replacement characters. This means there are no special requirements for merchandise management systems and payment service providers. The default rules are already stored, so you only edit the section if further shop languages or requirements of external systems are added.

Guide: Encoding the readable part of the URL

## RefererDerivation

Derives a WEBSALE referer and optionally a subreferer from the HTTP referer or from the path of the requested URL. This lets you group incoming visits by origin without every link having to carry its own parameter.

The structure has two levels: a `+RefererRule` determines the referer and optionally refers via an ID to a `+SubRefererRuleSet`, which determines the subreferer.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<RefererDerivation>
   <+RefererRule>
      Source               = HTTPReferer
      Type                 = Contains
      Value                = bing
      SetReferer           = Microsoft Bing
      UseSubRefererRuleSet = def
   </+RefererRule>

   <+SubRefererRuleSet>
      ID                = def
      DefaultSubReferer = BRAND-DEFAULT
      <+SubRefererRule>
         Source        = Path
         Type          = Contains
         Value         = /mein-shop
         SetSubReferer = BRAND Mein Shop
      </+SubRefererRule>
   </+SubRefererRuleSet>
</RefererDerivation>
```

Each subsection may occur any number of times.

### Subsection +RefererRule

| Parameter | Purpose | Values |
| - | - | - |
| `Source` | What the rule refers to. | `HTTPReferer`, `Path` |
| `Type` | Whether the string from `Value` must be contained or must match exactly. | `Contains`, `ExactMatch` |
| `Value` | The string to check. | for example `bing` |
| `SetReferer` | The WEBSALE referer that is passed on if the check is successful. | for example `Microsoft Bing` |
| `UseSubRefererRuleSet` | ID of the rule set that applies to the subreferer if the check is successful. | Alphanumeric ID |

### Subsection +SubRefererRuleSet

| Parameter | Purpose | Values |
| - | - | - |
| `ID` | ID via which `UseSubRefererRuleSet` refers to this rule set. | Alphanumeric ID |
| `DefaultSubReferer` | Subreferer that applies if none of the contained rules matches. | any string |

### Subsection +SubRefererRule

| Parameter | Purpose | Values |
| - | - | - |
| `Source` | What the rule refers to. | `HTTPReferer`, `Path` |
| `Type` | Whether the string from `Value` must be contained or must match exactly. | `Contains`, `ExactMatch` |
| `Value` | The string to check. | for example `/mein-shop` |
| `SetSubReferer` | The subreferer that is passed on if the check is successful. | any string |

Guide: Rules for the automatic derivation of referers

## MediaDataBase

Configures the availability display for products from the media database, that is, for books, CDs and videos ordered via Koch, Neff und Volckmar GmbH.

For a product, the shop system first looks for the `+InventoryCode` subsection with a matching code and matching source. If it does not find one because no delivery status code is stored for the product, the first `+InventoryDefault` subsection with a matching source applies.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<MediaDataBase>
   <+InventoryDefault>
      Source = KNV
      Status = green
      Text   = lieferbar innerhalb 1-2 Tagen
   </+InventoryDefault>

   <+InventoryCode>
      Code   = 07
      Source = KNV
      Status = red
      Text   = vergriffen, keine Neuauflage
   </+InventoryCode>

   <+InventoryCode>
      Code   = 11
      Source = KNV
      Status = yellow
      Text   = Neuauflage, lieferbar ab ~PR-AvailInfoTime~
   </+InventoryCode>
</MediaDataBase>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Code` | Delivery status code stored for the product. Only in `+InventoryCode`. | The available codes are configured jointly for all shops; you can get a current list on request |
| `Source` | Source from which the products were imported. | `KNV`, `VLB` |
| `Status` | Traffic light status for the display. | `green`, `yellow`, `red`, `red-orderable` |
| `Text` | Availability text for this status. | Text. The tag `PR-AvailInfoTime` inserts a time specification stored in the product data |

> [!NOTE]
>
> The examples in the previous documentation show the status `green` for codes 07 and 11, that is, green for "out of print" and green for "new edition". On this page, the examples have been changed to `red` and `yellow`, because otherwise status and text give contradictory signals.


## Related topics

- [title.dat configuration](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/konfiguration-title-dat.md)
- [Basics of texts and languages of a shop](https://dokumentation.websale.de/en/v8s/grundlagen-zu-texten-und-sprachen-eines-shops-textpflege.md)
- [Best Practice Shop](https://dokumentation.websale.de/en/frontend/die-basics/bestpractice-shop.md)
- [Basics of tags](https://dokumentation.websale.de/en/v8s/grundlagen-zu-tags.md)
- [Overview - The basics](https://dokumentation.websale.de/en/frontend/die-basics.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.