Audits → Spot Check
Purpose
Run a focused, random-sample physical count against a subset of containers — typically a single substance, a single schedule, or a statistical random sample — to catch discrepancies between biennial inventories. Spot checks are the operational smoke alarm for a controlled-substance program: a 2-day-old discrepancy is investigable; a 6-month-old one usually isn't.
This is general product information about CS Logbook, not legal advice. Spot checks are an operational best practice, not a CS Logbook-defined requirement. Verify any required count cadence with the DEA Diversion Control Division and your state veterinary/pharmacy board.
Regulatory basis: spot checks are not directly mandated by the DEA, but ongoing physical accountability supports the security and recordkeeping principles in the DEA security rules and Part 1304. Some state boards may require periodic random counts — confirm your state's rules directly.
When to use it
- Monthly cadence — pick a day; run a 5-10% random sample of active containers. Catches drift before it compounds.
- Substance-focused — when a specific substance has been disproportionately involved in waste/disposal events, spot-check that substance's containers.
- Schedule II focus — many clinics run a weekly Schedule II spot check separate from the broader monthly check, given the regulatory sensitivity.
- Post-incident — administered the wrong dose, witness wasn't co-signed, container looks tampered → spot-check the immediate area.
- Pre-state-board visit — when state inspector is expected, spot-check the substances they're most likely to ask about.
The spot check is not a replacement for the biennial (the DEA still requires its periodic full count — see the DEA inventory rule) — it's a complement. The relationship:
- Biennial = comprehensive snapshot, on the DEA's periodic cadence, signed by DEA registrant, regulator-facing
- Internal audit = process check, quarterly, owner-finalized, regulator + insurer-facing
- Spot check = random count, monthly (or more), staff-conducted, internal-facing
Walkthrough
The spot check is a multi-step wizard at /home/<your-clinic>/audits/spot-checks/new. The flow guides the staff member through scope selection, sampling, count entry, photo evidence, investigation (if discrepancies surface), and review.
Step 1 — Open spot checks
Navigate to /home/<your-clinic>/audits/spot-checks. The history page shows previous spot checks with date, scope, accuracy %, and status.

