Global InVEST

The GEP service library: state and open questions.

Motivation

Nature is invisible in the accounts

  • Ecosystems supply services the economy depends on, from pollination and soil retention to coastal protection and carbon storage, yet none of them appear in standard national accounts.
  • Unmeasured, their loss shows up later as lower yields and higher damages.
  • The Gross Ecosystem Product (GEP) account values what ecosystems supply, country by country and service by service, so natural capital can be tracked alongside GDP.
  • The same service models also drive scenario analysis. They trace how climate and land-use scenarios change the services economies depend on, and the results feed the macroeconomic pipelines.

Why one reviewed library

  • Different contributors developed the GEP service models in different repos, each with its own layout, path conventions and aggregation choices.
  • The library brings them into one repo with one layout. Every service runs the same way and writes the same per-country table the GEP account reads.
  • The library gives policymakers a tool to price nature risk as the scenarios they use today carry no ecosystem-service feedback.

What global_invest is

One module per service

  • The library holds one folder per ecosystem service, all on the same file convention.
  • 28 services carry their GEP method in the library, with their input data in the shared base data.
  • Some services also produce a scenario shock for the macroeconomic pipeline. A shock exists where the scenarios’ physical changes (the land-use maps or the climate pathway) reach the service’s model.
  • The library is scenario agnostic. A caller supplies its own scenarios (the maps, the years and the naming) through configuration.

How every GEP number is built

  • Every service’s number is obtained by multiplying a quantity of service delivered by a price and by nature’s share of it, summed to one row per country.
  • The three parts differ per service (recreation’s quantity is visits and its price is travel cost, livestock’s nature share is the ecosystem-provided part of feed), but the construction never changes.

The code structure

File Content
functions.py The equations, pure science.
tasks.py The estimation steps. Each task writes one output.
initialize.py The table of contents (the list of steps, and the entry point other pipelines call).
run_<service>.py The main script per sevice. Runs the steps.
method.qmd The written explanation of the method.
results.qmd The report of the results, rendered at the end of every run.
  • Those six files sit in every service’s folder. One more file sits outside them: utilities.py, which holds what all the services do the same way. The country list they all join to, the collapse from 264 regions to 250 countries, the report rendering, and the reading of the shared CSVs.
  • run_<service>.py asks initialize.py for the list of steps, each step in tasks.py calls the equations in functions.py and writes its output.
  • A run ends by rendering results.qmd into a standalone HTML report for that service, carrying its total and the per-country table.
  • A service with a shock has a second runner for it, run_<service>_shock.py.
  • The methods are work in progress.
  • Three shared CSVs carry the configuration (next slide).

The template for each service

  • Every run file lists the steps of its pipeline in one build_task_tree function.
  • A service reads its settings from rows in three shared CSVs.
  • es_config.csv: one row per service, with the GEP formula (quantity, price, attribution) plus the land-cover map it reads, the base year and the price convention.
  • es_scenarios_test.csv: the standard SEALS scenarios, with matching test maps shipped, so a standalone shock run works on any machine.
  • es_parameters.csv: the run parameters and the references to each service’s data.
  • Every service reports one row per country (r250).

Automatic report by service

Terrestrial carbon’s report: its total, the same figures by income group, region and continent, the per-country table, and this map.

The library’s two callers

  • Each service module serves two callers. The GEP account reads the valuation (one row per country), and the macroeconomic pipeline reads the scenario shock (a table of productivity deviations).
  • Both read the same functions file, so a change to the science reaches both callers at once.

Where things stand

The state in numbers

  • The library holds 28 service modules. Three of them value two services each, so together they produce 31 per-country accounts.
Accounts Where the number comes from

13

We compute it. The quantity, the price and nature’s share are all built in the repo, and all thirteen now report a total.

11

We compute part of it. One component is ours and the other is read from a published source.

3

We take the economics from a published table. Two turn a published rent share into dollars; one reports a finished per-country figure.

3

We value the output of a model we do not yet run ourselves. Air filtration and sandstorm prevention report totals; stormwater reports retained volume only, because its price is a placeholder of 1.
  • Every available input is in the shared base data.
  • 10 of our runs land on a committed reference or the manuscript. For the rest we could not find a reference to check against.
  • Every module whose run has finished has rendered its report.

What the code does, service by service

  • The services differ in how much work stands between input and number, which is separate from whether the number is ours: a service can run a model here and still take its coefficients from someone else.
What the code does Accounts Which
Reads a published value

1

urban cooling
Rescales a published rate

2

mining production, extractive energy
Table arithmetic

16

crop, livestock, both fisheries, energy, hydropower, water use, air filtration, sandstorm, wildfires, water quality, coastal protection, moisture recycling, groundwater recharge, pest control, nature view amenity
Raster arithmetic

9

terrestrial carbon, coastal carbon, pollination, ntfp, timber, floods, stormwater, both health strands
Process model run here

3

