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

# Customer-specific offers

> Transfer individually negotiated offers with their own prices and payment and shipping conditions from the merchandise management system into the shop and make them orderable there.

Customer-specific offers bring telephone sales into the shop. A clerk negotiates prices, payment and delivery conditions with a customer, and the customer then finds the result as a ready-made offer in their account and can order it there.

The offers are not created in the shop but in the merchandise management system. WEBSALE V8s provides an interface for this that was originally developed for the D\&G mail-order system and that other merchandise management systems can use just as well.

## What makes up an offer

| Property | Rule |
| - | - |
| Conditions | Prices, payment and shipping conditions apply only to this offer |
| Shop settings | are completely bypassed for the offer |
| Order | only separately, not together with other products |
| Frequency | each offer can be ordered exactly once |
| Validity | limited in time |
| Modifiability | the buyer cannot change an offer |
| Number per customer | any number, with different products and conditions |

> [!NOTE]
>
> Bypassing the shop settings is the actual purpose. In an offer, you can offer a foreign customer purchase on account even though your shop otherwise only shows this payment method domestically. The same applies to shipping method and shipping costs, and both may also be free of charge.

> [!NOTE]
>
> While an offer is being ordered, the shop switches off all other shipping methods and replaces the first one with the name and costs from the offer. This is where the rule comes from that an offer can only be ordered separately: for ordinary products in the same basket, there would be no matching shipping costs.

> [!WARNING]
>
> Offers are bound to a customer account **with a customer number**. The customer must be logged in, and their account must contain the customer number under which the merchandise management system stored the offer. If either is missing, they do not see any offers.

## What data the merchandise management system supplies

### For the offer

| Information | Required |
| - | - |
| Subshop ID | yes |
| Customer number | yes |
| Offer number, unique per customer | yes |
| Offer date | yes |
| Validity period | yes |
| Payment method code and payment costs | yes |
| Shipping method and shipping costs | yes |
| Offer description | no |

### Per product

| Information | Required |
| - | - |
| Product name | yes |
| Product number | yes |
| Order quantity | yes |
| Price for the order quantity | yes |
| VAT index | yes |
| Discount, percentage or absolute | no |

## Specifying the payment method

The payment method is assigned via a code. It must be configured and active in the shop, otherwise it does not apply in the offer either. Payment costs are optional.

| Payment method | Code |
| - | - |
| Credit card | 1 |
| Cash on delivery | 3 |
| Direct debit | 4 |
| Prepayment | 5 |
| Invoice | 6 |
| Geldkarte | 8 |
| Customer account | 9 |
| Online bank transfer and giropay | 10 |
| freely definable payment methods | 16 to 20 |

> [!NOTE]
>
> Codes 2 and 7 are not assigned in this list. The complete overview of all payment method codes can be found in the Materials.

Materials: Overview of all payment method codes

The name of the shipping method, on the other hand, can be chosen freely; shipping costs are also optional.

## The configuration

### Assigning the template

Offers use their own template.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<Templates>
   Offers = ws_offers.htm
</Templates>
```

### Storing the messages

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<NotifyMessages-Txt>
   NoOffers       = Es liegen keine Angebote vor.
   OffersBasket-1 = Es befinden sich bereits Produkte im Warenkorb. Ein Angebot kann nur separat bestellt werden.
   OffersBasket-2 = Es befindet sich bereits ein Angebot im Warenkorb. Ein Angebot kann nur separat bestellt werden.
</NotifyMessages-Txt>
```

> [!NOTE]
>
> The two basket messages distinguish two different situations: ordinary products in the basket and an offer that has already been selected. The customer has to do something different in each case, which is why two texts are worthwhile.

### Defining the labels

```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>
```

> [!NOTE]
>
> `Offer-Txt` and `From-Txt` build the text of each entry in the selection list, for example "Angebot 4711 vom 12.03.2026". `OfferID-Txt` is the label of the offer number.

Reference: Templates section · NotifyMessages-Txt section · Offers section

## The `ws_offers.htm` template

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{MSG-Offers_Notify}
   ~MSG-Offers_Notify~
{/MSG-Offers_Notify}

