> ## 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.

# Shopping basket and order process

> How the shopping basket behaves, which discounts and surcharges apply, which additional services and input fields the buyer gets, and how terms and conditions consent, direct order, offers, and special product types are configured.

Between the click on "Add to basket" and submitting the order, two kinds of settings come into play. The first determine what the basket itself looks like and what it displays. The second determine what is ultimately charged, that is, discounts, surcharges, minimum order values, and paid additional services.

This page starts with the basket, then moves on to the order conditions and additional services, and ends with the special features of individual product types and order channels.

Reference: shop.config shop configuration, overview of all sections

## `BasketEntries`

Determines the properties of the basket and the texts that appear in the order data.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BasketEntries>
   Quantity-Txt       = Menge
   Sum-Txt            = Preis
   SubtotalSum-Txt    = Zwischensumme
   TotalDiscount-Txt  = Rabatt
   TotalSum-Txt       = Gesamtsumme
   MaxPositions-Value = 50
   ShowUserDiscount   = global
</BasketEntries>
```

### Texts in the order data

| Parameter | Labels |
| - | - |
| `Quantity-Txt` | the quantity |
| `Sum-Txt` | the price of a product |
| `SubtotalSum-Txt` | the subtotal excluding shipping costs and similar |
| `TotalDiscount-Txt` | the discount |
| `TotalSum-Txt` | the total |
| `GiftPackage-Txt` | the gift wrapping |
| `CommissionInfo-Txt` | the picking info when assembling partial quantities |
| `WishListOrderInfo-Txt` | a wish list product. Allows the tags `WISH-OwnerFirstName` and `WISH-OwnerLastName` |

### Limits and input filters

| Parameter | Purpose | Values |
| - | - | - |
| `MaxPositions-Value` | number of order items per order | Number. Default: unlimited |
| `IgnoreBonusProductForMaxBasketPositions-Allow` | ignore bonus products in this count | `yes`, `no`. Default: `no` |
| `CommissionInfo-MaxInputLen` | maximum number of characters for the picking info | up to 255. Default: 255 |
| `CommissionInfo-RemoveSigns` | characters removed from the picking info | Character string |
| `AdditionalInput-RemoveSigns` | characters removed from the free basket fields at item level | Character string |

`MaxPositions-Value` limits the number of items, not the quantity per item. Any number of units of a single item can still be ordered.

### Displaying discounts

| Parameter | Affects |
| - | - |
| `ShowUserDiscount` | the customer-specific discount |
| `ShowOrderDiscount` | the order value discount |
| `ShowPaymentDiscount` | the payment method discount |
| `ShowProductGroupDiscount` | the product group discount |

All four accept the same two values. `global` deducts the discount from the basket only at the end. `entry` shows every price and every item already reduced. The default is `global`.

### Numbering of order items

| Parameter | Purpose | Values |
| - | - | - |
| `OrderData-CustomizedPositionNumberMode` | whether and for which products additional numbering is applied | `none`, `allproducts`, `mainproducts`. Default: `none` |
| `OrderData-CustomizedPositionNumberFormat` | counting type and number of digits | comma-separated list. Default: `int,0` |

`allproducts` counts all visible products, `mainproducts` omits set subproducts. Products with the `HideForBasket` product data flag set are considered not visible and are never counted.

In the format, the counting type comes first and the number of fixed digits second.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
# dreistellig durchzählen: 001, 002, 003
OrderData-CustomizedPositionNumberFormat = int,3
# Bestellnummer voranstellen: 12345-001
OrderData-CustomizedPositionNumberFormat = ordernumber-int,3
```

This unique, ascending numbering makes it easier to refer to a single item when customers have questions.

### Further settings

| Parameter | Purpose | Values |
| - | - | - |
| `DecimalSymbol` | decimal separator for quantities, also in the order data | Character. Default: comma |
| `OrderData-SingleTotal2Precision` | decimal places for the `SingleTotal2` parameter in the order data | 2 to 9 |
| `PalettVolume` | capacity of a single pallet | Number, for example `1.19` |
| `JoinInsert` | form in which an advertising medium code appears | Text with the tags `PR-Number` and `PR-Insert` |
| `SplitDeliveryText-Allow` | show separate availability texts for delivery status red | `yes`, `no`. Default: `no` |