erosion, landslides, recreation
  • One of each, in order: urban cooling reads a dollar column out of a committed file, mining rescales a World Bank rent share times GDP, crop production multiplies FAOSTAT output by the CWoN land rental rate, and pollination multiplies 158 production grids by price and dependence cell by cell.
  • The three process models have dynamics of their own: erosion runs InVEST SDR with sediment routing, landslides computes slope stability twice per pixel, and recreation allocates banded trip budgets into dissolved sites and prices three spending channels.
  • The ladder measures work, not confidence. The account without a usable number sits at the top: stormwater has no dollar total because its price is a placeholder. Crop production, down at table arithmetic, reproduces its reference exactly.
  • One label per service also hides a split. Water quality computes its dollar figure and reads the one it reports, coastal protection computes mangroves and reads corals, and wildfires computes the valuation on coefficients it did not fit. The ours column carries that, the category cannot.

Can the services be added into one total?

  • Adding every headline figure gives about $11.2T, using the agricultural water-use variant. Using the all-sector one instead makes the same sum about $46.7T. World GDP in 2019 was about $87T.
  • The account reports no total, because that sum swings four-fold on one unresolved choice inside one service.
  • Q1: the irrigation premium gives $248.0bn: irrigated land earns more per hectare than rainfed, and only that difference is water. Is the natural-resource share applied to it right, given it covers land and water together?
  • Q2: which overlaps should be netted out before anything is added? Pollination values part of what crop production already counts, livestock’s feed share overlaps crop production, and coastal carbon overlaps terrestrial carbon on the landward side.
  • Q3: does the account want one headline figure at all, or the services reported separately?

What each service is

Service What it values
terrestrial_carbon carbon stored by land ecosystems, priced at the social cost of carbon
coastal_carbon carbon in mangroves, salt marshes and seagrass
pollination crop production attributable to wild pollinators
erosion soil the land cover keeps in place, valued through crop productivity
landslide_mitigation landslide deaths avoided by forest cover, valued at a value of a statistical life
fisheries commercial capture-fisheries rent and subsistence catch value
crop_provision the value of crop production

What each service is (continued)

Service What it values
livestock_provision livestock production attributable to ecosystem-provided feed
coastal_protection storm damage avoided by mangroves
extractive_materials mineral resource rents
renewable_energy wind, solar and geothermal production value
recreation expenditure on visits to natural recreation sites, valued at travel cost
fire_protection wildfire damage avoided by nature’s fire regulation
water_supply hydropower rent, and water withdrawal priced by sector
ntfp non-timber forest products from forest within reach of a road or river
stormwater stormwater retained by vegetation and soils, not yet masked to urban areas

What each service is (continued)

Service What it values
air_filtration deaths avoided by vegetation removing air pollution
sandstorm_prevention deaths avoided by ecosystems suppressing windblown dust
water_quality water-treatment costs avoided by nutrient retention
flood flood damage avoided by ecosystems
local_climate_regulation cooling-energy costs avoided by urban vegetation
extractive_energy fossil-fuel resource rents (gas, coal, petroleum)
timber_provision the net value of timber harvests, net of harvest and transport costs

The status sheet

column what it holds
method how the number is computed
ours whether we can recompute the number ourselves
total the figure the account takes
code the engineering work we did
number what the figure is, and what it was checked against
need what we are missing

Services and totals (base year 2019)

Service Total Verified
terrestrial_carbon

$5.365T

yes.
coastal_carbon $17.72bn EEZ-only, $58.75bn all rows yes.
crop_provision

$814.3bn

partially. The reference arithmetic reproduces as a column beside ours; the published figure additionally fills FAOSTAT’s USD price gaps from the values table the pollination module stages
livestock_provision $246bn rental rate, $653bn feed share no. Both attributions run; which one the account uses is the open decision, and there is no reference output
coastal_protection

$36.28bn

partially. Mangroves are replicated, $30.40bn against their $30.40bn; the coral half, $5.88bn after the shared CPI, is read through
extractive_materials

$99.54bn

yes.
renewable_energy

$173.49bn

partially. The code and the drive’s reference CSVs give different values, and which one is current is the open question

Services and totals (continued)

Service Total Verified
pollination $387.67bn at 2019, the author’s raster. $515bn FAO side yes.
erosion not reported no. The run is ongoing.
landslide_mitigation $657.8M (570.66 avoided deaths at the shared EPA life-years-lost VSL; $770.7M at OECD) largely. His v0.2.1 per-country output matches ours at 0.978 log-correlation with the same five leaders, pinned by a test; the sheet column ($865M) matches neither run
fisheries shock + commercial GEP $29.00bn provisional + subsistence $7.92bn + aquaculture $63.13bn partially. Subsistence reproduces its committed output, and the commercial table matches the author’s per-country CSV at his rounding; aquaculture’s delivered $100.68bn differs structurally from both earlier vintages
recreation $82.3bn ground travel, residents plus tourists at a/365; accommodation $982bn and air $527bn published beside the total no. The author’s rewrite commits no output table, so our run is the first end-to-end number
fire_protection -$1.3bn provisional, one of three coefficients partially. Reproduces the committed output, but reads the committed regression coefficients rather than refitting them. Kosovo and two Indian sub-regions now reach a country instead of no country
water_supply hydropower component $146.08bn yes.
water_use $248.0bn irrigation, from a $701.4bn premium, and $95.6bn domestic no. The drive’s two committed figures were produced separately, so neither is a reference

