EPR · reporting

How to calculate packaging weight for EPR from Shopify order data

Updated 6 August 202610 min readSellers who are registered for EPR and now have to declare volumes

Registration gets written about constantly. The step after it does not: once you are registered, the scheme wants volumes, and in Germany that means kilograms of packaging by material. Nothing in your store holds that number. Shopify knows what a parcel weighs for shipping. It does not know that the parcel was 340 grams of cardboard, 12 grams of plastic tape and a 4 gram paper label. This guide builds that dataset from the parts you do have.

1Registernational registry2Licenseand pay fees3Reportvolumes yearly

This picks up after you have established that you owe EPR somewhere. If you are not there yet, start with do you need to register for EPR, because the answer changes which countries you have to do any of this for.

What a declaration actually asks for

Start with what Germany actually asks for, because it is the clearest published example and it is not what people expect. A LUCID data report has no SKU column. It consists of the reporting period, the name of the system you signed a participation agreement with, and then the material types with the mass placed on the market per material type, expressed in kilograms to three decimal places.

That is the whole shape of it. Paper, paperboard and cardboard; plastics; ferrous metals; glass; and so on, each with one number beside it. There is no product name, no SKU column, no order id.

Do not read that as the universal format. Other schemes structure declarations differently, and France's Citeo, for instance, works partly from consumer sales units and sector rather than mass alone. Treat weight by material as the underlying dataset every scheme is built on, then map it to whatever each country's form actually asks for.

So why build a per-SKU dataset at all?

Because SKU level is where the calculation happens and where an audit lands. The submitted figure is a total, but you have to be able to show how you got to it, and a total with no derivation behind it is the one you cannot defend when a scheme queries it. Build it at SKU level, submit it aggregated.

There is a scope limit here that trips people. LUCID's data reporting covers packaging that is subject to system participation, which is retail, grouped and shipment packaging that typically ends up as waste with private consumers. Not everything in those categories qualifies, and transport packaging and reusable packaging are handled separately. The pallet your stock arrived on is not part of this number.

Do not build one dataset and assume it files everywhere

Material categories, thresholds and formats differ by country, and some schemes ask for splits that Germany does not. Build your internal dataset finer than any single scheme needs, because you can always aggregate upward. You cannot split a total you never collected.

Why Shopify's weights are the wrong number

Shopify does hold weights, which is exactly why this trips people. It holds a weight on the product or variant, and separately a weight on the packages you define for shipping. For weight-based shipping rates it adds them together: Shopify's own example is 4.9 kg of products in a default package weighing 0.1825 kg, giving 5.0825 kg and pushing the order into a higher rate band.

That is a perfectly good shipping calculation and a useless EPR one, for three reasons:

  1. Product weight is a single undecomposed number. Whether it includes retail packaging depends entirely on how whoever entered it was thinking that day, and Shopify cannot tell you which part is product and which is wrapper.
  2. A package is one total weight, with no material breakdown. A package record carries a name, a type, dimensions and a weight. There is no field for cardboard versus plastic, and EPR is settled per material.
  3. The package chosen at checkout is not proof of what shipped. It feeds a rate calculation. If you buy labels through Shopify the Shipping labels by order report does preserve the package name, type, dimensions and total weight per order, which is genuinely useful; buy labels anywhere else and that record lives with your carrier or 3PL, not in Shopify.

So the material breakdown does not exist in the store and cannot be derived from it. It has to be authored once, then joined to data the store does have.

Build a packaging bill of materials

The unit of work is a packaging profile: a named, reusable spec made of components, each with a material and a weight. Not a weight per product, a profile shared by every product packed the same way. That reuse is what makes the job tractable, because a catalogue of hundreds of SKUs may pack into only a handful of distinct ways. Count your actual box and mailer types before assuming the work is proportional to your catalogue. Watch for variants here too: if the large size ships in a different box from the small, they need different profiles even though they are one product.

