Audits → Biennial Inventory
Purpose
Conduct the DEA's biennial inventory — a complete physical count of every active controlled-substance container in your clinic. The biennial is the regulator-facing inventory record. CS Logbook gives you the workflow to perform, attest to, and retain it; the DEA sets the cadence and the required content.
This is general product information about CS Logbook, not legal advice. CS Logbook does not define inventory frequency, content, or retention rules, and they can vary by state. Verify current requirements with the DEA Diversion Control Division and your state veterinary/pharmacy board.
Where the requirement lives: the DEA's inventory rule — the cadence and the required content — is set out in the DEA inventory rule, and record retention in the DEA record-retention rule. Treat those sources, not this guide, as authoritative for what is required and how often.
On signatures: the DEA inventory rule does not require a signature on the inventory record. What it does require is the substance name, dosage form and strength, quantity, the inventory date, and whether the count was taken at opening or close of business. Signing and dating an inventory is sound practice — the DEA's Pharmacist's Manual recommends it — but it is guidance, not a rule in the DEA inventory requirement. CS Logbook therefore records who completed the inventory and when, automatically, and leaves the printed name optional.
When to use it
- On the DEA's biennial cycle — the DEA sets the interval; the exact date is up to the registrant, so pick one and stick with it (e.g., always the first business Monday in October). Confirm the current interval in the DEA inventory rule.
- After a new DEA registration — the DEA's rules govern when your first inventory is due; confirm timing with the DEA.
- Change of business location — relocating may trigger a new inventory; check with your DEA Diversion field office.
- Change of registrant — when the DEA-registered veterinarian changes, plan the new registrant's first inventory promptly and confirm timing with the DEA.
The biennial is in addition to your routine spot checks and internal audits — it doesn't replace them, and they don't replace it. The biennial is the regulator-facing record; everything else is internal.
Walkthrough
The biennial inventory is a 4-step dialog wizard. Block off 2-3 hours depending on the size of your formulary; have the DEA-registered veterinarian on-site for Step 3 (the signature step).
Step 1 — Open the audits page and start the wizard
Navigate to /home/<your-clinic>/audits/biennial.
The page shows your clinic's biennial inventory history (most recent first), with each row showing the inventory date, status (in_progress / completed / cancelled), the DEA veterinarian who signed, and accuracy percentage.

Click Start Biennial Inventory in the top-right. This opens the full-page inventory wizard at Step 1. If you already have an inventory in progress, this takes you straight back into it (see Resuming an in-progress inventory below) — there is only ever one open count per clinic at a time.

Step 2 — Add inventory notes (optional, but useful)
Step 1 collects optional notes — a free-text field for any context you want preserved with this inventory record. Typical entries:
- "Annual physical count + biennial combined; counted by Dr. Smith and tech Lopez"
- "Post-Hurricane Lisa relocation; this is the first inventory at the new River Rd location"
- "Counted with state board observer present (Lisa Tran, IL Dept Financial & Professional Reg)"
Click Start Inventory. The wizard advances to Step 2 and loads every container in unopened or opened status from your account into a count list.
Step 3 — Record physical counts container-by-container
For each container, enter:
- Physical Count — the count you just measured. Decimal precision matches the substance's unit (3 decimal places for
mLandgrams; integer fortablets,capsules,patches). - Notes (optional) — anything noteworthy about this specific container's count (e.g., "container appeared tampered — see incident report 2026-04-12", or "pharmacist double-counted; agreed at 47.5 mL").
The wizard shows the System Balance (what CS Logbook believes the balance should be, based on cumulative receive + administer + dispense + waste + adjustment transactions) alongside the input field, so you have an immediate visual cue if your physical count diverges.

Click Save Count for each container. The wizard tracks progress at the top (X / Y containers counted); you cannot advance to Step 3 until every container is counted.
Each Save Count is written to the database immediately, so it's safe to leave and come back — a browser refresh, a closed tab, or a slept laptop won't lose the counts you've already saved. See Resuming an in-progress inventory for how to pick up where you left off.
Step 4 — Review discrepancies and sign
When all containers are counted, click Review Inventory. Step 3 displays each container's system balance vs. physical count vs. discrepancy in a side-by-side review:
- Within tolerance (≤2% absolute difference): row renders normal-styled
- Exceeds tolerance (>2% absolute difference): row renders red-bordered with a clear flag

Take a moment with this view. Every flagged discrepancy is something the DEA, a state inspector, or your clinic policy will want answered — usually with a corrective action plan. Common patterns:
- Schedule II discrepancies of any size are unusual and should be investigated immediately. The DEA's Diversion office will ask about Schedule II variances of any magnitude.
- Schedule III–V variances under 2% are common (counting error, container drift). Note them in CAPA but they don't usually rise to a Form 106.
- Schedule III–V variances over 5% warrant investigation — pull transaction logs, check the witness on the most recent waste, look for unusual patterns.
The attestation at the bottom of Step 3 is how CS Logbook records who stands behind the count. Completing the inventory is the attestation — the text sits directly above the button:
"By completing this inventory you attest that you performed or supervised this count and that the record is accurate and complete."
You do not have to type anything to sign. When you complete the inventory, CS Logbook records your identity and the exact date and time against the record automatically, from your signed-in session. That is the attestation of record, and it is what appears on the printed inventory.
The Printed name field is optional. It is prefilled with your name and appears on the printed artifact if you leave it filled in. Clearing it does not block anything and does not make the record incomplete — your identity and the timestamp are captured either way.
Once completed, the attestation is committed to the audit record and cannot be edited.
Click Complete Inventory. The wizard advances to Step 4 (success screen), the dialog closes, and the inventory appears in the history table with status completed.

