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

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,1Every total on that run links through to the individual ledger entries behind it.
What it does
| Feature | What it gives you |
|---|---|
| Set up your organisation | Legal entities, jurisdiction-scoped roles, market scopes and versioned regulatory code lists — revised, never overwritten, so a past filing still reconstructs |
| Record packaging | Specifications and immutable revisions, a bill of materials, an approval workflow that refuses incomplete records, and Article 22 supply transactions |
| Assign packaging to products | Bitemporal product assignments with CSV import that reports every failed row instead of aborting the file |
| What shoppers see | A 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 shipped | Parcels and packaging per shipment, recognition gates, a transactional outbox, and an exceptions queue for anything that could not be resolved |
| EPR accounting and reporting | An 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-hyvapackage 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.

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

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

Competing solutions
What we publish and commit to. The right-hand column describes common market practice, not any particular vendor.
| Qoliber | Typical marketplace extension | |
|---|---|---|
| GitLab access | Full access to the module's GitLab repository — source, history, issues and merge requests | Varies by vendor |
| Packagist installation | Installed and updated with Composer from our private Packagist (qoliber.repo.packagist.com) | Varies by vendor |
| Slack access to the development team | A shared Slack channel with the developers who build and maintain the module | Usually ticket-based |
| Unit tests | 1029 PHPUnit unit tests (263 classes) in the repository | Not typically published |
| Integration tests | 1004 Magento integration tests (202 classes), run before every release | Not typically published |
| E2E Playwright tests | 98 Playwright end-to-end tests on Luma and Hyvä, run before every release | Not 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_categorycodes 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.