Services and totals (continued)

Service Total Verified
air_filtration

$17.81bn

yes.
sandstorm_prevention

$595.36bn

yes.
water_quality $638.34bn USD and $655.91bn intl$ partially. We recompute the nutrient valuations and reproduce the committed intermediates; the headline international-dollar column is read through
flood

$112.78bn

partially. Our recompute matches the pipeline’s table, Morocco excepted
local_climate_regulation $175.56bn ours no. We compute it from our own city valuations; the committed table’s $14.19bn differs by a country-varying factor
extractive_energy $1.05T (gas + coal + petroleum) yes.
timber_provision

$132.13bn

yes.
ntfp $28.87bn no. No reference output
stormwater 185.85bn m3 retained. No dollar total: the price is a placeholder of 1 no. The retention run is ours, and no author run exists to compare against
moisture_recycling $127.7bn, of which $75.3bn crosses a border as exported rain no. No reference figure exists anywhere; the construction implements the submission’s own valuation direction
groundwater_recharge $6.80M avoided pumping cost in 2019 USD yes. The sheet’s $7.21M is the owner’s 2021-tariff construction, reproduced to the cent in all 108 valued countries before the shared deflation
pest_control $10.34bn with the appendix’s organic price premium, $7.49bn without partly. The sheet’s $6.25bn sits at the no-premium level, log-correlation 0.93 across countries; its own pipeline is not on the drive
health_hypertension $148.71bn over the 20 countries with a cost study partly. Rank yes (log-correlation 0.989 on the appendix’s $104.66bn), level 42 percent above on named deviations; no pipeline exists on the drive
health_depression $96.15bn at the method’s stated scope no, deliberately. The author’s $159.6M is the same construction at roughly 1/400th of the urban population, so the gap measures the undocumented run scope
nature_view_amenity $46.09bn hotel room-price premium in 2019 USD yes. The owner’s $59.73bn at the scrape vintage reproduced to the cent in all 124 countries, twice; the published figure deflates it to the base year

Open questions by service

terrestrial_carbon

  • Values carbon stored by land ecosystems: a zone-by-class density table on the land-cover map, priced at the rental social cost of carbon. Our run reproduces the manuscript’s total, once a double-count that entered split countries once per sub-region (China six times, overstating the total by 23.5 percent) was fixed.
  • Q1: do carbon prices grow, and at what rate? The rental is P(1 - e^-r) where r is the net rate, the discount rate minus the growth rate of carbon prices, so our 2 percent column assumes prices do not grow. The table already holds the alternative: 3 percent discounting minus 2.2 percent growth, so 0.8 percent net, giving $2.29 a tonne against our $13.19.
  • Q2: is the 1 percent sensitivity wanted? The 3 percent one is a run of its own and gives $3.4627T against $5.365T, but 1 percent cannot be produced from what we hold. The table holds two prices, $181.60 per tonne of CO2 at 2 percent and $78.53 at 3 percent, and we could not figure out where they came from.

coastal_carbon

  • Values carbon stored in mangroves, salt marshes and seagrass: mapped habitat times per-habitat density, priced like terrestrial carbon. Computed in the library from the habitat maps, and it reproduces the author’s reported numbers.
  • Q1: was EEZ-only chosen to avoid double-counting the landward pixels with terrestrial carbon? Most of the mapped habitat sits landward of the shoreline (97.5 percent of mangrove area, 84 percent of salt marsh), so including it multiplies the total by 4.5.
  • Q2: which exact seagrass and salt marsh input versions produced the report’s $26.65bn? Our replication gives $17.72bn with the mangrove component matching, and the report’s own seagrass area (62.21 Mha) exceeds the published range it cites (16 to 26.7 Mha).
  • Q3: if both sides count, a landward mask must prevent double-counting with terrestrial carbon. Does one exist?
  • Q4: should a habitat be credited with a cell its mapped extent only clips? Crediting every touched cell whole doubles the mangrove extent and nearly triples salt marsh, because both are ribbons about as wide as a cell; both totals in Q1 sit on that inflated extent.

marine_carbon

  • The service sheet lists Terrestrial, Coastal, and Marine carbon. No marine module found in any repo.
  • Q1: is marine carbon in scope for the account?
  • Q2: if yes, which data drives it?
  • Q3: most open-ocean carbon sits in the high seas, inside no country’s EEZ. Which attribution convention should a per-country account use?
  • The sheet lists one more subgroup under the same service, Other Non-Carbon GHG. We could not find a module for it either, and the same three questions apply.