Since quantities are usually whole numbers, `DecimalSymbol` is rarely needed. It affects, for example, the `BASKET-PR-Quantity` tag.

> [!WARNING]
>
> Two parameters in this section are no longer supported and should no longer be used.
>
> `CombineBulkDiscount` combined tiered prices of a product across multiple variants. Use the product group discount instead.
>
> `DeliveryTextInOrder-Allow` controlled the display of the shipping cost text in the order data.

## `AdditionalProductFieldsInBasket`

Determines which free product data fields are available in the basket. This is the prerequisite for several other functions, including product-dependent payment methods, product-dependent shipping methods, and product-dependent vouchers.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AdditionalProductFieldsInBasket>
   +Field = material
   +Field = DeliveryTime
</AdditionalProductFieldsInBasket>
```

| Parameter | Purpose | Values |
| - | - | - |
| `+Field` | technical field name as it appears in the WSPManager or in the `prod.cfg` | Field name. Maximum of twenty parameters |
| `UseTemplateExtension` | evaluate a second value per field as a template name | `yes`, `no`. Default: `no` |

> [!NOTE]
>
> `UseTemplateExtension` is not described in the previous documentation and has been added here. If it is set to `yes`, the value of each `+Field` is split at the **first space**. The field name comes before it, and the name of a template after it.
>
> ```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
> <AdditionalProductFieldsInBasket>
>    UseTemplateExtension = yes
>    +Field               = material incl_material.htm
> </AdditionalProductFieldsInBasket>
> ```
>
> With `UseTemplateExtension = no`, the same entry would be read as the field name `material incl_material.htm` and would have no effect.

Once the maximum of twenty fields is reached, further entries are silently discarded. This also applies if the section appears multiple times in the configuration.

## `BasketProductOptions`

Defines free fields at split item level, that is, inputs the buyer can make per basket item or per delivery address of an item, including optional costs.

The section is deeply nested. A `+BasketProductOption` describes a field set. `Requirements` determines when this field set appears at all. `Inputs` contains the fields. `Costs` contains the costs that result from the inputs.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<BasketProductOptions>
   BasketProductOptionsVATType = dynamic
   <+BasketProductOption>
      BasketProductOptionID = gravur
      LevelOfUsage          = BasketPosition
      <Requirements>
         <+RequirementGroup>
            <+Requirement>
               Proof = ProductNumber
               Type  = prefix
               Value = GRAV-
            </+Requirement>
         </+RequirementGroup>
      </Requirements>
      <Inputs>
         <+Input>
            Type = Input
            ID   = gravurtext
            Name = Ihr Gravurtext
         </+Input>
      </Inputs>
      <Costs>
         <+Cost>
            ID    = gravurkosten
            Name  = Gravur
            Type  = multiplyWithQuantity
            Value = 4.95
            <+ConditionGroup>
               <+Condition>
                  Proof = BasketProductOptionInputID
                  Type  = filled
                  Value = gravurtext
               </+Condition>
            </+ConditionGroup>
         </+Cost>
      </Costs>
   </+BasketProductOption>
</BasketProductOptions>
```

### Basic setting

| Parameter | Purpose | Values |
| - | - | - |
| `BasketProductOptionsVATType` | how the VAT rate is determined | `dynamic`, `static`. Default: `dynamic` |
| `BasketProductOptionsVATIndex` | VAT index, only with `static` | 1 to 10. Default: 1 |

### `+BasketProductOption`

| Parameter | Purpose | Values |
| - | - | - |
| `BasketProductOptionID` | unique identifier | alphanumeric |
| `LevelOfUsage` | type of usage | `UseOnce`, `BasketPosition`, `BasketPositionAddress` |
| `Test` | enable test mode | `yes`, `no`. Default: `no` |

`UseOnce` requests the fields once per order. `BasketPosition` per basket item. `BasketPositionAddress` per delivery address of an item with split order.

### `Requirements`

