Regulatory compliance

Seven Rulebooks, One Engine

EPR Axis turns product and packaging data into state-by-state fee estimates and filing-ready compliance reports, built for a consultancy managing multiple client companies across seven U.S. states.

Compliance & RegTechMulti-Tenant SaaSNext.jsData Pipeline
EPR Axis shown across a laptop and two browser windows
About the product

Multi-State Packaging Compliance Platform

A compliance consultancy advises companies through Extended Producer Responsibility laws for packaging, a wave of new U.S. state regulation that makes producers financially responsible for the packaging they put on the market. Each state runs its own program with its own material categories, fee rates, exemption rules, and filing deadlines. A producer selling into several states faces several incompatible sets of requirements at once.

EPR Axis is the platform built to manage that complexity. It holds a producer's product, packaging, and supply-volume data in one place, reconciles it against a canonical material taxonomy so one packaging component maps correctly onto every state's own material list, and calculates the resulting fee obligation live, without waiting for a formal report.

For the consultancy itself, the platform is also a way to serve many client companies from one system. A consultant account switches between client tenants, sees their data, and generates their filings, instead of running a separate spreadsheet or a separate install per client.

Industry
Environmental compliance and regulatory technology
Platform
Responsive web application, desktop-first dashboard
Timeline
About four and a half months
Team
Dedicated full-stack developer

What we did

  • UI/UX design
  • Frontend development
  • Backend development
  • Database design
  • Deployment

Stack

Next.js 14 (App Router)React 18TypeScriptPrisma 5PostgreSQL (Supabase)shadcn/ui on RadixTanStack Query & TableRechartsExcelJSreact-hook-form + Zod
Goals

What the build had to achieve

One model, seven rulebooks

Every state defines de minimis exemptions, fee rates, and eco-modulation differently. The target was a single product and packaging data model that each state's rules engine reads from, so data is entered once and evaluated seven correct ways.

Fees as a live number

Fee estimates update as soon as products, packaging, and supply data exist for a company. No separate report-generation step is needed just to see what a packaging decision will cost.

A filing that holds up

Every report carries a six-stage workflow, an attestation step, and a timestamped record of who changed what and when. A compliance filing is only as good as its paper trail.

Built for the real ceiling

Client spreadsheets arrive with thousands of rows, and the hosting platform caps how long a single request can run. The import pipeline was designed around that ceiling from the first line rather than discovering it later.

Inside the product

EPR Axis, screen by screen

A laptop showing a welcome screen with counts for companies, products, packaging and reports above a table of registration deadlines for California, Colorado, Maryland, Maine, Minnesota and Oregon, beside a browser window with an executive summary of total estimated fees, total weight, a fees-by-state bar chart and a report status dial.
01

Compliance dashboard

The landing screen counts what is on file, then lists every state's registration deadline and rolls the year up into fees, weight, and report status.

Three overlapping browser windows. The first lists products by brand with UPC codes and SKU counts, the second lists packaging components with primary or secondary labels, material codes such as GLASS_CLEAR and PLASTIC_PET_CLEAR and weights in grams, and the third shows fifty-six rows of supply data broken out by state and SKU for 2025.
02

Products, packaging, supply data

The three tables the fee engine runs on: brands and SKUs, packaging components with their canonical material codes and weights, and units supplied per state per year.

A laptop showing a fee estimation form with company, jurisdiction and year selectors set to Oregon and 2025, beside a browser window showing the calculated result: total weight in pounds, an estimated fee, ten materials, category cards for metal, plastic, glass, paper and composite, and a covered materials table listing rates per pound.
03

Fee estimation, live

Pick a company, a jurisdiction, and a year, and the estimate returns total weight, estimated fee, and a per-material breakdown without generating a report first.

Three browser windows covering the reporting flow. The largest shows a draft Oregon 2025 report with total weight, estimated fee, covered and exempt material counts, report details, a submit for review action, a material line items table with canonical and state-specific codes, and an audit history panel. The others show the reports list for the year and the generate report configuration form.
04

Filing record and audit trail

A generated state report carries its own material line items, workflow actions, and a timestamped history of every change made to it.

Two browser windows. The upper one shows an advisory dashboard with total fees, total weight, states covered and savings opportunity cards above a fees-by-state comparison chart and a fee-by-material donut chart. The lower one shows a scenario builder with a state, year and material type selected, and a result card giving the estimated fee and total weight.
05

Advisory and what-if scenarios