ProfileComponentMaterialWeight
Small mailerKraft mailer bagPaper and cardboard18 g
Small mailerPaper tape stripPaper and cardboard2 g
Boxed itemCorrugated box, size 2Paper and cardboard210 g
Boxed itemPaper void fillPaper and cardboard35 g
Boxed itemPolythene bag, innerPlastic6 g
Boxed itemPrinted labelPaper and cardboard3 g

Two rules make the difference between a dataset that survives a query and one that does not. Never merge materials into one row, however small the plastic component is, because the whole declaration is organised by material. And weigh, do not estimate, wherever weighing is possible. A kitchen scale accurate to the gram costs less than an hour of anyone's time, and estimates are the first thing challenged.

Where you genuinely cannot weigh something, for example stock already shipped in a period you are now reporting, write down the basis of the estimate next to the number: supplier spec sheet, weight of an identical current item, or a measured sample of ten averaged. The estimate is not the problem. An estimate nobody can trace back is much harder to defend.

Product packaging and shipment packaging are different layers

This is where double counting creeps in. Two distinct things get called packaging and they attach to different quantities:

  • Product packaging travels with the item. Every unit sold carries it, whether it went out alone or with five other things. Multiply by units sold.
  • Shipment packaging is the outer parcel, and there is one per shipment, not one per unit. Multiply by shipments, never by units.

The classic overstatement

An order with four items goes out in one box. Attach the box to the product and you count four boxes, so the outer-packaging line of your declaration is four times reality and you pay fees on boxes that never existed. Overstating is not the safe direction; it is just an expensive wrong answer.

Join it to orders, and to the country that actually received them

Now the arithmetic. Three steps, and the third is the one people get wrong:

  1. Product packaging: for each SKU, units sold in the period multiplied by each component weight in its profile.
  2. Shipment packaging: shipments in the period multiplied by each component weight of the parcel profile used.
  3. Group by destination country, then by material. Not billing country, not the customer's account country. EPR follows where the goods physically went.

Shopify gives you the first quantity cleanly. The Orders export carries line items with quantities and a shipping address, so units sold per SKU per destination country falls straight out of it.

Orders are not shipments, and counting them as such is wrong

One order can be split across several fulfillments, and multiple orders can be combined. So the shipment count is not the order count. Derive it from fulfillments, from Shopify's shipping-label reports if you buy labels through Shopify, or from your 3PL. This is the number most likely to be quietly wrong in a first attempt.

The other thing Shopify cannot tell you is which parcel profile a given shipment used. If you run more than one box size, that mapping has to come from somewhere: a rule based on order size, your 3PL's records, or a note kept at packing time. Decide the rule before the period starts, not after.

A worked example

Take one quarter, Germany only, one SKU packed in the Boxed item profile above, 500 units sold across 400 shipments, all shipped from outside the EU into Germany.

LayerComponentMaterialCalculationMass
ProductPolythene bag, innerPlastic500 × 6 g3.000 kg
ProductPrinted labelPaper and cardboard500 × 3 g1.500 kg
ShipmentCorrugated box, size 2Paper and cardboard400 × 210 g84.000 kg
ShipmentPaper void fillPaper and cardboard400 × 35 g14.000 kg

Aggregate that to what a report wants, and the whole quarter for that SKU collapses to two numbers: paper and cardboard 99.500 kg, plastic 3.000 kg. Note the three decimals, which is the precision LUCID asks for. Note also what one wrong multiplier costs: bill the box against 500 units instead of 400 shipments and it becomes 105.000 kg instead of 84.000 kg, so you declare and pay for 21 kg of cardboard that was never placed on any market, from a single SKU in a single quarter.

What this does not tell you

Kilograms are the input to a fee, not the fee. What each scheme charges per material and per kilo, and the fixed costs that sit alongside it, are in how much EPR actually costs. Germany's process for submitting these volumes is in the LUCID and VerpackG guide.