Decides whether the field set appears. The `+RequirementGroup` sections are combined with **or**, the `+Requirement` sections within them with **and**.

| Parameter | Purpose | Values |
| - | - | - |
| `Proof` | what is checked | see below |
| `Type` | type of check | `filled`, `empty`, `value`, `notvalue`, `inlist`, `notinlist`, `prefix`, `notprefix`, `greaterthan`, `lessthan` |
| `Value` | value checked, only with `ProductNumber` and `AdditionalProductFieldsInBasket` | maximum 4096 characters |
| `Identifier` | technical field name, only with `AdditionalProductFieldsInBasket` | alphanumeric |

| `Proof` | What is checked |
| - | - |
| `ProductNumber` | the product number. Default |
| `AdditionalProductFieldsInBasket` | a free product field, named via `Identifier` |
| `AddressSplitUsed` | whether the item is split across multiple delivery addresses |
| `AddressSplitNotUsed` | whether it is not split |
| `BasketSubTotalSum` | the basket subtotal |
| `BasketPRSum` | the item total |

> [!WARNING]
>
> With `LevelOfUsage = UseOnce`, only `BasketSubTotalSum` is allowed as `Proof`. The other values refer to a single item and make no sense for a one-time field.

### `Inputs`

| Parameter | Purpose | Values |
| - | - | - |
| `ID` | unique identifier of the field | alphanumeric |
| `Name` | technical name of the field | alphanumeric |
| `Type` | type of field | `Input`, `Checkbox`. Default: `Input` |
| `+UseGenericInputCheck` | link to an input check | ID from `GenericInputChecks` |

Reference: GenericInputChecks section

### `Costs`

| Parameter | Purpose | Values |
| - | - | - |
| `ID` | unique identifier | alphanumeric |
| `Name` | technical name | alphanumeric |
| `Type` | type of cost calculation | `singleFixCost`, `percentualSum`, `multiplyWithQuantity`. Default: `singleFixCost` |
| `Value` | value used for the calculation | for example `4.95` |

`singleFixCost` charges the value once per item. `percentualSum` calculates it as a percentage of the merchandise value of the item or the basket. `multiplyWithQuantity` multiplies it by the item quantity.

The `+ConditionGroup` sections are combined with **or**, the `+Condition` sections within them with **and**.

| Parameter | Purpose | Values |
| - | - | - |
| `Proof` | what is checked | `ProductNumber`, `AdditionalProductFieldsInBasket`, `BasketProductOptionInputID`, `AddressSplitUsed`, `Quantity`, `Weight` |
| `Type` | type of check | see below |
| `Value` | value checked. With `BasketProductOptionInputID`, the ID of the input field | alphanumeric |
| `SetBehavior` | handling of set products | `asUnit`, `Single`. Default: `Single` |
| `BasketBehavior` | how many products must meet the condition | `match-all`, `match-once`. Default: `match-all` |

Allowed values for `Type`: `filled`, `empty`, `value`, `notvalue`, `inlist`, `notinlist`, `prefix`, `notprefix`, `greaterthan`, `lessthan`, `inbetween`, `includedinlist`, `notincludedinlist`, `matchsimplewildcard`, and `notmatchsimplewildcard`. With `inbetween`, the format of `Value` is `start-end`.

> [!NOTE]
>
> The source documentation listed the value `matche-once` for `BasketBehavior`. The correct value is `match-once`. The same typo also appears in the section on payment methods.

> [!WARNING]
>
> The costs are charged as soon as the conditions are met, even if the buyer leaves the input field empty or does not tick the checkbox.
>
> The exception is a condition that checks the input field itself, that is, `Proof = BasketProductOptionInputID` together with `Type = filled`. In that case, no costs arise if the field is empty.

## `OrderConditions`

The central section for discounts, minimum order value, and small-quantity surcharge.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<OrderConditions>
   MinimumOrder-Value   = 10.00
   SurchargeLimit-Value = 25.00
   Surcharge-Value      = 4.90
   Surcharge-Txt        = Mindermengenzuschlag
   Discount-List        = (100:3)(500:5)(1000:7)
   Discount-Txt         = abzüglich gewährter Rabatte
