Black-box recommendations ask you to trust the algorithm. Zone Forge asks you to read the formula, check the source, and reproduce it. If you can't, we haven't done our job.
Every number Zone Forge prints belongs to one of five tiers. Knowing which tier a number sits in is how you know whether to trust it, scrutinize it, or override it.
Numbers lifted directly from peer-reviewed extension publications.
Tri-State P critical level = 20 ppm
Corn P₂O₅ removal = 0.37 lb/bu
Deterministic formulas derived from Tier 1 inputs.
rate = removal × yield_goal
+ (target − soil)
× buildup_factor
/ buildup_years
Industry-standard practice values, overridable per organization.
buildup_years = 4
tie_up_factor = 10%
Inputs the farmer provides. Always overridable, always transparent.
yield_goal = 200 bu/ac
product_cost = $475/ton
philosophy = "Hybrid"
verified: falseNumbers we inferred where peer-reviewed data wasn't available. Always tagged so you know which to scrutinize.
// Lima bean P removal — outside corn-belt scope
removal: 0.42 # verified: false, source: industry estimate
Zone Forge maps each state to its own land-grant source — 40-plus extension publications, plus a lime method calibrated for all 50 states. Here are three of the deepest-calibrated; the rest of the map works the same way.
"A General Guide for Crop Nutrient and Limestone Recommendations in Iowa." Published by Iowa State University Extension.
"Tri-State Fertilizer Recommendations for Corn, Soybeans, Wheat, and Alfalfa," 2020 update. Ohio State, Purdue, and Michigan State.
Penn State Extension's annually updated agronomy guide. Includes the lime engine driven by Mehlich Buffer / Exchangeable Acidity — the method Penn State publishes today (Adams-Evans was retired).
Upload a soil test and Zone Forge grades it for you — worst nutrient first, color- and word-coded, with variability hints and your fertility trend across past uploads.
In the 26 states whose extension labs publish rating words, we grade in that state's own language — Arkansas's "Very Low → Above Optimum," Delaware's Fertility Index Value, Oklahoma's "Low / Sufficient." In the other states, we show your measured value with a note on why we don't grade that lab format yet. An honest "measured" beats a wrong grade — a soil test run on a lab method our table isn't calibrated to degrades to "confirm your method" instead of mis-grading. pH and lime are calibrated for all 50 states, so that verdict shows everywhere.
The default Hybrid philosophy treats your soil-test value differently depending on which band it falls into. Below is the exact decision tree.
Hybrid is a true 3-zone system: build below the maintenance band, maintain in band, draw down above. The maintenance band is target ± 10% by default (configurable per field).
removal × yield_goal + (target − soil) × buildup_factor / buildup_years. The buildup is deficit-scaled: a zone testing far below target gets a much bigger bump than one just below the band, so adjacent variable-rate zones never collapse to the same flat number.removal × yield_goal. Replace exactly what the crop took out so the soil holds at target.removal × yield_goal × multiplier. The multiplier comes from the drawdown_level setting (default moderate). Under moderate, soil up to 1.25 × target gets 75%, soil up to 1.5 × target gets 50%, and soil above 1.5 × target gets 0.| drawdown_level | ratio ≤ 1.25 | 1.25 < ratio ≤ 1.5 | ratio > 1.5 |
|---|---|---|---|
| none | 100% | 100% | 100% |
| light | 75% | 75% | 0% |
| moderate (default) | 75% | 50% | 0% |
| aggressive | 25% | 0% | 0% |
ratio = soil ÷ target. Every constant — critical, target, removal, buildup_factor — comes from your selected source table. buildup_years, drawdown_level, and the maintenance tolerance are all overridable per field.
# Inputs yield_goal = 200 # bu/ac corn soil_p = 25 # ppm Mehlich-3 source = "Tri-State 2020" philosophy = "Hybrid" product = "DAP (18-46-0)" # From the source table critical_p = 15 # ppm (Tier 1, published) target_p = 30 # ppm (Tier 1, published) p2o5_removal = 0.37 # lb P₂O₅ / bu (Tier 1, published) buildup_factor = 10 # lb P₂O₅ / ppm (Tier 1, Tri-State) buildup_years = 4 # Tri-State default maint_tol_pct = 10 # maintenance band = target ± 10% drawdown_level = "moderate" # Maintenance band = target × (1 ± 10%) = 27.0 to 33.0 ppm # Decision: 25 ppm < 27.0 → BUILD (deficit-scaled) deficit_ppm = target_p - soil_p = 30 - 25 = 5 buildup = deficit_ppm * buildup_factor / buildup_years = 5 * 10 / 4 = 12.5 nutrient_rate = yield_goal * p2o5_removal + buildup = 200 * 0.37 + 12.5 = 86.5 # lb P₂O₅ / ac (Tier 2, computed) # Convert to product dap_analysis = 0.46 # 46% P₂O₅ in DAP (Tier 1, label) product_rate = nutrient_rate / dap_analysis = 86.5 / 0.46 = 188.04 # lb DAP / ac (Tier 2, computed) # Cost per acre — resolves field override → org Price Book → catalog default dap_cost = 475 # $/ton (Tier 4, user input) cost_per_ac = product_rate * dap_cost / 2000 = 188.04 * 475 / 2000 = 44.66 # $/ac
Every line is reproducible with a calculator. Every constant is sourced. Bring soil_p up to 30 ppm (exactly target) and the deficit goes to zero — the engine drops cleanly to 74 lb P₂O₅/ac (pure crop removal). Bump it to 40 ppm and you'd land in the drawdown band (40 / 30 ≈ 1.33, > 1.25 with moderate default) for a rate of 74 × 0.50 = 37 lb P₂O₅/ac. Change source to Iowa PM 1688 and you'll see different critical/target levels — because Iowa is calibrated to Bray-P1 and you're using Mehlich-3 values, the engine will refuse and offer to convert.
Liming is fundamentally different from N-P-K fertilization. The driver is the lab's reserve-acidity value (Mehlich Buffer Acidity for Penn State, Buffer pH for midwest crosswalks), the output is tons CaCO₃-equivalent per acre, and the product split is calcitic vs dolomitic — not which fertilizer maximises analysis %. We keep the code paths separate so the math never crosses.
Mg ppm < 50 or Mg base saturation < 10% ⇒ dolomitic (corrects pH and Mg together). Otherwise calcitic. No Mg data ⇒ default to calcitic — safer than loading Mg into balanced soil. Thresholds are configurable per source via the dolomitic_if JSON block, not hardcoded.physical_tons = caco3_tons / (ecce / 100).Mg correction stays uncoupled. The fertilizer engine produces a Mg fertilizer rate when soil Mg is low (defaults: dolomitic lime when liming is also required, otherwise K-Mag / langbeinite). The lime engine uses Mg only to choose calcitic vs dolomitic. Epsom salt is tagged as specialty / advanced and is excluded from default recommendations — at field scale on row crops, it isn't the practical product.
# Worked example — corn, low pH, low Mg, Tri-State source measured_ph = 5.8 buffer_ph = 6.7 source = "Tri-State 2020" crop = "corn" mg_ppm = 40 # Resolve target pH (crop > profile > system default) target_ph = crop_target_pH["corn"] = 6.5 # provenance: crop # Lime required? 5.8 < 6.5 ⇒ yes tons_caco3 = lookup(buffer_ph=6.7) = 3.0 # tons CaCO₃-equivalent / ac # Source choice: Mg 40 < 50 ⇒ dolomitic recommended = "dolomitic" # Convert to dolomitic lime product (ECCE 85) product_rate = 3.0 / 0.85 = 3.53 # tons dolomitic lime / ac
Trust runs both ways. Here's what Zone Forge intentionally does not do today.
Per-source tables, per-nutrient defensibility, every formula with derivation, and the calculation FAQ.