Portfolio analytics break fees out by state and by material family, and the scenario builder prices a packaging change before anyone commits to it.

Challenges

The parts that were genuinely hard

01

One component, seven states' worth of material names

The problem

Each state publishes its own material categories, so the same physical packaging component needs a different classification depending on which state's report is being generated. Client spreadsheets arrive using whatever coding standard the supplier happened to use.

What we did

A canonical material coding system sits underneath every state's list, with an alias table that resolves industry standards such as ISO 21067, SPI resin codes, and state recycling codes onto the canonical code during import.

The outcome

A packaging component is classified once and reads correctly in every state's report, and messy source files map themselves on the way in.

02

A rules engine, not a ruleset with flags

The problem

De minimis exemption logic alone has four distinct evaluation modes across the seven supported states, each with its own threshold and its own definition of which revenue counts. Hard-coding states would have meant a rewrite with every new program.

What we did

A config-driven rules engine evaluates each jurisdiction's logic mode, thresholds, and fee schedule against the same underlying product and packaging data, so a state is added as configuration rather than as code.

The outcome

Seven state filing regimes run from one engine and one data model, and the eighth is a configuration exercise.

03

Large imports that finish in a single pass

The problem

Client data arrives as spreadsheets with thousands of rows, and the hosting platform caps how long any single request may run. A naive importer that looks up material codes, jurisdictions, and existing SKUs row by row will not survive a real client file.

What we did

Every lookup table is pre-fetched into memory before the row loop begins, so each row resolves without touching the database again. The pattern was written into the project conventions so all future import code follows it.

The outcome

Bulk imports of products, packaging, and supply data complete inside the execution window instead of failing partway through a customer's file.

04

Totals that reconcile to the cent

The problem

A compliance filing is a financial document. In a per-SKU fee breakdown, rounding at the wrong point in the aggregation makes the displayed total disagree with the rows beneath it, and that is the first thing a reviewer notices.

What we did

Fee attribution runs on raw values end to end, with rounding applied exactly once, at the final displayed figure, and the same rule applied to every aggregation in the product.

The outcome

Every total in the interface and in a generated report adds up against its own line items.

Approach

How the work ran

  1. 01

    Discovery & Research

    The regulatory logic came from primary research rather than assumption. De minimis threshold rules, fee-rate structure, eco-modulation, and handling of materials a state does not cover were captured as written client answers, then reviewed and confirmed before any of it was encoded.

  2. 02

    UI/UX Design

    The interface runs on one consistent component system, so every new data type follows the same interaction pattern and a consultant learns the product once. The platform also went through a full rebrand mid-build, moving its accent colour and logo system across every branded surface in a single coordinated pass.

  3. 03

    Development & Testing

    Development ran as a continuous series of client-feedback-driven revisions across 128 commits, from the foundational data model through a complete material-list and fee-rate rework against an updated client spreadsheet. Each pass was verified by hand against the live application and archived with dated screenshots.

  4. 04

    Deployment & Support

    The application deploys to Vercel from a single source of truth, so production always builds from the same code. Handover shipped alongside it: an MVP handover document, a deployment checklist, and role-specific guides for admins, consultants, and end users.

Features

What shipped

Multi-state rules engine

Evaluates de minimis exemptions, fee rates, and material coverage independently for each of seven states from one shared data model, rather than seven parallel implementations.

Canonical material taxonomy

Maps packaging components onto a shared internal material code, then resolves industry-standard codes onto that canonical code automatically during import.

Guided bulk import with column mapping

A step-by-step wizard imports products, packaging, and supply data from arbitrary spreadsheets, mapping whatever columns a client's file happens to have onto the platform's fixed fields.

Live fee estimation

Fee estimates compute on demand from whatever product, packaging, and supply data currently exists for a company, with no formal report generation step in the way.

Filing workflow with audit trail

Reports move through a six-stage lifecycle with an attestation step and a full timestamped history of every change made along the way.

Multi-tenant consultant access

A consultant account can be granted access to multiple client companies and switch between them from a single login, with each tenant's data kept to itself.

Results

Measured, not estimated

7 states

Programs on one engine

California, Colorado, Maine, Maryland, Minnesota, Oregon, and Washington all run from a single data model and a single rules engine, with new jurisdictions added as configuration.

Have a Rulebook That Needs Turning Into Software?

We build platforms that take messy, jurisdiction-by-jurisdiction regulation and turn it into something a team can actually file with. Tell us the rules you are up against and we will scope the build.

Have a Project To Discuss?

Contact Us