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

# Shipping and delivery

> How shipping methods are created, when they appear in the checkout process, how shipping costs are calculated, which additional inputs and dependencies are possible, and how preferred delivery date, partial delivery, gift wrapping, and shipment tracking are configured.

A shipping method in the shop is made up of two building blocks. The `Delivery` section defines the rules that apply to all shipping methods. Each `+Deliverer` section then describes a single shipping method with its costs and conditions.

Because a single shipping method can have a great many conditions, the configuration moves the more complex ones into separate definitions sections. There you create a rule once with an ID and reference it from any number of `+Deliverer` sections. This page follows exactly this order. First the basic settings, then the individual shipping method, then the four definitions sections, and finally the additional features for delivery date, partial delivery, gift wrapping, age restriction, and shipment tracking.

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

## `Delivery`

Basic settings for all shipping methods.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Delivery>
   Cost-Txt                                  = Versandkosten
   DeliveryCostCalculation-Mode              = CalculateOnce
   SubTotalDependentDeliveryCosts-Base       = Standard
   AddressCountryDiffersDeliveryCountry-Allow = yes
   BookDeliveryType                          = all
</Delivery>
```

### Delivery and billing country

| Parameter | Purpose | Values |
| - | - | - |
| `AddressCountryDiffersDeliveryCountry-Allow` | whether the delivery country may differ from the billing country | `yes`, `no`. Default: `yes` |
| `AddressCountryDiffersDeliveryCountryExcept4VAT-Allow` | exception for orders subject to VAT | `yes`, `no`. Default: `yes` |
| `FreeDeliveryCountryList` | delivery countries for which no shipping costs are charged | comma-separated ISO codes |

`AddressCountryDiffersDeliveryCountryExcept4VAT-Allow = yes` means: if VAT is paid, the delivery country can be any country from the delivery country configuration. If no VAT is paid, the delivery country must be the same as the billing country. With `no`, the billing country must always also be the delivery country.

> [!NOTE]
>
> VAT is determined based on the billing address, not the delivery address.

### Shipping cost calculation

| Parameter | Purpose | Values |
| - | - | - |
| `Cost-Txt` | text for the shipping costs | text |
| `DeliveryCostCalculation-Mode` | type of shipping cost calculation | see below |
| `SubTotalDependentDeliveryCosts-Base` | basis of assessment for shipping costs that depend on merchandise value | `Standard`, `OrderDiscount`, `WithoutVoucher`. Default: `Standard` |

`DeliveryCostCalculation-Mode` has three values. `CalculateOnce` calculates the shipping costs once for the entire order and is the default. `CalculateSeparateForEachPosition` calculates them per basket item. `CalculateSeparateForEachPositionAndUsedDeliveryAddress` calculates them per delivery address and only applies to delivery to multiple addresses.

`SubTotalDependentDeliveryCosts-Base` determines which amount triggers the shipping cost scale. This is particularly relevant when vouchers are involved.

| Value | Basis of assessment |
| - | - |
| `Standard` | the subtotal, that is, the merchandise value after all deductions |
| `OrderDiscount` | the same basis as for the order value discount, that is, the merchandise value of all discountable products without further deductions |
| `WithoutVoucher` | the merchandise value without taking vouchers into account |

An example makes the difference clear. Shipping is free from 10 euros. The basket contains a product for 11 euros plus a 10 percent voucher.

| Setting | Basis of assessment | Result |
| - | - | - |
| `Standard` | 9.90 | shipping costs apply |
| `WithoutVoucher` | 11.00 | free shipping |

The subtotal is 9.90 in both cases. Only the basis of assessment for the scale changes.

> [!NOTE]
>
> With `OrderDiscount`, the switches `ConsiderProductGroupDiscountForOrderDiscount-Allow` and `ConsiderProductDiscountFactorForOrderDiscount-Allow` from the `OrderConditions` section also take effect.

Reference: OrderConditions section

### Book shipment

| Parameter | Purpose | Values |
| - | - | - |
| `BookDeliveryType` | when an order counts as a book shipment | `all`, `one`. Default: `all` |
| `BookDeliveryMaxWeight` | maximum weight for book shipments | number without unit |
| `BookDeliveryMaxOrder` | maximum order value for book shipments | number |

If either of the two maximums is exceeded, all shipping methods with `BookDelivery-Allow = yes` are no longer available for this order. Both parameters only take effect if they are specified and greater than 0. The unit of weight comes from the product data.

Which shipping method is ultimately available depends on the interplay between the basket contents, `BookDeliveryType` here, and `BookDelivery-Allow` in the respective `+Deliverer` section.

| Basket | `BookDelivery-Allow` | `BookDeliveryType` | available |
| - | - | - | - |
| books only | `yes` | `all` | yes |
| books only | `yes` | `one` | yes |
| books only | `no` | `all` | no |
| books only | `no` | `one` | no |
| mixed | `yes` | `all` | no |
| mixed | `yes` | `one` | yes |
| mixed | `no` | `all` | yes |
| mixed | `no` | `one` | no |
| no books | `yes` | `all` | no |
| no books | `yes` | `one` | no |
| no books | `no` | `all` | yes |
| no books | `no` | `one` | yes |

The two rows that seem surprising at first glance can be explained as follows. In a mixed basket with `BookDeliveryType = all`, not all items are books, so the order isn't a book shipment. That's why exactly those shipping methods are available that are **not** allowed for book shipments. If there are no books in the basket at all, the same applies regardless of the type.

### Multiple delivery addresses

| Parameter | Purpose | Values |
| - | - | - |
| `MultiDeliveryAddress-Allow` | allow a separate delivery address per basket item | `yes`, `no`. Default: `no` |
| `DelivererSelectionPerBasketPosition-Allow` | allow a separate shipping method per basket item | `yes`, `no`, `test` |
| `MultiDeliveryAddressPerBasketPositionCost-List` | cost scale based on the number of delivery addresses used | see below |
| `MultiDeliveryCheckDeliveryAtCombinedAddress-Allow` | trigger delivery checks | `yes`, `no`. Default: `no` |
| `MultipleBillAddressUsageForSingleBasketPosition-Allow` | billing address can be used multiple times as delivery address | `yes`, `no`. Default: `no` |
| `OrderData-DeliveryAddressFormat` | format of the delivery address in the order data | `Standard`, `MultiDeliveryAlways`. Default: `Standard` |

> [!WARNING]
>
> With `DelivererSelectionPerBasketPosition-Allow = test`, a new session is created when leaving test mode.

The cost scale for multiple delivery addresses follows the pattern `(count:percentage:absolute)`. If both cost types are specified, the higher value is charged.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
MultiDeliveryAddressPerBasketPositionCost-List = (2:5.00%:2.00)(3::1.90)(5:4.50%:)
```

From 2 delivery addresses, the cost is 5 percent of the item value or 2.00 euros, whichever is higher. From 3 delivery addresses, a fixed 1.90 euros. From 5 delivery addresses, 4.5 percent of the item value.

> [!WARNING]
>
> These costs are added to the costs of the shipping method. The costs from the `+Deliverer` sections remain unaffected.

`MultiDeliveryCheckDeliveryAtCombinedAddress-Allow` determines whether the full delivery checks run. These are all checks that must be passed before an order is submitted, for example validity of the delivery addresses, permitted combinations of delivery country and VAT, and quantity distributions.

### Product-dependent shipping methods

| Parameter | Purpose | Values |
| - | - | - |
| `DeliveryFilterID-Mode` | when the DeliveryFilterIDs of the products are taken into account | `test`, `productive`. Default: `productive` |

## `+Deliverer`

Defines a single shipping method. Up to 150 `+Deliverer` sections are possible. The order in the configuration determines the display order in the shop.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<+Deliverer>
   Allow          = yes
   ID             = inland
   Name-Txt       = DHL
   Country-Txt    = Versand innerhalb Deutschlands
   Suffix-Txt     = zzgl. ~Cost~ ~WS-CurrencySymbol~ Versand
   NoCost-Txt     = versandkostenfrei
   BasicCost-List = (0:4.90)(50:0)
   DeliveryCountry-Rule = AllowCountries
   DeliveryCountry-List = DEU
