Last spring I finally had a hardware product I was proud enough to sell: a little ESP32-based air quality board called AirQube, paired with an Android app I'd been maintaining for two years. The board talks over Bluetooth Low Energy, the app graphs the readings, and the whole thing lives on Lectronz, a marketplace built specifically for open-source hardware makers like me. I sold a handful of units a month, mostly to hobbyists in Germany, France, and the Netherlands. It wasn't a business. It was a nice side project that occasionally paid for parts.

Then in August 2026 I got an email from a buyer in Austria asking why my listing suddenly said "not available in your country." I hadn't touched that setting. What I'd actually done, a few weeks earlier, was ship an app update that quietly disables the "Buy the board" button for anyone whose phone reports an EU country code. I want to walk through why I did that, because the regulation behind it is one of those things that sounds reasonable in a press release and turns into a wall the moment you're a one-person shop shipping padded envelopes from your kitchen table.

This isn't a story about Android permissions or Bluetooth pairing bugs, even though there's some real Kotlin in here. It's about how a packaging law wrote itself into my app's business logic, and why I think a lot of other indie hardware-plus-app makers are going to hit the same wall without seeing it coming.

The short version: under the EU's new packaging rules, a €25 board sold to four different EU countries can trigger four separate national registrations, each with its own fees and paperwork, even though the actual packaging involved is a padded envelope weighing under 50 grams.

The board that triggered all this

AirQube ships in a static-shielding bag inside a small cardboard mailer, the same setup most of us on Lectronz use for boards this size. I never thought about that packaging as a regulatory object. It's packaging in the way a sandwich bag is packaging: functional, cheap, and not something you'd expect a government agency to want a report about.

The EU has had Extended Producer Responsibility, or EPR, schemes for packaging for years, mostly aimed at big retailers and manufacturers who put tons of cardboard and plastic into national waste streams. What changed is the Packaging and Packaging Waste Regulation, or PPWR, which became generally applicable across the EU on 12 August 2026. The goal, harmonizing packaging rules and making producers pay for the waste they create, is one I actually agree with. My problem is entirely with how it landed on people selling ten units a year.

I found out about this the way most makers probably will: not from a government notice, but from a post on Lectronz's own blog written by Alain Pannetrat, the platform's founder. He laid out the mechanics better than any of the compliance-vendor sites I'd tried to parse, and it's worth being specific about what he described rather than paraphrasing it into mush.

What the EPR/PPWR rules actually require

The core requirement is that a business selling packaged goods into an EU country has to register as a "packaging waste producer" in that specific country, not once for the whole EU. PPWR kept the national compliance model instead of replacing it with a single EU-wide system, so if you ship to four member states, you owe four separate registrations, four separate reporting relationships, and in several cases you're required to appoint a local authorized representative to handle it for you.

Pannetrat's writeup used a hypothetical that maps almost exactly onto my situation: an engineer in Greece selling a €25 open-source sensor board who ships five units to Germany, two to France, two to Austria, and one to Belgium in a year. Each shipment is maybe 50 grams of packaging. According to his breakdown of published national scheme fees, that engineer becomes a registered packaging producer in four countries simultaneously, and owes recurring fees in each one regardless of how little packaging he actually generated.

EPR stands for Extended Producer Responsibility, a policy model where whoever puts packaging on the market pays into a fund that covers its collection and recycling. PPWR is the EU regulation that governs how EPR gets implemented for packaging specifically, and it's what made the national registration requirement binding across all 27 member states starting in August 2026.

What struck me reading it wasn't the existence of a fee. It's the ratio. The actual environmental cost of half a kilogram of padded envelope is a few cents of recycling. The compliance apparatus wrapped around collecting that fee costs orders of magnitude more than the thing it's supposed to account for. That mismatch is the entire story.

Doing the math on my own board

I ran the same exercise for AirQube using the fee ranges Lectronz published for four of the countries I actually ship to. I'm not going to pretend these numbers are exact to the euro, they shift by scheme and by year, but they were close enough to make the decision for me before I'd even finished the spreadsheet.

CountryScheme/admin feeAuthorized representative
France~€110/year~€190–300/year
Belgium~€50–100/year~€250–450/year
Germanyfree registration~€10 scheme fee + ~€190/year rep
Austria~€250/year~€100/year

Add those four up and you're at roughly €1,150 a year just to keep selling into four countries, before you've sold a single additional board to cover it. I sell maybe 60 boards a year total, across every country I ship to. There is no version of that math where four countries' worth of compliance overhead pencils out against padded-envelope postage. Scale that to all 27 member states, which is what "selling in the EU" actually means if you want your Lectronz listing to say so, and you'd need volume in the thousands of units a year just to break even on the paperwork, not the product.

Gating the buy button in the Android app

Once I did the math, the only defensible short-term move was to stop taking EU orders until something changes, and to make that clear before someone in Vienna spends ten minutes filling out a shipping form only to get a refund email. The app was the easiest lever I had, since most of my traffic to the Lectronz listing comes through a "Buy the board" button inside the Android companion app rather than cold web traffic.

