Latest posts Visit blog
In plain words: what is this page about?

Sometimes an online shop shows a wrong price. This often happens when many prices reach the shop at once. We explain when a sale counts. We show how a shop can step back from a wrong sale. And we show how checks can find such mistakes early. Read on or ask us.

One comma in the wrong place, and the coffee grinder costs €0.99 instead of €99.00 in the shop. Pricing errors in online shops are a particular risk when many prices move from the inventory system, ERP or PIM into the shop at once – that is, in the weeks before and during Black Week. Whether a shop has to deliver such orders depends on two questions: has a contract already been formed, and does a rescission (in German law: Anfechtung) under Section 119 of the German Civil Code (BGB) hold? This article explains the legal position based on statute and case law, shows what matters in the confirmation email and the terms and conditions, and how a plausibility check in the price import catches the error before customers see it. It does not replace legal advice on an individual case.

Black Week: many prices in a short time

For Black Friday and Cyber Monday 2025, the German Retail Federation expected sales of €5.8 billion (HDE). The survey that HDE commissioned from IFH Köln for this purpose polled more than 1,000 online shoppers in October 2025 (HDE). 48 percent of them planned to hunt for bargains on Black Friday (HDE). In 2026, Black Friday falls on November 27 and Cyber Monday on November 30. For shops, this means that within a few days sale prices are set for entire product ranges, started on a schedule and withdrawn again – in many shops not by hand but via an import.

Each of these steps creates opportunities for errors that have nothing to do with the actual pricing decision: the price is maintained correctly in the ERP and still arrives wrong in the shop. How sale prices switch at the same time in the shop and in the product feed is covered in the article on sale prices in Merchant Center. Typical error patterns in imports:

  • Decimal errors: The target system reads “99.00” as 9900 because German and English number formats are mixed up, or an amount in euros is imported as an amount in cents and 99.00 becomes 0.99. The price then ends up at a hundred times or a hundredth of the intended value.
  • Net instead of gross: For consumers, the final price including VAT is what counts. At the standard VAT rate of 19 percent (UStG), a net price taken over by mistake is about 16 percent below the correct gross price.
  • Unit mixed up: The price per piece ends up in the field for the packaging unit, or the other way around.
  • Empty field: A missing value is imported as zero, and the item appears in the shop free of charge.
  • Rules interact: Sale price, voucher and volume discount apply at the same time, although only one of the discounts was intended. How to set up pricing rules cleanly in Shopware is shown in the article on the Rule Builder.
  • Scheduling: The sale price starts an hour early because the time zone or daylight saving time does not match, or it does not end.

When the contract is formed in an online shop

A purchase contract is formed by offer and acceptance. Anyone who offers to enter into a contract with another person is bound by the offer unless they have excluded being bound (BGB). The price shown on the product page is usually not yet such an offer, but an invitation to customers to make an offer themselves. In the Federal Court of Justice's case on a mispriced notebook, the offer was therefore only made with the customer's order (BGH, VIII ZR 79/04). Whether and when the contract is formed is then decided by the shop through its acceptance.

When this acceptance is declared does not depend on the status the shop software sets internally. For declarations generated by an automated ordering system, what matters is how the human addressee may understand them in good faith and according to common practice (BGH, X ZR 37/12). For shops, this is the decisive point: an email that is technically only meant to acknowledge receipt can, depending on its wording, be understood as an acceptance.

The notebook case: €245 instead of €2,650

A retailer had set a sales price of €2,650 for a notebook and entered it into its inventory management system. During the automatic transfer to the shop's product database, it turned into a price of €245 (BGH, VIII ZR 79/04). A customer ordered at this price and received an automatic acknowledgement of receipt. The same day, a second automatic email followed: his order was now being processed by the shipping department, and the retailer thanked him for the order. The court already treated this second email as an acceptance (BGH, VIII ZR 79/04). The notebook was delivered, the retailer rescinded the contract and prevailed with the rescission (BGH, VIII ZR 79/04).

Acknowledgement or acceptance: what the email says

Section 312i (1) sentence 1 no. 3 BGB requires shops in electronic commerce to confirm receipt of an order electronically without undue delay (BGB). This duty concerns the receipt of the order; the provision does not require an acceptance. Shops can therefore separate two messages: an immediate acknowledgement of receipt and a later acceptance, for example with a separate order confirmation or with shipping. How else the order confirmation can be designed is shown in the article on transactional emails in Shopware.