</OrderConditions>
```

### Minimum order value and small-quantity surcharge

| Parameter | Purpose | Values |
| - | - | - |
| `MinimumOrder-Value` | minimum order value from which ordering is possible | Number with a period as decimal separator |
| `SurchargeLimit-Value` | limit up to which a small-quantity surcharge is charged | Number |
| `Surcharge-Value` | amount of the small-quantity surcharge | Number |
| `Surcharge-Txt` | text for the surcharge shown in the basket | Text |
| `SurchargeCalculation-Mode` | basis for calculating the surcharge | `subtotal`, `totalsumofproducts`. Default: `subtotal` |
| `MinimumOrder-ConsiderVoucherDiscount-Allow` | include percentage voucher discount in the check | `yes`, `no`. Default: `yes` |
| `MinimumOrder-PrimeShoppingHasAbsolutePriority` | lift all minimum order values for Prime customers | `yes`, `no`. Default: `no` |
| `NegativeTotalSum-Allow` | allow orders with a negative total | `yes`, `no`. Default: `yes` |

`SurchargeCalculation-Mode = subtotal` uses the entire merchandise value. `totalsumofproducts` uses only the products that have not been excluded via the `IgnoreForSurcharge` product data field.

An example for `MinimumOrder-ConsiderVoucherDiscount-Allow`: the minimum order value is 10 euros, the basket contains a product for 12 euros, plus a 20 percent voucher.

| Setting | Merchandise value checked | Result |
| - | - | - |
| `yes` | 9.60 | Order not possible |
| `no` | 12.00 | Order possible |

`MinimumOrder-PrimeShoppingHasAbsolutePriority = yes` also lifts the minimum order values of vouchers and bonus points for Prime customers with the "no minimum order value" option.

### Order value discount

| Parameter | Purpose | Values |
| - | - | - |
| `Discount-List` | tiered discount based on total merchandise value | Tiers, see below |
| `Discount-Txt` | text in the order data when a discount was granted | Text |
| `Discount-AllowForCustomers` | whether the discount applies only to logged-in customers | `loggedIn`, `all`. Default: `all` |
| `AppDiscount-List` | tiered discount that applies only to orders placed in the app | Tiers, maximum 10 entries |
| `AppDiscount-AllowForCustomers` | the same for the app discount | `loggedIn`, `all`. Default: `all` |

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
# ab 100 EUR: 3 Prozent, ab 500 EUR: 5 Prozent, ab 1000 EUR: 7 Prozent
Discount-List = (100:3)(500:5)(1000:7)
```

If `AppDiscount-List` is filled, these tiers replace the tiers from `Discount-List` for app orders.

### How discounts interact

These parameters decide on which basis each discount is calculated. They affect the total amount of all deductions, so it is worth setting them deliberately.

| Parameter | Purpose | Values |
| - | - | - |
| `ConsiderProductDiscountFactorForOrderDiscount-Allow` | include non-discountable products in the discount threshold | `yes`, `no`. Default: `yes` |
| `ConsiderProductGroupDiscountForOrderDiscount-Allow` | take the product group discount into account in the basis for the order value discount | `yes`, `no`. Default: `no` |
| `ConsiderProductGroupDiscountForOtherDiscounts-Allow` | deduct the product group discount immediately from the product price instead of from the total at the end | `yes`, `no`. Default: `yes` |
| `ConsiderNetProductPriceForDiscountBaseWhenTaxFreeApplies` | calculate percentage discounts at item level from the net amount | `yes`, `no`. Default: `no` |
| `UseOnlyHighestDiscount-Allow` | grant only the highest discount when several are available | `yes`, `no`. Default: `no` |

`ConsiderNetProductPriceForDiscountBaseWhenTaxFreeApplies` only applies under three conditions. The shop must work with gross prices, tax calculation must run in the standard procedure, and VAT must be deducted for the buyer. This is typically the case for orders from non-EU countries.

`UseOnlyHighestDiscount-Allow` compares the customer-specific discount, global discount, merchandise value discount, and product group discount, and grants only the highest of them.

### Undocumented parameters for discount behavior

