Guide
CBAM data lineage: testing customs-to-installation evidence links
A complete row can still point to the wrong evidence. A lineage control tests identity, allocation, period and version across records, then reproduces exactly which sources supported a reviewed result.
Last updated: 22 September 2026Sources: Regulation 2025/2619, Article 2: defined customs information; applicable from 1 January 2026Regulation 2025/2547, Articles 7, 9 and 13–15 and Annex IV: reporting periods, calculation and operator-report content; definitive-period methodologyRegulation 2023/956, consolidated 20 October 2025: Articles 7–8 and Annex V, calculation records and verification
Test relationships, not just populated cells
Customs information under Implementing Regulation 2025/2619 Article 2 and installation emissions evidence are separate bodies of information. A customs row does not establish the producing installation or justify an intensity. Joining a supplier name to an emissions report can therefore produce a fully populated, wrong answer.
This article proposes a preparation architecture and tests of data integrity. It is not an official Registry schema, an emissions-allocation method or a claim that CBAM Pulse implements a lineage engine. The import-file field checklist owns the contents of the import record; the distinctive task here is proving that its relationships point to the intended source versions.
Give objects and relationships their own identities
Separate a source object from the assertion linking it to another object. A commercial-party identifier proves which party a document names; it does not by itself prove which installation produced a particular delivery. Preserve the evidence for that assertion, who accepted it and the period for which it applies.
A minimal edge record has its own ID/version, source-object ID/version, target-object ID/version, relationship type, applicable period, evidence reference, state and review event. An identifier alone is not the evidence. Store the actual source or a controlled location from which the exact version can be recovered.
| Object | Versioned content | Relationship tested |
|---|---|---|
| Customs line C | Source row, quantity/unit, import date, amendment status | Allocated to goods evidence slice G |
| Goods slice G | Quantity assignment and product identity | Attributed to installation package P |
| Commercial party T | Contract/order/invoice references | Supplies goods; not automatically the producer |
| Installation package P | Installation identity, goods, reporting period, methodology basis | Supported by evidence and report versions E/V |
| Review snapshot S | Exact objects, edges and calculation references used | Depends on a fixed set of versions |
- Object
- Customs line C
- Versioned content
- Source row, quantity/unit, import date, amendment status
- Relationship tested
- Allocated to goods evidence slice G
- Object
- Goods slice G
- Versioned content
- Quantity assignment and product identity
- Relationship tested
- Attributed to installation package P
- Object
- Commercial party T
- Versioned content
- Contract/order/invoice references
- Relationship tested
- Supplies goods; not automatically the producer
- Object
- Installation package P
- Versioned content
- Installation identity, goods, reporting period, methodology basis
- Relationship tested
- Supported by evidence and report versions E/V
- Object
- Review snapshot S
- Versioned content
- Exact objects, edges and calculation references used
- Relationship tested
- Depends on a fixed set of versions
Separate reuse of evidence from allocation of quantity
One installation package can support several goods lines. One customs line can require several evidenced goods slices. Treat those as many-to-many relationships, not a reason to multiply the customs quantity once for every matching document. Documents substantiate a slice; they are not additional slices.
For example, a synthetic 30 t customs line has documented assignments of 18 t to package P-A and 12 t to P-B. Two documents support P-A. A naive join repeats 18 t twice and produces 48 t; the allocation table must still total 30 t. Store the 18 t allocation once and attach both documents through a separate evidence relationship.
The 18/12 split is assumed to be supported by records in this synthetic test. It is not permission to invent a shipment allocation or emissions weighting method. If the producing-installation split is unknown, mark the relationship unresolved instead of dividing the mass evenly or choosing the package with the lower intensity.
Run failing-then-repaired integrity tests
A pass below means the specified data-control assertion holds. It does not mean that the emissions method, verification or declaration is legally sufficient. Keep failure evidence and repair evidence together so that a later reviewer can see why an initially rejected relationship became usable.
| Failure injected | Detection assertion | Repair evidence |
|---|---|---|
| Wrong installation | Goods slice expects INST-A; package names INST-B | Operator/transaction evidence establishes the correct package; reviewer records the replacement edge |
| Duplicate join inflation | Allocated mass must equal the current customs-line mass, independent of document count | Unique slice retained; supporting documents moved to separate evidence edges |
| Missing precursor edge | A calculation dependency listed in the reviewed process model has no source/version | Relevant precursor reference supplied or calculation explicitly blocked; never a zero placeholder |
| Outdated verification reference | Package version and verification scope/reference do not match the reviewed evidence set | Reviewer checks applicable report scope and records the supported version relationship |
| Revised customs line | Snapshot still references superseded C/v1 rather than accepted C/v2 | Amendment link confirmed; affected slices and calculations reviewed; new snapshot recorded |
- Failure injected
- Wrong installation
- Detection assertion
- Goods slice expects INST-A; package names INST-B
- Repair evidence
- Operator/transaction evidence establishes the correct package; reviewer records the replacement edge
- Failure injected
- Duplicate join inflation
- Detection assertion
- Allocated mass must equal the current customs-line mass, independent of document count
- Repair evidence
- Unique slice retained; supporting documents moved to separate evidence edges
- Failure injected
- Missing precursor edge
- Detection assertion
- A calculation dependency listed in the reviewed process model has no source/version
- Repair evidence
- Relevant precursor reference supplied or calculation explicitly blocked; never a zero placeholder
- Failure injected
- Outdated verification reference
- Detection assertion
- Package version and verification scope/reference do not match the reviewed evidence set
- Repair evidence
- Reviewer checks applicable report scope and records the supported version relationship
- Failure injected
- Revised customs line
- Detection assertion
- Snapshot still references superseded C/v1 rather than accepted C/v2
- Repair evidence
- Amendment link confirmed; affected slices and calculations reviewed; new snapshot recorded
Make period and unit checks explicit
Regulation 2025/2547 Article 7 contains a specific rule for goods imported during 2026: the reporting period is 2026. Do not automatically apply the later-year evidence-based production-period exception to those imports. Store import date, asserted production period and applicable reporting-period decision as distinct fields, with the legal/method reference used by the reviewer.
Reject comparisons that silently treat kilograms as tonnes or confuse tonnes of goods with tonnes CO2e. Check the unit at each calculation boundary, not merely in the final report heading. A numeric value without its unit and basis is not a usable calculation dependency.
For complex goods, the precursor evidence and revision rules determine the substantive dependencies that the graph needs to represent. Lineage can detect a missing declared dependency; it cannot discover an omitted production process merely because every existing edge is valid. Completeness of the process model still needs technical review.
Freeze a review snapshot and replay the change
Suppose snapshot S-1 used customs C/v1, slices G-A/v1 and G-B/v1, package P-A/v2 and report V/v1. Store that version set and the calculation reference together. A query that always fetches the latest report cannot reproduce what the reviewer saw at S-1.
When C/v2 replaces C/v1, record the changed source and traverse its dependants: goods slices, calculations, summaries and review snapshots. Mark the affected outputs stale pending review; do not silently rewrite S-1. A replacement package can trigger the same process even if the customs quantity is unchanged.
Re-run the original integrity tests against the proposed new version set. Save S-2 only with the resulting failures or approvals and a change bridge explaining which outputs changed. The verification evidence manifest remains the owner of report-pack content; the lineage control supplies the exact references needed to compare it with this snapshot.
Use a bounded handoff, not a compliance score
The handoff should identify unresolved edges, affected quantities, stale snapshots, responsible reviewers and next evidence requests. A green completeness indicator is insufficient if its underlying test checks only that a file exists. State whether identity, period, unit, allocation and source-version checks ran and retain their results.
Where an output contains a free-allocation adjustment, attach the route-specific benchmark calculation trace as a dependency rather than a bare result. A changed precursor or benchmark basis then has a visible route to the affected output. Do not recalculate with a guessed substitute while the required input is unresolved.
The result is an inspectable explanation of how records relate. It does not infer missing emissions, select a legally permitted methodology, verify a report or certify readiness for an official declaration.