Wording in the emailHow a customer may understand itConsequence of a pricing error
“We have received your order.”Acknowledgement of receiptUsually no contract yet, the shop can decline
“We are checking your order and will confirm it when we ship.”Receipt confirmed, acceptance announcedUsually no contract yet, the shop can decline
“Your order is now being processed by our shipping department.”Acceptance (paraphrasing the email in the BGH notebook case)Contract formed, release only by rescission
“Thank you for your purchase, the goods are reserved for you.”Closer to acceptance than to a mere acknowledgementContract probably formed
Shipping notice with tracking numberAcceptance by deliveryContract formed, release only by rescission
It is not only the email that counts

An acceptance can also be declared without an email, for example by delivering the goods. With some payment methods, the purchase price is also collected when the order is placed. Whether that already amounts to an acceptance depends on the individual case: in a case about a flight booking, the court denied that a contract had been formed despite a booking confirmation and collection of the fare, but because of a recognizably incomplete booking (BGH, X ZR 37/12). Anyone who wants to rely on “no contract yet” should therefore look at the entire ordering process, not just the email text.

Before acceptance: decline the order

If the pricing error is noticed before the shop has accepted, the situation is comparatively simple. The customer's offer expires if it is declined or not accepted in time (BGB). An offer made to an absent person can only be accepted up to the point at which the offeror may expect an answer under ordinary circumstances (BGB). In this situation, the shop therefore does not need to rescind anything. It informs the customer that it does not accept the order at this price and can make a new offer at the correct price. A rejection usually includes these points:

  • Clearly state the order number, date and affected item
  • Say clearly that the order is not accepted at this price and give the reason: an incorrect price
  • Refund amounts already collected and state the payment method and timing
  • If desired, an offer at the correct price with a link that starts a new order
  • Stay factual and friendly: the customer has usually done nothing wrong
Acceptance period and terms

Many shops specify in their terms and conditions within what period they accept an order. Such a period must not be unreasonably long or indefinite: under Section 308 BGB, clauses are invalid by which the user reserves unreasonably long or insufficiently specific periods for accepting or rejecting an offer (BGB). The terms also only become part of the contract if the shop refers to them when the contract is concluded and makes it reasonably possible to take note of them (BGB). Whether email texts, process and terms fit together should be reviewed before the sale week.

After acceptance: rescission under Section 119 BGB

Once the contract has been concluded, the shop is left with rescission. Section 119 (1) BGB allows it if the person making the declaration was mistaken about its content or did not intend to make a declaration with this content at all, and if it can be assumed that they would not have made it with knowledge of the facts and a sensible assessment of the case (BGB). German law calls the first case a mistake as to content and the second a mistake in the declaration: someone mistypes, writes the wrong figure or puts the comma in the wrong place.

For automated shops, one statement by the Federal Court of Justice is central: the falsification of what was originally declared correctly, on its way to the recipient, by software with an undetected defect is to be regarded as a mistake in the act of declaration (BGH, VIII ZR 79/04). According to this, it makes no difference whether someone mistypes or whether the error occurs during data transfer. The court also bases this on Section 120 BGB, under which a declaration transmitted incorrectly by the person or facility used for transmission can be rescinded under the same conditions as a mistake under Section 119 BGB (BGB). Because the automatic acceptance was based on the wrong price, the mistake continued into the declaration of acceptance (BGH, VIII ZR 79/04).

Where rescission does not work: the calculation error

Not every wrong price is a mistake in the declaration. If the shop set the price deliberately but calculated it incorrectly – for example by underestimating a margin or forgetting shipping costs – the error lies in the formation of intent. Such a hidden calculation error is, as a mistake in motive, generally not grounds for rescission, even if the incorrect calculation is based on errors in software used; the court expressly distinguishes the transmission error from this (BGH, VIII ZR 79/04). What matters, therefore, is where the error arose and whether this can be proven.

Error patternClassificationRescission under Section 119 BGB
Comma shifted during importMistake in the declarationUsually possible
Price falsified during data transferMistake in the declaration, as in the BGH notebook casePossible, confirmed by the BGH
Typo when maintaining data in the back endMistake in the declarationUsually possible
Net price in the gross price fieldDepending on the process, a declaration or calculation errorCase by case
Margin calculated too tightlyCalculation error, mistake in motiveGenerally not
Sale rule set deliberately, effect underestimatedRather a calculation errorGenerally not

Form and deadline: without undue delay, addressed to the customer

Rescission is effected by a declaration to the other party to the rescission (BGB), and in a contract that is the other contracting party, that is, the customer (BGB). It must be made without culpable delay after the shop has learned of the ground for rescission; the statute calls this without undue delay (BGB). In relation to an absent person, the rescission counts as timely if the declaration was sent without undue delay (BGB). The outer limit is ten years after the declaration of intent was made (BGB) – for pricing errors in a shop, in practice only the first deadline matters.