The kernel reads seven additional parameters in this section that are not described in the previous documentation.

| Parameter | Purpose | Values |
| - | - | - |
| `Discount-Value` | global customer discount in percent | Number |
| `SetChilds-DiscountRateDetermination` | how the global customer discount handles set products | `UseSetChildData`, `UseSetParentData`, `UseSetParentDataExceptForDiscountFactor`. Default: `UseSetChildData` |
| `ConsiderAllGroupDiscountIDsForGroupDiscountBase` | use all items with any DiscountID as the basis instead of only those with the same one | `yes`, `no`. Default: `no` |
| `ConsiderNegativeBonusProductPriceForOrderDiscountBase` | include negative bonus product prices in the basis for the order value discount | `yes`, `no`. Default: `yes` |
| `MixedGroupDiscountAndBulkDiscount-Behavior` | behavior when group discount and tiered discount coincide | `grantBoth`, `grantOnlyBulkDiscount`. Default: `grantBoth` |
| `UseOnlyHighestDiscount-ConsiderVoucher` | include vouchers in the highest-discount comparison | `yes`, `no`. Default: `no` |
| `CommunityDiscount-List` | separate discount tiers for community members | Tiers like `Discount-List` |

> [!WARNING]
>
> These parameters affect price calculation. Only set them after consulting WEBSALE AG. Their release status has yet to be clarified.
>
> `CommunityDiscount-List` only takes effect with an active community integration. If the buyer is logged in as a community member, these tiers are used, and `Discount-List` serves only as a fallback if they are empty.

### Order numbers and follow-up orders

| Parameter | Purpose | Values |
| - | - | - |
| `ConvertOrderNumber-Allow` | convert the shop's own order number into a random sequence | `yes`, `no`. Default: `no` |
| `ConvertOrderNumber-Type` | type of conversion | `alpha`, `DoubleNumbers`. Default: `alpha` |
| `SubSequentOrder-TimeLimitInHours` | period within which a new order counts as a follow-up order | Integer |
| `SubSequentOrder-ConsiderOrdersFromOtherSubShops-List` | from which subshops orders count for this | Subshop IDs, empty or `*` |

If the subshop list is left empty, only orders from the subshop in which the buyer is currently shopping count. An asterisk counts orders from all subshops.

### Further settings

| Parameter | Purpose | Values |
| - | - | - |
| `AddProdToBasketOnlyInLoggedInState-Allow` | only logged-in buyers may add products to the basket | `yes`, `no`. Default: `no` |
| `NewCustomerDefinition-Payments` | who counts as a new customer for payment methods | `NoCustomerNumber`, `NoERPLastOrderDate`. Default: `NoCustomerNumber` |
| `TaxFreeForAll-Allow` | for tax-exempt buyers, also calculate shipping and delivery costs without tax | `yes`, `no`. Default: `no` |
| `TotalSumSwissRounding-Allow` | apply Swiss rounding logic to the final total | `yes`, `no`. Default: `no` |
| `RoundedSubTotals-Allow` | use rounded subtotals for totals and prices | `yes`, `no`. Default: `no` |
| `RoundedSubTotalsPrecision` | number of digits subtotals are rounded to | Number. Default: 2 |
| `ReferenceText-Txt`, `ReferenceText2-Txt` | names of the fields for optional reference texts for the order | Text |
| `ReferenceText-RemoveSigns`, `ReferenceText2-RemoveSigns` | characters removed from the reference texts | Character string |
| `ProdTextInput-RemoveSigns` | characters removed from every input field on a product | Character string |

`AddProdToBasketOnlyInLoggedInState-Allow` is mainly intended for semi-closed B2B shops.

The Swiss rounding logic multiplies the final total by 20, rounds half up to zero decimal places, and divides by 20 again. It affects only the final total. Prices, subtotals, discounts, and tax amounts remain unaffected.

> [!NOTE]
>
> For all `RemoveSigns` parameters, the specified characters are removed without the buyer seeing a notice or error message.

## `OrderOptions1` to `OrderOptions5`

