In the conversations I have with fulfillment operators, one recurring pattern keeps coming back. Excel as the main billing tool. A price list that was last updated several years ago. A margin that “somehow drops”, but nobody knows exactly where. These aren’t bad operators. These are good operators with pricing structures where a dozen decisions made early on have been eating into margin for years. Each mistake individually costs a few percent. Together they can eat up almost the entire profit.
This article is about the five mistakes I see most often in fulfillment pricing. With the math — how much each one actually costs — and ways to fix them. This isn’t an academic list, these are mistakes I hear about.
If you’ve already read the article on five billing models, this piece is a practical follow-up — after choosing the model, there’s a whole series of execution decisions where it’s easy to slip up.
TL;DR
- No returns line in pricing often costs –20-30% of real margin on a fashion client (returns are 20-40% of volume, each requires warehouse labor).
- Storage per pallet location with mixed SKUs instead of per CBM — the difference can reach 40-60% for clients with half-empty pallets.
- No price indexation in a multi-year contract — operator costs rise ~8% annually, the client still pays rates from 3 years ago. Margin goes red.
- No transparency on courier rates — the issue isn’t the operator’s markup (that’s justified), it’s the feeling of something being hidden. The client asks InPost directly, loses trust.
- No weight tiers for international shipments — the courier adds 2-4 PLN per 8+ kg parcel to Germany, the operator covers it out of pocket.
Mistake #1: No returns in the pricing
The operator focuses on outbound orders. Returns are “an extra” — we’ll take them in, check them, put them back in stock. The return rate is often missing from the pricing list entirely, or it’s symbolic.
The problem: in fashion, returns are 20-40% of sales volume. In electronics 5-15%. In cosmetics 3-5%. Every return requires real warehouse labor — intake, inspection, restocking or disposal decision, re-entering into the system.
The math — a simulation example:
Suppose a fashion client, 1000 orders per month, 5 PLN margin per order. On the surface the operator earns 5000 PLN per month from this client.
| Line item | Amount |
|---|---|
| Revenue from 1000 orders (5 PLN margin) | +5000 PLN |
| 300 returns × 4 PLN real handling cost | -1200 PLN |
| Real margin | 3800 PLN (-24%) |
The operator thinks they earn 5000 PLN, they actually earn 3800 PLN. The difference quietly flows into operating costs that nobody looks at in the Excel sheet. The exact numbers depend on the client profile, but the direction of losses is constant — if you don’t charge for returns, you eat margin at their cost.
How to fix it: add returns to the pricing as a separate line. Market rate is 50-150% of the pick&pack rate per return. Two billing models (flat rate per return or return + SKU surcharge) cover 95% of cases.

Mistake #2: Storage per pallet location with mixed SKUs — not by choice, but for lack of an alternative
Most operators in Poland bill storage per pallet location. Not because it’s a conscious decision after analyzing client profiles, but because in Excel you can’t reasonably bill in other units. CBM requires knowing the volume of every SKU and aggregating it in real time — without a system it’s practically unmaintainable.
The problem starts when the client has mixed SKUs and pallets are often half-empty. The operator charges for pallets the client doesn’t actually use — the client feels they’re paying for empty space. Sooner or later they bring it up or start looking for a cheaper operator.
Per pallet location makes sense for homogeneous pallets with palletizable goods. Per CBM (cubic meter) makes sense when the client has mixed SKUs and pallets are often heterogeneous.
Red Stag in their 3PL pricing guide shows the concrete math: billing per CBM instead of per pallet location can lower storage cost by around 40% for clients with many SKUs. That’s not an extreme, that’s a standard difference for mixed assortment.
Simulation showing the scale:
Suppose a client with sports accessories — 180 SKUs, pallets usually filled to 60-70%. The operator was billing per pallet location.
| Model | Calculation | Amount |
|---|---|---|
| Per pallet location | 45 pallets × 50 EUR | 2250 EUR/month |
| Per CBM | 28 m³ × 30 EUR | 840 EUR/month |
| Difference | 1410 EUR/month (-63%) |
The numbers depend on the specific client of course. The point is the mechanism — with mixed pallets the client pays for space they don’t use. If the operator gives them CBM, the client sees they’re getting fair billing. Often the strengthened trust lets the operator negotiate higher rates on other line items (pick&pack, value-added services) — and end up earning more overall, despite lower storage revenue.

