Reporting → Core Reports
Purpose
Day-to-day operational reports that surface the state of your inventory, the transaction history of any container, and the audit substrate (staff identification + audit-period reconciliation) you need before a biennial inventory or DEA inspection.
Regulatory basis: DEA record availability and retention, and transaction records. All five Core reports are built from the same records you keep in CS Logbook.
When to use them
- Pre-audit prep: run the Container Transaction Report for any container you'll be reconciling. Hand the printout to the auditor.
- Daily inventory verification: run the Unopened Container Log to compare on-shelf inventory to the system. Mismatches surface immediately.
- Quarterly count rehearsal: run the Opened Container Log with a date filter to see what's been used since the last rehearsal.
- Staff-handler attestation: run the Staff Identification Log when a new prescriber joins or annually as part of SOP.
- Period close-out: run the Audit-Period Reconciliation over the period you are closing to compare each container's expected balance with its current balance.
- Explaining a corrected entry: run the Correction History for the container to show what the entry originally said, what it was corrected to, who corrected it, when, and why.
Walkthrough: common pattern
All Core reports follow the same dialog flow:
- Open
/home/<your-clinic>/reports - Stay on the Core Reports tab (default)
- Click Generate Report on the report's card
- Pick a format (PDF or CSV)
- Fill any optional filters (date range, container, etc.)
- Click Generate Report
- The browser downloads the file
Specific reports add a step or two; those are noted below.

Choosing a date range
Dates are whole calendar days in your clinic's timezone (Settings → Clinic Settings), and both ends are included: a range ending June 30 includes everything recorded on June 30.
| You enter | The report covers | The report prints |
|---|---|---|
| Neither date | All records | Period: All records |
| A start date only | The start date through today | Period: 2026-03-01 to (today) |
| An end date only | Your earliest record through the end date | Period: through 2026-06-30 |
| Both dates | Exactly that range | Period: 2026-01-01 to 2026-03-31 |
A start date after the end date (or a start date in the future with no end date) is refused with a message saying which dates conflict, so you never get a report for a window you did not mean.
Three reports need a bounded window and require a start date; their end date still defaults to today: Audit-Period Reconciliation, Audit Reconstruction, and the Controlled Substance Log Export. The Inspection Packet is different: it always asks for both dates, because both appear on the packet an inspector receives.
This applies to every report on the Core, Compliance and Data Exports tabs.
Unopened Container Log
A snapshot of every container in your inventory that has not yet been opened, grouped by substance and schedule. The report is point-in-time: there is no date range; it reflects what's on the shelf right now.
Use when: comparing physical inventory to system inventory; sanity-checking a freshly received order.
Columns (PDF + CSV):
- Substance name + schedule
- Container number / lot number
- Quantity (initial)
- Unit (mL / mg / tab / count)
- Received date
- Supplier name (if recorded)
Filters: none. The report includes every unopened container.
Format: PDF (default) or CSV.
Opened Container Log
Every container in opened status, with the running balance and the most recent transaction. Useful when you need to know what's actively being drawn from on the floor.
Use when: rehearsing a count; reconciling against a paper logbook; investigating a discrepancy.
Columns (PDF + CSV):
- Substance name + schedule
- Container number
- Initial quantity / current balance / amount used
- Last transaction (date + type + quantity + performer)
- Correction status, on an entry shown at its corrected values (see Corrected entries)
Filters: none. The report includes every opened container.
Format: PDF (default) or CSV.
Staff Identification Log
Everyone on your Clinic Staff Log who handles controlled substances, with their initials, role, employment dates, and DEA license number (if a prescriber). The report is the canonical answer to "who handles controlled substances at this clinic" for an inspector.
Use when: orienting a new auditor; performing an annual staff attestation; preparing a staff list for a state pharmacy permit renewal.
Columns (PDF + CSV):
- Display name
- Access role (owner / admin / manager / staff / viewer)
- Clinic position (e.g., prescribing veterinarian, technician, practice manager)
- DEA license number + expiration date (if applicable)
- Initials (for transaction signing)
- Employment Start / Employment End: first and last day at the clinic, so a reader knows the window in which this person's initials were valid on a controlled-substance record. A blank end date prints as a long dash character (Unicode U+2014) rather than an empty cell, meaning "still employed / no end recorded."
- Active / pending / suspended status
Filters: none. The report lists every member of the Clinic Staff Log, including roster-only staff who never log in to the app: historical staff, staff hired but not yet invited, and vets who perform but don't enter data. (Previously it listed only app members, so login-less staff were silently omitted.) Each row carries a Staff ID.
Format: PDF (default) or CSV.
Container Transaction Report
The full transaction history of a single container, with running balances, from intake through disposal. This is the artifact most often requested in a DEA inspection.
Use when: an inspector asks "show me the records for container X"; investigating a discrepancy on a specific lot; preparing closure documentation when a container is fully dispensed.
Filters: container (optional), substance, schedule and date range. Pick the container from the list by typing its number, lot or substance. Depleted and disposed containers are included, so a closed container's history can still be reported.
Columns (PDF + CSV):
- Header: container metadata (lot, substance, supplier, expiration)
- Per-row: date/time, transaction type, performer, witness (if applicable), prescriber + patient + client (for dispensed/administered), quantity, balance before and after, notes, correction status
Each event appears once, at its current values. See Corrected entries.
Format: PDF (default) or CSV.
Correction History
Every correction made to one container's records, on the Transaction Reports page next to the Container Transaction Report.
Use when: an inspector or auditor asks what a corrected entry originally said; reviewing who corrected an entry and why; checking whether an entry was voided.
Required filter: a container, picked from the list by number, lot or substance. Optionally, a transaction ID narrows the report to that one entry's corrections (copy it from the transaction's detail page). The ID can be the original entry, its reversal, or its corrected replacement.
Rows (PDF + CSV), each marked by kind:
- Correction: the original quantity and date, the corrected quantity and date, the reversal that offset the original, the reason, who corrected it, and when
- Void: the same, with no replacement entry
- Reversal: a reversal recorded without a correction record (from an older correction method)
- Field amendment: a later change to a field on an entry, such as a witness attached after the fact, with its reason
- Data repair: a repair logged against the container or one of its entries, with its reason
Balance restatements that a correction triggers on later entries are calculated by the system rather than entered by a person, so they are counted in the summary but not listed.
Format: PDF (default) or CSV.
Corrected entries
Recorded entries are never edited or deleted. Correcting one keeps the original and adds two entries: a reversal that offsets the original, and a replacement at the corrected values. Voiding an entry adds only the reversal.
A reversal is bookkeeping, not something the clinic did, so the transaction reports do not list it. On the Container Transaction Report, the Opened Container Log, and the Controlled Substance Log:
- The original entry and its reversal are left out together, so the two cancel and every balance still adds up.
- The replacement appears in their place, marked Corrected* with the date of the correction. A footnote on the PDF points to the Correction History.
- Running balances are calculated from the entries shown, so each row's balance before matches the previous row's balance after, and the last balance matches the container's current balance.
- A voided entry does not appear at all. The summary on the PDF counts corrected and voided entries.
The original entry, the reversal, and who made each correction and why are in the Correction History. The full data export keeps every row, with columns that mark the struck original, the reversal and the replacement.
Audit-Period Reconciliation
For each container with activity in the period: the balance at the start of the period, the total recorded in the period, the balance those records imply, and the container's balance when the report is generated. The difference between the last two is shown as a signed number.
Use when: closing out a period; checking that the records explain each container's balance.
Filters: date range. A start date is required; the end date defaults to today. See Choosing a date range.
Columns (PDF + CSV):
- Container, substance and schedule
- Starting balance, transactions total, expected balance, actual balance (as of generation)
- Discrepancy (signed). The CSV also lists the transaction count and the last biennial count before the period.
The report states each difference as a number. It does not grade a difference as acceptable or not: federal rules set no percentage tolerance, so that judgment stays with the clinic.
Format: PDF (default) or CSV.
Edge cases
Empty data
If the underlying tables have no rows the report still generates: the file will simply have a header row and no data rows. CS Logbook does not block report generation on empty input.
Multi-page reports
For clinics with hundreds of containers, the PDF will span multiple pages. There is no row limit; the generator paginates as needed. CSVs are unbounded.
Containers in transit / pending receive
The Unopened Container Log includes containers in unopened status. Containers in pending_receive (intake recorded but waiting for invoice match-up) are excluded by design, because they're not formally part of inventory yet.
Soft-deleted containers / transactions
Soft-deleted records (deleted_at IS NOT NULL) are excluded from every Core report. To audit the deletion history, generate the Correction Audit Trail report from the Compliance tab.
Common mistakes
- Confusing Container Transaction Report with Audit-Period Reconciliation. The first is per-container; the second is per-clinic-period. They use overlapping data but answer different questions.
- Looking for a corrected entry's original values on the Container Transaction Report. That report shows current values only; the Correction History has the originals.
- Looking for a closed container in the picker's first page. The list shows the most recent containers first; type the container's number or lot to find an older or disposed one.
Related
- Recordkeeping Reports: the inspection packet and reports such as Substance Summary, License Summary, Biennial Inventory PDF, DEA Form 106, DEA Form 41)
- Data Exports: export your own records in standard formats
- Audits → Biennial inventory: the workflow that produces the inventory snapshots used by Audit-Period Reconciliation
- Inventory → Transactions: the workflow that produces the transaction history surfaced by Container Transaction Report
- Glossary § Container statuses