v3.1070.1
Map any activities to an element in bulk
The Element action in the activity bulk toolbar no longer needs the list filtered to a supplier. It searches your own elements, or that supplier’s products when the list is filtered to one, and a new Show activities with no element shortcut finds the rows still missing one. See Mapping Activities to an Element in bulk.v3.1060.3
Activity records reach MCP callers
The MCPlist_activities tool now returns activity records, and
get_activity_summary returns them when it’s called without list; both
returned totals only before. A GET /v1/activity request with list= no
longer carries data, page or pageSize, since its records were always
empty.v3.1040.0
Assign an activity group through the API and MCP
POST /v1/activity, PATCH /v1/activity/:activityId and
POST /v1/activity/bulk accept group: { uuid }, and group: null clears it.
A group that isn’t one of your company’s is now rejected with a 400; before, the
write succeeded and dropped the activity’s existing group. The MCP server adds
list_activity_groups, create_activity_group, update_activity_group and
delete_activity_group, and create_activity and update_activity take
group.A new group version carries its LCAs and rules
A new draft version of a finalized LCA group now brings its member LCAs with it. Locked LCAs stay in the earlier version too, while Draft LCAs move to the new one. Each rule becomes the next draft of itself rather than a fresh copy. Feature flagv3.1030.0
Activity CO2e by scope, org, taxonomy and group
GET /v1/activity with list= now gives every scope, org, taxonomy and group
entry the CO2e and count of the activities attached directly to it, and accepts
list=groups. Org entries carry their parent so you can roll them up. The MCP
get_activity_summary tool offers groups too.Activity groups in the public API
New endpoints list, read, create, update and delete activity groups under/v1/activity/group.v3.1023.1
An LCA joins a group only within its inventory
Adding an LCA to an LCA group now checks that the group’s inventory already holds every source the LCA uses, and names any that are missing. From the LCAs tab, Variable offers to add those sources to the inventory first and links the LCA once they’re in. A version past draft — locked, in review, rejected or verified — still takes and releases LCAs, but a missing source there means creating a new draft and adding the LCA to that. An LCA can sit in several versions of one group, never in two groups.v3.1021.0
Origin names a region when no country is known
A material that nothing places in a country now shows the region it’s placed in — Europe, Scandinavia or North America, for example — in the Origin column and in the tables sent to SmartEPD. Countries are listed first, then regions. World and Global still add nothing.v3.1017.0
Materials show where they come from
The Materials and Packaging materials tables on a Declaration’s report have a new Origin column listing the countries each row’s materials are made in, read from the material’s facilities, its location, or its supplier’s location. The SmartEPD sync sends the same countries in its material composition and packaging tables. A Declaration already past draft keeps its tables as they were.v3.1016.0
Transport coverage and modeled vs declared measure what resolved
Transport coverage and the modeled vs declared comparison now sum the lines that do have a weight instead of readingN/A over the whole control, and
leave out a leg or a half only where nothing in it resolved. Verdicts on
existing models can change.
Feature flagv3.1013.1
End-of-life and full life-cycle measure what resolved
The end-of-life and full life-cycle mass balance controls now sum the lines that do have a weight instead of readingN/A over the whole control, and
report N/A only where a figure they state resolved nothing. Verdicts on
existing models can change.
Feature flagv3.1004.0
Set your company’s mass balance tolerance
An Owner or Admin sets the tolerance every mass balance control is judged at, from 0% to 10%, under Settings → Company. Clear the field to go back to the 5% default. The tolerance that counts is the one set by the company that owns the product, never the reader’s, so a customer opening your product sees the verdict your tolerance gives — and every control states the tolerance it was judged at, in the modal’s legend and in the exported table. Feature flagv3.1002.0
The mass balance tolerance defaults to 5%
A company that has set no tolerance of its own is now judged at ±5% rather than ±1%. Balances checked before this read as out of date and re-check the next time the model is read, so a control that was failing narrowly may now pass. A finalized version keeps the 1% it was judged at. Feature flaglist_activities returns a compact record set
The MCP list_activities tool now projects a default field set — uuid,
syncId, description, the dates, quantity, unit, CO2e, scope, org,
taxonomy and group — instead of the full activity record, so a page of
results costs a fraction of the context it did. Name the fields you want in
return, or pass return=all to get the whole record back.v3.998.0
Mass balance controls measure what resolved
Production balance and packaging now sum the lines that do have a weight instead of readingN/A over the whole control, and report N/A only where a
figure they state resolved nothing at all — naming that cell rather than the
first incomplete one. A control that fails while one of the cells behind the
gap is missing a weight now reports amber rather than red, since the missing
weight may be what caused the deviation.
Feature flagv3.995.1
list_activities filters by date, org, scope, taxonomy and group
The MCP activity read tools now declare the filters v1 already applies, so they
actually arrive: org, scope, taxonomy, activityGroup and depth.
startDate / endDate were being read as a year number that only product
queries use, so a date range returned account-wide results; they now narrow the
range as intended. An org or taxonomy filter includes its children unless
depth is 0.v3.994.3
Oversized list responses keep whole records
When using the MCP a list response over the 25,000-character limit was cut at the character, which usually landed mid-record and returned text that was no longer valid JSON. It now keeps as many whole records as fit and adds atruncated block
naming how many were returned and how many were left out; count, page and the
totals keep describing the full result.v3.991.0
Bulk element mapping refuses a unit it can’t convert
Mapping an element onto activity rows multiplied the quantities without checking that they measure the same kind of thing, so pointing a kg-declared element at rows metered in litres produced a plausible-looking wrong number. A row whose quantity can’t be expressed in the element’s declared unit is now left out of the write entirely. A litre row still maps where the element states the volume one kilogram occupies.A mass balance control names its lines without a weight
The lines a control couldn’t weigh are now named under a pass or a fail, not only underN/A, in the modal and in the exported table. The card reads “N
lines without a weight” so it stays distinct from the lines a failure blames.
Feature flagv3.983.0
Modeled vs declared is a warning, not an error
A declared weight often comes from a customer’s own system and may not be the real weight, so a model that disagrees with it is now flagged amber rather than red. The comparison and the tolerance are unchanged — only the severity — so a product that read as failing on this control alone now reads as a warning. Feature flagFilter the model by version state
The model view takes a filter on the version state of the element behind each input, so you can pull up just the draft lines holding a verification up. It hides rows at every nesting level and never moves a figure: totals and shares keep reading the unfiltered model. A line backed by the Variable Database has no version state of its own. Feature flagv3.977.0
Production balance weighs the model against itself
The A1 control stopped reading the declared product weight: it now weighs the ancillaries you model at A1 and A3 against the waste the model states at A3, with the product on both sides. It declines rather than passing where the model states neither an ancillary nor an A3 waste line, and it blames only the cells that can actually be wrong. End-of-life nets the A1 ancillaries out of the A3 scrap too, so scrap stated as an A1 ancillary is no longer subtracted twice. Verdicts on existing models can change either way. Feature flagv3.972.0
Un-verifying steps back the versions that rest on the sign-off
Revoking a sign-off now returns the verified versions that use that element to Locked as well, up through the products and LCA groups that consume it — a sign-off given on a model is only as good as the elements underneath it. The cascade runs from the bulk Change state action too. Re-verify from the changed element upward once each part of the model has been looked at again. Feature flagv3.970.0
Bulk sign-off names the rows it couldn’t verify
Mark as verified in the bulk toolbar now applies the same model check the single-item action does. A row whose model still uses unverified elements is reported as blocked — counted separately from skipped and not found — and a Cannot verify panel names each unverified element, where it sits in the model, and which selected rows it holds up. Verify those first, then retry the blocked rows. Feature flagv3.967.0
Verify checks the model before it lets you sign off
Mark as verified is now disabled until the elements the model uses are verified themselves, and the dialog lists what’s blocking it — each unverified element your company owns, its version state, and where it sits in the model. Elements owned by the Variable database or another company don’t need your sign-off. Work from the bottom of the model upward, then return to the parent. Feature flagv3.963.2
Primary data share on dataset-backed elements
An element backed directly by a dataset — a dataset container or an electricity element — has no inputs to average, so it recorded a primary data share of0
and every model above it inherited that zero. It now inherits the share from
the dataset behind it, and a share you’ve declared yourself still wins. Shares
on models you already have move on their next recalculation.v3.962.0
Public API: the taxonomy path filter matches whole segments
GET /v1/taxonomy?path= compared the path as a plain prefix, so path=material
also returned material-handling and its descendants. It now matches on segment
boundaries, and a trailing slash is trimmed rather than matching nothing. A
query that relied on the old prefix behavior returns fewer rows.v3.955.1
Rules can target the quantity a line states
A rule can now measure the quantity typed on an input line rather than what that line weighs, so a process line’s kilowatt-hours or a count of fasteners is targetable. Pick Line quantity in the parameter picker and it branches into one row per dimension the group’s own lines are metered in; a matched line metered in another dimension is named as a gap, and a weight rule whose matched lines mix product mass with a process line’s kilograms reads as not applicable rather than summing two different things.v3.945.1
Saved views on the locations list
The locations list now runs on the shared data table, so it has quick search, a filter bar, a column picker, row height, a sticky header and saved views — keep a view to yourself or share it with your company. The address bar carries whatever you are looking at, so a copied link opens the same rows for a colleague. Bulk delete moves into the toolbar, and a location something already uses cannot be selected; the checkbox carries the reason.v3.935.0
A rule threshold can be stated per unit
A rule target can carry a per-unit basis, so the row reads as the intensity it states —≤ 8 kg CO2e / m2. Pick the dimension beside the threshold’s own
unit and the rule divides by the matching amount the LCA records; a divisor
that is missing, zero, negative or in another dimension reads as not
applicable and names which.v3.932.1
Rules can target a product’s area, volume, length or lifetime
Area, volume, length, technical life and reference service life are now offered as rule targets whether or not the group’s PCR declares a key of that name. Each is stated in the unit you would normally read it in, so a lifetime threshold is authored in years rather than seconds.A formula can combine units that multiply out to its target
A formula’s units are compared by what they measure rather than how they are spelled, sopower consumption × reference service life × coefficient = energy used can be saved, and bounding an ADPf formula by a resource-use indicator
no longer refuses over the two spellings of the megajoule.v3.929.0
Notes and evidence on the mass balance
Every control on the mass balance, and the balance as a whole, takes an annotation: a Note for why the model reads the way it does, or an Evidence for what backs the claim. Either can carry files — a lab report, a supplier statement — or none at all. Notes stay internal to your company: they never appear on a declaration, through the API or behind a share link, and they never change a verdict, so an explained deviation still reads as failing.v3.928.2
Saved views on the LCA groups list
The LCA groups list now has a filter bar, URL-bound sorting and paging, and saved views. Save the columns, filter and sort you use as a named view, keep it to yourself or share it with your company, and switch between views from the tabs above the table. The address bar carries whatever you are looking at, so a copied link opens the same rows for a colleague.v3.926.2
Duplicating or versioning a product carries its declaration
A product copy now takes every declaration the source holds with it. A new version continues a locked declaration’s chain; a plain duplicate starts a fresh one. The registration identity does not carry — registration and declaration numbers, issue date and valid-until are cleared, and the copy starts as a draft.v3.906.1
Activity imports match an existing supplier by name
An activity CSV naming a company without its id created a new company on every import instead of matching the supplier already there, and missed that supplier’s product too. The name is now matched case-insensitively, and accepted when it resolves to exactly one company. A row naming no company at all resolves to the single product matching its SKU, whatever supplier owns it.v3.902.0
A negative line quantity reads as a net input
Closed-loop production scrap re-fed into the next run never crosses the system boundary, so a practitioner states it as a negative quantity on its own line. That was treated as an unresolvable weight, which voided the mass balance for the whole model; it is now netted, the way modeled weight and the impact engine already do. A weight rule matching such a line measures the net instead of skipping the line, so its verdict can change. Feature flagv3.901.0
Rules can measure impact per functional unit
The parameter picker offers every indicator twice — once on the declared unit and once per functional unit — and commits the basis with the indicator, so two rules on the same indicator read differently in the list. A functional-unit target is measured against the LCA’s own declaration. Feature flagA formula rule can be bounded from both sides
A formula field takes two comparisons as well as one, bounding the middle from both ends —2 < metals + packaging <= 5, or
transport <= metals <= 2 * transport. Each end keeps its own strictness, so
< and <= mean different things on the same line, and each may be a plain
number or an expression over the same variables, resolved per LCA. A bound
that measures nothing drops the cell to N/A naming which side, and two bounds
that resolve to an empty range report N/A rather than failing every member.
Feature flagv3.898.0
Mass balance on the product weight card
A LIVE product’s Total weight card opens a mass balance: a signed table of every flow — product, packaging, ancillary and waste — across A1 to C, with per-row and per-column sums, the weights you declared beside them, and each row expandable to the elements underneath. Seven controls read that table and say what does not reconcile, within a ±1% tolerance; hovering one outlines the cells it read. Basis is gross weight as modeled, waste counts only what the model states explicitly, and a lane’s cargo is shown but never summed. The footer exports the matrix and the controls as one CSV. Feature flagv3.895.1
Published EPDs state both unit bases
An EPD whose results are declared per functional unit now sends its declared-unit results too, as a second set in every result section — impacts, resource use, output flows and carbon flows — each naming its own basis. The weights and dataset amounts elsewhere in the document are stated per declared unit, so a reader comparing them against the results was comparing two bases. Documents whose conversion factor is 1 are unchanged.v3.882.0
Process lines no longer carry weight they never deposited
A kilogram on a process line is the impact factor’s basis — impact per kilogram processed — not matter the line adds to the product. It was being counted as weight anyway, inflating inventory weight totals, the model CSV’sInput_Weight and any rule measuring weight. Waste lines are unaffected, as
they are matter genuinely leaving. Weights on affected models will drop.Rules can be reordered by dragging
The rules list keeps the order you put it in — drag a rule by its handle to move it. Feature flagA rule can be bounded from both sides against another parameter
A range rule measured against another parameter now takes both a lower and an upper multiplier, so “packaging is between 2% and 5% of declared weight” is one rule rather than two. Feature flagv3.873.0
The model CSV separates top-level items with a blank row
The product model CSV export writes a blank row before each top-level item after the first, so you can see where one item’s block ends and the next begins. A script parsing the file needs to tolerate the spacer rows; the JSON export is unchanged.Deciliter (dl) is a supported unit
Quantities can be entered and converted in deciliters.v3.871.1
Non-material rows export N/A as their material group
A row whose element sits outside the material taxonomy — an energy or waste line — now exportsN/A in the model CSV’s Material_group column, the way
the model page already renders it. The stored value is untouched, so
composition tables, program-operator submissions and rule filters read what
they read before.v3.871.0
The model CSV’s notes column is now Input_Notes
The column carrying a line’s notes was headedInput_Name, which is not what
the model page calls it. It now reads Input_Notes, and the default leg names
the page leaves blank are blank in the file too. A spreadsheet or script keyed
on the old header needs updating.Nested material groups name their whole chain
The model CSV’sMaterial_group column named a nested PCR group by its leaf
alone, so Control gear gave no hint that it sits under Product and two groups
under different parents read identically. The cell now carries the chain —
Product > Control gear.Lines measured in flow units publish no weight
A line measured in kWh, tkm, hours or money exportedInput_Weight as 0 with
a blank unit. It now exports nothing, while a line genuinely measured as 0 kg
keeps its zero.Very small quantities read as themselves
A quantity below the display precision —0.0000217, say — showed as 0 in
the editable field while the weight cell beside it showed the real value. Both
now extend the precision to the first significant digit.Milliliter (ml) is a supported unit
Quantities can be entered and converted in milliliters.v3.868.1
Rule filters take a set of taxonomies and stages
A rule’s filter can name several taxonomies, life cycle stages or elements at once instead of one each, so “packaging at A4 or A5” is a single rule. Two new dimensions come with it — Life cycle stage and Material flow — and the filter builder toggles the members of a set in place. Feature flagv3.865.1
Nested inventory rows show the stage they inherit
On the product’s Inventory tab, a row nested under a bundled line now reports the stage it takes from that line, matching the model page and the CSV. The tab published each row’s own stage, so the same model told two stories about where its lines sit.v3.865.0
The model CSV names material groups the way the page does
The product model CSV export’sFunctional_Group column is now
Material_group, and its cells carry the display name the model page shows —
Control gear, not controlUnit. A spreadsheet or script keyed on the old
header or the stored values needs updating; the API’s own materialGroup
field still reads and writes stored values.v3.864.0
Nested model rows show the stage and material group they inherit
On the model page, a row nested under a bundled line shows the stage it takes from that line as a read-only chip, and a row that takes its material group from the line above shows that group the same way; hovering either names the line it came from. Both cells previously offered a selector for a value the row doesn’t publish, so the page disagreed with the CSV beside it.v3.862.0
Nested product rows are exported under the parent line’s material group
A nested row whose own material group is Product now reports the group of the line that pulls it in. A sub-model’s steel under a Packaging line counts as packaging — in the EPD’s packaging table, in the material composition published to program operators, and in the CSV — rather than as part of the product’s own composition.Mix constituent figures carry the unit they were computed in
A mix constituent’s quantity and weight in the model CSV export were labelled with one unit and computed in another, agreeing only when the mix happened to be consumed in its dimension’s base unit. Quantities now convert into the unit the mix is consumed in, so one mix’s constituent rows add up to the mix quantity.v3.861.0
Bundled sub-model rows are exported under the bundling line’s stage
In the model CSV export, the rows of a bundled sub-model are reported at the stage of the line that bundles them, matching the single cradle-to-gate total the calculation books for that line. Rows the parent’s stage doesn’t cover are left out rather than moved.v3.860.0
Weight on the product Inventory tab
The Inventory tab has a Weight column: what the model consumes of each element, in kg. A cell is empty where the element carries no weight to report — a transport leg, a use-stage line, an element measured in kWh or hours — and reads--.-- where a weight should exist and none was found.v3.857.3
The model CSV export follows the page’s life cycle order
Rows in the product model CSV export are ordered by life cycle section, the way the model page groups them, so the file and the screen can be read side by side. They previously came out in raw input order, mixing the stages together.v3.857.2
The Inventory tab reports what the whole model consumes
The product Inventory tab’s Quantity column totals each element across the model, scaled by the quantities of every parent above it. A source inside a sub-model the model uses twice previously showed the per-parent figure.v3.857.1
The use-stage line recalculates when the PSR or a product-sheet value changes
Selecting a PSR on a Declaration, or entering a product-sheet value its equation reads, recalculates the use-stage (B6) line. The stored result previously stayed as it was until someone edited the use stage by hand, so a Declaration could report a use-stage impact that no longer matched its inputs.Verification findings are grouped, and warnings read as advice
The submit-for-verification dialog groups repeated validator findings into one line with an occurrence count, keeps the requirement titles behind a disclosure, and separates warnings and notices from the findings that actually block submission. One real refusal that filled the dialog with 221 red bullets came from 3 distinct problems.Verifiers can download the product export
Export CSV and Export JSON on a product page were disabled for the verifier role, which is the one role whose job is to take the model off the page and check it. Both are available to verifiers now.v3.856.0
Rules can target a value from the product sheet
A rule can measure any attribute the group’s PSRs declare on the product sheet, compared in the dimension the PSR declares it in. Keys declared as an enum or a boolean are compared for equality against a declared option instead of a threshold. A declared key no member has answered is still offered — a rule against it is how a verifier finds the members that are missing the value. Feature flagv3.853.0
Rules can measure energy use
An Energy used parameter measures what energy and process elements consume, so “B6 electricity is at most 400 kWh” is now an expressible constraint. Feature flagThe activity list filters by dataset status
The Dataset status filter reaches the Activity list, which is server-paginated and so needed the filter in its query rather than in the browser.v3.850.0
Rules can be narrowed to element categories, and measure transport
An LCA group rule can be narrowed to the element categories it applies to, and the parameter picker offers only what those categories can measure. Two transport parameters — cargo weight and distance — read off the transport line. Feature flagv3.848.0
Weight parameters name which weight they mean
The rule picker’s weight parameters are grouped under Modelled weight and Declared weight, each offering Product, Packaging and Total. Declared packaging, declared total and modelled packaging are new; Declared weight is renamed Declared product weight, which is what it always measured —Product.weight excludes packaging. Rules already written are unaffected.
Feature flagFilter element lists by dataset status
The Dataset status filter — Assigned or Unassigned — reaches the Inventory list and its element lists, and the Products list, not just the product Inventory tab it shipped on. The Dataset list withholds it: every row there reads as assigned, so the filter would return every row or none.v3.846.0
Filter element lists by LCA group
Every element list — the inventory pages, a product’s own inventory panel, an LCA group’s buckets — takes an LCA group filter, narrowing the list to the elements that group governs. Parts and transport types match on it too, not just products and materials. Feature flagVersion state has its own column, and its own filter
Version state moves out of the name cell into a column of its own on every element list, and a Version state filter narrows a list to draft, in review, locked, verified, or rejected. The company Inventory list — the one place every element appears — never showed a state at all before. The “Where it’s used” tree shows each row’s state as well. Feature flagFind everything that uses an element or dataset
A Uses element or dataset filter narrows a list to the elements that consume a chosen one — so a dataset or material can be traced to every model built on it. A depth toggle picks between Used directly and Used anywhere in the model, which is the default, so a dataset three levels down the bill of materials still matches. The filter is on the inventory lists, an LCA group’s buckets and LCAs tab, and a product’s own inventory panel.Change version state for a whole selection
A verifier who selects rows in an element list gets a Change state selector in the bulk toolbar, carrying the same transitions, confirmation copy, and rejection-reason rule as the single-item path. Each option names how many of the selected rows are eligible for that transition, and an option no row is eligible for can’t be picked. Feature flagv3.811.0
Documentation files on every element
Every element — product, model, sub-model, material, dataset, or electricity — now has a Documentation section in its settings, holding any number of supporting files with an editable comment on each. It’s where the rationale for a dataset choice, and what else was considered, belongs; previously the Product sheet slot was the only general-purpose place to put such a file, and datasets had no slot at all.v3.807.0
Send a locked version back with a reason
A verifier can now start a review on a locked product, material, dataset, element, or LCA group, then approve or reject it. A rejection records the reason, so a version that was looked at and refused is no longer indistinguishable from one nobody has picked up yet. A rejected version stays immutable and is kept for the record — the fix path is a new version — and a verifier who rejected by mistake can un-reject it.All four actions belong to the Verifier role, and marking a locked version verified outright still works: a review is a path, not a step you have to take. Feature flagTwo new version states in the API
versionState on product, material, energy, process, and dataset reads can now be
in_review or rejected, alongside draft, locked, and verified. If your
integration branches on this field, handle the two new values — until now the field was
left out of the response entirely for a version in either state. It is also always
present now: records created before versioning report draft rather than omitting it.
versionState is documented in the API reference for the first time.v3.749.1
Submit an EPD to SmartEPD for verification
A “Submit for verification” action on the EPD sync panel sends the current document to SmartEPD’s review queue, without leaving Variable to do it by hand. It’s available once the EPD has been synced to SmartEPD at least once. Submitting requires the EPD’s governing LCA group to be Verified — if it isn’t, the dialog says so and nothing is sent. A confirmation step names the EPD before sending; there’s no way to withdraw a submission afterward.v3.744.0
Fuel consumption and gross density are entered as rates
Two fields on a transport scenario (A4) asked for the wrong kind of quantity. Fuel consumption asked for a volume of fuel and transported product gross density asked for a weight, but SmartEPD reads them as l/100km and kg/m³ — so a gross density entered as 2,500 kg was published as 2,500 kg/m³.Both now ask for the rate itself, in a plain box with the unit named in it. There’s no unit to choose, and the number you type is the number that’s sent.Whatever was entered in those two fields before this change is no longer shown and is no longer sent. Enter the rate on any transport scenario that had one, then re-sync — EPDs synced earlier keep the values they were sent with.v3.694.1
Scenario amounts sync to SmartEPD in the right unit
Amounts on your scenarios — transport distances, end-of-life masses, product weight — are now converted into the unit SmartEPD expects before they’re sent. Previously the number went across as you entered it, so a distance recorded in miles was read as kilometres on the other side.If a value can’t be converted because it’s a different kind of quantity than the field asks for — a weight where a length belongs — the field is left out of the sync and the reason is reported, rather than sending a number that would read as plausible but wrong.EPDs you synced before this change keep the values they were sent with. Re-sync to update them.v3.664.0
Open a synced EPD in SmartEPD
The SmartEPD sync popover on an EPD now titles itself with the operator’s name, and that title links straight to the EPD in SmartEPD instead of leaving you to go find it there yourself.The link is live as soon as a sync succeeds, and only once SmartEPD has an EPD to point at.v3.648.0
Breadcrumbs survive a reload
The breadcrumb trail in the header now stays put when you reload the page, so you keep the path you took to get where you are instead of starting over. The recent-history menu beside it is restored the same way, and it carries across tabs rather than being rebuilt in each one.Both are cleared when you sign out or switch companies.v3.622.0
A more compact record header
The header on LCA, inventory, and dataset records can now be collapsed to a single compact row — name and status alongside inline impact, weight, and data-quality summaries. Use the toggle beside the page actions; on LCA records you can also click the border under the tabs. The header opens expanded as before, and your choice is remembered across records.The “Last updated” line has moved off the bottom of the LCA record page. The same history is available from the “Edited:” link in the record’s settings panel.v3.619.0
Viewers and verifiers can see suppliers and customers
The Viewer and Verifier roles now have read-only access to your suppliers and customers by default, matching the Contributor role. None of these roles can create, edit, or delete supplier and customer records — that stays with owners and admins. Account owners can still adjust the default per role under Access Control.v3.612.0
Assign a supplier to many inventory items at once
Select items in your inventory, choose Assign supplier from the bulk toolbar, and pick or create the supplier. By default only items missing a supplier are filled in — items that already name one are skipped, and the count is shown before you confirm. Tick Overwrite existing suppliers to re-point every selected item instead. Bulk assignment writes to drafts only. See Assigning a supplier in bulk.v3.601.0
Set a technical life alongside reference service life
Products can now carry a technical life — the expected physical life of a product — as a time quantity, separate from its reference service life. Enter it in product settings, and your PCR equations can reference it as a named variable to drive the functional-unit calculation, B6 operational energy, and coefficient-based EPD variants for products whose technical life differs from their declared reference service life. When set, it appears on the EPD report next to reference service life.v3.585.1
Verify locked versions with the Verifier role
Teams can now sign off on locked versions. A new Verifier role grants read-only access plus one capability — marking a locked version as Verified, the highest-confidence state, recorded in the audit history with an optional note. Assign the role from Users & roles, then use Mark as verified on a locked version. See Product and material versioning. Feature flagv3.581.0
Set a dataset on an element through the API and MCP
You can now bind an emission-factor dataset to a sourced element — material, energy, or process — in the same call that creates or updates it, instead of only reading the binding back. Senddataset: { uuid } (plus an optional
datasetAmount) to point the element at a dataset; binding one makes the
element external (dataSource: external), and sending a different dataset on
update re-points it. Use /v1/database to find a dataset to bind.These writes are available through MCP as well, alongside the rest of the
element write contract: weight, packagingWeight, recycledPercent,
dataSource, supplierPartId, cpcCode, and dataQualityIndicators. Custom
transport modes accept their backing dataset as dataset too (the older
footprint field still works but is deprecated). See Datasets
and the Material reference.v3.572.0
Justify your data quality ratings
You can now record a free-text justification alongside your data quality ratings — why those ratings were chosen, which production years and background datasets the figures rest on, and any caveats a reviewer should know. It reads and writes through the API and MCP asdataQualityIndicators.description, on
both products and materials, and is editable in the Variable app next to the
ratings it explains. See Data quality.v3.569.1
Set data quality indicators through MCP
Data quality indicators are now available through MCP, matching what you can already do in the Variable app. When you create or update a product or material, you can record the documentation year, the share of the footprint backed by primary data, the share backed by supplier-specific data, and the five data quality ratings (technological, temporal, geographical, completeness, and reliability). The average data quality score is still calculated for you. See Data quality.v3.569.0
Bundle or unbundle optional benefits (D)
Bill-of-materials lines placed at optional benefits (D) can now toggle between bundled and unbundled, the same as every other stage group. Bundled (the default) imports the source’s cradle-to-gate (A1–A3) total stamped onto module D; unbundled imports the source’s own module-D value — its recycling or recovery credit — into stage D. Existing inputs are unchanged: the default stays bundled. See Life-cycle stages explained.v3.568.0
Richer dataset reference on custom transport modes
A custom transport mode is backed by a single freight emission-factor dataset, and itsdataset reference now carries the same detail as external elements:
alongside uuid and name, read responses include the source database and
the declaredUnit (a freight unit — tonne-kilometre or tonne-mile). Built-in modes have no backing dataset
and omit it. There’s no datasetAmount — a mode’s factor is a unit quantity in
its declared unit, so it adds nothing beyond declaredUnit.The enriched reference also surfaces through the MCP get_transport_mode and
list_transport_modes tools. See the
Transport mode reference.v3.567.1
See the dataset behind an external element
External elements — materials, energy, and processes that get their impact from a single emission-factor dataset (dataSource: external) — now tell you which
dataset that is. Read responses include dataset (the backing dataset’s uuid,
name, source database, and declaredUnit) and datasetAmount (the quantity
and unit consumed). Both are absent for modeled products. If you narrow a
response with return, list dataset / datasetAmount there too or they’re
omitted.The same fields surface through the MCP element tools (get_material,
list_materials, and the energy/process element tools). See the
Material,
Energy, and
Process references.v3.566.0
Absolute impact contributions in the inventory tab
In the app, a product’s Inventory tab now shows each element’s absolute contribution to the model — its intensity scaled by quantity into the model’s stages — instead of a per-unit intensity, so you can see what every material, process, and transport segment actually adds to the product’s footprint. The GWP-fossil contribution shows for everyone; a missing value stays a dash and a real zero shows zero.With all impact indicators enabled, a selector above the table swaps the impact column across every EN 15804+A2 indicator the model exposes — each in its own unit — defaulting to GWP-fossil. See Environmental impact indicators. Previewv3.563.0
Attach transport to a model input
You can now attach a freight transport lane to a model input through the public API and MCP — modeling the transport leg of a product’s bill of materials end-to-end without dropping into the app. Send atransport block
on POST / PATCH (and the bulk input endpoint) with the lane to follow and
either the material input it carries (for) or an explicit cargo weight; send
transport: null to detach.When you set for, the leg takes its lifecycle stage and cargo weight from the
carried material, so weight is derived rather than sent. Reads echo the lane,
weight, carried material, and the derived tonne-kilometres (tkm); the leg’s
carbon footprint flows into the model total. The MCP create_model_input and
update_model_input tools gain the same field. See
Models & Inputs.v3.549.0
Deleting an import undoes the field updates it made
Deleting a product or material import no longer just removes the items it created — it also reverts the scalar updates that import made to pre-existing items. Fields it overwrote are restored to their prior values, and blanks it filled in are cleared again. The revert is guarded: any field you (or a later import) changed after the import is left untouched, so a delete never clobbers newer edits. When some fields are skipped for that reason, the app tells you how many couldn’t be reverted. See Undoing an update.v3.539.0
Material imports default to filling in blanks
Material imports now default to Fill missing only, so re-importing a file backfills blank fields — weights, CPC/HS codes, descriptions, notes — on materials you already have, without overwriting anything you’ve already set. A stored0 or empty value still counts as set and is kept. Product and other
import types are unchanged and still default to Create new only; you can
switch either to any mode on the upload screen. See
Import match mode.You can also see which existing products an import updated, not just the ones it
created: an import’s detail view now lists updated products under their own
Updated tab.v3.535.0
Energy and process elements in the public API
You can now manage energy and process elements through the public API and MCP, the same way you already manage materials: list them, create and update them, upload an image, and delete them — one at a time or in bulk. New/v1/energy
and /v1/process endpoints mirror /v1/material.An energy or process element behaves like any other element; what makes it
“energy” or “process” is simply its place in the taxonomy. Creating one files it
under the matching category automatically, and you can pass a taxonomy to pick
a more specific subcategory.GET /v1/material now returns materials (and any uncategorized elements), so
energy and process elements no longer appear there — reach them through their own
endpoints. See the Energy and
Process references.v3.526.0
Update existing materials and products on import
Material and product imports now have a match mode that decides what happens when a row matches an item you already have. Pick it on the upload screen: Create new only (the default — matched rows are skipped, today’s behavior), Overwrite existing (the imported value wins), or Fill missing only (fill blanks, keep what you’ve already set). Use it to backfill enriched source data — weights, CPC/HS codes, descriptions, notes — onto items you created earlier, without re-keying them by hand.Only the item’s own fields are updated; its relationships — supplier, assigned datasets, and bill-of-materials inputs — are left untouched in every mode. Under Fill missing only, a stored0 or empty value counts as set and is kept:
Variable treats zero as a value and only a truly missing field as missing.
Re-imports still match by SKU (or name), so they never create duplicates. See
Import match mode.v3.518.0
Set data quality indicators on materials
Material elements now have an editable data quality panel beside the dataset passport, so you can set all five pedigree-matrix dimensions — technological, temporal, and geographical representativeness, completeness, and reliability — directly on a material, not only on the dataset it points to. The aggregate data quality rating folds in all five and updates as you edit.v3.512.0
Public API: set temporal representativeness directly
temporalDQR is now a writable data-quality indicator on product create and
update, alongside the other pedigree-matrix ratings (technologicalDQR,
geographicalDQR, completenessDQR, reliabilityDQR). Send 1 (Good — same
reporting year), 2 (Fair — less than 5 years old), or 3 (Poor — more than
5 years old).Previously temporalDQR was read-only and inferred from documentationYear;
it’s now set directly, matching the data-quality panel in the app.
documentationYear remains a separate, writable field for reference.v3.508.0
Public API & MCP: recycled content on products
Product and material responses now carry recycled-content percentages.recycledPercent is the value you declare (0–100) — a 0 is a declared zero,
while an undeclared value is absent — and modeledRecycledPercent is the
server-computed weight-weighted average of the contributing inputs’ recycled
content, the recycled-content counterpart to modeledWeight.Each model input also carries its own recycledPercent, inherited from the
input’s source product — the source’s modeled recycled content when available,
otherwise its declared value, or 0 when there is no source product or the source
has neither — so you can trace a model’s recycled content line by line.
modeledRecycledPercent is derived from the bill of materials, read-only
(ignored if sent on create or update), and present only once a model has
contributing inputs. The same fields flow through every MCP tool that reads a
product or material.v3.503.0
Public API & MCP: total modeled weight on products
Product and material responses now also carrymodeledTotalWeight — the gross
modeled weight, the sum of modeledWeight and modeledPackagingWeight — in the
same Amount shape ({ quantity, unit }).It’s derived at read time from the two component weights rather than stored, so
it can’t drift from them: a missing addend contributes nothing, the unit follows
the first present addend, and the field is present whenever at least one of the
two is. Like its parts it’s read-only (ignored if sent on create or update). The
same field flows through every MCP tool that reads a product or material.v3.491.0
Filter the product inventory by dataset status
The product inventory now has a Dataset status filter so you can narrow the list to items that already have a dataset assigned (Assigned) or still need one (Unassigned). Use it to find the products missing footprint data before a bulk update. The filter applies to assignable items (products and energy); composed (live) items count as assigned.v3.478.0
Public API & MCP: modeled packaging weight on products
Product and material responses now also carrymodeledPackagingWeight — the
server-computed sum of a model’s A1–A3 packaging input weights — alongside the
declared packagingWeight, in the same Amount shape ({ quantity, unit }).It’s the packaging counterpart to modeledWeight: compare it against the
packagingWeight you declared to mass-balance packaging the way an EPD reviewer
would. It’s derived from the bill of materials, read-only (ignored if sent on
create or update), and present only once a model has qualifying packaging inputs.
The same field flows through every MCP tool that reads a product or material.v3.466.0
Public API & MCP: modeled weight on products
Product and material responses now carrymodeledWeight — the server-computed
sum of a model’s A1–A3 product-group material input weights (excluding packaging
and ancillary inputs) — alongside the existing weight field, in the same
Amount shape ({ quantity, unit }).Use it to compare what a model actually adds up to against the weight you
declared: weight is the value you set, while modeledWeight is derived from
the bill of materials and is read-only (ignored if sent on create or update).
It’s present only once a model has qualifying inputs. The same field flows
through every MCP tool that reads a product or material.v3.459.0
Auto-assign transport across a bill of materials
Variable can now fill in transport for you. Instead of hand-attaching a lane to every material in a model, use Auto-assign transport on a product — or select several products on the product list and run it in bulk. For each material, Variable reads the facility it’s made at (or its supplier’s location) and the facility your product is made at, finds an existing transport lane that connects those points within a radius you choose, and creates the transport input using the material’s own weight.The closest matching lane wins; a tie with no clear winner is left for you to resolve, and transport you’ve already set is never overwritten. When the run finishes you get a summary grouped by result — assigned, no match, ambiguous, and the rest. The default radius is 50 km, adjustable per run. PreviewPublic API & MCP: categorize model inputs
You can now read and write an input’s material group through the API and MCP. Each input carries amaterialGroup array — common values are product, packaging, and
ancillary, and custom values (for example from a PCR document) are allowed.Set it on create or update and it comes back on every read (single input and
list). This lets integrations model packaging and ancillary inputs end-to-end
instead of relying on the value Variable infers. The legacy isPackaging flag
stays consistent automatically.v3.452.0
Public API & MCP: write a dataset’s impact indicators
You can now set a dataset’s environmental impact indicators through the API and MCP — the write counterpart to reading them.PUT /v1/dataset/{uuid}/impacts takes the same keyed shape the
read endpoints return: each EN 15804+A2 indicator code (e.g. GWP-fossil,
ODP) maps to its life-cycle stage values (A1–A5, B1–B7, C1–C4,
D). Totals like A1_A3 and totalCarbonFootprint are computed for you, and
the dataset’s footprint is recalculated on write.Indicators you omit are left unchanged, so you can fill in a dataset
incrementally. The dataset must be in draft state (newly created datasets are).Using an MCP client, this means an assistant can now build a fully populated
dataset from a source document in one flow — create the dataset, then call
set_dataset_impacts to write its indicator values.Public API & MCP: all impact indicators in responses
Products, materials, datasets, switches, and database search results can now return their full set of EN 15804+A2 impact indicators — acidification, ozone depletion, water and energy use, waste, and the rest — not just carbon. Impacts come back under a new top-levelimpacts field, keyed by indicator code (for example
GWP-fossil, ODP, AP).Opt in with the impacts query parameter: ?impacts=all for everything, or
?impacts=gwp-fossil,odp,ap to filter to a subset. Without it, responses return GWP-fossil
only, so existing integrations are unaffected. The same data flows through every MCP tool that
reads these resources.The existing footprint.CO2e field is unchanged and still works, but is now deprecated in
favor of impacts["GWP-fossil"]. See Impacts for the response shape and query
semantics.v3.443.0
Public API & MCP: manage your locations
You can now manage your company’s locations — factories, warehouses, offices, and ports — through the API and MCP, not just in the app. List the sites you already have, add new ones, update their details, and remove the ones you no longer need. Pin a site to a point on the map so it carries real coordinates, or keep it as a plain address. You can also set up a location on behalf of a supplier you work with, not only your own company.Once a location exists, reuse it anywhere you pick a place — for example the start or end of a transport route. A location that’s still in use is protected: remove the places that reference it before you can delete it.Using an MCP client, just ask your assistant to list, create, update, or delete a location.v3.431.0
Public API & MCP: fetch a supplier by internalId
GET /v1/supplier/{id} now resolves a supplier by its uuid, syncId, or
internalId — the same internalId the API returns on the supplier — so you
can read a supplier back by the identifier you already have. The MCP
get_supplier tool accepts all three. PATCH and DELETE continue to require
the uuid.v3.429.2
Public API & MCP: model freight transport
Build and reuse freight routes through the API. Transport lanes (/v1/transport/lane) are ordered legs, each with a mode, an origin, and a
destination; distances auto-compute from the endpoints, and a lane reports its
carbon intensity (CO2ePerTkm) rather than an absolute total — the total
materialises once cargo weight is applied. Transport modes
(/v1/transport/mode) cover the system-curated built-ins (truck,
container-ship, train, the air-* haul bands, …) plus custom modes you
create from your own freight emission-factor datasets. Lanes support full
CRUD; built-in modes are read-only, while the custom modes you create are
fully editable.The MCP server exposes the same operations as transport-lane and
transport-mode tools, so an agent can assemble routes end to end.v3.428.0
Public API: read and write product notes
Products now expose theirnotes field through the API and MCP. GET
responses include notes, and you can set it on POST/PATCH (or via the
create_product/update_product MCP tools) alongside description.v3.423.0
Public API: resolve addresses into transport-leg locations
Two new endpoints turn a free-text address into a referenceable location, so you can set transport-leg origins and destinations programmatically instead of pre-seeding them in the app.GET /v1/geolocation?search=... geocodes a string
like Syracuse, NY into ranked, un-persisted candidates; POST /v1/geolocation
persists a chosen candidate (by googleMapsId) or a manual point
(name + coordinates) and returns it with a uuid. Reference that uuid — or a
candidate’s googleMapsId directly — on a transport leg.The MCP server exposes the same surface as geocode_location and
create_geolocation tools.v3.413.1
Terrestrial eutrophication now reported in mol N eq
The EP-terrestrial (Terrestrial eutrophication) impact indicator is now reported inmol N eq, matching EN 15804+A2. It was previously labelled
mol H+ eq (the acidification unit) — a mislabelling inherited from
ecoinvent, which documents the same error in its
v3.11 known issues.
The stored values are unchanged — only the unit label was corrected.v3.390.0
Inputs editor: enter quantities in alternative units
The input amount field now groups units by dimension and lets you enter a quantity in any unit the source product supports — e.g. enter a board as2.4 m against an m²-declared product, and Variable converts to the
declared unit using the product’s conversion factors. The source
product’s length, volume, and area conversion factors are now editable
directly from the product preview sidebar. This is the UI counterpart to
the declaredAmount API shape shipped on May 22.Location picker: pick a location without an address
Picking aLocation that has no attached GeoLocation in the
transport-leg location picker now works — previously the click was
silently dropped, blocking address-less custom locations from being used
as a segment endpoint.Public API: machine-readable taxonomy path on responses
Taxonomy references on/v1/product, /v1/material, and /v1/activity
responses now include a path field (e.g. material, energy/electricity)
alongside uuid and name. The path is a stable, machine-readable grouping key
— unlike the human-readable name — so you can reliably branch or aggregate on a
category. Purely additive; existing uuid/name readers are unaffected.File import: BOM rows in mixed units
BOM imports now accept an input quantity in any unit the source product supports, even when it differs from that product’s declared unit (e.g. listing a board as2.4 m against an m2-declared product). Variable converts the value to the
declared unit for impact calculations using the product’s conversion factors and
keeps your entered value in the API. Rows whose unit has no matching conversion
factor are skipped. See the
BOM preparation guide for details.Suppliers can have their own locations
A supplier can now own one or more named locations — a factory, warehouse, or port, each with its own address — managed from the new Locations tab on the supplier page. Mark one as the default (the first one added is set automatically), and it’s used wherever a supplier needs a single address. Supplier locations also appear anywhere you pick a place, such as the origin of a transport leg, searchable by supplier name, so you can reuse “Acme — Rotterdam warehouse” instead of re-typing the address.Public API: fetch a single model input
NewGET /v1/model/{modelId}/input/{inputId} returns one input on a given model.
Responds with 404 when the input does not belong to the model (or does not
exist for this caller). The response carries the same quantity / unit /
declaredAmount shape as the list endpoint.The MCP server exposes the new endpoint as a get_model_input tool, alongside
refreshed list_model_inputs, create_model_input, and update_model_input
descriptions that surface the alternative-unit semantics introduced last week.Owner-controlled AI features toggle
Company owners can now enable or disable AI features for their company directly from Company Settings with the new “Enable AI features” switch. Previously this required Variable support to flip the company-levelDisableAI flag.v3.353.0
Activities anchored in your company timezone
Activity dates now honor aCompany.timezone (IANA, defaulting to
Europe/Oslo), so partial inputs like "2026" or "2026-03" resolve in the
company’s timezone instead of UTC. Period filters (YTD, MTD, specific years)
bucket from the same timezone, and each Activity exposes a new timezone
field recording the zone used on write.v3.335.0
Public API: alternative-unit response shape on /v1/model/{id}/input
GET, POST, and PATCH responses on /v1/model/{id}/input now return the quantity
and unit you supplied, even when those units are in a different dimension than the
source product’s declared unit (e.g. sending kg for an m3-declared source product
with a weight conversion factor). A new read-only declaredAmount field carries the
canonical converted amount in the source product’s declared unit — this is what
impact calculation uses. declaredAmount is present only for cross-dimensional
inputs; same-dimension entries (e.g. l against an m3-declared product) are
unchanged. declaredAmount is ignored if supplied on POST/PATCH.Bulk delete activities from the activity list
Activities can now be deleted in bulk directly from the Activity list. Select activities on the Draft or Rejected tab and use the new Delete button in the floating bulk action bar.Admin-managed maintenance windows for self-hosted
Self-hosted operators can now schedule and run maintenance windows from Admin -> Maintenance windows instead of toggling an environment variable and redeploying. Configure a recurring window (daily, weekly, or monthly in any IANA timezone) with anHH:mm start and a duration up to seven days, or
hit Start now for a one-off window.v3.333.0
Offline ISO-3166-1 country coverage for self-hosted
The seededGeoLocation dataset now covers the full ISO-3166-1 country and territory set (plus
Kosovo, which Google Maps treats as XK). Self-hosted instances can resolve any country offline
without a Google Maps API key. Each row ships with the same googleMapsId, lat/lng, and bounds
that Google’s Geocoding API returns, so locations created via seed match locations created via
online lookup.v3.322.1
BOM import: supplier matching and XLSX precision fixes
BOM imports now match existing suppliers bysupplierId (internalId) alone when no
supplierName is provided, so id-only rows correctly link to suppliers already in your
account instead of falling through and creating products without a supplier link. The
supplier lookup also no longer caps at the first page, so accounts with more than 250
suppliers match reliably.XLSX imports now preserve full numeric precision (previously, cells like 0.0004
displayed as 0.000 were silently truncated to the display string), normalize date
cells to ISO strings, and drop spreadsheet error sentinels (#REF!, #N/A, #VALUE!,
etc.) instead of importing them as literal strings.v3.280.1
Bulk location import
Users can now bulk-create or update Locations from CSV or XLSX files. The Locations page exposes an Import action that maps name, address, and type columns; re-imports merge on name within the company so existing values are preserved when a column is left blank. Addresses are geocoded in the background after import.v3.266.0
SmartEPD integration
Companies can now connect Variable to SmartEPD v2 and push EPDs directly from the platform. Owners configure the connection in Company Settings → Integrations by providing their SmartEPD API key and selecting a workspace. On each EPD, a “Sync to SmartEPD” action lets users choose a PCC and project (creating a new project if needed) and submit the EPD to SmartEPD. A sync status badge on the EPD page shows the current state (pending, syncing, synced, failed, or out of date), and a “Check status” action polls SmartEPD for the latest review state. Once an EPD is approved or published in SmartEPD, Variable automatically locks the EPD to Verified or Published to mirror the remote lock. If the EPD is edited locally after its last successful sync, the auto-lock is skipped and the record is markedout_of_date instead.v3.260.0
Dataset resource in the public API
The public API now supports managing datasets in your account via/v1/dataset. You can list, fetch, create,
update, upload images, and delete datasets - whether they were user-created, added from the Variable Database,
or shared by a supplier. Deleting a dataset that came from the Variable Database or a supplier removes it from
your account while leaving the original in place; user-created datasets are permanently deleted.New DATASET_READ, DATASET_CREATE, DATASET_UPDATE, and DATASET_DELETE permissions gate these routes.
The same operations are exposed as MCP tools (list_datasets, get_dataset, create_dataset, update_dataset,
delete_dataset), and dataset payloads now use dedicated Dataset, NewDataset, and EditDataset schemas in
the OpenAPI spec instead of reusing Material / NewProduct / EditProduct.dataSource is no longer part of the Dataset surface. The previously documented dataSource: "database" value
has been removed from dataset responses, and sending a dataSource field in a dataset request body has no effect- the server always treats the resource as a dataset based on the route. Clients that read or write
dataSourceon the/v1/datasetendpoints should drop the field.
ProductDataSource enum used on /v1/product and /v1/material is narrowed to "model" and "external".
The "database" value is no longer accepted on those routes - datasets now have their own endpoint.v3.252.0
Organization assignment on user invite
Admins can now assign an organization when inviting new users. The org selector appears in the invite modal and the backend creates the membership in the same transaction as user creation.v3.247.0
Role-based access control
A new Access Control page gives a clear overview of what each role- Owner, Admin, Contributor, and Viewer - can access across your organization. Permissions are organized into five categories:
- Products - LCAs and Declarations (All roles)
- Inventory - Materials, Energy, Transport, Process, Datasets, and Activities (All roles)
- Exchange - Elements, Suppliers, Customers, Requests, and Deliveries (Owner and Admin only)
- Reports & Plans - Analyze, Report, and Plan (Owner and Admin only)
- Account - Org, Users, Locations, Company Settings, and more (Mixed access)
v3.245.0
Extended org access control
Organization-level access control now covers transports, datasets, parts, and EPDs in addition to products and materials.Self-service dataset copying
Users can duplicate database datasets into their own company, enabling custom modifications. PreviewSecond indicator in modelling
The modelling screen now supports a secondary impact indicator alongside GWP, allowing side-by-side comparison of environmental impacts. Sorting by the second indicator is also supported.Taxonomy enforcement and dataset alignment
Taxonomy alignment is now enforced when assigning datasets to inventory items. A mismatch indicator shows when a dataset’s taxonomy differs from the input and offers a one-click update action.PERM/PENRM calculation for classified materials
Impact calculations now include PERM (primary energy from renewable materials) and PENRM (primary energy from non-renewable materials) for material inputs classified with flow types.BCCP and BCCAP rules
The impact calculation service now applies biogenic carbon content rules (BCCP for products, BCCAP for packaging) based on functional group classification, per EN 15804+A2.Geographic filtering
Search results can now be filtered by geography, making it easier to find region-specific datasets and products.A1-A3 entry mode toggle for custom datasets
Custom datasets now support toggling between individual A1, A2, A3 stage entry and a combined A1-A3 entry mode.Decimal separator override for data imports
Data imports now support explicit decimal separator selection, resolving ambiguity with European-format CSV files.Self-hosted data package delivery
Self-hosted instances now receive emission factor data packages via mounted volumes, simplifying data updates.v3.210.0
Versioning in Public API
The public API now supports versioning for products and materials. Create new versions, list version history, and fetch specific versions via the API. Bulk endpoints updated accordingly. PreviewvarId added to Public API
All API responses now include the varId field - a human-readable, short identifier for each entity.
PreviewBOM import adapters
A new adapter pattern for BOM imports allows external formats (e.g., SAP S/4HANA) to be automatically transformed into the expected CSV structure on upload.v3.164.0