The science

The math behind every rate. Open. Cited. Yours to check.

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.

Tier 1

Published

Numbers lifted directly from peer-reviewed extension publications.

Tri-State P critical level = 20 ppm
Corn P₂O₅ removal = 0.37 lb/bu

Tier 2

Computed

Deterministic formulas derived from Tier 1 inputs.

rate = removal × yield_goal
+ (target − soil)
× buildup_factor
/ buildup_years

Tier 3

Conventional default

Industry-standard practice values, overridable per organization.

buildup_years = 4
tie_up_factor = 10%

Tier 4

User-driven

Inputs the farmer provides. Always overridable, always transparent.

yield_goal = 200 bu/ac
product_cost = $475/ton
philosophy = "Hybrid"

Tier 5

Placeholder · flagged verified: false

Numbers 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

The recommendation tables

A published guide for every state. Every cell traceable.

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.

Iowa State PM 1688

"A General Guide for Crop Nutrient and Limestone Recommendations in Iowa." Published by Iowa State University Extension.


  • Region. Western and Central Corn Belt
  • P extractant. Bray-P1
  • K extractant. Ammonium acetate
  • Crops. Corn, soybean, alfalfa

Tri-State 2020

"Tri-State Fertilizer Recommendations for Corn, Soybeans, Wheat, and Alfalfa," 2020 update. Ohio State, Purdue, and Michigan State.


  • Region. Ohio, Indiana, Michigan
  • P extractant. Mehlich-3 or Bray-P1
  • K extractant. Mehlich-3
  • Crops. Corn, soybean, wheat, alfalfa

Penn State Agronomy Guide

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).


  • Region. Mid-Atlantic
  • P extractant. Mehlich-3 only
  • K extractant. Mehlich-3
  • Lime. Mehlich Buffer / Exchangeable Acidity
  • Crops. Corn, soybean, wheat, hay, more
The Soil Health report card

Your soil test, graded in your state's own words — or honestly left measured.

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 Hybrid philosophy, in detail

How Zone Forge picks a rate.

The default Hybrid philosophy treats your soil-test value differently depending on which band it falls into. Below is the exact decision tree.

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).

  1. Build — soil < 0.9 × target. Apply 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.
  2. Maintain — 0.9 × target ≤ soil ≤ 1.1 × target. Apply pure crop removal: removal × yield_goal. Replace exactly what the crop took out so the soil holds at target.
  3. Drawdown — soil > 1.1 × target. Apply 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
none100%100%100%
light75%75%0%
moderate (default)75%50%0%
aggressive25%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.

A worked example

Corn at 200 bu/ac, P test = 25 ppm Mehlich-3.

# 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.

Lime — a separate engine

Different driver, different units, different product axis.

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.

  1. Resolve target pH. Crop-specific (alfalfa 6.8, corn/soy/wheat 6.5, oats/rye/sorghum 6.0) → profile default → system default of 6.5. The provenance flows through to the UI so a farmer seeing alfalfa at 6.8 vs corn at 6.5 can see why.
  2. Compute CaCO₃-equivalent demand using the right state's method. Zone Forge ships 50-state lime coverage where each state's source matches that state's land-grant extension publication. Penn State uses Mehlich Buffer / Exchangeable Acidity (the method PSU publishes today; Adams-Evans was retired). Delaware, New Jersey, South Carolina, Florida, and Alabama use Adams-Evans Coastal Plain (UDel anchor table, Auburn / Clemson / Rutgers / UF parallel citations). Georgia uses UGA's direct Ca(OH)₂ titration (LBCEq, 2025). Vermont uses reactive aluminum (the only state on this method). Illinois uses water pH × CEC class. Maryland uses texture × physiographic province → lb oxides/A. Arkansas uses pH + soil-test Calcium. Iowa, Tri-State (OH/IN/MI), and the other midwest / Plains states use buffer-pH crosswalks for SMP / Sikora / Woodruff. Western states with alkaline soils (AZ, NV, NM, UT, WY, most of CO) surface honest "lime not needed" messaging. If measured pH is already at or above target, return 0 — no lime even when reserve acidity is present.
  3. Pick calcitic vs dolomitic from soil Mg. If 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.
  4. Convert to a physical product rate using ECCE (Effective Calcium Carbonate Equivalent — varies 60–100% across products). 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
What's not in the engine

Honest about our limits.

Trust runs both ways. Here's what Zone Forge intentionally does not do today.

Want to go deeper?

The full methodology is in the docs.

Per-source tables, per-nutrient defensibility, every formula with derivation, and the calculation FAQ.