</+Deliverer>
```

### When a section is read at all

As with payment methods, the kernel first checks two things and discards the entire section if a check fails. No message appears.

| Condition | Behavior if not met |
| - | - |
| `Name-Txt` **or** `Country-Txt` is filled | The shipping method isn't activated |
| `Allow = yes` | The shipping method isn't activated |

This explains the note in the previous documentation that `Country-Txt` must be used if `Name-Txt` is empty. If both are empty, the shipping method doesn't exist.

> [!WARNING]
>
> Two global settings override all `+Deliverer` sections. If the freight cost module is active, all shipping methods are deactivated. If the order runs through a customer-specific quote, all shipping methods except the first are deactivated, and this first one is overwritten with the name and costs from the quote. In both cases, the configuration of the `+Deliverer` sections has no effect. These two rules aren't described in the previous documentation.

### Basic information

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | offer shipping method | `yes`, `no`. Default: `no` |
| `ID` | unique ID, for assignment via `DelivererID-List` of a payment method | for example `1`, `inland`, `weltweit` |
| `Name-Txt` | name of the shipping service provider | for example `DHL`, `UPS`, `GLS` |
| `Country-Txt` | name of the shipping method or information on the destination area | for example `weltweit` |
| `Type` | type of shipping method | for example `standard`, `express`, `spedition` |
| `Suffix-Txt` | additional description, only when displayed with a radio button | text with local tags |
| `Descr-Txt` | deprecated. Only used if `Suffix-Txt` is empty | text |
| `NoCost-Txt` | text for delivery with free shipping | for example `versandkostenfrei` |
| `Dependencies` | description text, only appears on the shipping methods overview page | text |
| `DisplayInList-Flag` | show shipping method in the global list | `yes`, `no`. Default: `yes` |
| `AutoOrderReference` | only for the order generator. Addressing via a reference instead of the ID | reference text |
| `GroupID` | grouping identifier of the shipping method | text |
| `MerchantDefinitionsFile` | file with merchant-dependent definitions | file name |

> [!NOTE]
>
> `GroupID` and `MerchantDefinitionsFile` aren't described in the previous documentation and have been added here.

With `AutoOrderReference`, the first available and applicable shipping method with the passed reference is selected.

#### Local tags in `Suffix-Txt`

| Tag | Output |
| - | - |
| `WS-Currency` | currency |
| `WS-CurrencySymbol` | currency symbol |
| `Cost` | shipping costs |
| `NetCost` | net amount of the shipping costs |
| `GrossCost` | gross amount of the shipping costs |
| `UserDeliveryCostDiscountRate` | customer-specific discount on the shipping costs, as a percentage |
| `UserDeliveryCostDiscount` | the same discount as an absolute amount |
| `UserDeliveryCostDiscountNet` | the same discount as a net amount |
| `UserDeliveryCostDiscountGross` | the same discount as a gross amount |
| `AltCurrencyCost` | shipping costs in the alternative currency |
| `AltCurrencyNetCost` | net amount in the alternative currency |
| `AltCurrencyGrossCost` | gross amount in the alternative currency |
| `AltCurrencyIso` | ISO code of the alternative currency |
| `AltCurrencySymbol` | symbol of the alternative currency |

### Display

| Parameter | Purpose | Values |
| - | - | - |
| `Img` | path to the shipping method icon | for example `../../navigation/grafiken/logo-delivererXYZ.png` |
| `ImgOnClick` | JavaScript when clicking the icon | supports the local tags `Link` and `ID` |
| `RadioOnClick` | JavaScript when clicking the radio button | supports the local tags `RadiobuttonID` and `ID` |
| `Link` | local tag for use in these JavaScript functions | URL |
| `HideCostsInName` | don't automatically show shipping costs after the name | `yes`, `no`. Default: `no` |
| `+AdditionalInfo-<ID>` | optional additional information, accessible in the template via the DELIV tags | for example `+AdditionalInfo-deliv-time_01 = 2 Werktage` |

The ID of an `+AdditionalInfo` parameter can contain alphanumeric characters, hyphens, and underscores.

> [!WARNING]
>
> Only set `HideCostsInName` to `yes` if you use the local tags `Cost`, `GrossCost`, or `NetCost` in `Suffix-Txt`. Otherwise, the shipping costs aren't shown at all when selecting the shipping method.

### Shipping costs

| Parameter | Purpose | Values |
| - | - | - |
| `BasicCost-List` | shipping costs depending on order value | scale, see below |
| `WeightCost-List` | shipping costs depending on weight | scale |
| `VolumeCost-List` | shipping costs depending on volume | scale |
| `MinCost` | minimum amount for shipping costs | for example `4.50` |
| `ProductCost-Allow` | product-dependent shipping cost calculation | `no`, `id`, `id_zip` |
| `UserDiscount-Allow` | allow customer-specific shipping cost discount | `yes`, `no`. Default: `yes` |
| `FaktorCost-Value` | unit costs of the shipping method | amount |
| `UserDeliveryCostReduction-Value` | shipping cost reduction, only for customers with the corresponding account switch | amount |

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
# ab 0 EUR: 10,90, ab 200 EUR: 8,00, ab 500 EUR: 5 Prozent, ab 1000 EUR: kostenlos
BasicCost-List  = (0:10.90)(200:8)(500:5%)(1000:0)
# nach Gewicht
WeightCost-List = (0:4.50)(3.5:9.70)(5:14.00)(10.5:20.50)
# nach Volumen
VolumeCost-List = (0:0)(0.5:5%)(1:20)
```

Costs can be specified as absolute amounts or as a percentage of the merchandise value. Up to 500 scale levels are supported. Decimal places are separated with a period.

`MinCost` applies if no scale is stored in `BasicCost-List` or if the calculated costs would be lower.

`ProductCost-Allow` controls the product-dependent calculation. `no` turns it off, `id` calculates by shipping method ID, and `id_zip` additionally by postal code range.

> [!NOTE]
>
> Three shipping cost settings aren't described in the previous documentation and have been added here.
>
> `FaktorCost-Value` defines unit costs.
>
> `UserDeliveryCostReduction-Value` is only read if the shipping cost reduction switch is set in the customer account.
>
> The `DestinationDependentWeightCost` subsection allows a weight-based scale that depends on the destination country. Its parameters aren't documented. Please ask WEBSALE AG if you need them.
>
> In addition, the kernel accepts the spelling `BasicCostList` without a hyphen and reads it **before** `BasicCost-List`. If both are in the configuration, the spelling without the hyphen wins. Use `BasicCost-List`.

### Availability by amount, weight, and volume

