Work · Analysis · 07

E-Commerce Return Rate Analysis

541,000 UK retail transactions read against Germany's 92 billion euro returns problem.

541,000Transactions
€92BGerman market framing
Type
Analysis
When
UCI Online Retail · 2026
Role
Sole analyst. Transaction-level analysis and segmentation.
Scale
541,000 transactions · UCI Online Retail

In plain language

Returns are treated as an annoyance in most retail analysis. In Germany they are closer to a structural cost: return rates are among the highest in Europe and free returns are near enough a legal expectation. This looks at 541,000 UK retail transactions to ask which categories, price bands and customer segments generate the most returns, and reads the answer against a market where that cost sits inside the margin rather than beside it.

The question

Which categories, price ranges and customer segments drive the highest return rates, and what does that imply for a market where returns are a margin structure rather than an edge case?

Which categories, price ranges and customer segments drive the highest return rates, and what that implies for a market where returns are a structural cost rather than an edge case.

Framing

The dataset is UK retail. The question is German: German e-commerce runs one of the highest return rates in Europe, and free returns are close to a legal expectation. A return rate that is an annoyance in one market is a margin structure in the other.

Approach

Transaction-level analysis across 541,000 rows, segmenting by product category, price band and customer purchase history, with returns identified from negative-quantity records against their originating orders.

Status

This one is deliberately listed as an analysis rather than a full case study. The figures live in the repository; the write-up here is a summary rather than a reconstruction, and I would rather say so than pad it out.

How it is put together

Left to right, the path a request or a record takes through the system.

  1. 01

    Source

    • UCI Online Retail
    • 541,000 transactions
    • UK retail
  2. 02

    Identify returns

    • Negative-quantity records
    • Matched to originating orders

    The step that decides whether anything downstream is right.

  3. 03

    Segment

    • Product category
    • Price band
    • Customer purchase history
  4. 04

    Frame

    • Return rate by segment
    • Read against a 92 billion euro market

    UK data, German question.

Returns are not a separate feed. They are negative-quantity records that only mean anything once matched back to the order that produced them.

What happens, step by step

In plain language, in the order it happens.

  1. Take transaction-level retail data

    541,000 rows of UK online retail, at individual transaction granularity rather than pre-aggregated.

  2. Find the returns

    Returns appear as negative-quantity records. They only become meaningful once matched back against the order that produced them. An unmatched negative row is not a return, it is an adjustment.

  3. Segment three ways

    By product category, by price band, and by customer purchase history, so the question can be asked of each independently.

  4. Read it against the German market

    The dataset is UK. The question is German: a return rate that is an annoyance in one market is a margin structure in the other, against a returns problem measured in the tens of billions of euros.

Decisions, and what they cost

Every choice worth recording has a road not taken. Both are here.

  • Match returns to originating orders

    instead ofCounting negative-quantity rows

    Unmatched negatives include adjustments, corrections and cancellations that are not returns at all. Counting them inflates every rate downstream, and the error is invisible in the output.

  • Frame a UK dataset against a German question

    instead ofPretending the data is German

    The behaviour is transferable, the market economics are not. Saying which is which keeps the analysis useful without overstating what the data can support.

  • List this as an analysis, not a full case study

    instead ofPadding the write-up to match the others

    The figures live in the repository and the write-up here is a summary rather than a reconstruction. Saying so is better than inflating it into something it is not.

What came out of it

  • 541,000 transactions analysed at line level, with returns identified against their originating orders.
  • Segmented by category, price band and customer history.
  • Framed against German market economics, where returns are structural cost rather than an edge case.

Still open

  • This is the thinnest write-up on the site and it is deliberately labelled as such. The repository carries the figures.
  • A German transaction dataset would let the framing become a finding instead of a reading.

Built with

  • Python
  • pandas
  • Cohort analysis
  • Business intelligence