Validate the totals before anyone else does

  • Every component has a material, and no row mixes two materials
  • Shipment packaging multiplied by shipments, product packaging by units
  • Grouped by destination country, not billing country
  • Totals in kilograms, to three decimals where the scheme asks for it
  • Every weight traceable to a scale reading or a written basis of estimate
  • The period matches the one in your system participation agreement
  • Products added mid-period have a packaging profile assigned

One sanity check catches most errors in one move: total your declared packaging mass and compare it to the total shipped weight of the same orders. Packaging should be a plausible fraction of it. If your packaging total approaches or exceeds the shipped weight, something is multiplied by the wrong quantity.

Keeping it true after the first time

The dataset decays in a specific way: new products arrive with no packaging profile, and there is no error when that happens. They simply contribute zero, so the declaration quietly understates. The same applies when you switch mailer supplier and the new bag is 4 grams heavier.

This is the part Assuro models directly, and it is worth describing plainly because it is the shape any solution needs, spreadsheet or otherwise. Packaging profiles are made of components, each with a material and a weight in grams. Products link to a profile with a quantity. A declaration is scoped to one country and one period, and its lines carry units placed on the market, so the per-unit grams by material are derived from the profile rather than retyped.

The limits matter as much as the shape. That model computes the product layer, units multiplied by component weight. There is no separate shipment object, so parcel packaging is not automatically billed against shipments rather than units, and that layer is still yours to handle deliberately. Packaging attaches at product level, not variant, so a product whose sizes ship in different boxes cannot be represented as two profiles. Assuro does not submit anything to a scheme, and it cannot know that your supplier quietly changed the mailer.

Whatever you use, the discipline is the same: assign a profile at the moment a product is created, re-weigh when packaging changes, and keep the derivation, not just the answer. The GPSR side of the same catalogue, where the data goes onto the product page rather than into a return, is covered in how to bulk add GPSR information to Shopify.

Frequently asked questions

Do I have to report EPR packaging weight per product?

Not in Germany. A LUCID data report asks for the reporting period, the system you contracted with, and the mass per material type in kilograms to three decimal places. There is no SKU field. Other countries structure their declarations differently, so check the form you actually have to file. You still build the numbers per product, because that is where the calculation and the audit trail live, then submit them in whatever shape the scheme wants.

Can Shopify tell me my packaging weight?

Not by material, which is what a declaration is settled on. Shopify holds a product or variant weight and a separate package weight, and adds them for weight-based shipping rates, but neither is broken down into cardboard, plastic or glass, and the product weight does not tell you how much of it is packaging. If you buy shipping labels through Shopify, its shipping-label report does record which package was used per order, which helps with the shipment layer. The material breakdown still has to be built alongside the store.

How precisely do I need to weigh packaging?

To the gram is enough for the components, since totals are reported in kilograms to three decimals, which is one gram. Weigh a real sample rather than trusting a supplier's nominal figure, and if you must estimate, record the basis of the estimate next to the number.

Do I count the box or the product packaging?

Both, but against different quantities. Product packaging goes out with every unit sold, so multiply by units. The outer parcel goes out once per shipment, so multiply by shipments. Multiplying the parcel by units instead is an easy mistake and it inflates your outer-packaging figure by whatever your average items-per-shipment is.

Which country does an order count towards?

The country the goods were physically delivered to. EPR attaches to placing packaging on a national market, so the destination address governs, not the billing address and not where your company is established.

What about the pallet my stock arrived on?

Not part of this figure. LUCID's data reporting covers packaging subject to system participation, meaning retail, grouped and shipment packaging. Transport packaging and reusable packaging are treated separately, so inbound pallets and stretch wrap do not belong in the number you declare here.

See where your store actually stands

Connect your Shopify store and Assuro flags which products are missing GPSR and EPR data, country by country, and tracks every deadline. Free to scan, no credit card.

Check your store for free

Keep reading