Defines paid additional services that are offered on the payment and shipping method page. Up to five sections are possible, each with up to 50 `+Entry` subsections.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<OrderOptions1>
   Allow                         = yes
   Required                      = no
   VATType                       = static
   VATRate-Value                 = 1
   SubTotalDependentCost-Base    = Standard
   WriteCostFreeSelectionsInOrder = no
   <+Entry>
      Name-Txt       = keine Transportversicherung
      Cost-Value     = 0
      CostType-Value = 1
   </+Entry>
   <+Entry>
      Name-Txt       = Transportversicherung ohne Selbstbeteiligung
      Cost-Value     = 1.5
      CostType-Value = 2
   </+Entry>
</OrderOptions1>
```

### Main section

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | enable the additional service | `yes`, `no` |
| `Required` | the buyer must make a selection | `yes`, `no` |
| `DeliveryCountry-List` | delivery countries for which the option applies | 3-letter ISO codes, comma-separated |
| `VATType` | how the VAT rate is determined | `dynamic`, `static`. Default: `static` |
| `VATRate-Value` | VAT index, only with `static` | 1 to 10. Default: 1 |
| `SubTotalDependentCost-Base` | exclude WEEE costs from the basis of percentage costs | `Standard`, `ExcludeDEEECosts`. Default: `Standard` |
| `WriteCostFreeSelectionsInOrder` | show free additional services in the order data | `yes`, `no`. Default: `no` |

If `DeliveryCountry-List` is set, the option is not offered for any other country.

> [!NOTE]
>
> `WriteCostFreeSelectionsInOrder` was missing from the sample code in the source documentation, even though the parameter is listed in the table. It has been added here.

### `+Entry`

| Parameter | Purpose | Values |
| - | - | - |
| `Name-Txt` | name of the additional service, appears in the selection and in the order | Text |
| `Cost-Value` | costs, fixed or percentage depending on `CostType-Value` | Number |
| `CostType-Value` | type of costs | `1` for fixed, `2` for percentage of merchandise value |

A free entry only appears in the order if `WriteCostFreeSelectionsInOrder` is set to `yes`.

> [!WARNING]
>
> The `Display-Txt` parameter is no longer needed. Costs are now displayed directly on the basket page via the `BASKET-OrderOptionCost` tag.

## `OrderSpecialInput`

Controls the optional additional information for an order.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<OrderSpecialInput>
   RemoveSigns = "*|~%${};<>§·@
</OrderSpecialInput>
```

| Parameter | Purpose | Values |
| - | - | - |
| `RemoveSigns` | characters removed from the entered additional information | Character string |

> [!WARNING]
>
> The `Txt` parameter is deprecated and no longer has any effect.

The removed characters disappear without a notice or error message to the buyer.

## `AcceptTermsAndConditions`

Determines where the terms and conditions are displayed, whether the buyer must explicitly accept them, and whether the checkbox is preselected. In addition, you can configure a second checkbox here for sharing the email address with the shipping provider.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AcceptTermsAndConditions>
   Allow                                          = yes
   UserMustAcceptTermsAndConditions               = yes
   CheckboxPlacedOnTemplate                       = PlaceOrder
   CheckboxDefault                                = unchecked
   eMailSharingWithShippingProvider-CheckboxAllow = no
   RequiredForNewSubscriptions                    = no
</AcceptTermsAndConditions>
```

### Terms and conditions consent

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | enable the function | `yes`, `no`. Default: `no` |
| `UserMustAcceptTermsAndConditions` | explicit consent is required to order | `yes`, `no`. Default: `yes` |
| `CheckboxPlacedOnTemplate` | on which page the terms and conditions and checkbox appear | `CombinedAddress`, `PayDeliv`, `PlaceOrder`. Default: `PlaceOrder` |
| `CheckboxDefault` | preselection of the checkbox | `checked`, `unchecked`. Default: `unchecked` |
| `RequiredForNewSubscriptions` | also require consent when taking out a subscription | `yes`, `no`. Default: `no` |

`CombinedAddress` is the page for selecting the billing and delivery address, `PayDeliv` the page for selecting payment and shipping methods, and `PlaceOrder` the order summary page.

> [!WARNING]
>
> The checkbox must **not** be implemented with the `WS-CheckConditions` tag. That is a superseded tag from an earlier integration method. Use `WS-AcceptTermsAndConditions_input` and `WS-AcceptTermsAndConditions_checked` instead.

### Checkbox for data sharing

| Parameter | Purpose | Values |
| - | - | - |
| `eMailSharingWithShippingProvider-CheckboxAllow` | enable the additional checkbox | `yes`, `no`, `test`. Default: `no` |
| `eMailSharingWithShippingProvider-CheckboxDefault` | preselection of this checkbox | `checked`, `unchecked`. Default: `unchecked` |
| `eMailSharingWithShippingProvider-UseSeparateInput` | separate input field instead of the email from the billing address | `yes`, `no`. Default: `no` |

The preselection `unchecked` is the privacy-compliant setting.

## `DirectOrder`

Defines the options for direct ordering, that is, ordering via an input table with product numbers.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DirectOrder>
   DefaultInputLines-Value = 10
   ExtendInputLines-Value  = 5
   NumberSearchFields      = Number,AltNumber1
   Notify1-Txt             = Bitte geben Sie eine Menge an.
   Notify2-Txt             = Bitte geben Sie eine Produktnummer an.
   Notify3-Txt             = Die Produktnummer ~PR-Number~ wurde nicht gefunden.
</DirectOrder>
```

| Parameter | Purpose | Values |
| - | - | - |
| `DefaultInputLines-Value` | number of input rows when the page is opened | Integer |
| `ExtendInputLines-Value` | number of rows added by a click on "Extend table" | Integer |
| `NumberSearchFields` | which product fields are searched | `Number`, `AltNumber1` to `AltNumber5`, comma-separated. Default: `Number` |
| `ShowBaseProductsAtDirectOrderInput-Allow` | for a variant number, show the base product instead of the variant | `yes`, `no`. Default: `no` |

> [!WARNING]
>
> `DefaultInputLines-Value` and `ExtendInputLines-Value` together must not exceed 100 rows.

With `ShowBaseProductsAtDirectOrderInput-Allow = no`, the buyer directly sees the entered variant combination. With `yes`, they see the base product and select the combination themselves via the selection list.

### Notice texts

| Parameter | Message |
| - | - |
| `Notify1-Txt` | No quantity was entered |
| `Notify2-Txt` | No product number was entered |
| `Notify3-Txt` | The product number was not found. Allows the `PR-Number` tag |
| `Notify4-Txt` | Several versions are possible |
| `Notify5-Txt` | The product has a minimum order quantity. Allows `PR-MinQuantity` and `PR-Unit` |
| `Notify6-Txt` | The product has a maximum order quantity. Allows `PR-MaxQuantity` and `PR-Unit` |
| `Notify7-Txt` | The product is sold out |
| `Notify8-Txt` | The alternative product number was not found |

## `Offers`

Holds the texts for customer-specific offers.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Offers>
   OfferID-Txt = Angebotsnummer
   Offer-Txt   = Angebot
   From-Txt    = vom
</Offers>
```

| Parameter | Labels |
| - | - |
| `OfferID-Txt` | the unique identifier of the offer |
| `Offer-Txt` | the offer description or title |
| `From-Txt` | the date of the offer |

> [!WARNING]
>
> If an order is placed via a customer-specific offer, all shipping methods except the first are deactivated, and the first is overwritten with the name and costs from the offer. The same applies to the payment costs.

## `W2P`

Holds the messages and texts for the web-to-print module.

| Parameter | Purpose |
| - | - |
| `NotificationAddress` | email address for error notifications |
| `SaveW2PToCookieBasket-Allow` | whether designs are saved in the cookie basket. `yes`, `no`. Default: `no` |
| `W2PCost-Txt` | description of the total costs in the order data |
| `W2PVAT-Txt` | description of the VAT on the total costs |
| `W2PItemCost-Txt` | description of the costs for a single product |
| `W2PItemVAT-Txt` | description of the VAT for a single product |
| `W2PCreated-Txt` | message when a design is created successfully |
| `W2PChanged-Txt` | message when a design is changed successfully |
| `W2PCanceled-Txt` | message when canceled at the customer's request |
| `W2PDeleted-Txt` | message when a design is deleted |
| `W2PError-Txt` | message when an error occurs |

With `SaveW2PToCookieBasket-Allow = yes`, `TicketID`, `DocID`, `ThumbnailURL`, and `OverwriteReturnURLs` are included in the cookie basket and set again when it is read in.

## `AreaProduct`


Defines the settings for area products, that is, products whose price is derived from length and width.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AreaProduct>
   InputPrecision                 = 1
   CalculatedAreaDisplayPrecision = 2
   CalculatedAreaConversionFactor = 10000
   DisplayNameLength              = Länge
   DisplayNameWidth               = Breite
   DisplayNameCalculatedArea      = Fläche
   DisplayLengthWidthUnit         = cm
   DisplayCalculatedAreaUnit      = qm
</AreaProduct>
```