In the notebook case, the customer ordered on February 1, 2003, and the retailer declared rescission by letter dated February 11, 2003 (BGH, VIII ZR 79/04). In the same month, the retailer had become aware of several such transmission errors (BGH, VIII ZR 79/04). How much time “without undue delay” leaves in an individual case depends on the circumstances. Anyone who knows about the error and waits for days puts the rescission at risk; a short review of the affected orders does not conflict with the wording, as long as there is no culpable delay. A declaration of rescission usually includes these points:

  1. Identify the order clearly: order number, date, item and the price shown
  2. State expressly that the contract is rescinded because of a mistake. A mere “cancellation” leaves open what the shop is relying on
  3. Briefly describe the mistake: which price was intended, which was shown and how it happened
  4. Offer to unwind the transaction: refund and, if already delivered, return shipping at the shop's expense
  5. If desired, make a new offer at the correct price
  6. Send the declaration to the address given in the order and document the time and content

What applies after rescission

A legal transaction that has been effectively rescinded is to be regarded as void from the outset (BGB). Whatever has already been exchanged is unwound under the law of unjust enrichment: anyone who has obtained something without legal grounds must surrender it (BGB). In the notebook case, the retailer therefore demanded the return of the notebook in exchange for repayment of the purchase price (BGH, VIII ZR 79/04).

Rescission is not without consequences for the shop. Under Section 122 (1) BGB, it must compensate the damage the customer suffers by relying on the validity of the declaration, but not beyond the customer's interest in the validity of the declaration (BGB). What is compensated is therefore the reliance loss, not the advantage of the cheap purchase. The duty to compensate does not apply if the customer knew the ground for rescission or did not know it due to negligence (BGB). With an obviously shifted comma, this may play a role; a shop should not rely on it.

The notebook case shows how small these items can be: the notebook had been delivered for €245 plus €12.80 shipping costs (BGH, VIII ZR 79/04). The customer's objection that he was at least entitled to the shipping costs under Section 122 BGB only came in the appeal on points of law and was not considered for procedural reasons (BGH, VIII ZR 79/04). The customer did not owe damages for refusing to return the notebook, because the legal position on rescission was particularly unclear (BGH, VIII ZR 79/04).

Before acceptance

Decline the order, refund amounts collected and, if desired, make a new offer at the correct price. No rescission is needed.

After acceptance

Rescind without undue delay if there is a mistake in the declaration or as to content. Stop delivery as long as nothing has been shipped.

After shipping

Rescind and offer to unwind the transaction: goods against refund, return shipping at the shop's expense, keep the reliance loss in mind.

Price imports with plausibility checks

Legally, a pricing error can often be contained; economically, it still costs: emails, refunds, annoyed customers and, in an unfavorable case, goods that have left the warehouse at a fraction of the price. The second lever therefore sits in front of the shop, at the interface between ERP and online shop. There, every new price can be checked against simple rules before it goes live. How B2B prices get from the ERP into the shop and where deviations arise is covered in the article on customer prices from the ERP.

  • Zero-price lock: A price of zero or an empty price field does not go live automatically but stays blocked until someone checks it.
  • Deviation from the previous price: If the new price deviates from the previous one by more than a defined share, for example by more than 50 percent downward, it goes to an approval list instead of the shop.
  • Factor detection: If the new price is almost exactly a hundredth or thousandth of the old one, a shifted comma is more likely than a genuine price cut.
  • Net/gross check: If the new price almost exactly equals the old price divided by the tax factor, a net price in the gross field is the likely cause.
  • Floor from the purchase price: A sales price below the purchase price needs approval unless the item is expressly marked as part of a sale.
  • Format per source: Decimal separator, currency and price unit are defined per source and checked during import instead of being guessed.
price_check.py
from decimal import Decimal

MAX_DROP = Decimal("0.50")    # example value: cuts of more than 50 % go to review
VAT_FACTOR = Decimal("1.19")  # standard VAT rate for the net/gross check


def check_price(new, old, purchase=None, promo=False):
    """Returns "ok", "review" or "block"."""
    if new is None or new <= 0:
        return "block"                       # zero price or empty field
    if old and old > 0:
        ratio = new / old
        for factor in (Decimal("0.01"), Decimal("0.001")):
            if abs(ratio - factor) <= factor * Decimal("0.05"):
                return "block"               # comma probably shifted
        if abs(new * VAT_FACTOR - old) <= Decimal("0.02"):
            return "review"                  # net price in the gross field?
        if ratio < 1 - MAX_DROP:
            return "review"                  # large cut: needs approval
    if purchase and new < purchase and not promo:
        return "review"                      # below the purchase price
    return "ok"