In FulBill each client can have a different storage model (per unit, per location, fixed fee, per CBM), picked independently from the rest of the pricing. Changing the model is a few clicks, not a new spreadsheet.
Here’s what storage billing looks like in both models in FulBill — two examples from two different clients, each showing the day-by-day accrual mechanism:

Per pallet location: the client pays for the whole pallet regardless of how full it is.

Per CBM: the system calculates actually occupied volume (m³) every day and multiplies by the daily rate.
Mistake #3: No price indexation
A pricing structure signed in 2022 at 5 PLN per order. It’s 2026. According to the Polish stats office (GUS), average wages in “transport and warehousing” rose during that time by around 30-35%. Energy costs went up 25-50% depending on the contract. Packaging material prices went up by around 15-25%.
The operator still bills the client at 5 PLN. The margin today is dramatically lower than at the moment the contract was signed — in extreme cases negative.
This is a situation I hear about often. Everyone knows “we have to raise prices”, but nobody wants to have that conversation with the client. After two or three years it compounds.
Simulation of the impact of no indexation:
Suppose: the client stocks a constant amount, ships 500 orders per month, pick&pack rate is 5 PLN. Operator costs rise in line with wage trends in logistics (~8% annually, per published Polish stats office data).
| Year | Cost to fulfill an order | Operator margin |
|---|---|---|
| 2022 | 4.00 PLN | 1.00 PLN (500 PLN/month) |
| 2023 | 4.32 PLN | 0.68 PLN (340 PLN/month) |
| 2024 | 4.67 PLN | 0.33 PLN (165 PLN/month) |
| 2025 | 5.04 PLN | -0.04 PLN (-20 PLN/month) |
| 2026 | 5.44 PLN | -0.44 PLN (-220 PLN/month, loss) |
In 2026 the operator is subsidizing this client from the margin of others. The client doesn’t know about it, the operator stopped looking at the actual numbers long ago. As long as you work in Excel, this trend stays invisible — because nobody analyzes margin per client over time. The numbers in the table are an illustrative example, but the mechanism and direction of losses are real.
How to fix it:
- Write an annual indexation clause into the contract (e.g. tied to the logistics sector wage index — GUS publishes quarterly data)
- Or simpler: annual indexation of 5-7% without specific justification
- Or even simpler: pricing review every 12 months with renegotiation possible by both parties
Any of these is better than “we signed at 5 PLN and we’ll leave it there”.
Mistake #4: No transparency on courier rates
The operator writes in the pricing “shipping at market rates” or gives one bundled rate for domestic shipping. The client doesn’t know what the operator actually pays the courier and what’s added as markup.
The operator’s negotiated rates are genuinely better than what a single e-commerce store gets — the operator aggregates volume from many clients and has negotiating power. This is one of the concrete economic arguments for fulfillment. The operator’s margin on shipping is legitimate and justified.
The problem isn’t the markup. The problem is the lack of transparency. At some point the client asks InPost directly about a rate, notices the difference, and starts suspecting the operator of foul play. From the client’s perspective it looks like a hidden fee.
Better approach:
Show the courier pricing directly — the client sees that InPost costs the operator 10 PLN, for example, and the price list shows 15 PLN. Five PLN is handling, label generation, system integration. The client understands. They don’t feel cheated.

