Government fuel prices
The platform keeps a history of official retail fuel prices for each government fuel item in each price zone. Prices come from four sources, and one fixed precedence rule decides which price is in force at any moment.
Overview#
An official price is the state-regulated retail price that Petrolimex publishes for a fuel item, separately for Zone 1 and Zone 2. A price change is recorded as a new price point; earlier points are never edited in place. A wrong point is rejected rather than deleted, and the nightly re-derivation may replace Derived points of the last 30 days. Each point comes from one of four sources: the initial price table, prices derived from store price lists, the Petrolimex price feed, or a manual entry by the platform team. Every screen and calculation that uses the official price in force reads it through one shared rule. Which fuel items exist is described on Government fuel items and fuel filters, and how a store gets its zone on Fuel price zones.
Fields#
Each price point holds:
| Field | What it holds |
|---|---|
| Fuel item | The government fuel item the price is for |
| Zone | Zone 1 or Zone 2 |
| Unit price | The VAT-inclusive retail price, in VND per litre, or per kilogram for the mazut items |
| Effective at | The date and time, in Vietnam time, from which the price applies |
| Source | Fixture, Derived, Petrolimex API or Manual; see Sources below |
| Confidence | For a Derived price only: the share of reference stores that agreed on it, shown as a percentage |
| Evidence | Where the price came from: the feed product and its publication time, the store count behind a derived price, or the operator's note |
| Source label | A readable label such as "Petrolimex API — Zone 1 — 24/09/2026 14:48". The store price review shows it next to each price |
Sources#
| Source (UI label) | Where the price comes from | Coverage |
|---|---|---|
| Fixture | The initial price table: the Petrolimex Zone 1 price list of 6 April 2026, loaded when the platform was set up | Nine items, Zone 1 only, all effective 6 April 2026 at 00:00 |
| Derived | The daily consensus price of reference merchants, whose stores sell at the official price, read from their store price lists | Zone 1 from September 2021, Zone 2 from 23 May 2022, for items that have a published official price |
| Petrolimex API | Petrolimex's public price feed, the one its own website shows. It carries current prices only, with a Zone 1 and a Zone 2 price per product | The products the feed lists: six at the end of September 2026, namely E10 RON 95-V, E10 RON 95-III, E5 RON 92-II, DO 0,001S-V, DO 0,05S-II and kerosene |
| Manual | A price added or corrected by the platform team, with a required note | Any active fuel item and zone |
Items the feed does not list keep their Fixture price, or a later Derived or Manual one.
Rules#
Which price is in force#
Precedence, highest first: Manual, Petrolimex API, Derived, Fixture. Per item and zone:
- Only active points count. A rejected point is ignored.
- Once the Petrolimex feed has a price for an item and zone, every Derived or Fixture point from that moment on is ignored for that item and zone.
- Derived and Fixture points do not block each other: the more recent one is in force. The 6 April 2026 Fixture price holds until the next Derived change after it, which then replaces it.
- Every Manual point counts. It is a point correction.
- When two points take effect at the same moment, only the one from the higher source counts.
- The price in force at a given time is the latest counted point at or before it. A Manual correction therefore holds until the next counted price change, for example the next feed price change.
- Back-to-back points with the same price from the same source count as one change.
How the feed is read#
- The platform reads the feed every hour at seven minutes past, from 06:00 to 22:00 Vietnam time.
- It records a new price point for an item and zone only when the price differs from the last feed price recorded. A republication at the same price records nothing.
- The new point takes effect at the time Petrolimex last edited the price, unrounded. This can be up to about 15 minutes before the announced effective time.
- Feed products are matched to fuel items by name, through a fixed list. A product not on that list never creates a fuel item and its price is not recorded.
- A price that is not a positive whole number is ignored.
- Each read is recorded as a run with status Success or Failed and its counts. A run fails when the feed cannot be fetched or read, lists no products, or has no product that matches a fuel item with a valid price.
How derived prices are worked out#
- For each item, zone and day, the platform takes each reference store's price in force at the end of that day.
- A store's price counts only when it was set in the last 30 days, so a store that stopped updating is left out.
- The consensus is the most common counted price. The day is accepted only when at least 2 stores count and at least 60% of them agree.
- An accepted day whose consensus differs from the previous one adds a Derived point at 00:00 on that day. A day that fails adds nothing and leaves the previous price in force.
- Every night at 02:23 the platform re-derives the last 30 days, up to yesterday. A re-derivation changes only Derived points and never brings back a point the platform team rejected.
Corrections#
- A wrong Derived or Manual point is rejected, not deleted, and a reason is required.
- A Petrolimex API or Fixture point records what was published, so it is never rejected. It is corrected by adding a Manual point at the same moment.
- A Manual time is entered to the minute, in Vietnam time. When an active non-manual point for the same item and zone falls inside that minute, the Manual point takes that point's exact time and so replaces it.
- Adding and rejecting prices are both recorded in the audit log.
Alerts and flags#
| Signal | When it fires | Who sees it |
|---|---|---|
| Stale prices | No successful feed read for more than 48 hours. Checked after every read and hourly around the clock, so a feed that stops overnight is noticed. At most one alert per 24 hours | Platform staff, as an in-app alert |
| Unknown product | The feed lists a product that matches no fuel item. One alert per product per 24 hours | Platform staff |
| Derived and feed disagree | After the nightly run, a derived consensus differs by more than 1% from the feed price in force that day. One alert per item and zone per 24 hours. Only a disagreement that the latest compared day still shows is alerted | Platform staff |
| Old recommended price | On the page for adding prices to many stores, an official price older than 30 days is marked with its age, and saving asks the user to confirm it. See Add prices for many stores at once | The merchant user setting prices |
Where the official price is used#
- Store price review: when a merchant confirms a store's prices, the official price in the store's zone is the suggested price for each fuel the store has not priced yet. See Review and confirm a store's fuel prices.
- Adding prices for many stores: both zones' official prices are shown as the recommended price. See Add prices for many stores at once.
- Refuels priced by an integration: refuel orders at PVoil and Petrolimex stations take their unit price from the official price. See Refuelling at PVoil stations and Refuelling at Petrolimex stations (static QR).
- Official fuel price chart: reads stored price points only, never a source. See Official fuel price chart.
- Price zone checks: the zone classifier checks a store's own prices against the official prices. See Fuel price zones.
Permissions#
| Action | Who |
|---|---|
| See the price history, the latest feed run and the last successful read on the Government Fuel Prices screen | Platform Operator only, and only as a staff user |
| Add a Manual price, reject a Derived or Manual price | Platform Operator only |
| See the official fuel price chart | Every tenant and merchant user, and platform staff. Only staff see each price's source |
| See official prices while setting store prices | Merchant users who can edit stores |
Edge cases#
- Zone 2 before the feed: the initial price table holds Zone 1 prices only, so Zone 2 prices before the first feed price come only from Derived and Manual points.
- Item without a Fixture price: E10 RON 95-V is not in the initial price table, so its official price comes only from the feed or a Derived or Manual point.
- Duplicate Manual price: a Manual price for the same item, zone and time as an earlier one is refused, even when the earlier one was rejected. Choose a different time.
- Feed changes or disappears: failed runs and the stale alert detect it; Manual prices are the fallback.