3 min readOct 16, 2026by jakub

PPWR Packaging

Your packaging data stops living in spreadsheets: what each pack is made of, which products use it, what actually went out with every parcel, and the evidence behind each claim — kept in Magento, versioned, and added up into a figure a person can file and defend months later.

Latest version: 1.0.0 — changelog

Packaging information on a product page

Who it's for

  • EU merchants who register and report packaging in one or more Member States, and need the weights per material that an EPR return asks for.
  • Non-EU sellers shipping into the EU, who became the producer placing packaging on the destination market and now need the same figures.
  • Merchants who sell outside Magento too — ERP orders, offline sales, samples, replacements — since packaging placed through any channel counts toward the same filing.
  • Stores making recyclability or compostability claims on product pages, which from 27 September 2026 must be substantiated under Directive (EU) 2024/825.

Why it matters

  • A figure you can defend. Every shipment appends to a ledger that is never edited or deleted, so last quarter's number still reconstructs exactly as it was.
  • Claims that cannot outrun their evidence. A recyclable or compostable claim renders only when its declaration is on file — otherwise the storefront stays quiet rather than guessing.
  • Approval that refuses incomplete records. If your own policy says a packaging level needs a declaration of conformity, the workflow will not approve it without one.
  • Nothing silently understated. A shipment whose packaging cannot be resolved becomes a visible compliance exception, never a zero-weight row.
  • Documents kept properly. Declarations live outside the web root, behind their own permission, with retention derived server-side so they cannot be deleted early by accident.

See it in action

  • You assign packaging to a product → the product edit page stops saying Missing assignment and shows the recipe, its version and Complete.

  • You upload the declaration of conformity → the product page shows Recyclable — declaration on file. Remove the evidence and the claim disappears rather than softening.

  • You generate a report run for a market and period → a CSV whose header records exactly how it was produced, with kilograms per material:

    # adapter: generic_csv v1
    # period: 2026-Q2 (2026-03-31 22:00:00 .. 2026-06-30 22:00:00 UTC)
    # ledger cutoff: 2026-07-05 00:00:00
    material_category,placed_on_market_quantity,placed_on_market_grams,placed_on_market_kg,entry_count
    paper_cardboard,2.0000,1250.5000,1.2505,1

    Every total on that run links through to the individual ledger entries behind it.

What it does

FeatureWhat it gives you
Set up your organisationLegal entities, jurisdiction-scoped roles, market scopes and versioned regulatory code lists — revised, never overwritten, so a past filing still reconstructs
Record packagingSpecifications and immutable revisions, a bill of materials, an approval workflow that refuses incomplete records, and Article 22 supply transactions
Assign packaging to productsBitemporal product assignments with CSV import that reports every failed row instead of aborting the file
What shoppers seeA product-page block on Luma and Hyvä showing composition and mass by material, with claims that render only when their declaration is on file
Capture what shippedParcels and packaging per shipment, recognition gates, a transactional outbox, and an exceptions queue for anything that could not be resolved
EPR accounting and reportingAn append-only placed-on-market ledger, external movement ingestion, source periods, and report runs reproducible from their recorded cutoff

What sets it apart

  • Hyvä-native. A separate qoliber/ppwr-hyva package renders the same block with Tailwind and Alpine, from the same view model — no RequireJS or jQuery.
  • API-first. 27 REST endpoints cover packaging, revisions, recipes, assignments, manifests, dispatch and movement ingestion, each behind its own ACL resource.
  • No SaaS in the path. Everything runs inside your Magento installation. The extension connects to no external service and sends your packaging data nowhere.

A report run's filing details, totals and recorded ledger cutoff

Recording a pack takes one form — name, level, format and a row per component:

Quick Create, with a component row filled in

And nothing that cannot be resolved is silently dropped; it lands on a queue a person works:

The compliance exceptions queue with incidents to work

Competing solutions

What we publish and commit to. The right-hand column describes common market practice, not any particular vendor.

QoliberTypical marketplace extension
GitLab accessFull access to the module's GitLab repository — source, history, issues and merge requestsVaries by vendor
Packagist installationInstalled and updated with Composer from our private Packagist (qoliber.repo.packagist.com)Varies by vendor
Slack access to the development teamA shared Slack channel with the developers who build and maintain the moduleUsually ticket-based
Unit tests1029 PHPUnit unit tests (263 classes) in the repositoryNot typically published
Integration tests1004 Magento integration tests (202 classes), run before every releaseNot typically published
E2E Playwright tests98 Playwright end-to-end tests on Luma and Hyvä, run before every releaseNot typically published

Good to know

  • It does not file anything. There is no connection to any national scheme or registry; a person transcribes the figures into the scheme's own portal.
  • No verified country adapter ships. Only a generic CSV export. Its material_category codes are this extension's own taxonomy, and the shipped regulatory code lists are marked provisional.
  • Article 12 marks belong on the physical packaging. The product-page block is supplementary information, which PPWR does not require — the marking duty is on the pack itself.
  • It will not decide your obligations. Whether you are an importer or a distributor, and what a scheme requires of you, are questions for you and your adviser.

Supported on Magento Open Source and Mage-OS 2.4.8 / 2.2.x, PHP 8.1 through 8.5.

Next: install it, then configure it.

PPWR Packaging — Compliance & Legal — Extensions | qoliber Docs