pollination

  • Values the crop output that animal pollinators are responsible for. We build the value raster ourselves now. The old figure was 26 times too small, because the raster holds a value per km2 and the step that summed it treated it as a value per cell.
  • Q1: which definition does the account want? The crop output at stake if pollinators vanished, or the service habitat currently delivers. The account reports $387.67bn; multiplying in the 300 m habitat sufficiency gives $163.45bn, on one grid at 2019 prices. Only the second responds to land-use change; the first is a property of the crop mix. The author now reports $163.45bn for the weighted figure, having split coffee into Arabica and Robusta after we raised it, so the two agree to within a tenth of a percent.
  • Q2: does the account add pollination on top of crop_provision? Crop multiplies production value by the land rental rate, so both attribute part of the same output to nature.

erosion

  • Values soil the land cover keeps in place: prevented erosion mapped by running the sediment-delivery model, valued through crop productivity. $18.24bn across 185 countries, of which 26 compute an exact zero. The author reports $14.59bn across 164 for the same baseline scenario.
  • EPS-5 is carried as the sensitivity beside the SES-11 baseline, settled by the author on 2026-08-30. It relaxes the severity threshold from 11 t/ha/yr to 5 and takes the reported figure from $14.59bn to $29.1bn.
  • A border cell now goes to the country covering its centre rather than to whichever country the rasteriser reached last, so a country’s value no longer moves with its row order in the boundary file. The move to ee_r250 changes nothing, measured.
  • South Sudan drops out of the join and we think we know why: the dependency table spells it SDS where the country table uses the ISO code SSD. Its value is zero today, so nothing is lost yet.

landslide_mitigation

  • Values landslide deaths avoided by forest cover: slope stability modelled with and without forest root cohesion, the difference turned into avoided deaths and priced at a value of a statistical life. Computed end to end in the library. His v0.2.1 per-country output (632 deaths, $707.2M) matches our distribution at 0.978 log-correlation with the same five leaders, Nepal first in both.
  • Q1: can the all-services sheet carry his v0.2.1 column? Its current $865M column is USA-led and matches neither his v0.2.1 run nor ours, so it prices some other quantity from some other run.
  • Q2: which input versions did the run behind the v0.2.1 release use?
  • This is the only service that builds its own value of a statistical life, from the OECD country table. To price a death the same way across the account it should move onto the air quality group’s shared table, and that will change this number, since the two sources differ.

fisheries

  • Values commercial capture fisheries as the economic rent of the catch, and subsistence fisheries as the consumptive-use value of home catch. The commercial rent is computed in the library from the CWoN tables. The subsistence component reports the published per-country values, and reproduces them exactly.
  • Q1: should the RCP8.5-for-RCP7.0 substitution stand?
  • Q2: should the account’s fisheries value come from the CWoN resource rents or from the FishStatJ catch pipeline? Is there a per-country CSV from the run of the CWoN script?
  • Q3: does the subsistence value add to the commercial number, or does that number already contain the subsistence catch? Where FAO catch statistics already include subsistence fishing, summing the two counts it twice.

recreation

  • Values nature-based recreation on the author’s rewrite at his documented calibration: residents’ day trips and tourists’ site trips ($1.43bn at his corrected a/365 per person-night) priced at round-trip fuel cost into dissolved high-quality sites, $82.3bn over 133 countries. Accommodation at the hotel-price surface ($982bn) and air travel at the staged regional fares ($527bn) are published beside the total, as the author’s own country table reports them. Three source defects were fixed on the way in: the UNWTO overnights read at their stated thousands, the hotel allocation divided by the national stock, and the fuel economy read at its stated 7.1 litres per hundred kilometres.
  • The author answered the person-night question (each night carried the full annual rate of 102.5 trips; now a/365) and the channel scope follows his combined total: ground travel summed, the rest beside it. A country missing either ground channel carries a missing total, his own table arithmetic.
  • Q1: will he share one per-country output of his fixed run, so the port verifies by replication rather than construction? His repo does not yet carry the a/365 fix; ours is implemented from his stated formula and reconciles when he pushes.

crop_provision

  • Values crop production from FAOSTAT production values, quantity times price, times the land rental rate. FAOSTAT’s USD value stops wherever its own USD price series stops, so production with no value is a price gap. Those pairs take the value the pollination module already stages, production times that year’s USD price falling back country to subregion to region to world, and the rental rate then applies to both. The fill moves India from $12.9bn to $103.3bn and newly values 22 countries.
  • Q1: does the account add crop_provision and pollination? The reasoning is on the pollination slide.
  • Q2: is subsistence in scope as a separate crop subgroup? Adding it would double-count, because FAOSTAT’s production values already include part of what households grow and eat themselves. The reference pipeline is now ported and its own arithmetic, $1.83bn, reproduces beside ours as proof the port is faithful. We publish $23.78bn: its units disagree with its sources, and it predicts the own-consumption level from cropland area where the survey measures a share.
  • Q3: should the 24 countries whose crops now carry value but no CWoN rental rate read as zero, as they do, or as unvalued? A zero reads as land contributing nothing.

