Skip to content

Herd inventory roll-forward

A herd inventory roll-forward explains how each inventory class got from its opening head count to its closing count over a period, usually a month. Each class has the same columns:

  • Opening: last period’s closing count.
  • Births: live calves added to the youngest class.
  • Purchases: animals bought in.
  • Sales: animals sold out (including culls).
  • Deaths: animals that died.
  • Transfers in / out: moves between classes, e.g. a springer that calves moves to milk cows; a heifer that ages out of one band moves into the next; a cow dried off moves from milk to dry.
  • Adjustments: reason-coded corrections.
  • Closing: the computed result.

Transfers net to zero across all classes; they move head, they don’t create or remove it. No class can close negative.

The computed closing is compared with the observed count from the period-end census (the DC305 count or INV report). The difference is the residual:

  • Every residual is explained with a reason code (late-entered event, unrecorded death, mis-keyed ID, purchase not yet entered, class boundary).
  • Small residuals from month-end boundary timing are common and benign: events that happened on the last day of the month but were entered on the 1st or 2nd of the next.
  • Large residuals (e.g. over about 2% of a class) should block the close until explained.

Once a period is reported to the lender it is closed: its closing counts become the next period’s opening and are not edited in place. A correction found later is a restatement: a new version of the period that supersedes the old one, with a reason and the date it was made. Silent edits to a closed period break the chain of openings and make past certificates impossible to reproduce.

Plain text:

closing (class) = opening + births + purchases − sales − deaths
+ transfers in − transfers out ± adjustments
Σ transfers in = Σ transfers out (across all classes)
residual = observed census − computed closing
residual % = residual / computed closing × 100

LaTeX:

C_k = O_k + B_k + P_k - S_k - D_k + T^{\text{in}}_k - T^{\text{out}}_k \pm A_k
R_k = N^{\text{census}}_k - C_k, \qquad \sum_k T^{\text{in}}_k = \sum_k T^{\text{out}}_k

DC305 is the source for every column. Event names and remark codes vary by herd; check the herd’s private dc305-vocab mapping first.

  • Births: FRESH events (and calf entries) in the period; live heifer and bull calves by sex, excluding dead-at-birth.
  • Freshening transfers: FRESH events with LACT=1 move heifers to milk cows.
  • Sales and deaths: SOLD and DIED events in the period, by class at the date of the event.
  • Purchases: the herd’s arrival/purchase event (spelling varies).
  • Dry-offs: DRY events, where the herd records them.
  • Census: period-end counts by class, or the herd’s INV reports.
EVENTS\B FRESH FOR FDAT=<first of month>-<last of month> FRESH in the period, including cows that left since
COUNT\B FOR LACT=1 FDAT=<period> first-calf freshenings, including heifers that left since
EVENTS\D SOLD FOR <period date range> sales in the period
EVENTS\D DIED FOR <period date range> deaths in the period
EVENTS\5C event table by month, with PREG/OPEN counts
ECON\ID past / yearly cow inventory summary
ECON\IHD past heifer inventory
  • EVENTS and COUNT cover live animals only by default. Every event column needs \B (live and left) or \D (left only), or the animals that calved, were sold or died during the period and then left drop out of the roll-forward. Animals moved to the archive file need \L.
  • Select an event type by naming it after EVENTS, or with \I (prompt for which events, as in EVENTS\2SI); \S prompts for the date range.
  • low-high in a FOR condition is an inclusive range; high-low is exclusive (everything outside the range).
  • ECON\ID and ECON\IHD give past cow and heifer inventories to check the census against.

Two known limits:

  • Dry-offs are often not recorded as events, so milk vs dry can’t always be rolled forward from events. Use the census for that split and treat milk↔dry as a computed transfer.
  • Age-band and springer moves happen by the calendar, not by an event. Compute them from birth dates and due dates at period end, or take the census split.

Herd context: US Holsteins, freestall or dry-lot, monthly close reported to an ag lender; tolerances vary by lender.

  • Residual per class: zero or a few head is normal; above about 2% of a class warrants investigation before the close.
  • Monthly deaths: roughly 0.5% of cows per month for adult cows.
  • Monthly sales (culls): roughly 2.5–3.5% of cows per month.
  • Opening ≠ last closing. The chain breaks when someone re-pulls the prior month instead of carrying the closed numbers forward.
  • Unbalanced transfers. A heifer that calves leaves the springer class and must enter milk cows in the same period.
  • Counting stillborn calves as births.
  • Double-counting late entries: an event entered after the close is counted in the new month and also in a restated old month.
  • Rolling milk/dry from events when dry-offs aren’t recorded.
  • Editing a closed period instead of restating it.
  • Ignoring residuals because the total herd ties: offsetting errors between classes hide real problems.