Fuel Origin

Methodology

methodology_version: 1.8 · Last updated: 2026-09-25.

This page explains how every figure on this site is made. It is written in plain English on purpose, and each section names the engineering document that specifies it exactly.

The rule that governs everything below: we do not fill gaps. If the public record does not support an answer, the site says UNKNOWN. An incomplete answer that can be checked is worth more than a complete answer that cannot.

1. Where the data comes from#

Every number on this site comes from a published source, and every number can be traced back to the exact file we downloaded, the day we downloaded it, and the record inside it.

We rank sources:

  1. Official — statistical offices, customs, ministries, regulators, tax authorities, the European Commission. This is the backbone of the site.
  2. Industry and market — operators' own disclosures, port statistics, recognised market data, where the licence allows us to show it.
  3. Journalism — used to find out that something happened and to date it. Never used as a number.
  4. Inference — things we worked out ourselves from physical records. Always labelled as such, always with the method attached.

The full list, with dataset identifiers, update frequency, licence and known limitations, is on the data health page (/data-health). Each section of a page has a "Source & method" block naming the publisher and dataset behind it; §20 says what each licence asks of us.

Details: docs/DATA_SOURCES.md, docs/ARCHITECTURE.md.

2. Definitions#

  • Crude oil — unrefined oil as it leaves the producing country. Trade code CN 2709.
  • Refined products — petrol, diesel, gasoil, jet fuel/kerosene, naphtha, fuel oil, LPG, under CN 2710 and related codes.
  • Origin country — the country where the goods originated, as defined by the customs rules the statistics office applies.
  • Country of consignment / dispatch — the country the goods were shipped from. This is often not the same as the origin. Where a source gives us consignment rather than origin, the chart says so.
  • Pre-tax price — the pump price with all taxes removed. Published by the European Commission's Weekly Oil Bulletin as "price without taxes".
  • Excise duty — a fixed amount of tax per litre, unrelated to the price of oil.
  • VAT — a percentage tax applied on top of the pre-tax price and the excise duty.
  • Benchmark — a reference crude or product price used by the market to price cargoes, e.g. Brent.
  • Refinery capacity — the nameplate capacity published by the operator or regulator. It is not how much the refinery actually ran.
  • UNKNOWN — we have no defensible public evidence. It does not mean zero.

Jargon in the interface has a tooltip with the same definition (packages/shared/glossary.json).

3. Product codes#

Trade statistics classify goods by Combined Nomenclature (CN) code. We keep the CN codes internally and group them into families for display: crude, motor gasoline, automotive diesel, gasoil, jet/kerosene, naphtha, fuel oil, LPG.

The grouping is data, not code: every CN code and the family it belongs to is stored with a citation and a validity year. When the nomenclature renumbers a code, our pipeline detects it and stops rather than silently continuing a series across a definition change. Series that cross such a change are marked on the chart.

Details: docs/DATABASE.md §6, docs/PIPELINES.md §7 (check PRODUCT_CODE_CHANGE).

4. How we treat origin#

This matters more than anything else on the "where does my fuel come from" pages.

  • Trade statistics tell us the origin country, not the field, the terminal or the cargo.
  • A product imported from, say, a refinery outside the EU has that refinery's country as its origin. The crude that refinery used may have come from anywhere. We do not chain the two together unless a source supports it — see §7.
  • We never relabel a consignment figure as an origin figure. If the source gives consignment, the chart legend says "country of consignment".
  • Two official European series describe the same imports on different bases and disagree: the energy-statistics series reports country of origin, while the customs series is consignment-based for intra-EU trade, which makes transit hubs such as the Netherlands look like oil sources. We publish both, state which one a chart uses, and record the difference rather than choosing one quietly.
  • We never claim where the fuel in a particular petrol station came from. That information does not exist in public data. Brand is not refinery, and refinery is not crude origin.

The highest resolution we claim is: country → product family → period → volume, plus refinery and terminal links where a source states them.

Details: docs/KNOWN_LIMITATIONS.md §1.

5. Units and conversions#

Sources publish in tonnes, barrels, litres, cubic metres, euros per 1000 litres, dollars per barrel. We always keep the original figure and the original unit, and store the converted figure next to it along with the factor we used and where the factor came from.

  • Barrels to litres: exact, 1 barrel = 158.987294928 litres.
  • EUR/1000 litres to cents per litre: divide by 10.
  • Tonnes to barrels: depends on the density of the specific crude grade. There is no single correct constant, so we use a grade-specific factor with its source, and if we do not have one, we leave the barrel figure blank rather than guess.
  • Currency: converted with European Central Bank reference rates; the exact rate and its date are stored with the value.

Details: docs/DATABASE.md §6.

6. Missing data#

  • Missing is blank. Zero means a reported zero.
  • Gaps in a line chart are drawn as gaps. We do not join across them.
  • Where a total is published but its breakdown is not, we show the total and say the breakdown is not published. We do not distribute the total across plausible categories.
  • Where a source suppresses a value for confidentiality, the chart says "suppressed by the publisher", and any share calculated from the remaining values states what share of the total it covers.
  • Where a source is late, the chart shows its last update date and is marked stale. We do not extend a series forward.

6.1 When a country withholds quantities#

Some countries publish what their imports were worth but not how much arrived. Finland is the large case: since January 2023 its customs statistics (Eurostat Comext) give the euro value of its crude imports from each supplier but a quantity of 0.00 (January 2023, Norway: EUR 359 million, 0.00 tonnes), and its energy statistics show crude imports as confidential (March to August 2025) or zero (from September 2025, except April 2026) while its refineries processed 713 to 866 thousand tonnes a month and Finland produces no crude.