The code is deliberately brief. A real interface adds thresholds per product group, an approval list with a four-eyes principle and a log that records which value arrived from which source and when. Restricting price changes in the back end to a few roles closes another source of errors; what that looks like in Shopware is described in the article on roles and permissions in the shop back end.

The log also helps in a dispute

If it comes to a dispute, the shop will usually have to show that there was an error in the declaration and not a miscalculation. An import log that shows the correct value from the ERP and the deviating value in the shop with a timestamp is a good basis for this. In the notebook case, the cause of the transmission error could no longer be determined, but it was established that several errors had occurred in the data transfer (BGH, VIII ZR 79/04).

If it happens anyway: the first hours

  1. Correct the price or take the item offline – in the shop, in the product feed for Google Merchant Center and on marketplaces that use the same price.
  2. Stop the automation – halt the handover of affected orders to the ERP and shipping so that no goods leave the warehouse before a decision is made.
  3. Identify affected orders – time window between import and correction, affected items, quantities and customer groups.
  4. Check which emails went out – which message customers received: only the acknowledgement of receipt or already an acceptance.
  5. Decide per order – deliver, decline (before acceptance) or rescind (after acceptance), in each case without delay.
  6. Document – secure the import log, timestamps, email texts and the declarations sent.

Not every order has to be reversed: with small deviations or few orders, delivering as a goodwill gesture can make more economic sense. Incidentally, a separate rule applies to orders by phone: an offer made there can only be accepted immediately (BGB).

Checklist before Black Week

  • Check email texts: does the first email only confirm receipt, or does it sound like an acceptance?
  • Align the terms: do they describe contract formation the way the shop technically works?
  • Define the moment of acceptance: separate order confirmation, shipping or receipt of payment – and document it
  • Activate checks in the price import: zero-price lock, deviation from the previous price, factor detection, floor
  • Define the approval path: who approves large price changes, and can this person be reached during the sale week?
  • Test sale prices in advance in a test system, including vouchers and volume discounts
  • Agree on an emergency process: who stops imports, who writes to customers, who handles the legal review?

If you are heading into Black Week with a freshly updated inventory system, you will find the checkpoints for the integration in the article on JTL-Wawi 2.x and the shop integration. And if you advertise struck-through prices during Black Week, you should also know the rules of the German Price Indication Ordinance on price reductions, explained in the article on strikethrough prices and discount advertising.

How we approach price imports

We develop price imports so that checks apply before a price appears in the shop: individually per product range, with an approval list and a log. We add these checks to existing integrations with SAP Business One, JTL-Wawi or PIM systems. In the shop itself, we align order statuses and email templates so that the acknowledgement of receipt and the acceptance are clearly separated; you define the legal wording with your legal counsel. For shops based on Shopware, we implement this directly in templates and processes.

Sources and studies

This article is based on the German Civil Code (Sections 119, 120, 121, 122, 142, 143, 145, 146, 147, 305, 308, 312i and 812 BGB) and the German VAT Act (Section 12 UStG) as published on gesetze-im-internet.de, on the judgments of the Federal Court of Justice of January 26, 2005 (VIII ZR 79/04) and October 16, 2012 (X ZR 37/12), and on the press release of the German Retail Federation (HDE) of November 17, 2025 on Black Friday and Cyber Monday. All information retrieved on October 14, 2026. This article does not replace legal advice on an individual case.

That depends on whether a contract already exists. As long as the shop has only confirmed receipt of the order, it can usually decline it; the customer's offer then expires (BGB). If the shop has accepted, the contract is concluded. Rescission then remains available if there is a mistake in the declaration or as to content (BGB).

Not necessarily. Section 312i BGB only requires confirming receipt of the order (BGB). But if the email sounds like an acceptance, it can be understood as one. In the BGH notebook case, an automatic email stating that the order was now being processed by the shipping department was enough (BGH, VIII ZR 79/04).

Without culpable delay after you have learned of the error (BGB). In practice, this means identifying the affected orders, drafting the declaration and sending it promptly. Waiting longer can put the rescission at risk.

Possibly the reliance loss, for example shipping costs paid in vain, limited to the interest in the validity of the declaration (BGB). If the customer knew about the error or should have recognized it, the duty to compensate does not apply (BGB). The shop does not owe the advantage of the low price.

Usually not. A calculation error in the formation of intent is generally not grounds for rescission; the court expressly distinguishes it from an error in transmission (BGH, VIII ZR 79/04). Which applies depends on where the error arose.

They cannot be ruled out entirely, but checks at the interface catch many typical errors: a lock for zero prices, an approval step for large deviations from the previous price, detection of shifted commas and a log for each import. We add such rules to existing integrations or build them into new ones.