| Parameter | Shipping method is offered if |
| - | - |
| `MinOrder` | the order value exceeds this value |
| `MaxOrder` | the order value doesn't exceed this value |
| `MinWeight` | the total weight is greater than or equal to this value |
| `MaxWeight` | the total weight is less than or equal to this value |
| `MinVolume` | the total volume is greater than or equal to this value |
| `MaxVolume` | the total volume is less than or equal to this value |

### Availability by country

| Parameter | Purpose | Values |
| - | - | - |
| `DeliveryCountry-Rule` | rule for the delivery country | `AllowCountries`, `DenyCountries`. Default: `DenyCountries` |
| `DeliveryCountry-List` | countries for the rule | comma-separated 3-letter ISO codes |

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
# nur innerhalb Deutschlands
DeliveryCountry-Rule = AllowCountries
DeliveryCountry-List = DEU

# alle Länder außer DACH
DeliveryCountry-Rule = DenyCountries
DeliveryCountry-List = DEU,AUT,CHE
```

### Availability by products in the basket

| Parameter | Purpose | Values |
| - | - | - |
| `DeliveryFilterID-List` | shipping method only for correspondingly flagged products | IDs from the `DeliveryFilterID` product data field |
| `+DeliveryFilterID-List` | the same, but as several alternative combinations | IDs from the same product data field |
| `AllowForInventoryStateAtLeast` | only with at least one product per listed stock level | `green`, `yellow`, `red`, comma-separated |
| `HideForFreeDelivery` | hide if only products with free shipping are purchased | `yes`, `no` |
| `HideForNoFreeDelivery` | hide if not all products have free shipping | `yes`, `no` |
| `BookDelivery-Allow` | shipping method for book shipments or for non-book shipments | `yes`, `no`. Default: `no` |
| `EigenhaendigPlus` | offer shipping method when Eigenhändig Plus is active | `allow`, `deny` |

> [!WARNING]
>
> If `DeliveryFilterID-List` is specified without a leading plus, all `+DeliveryFilterID-List` parameters are ignored. With several `+DeliveryFilterID-List` parameters, the shipping method is available as soon as **one** of the specified combinations matches the products in the basket.
>
> Always configure the parameter first and then add the entries to the product data.

`AllowForInventoryStateAtLeast` requires at least one matching product in the basket for **each** listed stock level.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
AllowForInventoryStateAtLeast = green,yellow
```

With this setting, the shipping method is available if the basket contains at least one green **and** at least one yellow product. A basket with only green products doesn't meet the condition.

> [!NOTE]
>
> A product without a stock level is treated like a product with stock level "green".

### Availability by order type and customer

| Parameter | Purpose | Values |
| - | - | - |
| `Warranty` | only offer shipping method to buyers with one of these authorization IDs | comma-separated list |
| `AllowForCheckouts-List` | which checkouts the shipping method applies to | `Standard`, `PayPalExpress`, `KlarnaExpress`. Default: `Standard` |
| `AllowForPrimeShopping-Qualification` | availability for Prime customers | `use-for-all`, `only-for-prime`, `not-for-prime`. Default: `use-for-all` |
| `AllowForSubscriptionOrder-Qualification` | availability for subscription orders | `use-for-all`, `only-for-subscriptionorder`, `not-for-subscriptionorder`. Default: `use-for-all` |
| `AllowForSubsequentOrder-Qualification` | availability for follow-up orders | `use-for-all`, `only-for-SubSequentorder`, `not-for-SubSequentOrder`. Default: `use-for-all` |
| `AllowForReferer-List` | referers for which the shipping method is allowed | comma-separated list |
| `DenyForReferer-List` | referers for which the shipping method isn't allowed | comma-separated list |
| `AllowForReferer-Qualification` | availability depending on a set referer | `use-for-all`, `only-for-referer`, `not-for-referer`. Default: `use-for-all` |
| `AvailabilityCheck-ID` | shop-internal check against the postal code delivery area list. DHL Kurier only | `dhlkurier` |

`AllowForReferer-Qualification` and the two referer lists work together. The qualification determines whether the shipping method appears at all with or without a set referer. The lists then determine which specific referers are allowed or excluded.

If several checkout types should be supported, specify multiple comma-separated values for `AllowForCheckouts-List`.

### References to definitions sections

| Parameter | References | Combination for multiple |
| - | - | - |
| `+UseAdditionalInput-ID` | `DelivererAdditionalInput-Definitions` | a separate parameter per ID |
| `+UseAddressDependency-ID` | `DelivererAddressDependencies-Definitions` | **AND**-combined, all must be met |
| `+UseProductDependency-ID` | `DelivererProductDependencies-Definitions` | **AND**-combined, all must be met |
| `UseShowDisabled-GroupID` | `DelivererShowDisabled-Definitions` | one GroupID per shipping method |

## `DelivererAdditionalInput-Definitions`

