GPSR Product Listing requirements — check your product feed free

Audits product feed files (CSV/TSV/XML) against GPSR Article 19: manufacturer address, EU Responsible Person, product picture and identifier, warnings. 12 rules, offline. Runs entirely in your browser — nothing is uploaded.

Same engine as the VS Code extension, byte for byte.

Install free

Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.

VS Code MarketplaceOpen VSX (Cursor, VSCodium)npmMCP server (npx)Docker Hub
ext install ReadyStack.gpsr-listing-lint
npx @readystack/gpsr-listing-lint <file>
npx @readystack/gpsr-listing-lint --mcp

Team? One key for every ReadyStack linter, 5 seats, $149 once

Get the full rule table as a PDF
All 12 rules GPSR Listing Lint checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.

Get the full version $29

Export a dated evidence pack for the whole workspace catalogue — every feed file, every failing row, per-rule counts — as CSV and Markdown you can hand to a marketplace, importer or auditor.

One payment, one licence key for this tool. The key is shown right after payment.

An EU Responsible Person / authorised-representative service is sold as a monthly subscription, per brand; hand-checking a feed at ten seconds a row is about fourteen hours for five thousand rows. This is $29 once.

Buy the full version — $29
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

GPSR Listing Lint

Thirteen rows of a Shopify export, twelve findings: that is what a feed manager shipping to Germany and Italy got back from the sample catalogue bundled with GPSR Listing Lint — nine blockers and three warnings, each one pinned to a line number and an article.

Article 19 of the EU General Product Safety Regulation, Regulation (EU) 2023/988, is short and unusually literal. Where a product is offered at a distance, the offer itself must clearly and visibly indicate: the name, registered trade name or trade mark of the manufacturer together with a postal and an electronic address at which they can be contacted; where the manufacturer is not established in the Union, the name, postal and electronic address of the responsible person under Article 16(1) GPSR or Article 4(1) of Regulation (EU) 2019/1020; information allowing the identification of the product, including a picture of it, its type and any other product identifier; and any warning or safety information, in a language easily understood by consumers in the Member State where the product is made available.

The word that costs money is "offer". Not the box, not the PIM, not the importer's e-mail. In a marketplace catalogue the offer is a row in a CSV or an item in an XML feed, and that row is almost never where compliance data was collected.

The sample feed shows how ordinary the failures are. One row simply has an empty manufacturer column. One has N/A where the postal address should be — a placeholder passes a filter looking for blanks, because it is not blank. One has noreply@ as the contact address, which is an address that cannot be contacted. Two rows are made in China: the first names no responsible person at all, the second names the Chinese manufacturer as its own responsible person, which is precisely what Article 19(b) exists to prevent. One row has no image link, and Article 19(c) names the picture explicitly. One has neither GTIN nor MPN. A wooden pull-along duck marked 3+ carries no warning text. An LED lamp with a lithium battery sells into the German market with a warning written in English.

Twelve rules, four articles, one pass over the file. The clean version of the same catalogue returns zero findings, which is the other half of a useful linter: it has to be quiet when the data is right.

Column names are matched by vocabulary rather than by one fixed schema, because no two exports agree. manufacturer, brand, hersteller and fabricant resolve to the same field; responsible_person, eu_representative and importer resolve to another. Comma, semicolon, tab and pipe delimiters are detected from the header line. Placeholders — N/A, TBD, unknown, a bare hyphen, see packaging, same as above — count as empty, and see packaging is the instructive one: the consumer reading the offer has not got the packaging yet.

When a required column is missing from the header entirely, the finding is reported once against the header line with the number of rows it condemns, rather than once per row. A five-thousand-row export missing the responsible person column is one finding, not five thousand.

Two dates belong in the calendar. GPSR has applied since 13 December 2024. The new EU product liability rules, Directive (EU) 2024/2853, must be transposed by 9 December 2026 and apply to products placed on the market from that date — eighty-seven days from today.

The scan is free and complete for the file you have open: every failing row, every line number, nothing uploaded. The paid layer is a different job — one dated evidence pack for the whole workspace catalogue, every feed file and every failing row, as CSV and Markdown, for the marketplace or the importer who asked.

15 seconds — what it actually does

Questions people ask

What does GPSR Listing Lint actually do?

It reads a product feed file — CSV, TSV or a Merchant-style XML — and checks every row against Article 19 of the EU General Product Safety Regulation: manufacturer name, postal address and electronic address, an EU Responsible Person when the manufacturer sits outside the Union, a product picture and identifier, and warning text. It reports the failing line numbers.

Who is this for?

Feed managers, e-commerce developers and agency operators who maintain catalogues for Amazon, eBay, Etsy, Shopify or Google Merchant Center in the EU and EEA. If you edit products_export.csv or an XML feed in your editor, and someone upstream asks whether the catalogue is GPSR-ready, this answers that question offline, row by row.

Why can't I do this with a spreadsheet filter or a chatbot?

Spreadsheet filters find empty cells. They do not know that "see packaging" fails Article 19, that a Responsible Person in Shenzhen is not established in the Union, or that a German-market toy needs German warning text. A chatbot cannot read a forty-megabyte feed row by row, and pasting a customer catalogue into one is its own problem.

What is free and what costs money?

Free: open any feed file and run the scan. You get every failing row, its line number and the article it fails, for that file, with no licence key and nothing uploaded. Paid, twenty-nine dollars once: export a dated evidence pack — every feed file in the workspace, every failing row, per-rule counts — as CSV and Markdown.

What would this cost me without the extension?

Hand-checking a catalogue costs about ten seconds a row, so five thousand rows is roughly fourteen hours of someone's week, repeated every time the feed changes. An EU Responsible Person service is billed monthly, per brand. This extension is twenty-nine dollars once and runs offline in the editor you already have.

Why not just ask ChatGPT or another AI chat?

A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. GPSR Listing Lint checks the file you open against 12 rules, each naming its legal or official basis, from a rule set dated 2026-09-20, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.

Embed this tool on your site (free)

Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.

 All embeddable tools

For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →