TTB Batch Records
A TTB Batch Record is the legally-required record of a single physical batch’s production for federal alcohol compliance. Every batch with compliance_regime = ttb must have one before it can move to Closed. The records aggregate up into the Monthly TTB Report that gets filed with the Alcohol and Tobacco Tax and Trade Bureau.
TTB = Alcohol and Tobacco Tax and Trade Bureau, the federal agency that regulates beverage alcohol producers in the US. DSP = Distilled Spirits Plant, the federal designation for a permitted distillery.
When a TTB record is required
| Product compliance regime | TTB record required? |
|---|---|
ttb (most spirits, some wines, some beers) | Yes — gate to closing the batch. |
none (non-alcoholic, exempt categories) | No. |
The regime is set on the product, inherited by the batch at creation, and frozen for the life of the batch. You cannot change a batch’s regime mid-run.
Pages
/compliance/ttb — TTB record list
A flat list of every TTB Batch Record across all batches, with status filters: Draft / Submitted / Filed. Click a row to open the record for that batch. The page subtitle is “Federal alcohol production records by batch.”
/compliance/ttb/[batchId] — Single TTB Batch Record
The record form for one specific production batch. The URL parameter is the batch ID, not the TTB record ID — the form auto-creates a draft record if none exists, then opens it for editing.
The page is a structured form with three sections:
- Identity — DSP number, formula number, product class, production date, bottling date.
- Volumes — volume in (gallons), volume out (gallons), losses (auto-computed), ABV %, proof gallons (auto-computed).
- Filing — status, notes, audit trail of every change.
Volume and proof-gallon math is computed on insert/update, not entered by hand:
- Losses (gallons) =
volume_in_gallons − volume_out_gallons - Proof gallons =
volume_out_gallons × abv_pct / 50(the federal definition: one proof gallon = one US gallon at 100 proof, i.e. 50% ABV)
You enter the inputs; vestl computes the rest. This eliminates a class of TTB filing errors.
Lifecycle
A TTB record progresses through three statuses:
| Status | What it means | What advances it |
|---|---|---|
| Draft | Record is being filled in. Editable. | Submit the record (locks the volumes and proof-gallon math). |
| Submitted | Record is internally signed off. The numbers are committed and feed the monthly report. | A monthly report is filed that includes this record. |
| Filed | Included in a filed monthly TTB report to the federal government. Read-only forever. | — |
A Filed record cannot be edited under any circumstances — that’s the whole point of the audit chain. If you discover an error after filing, file an amended monthly report rather than mutating the original record.
Field reference
Production batch
The physical batch this record covers. One TTB record per production batch (enforced by a unique constraint on production_batch_id). The batch ID is set when the record is first created and cannot be changed.
DSP number
Your federally-issued Distilled Spirits Plant number (format DSP-XX-NNNNN for traditional permits, DSP-AB-NNNNN for the newer alphabetic series). Set on the company profile at /settings/company; copied into each TTB record so the record stands alone if your DSP number ever changes (e.g. after a relocation).
Formula number
The TTB-issued formula approval number for the product. Pulled from Product.ttb_formula_number if set; otherwise blank for products that don’t require a formula approval (e.g. base spirits, certain wines, unmodified beers). Required on the record for products that do.
Product class
The TTB product classification. Common values: Distilled Spirits Specialty, Whisky, Vodka, Gin, Rum, Brandy, Cordials and Liqueurs, Wine, Malt Beverage. Drives which monthly report forms aggregate this batch’s proof gallons.
Production date
The date production started — typically the day the batch transitioned to In progress on /batches. Used to determine which monthly report the batch belongs to.
Bottling date
The date packaging completed. Optional; if not set, the batch is treated as bulk inventory until bottled. Bottling crosses certain federal thresholds (e.g. label-claim ABV must match within ±0.3% on the COA at bottling time).
Volume in (gallons)
What you put into the production batch — the sum of input liquid volumes converted to wine gallons. Drives losses computation.
Volume out (gallons)
What came out of the production batch — finished liquid volume in wine gallons, before bottling losses. Drives proof-gallon and losses computation.
Losses (gallons)
Auto-computed as volume_in_gallons − volume_out_gallons. Represents production losses (evaporation, sediment, line losses, sampling). Federally reportable; large losses may trigger TTB inquiry and require a deviation report.
ABV % (alcohol by volume)
The actual measured ABV of the finished liquid as a percentage. Pulled from the batch’s COA if one exists; otherwise entered manually here. Drives proof-gallon math.
Proof gallons
Auto-computed as volume_out_gallons × abv_pct / 50. The federal unit for excise tax and reporting. One proof gallon = one US gallon at 100 proof (50% ABV), so a 100-gallon batch at 40% ABV = 80 proof gallons. Aggregates into the monthly report’s total_proof_gallons_produced.
Batch status
See “Lifecycle” above. Status drives editability (Draft → editable, Submitted/Filed → read-only).
Notes
Free-text. Use this for the things that don’t fit a field: a deviation note about an unusually high loss percentage, a retest date if ABV was recalculated, a reference to an internal investigation.
Monthly TTB Report
The monthly report rolls up all Submitted and Filed TTB Batch Records for a single calendar month into the form the federal government actually wants to see. Stored at /compliance/ttb (one row per month).
Aggregated fields:
- Total proof gallons produced = sum of
proof_gallonsacross batches for that month - Total proof gallons on hand = inventory snapshot at month-end
- Total proof gallons removed = sum of proof gallons that left the bonded premises (taxable removals)
A monthly report has two statuses:
- Draft — being assembled. Adding/removing batches changes the totals.
- Filed — submitted to the TTB. Read-only. The constituent batch records are also frozen at this point.
Once filed, the batches it included are also marked Filed (their status flips automatically). This is the single source of truth: if a batch is Filed, the report containing it is also Filed, and neither can be edited.
Audit trail
Every change to a TTB record is recorded in audit_log with the user, timestamp, IP address, and field-level diff (old → new). This trail is INSERT-ONLY — vestl never updates or deletes audit rows. Available at Compliance → Audit Trail, filtered by table_name = ttb_batch_records.
The audit trail is what makes the system survive a TTB inspection: every value is traceable to a person and a time, and the historical state can be reconstructed for any prior date.
Why this matters
Federal alcohol compliance is strict liability — there’s no “I didn’t know” defense for missing or incorrect records. A producer can lose their permit (and therefore their entire ability to operate) for systematic failures here. The TTB form fields and computation rules in this doc are the same ones the federal forms ask for; doing the math correctly inside vestl, with a tamper-evident audit trail, is what keeps you out of trouble.
If you have a real TTB inquiry, work with your compliance counsel — vestl gives you the records, not the legal advice.