livestock_provision

  • Values livestock production and attributes to nature the share of feed ecosystems provide. Both attributions now run: on $2.29T of gross production over the 65 FAO item codes, the CWoN land rental rate gives $519bn and the GLEAM feed share gives $653bn, a factor of 2.6. India recovers from zero to $136bn on the item list alone.
  • Q1: which factor does the account attribute with, the land rental rate or the feed share? They differ by 2.6 times. The rental rate belongs to the crop method, and this service’s own method page defines it as the factor, but that page is the crop method page, referring to crop items throughout.
  • Q2: should milk and the other missing products count as livestock production? The library’s old list covered meat and eggs only and captured 4 percent of India’s FAO livestock value, while the method repo’s list of 65 products includes milk.
  • Q3: can you share the GLEAM 3 intake extract (gleam3_dmi.xlsx) and a per-country output? We harvest the intake from FAO’s public dashboard, so we compute the feed share; what we lack is anything to validate it against.

coastal_protection

  • Values storm damage that mangroves and coral reefs prevent along coastlines. The $36.28bn is the sum of two halves that stand differently. Mangroves are ours: hectares times value per hectare reproduces the published table to within $5,291 on $30.4bn, which is its own per-row rounding. Corals are not: that file carries a finished benefit per country with nothing underneath it, $5.17bn at 2011, carried to 2019 by the account’s shared US CPI factor, making it $5.88bn. One scalar carries every country, so the 9 countries the per-country deflator table lacked (Taiwan the largest, $78.8M) are now valued like the rest.
  • Q1: is there code behind the coral-reef benefit table that we should be running? That half is still someone else’s number, so a disagreement with it could not surface.

extractive_materials_provision

  • Values mineral extraction as the resource-rent share of mining output. Computed in the library from the World Bank rent and GDP tables, and our run reproduces the reference per country.
  • Q1: what is the source of the 0.49 factor? The valuation multiplies mineral rents times GDP by it, and without it the total would be $203bn instead of $99.54bn.
  • Q2: should the 9 countries with no World Bank rent data stay unvalued rather than zero? We leave them empty today, which is the convention the group’s guidance asks us to confirm.

renewable_energy_provision

  • Values wind, solar and geothermal electricity as generation times price times a resource-rent share. Our run gives $112.52bn wind, $54.41bn solar and $6.56bn geothermal, and a fresh run reproduces each to the cent.
  • Q1: which is current, the code’s $173.49bn or the drive CSVs’ $134.6bn?
  • Q2: should wind, solar and geothermal be three services in the account or one? The sheet lists three, the library computes them together and already writes a table per resource, so either shape is a configuration change rather than a rewrite.

fire_protection

  • Values wildfire damage avoided by nature’s fire regulation: a per-country fire-persistence coefficient times the country’s 2018 burned area gives avoided acres in 2019, valued at EM-DAT damage per burned acre. Our run reproduces the source repo’s committed output for all 161 countries.
  • Q1: which of the three coefficients is the account’s value? They disagree in sign: baseline persistence gives -$22.4bn, the nature-versus-human cause difference -$1.3bn, and the nature-versus-human area difference +$16.7bn.
  • Q2: should the 13 countries the regressions do not cover stay unvalued? No data is not zero avoided damage.

water_supply

  • Values hydropower rent and priced water withdrawal. Hydropower comes from the CWoN wealth table, $146.08bn across 97 countries, reproducing the drive’s committed output on the 95 it covers. Water use is computed here: agriculture $1.06T across 123 countries, all-sector $36.36T across 149.
  • Q1: which hydropower total is the account’s, the manuscript’s $287.7bn or our rent-based $146.08bn? The first follows a direct-use method, price times generation, the second the resource-rent method.
  • Q2: why does the reference leave 17 countries empty although the CWoN table values them? We report 97 and carry the 95-country variant as the comparison, so the $144.68bn anchor still checks out.
  • Q3: SDG 6.4.1 is value added per cubic metre withdrawn, so multiplying it back by withdrawal returns the value added of the water-using sectors. What share of that is attributable to water?
  • Q4: how do hydropower and the two water-use components combine into one water_supply value?

air_filtration

  • Values deaths avoided by vegetation capturing air pollution, priced at a GDP-adjusted value of a statistical life (the monetary value assigned to one avoided death). We recompute the valuation and reproduce the committed totals. The avoided-death counts come from the group’s emissions-to-health model, which turns fire emissions into excess deaths; we do not rebuild it and take its counts as given.
  • The valuation reads the group’s country table directly, sourcing the value of life for 218 of 250 countries, and the totals are unchanged.
  • Serbia and Kosovo are swapped in the workbook, which labels both rows Serbia: the row that is Serbia carries Kosovo’s value of life and the row that is Kosovo carries Serbia’s. We read them the right way round from the table.
  • Q1: Macao and Palestine are priced per country in the workbook but appear nowhere in the table. What is their source?
  • Q2: which currency year is the table in, and could it carry an ISO3 column rather than a slugged country name?
  • Q3: which vintage are the avoided-death counts?

sandstorm_prevention

  • Values deaths avoided by ecosystems suppressing windblown dust, priced the same way as air filtration and computed by the same module. We recompute the valuation and reproduce the committed totals.
  • The two questions on the previous slide apply here unchanged, because both channels share one calculation and one VSL column.