What we do with the zeros.

  • A value with no quantity is a withheld quantity. A customs row with a positive euro value and a quantity of 0 (or none) is stored with the quantity blank and the flag QTY_WITHHELD, never as a zero. The euro value is kept. We apply this to every such row, including a handful of very small parcels in other countries where a few kilograms round to 0.00 (the rule is the same: a shipment worth money has a mass). The old zeros were corrected as new revisions, each logged in the corrections log; nothing was overwritten. The check that finds them, QUANTITY_WITHHELD, runs on every customs load.
  • A reported zero that the refineries contradict is treated as not published. When the energy statistics report no crude imports (or a confidential total) for a month in which the same country's refineries processed at least 100,000 tonnes of crude and it produced none, the month is treated as NOT PUBLISHED in every calculation (rule REPORTED_ZERO_CONTRADICTED). The published figure itself is kept unchanged in our database. Countries with their own crude production (Croatia, Hungary) and small months (under 100,000 tonnes of intake) are reported but not overridden, because a stock draw or domestic crude could explain them.
  • A reported zero is a zero only when customs confirm it. A country page says a country "reported no" crude or fuel imports, and the fuel chain counts imports as 0, only when the energy statistics report 0 for that month and that zero is confirmed: the customs statistics (Eurostat Comext) have published that month for the country, record under 500 tonnes of the same imports, and list no partner with a quantity of 0 (Comext lists a partner only when something was traded, so a 0.00 quantity is withheld or rounded and confirms nothing). For crude, a country with no crude oil refinery (cited per row) is also a confirmed zero. The energy statistics are published in thousand tonnes, so their 0 covers anything under 500 t. Otherwise the zero is not published: contradicted when customs record 500 t or more (Finland's road diesel and jet fuel, June 2026: 0 reported, customs 47,000 t and 5,500 t; Denmark's road diesel, July 2026: customs 13,000 t), or not yet confirmed by customs data when customs have not published the month or show only 0.00 quantities (Finland's road diesel, jet fuel and petrol, July 2026; Finland's road diesel, January 2025). The figures themselves are kept unchanged, and customs tonnes are never put in their place. The fuel-chain headline applies the same rule: such a month cannot be traced, so the page shows the latest month that can be, or says the fuel is not yet traced (Finland's road diesel). One definition: packages/analytics/oilroutes_analytics/contradicted_zero.py.

How we estimate the missing tonnes.

estimated tonnes = published euro value / price per tonne

The price per tonne is what other EU countries paid, in the same month, for crude from the same supplier under the same customs code, weighted by volume. If fewer than 1,000 tonnes of such imports were reported that month, we pool the neighbouring months; failing that, we use the average price of all crude imported into the EU that month, and the estimate is marked lower confidence. The country being estimated never prices itself. A withheld total is the sum of its estimated suppliers.

How good is it? We tested the method on every month in which the same countries published both value and quantity, pretending the quantity was missing and comparing the estimate with what was published (rows worth at least EUR 10,000). For Finland (2015–2022, 358 supplier-months) the median error is 5.5% and nine in ten estimates are within 17.0%; over all affected countries (13,788 supplier-months) the median error is 5.4% and the 90th percentile 30.3%, the tail coming from small parcels priced from neighbouring months or from the all-supplier average. If the median error ever exceeded 15%, the estimates would be labelled low confidence; for one country (Latvia) whose own test fails, they are.

Where the estimates are used, and where they are not.

  • They are never written into the official data and never mixed into it. They are a separate series (customs_value_estimated) on the customs basis: for imports from inside the EU the partner is the country the cargo was shipped from, not where the oil was produced.
  • They are used only to fill a month that is not published. Wherever an official figure exists, the official figure is used.
  • On the map and in the flow diagrams they are drawn dashed and labelled "estimated from published euro value"; hovering shows the euro value, the price per tonne used, the month it came from and the method. The country page says when a country's figures are estimated.
  • They are classed INFERRED_MEDIUM (INFERRED_LOW when the all-supplier average was needed) and every run is recorded with its method, inputs, assumptions and back-test.

Refined products: our customs product data does not include euro values, so withheld product quantities cannot be told apart from real zeros and are not estimated. We report the countries where the share of zero-quantity rows jumps (Finland, from about 2% to about 40% since 2023).

Engineering detail: packages/analytics/oilroutes_analytics/withheld_estimate.py, packages/analytics/oilroutes_analytics/checks/quantity_withheld.py, migration 0042.

We keep two different kinds of relationship strictly apart:

  • Connected to — there is a pipeline or a berth. This is infrastructure. It says nothing about whether anything flowed.
  • Received from — something actually moved. This needs a record.

Refinery-level crude intake by origin is not published in most of Europe. Where only a national total is published, we store the national total and leave the refinery breakdown empty. We do not allocate a national figure across refineries by capacity share, because that would manufacture numbers that look like measurements.

When we do infer a link, the inference carries its method, its version, the evidence it used, a confidence level and a plain-English explanation, and it is drawn differently from reported data.

Details: docs/CONFIDENCE.md, docs/KNOWN_LIMITATIONS.md §2.

8. Ship tracking (AIS)#

Ship-movement data is planned for a later phase and is not used in the current version.

When it arrives, the rules are already fixed: a movement is a movement. A ship arriving at a terminal is not proof of a cargo, of its contents, or of its volume. Draught changes suggest loading or discharging; they do not identify the oil. Anything derived from ship movements will be labelled as inference, with its confidence, and flagged where the track has gaps, ship-to-ship transfers, or several possible terminals.

9. Strait of Hormuz#

Roughly a fifth of the world's seaborne oil passes through this strait. Whether your fuel does is a different question from whether its price is affected by it.

We classify export terminals, not countries. A country is not a route: Saudi crude loaded on the Red Sea coast never goes near the strait, while Saudi crude loaded on the Gulf coast must.

For countries with a single export route (for example Kuwait or Qatar), the share is determined. For countries with both Gulf and non-Gulf export routes — Saudi Arabia, the United Arab Emirates, Iraq — public trade statistics only tell us the origin country, not which terminal loaded the cargo. In those cases we publish a range, and we publish no point estimate at all. "Country X is 43% Hormuz-exposed" is not something the public data can support, and we will not print it.

We report exposure in eight separate dimensions rather than one score:

DimensionWhat it measuresAvailable now
Direct crudeshare of crude imports loaded inside the Gulfyes (range where the origin is mixed)
Direct productshare of fuel imports loaded inside the Gulfyes (range where the origin is mixed)
Indirect supplyGulf crude reaching us inside products refined elsewhereno — not published anywhere
Freighteffect through shipping ratesno — no licensed source yet
Benchmarkhow strongly local prices follow global crudeyes
Refining margineffect through refining economicsno — no licensed product benchmark yet
Inventoryhow many days of stock provide a bufferyes, but monthly and about ten weeks behind
Retailhow much of a crude move reaches the pump, given taxesyes

There is deliberately no single "Hormuz score". The dimensions measure different things and combining them would require weights nobody publishes.

Details: docs/HORMUZ_METHOD.md.

10. What the pump price is made of#

The pump price is an identity, not an opinion:

pump price = (pre-tax price + excise and other per-litre taxes) + VAT on all of it

We take the pre-tax price and the pump price from the Weekly Oil Bulletin, and the tax rates from tax tables, then check that the two agree. When they do not, we show the discrepancy instead of forcing the bars to line up.

We then split the pre-tax price into:

  • an input-cost part: the cost of one litre of crude, using the Brent price converted to euros with ECB rates; and
  • a residual: everything we have not modelled — refining margin, distribution, storage, retail margin, biofuel blending obligations, and anything else.

The residual is shown as its own band and labelled. It is large, because we do not yet have licensed sources for product benchmarks, wholesale prices or freight. We would rather show a large honest residual than a small invented breakdown.

One consequence worth stating: because excise is a fixed amount per litre and VAT is a percentage, countries with high fuel taxes see a smaller percentage change at the pump for the same crude move. That is arithmetic, and the site measures it per country rather than assuming it.

Details: docs/PRICE_MODEL.md.

11. Events#

Events — a disruption, a refinery fire, a sanctions decision, a tax change — are markers on a timeline. An event on this site never asserts that it caused a price change.

For each event we show what every series we track did in a window from 30 days before to 90 days after: crude benchmark, product benchmark where licensed, margins, freight, inventories, wholesale, pre-tax pump price, pump price with tax. We also show how unusual each move was compared with that series' own normal variation in the weeks before the event.

We separately measure, per country, how long a crude price move historically takes to reach the pump, and whether increases and decreases travel at different speeds. Those are measurements with confidence intervals, from that country's own history. They are not assumptions, and they are not applied from one country to another.

If someone claims an event caused a price rise, this site gives you the series to check it against. It does not do the claiming.

Details: docs/PRICE_MODEL.md §2–§5.

11.1 Thresholds used in event statements (v1 choices, 2026-09-22)#

The sentences on event pages are produced by fixed templates. The words they choose depend only on these numbers, which are published here so they can be challenged:

ThresholdValueWhat it decides
Unusual move2.0 × normal volatilitywhether a change is described as "outside" its normal week-to-week variation
Limited physical dependenceupper bound ≤ 10 %"limited" vs "moderate" share of crude from Hormuz-dependent origins
Moderate physical dependenceupper bound ≤ 33 %"moderate" vs "significant"
Supply reduction visible≤ −10 % vs prior 12-month meanwhether reported imports show a physical reduction (needs ≥ 6 baseline months)
Full verdict possibleall 8 channels availablebenchmark, product benchmark, margin, freight, inventory, wholesale, pre-tax retail, retail with tax
Claim testable at all≥ 3 channels availablebelow this the page says the claim cannot be tested here
Price-move sentencesoffsets +7, +30, +90 daysone sentence per week / month / quarter, so that offsets resolving to the same weekly print are not repeated (also governs the benchmark sentences)
Inventory materially above/below±5 % of the trailing 12-month meanwording of the stocks sentence; applied to the rounded figure the reader sees, with raw and shown values kept for audit; days of cover always quoted as published, never judged adequate or tight

Dependence bands are applied to the upper bound of a range, never to a midpoint. Bootstrap confidence intervals for lag estimates use a fixed seed so a published interval can be reproduced.

11.2 Thresholds used in pass-through statements (v1, 2026-09-22)#

ThresholdValueOrigin
Asymmetry test level5 % per country–fuel pairpublished in PRICE_MODEL §4
Maximum short-run lags6 weeks (chosen by BIC)published in PRICE_MODEL §4.2
False-discovery rate across pairsq = 0.10 (Benjamini–Hochberg)v1 choice, PRICE_MODEL §4.5
Confidence intervals90 % (normal quantile 1.645)v1 choice
Minimum observations104 weeksv1 choice (same floor as the lag method)
Rolling windows156 weeks, stepped 52 weeksv1 choice
Cointegration critical valuesMacKinnon response surface, N=2, constant, no trend, at window sample sizecited in each run's inputs

12. Confidence scale#

Every value carries two labels.

What kind of value it is:

LabelMeaning
Officialpublished by an authority
Verifiedpublished by an industry source and reconciled with another
Calculatedworked out by us from stored values with a published formula
Inferred (high / medium / low)not published; deduced from physical evidence
Unknownno defensible public evidence

How much evidence stands behind it: Official, High, Medium, Low, Unknown.

How it is drawn:

  • solid — reported
  • dashed — inferred
  • faded — low confidence
  • hatched grey — unknown
  • a band with no centre line — a range where no point estimate is defensible

A calculated value is never more confident than its weakest input. Averaging weak values does not make them strong.

Details: docs/CONFIDENCE.md.

13. Corrections and revisions#

Statistical offices revise their figures. When a source revises a number, we keep the old value, add the new one, and record the change in the corrections log with the date and the reason. Nothing is overwritten. You can see what a chart looked like on the day it was first published.

When we make a mistake, it goes in the same log.

The log (/corrections) holds three kinds of change:

  • Publisher revision — the publisher replaced a figure it had already published.
  • Completion from the publisher's other file — a figure one of the publisher's files left blank, filled in from another file of the same publisher that does report it.
  • Our own correction — we had stored or shown something wrong and fixed it.

A correction an editor makes by hand goes draft → approved → published: it is drafted with its public reason, approved by a second step, and only then published. Once published it is listed in the log as "our correction", with the old value, the new value, the reason and the date. A draft or an approved correction that is not yet published changes nothing on the site.

14. Limitations#

The short version:

  • Trade data tells us the origin country, not the terminal, the field or the cargo.
  • Refinery-level crude intake by origin is not published in most of Europe.
  • We have no licensed EU product benchmarks, wholesale prices or freight rates yet, so the pre-tax breakdown has a large residual.
  • Trade data is monthly and lands with a lag of about two months; prices are weekly. We never invent daily detail from monthly data.
  • We cannot tell you which refinery supplied a particular petrol station. Nobody can, from public data.

The full list, with what each limitation blocks and what would remove it: docs/KNOWN_LIMITATIONS.md.

15. Version history#

VersionDateChange
1.0Phase 0First published methodology: origin treatment, unit rules, confidence scale, Hormuz classification by export point with ranges for mixed-route countries, accounting price decomposition with an explicit residual, event-study descriptive engine. No causal claims.
1.12026-09-24Section 6.1: a customs value with no quantity is a withheld quantity (blank + QTY_WITHHELD, never zero); an energy-basis zero or confidential total contradicted by refinery intake is treated as not published (REPORTED_ZERO_CONTRADICTED); withheld tonnes are estimated from the published euro value (INFERRED, customs basis, dashed) and used only where the official figure is not published.
1.22026-09-24Section 16: how the viewer-first country page reads — the headline, the four sections, the sentence rules and thresholds, the four display labels (Official, Calculated, Estimated, Not published) over the seven stored classes, and where every method note that left the default view now lives. Presentation only; no calculation changed.
1.32026-09-24Section 17: the home page — what this site is and is not (moved from the home page), the EU table (each row is its country page's headline, from the same calculation), the supplier list and "Coming later". Presentation only; no calculation changed.
1.42026-09-24§16.12 one figure per claim on country pages (Hormuz once, "Up to N%", months on time-bound lines, neutral domestic colour); §18 supplier pages; §19 Flows bundling and bar list, map arcs only on focus. Presentation only; no calculation changed.
1.52026-09-25§16.13 hero-bar labels and swatches; §17.4 Suppliers to the EU table; §18 empty supplier flows, legend order, untraceable column, /country redirect; §19 link controls, one flow table, rows under 0.1%. Presentation only; no calculation changed.
1.5.12026-09-25Renamed: formerly Oil Routes at oil.ispostquantum.com, now Fuel Origin at fuelorigin.org. No method change.
1.62026-09-25Editorial and licence read-through before going public. §16.10: the untraced share is "cannot be traced" everywhere; the fuel-chain Hormuz sentence follows the headline's range rule ("Up to N%", one decimal under 5 points; fuel-chain template 1.2); "the" before names that need it. Event and price pages print plain words instead of series codes, table names and document references (the codes stay in tooltips and "Why this sentence"); the pass-through reason no longer cites a document inline (pass-through template 1.1). Brent in euros per litre is labelled Calculated. New §20 Sources and licences. Presentation only; no calculation changed.
1.72026-09-25§6.1: a reported zero is shown as "reported no imports" only when customs record under 500 t for the same country, fuel and month; otherwise the origins are "not published" (reported_zero_contradicted). The fuel-chain look-through applies the same rule (one definition, contradicted_zero.py): a contradicted import zero leaves the month UNKNOWN instead of "100% refined at home" ([email protected]); a zero customs have not yet confirmed (month unpublished, or only 0.00 quantities) is not published either (IMPORTS_ZERO_UNCONFIRMED), which leaves Finland's road diesel untraced. Tax rates: each published rate now shows when a later published change replaced it (calculated from the rows' own dates, migration 0045); "current" rates are only those still in force. No published figure changed; 363 fuel-chain months (all countries, 2015-2026) became UNKNOWN.
1.7.12026-09-25§20: UN M49 licence verified — UNdata terms of use (free reuse and redistribution, UNdata cited); the codes are published on UNdata as codelist CL_AREA. No method change.
1.82026-09-25Part 2 pages: Hormuz page, comparison, network, overview pages, admin corrections. §13 the three kinds of correction and the draft → approved → published path for our own; new §21 the Hormuz page, §22 comparing countries, §23 the network page, §24 the EU overview pages and the country import history. Presentation only; no calculation changed.

Changes to method bump this version, are listed here, and appear in the corrections log.

16. Reading a country page#

The country page answers one question on its first screen — where does this country's fuel come from? — and keeps every method note one click away rather than in the reader's path. Nothing was removed from the data or from its provenance; this section is where the explanations went.

The page is: the country name, fuel tabs (road diesel, petrol, jet fuel), one generated headline, the three steps behind it, then at most four sections — crude origins, product origins, stocks and days of cover, recent events. A section with nothing to show is not rendered. A section whose data is not published prints one plain sentence. A country for which no supply data has been ingested shows its name, "Not yet covered: supply data for {country} is not ingested", and only the sections that exist (stocks, events). The ingestion status of every source stays on the data-health page.

Every dataset carries one period. The headline, the sentences, the charts and the "Source & method" block of a section all end in the same month, written in words ("June 2026"). A figure that is only available for an older month says so in words: "latest available: May 2025".

16.1 The headline and the three steps#

The headline names, for the selected fuel and month, the three largest crude origins behind the fuel sold in the country, the share that cannot be traced, and the share that may have passed through the Strait of Hormuz. It is an estimate built from official trade and refinery statistics, one country back: which countries the fuel came from, and where the crude behind it was produced. If no such estimate exists, the headline says "Fuel origin for {country} is not yet traced."

The three steps under it are: (1) the country's supply of that fuel — everything refined in the country plus everything imported; (2) the countries it came from, each with the crude its refineries ran on; (3) the crude behind the fuel. Exports are assumed to leave in the same proportions as supply. The share that cannot be traced is its own hatched grey segment and is never spread over the traced origins. A supplier's own crude bar is drawn as wide as its share of supply, so a 5% supplier gets a 5%-wide bar. A supplier country with no refinery is described in words ("re-exported; origin not traceable") instead of a bar that would be all hatched. The assumptions and the full sentences the estimate was generated with sit in the collapsed "Assumptions" block. Method: docs/HORMUZ_METHOD.md §8.

16.2 Crude and product origins#

Shares are measured on the energy basis — the country where the oil was produced. That is a different question from where the cargo was last shipped from; the two are served separately and never merged (§4). Product origins are tracked separately from crude: refined product is never assumed to come from domestically refined crude. Product shares are per fuel, so each fuel's origins add up to at most 100%. Product origins are charted over the last 12 months, crude over the last 36; the window is a display choice, and the download serves the same window. "Other origins" is a real remainder of named origins outside the top six, never padding. Months whose tonnes a country did not publish, and which are therefore estimated from the published euro value (§6.1), are listed in the section's "Source & method" block.

The origin stacks are drawn as a 3-month average of monthly shares on a continuous monthly axis that ends at the section's month. A month counts as published only when its shares add up to 100% within 1 point; in such a month an origin with no row is a confirmed 0. A month that is missing or does not add up is a gap, and so is every average whose window touches it — nothing is interpolated. Each figure names its measure where it appears: the headline gives shares of the crude behind the fuel ("crude behind it"), the crude section gives shares of crude imports for a named month, and the stack says "3-month average".

Above the charts, the crude section prints generated one-liners:

  • Refineries, by count: none, with the publisher's citation ("No crude refineries (IEA / OECD)"); one to three, named inline with operator and published capacity; more than three, counted, with total capacity "where comparable" and the list collapsed. Capacities are shown in the unit each operator published. Tonnes per year and barrels per day are not interchangeable without a density factor for the specific crude slate, so they are neither converted nor added together; the total is printed only when every refinery published in the same unit. Each refinery's own page lists the source for its row.
  • Suppliers: how many named countries supply crude imports, and whether together they account for all of it.
  • Hormuz: see §16.5.
  • Stability (under the charts): see §16.6.

16.3 Import dependency#

The former "Import dependency" block is now the supplier one-liner and the collapsed table of all origins for the latest month. What the page still cannot tell you: the share of supply that is imported rather than produced or refined domestically needs national energy balances, which we have not ingested, and we will not approximate it from trade data alone. The concentration index (HHI) has no endpoint yet, so it is not shown.

16.4 Stocks and days of cover#

Days of cover is Eurostat's published figure, carried through exactly as published under Directive 2009/119/EC and shown in whole days. It is never recomputed from stocks divided by consumption. A published 0 is treated as not published, because zero days of cover is not a figure a member state reports. The comparison with the 12-month average is our arithmetic on the publisher's monthly figures; a trailing mean built on fewer than twelve months is marked partial in the download. Which calculation method the member state used is a category label, not a quantity: it is printed in the section's "Source & method" block and never charted or averaged.

16.5 Strait of Hormuz exposure#

Exposure is published as a range because some exporting countries can route cargo either through the Strait of Hormuz or around it, and cargo-level routing is not public (§9). A point is shown only where every contributing origin has a single admissible export route. No midpoint is drawn through a range, and a range is printed as text ("7.6–10.1% of crude imports may transit Hormuz"; "Up to 22%" when it starts at zero), never as a filled bar. A range of 0–0 reads "none". An unknown exposure is left out of the sentence rather than printed as a figure. "Other channels not assessable" refers to the dimensions in §9 that have no source yet (indirect supply, freight, refining margin); price exposure is a different question that the country page does not answer. Emergency stock cover is the same published days-of-cover figure as §16.4, reached two ways rather than measured twice. The per-dimension table stays available from the API (/api/countries/{slug}/hormuz), and each event page shows every dimension separately, with the channels we cannot see named.

16.6 Historical change#

The former "Historical change" table is one line under the crude charts. If no origin's share moved by 2 points or more between the start of the window and the latest month, it reads "Mix stable since {year}: every origin within ±N pt". Otherwise it names the two largest movers with their change in points. An origin missing from either month is left out rather than counted as zero; if nothing is comparable, the line is omitted. Each change is our subtraction of two published shares.

16.7 Recent events#

Dated markers only. Opening one shows what every series did in a window around that date, and which channels cannot be seen at all. Nothing on the page says an event caused a price change (§11). Events scoped wider than one country (for example the whole EU) apply to every country in that scope and are listed for each.

16.8 Taxes and prices#

The country page links to the pump-price page ("Pump prices and tax for {country} →"), with the latest weekly price from the European Commission Weekly Oil Bulletin when one is published. The week-by-week breakdown, the tax rates with their validity dates and the price decomposition live on that page (§10).

16.9 The four labels#

The database keeps seven value classes (§12) and every download and API response carries them. The country page shows four, one per section header, because the finer distinctions are method detail rather than something a reader acts on:

Shown asStored classesDrawn as
OfficialOfficial, Verifiedsolid
CalculatedCalculatedsolid, lighter
EstimatedInferred (high / medium / low)dashed
Not publishedUnknownhatched grey

No label is shown per row, per legend item or per figure on the page; the section badge links here.

16.10 Sentence rules#

Every sentence on the country page comes from a deterministic template (apps/web/src/components/country/sentences.ts), and every number in it comes from the overview payload (docs/contracts/country_overview.md). Each template branches on the shape of the value: a figure, a range, not published, or a confirmed zero with its citation. The thresholds:

RuleValue
Origins named in the headline3
Shareswhole percent from 1%; one decimal below 1%; "<0.1%" for a sliver; never "0.0%"
Rangesboth ends to one decimal when the range is narrower than 5 points, otherwise whole percent
Days of coverwhole days; 0 or less is "not published"
Refineries named inlineup to 3
Stable origin mixevery origin moved by less than 2 points
Movers named2
"All crude imports"named origins sum to within 0.5 points of 100% and there is no other remainder
Untraced sharewritten "cannot be traced", in the headline, the bars, the home table and the sentences alike
Ranges starting at zero"Up to N%" (never "0–N%" or "between 0% and N%"), in the headline and in the fuel-chain Hormuz sentence
Country namesshort forms (§17.2), with "the" where English needs it ("the Netherlands", "the United States")

16.11 Where everything moved#

Was on the country pageNow
Prose summary box; key-facts strip (crude data to, top-3 share, refineries, Hormuz)the headline and the section one-liners
"Country record" provenance badgethe country record's source is on the data-health page
Refinery section and tablerefinery one-liner; list collapsed when there are more than three; each refinery's own page
Import dependency sectionsupplier one-liner; collapsed table of all origins; §16.3
Physical Hormuz exposure section and tableHormuz one-liner in the crude section; §16.5; event pages
Historical change section and tablestability one-liner; §16.6
Stock method codes; days-of-cover and trailing-mean notesthe stocks "Source & method" block; §16.4
Taxes and prices sectionone link to the pump-price page; §16.8
How to read the labels§16.9 and the labels table below this text
Per-row and legend value-class badges; "What the value is" columnone badge per section header (§16.9)
Source / period / updated / confidence / CSV stripone "Source & method" block per section, with the CSV where the licence allows it
Download refusal explanationsthe licence of every source on the data-health page
Empty-section notices naming the dataset that would fill themnot rendered; the data-health page lists every source and its status
Glossary tooltipsthe glossary below this text

16.12 One figure per claim (round 2)#

A country page prints one Strait of Hormuz figure: the headline's. The crude section repeats a Hormuz line only when the headline has none, and that line carries at most one percentage. A range whose low end is 0, or rounds to 0 at the printed precision, reads "Up to N%", never "0–N%"; 0–0 reads "none"; an unknown exposure is left out. Time-bound one-liners name their month: the supplier count ("In June 2026, three countries supplied all crude imports") and the stability line ("Since January 2023: …"); a bare year is never printed. Country names use their short display form ("United States"); the reference name stays the record. A country's own refineries ("Refined in {country}") are drawn in one fixed near-black neutral on every page, never a country's colour. A supplier under 10% of supply keeps its legend line but gets no bar. When the latest weekly price run failed, the price link says which week is shown and that the latest week is not loaded.

16.13 Hero bars (round 3)#

Hero bars are labelled without scripts. A segment shows its name and share when the text fits, its share alone from 34px, and nothing below that. Fit is judged by the browser from the segment's own width against a width estimated from the text using a wide reference font, so a label errs towards moving below the bar. The "Also:" line lists exactly the segments not named inside the bar. Bars and keys are in share order, with "Other" and the share that cannot be traced last. A key swatch uses the same colour, opacity, dash and hatch as its segment. Each "going by its crude imports" window is that supplier's own crude window.

17. The home page#

17.1 What this is, and what it is not#

The home page keeps one line of this; the rest is here.

What this is:

  • A record of what public statistics actually say about oil supply and fuel prices in Europe.
  • Every displayed figure carries its publisher, dataset, period and the time we retrieved it. Clicking a source opens that record.
  • Figures we computed are labelled as computed, and the method is published.

What it is not:

  • Not a forecast, and not an opinion. Nothing here argues that one thing caused another.
  • Not an estimate where the data is missing. Missing is shown as unknown ("not published"), never as zero and never filled in.
  • Not complete. Several datasets have not been ingested yet, and each page says which ones and what would provide them. The data-health page, linked from the footer of every page, lists every source and its status.

17.2 The EU table#

One row per EU member state. Each row repeats that country page's headline for road diesel (§16.1), and is built by the same calculation, so a figure on the home page and the same figure on the country page cannot disagree:

  • Crude behind road diesel: the two largest crude origins behind the road diesel sold in the country, with their shares, for the headline's month. Where part of that crude cannot be traced, that share is printed beside them ("10% cannot be traced"). This is an estimate (label: Estimated), one country back, not a share of crude imports.
  • Through Hormuz: how much of that crude may have passed through the Strait of Hormuz, written as on the country page — "up to 22%" for a range that starts at zero, both ends for a range that does not, one figure only where the route is known, "none" for a range of 0–0 (§16.5). The column sorts by the upper end of the range.
  • Pump price: the latest weekly road-diesel price including tax, from the European Commission Weekly Oil Bulletin, in euro per litre with two decimals. Where no diesel price is published, the petrol price is shown and marked as petrol.

The month and the price week are printed once in the column header when most rows share them; a row for a different month or week says so. Rows are listed alphabetically; every column can be sorted. A row with no figure for the sorted column stays at the bottom in both directions, because "not published" is not a small number. The same rounding rules apply as on the country page (§16.10).

Country names are the UN M49 reference names, shortened for display where the formal name is long ("United States" for "United States of America"); the reference name stays the record.

17.3 Suppliers and "Coming later"#

Suppliers outside the EU lists every non-EU country that EU member states reported importing crude oil or refined products from, on the energy basis (the country where the oil was produced), in the latest month in which all 27 member states have reported — the same month and figures as its supplier page. Each is given as its share of all crude, and of all refined-product, imports reported by the 27 member states; "none reported" means no member state reported an import from it that month, which is not a confirmed zero of its exports. Countries with a supplier page but no import in that month are collapsed beneath, with the last month one was reported. The list is read from the data, not kept by hand.

Coming later holds only countries that have neither a country page nor a supplier page: they are in the country reference table, but no EU member state has reported importing oil from them.

17.4 Suppliers to the EU (round 3)#

Under the EU table, every non-EU country with a supplier page has one row: crude oil to the EU in the latest month all 27 member states reported (million tonnes and share of EU crude imports; "none reported" when no member state reported an import, which is not a zero), its largest EU importers, and its Hormuz route class in words. Both tables sort by any column through plain links, so they work without JavaScript; a missing value always sorts last.

18. Reading a supplier page#

A supplier page (/origin/{country}) describes a country outside the EU from what the 27 member states report importing from it. Each section carries one provenance badge and one collapsed "Source & method" holding the source, dataset code, period, update date, confidence, CSV, basis and citations. Charts stop at the latest month every EU member state has reported; a later, partly reported month is never drawn, so it cannot look like a drop. Look-through shares ("crude inside EU fuel") are estimates: the bars share one scale and the section is labelled Estimated once. When every cited export point for crude and products is outside (or inside) the Persian Gulf, one sentence says so; a mixed profile is a range with no midpoint, and a range starting at 0 is written "Up to N%". Bundles are named for what they hold: "Other EU countries", "Other products".

A supplier-page flow with no report in its latest complete month is answered by its one sentence. Earlier reported months are listed, one click away, as the member states reported them; a month with no report is not listed and is not a zero. A chart is drawn only when at least one series has two neighbouring months. Legends and stacks are ordered by volume in the last plotted month, with series absent that month after them and "Other" last. In the look-through, each country's share that cannot be traced sits beside its estimated share. /country/{slug} for a non-EU country with a supplier page goes to that page.

19. Flows and the map#

In the Flows "Top 5" views both sides are bundled: the chosen side keeps its five largest countries and the other side its eight largest; the rest of each side is one "Other" node, which is our arithmetic (dotted). A summed ribbon with any estimated part is drawn dashed, but shares still count only its reported tonnes. Below 1000px the diagram becomes a ranked bar list with the same encoding. On the map, import arcs are off until a country is chosen; then only that country's arcs are drawn, the ten largest coloured by the country at the other end (estimates grey and dashed) and the rest grey, sharing one "Other (n)" legend line. No arc is re-routed or summed on the map.

Flows and map controls are plain links: each choice is the URL of that view, so both pages work in a browser that runs no JavaScript; selecting a country is a link too. The flow table appears once on the page. It leaves out rows under 0.1% share and says how many; they stay in every total and in the drawing, and the CSV lists them. "How we know" is a short label in the data-class style (Reported, Summed by us, Estimated, Unknown) plus a note giving the source, method or estimate inputs. Without JavaScript the map box says the map needs it, and Source & method lists every drawn feature with its confidence and source.

20. Sources and licences#

We show a source only where its licence allows the reuse we make of it (one open question is marked UNVERIFIED below); sources whose licence does not (tanker freight rates, European product benchmarks, ARA storage, Concawe's refinery list, JODI) are not shown at all, and the pages say which channels are missing for that reason. A figure labelled Calculated or Estimated is our adaptation of the source data, made by the method on this page; the source's own figure is the one labelled Official. The download button offers a CSV only where every source behind the rows allows it to be passed on; otherwise it says why.

SourceWhat we useLicenceWhat it asks of us
Eurostat (European Commission)energy statistics (crude and product imports, refinery balances, stocks, days of cover) and Comext customs tradeCommission Decision 2011/833/EUAcknowledge the source; say when data are adapted. Austrian trade at 8-digit CN detail and non-EU/EFTA partner-side detail are not for commercial reuse.
European Commission, DG ENER, Weekly Oil Bulletin (prices, duties and taxes)pump prices with and without tax, excise, VATCC BY 4.0, © European Union, 1995–2026Credit the source, link the licence, indicate changes.
European Central Bankeuro reference exchange rates, used to convert Brent to eurosECB reuse termsCite the ECB as the source; state that the data were modified (our Brent-in-euros series is a conversion, labelled Calculated).
U.S. Energy Information AdministrationBrent spot price; US product spot prices (the labelled US crack-spread proxy)US public domainAttribution requested: "Source: U.S. Energy Information Administration".
European Environment Agency, Industrial Emissions Portalrefinery sites (names, operators, locations)CC BYAcknowledge the EEA as the source; do not distort the meaning.
International Energy Agencyquoted in event records; cited for single facts in the refinery and Hormuz reference listsIEA text is CC BY 4.0; IEA datasets are not, and none is reproducedCredit the IEA for quoted text.
Refinery operators, regulators, port and pipeline operators, governmentssingle cited facts (capacity, operator, loading point, dates) in our reference listsfacts cited per row, with the page they come fromNamed per row on the pages that show them.
Wikipediacited as the pointer for some geographic facts in the Hormuz and map reference dataCC BY-SA 4.0No Wikipedia text is reproduced; the article is named as the citation.
Wikidatacoordinates for some map points (shown hollow, as inferred)CC0None; credited anyway.
OpenStreetMapcoordinates for some map points (shown hollow, as inferred)ODbL 1.0"© OpenStreetMap contributors", with a link to the licence, wherever the map shows them.
Natural Earththe map's country shapes and coastlinepublic domainNone; "Made with Natural Earth".
UN Statistics Division, M49 (via UNdata)country names and codes (shortened for display, §17.2)UNdata terms of use: free to copy, duplicate and redistribute provided UNdata is cited as the reference (checked 2026-09-25)Source: UNdata (UN Statistics Division), M49 standard country or area codes.

Licence texts, with the date each was verified, are recorded in docs/DATA_SOURCES.md.

21. The Hormuz page#

The page "Is Hormuz really the reason?" (/strait-of-hormuz-europe-oil) applies the direct crude and direct product exposure formulas (D1 and D2 in docs/HORMUZ_METHOD.md, summarised in §9) to the member states' imports added together, for the latest month every member state reported. A country with no measured figure is listed by name and never filled in. Where an origin country exports both through and around the strait, the result is a range, and a range has no midpoint.

The evidence block counts the event study's statements (§11) at 30 days for pump prices and at 4 weeks for crude-only prices. A month a country reported as 0 tonnes is "cannot be assessed", not a reduction. Dependence is put in three bands, under 10%, 10–33% and above 33%, using the top of the range. The page makes no causal claim.

22. Comparing countries#

/compare puts two to six member states side by side. Each figure is the one on that country's own page, from the same calculation. Every figure names its month; when countries' months differ, the differing months are tagged, never aligned. The Hormuz line is the upper bound of the range for crude imports (§9), and it ends at the country's latest crude month. Tax is the pump price minus the pre-tax price, both from the Weekly Oil Bulletin. The label on each section is the weakest label among the countries that have data for it.

23. The network page#

/network draws only CONNECTED_TO records (§7) between refineries and the ports, terminals and pipelines their sources name. A line is infrastructure, not a flow: it says nothing about how much oil moved, or that any did. A port or pipeline's country comes only from the geography that draws it on the map, and it crosses a border only when that geography names more than one country. Rows of the reference lists are never merged.

24. The EU overview pages#

This covers /eu-crude-oil-sources, /eu-petrol-price-breakdown and each country's import history (/country/{slug}/oil-imports).

EU figures use only months all 27 member states reported. Shares, 12-month shares and year-on-year changes are sums of published tonnes; an origin absent a year earlier is left out of the year-on-year comparison. The part of the published totals that no country accounts for is "cannot be traced". A country's yearly total sums its published months only; the months not published are listed, and a zero counts only where it is confirmed (§6.1).

On the price page, tax is the pump price minus the pre-tax price. Crude is Brent converted to euros per litre, the same for every country. The rest of the pre-tax price is not broken down, and it can be negative. A change on the week is shown only when the previous issue is exactly 7 days earlier. The median is of the national prices, not weighted by sales.

Glossary

Plain-English definitions of the terms used across the site. The country pages no longer carry these as tooltips; they are collected here.

90% CI
A range that, under the method's assumptions, would contain the true value in 90 of 100 repeats of the estimate. A wide range means the figure is uncertain.
Brent
The North Sea crude benchmark most European oil is priced against. When people say 'the oil price', they usually mean Brent.
Cannot be traced
The part of a fuel's supply whose crude origin the published statistics do not let us follow, for example because a supplier did not say where its crude came from. It is shown as its own grey share, never spread over the named origins.
Chokepoint
A narrow sea passage that a large share of the world's seaborne oil must pass through, such as the Strait of Hormuz. The list used here is the US Energy Information Administration's.
CN code
The Combined Nomenclature code: the EU's numbering system for traded goods in customs statistics. Crude oil is 2709; petrol, diesel and jet fuel sit under 2710.
Cointegration
A test of whether two prices move together over the long run. When the test is not passed for a window, no pass-through figure is published for it, rather than a weaker model put in its place.
Connected to (infrastructure)
A refinery's operator or a public register names this port, terminal or pipeline as serving the refinery. It is a physical link, not a flow: it does not say how much oil moved, or that any did.
Country of origin vs country of consignment
Origin is where the oil was actually produced. Consignment is the country it was last shipped from. They often differ, for instance Kazakh crude loaded at a Russian port, so we never treat one as the other.
Country to country
What an importing country reports buying from the country where the oil was produced. It says nothing about the route, the ship or the port the oil actually used.
Crack spread
A simple version of the refinery margin: the price of refined products minus the price of the crude they came from. 'Crack' refers to cracking crude into lighter products.
Crosses a border (cited route)
The geography that draws this port or pipeline on the map names more than one country. We say it crosses a border only when that cited geography does.
Crude cost (Brent per litre)
The Brent crude price converted to euros per litre, using the European Central Bank's exchange rate. It is the same for every country, because it is one market price, not what any refinery paid.
Crude oil
Oil as it comes out of the ground, before refining. It is not usable as fuel yet; a refinery has to split it into petrol, diesel, jet fuel and other products.
Customs basis (country shipped from)
Imports as customs record them (Eurostat Comext). For goods from inside the EU the partner is the country the cargo was shipped from, not where the oil was produced.
Days of cover
How many days a country's emergency oil stocks would last at normal use. Published by Eurostat under the EU stockholding directive; shown here as published, never recalculated and never judged adequate or tight.
Direct exposure
The share of a country's imported crude or fuel that was loaded inside the Gulf, so it had to sail through the Strait of Hormuz. Where the exporting country also loads outside the Gulf, it is shown as a range.
Emergency stocks
Oil and fuel each EU country must keep in reserve by law, to cover a supply disruption. Shown as Eurostat publishes them under the EU stockholding directive.
Energy basis
Imports counted under the country where the oil was produced, as member states report them in Eurostat's energy statistics. It answers a different question from where the cargo was shipped from.
Event study
A method for looking at what measurably changed around a dated event, comparing fixed windows before and after against the series' normal volatility. It shows what moved together, not what caused what.
Everything else before tax
The price before tax minus the crude cost: refining, transport, storage, retail margins, biofuel blending and anything else, together. No source we may show breaks it down, so it is one figure, and it can be negative.
Excise duty
A fixed tax per litre of fuel, set by each country. It does not rise or fall with the oil price, so when fuel is cheap it makes up a larger share of the pump price.
Export point
A terminal, buoy or pipeline end where crude or fuel is loaded for export. Its colour on the map says whether a tanker leaving it has to pass the Strait of Hormuz.
HHI (concentration)
A measure of how concentrated supply is. Add up the square of each supplier's percentage share: near 10,000 means one supplier dominates, low hundreds means supply is well spread.
Indirect exposure
Gulf crude reaching a country inside fuel refined somewhere else, for example diesel made in India from Saudi crude. No public statistics track it, so it is not measured here.
Lag
How long a change in the crude benchmark takes to show up in the pre-tax pump price. Measured per country from past weekly data by finding the delay that best lines the two series up; it is a delay, not a cause.
Mt/a and bpd
Two ways operators state refinery capacity: million tonnes of crude a year (Mt/a) or barrels a day (bpd). We print the unit the source used; converting between them needs the density of the crude, so we do not.
No connection on record
None of our sources names a port, terminal or pipeline for this refinery. That is what we hold, not a finding that it has none.
Pass-through
How much of a change in the crude input cost shows up in the pre-tax pump price, and how quickly. Measured separately for rises and falls from past weekly data. A difference between the two is reported only when a statistical test finds it; it says nothing about why.
Percentage point (pt)
The difference between two percentages. A share that goes from 10% to 15% has risen by 5 points (5 pt), not by 5%.
Pre-tax price
The pump price with excise duty, VAT and other fuel taxes stripped out. It is the part that actually moves with crude, refining and transport costs.
Range (no midpoint)
When the public data only allow a figure between a lowest and a highest value, both ends are shown and nothing in between. The middle of a range is not a best guess, so it is never printed.
Refinery margin
What a refinery earns per barrel: the value of the products it sells minus the cost of the crude and the energy used to process it. A wider margin makes fuel more expensive even when crude has not moved.
Revision
When a statistics agency republishes a figure it had released earlier. We keep both the first published value and the current one, so a chart that changes can always be explained.
Same print as T0
Prices are published weekly and trade data monthly, so an offset a few days after the event often falls before the next publication. Those points repeat the last published value and are marked hollow; they are not new observations.
Schematic line
A straight line drawn between a pipeline's cited start, end and named stations. It shows what is connected to what, not where the pipe actually runs.
Strait of Hormuz
The narrow sea passage between Iran and Oman that a large share of the world's oil exports must sail through. A disruption there can lift prices worldwide, including for oil that never goes near it.
Tax share
The part of the pump price that is tax: the pump price minus the pre-tax price, both from the Weekly Oil Bulletin, as a share of the pump price.
Tonne vs barrel
Two ways to measure oil: a tonne is a weight, a barrel is a volume of about 159 litres. Converting between them depends on the density of the specific crude, so there is no single universal factor.
Upper bound
The highest value the data allow. 'Up to 12%' means the true share is at most 12% and may be lower; it is not an estimate of the share itself.
Volatility units
How big a price change is compared with that series' usual week-to-week (or month-to-month) movement over the previous three years. A change of 2 volatility units is twice the size of a typical move. It says nothing about why the price moved.
Weekly Oil Bulletin
The European Commission's weekly publication of average consumer fuel prices for every EU country, given both with and without taxes. It is our main source for retail prices.
z-score
How far a value sits from the average of the 30 days before the event, measured in standard deviations of that pre-event window. Large positive or negative values are unusual for that series.