Packora
A per-SKU packaging register for US state EPR reports, with exact maths and each state's report pack.
For producers reporting packaging to US state EPR programs. Often replaces Packgine.
Single license $79 · Extended license $159 · paid once, yours for good
What it does
Each product's packaging by component, material and weight, stored as exact integer milligrams.
Upload Shopify, WooCommerce or Amazon order exports. Each order line counts once; canceled orders are reported, not counted.
A material-totals CSV, a SKU-level detail CSV and a printable summary for each state and year.
Set each state's template layout once, then download any year in it.
Record a new weight from the year it changes. Every year you already reported keeps the weight it was filed with.
Your rates times your tonnage, with your schedule's recyclable and non-recyclable adjustments. Always labeled an estimate, never a quote.
Each state's estimated fee per unit sold, side by side, so you can weigh fees against sales.
Stepped reminders of each state's deadline go to the people who file, through your own SMTP.
Where you are registered, the number and the renewal date, with the gaps on the dashboard.
SKUs with no packaging, and units rows that match no SKU, are flagged and excluded, never silently dropped.
The recyclable and recycled-content shares of your packaging, by weight, per SKU and per state.
Also: state names read as people type them, and weights that look like kilograms flagged.
What Packora deliberately doesn’t do.
- US-state scope; no EU/Canada program logic and no PRO API integration.
- Fee figures are estimates from the rates and eco-modulation adjustments you entered — no minimums or mid-year schedule changes.
- You maintain the reference data (materials, deadlines, rates); verify with your PRO each cycle.
- One company per installation; your team shares it with roles.
- Annual granularity, matching the annual-report cadence.
- Reminders reach people, not portals: Packora never files, submits or logs in for you.
Release history
For Packora, 4.1 makes two changes that every app gets. What’s new in 4.1 →
For Packora, 4.0 means updates from inside the app: the Updates page checks for a new release with your license key, verifies Ownware's signature, takes a backup and… What’s new in 4.0 →
Packora 3.3 divides each state's estimated fee by the units you sold there and sets every state side by side, highest first, so you can weigh a state's fees against… What’s new in 3.3 →
The 3.2 wave gave Packora weights that change from a given year while every year already filed keeps its weight, units sold read from your Shopify, WooCommerce or…
The 3.1 wave gave the catalog a way to reach the other side of the transaction: counterparty email through your own SMTP server, calendar feeds your own calendar…
Over MCP an agent can read your register, pull a state tonnage report, list data gaps and register a SKU — with the same validation as the API, so an unknown material…
Packora 2.0 adds the 2.0 owner layer.
What’s in the zip
The tree as the zip ships it — the working leftovers the packager deletes are not listed
- .htaccess
- API.md
- Dockerfile
- LICENSE.txt
- QUICKSTART.txt
- README.md
- assets/
- bin/
- config.sample.php
- controllers/
- deploy/
- index.php
- install/
- manifest.json
- offline.html
- router.php
- src/
- sw.js
- tests/
- views/
src/Importer.php: a real module, the first 24 of 502 lines
Chosen as the largest module in src/ that is not one of the shared cores — this product's own logic, not a file every product carries.
<?php /** * Importer.php — CSV import for SKUs and annual units-by-state. * * Treats every upload as adversarial input: * - Columns are mapped BY HEADER NAME (never by position) with common aliases. * - Every string is clipped to its VARCHAR width, every integer clamped to ±2e9 — * a 9000-char SKU or 15-digit unit count lands truncated, never as a MySQL strict-mode 500. * - Malformed rows are skipped with a per-line reason; the caller shows "imported N, * skipped M" with the first reasons. * - Sales rows for SKU codes that don't exist yet are IMPORTED AND FLAGGED (per-line * warning + dashboard completeness warning) — never silently dropped. They join the * register automatically the moment the SKU is created. * Own It 2.0: every importer takes $dryRun. In dry-run mode each row is parsed, validated and * classified EXACTLY as on a real import — including the lookup of the SKU and material a * component row refers to — but nothing is written. importComponents() is new in 2.0: entering * per-material packaging weights by hand is the single biggest chore in an EPR register, and it * is the one thing the 1.x importer could not do. * * - Hard caps: MAX_BYTES on the upload, MAX_ROWS on parsed lines (stream-parsed with * fgetcsv — a huge file never loads into memory). */ declare(strict_types=1);
Runs on: Web installer takes about two minutes; PHP 8.1+ with MySQL or SQLite, standard shared hosting compatible. Tested on PHP 8.3. Or run it in Docker: the Dockerfile is in the zip.
Technical owners can install it with one line and their license key: curl -fsSL https://ownware.io/install.sh | sh -s -- packora <your license key>
Nothing is obfuscated or encoded; what you read is what runs. Manual · API · the test run
Which license do I need?
It comes down to how many installations you need. Running your own business on one site is the Single license. A second domain of your own, or sites you build or run for other people, is the Extended license.
- Install it on one domain or subdomain you own or operate
- Change the source however you like for that installation
- Run your own business on it commercially, client work included
- Re-download the current build any time from your buyer portal
- A second site, or an installation you hand to a client as theirs, needs the Extended license
- No reselling, redistributing or sublicensing the source
- Not for offering it to other people as a hosted service
- Everything the Single license grants
- Install it on as many domains as you own or operate — no cap on the number
- Up to ten client installations, one per client project, handed over or hosted for each client; for more, buy another Extended license
- White-label: remove or replace the product name and logo in the screens of client installations
- Still no reselling or redistributing the source itself
- Running it as a multi-tenant service others sign up for needs a SaaS agreement
Every download carries the full terms as LICENSE.txt. The complete wording is on the terms page.
After you buy
The app’s Updates page installs a new release with your license key, with the release’s signature checked and a backup taken first. Your download link always serves the current build. Download again any time from your order page or the buyer portal; there is no renewal fee.
Email support for installation and for defects in the code as delivered: a person reads and answers every message. It does not cover custom development or server administration. What support covers
Refunds are handled by Lemon Squeezy as merchant of record, case by case. EU consumers keep the statutory 14-day right until delivery starts. Refund terms
It keeps running: your server, the full PHP source, no license check that can fail. If no stable release is published for 365 days, the domain limit lifts; after three such years your copy becomes MIT-licensed. The terms have the exact wording: continuity.
Questions
Can't I just use a spreadsheet?
Does this make me EPR-compliant?
Where do the fee numbers come from?
Will this run on shared hosting?
Are these state laws even in effect?
Is there an annual subscription?
Does it come with the fee schedules and deadlines built in?
What does it show for a material I have not entered a rate for?
Does it file my report for me?
Will it remind us before a deadline?
Covered in these guides
More about Packora
Self-hosted per-SKU packaging register for state EPR reporting — exact math, one-time price.
The problem it solves
US states are rolling out extended producer responsibility (EPR) laws for packaging, with Oregon, Colorado, and California leading a wave that includes Maine, Minnesota, and Washington. These programs put a recurring annual duty on producers: report the packaging you supply into each state, by material category and weight, to a producer responsibility organization — and pay fees calculated on it.
- Every report assumes you can answer one question: per SKU, what packaging do you ship, and how many units went into each state
- Most small and mid-size producers have that scattered across spreadsheets, or nowhere
- The duty repeats every year
Every feature
- A deadline reminder ladder that reaches people. Approaching EPR deadlines are emailed to the people who actually file — stepped reminders through your own SMTP, each rung sent once, checked on every dashboard visit and by a daily cron line you add once. Packora still never logs into a portal or submits anything on your behalf.
- Per-SKU packaging register. Record every product's packaging bill of materials by component, material category, and weight, stored as exact integer milligrams.
- Units sold by state × year. Import units sold via header-mapped CSV or manual entry; re-imports update the register in place.
- Per-state, per-year report pack. Generate a material-totals CSV, SKU-level detail CSV, and printable summary for each state and year, plus a global all-states CSV.
- Fee estimator. An operator-editable rate table multiplies your tonnage by rates you enter, always labeled ESTIMATE, and never fakes a $0 for unrated materials.
- Deadline tracker. Enter your own per-state reporting deadlines and see due-soon and overdue countdown badges on the dashboard.
- Data-completeness warnings. SKUs with no packaging components, and units-sold rows that don't match your register, are flagged and excluded, never silently dropped.
- Installable mobile app (PWA). Add it to a phone or tablet home screen straight from the browser — a full-screen app served from your own server, with no app store involved. Business data is not stored offline on the device; what you see is read live.
- Filed years stay filed. When a carton gets lighter, record the new weight from the year it changes. Every year you have already reported regenerates with the weight it was filed with.
- Sales in, not typed in. Upload your Shopify orders export, a WooCommerce order-export file or Amazon's All Orders report. Packora adds up units per SKU, ship-to state and year; each order line counts once, and canceled orders and states you have not added are reported, not counted.
- Your PRO's format, filled. Set each state's template layout once; download any year in it.
- Eco-modulation and recyclability. Fee estimates with your schedule's recyclable and non-recyclable adjustments, and the recyclable and recycled-content shares of your packaging by weight.
- Registration on file. Where you are registered, the number and the renewal date, with the gaps on the dashboard.
- What each state costs you per unit sold. The fee estimator divides a state's estimated fee by the units you sold there that year, and lists every state you sell into side by side, highest first, so you can weigh a state's fees against what you sell there. Worked out from your own rates: an estimate, not a quote.
- Updates from inside the app. The Updates page installs a new release with your license key: Ownware's signature is checked, a backup is taken first, and the app puts the previous version back by itself if the update is interrupted or the database step or start-up check of the new version fails. It never checks by itself.
- Backups by themselves. Automatic backups, an optional copy to S3-compatible storage you own, and a weekly check that the latest backup reads back. The Health page names anything that needs attention.
- Own It 4.0.1 — fixes and an up-to-date manual. For Packora, 4.0.1 fixes an installer that had lost its styling, a rollback that a page opened during an update could stop and a command-line update that ended in an error after putting the previous version back. Its manual, FAQ and QUICKSTART now cover everything 4.0 added, including two Nginx rules that keep the data folder private. Your license covers it: press Check for updates on the Updates page, or download it from your order page.
- Own It 4.0.2 — the installer opens on every host. For Packora, 4.0.2 fixes a fresh install on an Apache host: the one-page setup at /install/ looped back to itself and never opened, and now it opens. Your license covers it: press Check for updates on the Updates page, or download it from your order page.
Release notes in full
- Own It 4.1: client installations and your other tools. For Packora, 4.1 makes two changes that every app gets. An Extended license bought from October 4, 2026 covers up to ten client installations, one per client project: hand each one over to the client or host it for them, with the client's logo and colors from the app's branding settings. The API reference now shows how to connect Packora to Zapier, Make or n8n, using its own webhooks and API key. Your license covers the update: press Check for updates on the Updates page, or download it from your order page.
- Own It 4.0: it updates and backs itself up. For Packora, 4.0 means updates from inside the app: the Updates page checks for a new release with your license key, verifies Ownware's signature, takes a backup and puts the previous version back by itself if the update is interrupted or the database step or start-up check of the new version fails. A new install can start with a sample business and remove it in one click; backups run by themselves, with an optional offsite copy and a weekly check that the latest one reads back; and the Health page says whether the install is looking after itself.
- Own It 3.3: what each state costs per unit. Packora 3.3 divides each state's estimated fee by the units you sold there and sets every state side by side, highest first, so you can weigh a state's fees against what you sell there. Worked out from your own rates: an estimate, not a quote.
- Own It 3.2: filed years stay filed. The 3.2 wave gave Packora weights that change from a given year while every year already filed keeps its weight, units sold read from your Shopify, WooCommerce or Amazon order exports, and each state's report laid out in its PRO's own format. Fee estimates carry your schedule's recyclable and non-recyclable adjustments, the register shows recyclable and recycled content by weight, and each state's registration sits on file with its renewal date.
- Own It 3.1: it writes to the people you serve. The 3.1 wave gave the catalog a way to reach the other side of the transaction: counterparty email through your own SMTP server, calendar feeds your own calendar subscribes to, attachments filed where the paperwork belongs, and export presets other people's software imports. Each outbound feature ships switched off and runs on your own credentials; a failed send is recorded, and the action that triggered it stands. What this app gained is listed at the top of this section.
- Own It 3.0: works for your AI, not just for you. Over MCP an agent can read your register, pull a state tonnage report, list data gaps and register a SKU — with the same validation as the API, so an unknown material is refused rather than invented and tonnage never lands where a regulator cannot see it.
- Own It 2.0: API, 2FA, backups, dark mode. Packora 2.0 adds the 2.0 owner layer. Upgrade by replacing the files — the database migrates itself, and it is still the same one-time purchase.
Browse self-hosted: Compliance software