Fig. 07 · EU carbon border reporting
GetCBAM
Turns a non-EU manufacturer's production data and utility bills into an EU CBAM embedded-emissions report, with a QR code linking to a public verification page.
- Role
- Sole engineer
- Team
- Solo
- When
- Dec 2025 – Jan 2026
- Stack
- Laravel 12, Inertia + React, LarAgent, OpenAI, DomPDF, Ably, Stripe
- Links
- GitHub repo
01The problem
EU importers of steel, cement, aluminium and fertiliser must report the emissions embedded in what they buy. That data has to come from manufacturers outside the EU who usually have no carbon accounting, so they pay consultants or fall back on EU default values.
02How it works
6 steps01 · Person approves
The importer invites a supplier
The supplier uploads products, production batches and utility bills. Only bills a person approves are used.
02 · AI proposes
Normalise and classify
Bills are normalised and products classified against 1,095 CN codes.
03 · AI proposes
Allocate energy
Bill energy is allocated to each product from the overlap between billing and production periods, checked against energy benchmarks.
04 · AI proposes
Look up factors
Grid intensity for 86 countries, plus fuel, process and material factors.
05 · Rules decide
Calculate and re-check in code
Scope 1, 2 and 3 plus process emissions. PHP enforces required fields, recomputes any scope the model leaves out, and re-sums the totals so the headline numbers always add up.
06 · System moves data
Issue the report
PDF and XML with a QR code to a public verification page. One report per product, and the data locks once it's sent.
- AI proposes
- Rules decide
- Person approves
- System moves data
03Hard problems
3 of themLLMs doing regulatory arithmetic
The model returns a structured breakdown, but the job validates every numeric field, fills gaps from allocation × factor, and always re-sums totals in PHP.
Bills and production never line up
Allocation takes each approved bill's overlap with the production period, compares it with expected energy, and records its reasoning on the report.
Integrity after submission
A database constraint allows one report per product, data locks once it's sent, failed reports retry from step one, and the QR code points to a public verification URL.
04By the numbers
- CN codes in the reference data
- 1,095
- countries' grid intensity
- 86
- queued stages per report
- 5
- solo build
- 2 wks
05What I'd do differently
For a regulatory number, code should be the calculator and the model only the researcher, picking factors with a citation from a versioned table. Today it's model-first with a code fallback, which is the wrong way round. A qualified person should also sign off before a report is issued.