Here you define additional input fields for shipping methods, for example a phone number that is only needed for freight forwarding delivery. The assignment is made via `+UseAdditionalInput-ID` in the `+Deliverer` section. The section may only appear **once** in the `shop.config`.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DelivererAdditionalInput-Definitions>
  <+AdditionalInput>
    ID                       = phone_required
    FieldDescr               = Telefonnummer
    AdditionalInfoText       = Bei Speditionslieferung benötigen wir Ihre Telefonnummer.
    MaxLength                = 32
    Required                 = no
    RequiredErrorMessage-Txt = Bitte geben Sie Ihre Telefonnummer an.
    Type                     = input
    <+RequiredDependency>
      <+Dependency>
        Input = billaddress
        <+Condition>
          Field = Phone
          Type  = empty
        </+Condition>
      </+Dependency>
    </+RequiredDependency>
  </+AdditionalInput>
</DelivererAdditionalInput-Definitions>
```

### `+AdditionalInput`

| Parameter | Purpose | Values |
| - | - | - |
| `ID` | unique identifier of the input | for example `phone_required` |
| `FieldDescr` | field name, shown before the input field | text |
| `AdditionalInfoText` | optional description below the field | text |
| `MaxLength` | maximum length of the input | up to 128. Default: 128 |
| `Required` | field is always a required field | `yes`, `no`. Default: `no` |
| `RequiredErrorMessage-Txt` | message for an empty required field | text |
| `Type` | type of input field | `input`, `listbox`, `checkbox`. Default: `input` |

> [!NOTE]
>
> Three peculiarities of the evaluation aren't documented and have been added here.
>
> If `MaxLength` is 0 or exceeds the internal maximum, it is silently set to this maximum.
>
> `Type = checkbox` sets `MaxLength` to a fixed 10, because only `checked` or nothing is stored as the value.
>
> Any value of `Type` other than `listbox` or `checkbox` results in `input`.

### `+listentry`

The entries of a selection list. Only needed if `Type = listbox` is set. Each subsection corresponds to one entry in the drop-down list.

| Parameter | Purpose |
| - | - |
| `Entry-Txt` | displayed text |
| `ID` | technical value, alphanumeric |

### `+VisibilityDependency` and `+RequiredDependency`

Both subsections are optional and structured the same way. `+VisibilityDependency` controls whether the field appears at all. `+RequiredDependency` controls whether the visible field is a required field. Multiple `+VisibilityDependency` sections are **OR**-combined, the `+Dependency` sections within them are **AND**-combined.

> [!WARNING]
>
> If you use either of the two sections, `Required` must be set to `no`. Otherwise, the field is always a required field regardless of the conditions.

| Parameter | Purpose | Values |
| - | - | - |
| `Input` | what is checked | see below |
| `Field` | technical field name of the checked value | for example `Phone` |
| `Type` | type of check | see below |
| `Value` | checked value | text |
| `SetBehavior` | handling of set products | `asUnit`, `Single`. Default: `Single` |
| `BasketBehavior` | how many products must meet the condition | `match-all`, `match-once`. Default: `match-all` |

| `Input` | checks |
| - | - |
| `billaddress` | the billing address data |
| `delivaddress` | the delivery address data, or the billing address data as a fallback |
| `onlydelivaddress` | only the delivery address data |
| `additionalinput` | the entry in another additional input field |
| `delivaddress-used` | whether a different delivery address is used |
| `delivaddress-notused` | whether no different delivery address is used |
| `delivaddress-oneforallused` | whether the order goes to exactly one delivery address |
| `delivaddress-multideliveryused` | whether the order goes to multiple delivery addresses |

The `+Condition` subsection is only evaluated for `billaddress`, `delivaddress`, `onlydelivaddress`, and `additionalinput`. The four values starting with `delivaddress-` check the state itself and don't need a condition.

| `Type` | Condition is met if |
| - | - |
| `empty` | the field is empty |
| `filled` | the field is filled |
| `value` | the field value matches the value in `Value` |
| `notvalue` | the field value doesn't match the value in `Value` |
| `inlist` | the field value is part of the list in `Value` |
| `notinlist` | the field value isn't part of the list in `Value` |
| `prefix` | the field value starts with the value in `Value` |
| `notprefix` | the field value doesn't start with the value in `Value` |
| `includedinlist` | the value from `Value` is in the field's list of values |
| `notincludedinlist` | the value from `Value` isn't in the field's list of values |
| `matchsimplewildcard` | the field value matches the pattern in `Value` |
| `notmatchsimplewildcard` | the field value doesn't match the pattern in `Value` |

In the two wildcard checks, `?` stands for exactly one arbitrary character and `*` for any number of characters. The asterisk may only appear at the end.

## `DelivererAddressDependencies-Definitions`

Makes a shipping method dependent on the entries in the billing or delivery address. The assignment is made via `+UseAddressDependency-ID`. The section may only appear **once** in the `shop.config` and requires at least one `+AddressDependency` subsection.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DelivererAddressDependencies-Definitions>
   <+AddressDependency>
      AddressDependency-ID = nur_firmenkunden
      ShowDisabled-Txt     = Diese Versandart steht nur Geschäftskunden zur Verfügung.
      <+DependencyGroup>
         <+Dependency>
            Input = billaddress
            <+Condition>
               Field = Company
               Type  = filled
            </+Condition>
         </+Dependency>
      </+DependencyGroup>
   </+AddressDependency>
</DelivererAddressDependencies-Definitions>
```