In FulBill the courier pricing is set separately per client — each client sees their own pricing, independent of what you’ve negotiated with the courier. You can show the rates directly, you can add a handling markup. The most important thing — the client sees what they pay and what for.
Mistake #5: No weight tiers for international shipments
The client ships a 12 kg parcel to Germany. The operator charges the standard small-parcel rate, because the pricing doesn’t distinguish weights. The courier adds an oversize surcharge, the operator covers the difference out of pocket.
It sounds like a small thing, but with clients selling internationally it compounds fast. Polish e-commerce companies increasingly ship to DE, CZ, SK, some go deeper into Europe. Each market has its own quirks: in Germany weight-tiered pricing is standard, in UK there are customs fees on top (post-Brexit), in Scandinavia fuel costs are rising.
Simulation showing the scale:
Suppose a client shipping heavier parcels (average 8 kg), 30% of sales to Germany, 200 parcels to DE monthly. If the pricing has no weight tiers, the operator has to cover the courier’s surcharges for exceeding standard weight out of pocket — for DPD or DHL that averages 2-4 PLN per parcel.
| Scenario | DE parcels/month | Margin/loss |
|---|---|---|
| Pricing without weight tiers (operator covers ~3 PLN/parcel) | 200 | -600 PLN/month |
| Pricing with weight tiers (client pays proportionally to weight) | 200 | +0 PLN (neutral) |
600 PLN per month is 7200 PLN per year — from just one client. Multiply by the number of clients shipping heavier parcels abroad. It becomes an amount you can’t ignore. The numbers are illustrative, but the loss mechanism — real.
How to fix it:
- Write weight tiers into the pricing (e.g. up to 5 kg, 5-10 kg, 10-20 kg, over 20 kg) with different rates
- Separate rates for different destination countries (PL, DE+CZ+SK, rest of EU, non-EU)
- For regular service to a specific market — negotiate a separate courier contract for that direction
Wrap-up
Five mistakes, each one costing a few percent of margin, together they can eat most of the profit. All of them appear primarily at operators who bill in Excel — because the spreadsheet won’t show you that you’ve been subsidizing a specific client for the second year in a row. To see those numbers you need a system that pulls operations, calculates over time, and shows margin per client.
The most important thing to take away from this article: your pricing isn’t a document you approve once and leave on the shelf. Pricing is a live process — review every 12 months, alignment with the real client structure, cost indexation. Operators who do this grow. Those who “signed the contract and walked away” slowly bleed out.
Q&A
How often should I review my pricing structure? Industry standard is every 12 months. In high-inflation periods (like 2022-2023) you can go more often, every 6 months. It’s worth writing the review clause into the contract so the conversation feels natural, not like a crisis.
Can I raise prices without the client’s consent? Only if the contract allows for it (indexation or review clause). Without that clause renegotiation and mutual agreement are required. That’s why the indexation clause is so important.
Per CBM sounds reasonable — can I change the model mid-contract with a client? Yes, but it requires an addendum to the contract. Best to propose it during a pricing review with good arguments — e.g. “you’re paying for 45 pallets now, on CBM you’d pay for 28 m³ and it’d come out cheaper for you”. The client usually agrees immediately.
Do returns really cost as much as pick&pack? In practice — often more. A return requires intake, inspection, decision about the item’s condition, re-entering it into the system, sometimes cleaning/repackaging. The market rate is 50-150% of the pick&pack rate.
How do I talk to a client about a price increase? Concrete data, not generalities. Show that labor costs in the logistics sector rose by X% (the Polish stats office publishes this), that your energy costs went up by Y%, that the last increase was Z years ago. A client who sees numbers usually accepts. A client you tell “I have to raise prices because everything is getting more expensive” — looks for a cheaper operator.
What next
If you see that one of these mistakes applies to your pricing — you know what to do. The difficulty isn’t understanding the problem, it’s the change of state — getting out of Excel, recalculating, renegotiating, setting things up fresh.
If you run a fulfillment operation and want to see how FulBill can make it easier — write to support@fulbill.pl. I’ll show you the system in a live 20-30 minute call, no pitch.
More about the tool itself — fulbill.com.
Related:
About the author: Norbert Sobala. For six years I’ve been working with Baselinker — mainly with e-commerce stores, recently more and more with fulfillment operators. FulBill is my billing system for operators who want to get out of Excel.