### Calculation

| Parameter | Purpose | Values |
| - | - | - |
| `InputPrecision` | decimal places for entering length and width | Number |
| `CalculatedAreaDisplayPrecision` | decimal places for displaying the calculated area | Number |
| `CalculatedAreaConversionFactor` | conversion factor of the area formula | Number. Default: 1 |
| `UseDynamicWeightBasedOnCalculatedArea` | calculate the product weight from the entered area | `yes`, `no`. Default: `no` |

The area is length times width divided by the conversion factor. If buyers enter the dimensions in centimeters and the area price is stored in square meters, the factor is 10000.

With `UseDynamicWeightBasedOnCalculatedArea = yes`, the total weight is the `Weight` product data field multiplied by the entered area. With `no`, the weight from the product data applies unchanged.

### Display

| Parameter | Labels |
| - | - |
| `DisplayNameLength` | the length or height |
| `DisplayNameWidth` | the width or thickness |
| `DisplayNameCalculatedArea` | the calculated area |
| `DisplayLengthWidthUnit` | the unit of length and width, for example `cm` |
| `DisplayCalculatedAreaUnit` | the unit of the calculated area, for example `qm` |
| `MessageAreaOutOfRange` | the message for invalid inputs or inputs outside the limits |

The two units are display values only and are not included in the calculation. Only `CalculatedAreaConversionFactor` is responsible for that.

## `AgeRestrictedProductList`

Holds the texts for selecting age levels when filtering age-restricted products.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AgeRestrictedProductList>
   Default-Txt = beliebig
   Age3-Txt    = ab 3 Jahre
   Age6-Txt    = ab 6 Jahre
   Age12-Txt   = ab 12 Jahre
   Age16-Txt   = ab 16 Jahre
   Age18-Txt   = ab 18 Jahre
</AgeRestrictedProductList>
```

| Parameter | Purpose |
| - | - |
| `Default-Txt` | text for the entry without age restriction |
| `Age1-Txt` to `Age99-Txt` | text for the respective age level |

The number in the parameter name is also the age level. For an entry "ab 15 Jahre" (ages 15 and up), you write `Age15-Txt = ab 15 Jahre`.

You control which shipping method is offered for age-restricted products via the `EigenhaendigPlus` section.

Reference: EigenhaendigPlus section

## `Subscription`

Configures the subscription module, that is, delivery intervals, retry attempts, and the four notification emails. The section is fully described on the guide page for the subscription module and is therefore only linked here.

Guide: Subscription module


## Related topics

- [Use cases](https://dokumentation.websale.de/en/v8s/anwendungsbeispiele/anwendungsbeispiele.md)
- [Buttons in the order process](https://dokumentation.websale.de/en/v8s/referenz/tags/bt/bestellprozess.md)
- [basket - Basket](https://dokumentation.websale.de/en/konfiguration/basket-warenkorb.md)
- [Storefront API Shopping Cart](https://dokumentation.websale.de/en/schnittstellen/storefront-api/storefront-api-warenkorb.md)
- [Order process, addresses and checks](https://dokumentation.websale.de/en/v8s/referenz/tags/ws/bestellprozess-adressen-und-pruefungen.md)


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