> [!WARNING]
>
> The conditions make a shipping method **available** when they are met. An exclusion can't be expressed. If you want to exclude a shipping method for certain addresses, phrase the condition negatively, for example with `empty` or `notvalue`.

| Parameter | Purpose | Values |
| - | - | - |
| `+AddressDependency` | independent subsection, not combined with others | |
| `AddressDependency-ID` | unique ID for assignment to the shipping method | for example `no_deliv_addr_allowed` |
| `ShowDisabled-Txt` | replaces the notice from `DelivererShowDisabled-Definitions` | text |
| `+DependencyGroup` | multiple of these sections are **OR**-combined | |
| `+Dependency` | multiple of these sections within a group are **AND**-combined | |
| `Input` | what is checked | as above, without `additionalinput` |
| `+Condition` | condition on the data from `Input`. Multiple are **AND**-combined | |
| `Field` | technical field name from `AddressFields-Txt` | for example `Company` |
| `Type` | type of check | as above, plus `greater` and `smaller` |
| `Value` | checked value | text |

Note the nesting. `+AddressDependency` contains `+DependencyGroup`, which contains `+Dependency`, which contains `+Condition`.

Reference: AddressFields-Txt section

## `DelivererProductDependencies-Definitions`

Makes a shipping method dependent on the product index, the product number, or a custom product data field. The assignment is made via `+UseProductDependency-ID`. This section may also only appear **once** in the `shop.config` and requires at least one `+ProductDependency` subsection.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DelivererProductDependencies-Definitions>
   <+ProductDependency>
      ProductDependency-ID = kein_sperrgut
      ShowDisabled-Txt     = Für Speditionsware steht diese Versandart nicht zur Verfügung.
      <+DependencyGroup>
         <+Dependency>
            <+Condition>
               Field          = AF-Versandart
               Type           = notvalue
               Value          = Spedition
               SetBehavior    = Single
               BasketBehavior = match-all
            </+Condition>
         </+Dependency>
      </+DependencyGroup>
   </+ProductDependency>
</DelivererProductDependencies-Definitions>
```

> [!WARNING]
>
> Here too, the conditions make a shipping method available when they are met. An exclusion can't be expressed.

| Parameter | Purpose | Values |
| - | - | - |
| `ProductDependency-ID` | unique ID for assignment to the shipping method | for example `fsk18dependency` |
| `ShowDisabled-Txt` | replaces the notice from `DelivererShowDisabled-Definitions` | text |
| `Field` | checked field | `ProdIndex`, `ProdNumber`, or `AF-<custom product field>` |
| `Type` | type of check | as above, plus `greater` and `smaller` |
| `Value` | checked value | text |
| `SetBehavior` | handling of set products | `asUnit`, `Single`. Default: `Single` |
| `BasketBehavior` | how many products must meet the condition | `match-all`, `match-once`. Default: `match-all` |

Custom product fields have the prefix `AF-`, for example `AF-FSK18`. They must also be enabled for the basket in the `AdditionalProductFieldsInBasket` section.

Reference: AdditionalProductFieldsInBasket section

## `DelivererShowDisabled-Definitions`

Controls whether an unavailable shipping method is grayed out instead of not being displayed at all. You create a rule and enter its `ShowDisabled-GroupID` in the relevant `+Deliverer` sections. The section may only appear **once** in the `shop.config`.

Grouping is the actual purpose. If you create a separate `+Deliverer` section for the same carrier for each delivery zone, a shared GroupID prevents the same carrier from appearing grayed out multiple times. A shipping method is only displayed grayed out when **all** related `+Deliverer` sections are unavailable.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DelivererShowDisabled-Definitions>
   <+ShowDisabled-Rule>
      ShowDisabled-GroupID                      = selbstabholung
      ShowDisabled-Allow                        = 1,6,28
      ShowDisabled-MultipleEntriesDisabled-Mode = show-first
      <ShowDisabled-Txt>
         6       = Für die Selbstabholung gilt ein Mindestbestellwert.
         28      = Bitte wählen Sie keine abweichende Lieferadresse, wenn Sie die Ware vor Ort abholen möchten.
         default = Diese Versandart steht leider nicht zur Verfügung.
      </ShowDisabled-Txt>
   </+ShowDisabled-Rule>
</DelivererShowDisabled-Definitions>
```

| Parameter | Purpose | Values |
| - | - | - |
| `ShowDisabled-GroupID` | grouping identifier, assigned in the `+Deliverer` section via `UseShowDisabled-GroupID` | alphanumeric, hyphen, underscore |
| `ShowDisabled-Allow` | when to gray out | `never`, `always`, or list of rejection reasons. Default: `never` |
| `ShowDisabled-MultipleEntriesDisabled-Mode` | with multiple inactive shipping methods, show all or only the first | `show-all`, `show-first`. Default: `show-all` |
| `ShowDisabled-Txt` | subsection with the notice texts per rejection reason | one parameter per reason, plus `default` |