water_quality

  • Values water-treatment costs avoided by nutrient retention: nitrogen and phosphorus retention per country, scaled by the AQUASTAT domestic-water-use fraction and priced at treatment cost per kg. Our rebuild reproduces the committed intermediates for 178 countries. The retention estimates come from an upstream nutrient-delivery model we take as given.
  • Q1: where is the script that converts USD to international dollars? The factors implied by the two committed values sit far from the World Bank’s published ones, so we could not identify the conversion, and the committed output is the only place it appears.
  • Q2: which currency does the account use? This service is in 2019 international dollars, every other service in 2019 market USD.

flood

  • Values flood damage avoided by ecosystems: flood depth by return period, JRC depth-damage curves and a per-country EUR/m2 damage value by land type give each country’s expected annual damage. Our recompute reproduces the pipeline’s table for 146 of 148 non-zero countries.
  • Q1: should the service-flow fraction multiply into the valuation? The pipeline computes one but never applies it, so today’s number is expected flood damage rather than damage ecosystems avoid.
  • Q2: are the JRC depth-damage curves meant to be applied over true ground area? They are a damage per square metre of asset, and the damage pass gives every cell the same area, taken from a projection whose cells shrink away from the equator. Weighting each country’s damage by its latitude moves the global total by about 28 percent, and the countries carrying most of the value sit far from the equator. The treatment is the pipeline’s rather than ours.

local_climate_regulation

  • Values cooling energy avoided by urban vegetation: an urban cooling model gives each city-month a cooling effect, priced at national electricity prices. We now sum the city files ourselves, $175.56bn across 177 countries, instead of reading the committed table.
  • Q1: is the committed table the with_country_mc variant, and can we have Data/consumption_per_cdd_by_country_iea.csv? Your gep_fixing_cooling_valuation_v04.py computes both, differing by one line: with_country_mc = without_mc * consumption_per_cdd, an IEA consumption per cooling-degree-day factor that varies by country. That would explain why the gap between our $175.56bn and the committed $14.19bn is not a constant, ranging about 2.5 to 766. We cannot check it because the factor table sits in your input directory rather than the shared base data.

extractive_energy

  • Values fossil-fuel resource rents (gas, coal and petroleum) at 2019, on the same commodity convention extractive_materials uses. Computed in the library from the public CWoN rent tables the method appendices name.
  • Q1: are the eight duplicated rows in the committed tables a join error, and which total does the account keep? Christmas Island and Cocos carry Australia’s rents, Bouvet and Svalbard Norway’s, Tokelau New Zealand’s, Western Sahara Morocco’s, Palestine Israel’s and Kosovo Serbia’s, so the committed $1,140.4bn counts those countries twice. One country one row gives $1.05T.

timber_provision

  • Values timber harvests net of harvest and transport costs. Our reimplementation matches the committed output for all 166 countries.
  • Q1: is there a forest-management mask behind the value raster, or code that builds one? We can sum that raster to countries and match it exactly, but the mask saying which forest is available for harvest is not derivable from the layers we hold.
  • Q2: where does the value raster stop being per hectare and become per cell? The appendix gives every input per hectare while the account sums the raster flat, which comes to $42 per hectare of managed forest against $337 as a density, so the conversion is undocumented.
  • Q3: should timber take its ecosystem share from GTAP when every other service takes one from CWoN? Both name the part of gross output accruing to land, they are built differently, and the account adds the services together.
  • Q4: can we have the CWoN timber rent? CWoN 2024 carries timber as a land asset, but what is staged holds only the other categories, and non-wood forest products is a different thing.
  • The only description of the value raster is timber_provision_appendix, staged in base_data; the cited repo holds no timber code.

ntfp

  • Values non-timber forest products over forest within 10 km of a road or river and green enough to yield one. $13.85bn across 195 countries, over 1.48 billion reachable hectares. Every choice is the source module’s: 300 m Mollweide land cover, a five-year mean NDVI screen at 0.2, accessibility as the dissolved 10 km buffer of the road and river geometries, and countries by the polygon a cell’s centre falls in.
  • Q1: is there a model behind CWoN’s non-wood forest product value, or is it a published table? That is what stands between this service and a number we compute.
  • Q2: who multiplied three countries by five, and why? nontimber_price_iucn_edited.csv matches CWoN for 3,045 of 3,108 country-year pairs and is exactly five times CWoN for the other 63, all Central African Republic, DR Congo and Mozambique; they come to $1.37bn of $13.85bn, DR Congo alone $921M, and without the edit the service is $12.98bn.
  • Q3: should a cell sitting exactly on the NDVI floor of 0.2 be kept or dropped? We keep it and the source module drops it, because scaling 2000 by 0.0001 gives 0.19999999 in float32, and that is 202,930 cells or 0.0099% of the valid grid.