Click Start Spot Check in the top-right.
Step 2 — Select scope
The wizard's first step asks: what is being audited?
- Full inventory — all active containers (rare for spot checks; this is essentially a mini-biennial)
- Schedule II only — most-regulated; reasonable weekly cadence
- Specific substance — pick one substance from your formulary; counts every active container of that substance
- Random sample — statistical sampling (next step configures sample size)
- Specific containers — manual selection of containers to count
- Specific location — when your clinic has multiple physical storage locations (controlled-substance safe, surgery suite, mobile vehicle), this audits one location
Add scope notes explaining the rationale (e.g., "Monthly Sched II routine", "Post-incident audit after 2026-04-12 near-miss").
Step 3 — Configure random sampling (if applicable)
If you picked Random sample in the previous step, this step configures:
- Sample size — number of containers (typical: 10-20 for monthly check)
- Sampling method —
simple_random/stratified_by_schedule/stratified_by_substance - Confidence level — informational; surfaces in the audit summary for statistical interpretation
The wizard runs a deterministic random selection at this point (the seed is captured so the sample is reproducible if needed).
Step 4 — Select containers
For non-random scopes, this step lets you confirm the auto-selected containers (and remove any that shouldn't be counted, e.g., containers known to be in transit). For random samples, the selected containers are pre-populated.
Step 5 — Enter counts
For each container, enter:
- Counted quantity — physical count
- Count notes — observations
- Photo — optional; recommended when the container appears to have been tampered, damaged, or recounts disagree
The system balance is shown alongside; variance is computed inline.
Step 6 — Investigation modal (per-discrepancy)
For each container with a count outside tolerance (default ≥2% absolute variance), the wizard opens an investigation modal:
- Reason category —
measurement_error/missing_witness_signature/transaction_not_recorded/theft_suspected/other - Investigation notes — what was checked, what was found
- Action taken — recount / additional witness / police contact / no action
- Resolution —
resolved_no_action/corrective_action_created/theft_loss_filed/escalated_to_owner
If the resolution is corrective_action_created, a CAPA is auto-linked to this audit. If theft_loss_filed, the wizard prompts to file a Form 106.
Step 7 — Review & complete
The review step shows all counts + variances + investigations as a summary. Add audit-level summary notes. Click Complete Spot Check.
The audit is created in audits table with audit_type='spot_check', status completed, and the per-container counts in audit_items. The compliance score is (in_tolerance_count) / (total_count) * 100.
A screenshot of the spot-check review summary will be added here.
Step 8 — Finalize (owner-only)
Just like internal audits, completed spot checks can be finalized (owner-only) to lock the record. Navigate to /audits/spot-checks/<auditId> for the detail view; the Finalize Audit button is in the header. After finalization, the audit row and all linked corrective actions' immutable-linkage fields are locked at the DB layer.
Field reference
Scope selection
| Field | Description |
|---|---|
scope_type |
full_inventory / schedule_specific / substance_specific / random_sample / specific_containers / location_specific |
scope_filter |
JSON: which schedule (II/III/IV/V), substance UUID, container UUIDs, or location label |
scope_notes |
free-text rationale |
Random sampling configuration
| Field | Description |
|---|---|
sample_size |
integer; how many containers to count |
sampling_method |
simple_random / stratified_by_schedule / stratified_by_substance |
confidence_level |
informational; e.g., 90 / 95 / 99% |
Per-container count entry
| Field | Description |
|---|---|
counted_quantity |
physical count |
count_type |
exact / estimated (Schedule II requires exact) |
count_method |
physical_count / weighed / volume_measured |
count_notes |
observations |
photo_url |
optional photo evidence |
Investigation modal (per discrepancy)
| Field | Description |
|---|---|
reason_category |
measurement_error / missing_witness_signature / transaction_not_recorded / theft_suspected / other |
investigation_notes |
what was checked, what was found |
action_taken |
what response action was taken |
resolution |
how the discrepancy was resolved |
Resulting database rows
| Table | Columns set |
|---|---|
audits |
audit_type='spot_check', account_id, audit_date, performed_by, notes, status, compliance_score |
audit_items |
one row per counted container; counted_quantity, expected_quantity, discrepancy (generated), discrepancy_severity, count_type, count_method, count_notes, photo_url, requires_corrective_action |
corrective_actions |
one row per investigation that resolved as corrective_action_created |
theft_loss_incidents |
one row if any investigation resolved as theft_loss_filed (separate flow) |
Edge cases
Empty random sample
If your account has fewer active containers than the requested sample size, the wizard surfaces a soft warning and adjusts the sample size to all available containers. The audit proceeds; the sample_size recorded in the audit row matches what was actually counted.
Discrepancy on a Schedule II container
The investigation modal pre-flags Schedule II discrepancies as high-priority. The default resolution dropdown is escalated_to_owner rather than resolved_no_action for Sched II to discourage casual closure of variances on the most-regulated substances. The user can override; the override is logged.
Container in transit during count
If a container's status is in_transit (mid-transfer between locations), the spot-check wizard excludes it by default. You can manually include it via specific_containers scope, but the system balance comparison will show the in-transit balance, not a final balance.
Soft warning: spot check that should be a biennial
If a spot check's scope is full_inventory AND audit_date is within 30 days of the upcoming biennial deadline, CS Logbook surfaces a soft warning suggesting "Consider running this as a biennial inventory instead — same scope, satisfies the biennial inventory requirement." The user can dismiss; the warning is informational.
Audit submitted with zero containers counted
The wizard blocks completion if no containers have been counted. There's no useful audit with zero counted items; the user must either count or cancel.
Common mistakes
- Always running the same scope. If your monthly spot check is always "Schedule II only", a discrepancy in a Schedule III substance can hide for 2 years until the biennial. Rotate scopes month over month.
- Skipping the investigation modal on small variances. The investigation step is the value of the spot check — counts without investigation context are just numbers. Even a "0.5% variance, likely measurement" note is the audit trail you'll want later.
- Treating spot checks as optional. Many clinics drop spot checks during busy periods. The discrepancies that compound during those periods are the ones the biennial then surfaces, often with no investigable trail.
- Not using photos when the container looks unusual. Photos are timestamped, location-stamped (if your device supports), and are the strongest evidence of physical-state-at-time-of-count. Use them generously.
- Letting auto-created CAPAs sit unaddressed. The spot check creates the CAPA; the CAPA without resolution is still an open finding. Track to verified.
- Spot-checking only the substances you trust. The substances you trust are where you'll catch theft last. Spot-check randomly, not where you're confident.
Related
- Audits — overview — the audit lifecycle and the Finalize step common to spot checks and internal audits
- Biennial inventory — the DEA's periodic mandated full count
- Internal audit — the quarterly checklist-driven internal compliance review
- Inventory → Containers — the entities being counted
- Inventory → Transactions — the events between counts that move balances
- Sprint 18 spot check feature plan — internal architecture reference (random sampling, statistical confidence)