The rules aren't mandatory. For the sake of traceability, however, it's a good idea to create one for each shipping method.

### Rejection reasons

| Number | Reason |
| - | - |
| 1 | shipping method not available for the selected delivery country |
| 2 | minimum weight not reached, see `MinWeight` |
| 3 | maximum weight exceeded, see `MaxWeight` |
| 4 | minimum volume not reached, see `MinVolume` |
| 5 | maximum volume exceeded, see `MaxVolume` |
| 6 | minimum order value not reached, see `MinOrder` |
| 7 | maximum order value exceeded, see `MaxOrder` |
| 8 | not available for free shipping, see `HideForFreeDelivery` |
| 9 | not for book shipments, see `BookDelivery-Allow` |
| 10 | special provider such as DHL Kurier, see `AvailabilityCheck-ID` |
| 11 | only for Prime orders, customer isn't a Prime customer |
| 12 | only for non-Prime orders, customer is a Prime customer |
| 13 | only for follow-up orders, current order isn't one |
| 14 | only for non-follow-up orders, current order is one |
| 15 | only for Eigenhändig Plus orders, order doesn't qualify |
| 16 | not for Eigenhändig Plus orders, order qualifies |
| 17 | only for certain authorization groups, see `Warranty` |
| 18 | not for shipping cost products, see `HideForNoFreeDelivery` |
| 19 | not in combination with the selected payment method, see `DelivererID-List` of the payment method |
| 20 | reserved, currently not used |
| 21 | reserved, delivery code, only relevant for the order generator |
| 22 | reserved, delivery ID, only relevant for the order generator |
| 23 | stock level green not reached |
| 24 | stock level yellow not reached |
| 25 | stock level red not reached |
| 26 | DeliveryFilterID doesn't match the products in the basket |
| 27 | not available for this checkout type, see `AllowForCheckouts-List` |
| 28 | dependencies on the billing or delivery address not met |
| 29 | only for subscription orders, current order isn't one |
| 30 | only for non-subscription orders, current order is one |
| 31 | not available for the products in the basket, see product dependencies |
| 32 | URL referer present or not present, specified without list |
| 33 | URL referer not in the allow list, see `AllowForReferer-List` |
| 34 | URL referer in the deny list, see `DenyForReferer-List` |

## Preferred delivery date

There are two sections for the preferred delivery date. `DeliveryDate` offers the simple variant with a continuous list of days. `AdvDeliveryDate` offers the advanced variant with weekdays, public holidays, and an order cutoff time. Use one of the two, not both.

### `DeliveryDate`

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<DeliveryDate>
   Allow            = yes
   Days-Value       = 10
   DaysOffset-Value = 5
</DeliveryDate>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | offer selection of the delivery date | `yes`, `no`. Default: `no` |
| `Days-Value` | number of days available for selection | integer |
| `DaysOffset-Value` | number of days after receipt of order before delivery is possible at the earliest | integer |

With `Days-Value = 10` and `DaysOffset-Value = 5`, for an order on November 20, the selection list contains the ten days from November 25 to December 4.

### `AdvDeliveryDate`

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<AdvDeliveryDate>
   Allow          = yes
   DeliveryRange  = 90
   DeliveryDays   = 1,2,3,4,5
   DeliveryTime   = 14
   TimeLimit      = 10
   FirstEntry-Txt = Bitte wählen Sie
   Name-Txt       = Wunschtermin
   Required       = no
   Holidays       = 2026/12/25,2026/12/26,2027/01/01
</AdvDeliveryDate>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | activate the delivery date feature | `yes`, `no`. Default: `no` |
| `DeliveryRange` | number of dates from the order date | integer |
| `DeliveryDays` | weekdays on which delivery takes place. Monday is 1 according to ISO 8601 | comma-separated integers |
| `DeliveryTime` | delivery time in hours | integer |
| `TimeLimit` | order cutoff time as a full hour | 0 to 24 |
| `Holidays` | public holidays without delivery | up to 100 entries in the format `JJJJ/MM/TT` (YYYY/MM/DD) |
| `FirstEntry-Txt` | text for the first entry in the selection list | text |
| `Name-Txt` | text of the delivery date shown in the order | text |
| `Required` | specifying a preferred date is mandatory | `yes`, `no`. Default: `no` |

`TimeLimit` defines the order cutoff time. With `TimeLimit = 10`, the current date is the basis for the date calculation for all orders up to and including 10:00 a.m. For later orders, it's the following day. The value `0` means that the delivery time is always calculated from the order cutoff time of the order day, regardless of the time of day.

In the example above, for an order before 10 a.m., the next business day is offered as the earliest possible delivery date; for an order after 10 a.m., the business day after that. The selection list extends 90 days into the future.

> [!NOTE]
>
> Two limits aren't described in the previous documentation and have been added here. A `TimeLimit` above 24 is set to 24. A `DeliveryRange` above 36500 is set to 3650; values in between remain unchanged.

