Calculate throughput, item production rates, and machine requirements based on crafting speeds and modules.
Base time listed on the recipe tooltip.
Assembling Machine 1 (0.5), 2 (0.75), or 3 (1.25).
Example: Copper Cable produces 2.
From Beacons or Speed Modules (use negative for Prod modules).
From Productivity Modules.
Optional: Calculate machines needed for a blue belt (2700).
Calculation Results
Modified Crafting Speed: 0
Crafting Cycle Time: 0 s
Output per Second: 0 items/s
Output per Minute: 0 items/m
Machines Needed for Target: N/A
Blue Belt Saturation: 0%
Optimizing Your Factory with the Max Rate Calculator
In Factorio, efficiency is the name of the game. Whether you are aiming for a megabase running at thousands of science packs per minute (SPM) or simply trying to saturate a blue belt of green circuits, understanding the math behind crafting speeds and productivity bonuses is essential. This Factorio Max Rate Calculator helps you determine the exact throughput of a single machine and how many machines you need to meet your production goals.
How Crafting Rate is Calculated
The game calculates production based on three primary factors: the base recipe time, the crafting speed of the assembling machine (or chemical plant/furnace), and any module modifiers. The formula used by this calculator is:
Bonuses: If you are using Speed Module 3s, each adds +50% speed. Productivity Module 3s add +10% productivity but reduce speed by 15%. Beacons transmit 50% of the module's effect.
Belt Throughput Reference
When planning your "Max Rate", it is crucial to know the limits of your logistics belts:
Yellow Belt: 15 items/sec (900 items/min)
Red Belt: 30 items/sec (1800 items/min)
Blue Belt: 45 items/sec (2700 items/min)
Use the "Target Output" field in the calculator to see exactly how many assemblers you need to fill a specific belt type completely.
function calculateFactorio() {
// Get inputs
var recipeTime = parseFloat(document.getElementById("recipeTime").value);
var machineSpeed = parseFloat(document.getElementById("machineSpeed").value);
var itemsPerCraft = parseFloat(document.getElementById("itemsPerCraft").value);
var speedBonus = parseFloat(document.getElementById("speedBonus").value) || 0;
var prodBonus = parseFloat(document.getElementById("prodBonus").value) || 0;
var targetRate = parseFloat(document.getElementById("targetRate").value) || 0;
// Validation
if (isNaN(recipeTime) || recipeTime <= 0 || isNaN(machineSpeed) || machineSpeed <= 0 || isNaN(itemsPerCraft) || itemsPerCraft <= 0) {
alert("Please enter valid positive numbers for Recipe Time, Machine Speed, and Items Per Craft.");
return;
}
// 1. Calculate Effective Speed
// Formula: Base Speed * (1 + (SpeedBonus / 100))
// Note: In Factorio, speed cannot go below 20% of base speed usually, but we will use raw math here.
// Productivity modules usually reduce speed, so speedBonus might be negative if user sums them up manually,
// or positive if they add beacons. We treat the input as a net percentage sum.
var speedMultiplier = 1 + (speedBonus / 100);
// Ensure speed doesn't invert to negative (game cap is low but positive)
if (speedMultiplier 0) {
machinesNeeded = targetRate / itemsPerMinute;
machinesText = Math.ceil(machinesNeeded) + " (" + machinesNeeded.toFixed(2) + ")";
}
// 6. Calculate Belt Saturation (Blue Belt = 45/s or 2700/m)
var blueBeltCap = 2700;
var beltSat = (itemsPerMinute / blueBeltCap) * 100;
// Display Results
document.getElementById("results").style.display = "block";
document.getElementById("resSpeed").innerHTML = effectiveSpeed.toFixed(2);
// Cycle time = 1 / (Effective Speed / Recipe Time) ??
// Actually Cycle time is just RecipeTime / EffectiveSpeed
var realCycleTime = recipeTime / effectiveSpeed;
document.getElementById("resCycle").innerHTML = realCycleTime.toFixed(2) + " s";
document.getElementById("resPerSec").innerHTML = itemsPerSecond.toFixed(2) + " items/s";
document.getElementById("resPerMin").innerHTML = itemsPerMinute.toFixed(0) + " items/m";
document.getElementById("resMachines").innerHTML = machinesText;
document.getElementById("resBeltSat").innerHTML = beltSat.toFixed(1) + "% of a Blue Belt";
}