stormwater

  • Values stormwater retained by urban vegetation and soils. Our own retention run on the drive’s configuration retains 185.85bn m3 per year across 104 countries, wall to wall rather than urban-masked, and the module prices that volume. The run and the country step sit beside the task tree rather than inside it.
  • Q1: what is the intended price per cubic metre retained? The configuration carries a placeholder of 1, so today’s value is the volume.
  • Q2: should the run be masked to urban areas? It currently covers the whole land surface.

moisture_recycling

  • Values the rain a country’s land sends to its own and other countries’ water use. The WAM2layers country-to-country matrix says what fraction of each country’s precipitation evaporated from each other country’s land; each destination’s irrigation and domestic water GEP is scaled by its terrestrial-origin share and credited upstream to the source countries, giving $127.7bn, of which $75.3bn crosses a border. A re-attribution of the water-supply row, never an addition to it.
  • Q1: how much terrestrial evaporation is the ecosystem’s? The run counts all of it; the literature’s transpiration fraction would roughly halve the row.
  • Q2: how should the account carry it – as a decomposition of water supply, or as a row holding only the transboundary part? Added whole to water supply it would count the same water twice.
  • Q3: should hydropower’s water value be re-attributed too? Rain feeds the rivers; the current construction re-attributes irrigation and domestic only.

groundwater_recharge

  • Values the pumping energy recharge saves: a higher water table means every cubic metre withdrawn is lifted a shorter distance, priced at the country’s electricity tariff. The sheet’s $7.21M is the owner’s 2021-tariff construction, reproduced to the cent in all 108 valued countries; the published $6.80M deflates those tariffs to the base year through the account’s one CPI series. The magnitude is the method’s own: one year’s recharge is one year’s marginal head increment, a fraction of a cent per cubic metre.
  • Q1: is the service in scope? The sheet’s note argues recharge is natural-capital value whose end products are counted elsewhere, yet the sheet carries the column. Avoided pumping energy does not obviously overlap purification or the irrigation premium, so the double-count argument is weaker than the note assumes.
  • Q2: if in, which construction – one year’s marginal head increment ($6.80M), or the stock of avoided water-table depth, which the owner’s staged groundwater-depth data could support and which would be two to three orders of magnitude larger?

pest_control

  • Values the extra yield natural enemies provide on organically managed cropland, at the organic producer price – organic only by design, and the full value attributed to nature with no lambda. Built from the appendix’s own sources: FiBL areas, FAOSTAT yields and prices, the Boldorini effect sizes and the appendix’s yield ratios, giving $10.34bn with the appendix’s 38 percent organic price premium and $7.49bn without it. The committed column’s $6.25bn sits at the no-premium level (log-correlation 0.93 across countries), and its pipeline is not on the drive.
  • Q1: does the committed $6.25bn include the organic price premium the appendix describes? The level says no; with it the same construction gives $10.34bn.
  • Q2: what produced Viet Nam’s $291M? The staged FiBL 2019 areas support roughly a ninth of it under any reading of the method.
  • Q3: can the final pipeline and its inputs be shared, so the row stops being a carried-across file?

health_hypertension

  • Values the hypertension treatment cost urban greenspace avoids: prevalence times the NDVI-driven risk reduction times the urban population aged 30-79, at the country’s published cost per case. Built here end to end: $148.71bn over the 20 countries with a cost study, matching the appendix’s $104.66bn at rank correlation 0.989 and 42 percent above its level on the named deviations.
  • Q1: the drive’s committed per-country CSV mis-attributes 7 of its 19 countries – the values, sorted by country name, were pasted against labels sorted alphabetically, so Nigeria shows Poland’s $6.86bn. Can it be re-exported from the appendix’s Table 6?
  • Q2: which vintage is the sheet’s $106.65bn over 13 countries? It matches neither the appendix nor the committed CSV, and lacks six of the appendix’s countries.
  • Q3: is the cost transfer the account’s route to full coverage? Transferring the 20 studied costs on GDP per capita (R2 0.32, observed studies kept) extends the row to $247.44bn over 187 countries.

health_depression

  • Values the depression cases urban greenspace prevents, at the societal cost of a case, following the InVEST urban mental health model. Built here end to end at the method’s stated scope – all urban residents of the 32 countries with a cost study – giving $96.15bn in market 2019 USD ($97.96bn in the owner’s PPP-2018 dollars before the conversion by country price levels and the account’s one CPI series) and 64.5M prevented cases; the author’s file carries $159.6M, the same construction at roughly 1/400th of that population, so the run’s undocumented spatial extent is now a measured question rather than a guess.
  • Q1: what extent did the author’s run cover? Our full-scope build is 370 times the file at the median country (USA 835, Germany 405), which says a city sample.
  • Q2: which of the drive’s two variants is blessed – high resolution ($159.6M, the sheet’s column) or low resolution ($167.3M)?
  • Q3: the costs are USD PPP, mostly 2018, against the account’s 2019 USD – restate, or carry the caveat?
  • Q4: the two health strands share the same greenness and comorbid outcomes – how does the account avoid double counting between them?