Only public holidays in the future are taken into account. The specified days don't appear in the selection list.

## `PartialDeliverySelection`

Defines whether the buyer can choose between partial delivery and complete delivery.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<PartialDeliverySelection>
   Allow                       = yes
   PreSelection                = complete
   +BasketInventoryState-Group = green,yellow
   +BasketInventoryState-Group = red
</PartialDeliverySelection>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | activate partial delivery or switch to test mode | `yes`, `no`, `test`. Default: `no` |
| `PreSelection` | preselection in the checkout process | `complete`, `partial`, `undefined`. Default: `undefined` |
| `+BasketInventoryState-Group` | optional grouping of stock levels | `green`, `yellow`, `red`, also comma-separated |

The `+BasketInventoryState-Group` parameter can appear multiple times. Each line forms a group.

## `GiftPackage`

Configures optional gift wrapping.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<GiftPackage>
   Allow         = yes
   Cost-Value    = 2.50
   Text2-Txt     = Geschenkverpackung
   VATType       = static
   VATRate-Value = 1
</GiftPackage>
```

| Parameter | Purpose | Values |
| - | - | - |
| `Allow` | enable the gift wrapping system | `yes`, `no`. Default: `no` |
| `Cost-Value` | default price per item if no price is stored for the product | price, for example `2.50` |
| `Text2-Txt` | text in the order data if gift wrapping was selected | text |
| `VATType` | determination of the VAT rate | `static`, `dynamic`. Default: `static` |
| `VATRate-Value` | VAT index, only with `VATType = static` | 1 to 10. Default: 1 |

With `VATType = dynamic`, the VAT rate with the highest total in the basket determines the rate for the gift wrapping.

> [!WARNING]
>
> With `VATType = dynamic`, `VATRate-Value` must not contain a value.

Reference: VATRates section

## `EigenhaendigPlus`

Configures the Eigenhändig Plus shipping method for age-restricted products. You define which products are affected in the `AgeRestrictedProductList` section.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<EigenhaendigPlus>
   AgeRestricted-Value  = 18
   DeliveryCountry-List = DEU
   IDCardType1-Txt      = Personalausweis
   IDCardType2-Txt      = Reisepass
   HeadNotify-Txt       = Bitte vervollständigen Sie folgende Daten
   Notify1-Txt          = Ausweisnummer
   Notify2-Txt          = Ausweistyp
   Notify3-Txt          = Ausstellende Behörde
   Notify4-Txt          = Bestätigung des Mindestalters und der Namensgleichheit
   Notify5-Txt          = Geburtsdatum
   Notify6-Txt          = Das Mindestalter ist nicht erreicht
</EigenhaendigPlus>
```

| Parameter | Purpose |
| - | - |
| `AgeRestricted-Value` | age from which Eigenhändig Plus is activated |
| `DeliveryCountry-List` | delivery countries for which Eigenhändig Plus is activated |
| `IDCardType1-Txt`, `IDCardType2-Txt` | entries of the selection list for the ID type |
| `HeadNotify-Txt` | heading if required entries are missing |
| `Notify1-Txt` to `Notify6-Txt` | error messages for the individual fields on the order page |

Whether a shipping method is offered when Eigenhändig Plus is active is controlled in the respective `+Deliverer` section via the `EigenhaendigPlus` parameter with the values `allow` and `deny`.

Reference: AgeRestrictedProductList section

## `ShipTrack`

Holds the access credentials of the shipping service providers for shipment tracking. One `+Entry` subsection per provider. You address the entry in the template via the ID assigned there.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<ShipTrack>
  <+Entry>
    ID           = DHL
    Provider     = DHL
    Username     = zt123456
    Password     = geheim
    LanguageCode = de
  </+Entry>
</ShipTrack>
```

| Parameter | Purpose | Values |
| - | - | - |
| `ID` | freely assigned identifier for addressing in the template | alphanumeric, for example `DHL` |
| `Provider` | technical provider identifier, specified by WEBSALE | `DHL`, `POST-AT`, `WSSwissPostCon` |
| `Username` | user name from the shipping service provider | text |
| `Password` | password from the shipping service provider | text |
| `LanguageCode` | language of the delivered shipping information | `de`, `en`, `fr`, `nl`, `it`, `es`. Default: `de` |

Other languages are possible. Clarify this directly with the shipping service provider.

Reference: ShipTrack tags for output in the template


## Related topics

- [Texts and messages](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/texte-und-meldungen.md)
- [Configuration wsautoexpdelcost.cfg](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/konfiguration-wsautoexpdelcost-cfg.md)
- [Questionnaire for commercial settings](https://dokumentation.websale.de/en/v8s/materialien/fragebogen-kaufmaennische-einstellungen.md)
- [Configuration country.dat and country_deliv.dat](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/konfiguration-country-dat.md)
- [$wsCheckout - Checkout](https://dokumentation.websale.de/en/frontend/referenz/module/wscheckout.md)


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