Skip to main content
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 MCP list_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 flag
v3.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 reading N/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 flag
v3.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 reading N/A over the whole control, and report N/A only where a figure they state resolved nothing. Verdicts on existing models can change. Feature flag
v3.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 flag
v3.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 flag

list_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 reading N/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 flag
v3.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 a truncated 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 under N/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 flag
v3.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 flag

Filter 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 flag
v3.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 flag
v3.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 flag
v3.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 flag
v3.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 flag
v3.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 of 0 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, so power 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 flag
v3.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 flag

A 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 flag
v3.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 flag
v3.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’s Input_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 flag

A 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 flag
v3.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 exports N/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 headed Input_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’s Material_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 exported Input_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 flag
v3.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’s Functional_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 flag
v3.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 flag

The 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 flag
v3.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 flag

Filter 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 flag

Version 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 flag

Find 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 flag
v3.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 flag

Two 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
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 flag
v3.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. Send dataset: { 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 as dataQualityIndicators.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 its dataset 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. Preview
v3.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 a transport 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 stored 0 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 stored 0 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 carry modeledTotalWeight — 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 carry modeledPackagingWeight — 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 carry modeledWeight — 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. Preview

Public API & MCP: categorize model inputs

You can now read and write an input’s material group through the API and MCP. Each input carries a materialGroup 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-level impacts 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 their notes 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 in mol 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 as 2.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 a Location 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 as 2.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

New GET /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-level DisableAI flag.
v3.353.0

Activities anchored in your company timezone

Activity dates now honor a Company.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 an HH: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 seeded GeoLocation 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 by supplierId (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 marked out_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 dataSource on the /v1/dataset endpoints should drop the field.
The 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. Preview

Second 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. Preview

varId added to Public API

All API responses now include the varId field - a human-readable, short identifier for each entity. Preview

BOM 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

Bulk endpoints in Public API

New bulk create, update, and delete endpoints added for products, materials, and activities, allowing efficient batch operations via the API.

Manual geolocation entry

Users can manually enter geographic coordinates with source tracking, useful when automated geocoding is unavailable.