A basket is full, the customer is on the final step, and there a shipping line appears that was nowhere to be seen on the product page. What happens next is not a design question but the result of a calculation many shops have not made in the first place. Shipping costs are both the most frequently named reason for abandonment and the position where margin quietly disappears in online retail: once the segment of pure browsers is taken out, extra costs from shipping, tax and fees lead the abandonment reasons of US online shoppers with 40 percent (Baymard Institute). This article sorts the common models, derives the threshold for free shipping from basket distribution and contribution margin instead of guessing it, and names the places in the online shop where the information has to appear under German law.
Why the shipping line decides the abandonment
The order of magnitude is well documented: across 50 evaluated studies the average documented cart abandonment rate is 70.22 percent (Baymard Institute). On its own that value carries little, because in online retail a basket is also used as a bookmark, a price comparison and a wish list. Only the breakdown of reasons becomes meaningful. 42 percent of the US online shoppers surveyed stated that they had only been browsing and were not ready to buy (Baymard Institute). Once that segment is taken out, extra costs from shipping, tax and fees lead the remaining distribution with 40 percent; 12 percent named that they could neither see nor calculate the total order cost up front (Baymard Institute). The survey covers US online shoppers, but the ranking of reasons typically matches what German shops measure in their own funnels.
These two values contain two different problems, and they call for different answers. One part is a pricing question: the amount is too high in relation to the basket. The other part is a display question: the amount arrives too late. Anyone who works on both with the same lever, usually a flat reduction or free shipping above some round amount, pays for the display question out of contribution margin. The order that typically proves out is a different one: repair the display first, then calculate, then adjust the price. The first step costs development time once, the third costs in every single order. How to measure the remaining friction in the ordering path is set out in the article on checkout optimization.
The frame in which this decision is taken keeps growing. In courier, express and parcel services the shipment volume in Germany rose by 5.54 percent to 4.73 billion items in 2024, while revenue rose by around 5.01 percent to 27.29 billion euros (Bundesnetzagentur). Around 95 percent of parcel volumes fell to the business customer segment (Bundesnetzagentur). Two things follow for the individual shop. Shipping is a densely priced volume market in which single cents per shipment grow into noticeable amounts over an annual volume. And your own negotiating position rests on volume and on the predictability of handovers, not on the goodwill of the carrier.
A shipping cost model links three quantities, and none of them can be derived from the other two. Shipment cost: what pickup, carriage, surcharges, packaging and packing time actually cause per parcel. Basket distribution: how orders spread across value, measured in quantiles and not by the mean. Contribution margin: what is left per order after cost of goods, payment fees and the returns share. Anyone who does not know one of the three is not choosing a model but guessing.
The models and what they fit
The selection is manageable, and most shops need two of them. The flat rate is a fixed amount per order, regardless of content and quantity. It is easy to explain, easy to check and, in a range with a narrow weight and value band, also defensible commercially. As soon as the range spreads out, a cable next to a workshop shelving unit, the flat rate subsidises heavy shipments out of light ones. The shop becomes expensive for small parts and noticeably cheap for bulky goods, and orders shift in exactly that direction. The weight tier maps the cost driver of delivery most directly, but it requires maintained shipping weights on every article, packaging included.
The value tier links the shipping price to the basket value. Customers accept it well because the amount grows with the order, and it is at the same time the model with the widest spread between revenue and actual cost: a light, expensive article carries the shipping several times over, a heavy, cheap one does not carry it at all. The zone tier adds the destination to each of these models, that is domestic, EU zone, third country and islands. Finally, the quantity tier is the answer for ranges in which quantity rather than weight determines volume, for example pack sizes in wholesale. The overview below sorts the models by fit, calculation logic and typical weak point.
| Model | Fits | Calculation logic | Typical weak point |
|---|---|---|---|
| Flat rate | narrow weight and value band, one warehouse, one country | fixed amount per order | cross-subsidy from light to heavy shipments |
| Weight tier | mixed range with maintained shipping weights | tier price by total shipment weight | wrong or missing weights on articles and packaging |
| Value tier | high-value, light goods with a stable margin | tier price by basket value | revenue drifts away from actual cost |
| Zone tier | shipping across country and island borders | surcharge or separate tier per destination zone | zone list ages, special cases missing |
| Quantity tier | wholesale, pack sizes, pallets | price by number of units or cartons | mixed orders of single item and pallet |
| Free above value | all models, as an overlay | no shipping price above a set basket value | also applies to orders that would have come anyway |
In practice this usually results in a combination: a base tier by weight or value, zones above it, surcharges above those and, at the very top, the threshold for free shipping. The decisive question is therefore no longer which model is chosen but in which order the rules apply and which rule overrides another. That order belongs in writing and backed by test cases before it is entered into the system. Where it exists only in the head of the person configuring it, the first special case - a pallet together with a small part - is the point at which the shop either charges too little or loses an order. These surcharges belong in the matrix from the outset:
- Bulky goods and freight: above a certain length, girth or weight the shipment falls out of the parcel tariff; how to map that in the shop is described in the article on freight shipping and bulky goods.
- Islands and remote zones: German islands, Austrian mountain zones and remote postcodes have their own tariffs, which want to be maintained as a zone list.
- Dangerous goods and batteries: lithium cells, sprays and chemicals require labelling, dedicated packaging and, as a rule, a surcharge of their own.
- Timed delivery, notification and two-man handling: services the customer explicitly chooses and that belong on a separate line.
- Cold chain and fresh shipping: insulated packaging and coolants are material costs per shipment, not overheads.
- Cash on delivery and payment fees: these do not belong in the shipping line but as a separate item in the basket.
What a shipment really costs
The revenue side of the market gives a rough bearing: in the business customer segment, revenue of 15.29 billion euros in 2024 was matched by around 3.85 billion shipments, which works out at roughly 3.97 euros per shipment (Bundesnetzagentur). That is an average across all contracts, sizes and volume structures and is not suitable as a target for your own calculation. As a plausibility check it works well: anyone paying considerably more per shipment usually has a volume or a terms issue, and anyone using a considerably lower figure in their own model has probably left out surcharges, packaging or returns.
The full cost of a shipment consists of more than the freight price. It includes the base price under contract, the surcharges for bulky goods, islands, dangerous goods or timed delivery, the packaging material including cushioning, the picking and packing time, insurance or excess, the pro rata effort for tracking and enquiries, and the returns share of the respective product group, because a return generates a second carriage and an inspection in the warehouse. Anyone who writes these components down once per product group has the basis for every model. Anyone who does not want to collect the shipment data by hand pulls it back into the merchandise system through the shipping interfaces.
<?php
// Contribution margin of an order after shipping and returns cost.
// Every item stays visible on its own so that it stays maintainable on its own.
final class ContributionMargin
{
public function perOrder(Order $o, ShippingTariff $tariff): float
{
$grossProfit = $o->netGoodsValue() - $o->costOfGoods();
$shipment = $tariff->basePrice($o->zone(), $o->shippingWeight())
+ $tariff->surcharges($o->attributes())
+ $tariff->packaging($o->cartonSize())
+ $tariff->packingTime($o->lineItems());
$revenue = $o->chargedShippingCost();
$returns = $o->returnRate($o->productGroup()) * (
$tariff->returnFreight($o->zone(), $o->shippingWeight())
+ $tariff->inspectionEffort($o->productGroup())
);
return $grossProfit + $revenue - $shipment - $returns - $o->paymentFees();
}
} The breakdown is deliberately granular. What matters is the separation between what the customer pays and what the shipment causes. Keeping both in a single figure is the most common reason why a shop knows its shipping cost ratio but not its contribution margin per shipment. The returns share belongs per product group and not as a house average: clothing and technical small parts typically sit far apart, and a house average shifts the threshold in both directions at once. Anyone who wants to work on that rate will find the levers in the article on returns management.
A free shipping threshold copied from a competitor transfers their range, their margin and their shipment costs onto your own shop. Deriving it means: measure the basket distribution, form candidate values, offset the contribution margin, and re-measure the result after three months.
Deriving the threshold instead of guessing
The free shipping threshold is the most effective and at the same time the most expensive setting in the model. Effective, because it pulls orders below the threshold upwards. Expensive, because it applies to every order above the threshold, including those that would have come anyway. That is why a round number taken from a competitor is not a derivation but a bet on someone else's range. The derivation starts with the distribution of your own basket values, measured in quantiles rather than by the mean: a single large order lifts the mean, while the median stays where it is. Four queries are enough to make the distribution in your own data visible:
The values in the sample output come from a test data set and stand for the procedure, not for a recommendation. The sort order matters: a query with a limit but without an explicit order returns an arbitrary row, and with a single key figure hardly anyone notices. The period matters too. It has to be long enough that promotions and seasonality do not dominate, and orders from test runs, staff purchases and key account contracts with their own terms belong out of it beforehand. Otherwise you measure your own organisation rather than the market.
The candidate set can be read off the quantiles. A threshold below the median gives away shipping revenue on orders that reach that value anyway. A threshold well above the upper quartile reaches so few orders that it barely works as an incentive and only clutters the display. The usable range typically lies between the median and the upper quartile, and within that range the recalculation decides. Two or three values come into question as candidates, and each is then held against the contribution margin individually. The path there can be walked in six steps:
- Pull the orders of a full twelve-month period and exclude test runs and special terms.
- Determine the median, the upper quartile and the distribution in value classes of equal width.
- Set two or three candidate values between the median and the upper quartile.
- For each candidate, determine the share of orders in the window below it, that is those that could be lifted by the threshold.
- For each candidate, offset the additional contribution margin of the lifted orders against the shipping revenue lost on the orders already above it.
- Choose the candidate whose balance carries, check it per product group and set the date for the re-measurement straight away.
The counter-check is a simple balance. On the credit side sits the additional contribution margin of the orders lifted by the threshold: the value difference multiplied by the gross profit rate, less the shipping revenue now forgone on those orders. On the debit side sits the shipping revenue lost on all orders that would have exceeded the threshold anyway. The threshold carries when the credit side covers the debit side. This calculation turns out differently per product group, because gross profit rate and shipment costs differ. That is precisely why a single threshold across a broad range is, as a rule, a cross-subsidy that has not been quantified.
Mean instead of quantile: a single large order lifts the mean by more than the threshold will ever bring in. Threshold below the median: the majority of orders sit above it anyway, and the shop gives away shipping revenue for nothing in return. Threshold as a permanent state: tariffs, range and baskets shift; without a date for the re-measurement a number stays in place whose basis has long since changed.
Where the information has to appear by law
The duties are clear and spread across the entire ordering path. Under section 6(1) no. 2 of the German Price Indication Ordinance (PAngV), distance selling offers must state whether freight, delivery or shipping costs or other costs are charged in addition; under subsection 2 the amount must be stated where those costs can reasonably be calculated in advance. This is the point at which the widespread wording plus shipping costs, with nothing further, falls short: where the amount is calculable it belongs stated, and a link to an easily reachable page with the full tariff is the usual way of getting there.
Where additional freight, delivery or shipping costs or other costs are charged, their amount must be stated to the extent that those costs can reasonably be calculated in advance.
Section 6(2) of the German Price Indication Ordinance (PAngV), translated from the German original
Before the contract is concluded the information duty from Article 246a section 1(1) sentence 1 of the Introductory Act to the German Civil Code (EGBGB) is added. Number 5 requires the total price including all taxes and duties; number 7 additionally requires all freight, delivery or shipping costs and all other costs arising on top of it - and, where those costs cannot reasonably be calculated in advance, the fact that such additional costs may arise. That also settles the case of a freight surcharge that is not yet known: it may remain open, but it may not be concealed.
In the ordering process it becomes concrete. Section 312j(1) of the German Civil Code (BGB) requires a clear and unambiguous statement, at the latest when the ordering process begins, of whether delivery restrictions apply and which means of payment are accepted. Subsection 2 requires that, among other things, the total price and the shipping costs be made available clearly, comprehensibly and in a prominent manner immediately before the customer places the order. In practice this means: the shipping line belongs in the same visible area as the button that triggers the order - not on a line that appears only after scrolling, and not behind an accordion.
In the case of a consumer contract in electronic commerce that obliges the consumer to make a payment, the trader must make available to the consumer the information under Article 246a section 1(1) sentence 1 numbers 1, 5 to 7, 8, 14 and 15 of the Introductory Act to the German Civil Code, immediately before the consumer places the order, clearly, comprehensibly and in a prominent manner.
Section 312j(2) of the German Civil Code (BGB), translated from the German original
One trap sits in section 312a(3) BGB. An agreement on a payment going beyond the agreed remuneration for the main obligation can only be made expressly, and in electronic commerce it does not become part of the contract if the trader brings it about through a default setting. A pre-selected express delivery, a pre-ticked shipping protection, a preset timed delivery for a surcharge: in a default setting these items do not become part of the contract, and the amount has to be refunded. The selection belongs unticked in the checkout, and the customer makes it themselves. What else such default settings do is set out in the article on dark patterns in the checkout. Four places in the ordering path carry the information.
Product page and listing
A note that shipping costs are charged, with a link to the full tariff; where the amount is calculable, the amount itself.
Basket
Shipping costs on their own line as soon as destination country and basket are known, plus the distance to the free shipping threshold.
Order summary
Total price and shipping costs prominent and within sight of the order button, without an accordion and without a jump.
Delivery restrictions
Visible at the latest when the ordering process begins: which destinations are served and which means of payment are accepted.
Implementation: matrix, rules, display
The shipping matrix belongs in the shop as a maintained data set, not in the program code as a special case. What exists as data can be changed, checked and versioned commercially; what sits in code requires a development cycle for every price change. In Shopware, shipping methods, availability rules and price matrices carry most of this out of the box. For surcharges tied to your own article attributes, the missing part is built as custom development inside the existing system rather than as a second tool alongside it.
{
"order": ["exclusion", "base_tier", "zone", "surcharges", "threshold"],
"shipping_methods": [
{
"name": "Parcel domestic",
"active": true,
"zones": ["DE"],
"calculation": "weight_tier",
"tariff_sheet": "tariffs/parcel-de.csv",
"surcharges": ["island", "dangerous_goods"],
"free_from": "threshold.parcel_de",
"excluded_for": ["bulky", "pallet"]
},
{
"name": "Freight",
"active": true,
"zones": ["DE", "EU"],
"calculation": "quantity_tier",
"tariff_sheet": "tariffs/freight.csv",
"surcharges": ["notification", "two_man", "island"],
"free_from": null,
"excluded_for": []
}
],
"display": {
"product_page": "note_with_tariff_link",
"basket": "amount_and_distance_to_threshold",
"order_summary": "amount_prominent"
}
} What matters is the evaluation order and its documentation. An exclusion overrides every tier, a zone overrides the base tier, a surcharge adds, and the threshold applies last and only to the items it is meant to cover. Every matrix needs a table of test cases with expected results: light small article, heavy single article, mixed basket with bulky goods, order just below and just above the threshold, delivery to an island, delivery to another member state. That table is the difference between a matrix you can change and one nobody touches any more. For the display in the shop this results in a short list of requirements:
- Early rather than late: the note about shipping costs belongs on the product page, the amount in the basket at the latest, as soon as the destination country is known.
- Distance to the threshold: a line naming the amount still missing for free shipping works exactly where the order would otherwise stall.
- Delivery time alongside: price and date are judged together; how to calculate the date cleanly is described in the article on the delivery date on the product page.
- Ask for the destination early: without a destination country the figure is an estimate; a country selector before the basket solves that without registration.
- Name the surcharges: bulky goods, island and dangerous goods surcharges belong on their own line, not folded into a lump sum.
- Data from the source: tariffs, zones and shipment data run into the shop through the shipping integration, so that a tariff change does not have to be maintained by hand.
Split shipments, part deliveries and back orders
A basket is not the same thing as a shipment. As soon as part of the goods comes from a second warehouse, directly from the supplier or only later, two or more shipments arise and with them two or more shipment costs - while the customer has seen one shipping price. The clean way is an explicit rule: the customer pays shipping once per order, and part deliveries arising from your own operations are at the trader's expense. What the customer triggers themselves, for example the wish to have the available part sent immediately, can carry a second item as long as it is named beforehand and expressly chosen.
In arithmetic terms this rule weighs less when stock and availability are correct. An order assumed to be fully available that then splits into three shipments is first a stock problem and only then a shipping cost problem - the article on year-end stocktaking describes how to establish stock quality before the main season. In wholesale the number of shipments can additionally be steered through the order structure: anyone who maintains pack sizes and minimum order quantities properly gets fewer splits and more predictable carton sizes - in a B2B shop that is a bigger lever than any fine tuning of the tier.
Measuring what the threshold does
After the changeover the measurement decides, not the gut feeling. Four key figures are enough to start with: the shipping cost ratio, that is charged shipping revenue in relation to actual shipment costs; the contribution margin per shipment after the returns share; the distribution of basket values in the window below the threshold, from which the lift can be read; and the abandonment rate in exactly the step in which the shipping line first becomes visible. All four belong to the same period and the same exclusions, otherwise you compare two different populations and call it a trend. Before going live, the following checklist is worked through:
- Shipping weights and carton sizes maintained on all active articles, packaging included.
- Zone list complete, islands and special postcodes included.
- Evaluation order of the rules documented and backed by test cases.
- Shipping costs visible on the product page, in the basket and in the order summary, without an accordion.
- No chargeable additional service pre-selected.
- Delivery restrictions and accepted means of payment named at the start of the ordering process.
- Threshold derived from your own basket distribution and offset per product group.
- Date for the re-measurement set and a responsible person named.
Running shipping costs as a control variable
Shipping costs are not a setting that is made once and then forgotten. They are a control variable with two sides: they help decide whether an order comes about at all, and they decide what is left of it. Treating them that way calls for three things - a matrix that can be maintained commercially; a threshold derived from your own data rather than copied; and a fixed date on which both are held against current tariffs and the current basket distribution.
The most common state in shops that have grown over time is a different one: a flat rate from the founding years, a threshold from a promotion nobody reversed, and a range that now runs from a screw to a shelving system. The first step out of it is not a rebuild but a measurement - shipment costs per product group, basket distribution, contribution margin per shipment. After that the decision is a calculation and not an opinion. Anyone who wants this path set up properly once will find a conversation the shorter route compared with several attempts during live operation.
Abandonment reasons and cart abandonment rate: Baymard Institute, 50 Cart Abandonment Rate Statistics 2026. Shipment volumes, revenues and segment shares in the German parcel market: Bundesnetzagentur, Tätigkeitsbericht Post 2024/2025. Legal bases: section 6 of the German Price Indication Ordinance, Article 246a section 1(1) sentence 1 EGBGB, section 312j(1) and (2) BGB, section 312a(3) BGB. This article does not replace legal advice in an individual case.
That number cannot be stated in general; it follows from your own basket distribution. As a rule a value between the median and the upper quartile of order values is usable: below the median the threshold gives away shipping revenue on orders that reach the value anyway, and well above the upper quartile it reaches too few orders to work as an incentive. Within that range the counter-calculation decides: the additional contribution margin of the lifted orders has to cover the shipping revenue forgone on the orders already above the threshold.
Under section 6(1) no. 2 of the German Price Indication Ordinance, distance selling offers must state whether freight, delivery or shipping costs are charged in addition; under subsection 2 the amount must be stated where it can reasonably be calculated in advance. In practice this means: the note belongs on the product page, and where the amount is calculable it belongs stated or made accessible through an easily reachable link to the full tariff.
Yes, provided the surcharge is named before the contract is concluded. Article 246a section 1(1) sentence 1 no. 7 EGBGB requires all additional freight, delivery or shipping costs and all other costs - and, where they cannot reasonably be calculated in advance, a note that such costs may arise. A freight surcharge that is only fixed after measuring may therefore remain open; it may not be concealed.
No. Section 312a(3) BGB requires an express agreement for every payment going beyond the remuneration for the main obligation; in electronic commerce it does not become part of the contract if the trader brings it about through a default setting. Pre-selected express delivery, pre-ticked shipping protection or a preset timed delivery for a surcharge therefore do not become part of the contract, and the amount has to be refunded.
The shipping price may differ per destination zone, because the costs differ. What is not permitted is tying access to the offer or to the ordering process to the customer's origin. Anyone delivering only within Germany states that as a delivery restriction under section 312j(1) BGB at the latest when the ordering process begins. The distinction in detail is set out in the article on the Geo-blocking Regulation.
A fixed date once a year makes sense, plus an additional trigger on every tariff change, every larger range extension and every change to payment or returns costs. Three quantities are reviewed: the shipment costs per product group, the basket distribution of the past twelve-month period and the contribution margin per shipment. If the median shifts noticeably, the threshold belongs adjusted, otherwise it works against your own margin.