nature_view_amenity

  • Values the room-price premium natural views earn: within one hotel on one date, a sea-, mountain- or garden-view room prices above a comparable room without the view, so brand and location difference out. Ported from the CAS team’s 2026-09-12 submission and anchored to the cent in all 124 valued countries at the owner’s scrape vintage ($59.73bn); published at $46.09bn in 2019 USD through the account’s one CPI series.
  • Q1: the premium is scraped at the submission’s own booking dates; the account now deflates it to 2019 USD through its one CPI series – does the owner agree with that convention?
  • Q2: one uniform mean occupancy (0.539, from 106 reporting countries) applies to every country – acceptable, or should occupancy be per-country where reported?
  • Q3: what are the sample’s provenance details one level deeper – booking platform, scrape dates, hotels per country?

Questions for the scenario shocks, not the GEP account

What this section is

  • Every service here serves two callers from the same science: the GEP account reads a valuation, one row per country, and the macroeconomic pipeline reads a scenario shock, a table of productivity deviations.
  • They are different products with different owners and different decisions, so their questions are kept apart. A question about which shock method to use does not belong beside a question about how a country’s value was measured.

erosion, as a shock

  • Q: which of the three shock methods is the account’s? We compute damage (thresholded area share), service (threshold-free and magnitude-weighted per crop) and service-threshold (service restricted to a fixed severe-pixel set) side by side.
  • Q: should the production run recompute the erosion shock, as the test runs already do? The scenarios file production reads names carbon and pollination as dynamic but not erosion, so erosion alone falls back to the frozen dependency table. The tracked template added erosion in August; the derived copies the runs read date from July and shadow it, because a file already present is never re-seeded.

fisheries, as a shock

  • Q: which CWoN vintage produced the shock file (cwon_shocks.har)?

Cross-cutting questions

Turning outlines into cells

  • Every service that totals a raster inside a country has to decide what a cell the border passes through counts as. Under the centre rule the cell goes to whichever country covers its exact centre. Under all-touched every country whose outline touches it claims it, and since the claims are burned into one id raster, the country rasterised last takes it. Nothing is counted twice either way; what moves is the split between neighbours.
  • Q: should a habitat extent carry the fraction of the cell it covers, instead of either whole-cell rule? The centre rule loses a mangrove strip narrower than a cell, and all-touched books that same 50 m strip as a full 300 m cell. Coastal carbon now measures the fraction, which brings its mangrove extent back to the mapped one and roughly halves it. The question left for the room is whether every service that maps a thing narrower than its cells should do the same.

What a reference check can establish

  • Eleven service entries rest on reproducing an author’s committed output. Where that output came from the code we ported, both sides share every assumption, so agreement establishes that the port is faithful and not that the number is right.
  • Q: what should a service show beyond agreement with its author, before the account treats its number as verified?
  • Q: where a check finds something that belongs to the author’s published number rather than to our port, who takes it to them, and does the account wait for their answer?

How a service measures a cell

  • A service that turns a density into a total multiplies by cell area, so the cell area silently scales every number it produces.
  • There is a default and there are justified departures from it. The carbon services and pollination sit on the shared pyramid in geographic coordinates and carry a per-latitude area. Erosion and ntfp work in equal-area projections because their science needs true distances and areas, and there a constant cell area is exact where a latitude formula would be wrong.
  • The two fail differently. A constant cannot be applied wrongly per cell. A per-latitude area is more precise and every consumer has to remember it, which is how pollination’s earlier figure went wrong.
  • Flood control sits on a projection that is neither, so its constant cell area is exact only at the equator. That is the absence of a convention rather than a third one.
  • Services on different grids cannot be compared cell to cell without a reprojection, which the landward mask coastal carbon needs would require.
  • Q: should a service be required to sit on the shared pyramid unless an equal-area grid is needed, and to state what its cell area rests on, the way the erosion code refuses to run on an unprojected input?

Appendix

How a run finds its data

  • Every input is a reference path relative to the shared base data, and each machine resolves it for itself: the task’s own directory first (so finished work is found and skipped), then the project’s input folder, then the machine’s base_data, then the cloud fallback.
  • A run therefore carries no absolute paths. The same run file works on a laptop, on the cluster, or on any machine that stages the same base data.
  • Tasks cache their output in the project directory and skip themselves when it already exists, so a rerun recomputes nothing and an interrupted run resumes where it stopped.

How a pipeline grafts a service

  • A caller grafts a service with one call (add_<service>_tasks(p) after its land-use step), and the service’s tasks slot into the caller’s own task tree.
  • A CSV cell is a default. The caller’s configuration prevails over the shipped CSVs, so the library never needs to know its callers’ naming.

The configuration table (es_config.csv)

service base year price convention Q P λ land
terrestrial_carbon 2019 rental scc r2% carbon zones raster prices xlsx esa 2019
coastal_carbon 2019 rental scc r2% prices xlsx
pollination 2019 value raster (ours)
renewable_energy 2019 IRENA production WB prices CWON rents
extractive_materials 2019 WB GDP WB rents share
coastal_protection 2019 CWoN mangroves
  • The remaining services’ rows follow the same columns. Blank price-convention cells fill as each module’s convention is named. Every row is under test the moment it is edited.