Step 5 — Generate and file the report
After completion, navigate to the inventory detail page (click the row in the history table) to generate the DEA Biennial Inventory Report (PDF). The report includes:
- Account / DEA registration metadata
- Every container listed with substance name, NDC, schedule, container number, system balance, physical count, discrepancy, count notes
- The digital signature line with the signer's name and a timestamp
- A summary table grouped by schedule
Print or save the PDF and retain it per the DEA's record-retention rule (the DEA record-retention rule), which also addresses how readily records must be retrievable. Confirm the current retention period and retrieval expectations with the DEA and your state board — states may require longer. In practice, a DEA inspector will ask to see your most recent biennial during a site visit.
Step 6 — Address discrepancies via CAPA
For each flagged discrepancy, navigate to the Corrective Action Plans (CAPA) section of the audit detail view and open a corrective action. Typical CAPA fields:
- Title — "Investigate 5.2% variance in Hydromorphone CTR-2026-HYD-003"
- Severity —
low/medium/high/critical(≥5% Schedule II →critical) - Assigned to — the staff member responsible for investigating
- Due date — typically within 7 days for high/critical, 30 for low/medium
- Description — what specifically needs to be checked (transaction logs, witness signatures, video footage, chain of custody)
Once the CAPA is verified resolved, mark it verified (not just completed) so the audit trail shows the resolution was reviewed.
Field reference
Wizard inputs
| Step | Field | Label | Type | Required | Validation / Notes |
|---|---|---|---|---|---|
| 1 | notes |
Notes | textarea | optional | unbounded; consider including who participated, conditions, observers |
| 2 | countedQuantity |
Physical Count | number | ✓ | per-container; min 0; decimal precision matches substance unit |
| 2 | countType |
(internal) | select | auto | exact for Schedule II; exact or estimated for III-V (currently auto-set to exact) |
| 2 | countMethod |
(internal) | text | auto | "physical count" by default; future versions may surface this for hand-tally vs. scale |
| 2 | countNotes |
Notes (per container) | textarea | optional | per-container observations |
| 3 | digitalSignature |
Printed name (optional) | text | optional | prefilled with your name; appears on the printed inventory. Blank is fine — your identity and timestamp are recorded automatically |
Resulting database rows
| Table | Columns set | When |
|---|---|---|
biennial_inventories |
account_id, conducted_by_clinic_staff_id, entered_by, status='in_progress', inventory_date, time_of_inventory, notes, created_by |
Step 1 submit |
biennial_inventory_items |
inventory_id, container_id, counted_quantity, count_type, count_method, expected_quantity (system balance snapshot), substance_name, substance_schedule, container_number, counted_by_clinic_staff_id, entered_by |
Step 2 each container save |
biennial_inventories |
status='completed', completed_at, signed_by, signed_by_clinic_staff_id, signed_at (the attestation of record — all set server-side from your session), digital_signature (optional printed name, or NULL) |
Step 3 final submit |
Edge cases
No active containers
If your account has zero containers in unopened or opened status (a brand-new clinic, or an end-of-life clinic with everything disposed), the wizard's Step 2 displays an empty state. You can still advance to Step 3 and submit — the resulting biennial record has zero items and serves as a "we have no controlled substances on premises" attestation. Useful for a clinic that has surrendered DEA registration but maintains records for the DEA retention period.
A container is disposed mid-inventory
If a container's status changes to disposed between when you opened the wizard and when you submit Step 3, the wizard's Step 2 list is a snapshot taken at Step 1 submit time — the now-disposed container will still appear and its physical count is captured. The system balance you compare against, however, is recalculated at item-save time, so you may see a slight skew. This is rare; the more common case is starting the wizard at a moment of operational stillness.
Soft warning: container balance drift
If your spot checks are catching small variances (under 2%) consistently between biennials, the biennial review will surface the cumulative drift. This is a signal — not a violation. Use the CAPA system to investigate the source (likely a measurement-precision issue, a witness-signoff lag, or an undocumented administer event).
No block: the printed name is optional
There is no hard block on the attestation. You can complete a biennial inventory with the Printed name field empty, and the record is complete — your identity and the exact time are recorded automatically from your session.
Earlier versions of CS Logbook refused to submit without a typed signature and told you "there is no override," citing a DEA rule. That was wrong: the DEA inventory rule does not require a signature on the inventory record. The block was removed and the attestation is now captured for you. See ADR-029.
Who may attest
CS Logbook records the identity of whoever completes the inventory. It does not check that person against your clinic's DEA registrant of record — who may take or attest to an inventory is governed by the DEA's rules and your own delegation practices, which the system can't know. Verify them directly with the DEA Diversion Control Division.
Resuming an in-progress inventory
Counts are saved as you enter them, one row per container, so an interrupted count is never lost. To pick it back up:
- From the biennial history list, the in-progress inventory shows an In progress status with a Resume button. Click it to reopen the count exactly where you left off — every container you already counted is shown as counted, and you only need to finish the rest.
- Clicking Start Biennial Inventory again while a count is open also takes you straight back into it. There is only ever one open count per clinic at a time, so you can't accidentally start a second one and split your counts.
Cancelling or deleting an in-progress inventory
If a count was started by mistake or needs to be abandoned:
- On the in-progress count, click Cancel Inventory. This discards the count (its status becomes Cancelled) and returns you to the list. Cancelling only applies to an unfinished count — a completed inventory is a signed record and can never be cancelled.
- A cancelled inventory still appears in the history (filter by Cancelled to find them). If your clinic doesn't want to keep a record of the cancellation, click Delete on the cancelled row to remove it from the list.
You never need to contact support to clear an abandoned inventory — cancel it, then delete it if you wish.
Common mistakes
- Counting from the system balance rather than the physical container. This defeats the entire purpose. The biennial is a check on the system; if you count from the system, you've validated nothing.
- Skipping containers that "look empty". Even a container reading 0.0 should be physically counted (and disposed if appropriate). Empty containers count toward the inventory-of-record.
- Letting the inventory be attested by an unauthorized staff member. CS Logbook records whoever completes it, but it can't judge whether that person was authorized to. Who may take or attest to an inventory is governed by the DEA and your own delegation practices — verify them directly. If you delegate, document the delegation and store it with the biennial record.
- Not addressing flagged discrepancies before finalizing. The biennial captures what you found; the CAPA system tracks what you did about it. Both are part of the DEA record. Don't finalize an audit with un-CAPA'd Schedule II variances.
- Treating the biennial as the only record-keeping. The biennial is a snapshot. Daily transaction logs, monthly spot checks, and quarterly internal audits are the continuous record. Each plays a different role.
- Storing the only copy of the report on the cloud. Print a paper copy. Store it in the clinic safe. DEA expects records to be readily retrievable; a cloud outage during an inspection is not the day to discover this.
Related
- Audits — overview — the full audit lifecycle and permission model
- Internal audit — the quarterly checklist you should run between biennials
- Spot check — the monthly random-sample check that catches drift early
- Inventory → Containers — what a container is and what its lifecycle states mean
- Inventory → Transactions — every event that moves a container balance, the system you're cross-checking
- Glossary § DEA Schedule classifications
- Compliance — license tracking (coming next phase) — the DEA-registered veterinarian whose signature is required