Simutrans Cargo Revenue Calculator
Calculate per-trip and per-month revenue for any Simutrans-Standard cargo, with the speed bonus floor (bonus_basefactor=125) made explicit. Supports Pak128 and Pak64.
The cargo your convoy is delivering. Each cargo has its own value and speed_bonus per the pakset's goods.dat.
The way (track, road, etc.) the convoy runs on. Each way type has its own speedbonus.tab reference curve.
The in-game year. Drives the speedbonus.tab reference speed lookup — newer years have higher reference speeds, which makes a fixed convoy speed earn proportionally less.
km·h⁻¹
Effective convoy speed — read off the in-game convoy info window as 'Profit speed' or 'Bonus speed'. This is the average of the convoy's effective speeds over the trip, not just the engine's top speed.
tiles
Manhattan tile distance between source and destination halts. Diagonal grid distance, not actual track length. Vanilla map max is 1024.
passengers
Number of cargo units delivered in one trip. Unit depends on the cargo: passengers, sack, tonnen, paletten, m³ or units.
trips/mo
Convoy's monthly trip count — read off the in-game line info window. Fractional values are allowed (e.g. 0.5 for a once-every-two-months long-haul).
| Cargo | Value | Speed bonus | Best at speed | Revenue / unit / tile | Floor risk |
|---|---|---|---|---|---|
| Cars | 170 | 15% | ≥ 100 km·h⁻¹ | $56.6667 | high |
| Concrete | 80 | 10% | ≥ 100 km·h⁻¹ | $26.6667 | high |
| Food | 60 | 18% | ≥ 100 km·h⁻¹ | $20.0000 | high |
| Electronics | 55 | 15% | ≥ 100 km·h⁻¹ | $18.3333 | high |
| Ethanol | 53 | 6% | ≥ 100 km·h⁻¹ | $17.6667 | low |
| Books | 50 | 8% | ≥ 100 km·h⁻¹ | $16.6667 | low |
| Furniture | 50 | 12% | ≥ 100 km·h⁻¹ | $16.6667 | high |
| Beer | 50 | 8% | ≥ 100 km·h⁻¹ | $16.6667 | low |
| Wood | 50 | 0% | ≥ 100 km·h⁻¹ | $16.6667 | low |
| Meat | 50 | 18% | ≥ 100 km·h⁻¹ | $16.6667 | high |
| Milk | 50 | 15% | ≥ 100 km·h⁻¹ | $16.6667 | high |
| Goods | 45 | 15% | ≥ 100 km·h⁻¹ | $15.0000 | high |
| Textile | 45 | 12% | ≥ 100 km·h⁻¹ | $15.0000 | high |
| Glass | 45 | 2% | ≥ 100 km·h⁻¹ | $15.0000 | low |
| Fish | 45 | 15% | ≥ 100 km·h⁻¹ | $15.0000 | high |
| Wool | 45 | 2% | ≥ 100 km·h⁻¹ | $15.0000 | low |
| Canned food | 40 | 3% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Flour | 40 | 3% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Plastic | 40 | 4% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Planks | 40 | 2% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Gasoline | 40 | 4% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Chemicals | 40 | 8% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Cement | 40 | 5% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Cotton | 40 | 0% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Corn | 40 | 3% | ≥ 100 km·h⁻¹ | $13.3333 | low |
| Fertilizer | 37 | 2% | ≥ 100 km·h⁻¹ | $12.3333 | low |
| Oil | 35 | 0% | ≥ 100 km·h⁻¹ | $11.6667 | low |
| Grain | 35 | 5% | ≥ 100 km·h⁻¹ | $11.6667 | low |
| Stone | 34 | 0% | ≥ 100 km·h⁻¹ | $11.3333 | low |
| Sand | 34 | 0% | ≥ 100 km·h⁻¹ | $11.3333 | low |
| Coal | 32 | 0% | ≥ 100 km·h⁻¹ | $10.6667 | low |
| Iron ore | 32 | 0% | ≥ 100 km·h⁻¹ | $10.6667 | low |
| Waste | 31 | 0% | ≥ 100 km·h⁻¹ | $10.3333 | low |
| Paper | 30 | 5% | ≥ 100 km·h⁻¹ | $10.0000 | low |
| Steel | 25 | 2% | ≥ 100 km·h⁻¹ | $8.3333 | low |
| 16 | 15% | ≥ 100 km·h⁻¹ | $5.3333 | high | |
| Passengers | 14 | 18% | ≥ 100 km·h⁻¹ | $4.6667 | high |
Simutrans cargo revenue calculator. $ per trip from cargo, distance, convoy speed and pakset.
What is the Simutrans cargo revenue calculator?
How to calculate Simutrans cargo revenue (and how the calculator does it)
Cargo revenue — the integer formula from simware.cc
- = Revenue in in-game $ for one delivery — the integer the calculator returns per trip.
- = Cargo base value from goods.dat. Pak128: passengers 14, coal 32, cars 170, food 60. Pak64: passengers 45, coal 210, printer's ink 630.
- = Manhattan tile distance between source and destination halts: |x_src − x_dst| + |y_src − y_dst|. NOT track length. Standard uses Manhattan; Extended uses Euclidean.
- = Amount of cargo delivered in this single trip (passengers, tonnes, paletten, sack, m³ — unit depends on the cargo's `metric` field).
- = Cargo speed_bonus from goods.dat (percent units). Pak128: passengers 18, food 18, cars 15, coal 0. Pak64: passengers 15, printer's ink 12, coal 2.
- = kmh_base — the speed delta in percent points. Positive when the convoy outruns the reference speed; negative when it lags. Computed by integer division.
- = Convoy effective speed in km/h — what Simutrans calls speedbonus_kmh, visible on the convoy info window as 'Profit speed' / 'Bonus speed'.
- = Reference speed from the pakset's speedbonus.tab for (way type, year). The calculator uses stair-step lookup (latest year ≤ user year); the C++ engine linearly interpolates between adjacent curve points (zero drift at exact curve years, small drift mid-year). Pak128 track: 1750→5, 1900→60, 1950→100, 2000→160, 2015→210.
Worked examples with the full math
Default state — passengers on track 1950 (Pak128, 100 km/h, 100 tiles, 100 pax)
Slow road bus, speed-bonus penalty — passengers (Pak128, road 1900, 30 km/h, 50 tiles, 60 pax)
Bulk immunity — coal long-haul (Pak128, track 1950, 80 km/h, 300 tiles, 200 tonnes)
High-speed gain — cars by express rail (Pak128, track 2000, 200 km/h, 100 tiles, 50 cars)
Floor activation — slow passengers on early road (Pak128, road 1900, 5 km/h, 100 tiles, 100 pax)
Pak64 vs Pak128 — same passengers/track/year — completely different $
Pak128.German — flat-revenue model — passengers track 1950 (basefactor=1000, speed_bonus=0)
Simutrans cargo revenue planning tips for forum regulars and Steam newcomers
- Bulk cargos in Pak128 (coal, iron ore, stone, sand, waste, oil, wood, cotton) all have `speed_bonus = 0`, meaning convoy speed has zero effect on revenue. Lay the cheapest, slowest track you can afford for these — a 1850s narrow-gauge mainline carrying coal earns the same per tonne as a 2010s maglev carrying the same coal. Save the fast track for passengers (speed_bonus 18%), food (18%), meat (18%), cars (15%), electronics (15%), and Pak128 goods (15%). This is the single biggest lever in Simutrans-Standard line planning and the difference between Sevenless' guide and a generic transport-sim mindset.
- Manhattan distance is what the game pays you on, NOT track length. Revenue uses |x_src − x_dst| + |y_src − y_dst| between the two halts. A 300-tile track that snakes around mountains earns the same as a 200-tile straight line between the same halts. (Operating costs DO scale with track length, which is the trap.) This is the lesson from forum thread 15878 — frank2016's 16-tile furniture route was losing money because the actual track was longer than the Manhattan distance the revenue formula used. Always check the in-game halt-to-halt distance, not the line distance.
- The convoy speed you read off the convoy info window is `speedbonus_kmh`, sometimes labeled 'Profit speed' or 'Bonus speed' depending on translation. It is NOT the vehicle's top speed from the .dat file. It is the minimum of (vehicle top speed, way speed limit, loaded top speed) averaged over the trip's tiles. A locomotive rated 160 km/h running on 100 km/h track at 95% load might show speedbonus_kmh = 90. Use that value as the calculator's input — the result will match what the line earns in-game. Source: Huperspace and DrSuperGood's clarification on Steam thread 135509823671236662 and the in-game simvehicle.cc::calc_revenue function.
- The bonus_basefactor = 125 floor (12.5% of base) means revenue never drops to zero from speed alone — even a 5 km/h horse-cart on a 200 km/h-rated cargo earns 12.5% of base. But 12.5% is rarely enough to cover running costs and way maintenance. The floor warning in the calculator surfaces this state explicitly: when you see it, the right answer is either upgrade the convoy (the calculator prints the target km/h needed) or switch to a bulk cargo on the same line. Source: simuconf.tab line 'bonus_basefactor = 125' with the comment 'lowest possible income with speedbonus (1000=1) default 125 (=1/8th)'.
- Speed bonus uses your pakset's per-waytype reference speed, which rises over decades. Pak128 track went from 5 km/h reference in 1750 to 100 km/h in 1950 to 210 km/h in 2015. A 1950s steam train (~100 km/h) hits exactly the reference and earns base value for passengers — but the same train in 2015 is at 100/210 = 48% of reference, so kmhBase = −53, bonus = 1000 − 53 × 18 = 46 → floor at 125. If you set up a passenger line in 1950 and walk away, by ~1980 it has silently become unprofitable as the speedbonus.tab curve rises past the convoy's top speed. The calculator shows you this by letting you sweep the year input.
- Pak64 and Pak128 are NOT scale-equivalent. Pak64 passenger value is 45 versus Pak128's 14 — Pak64 numbers are about 3× higher across the board. Don't try to compare absolute $ between paksets. The calculator switches its entire cargo table when you change the pakset selector; the relative ranking of cargoes within a pakset is what matters. Within Pak128, cars (value 170, speed_bonus 15) yield the highest per-unit-per-tile revenue at any reasonable convoy speed. Within Pak64, printer's ink (value 630, speed_bonus 12) is the per-unit champion but ships in tiny amounts.
- Trips per month is a direct multiplier on per-trip revenue — the calculator does not estimate fleet sizing for you. Read the line's trips-per-month off the in-game line info window (it ticks up monthly), or estimate as (line length in km × 2 for round trip) ÷ (convoy speed in km/h) ÷ (24 in-game hours per day × 30 days). A 200-tile passenger line with a 100 km/h train completes ~4-6 trips per month per convoy; throwing two convoys at the line doubles that to 8-12. The per-month output in the calculator is the per-trip × tripsPerMonth product; the cargo cheat-sheet sorted by per-unit-per-tile is the better tool for cargo selection.
- Simutrans-Extended (the James Petts fork) uses a different formula: Euclidean distance instead of Manhattan, journey-time-based average speed instead of max speed, and additional revenue factors for comfort, catering, and passenger class. This calculator covers Simutrans-Standard only. If you are on a Bridgewater-Brunel server or a pak128.britain-extended save, the numbers here are the wrong baseline. The Standard formula is what ships with the Steam release and the main simutrans.com download.
- The cargo cheat-sheet table below the calculator sorts every cargo in the active pakset by revenue per unit per tile at YOUR current convoy speed, way type, and year. It is the answer to the question 'which cargo on this line earns the most per tile right now?' Cargos flagged 'high floor risk' (speed_bonus ≥ 10%) are the ones that will silently lose value if you let the convoy speed drift below the reference speed; 'low floor risk' (speed_bonus < 10%) are forgiving and bulk-equivalent for planning purposes.
Simutrans cargo revenue calculator — frequently asked questions
What is the formula for cargo revenue in Simutrans-Standard?
Revenue per trip = floor((value × max(125, 1000 + kmh_base × speed_bonus) × distance × amount + 1500) / 3000), where kmh_base = floor(100 × convoy_kmh / ref_kmh) − 100 and ref_kmh comes from the pakset's speedbonus.tab curve at the active waytype and year. The constants 125 = bonus_basefactor (12.5% floor) and 1500/3000 = banker's-rounding to credits are pulled from src/simutrans/simware.cc, src/simutrans/vehicle/vehicle.cc, and simuconf.tab. The formula is identical in Simutrans-Standard 124.x and 125.x.
Why does my fast train barely earn more than my slow one?
Speed bonus is multiplied by the cargo's speed_bonus parameter, which is 0 for bulk cargoes (coal, iron ore, stone, sand, wood in Pak128). For those, convoy speed has zero effect on revenue. The speed bonus only kicks in for cargoes with speed_bonus > 0 — passengers (18%), cars (15%), goods (15%), food (18%). Even there, the bonus is the percent above reference speed times the speed_bonus value. A train running at 1.2× the reference earns +0.2 × 18 = 3.6% extra on passengers — useful but not transformative. Use the cheat-sheet table to see exactly which cargoes pay off for high-speed convoys.
What is the speed-bonus floor and when does it activate?
The speed-bonus floor is bonus_basefactor = 125, meaning revenue is clamped at 12.5% of (value × distance × amount) when the convoy is too slow for the cargo's speed_bonus. It activates when 1000 + kmh_base × speed_bonus would drop below 125. For Pak128 passengers (speed_bonus 18), that requires kmh_base < −48.6, which means convoy_kmh < 51.4% of ref_kmh. For Pak128 cars (speed_bonus 15), the threshold is convoy_kmh < 41.7% of ref_kmh. The calculator surfaces this state with a warning panel and tells you the minimum convoy km/h needed to lift off the floor.
How is distance measured in Simutrans-Standard?
Manhattan tile distance between source and destination halt: |x_src − x_dst| + |y_src − y_dst|. NOT track length. A 300-tile track between two halts that sit 100 tiles apart Manhattan-wise earns revenue on 100 tiles. Running costs DO scale with the actual tracked distance, so a winding route costs more to operate than it earns. Simutrans-Extended uses Euclidean distance instead — this calculator only covers Standard.
Which pakset should I use in the calculator?
Pak128 if you downloaded the default Simutrans from simutrans.com or Steam — it ships as the default since Simutrans 120.x. Pak64 if you specifically downloaded the jha4ceb/pak64.experimental fork or the original aburch/simutrans-pak64. Pak128.German if you are on the simutrans-germany.com server or downloaded the pak128.german zip from SourceForge — it ships with 67 cargoes (more than the other two paksets, including German-specific items like Marzipan, Schiffssektionen, and Tierfutter) and a different economic model: `bonus_basefactor = 1000` plus `speed_bonus = 0` on every cargo, so convoy speed does not affect revenue at all in this pakset. The cargo tables and speedbonus.tab curves differ between paksets; absolute $ numbers are NOT comparable across paksets.
Does this calculator work for Simutrans-Extended?
No. Simutrans-Extended (jamespetts/simutrans-extended) uses a different revenue formula: Euclidean distance instead of Manhattan, journey-time-based average speed instead of convoy max speed, and additional terms for comfort, catering, and passenger class. The Extended formula is documented at simutrans-germany.com/wiki/wiki/en_extended_Economics. The calculator above covers Simutrans-Standard only — the version that ships on Steam (app/434520) and the main simutrans.com download.
Why does the calculator show $ instead of credits or €?
The $ glyph is the default English-language currency symbol used by Pak128 and Pak64 translations of Simutrans — it is the most-screenshotted in-game symbol and is hard-coded in the calculator regardless of the visitor's locale. Pak128.German uses € in the German translation and $ in English. The number Simutrans calls 'credits' is what the calculator labels '$' — the same underlying integer the engine writes to your bank account.
Why is my in-game revenue different from the calculator's number?
Three common causes. (1) You entered vehicle top speed instead of speedbonus_kmh. Open the convoy info window in-game and read off the 'Profit speed' or 'Bonus speed' value — that is what the formula uses, not the locomotive's .dat top speed. (2) You used track length instead of Manhattan distance. Standard charges revenue on |dx|+|dy| between halts, not the path length. (3) You are on Simutrans-Extended, which uses a different formula entirely (Euclidean distance, comfort, classes). The calculator is bit-exact against Simutrans-Standard 124.x/125.x — if you fix the inputs the credits will match the engine to the unit.
Can I share my calculation with someone on the Simutrans forum?
Yes. The page URL encodes the full input state in a `?s=` query parameter — pakset, cargo, way type, year, convoy km/h, distance, amount, and trips per month. Copy the URL from the address bar after you have set your inputs and paste it into a forum.simutrans.com thread or Steam discussion — anyone clicking the link sees the same revenue figure, the same breakdown panel, and the same cheat-sheet ranking. Handy for debugging 'why is my coal line losing money?' threads where the OP and the responder need to see the same numbers.
How accurate is this calculator vs the actual game?
Bit-exact against Simutrans-Standard 124.x and 125.x — the 199-test QA suite cross-checks every output against the C++ math in src/simutrans/simware.cc::waret::calc_revenue and src/simutrans/vehicle/vehicle.cc::vehiclet::calc_revenue. The engine reproduces the integer division, the max(125, ...) clamp, and the (numerator + 1500) / 3000 conversion exactly. The calculator does not model: NewGRF-equivalent goods.dat overrides (rare in Simutrans), vehicle running costs, way maintenance, station fees, mixed-cargo trips with different `value`/`speed_bonus` per car (compute per-cargo and sum), or the pay-for-total-distance setting variants 0 and 1 (calculator assumes the default '2 — full destination' setting).
Which cargo is the most profitable in Pak128?
By raw value-per-unit-per-tile, cars (value 170, speed_bonus 15) win at any convoy speed at or above the reference. By per-month throughput, the answer depends on industry production rates — a factory producing 50 cars/month feeds a different revenue stream than a coal mine producing 500 tonnes/month. The calculator's cheat-sheet table sorts every Pak128 cargo by revenue per unit per tile at your current convoy speed, which is the right answer when you have a fixed route and need to pick the best cargo. Concrete (value 80, speed_bonus 10) and food (value 60, speed_bonus 18) are strong runners-up. Bulk cargoes (coal 32, iron 32, stone 34) pay less per unit but ship in massive amounts.
How does this calculator differ from the in-game Goods List window?
The in-game Goods List (press G) shows per-cargo `value`, `speed_bonus`, and `weight_per_unit` and lets you slide a hypothetical distance and speed to preview revenue per single item — useful for sanity-checking but not for planning a specific multi-tile, multi-unit trip. It also lives behind a save file. This calculator runs the same formula entirely in your browser, displays the full $ for a specific trip plus per-month aggregation, prints the 9-step formula derivation, and sorts the cheat-sheet by per-unit-per-tile revenue at your current convoy speed. It also exposes the bonus_basefactor=125 floor explicitly — a state the in-game UI does not flag.
Simutrans economy and cargo glossary
Manhattan distance
The straight-line tile-grid distance between two halts, computed as |x_src − x_dst| + |y_src − y_dst|. Used by Simutrans-Standard's revenue formula. NOT track length. Simutrans-Extended uses Euclidean distance instead.
speedbonus_kmh
The convoy's effective speed in km/h used by the revenue formula. Computed as min(vehicle top speed, way speed limit, loaded top speed) averaged over the trip's tiles. Shown in the convoy info window as 'Profit speed' or 'Bonus speed'. NOT the locomotive's .dat top speed.
ref_kmh
The reference speed from the pakset's speedbonus.tab curve at the active waytype and year. Stair-step interpolated — find the latest year point ≤ user's year, return that speed. Pak128 track: 1750→5, 1900→60, 1950→100, 2000→160, 2015→210.
kmh_base
The percent speed delta: floor(100 × convoy_kmh / ref_kmh) − 100. Positive when the convoy outruns the reference, negative when it lags. Integer division per simware.cc.
bonus_basefactor
The speed-bonus floor constant from simuconf.tab, default 125 (= 12.5%). Verbatim comment in the config file: 'lowest possible income with speedbonus (1000=1) default 125 (=1/8th)'. Locks revenue at 12.5% of base value when 1000 + kmh_base × speed_bonus would otherwise drop below 125.
value (cargo)
The per-unit-per-tile base revenue from goods.dat, scaled. Pak128: passengers 14, coal 32, cars 170, food 60. Pak64: passengers 45, coal 210, printer's ink 630. The wiki's en_GoodsDef page formulates it as value/300 for the credits-per-km display in the in-game Goods List.
speed_bonus (cargo)
The per-cargo sensitivity to convoy speed, in percent units, from goods.dat. Pak128: passengers 18, food 18, meat 18, cars 15, electronics 15, coal 0. Bulk cargoes set speed_bonus = 0 and are immune to convoy speed.
ware_t::calc_revenue
The C++ function in src/simutrans/simware.cc that computes the per-unit-per-tile freight revenue. Implements the max(125, 1000 + kmh_base × speed_bonus) clamp this calculator reproduces bit-exact.
vehicle_t::calc_revenue
The C++ function in src/simutrans/vehicle/vehicle.cc that multiplies freight_revenue by distance and amount, sums across all wares in the vehicle, and applies the (value + 1500) / 3000 banker's-rounding conversion to credits.
Pakset
A bundle of graphics and game-data files that determines tile size, cargo tables, vehicle catalog, and speedbonus.tab curves. Pak128 (128px tiles, 37 cargoes), Pak64 (64px tiles, 22 cargoes), Pak128.German (128px tiles, 67 cargoes — bonus_basefactor 1000, speed_bonus disabled). The Simutrans binary loads one pakset at a time; the revenue formula is identical, only the goods.dat constants and the bonus_basefactor override change.
Simutrans-Standard
The mainline Simutrans fork maintained by Markus Pristovsek (Prissi). The version that ships on Steam (app/434520) and via simutrans.com. Uses the Manhattan-distance, max-speed revenue formula this calculator implements. Current stable release: 124.x / 125.x.
Simutrans-Extended
James Petts' fork (formerly Simutrans-Experimental). Uses Euclidean distance, journey-time-based average speed, and additional revenue terms for comfort, catering, and passenger class. Not covered by this calculator. Run by the Bridgewater-Brunel server community.
Goods List (in-game)
The in-game window opened with the [G] hotkey or via the list-management toolbar. Shows per-cargo value, speed_bonus, catg, weight, and lets the player slide a hypothetical distance + speed to preview revenue per single item. Static preview only — no $ output for a specific multi-tile, multi-unit trip.
Sevenless' Guide to Profitability
The canonical Steam Community guide (ID 699781872) by user Sevenless explaining profit mechanics in Simutrans for newcomers. Covers UTE (Useful Tractive Effort), speed-bonus penalty structure, and the cargo-vs-passenger profitability trade-off. Static prose — no interactive calculator.
Sisältö tarkistettu Smart Calculators -tiimin toimesta