{WS-OffersList}
   <form action="~FORM-Offers~" method="post">
      <input type="hidden" name="referer" value="Angebot-VS4">

      {BASKET-PR-Data}
         {!DC-CompareStringInList($BASKET-TotalPositions$, 0)}
            Angebote können nur separat bestellt werden.
            {!DC-FPBasketHasOffer(1)}
               In Ihrem Warenkorb liegen noch ~BASKET-TotalPositions~ Artikel.
               Bitte leeren Sie den Warenkorb, um ein Angebot zu bestellen.
            {/!DC-FPBasketHasOffer(1)}
            {DC-FPBasketHasOffer(1)}
               In Ihrem Warenkorb liegt bereits ein Angebot.
               Bitte leeren Sie den Warenkorb, um ein anderes Angebot zu wählen.
            {/DC-FPBasketHasOffer(1)}
         {/!DC-CompareStringInList($BASKET-TotalPositions$, 0)}
      {/BASKET-PR-Data}

      Bitte wählen Sie ein Angebot aus:
      ~WS-OffersList~
      <noscript>
         <input type="submit" value="Absenden">
      </noscript>

      {Cat-AdvData($Offers,1)}
         {@OPR-Data}
            <img src="~OPR-Image~" alt="~OPR-Name~">
            Produktname: ~OPR-Name~
            Artikelnummer: ~OPR-Number~
            Menge: ~OPR-Quantity~ ~OPR-Unit~
            {OPR-DiscountRate}Rabatt: ~OPR-DiscountRate~%{/OPR-DiscountRate}
            Preis: ~OPR-Price~ ~WS-CurrencySymbol~
         {/@OPR-Data}

         Zahlungsart:  ~Offer-PaymentName~
         Zustellung:   ~Offer-DeliveryName~
         Lieferkosten: ~Offer-DeliveryCost~ ~WS-CurrencySymbol~
         Gesamtsumme:  ~Offer-TotalSum~ ~WS-CurrencySymbol~
      {/Cat-AdvData($Offers,1)}

      <input type="submit" value="Angebot bestellen" name="button_offer_basket">
   </form>
{/WS-OffersList}
```

> [!NOTE]
>
> `WS-OffersList` outputs a ready-made selection list that submits itself when the selection changes. That is why the submit button is in the `noscript` block: it is only needed when JavaScript is disabled.

> [!WARNING]
>
> Wrap the discount line in brackets, as in the example. `OPR-DiscountRate` and `OPR-Discount` output **nothing** if no discount has been agreed. Without the brackets, the offer will then show "Rabatt: %".

## Linking to the offers page

The link can be placed anywhere. It makes sense on the customer's account page.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<a href="~WS-Link~&act=offers">Zu Ihren Angeboten</a>
```

## The tags for offers

### Offer information

| Tag | Content |
| - | - |
| `Offer-ID` | the offer number |
| `Offer-Date` | the offer date |
| `Offer-ExpireDate` | the end of validity |
| `Offer-Descr` | the offer description |
| `Offer-PaymentName` | the payment method |
| `Offer-PaymentCost` | the payment costs |
| `Offer-DeliveryName` | the shipping method |
| `Offer-DeliveryCost` | the shipping costs |
| `Offer-TotalSum` | the total amount |

In addition, the amounts are available separately as net, gross and VAT: `OFFER-PaymentCostNet`, `OFFER-PaymentCostGross`, `OFFER-PaymentCostVAT`, `OFFER-DeliveryCostNet`, `OFFER-DeliveryCostGross`, `OFFER-DeliveryCostVAT`, `OFFER-TotalSumNet`, `OFFER-TotalSumGross` and `OFFER-TotalSumVAT`.

> [!NOTE]
>
> `Offer-ExpireDate` belongs on the offers page. Offers are limited in time, and the customer should see how much time they have left. `Offer-Descr` is also worthwhile if the merchandise management system supplies a description, because it usually states what the special conditions refer to.

### Information per product

| Tag | Content |
| - | - |
| `OPR-Data` | the loop over the products of the offer |
| `OPR-Name` | the product name |
| `OPR-Number` | the product number |
| `OPR-Quantity` | the order quantity |
| `OPR-Unit` | the unit |
| `OPR-Price` | the price for the order quantity |
| `OPR-DiscountRate` | the percentage discount, empty if there is no discount |
| `OPR-Discount` | the absolute discount, empty if there is no discount |
| `OPR-Image` | the product image |
| `OPR-Variations` | the variants and text inputs of the item |
| `OPR-Insert` | promotional material for the item |
| `OPR-GrossPrice` | the gross price |
| `OPR-NetPrice` | the net price |
| `OPR-VAT` | the VAT amount |

Reference: Tags for customer-specific offers

## Importing the offers

The offers are transferred to the WSPManager via an import file. The format of this file is described in separate documentation, which you can request from WEBSALE AG.

## Related topics

* Materials: Overview of all payment method codes
* Reference: Tags for customer-specific offers


## Related topics

- [OFFER- (Customer-specific offers)](https://dokumentation.websale.de/en/v8s/referenz/tags/offer-kundenspezifische-angebote.md)
- [Shopping basket and order process](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/warenkorb-und-bestellprozess.md)
- [Shop configuration global.config](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/shopkonfiguration-global-config.md)
- [Texts and messages](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/texte-und-meldungen.md)
- [Basics and technology](https://dokumentation.websale.de/en/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md)


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