My first pass was embarrassingly naive. I just hardcoded the store link and shipped it, which is what I'd always done, because until August there was no reason to think about where the tap was coming from:

private fun onBuyBoardClicked() {
    val storeUrl = "https://lectronz.com/stores/airqube/products/airqube-sensor"
    startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(storeUrl)))
}

That's fine for a hobby project with a dozen buyers a month, but it's exactly the kind of code that quietly turns into a support ticket once a regulation changes underneath you. Here's what I replaced it with, checking the user's network country against a blocklist and routing EU users to an explanation instead of a checkout page:

private val euCountryCodes = setOf(
    "at", "be", "bg", "hr", "cy", "cz", "dk", "ee", "fi", "fr",
    "de", "gr", "hu", "ie", "it", "lv", "lt", "lu", "mt", "nl",
    "pl", "pt", "ro", "sk", "si", "es", "se"
)

private fun onBuyBoardClicked() {
    val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    val userCountry = telephonyManager.networkCountryIso.lowercase()

    if (userCountry in euCountryCodes) {
        showEuShippingNotice()
        return
    }

    val storeUrl = "https://lectronz.com/stores/airqube/products/airqube-sensor"
    startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(storeUrl)))
}

private fun showEuShippingNotice() {
    AlertDialog.Builder(this)
        .setTitle(getString(R.string.eu_notice_title))
        .setMessage(getString(R.string.eu_notice_body))
        .setPositiveButton(R.string.eu_notice_learn_more) { _, _ ->
            val petitionUrl = "https://www.change.org/p/stop-destroying-eu-micro-businesses-immediate-moratorium-on-cross-border-epr-fees"
            startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(petitionUrl)))
        }
        .setNegativeButton(R.string.close, null)
        .show()
}

It works, but I don't love it, and you shouldn't ship it without knowing its limits.

TelephonyManager.networkCountryIso only reports a value when the device has an active cellular connection. Anyone on a WiFi-only tablet, or on a phone with roaming or airplane mode weirdness, gets an empty string, which silently falls through my blocklist check and lets the order through anyway. I'm layering in a locale-based fallback and, eventually, a server-side check against the shipping address before checkout, because relying on radio state to enforce a legal shipping restriction is the kind of shortcut that looks fine in testing and bites you the first time a customer is on hotel WiFi.

I'm not thrilled that a regulation meant to reduce cardboard waste is now living inside a mobile app's click handler, but that's genuinely where the incentive landed. The alternative was leaving the buy button live and hoping four national agencies never noticed a Greek or French maker's kitchen-table shipping volume, which felt like a worse bet than an ugly if-statement.

The fixes people are actually proposing

None of this is unfixable, and to Pannetrat's credit his writeup doesn't just complain, it proposes concrete changes that would make the current rules survivable for people like me. I think all three are worth pushing for, even if I'm skeptical about the timeline.

  • An EU-wide de minimis threshold: exempt sellers below a certain turnover or packaging-weight threshold from cross-border registration entirely, so a hobbyist selling a dozen boards a year isn't treated the same as a national retail chain.
  • An EPR One Stop Shop: a single EU portal for registering and reporting across all member states at once, modeled on the VAT One Stop Shop that already exists, ideally exposed as an actual API instead of 27 separate web forms.
  • Marketplace-level collective representation: let platforms like Lectronz or Tindie register and report on behalf of all their sellers as a single combined producer, so the compliance burden sits with the platform rather than with each individual maker.

An independent artist and micro-entrepreneur from Slovakia, Jeanette Konarčíková, started a petition calling for an immediate moratorium on cross-border EPR fees for micro-businesses, and the European Commission has a public feedback page open on the same issue. The Commission has also floated suspending the requirement to appoint an authorized representative in every destination country until 2035, but as of this writing that proposal hasn't been adopted, and even if it passes it only removes part of the cost, not the per-country registration itself.

Where this leaves me

For now AirQube ships to the US, Canada, the UK, Australia, and a handful of other non-EU countries, and the app tells EU users exactly why the button is grayed out instead of just failing quietly at checkout. It's a worse experience for buyers in Vienna or Lyon than it was six months ago, and I don't have a clean answer for them beyond "sign the petition and email your MEP." That's a genuinely unsatisfying thing to tell someone who just wants to buy a sensor board.

What I'd tell another indie developer sitting on a hardware-plus-app side project: don't wait for a national agency to email you before you do this math. Pull the fee schedules for the two or three EU countries where you actually get orders, add up registration plus representative costs, and compare it honestly against what those orders are worth to you. If you're selling in the tens of units a year, the numbers will probably make the decision for you the same way they did for me. And if enough of us tell the Commission that its own single market stopped working for people who build things in spare rooms, there's at least a chance the One Stop Shop idea gets built before the next wave of makers gives up on the EU entirely.

Sources: Alain Pannetrat — How Europe is killing makers and micro-entrepreneurs