This is a ready-to-use worksheet for the arithmetic that proves a recall worked: accounting for every unit of an affected lot, from what was manufactured to what came back, was destroyed, was already used, or remains unaccounted for. It is the single most-cited weak point in recall execution, firms run the recall but cannot show where the units went, so this worksheet forces the ledger to close, or forces a documented explanation where it does not. Replace every <<FILL: ...>> placeholder with your own specifics. A fully worked specimen follows. This document is educational and general; confirm your own reconciliation tolerance and disposition rules with QA before relying on any figure here.
Use this worksheet with the recall and field action plan and, for a mock exercise rather than a real action, with the mock recall exercise protocol.
Document control header
| Field | Entry |
|---|---|
| Worksheet title | Recall Reconciliation Ledger |
| Worksheet number | <<FILL: FORM-ID, e.g. FRM-QA-041>> |
| Version | <<FILL: version, e.g. 1.0>> |
| Governing plan/SOP | <<FILL: recall plan/SOP-ID>> |
| Recall reference | <<FILL: recall reference number>> |
| Completed by, date | <<FILL>> |
Instructions
- Complete one row of Part B for every lot within the recall’s scope. A recall covering a single lot has one row; a recall covering a campaign or all lots within expiry has one row per lot, rolled up in Part E.
- The identity that must close for each lot is: Distributed = Returned + Destroyed-in-place + Used/Dispensed + Unaccounted. Every category is supported by a record, a shipping log, a consignee response form, or a destruction certificate; a number with no supporting record is not a completed row.
- Where the recall depth reaches individual consignees (retail or consumer/user level), complete Part C, the consignee-level breakdown, for at least the lot or lots where the aggregate ledger in Part B does not close cleanly, or for every lot if your recall strategy calls for full consignee-level reconciliation.
- Complete Part D, the residual-explanation table, for every unaccounted quantity greater than zero. “Unaccounted” without an entry in Part D is exactly the gap an inspector asks about first.
- Complete Part E only where the recall covers more than one lot, to show the combined position across the whole action.
- Do not force the ledger to close by padding a category with a guess. A residual that does not close within tolerance is reported as open and investigated, not rounded away.
Part A: Recall and product identification
| Field | Entry |
|---|---|
| Recall reference | <<FILL>> |
| Product, strength, presentation | <<FILL>> |
| Recall class | <<FILL: I / II / III>> |
| Recall depth | <<FILL: consumer/user, retail, or wholesale>> |
| Reconciliation tolerance in force | <<FILL: e.g. residual within 2 percent of distributed quantity, or explained regardless of percentage>> |
Part B: Per-lot reconciliation ledger
Complete one row per lot. The “Check” column is Returned + Destroyed-in-place + Used/Dispensed + Unaccounted; it must equal the Distributed figure in the same row.
| Lot | Manufactured | Distributed | Returned | Destroyed in place | Used/dispensed | Unaccounted | Check (sum) | Percent accounted | Within tolerance |
|---|---|---|---|---|---|---|---|---|---|
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | Yes / No |
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | Yes / No |
Percent accounted formula: (Returned + Destroyed-in-place + Used/Dispensed) / Distributed x 100. Unaccounted is the residual, Distributed minus the sum of the other three categories, and is never itself counted as “accounted for.”
Part C: Consignee-level breakdown (for lots reaching retail or consumer/user depth)
Complete one row per direct consignee for the lot(s) named. This is the ledger a consignee-level effectiveness check draws on and the record that lets you answer, for a specific account, exactly what happened to the units they received.
| Lot | Consignee | Quantity shipped to consignee | Quantity returned by consignee | Quantity destroyed by consignee (certificate ref) | Quantity dispensed/used (per response form) | Quantity unaccounted | Response form received | Notes |
|---|---|---|---|---|---|---|---|---|
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | Yes / No | <<FILL>> |
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | Yes / No | <<FILL>> |
The sum of “Quantity shipped to consignee” across all rows for a given lot should equal the “Distributed” figure for that lot in Part B; if it does not, the gap is a data reconciliation problem in its own right and is resolved before the lot’s Part B row is treated as final.
Part D: Residual (unaccounted) explanation
Complete one row for every unaccounted quantity greater than zero in Part B or Part C. A residual is not itself a failure; an unexplained residual is.
| Lot | Consignee (if applicable) | Unaccounted quantity | Explanation category | Specific basis / evidence | Risk assessment |
|---|---|---|---|---|---|
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL: administered/dispensed before notice arrived / normal patient consumption of dispensed product / lost at a closed account / in transit at cutoff / other>> | <<FILL: the specific record, response, or reasoning supporting this category, not a guess>> | <<FILL: whether the residual quantity, if actually still in circulation, changes the health hazard conclusion>> |
<<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> | <<FILL>> |
“Explanation category” is not itself the explanation. “Administered before notice arrived” only counts as an explanation when it is tied to a specific basis, a response form stating so, a dispensing record with a date before the notification date, or an equivalent record, not simply the category label copied into every row.
Part E: Multi-lot roll-up (where the recall covers more than one lot)
| Field | Entry |
|---|---|
| Total lots in scope | <<FILL>> |
| Total manufactured, all lots | <<FILL>> |
| Total distributed, all lots | <<FILL>> |
| Total returned, all lots | <<FILL>> |
| Total destroyed in place, all lots | <<FILL>> |
| Total used/dispensed, all lots | <<FILL>> |
| Total unaccounted, all lots | <<FILL>> |
| Combined percent accounted | <<FILL>> |
| Lots with a residual outside tolerance | <<FILL: list lot numbers, or "none">> |
Part F: Conclusion and sign-off
| Field | Entry |
|---|---|
| Every lot’s ledger closes (Part B “Check” equals “Distributed”) | Yes / No |
| Every residual greater than zero has a Part D entry | Yes / No |
| Every residual outside tolerance carries a documented risk assessment | Yes / No |
| Consignee-level breakdown complete where required by depth | Yes / No / N/A |
| Overall reconciliation conclusion | <<FILL: closes within tolerance / open items remain, listed below>> |
| Open items carried to recall closure | <<FILL: list, or "none">> |
| Completed by (name, signature, date) | <<FILL>> |
| Reviewed by QA (name, signature, date) | <<FILL>> |
Acceptance criteria
This worksheet is complete and defensible when all of the following are true:
- Every lot in the recall’s scope has a completed row in Part B, and the Check column equals the Distributed figure for every row, or the gap is carried into Part D as an explained or investigated residual.
- Every category (returned, destroyed in place, used/dispensed) is supported by a real record, a shipping log entry, a signed response form, or a destruction certificate, referenced by number, not asserted from memory.
- Every unaccounted quantity greater than zero has a Part D entry with a specific basis, not a category label alone.
- Where the recall reaches retail or consumer/user depth, the consignee-level breakdown in Part C reconciles to the lot-level totals in Part B.
- Any residual outside the stated tolerance carries a documented risk assessment addressing whether it changes the health hazard conclusion, and is reported in the recall closure package rather than quietly closed out.
References
21 CFR Part 7 (FDA recall policy and procedures, including recall strategy and effectiveness-check elements this ledger supports). 21 CFR 211.150 through 211.208 (distribution procedures and records that this worksheet’s source data draws on). DSCSA (21 U.S.C. 360eee et seq.), for verification and traceability data supporting consignee-level tracing where product is package-level serialized. See DSCSA and serialization. ICH Q9(R1), Quality Risk Management, for the risk assessment applied to an unexplained or out-of-tolerance residual.
Confirm the current version and clause numbers of each reference before issue.
Filled specimen
The following expands the reconciliation example for a sterile injectable recall into a fully worked ledger. The company, product, and numbers are illustrative; replace them with your own. This specimen matches the reconciliation example used in the companion article for lots AB1234, AB1235, and AB1240.
Part A:
| Field | Entry |
|---|---|
| Recall reference | REC-2026-004 |
| Product | Fictional Bio sterile injectable, 50 mg/mL |
| Recall class | Class I |
| Recall depth | Consumer/user (hospital pharmacy and clinic level) |
| Reconciliation tolerance in force | Residual within 3 percent of distributed quantity, explained regardless of percentage |
Part B, per-lot ledger:
| Lot | Manufactured | Distributed | Returned | Destroyed in place | Used/dispensed | Unaccounted | Check (sum) | Percent accounted | Within tolerance |
|---|---|---|---|---|---|---|---|---|---|
| AB1234 | 10,000 | 9,200 | 6,100 | 1,500 | 1,400 | 200 | 9,200 | 97.8% | Yes |
| AB1235 | 12,000 | 11,800 | 9,000 | 1,200 | 1,500 | 100 | 11,800 | 99.2% | Yes |
| AB1240 | 8,000 | 0 (stock recovery, never distributed) | n/a | 0 | 0 | 0 | 0 | 100% | Yes |
Part C, consignee-level breakdown for lot AB1234 (9,200 units distributed to 4 direct consignees):
| Lot | Consignee | Qty shipped | Qty returned | Qty destroyed (cert ref) | Qty dispensed/used | Qty unaccounted | Response form | Notes |
|---|---|---|---|---|---|---|---|---|
| AB1234 | Regional Hospital Network A | 4,000 | 2,900 | 600 (DC-2026-0410) | 470 | 30 | Yes | 30 units in a satellite pharmacy inventory count not yet reconciled at closure |
| AB1234 | Regional Hospital Network B | 2,800 | 1,900 | 500 (DC-2026-0411) | 380 | 20 | Yes | Explained as dispensed prior to notification per pharmacy log |
| AB1234 | Wholesaler C (sub-recall to 6 accounts) | 1,600 | 1,000 | 300 (DC-2026-0412) | 250 | 50 | Yes | One of 6 sub-accounts (30 units) never responded despite 3 contact attempts |
| AB1234 | Clinic Group D | 800 | 300 | 100 (DC-2026-0413) | 300 | 100 | No | Non-responder; escalated to registered notice, see effectiveness check log |
| Total | 9,200 | 6,100 | 1,500 | 1,400 | 200 | Matches Part B row for AB1234 |
Part D, residual explanation:
| Lot | Consignee | Unaccounted qty | Explanation category | Specific basis / evidence | Risk assessment |
|---|---|---|---|---|---|
| AB1234 | Regional Hospital Network A | 30 | In transit / count timing | Satellite pharmacy physical count scheduled after closure date; hospital confirmed units are within its controlled pharmacy system, not in patient hands, count to be finalized within 5 business days | Low risk: product remains in a controlled pharmacy environment, not administered; tracked to final count before recall file closes |
| AB1234 | Wholesaler C, sub-account | 30 | Non-responder | Sub-account did not respond to 3 contact attempts (calls 14, 17, 21 July); wholesaler’s own delivery record confirms shipment but not receipt confirmation | Medium risk: unconfirmed location of a Class I product; escalated to wholesaler for site visit, tracked as an open item in Part F |
| AB1234 | Clinic Group D | 100 | Non-responder | Clinic did not respond to letter, phone, or a certified-mail follow-up; clinic’s status (open/closed) unconfirmed as of ledger completion | Medium-high risk: unconfirmed for a Class I sterile injectable; escalated per the effectiveness-check non-responder procedure, held open pending resolution before recall termination is requested |
| AB1235 | (aggregate, not consignee-level required at this depth) | 100 | Normal patient consumption | Consistent with expected utilization rate for lot age at time of recall; no specific record required at wholesale-plus-retail depth per approved recall strategy | Low risk: consistent with routine dispensing pattern, no signal of a systemic tracing gap |
Part E: Not applicable in this specimen at the aggregate level shown, since only three lots are in scope and each is shown individually in Part B; a multi-campaign recall spanning many more lots would roll these into Part E totals the same way.
Part F, conclusion and sign-off:
| Field | Entry |
|---|---|
| Every lot’s ledger closes | Yes, all three lots’ Check column equals Distributed |
| Every residual has a Part D entry | Yes |
| Every residual outside tolerance carries a risk assessment | Yes (two medium-risk non-responder items carry a documented assessment) |
| Consignee-level breakdown complete where required | Yes, for lot AB1234 at consumer/user depth; lot AB1235 handled at aggregate level per approved strategy |
| Overall reconciliation conclusion | Closes within tolerance for all three lots (97.8%, 99.2%, 100%); two open non-responder items (Wholesaler C sub-account, Clinic Group D) carried forward |
| Open items carried to recall closure | Wholesaler C sub-account site visit pending; Clinic Group D status confirmation pending. Both tracked on the recall tracking log and referenced in the termination request as open until resolved. |
| Completed by | M. Duarte, Recall Coordinator, 24 July 2026 |
| Reviewed by QA | K. Ofori, QA Manager, 25 July 2026 |
The value of this specimen is in the two open non-responder rows, not the clean percentages. A 97.8 percent accounted figure reads as strong, but the worksheet still shows exactly two named accounts with an unresolved status, each with a specific escalation already underway, which is what lets the recall termination request in the companion package state a defensible position instead of a vague “recall complete.”
Common inspection findings this worksheet prevents
- A reconciliation summarized as a single percentage with no lot-level or consignee-level detail behind it, so the residual cannot be traced to a specific account or explained.
- An unaccounted quantity recorded with no entry explaining it, or explained only with a category label and no supporting record.
- The consignee-level total does not sum to the lot-level distributed figure, revealing a data gap between the distribution records and the recall tracking log that was never caught.
- Non-responding consignees dropped from the ledger instead of carried forward as an open, risk-assessed item.
- A residual rounded away or omitted because it is small, rather than assessed for whether it changes the health hazard conclusion regardless of size.
- The reconciliation ledger completed after the recall was already reported as terminated, rather than being the evidence the termination request was built on.
How to adapt this worksheet
- Set your worksheet number, governing plan, and recall reference in the header to match your recall file.
- Set your own reconciliation tolerance in Part A; confirm it with QA and state the basis (a validated allowance for known routine handling loss, or zero tolerance with mandatory explanation for any residual).
- Add a row to Part B for every lot in scope; for a large multi-lot campaign, keep Part B as the master table and use Part E for the roll-up your closure package actually reports.
- Scale Part C to your recall depth: skip it for a wholesale-only recall where consignee-level tracing is not part of your approved strategy, and state that decision rather than leaving it silently blank.
- Keep Part D current as effectiveness-check non-responders are resolved; an item open at first completion should be updated, not re-created, when it closes.
- Confirm every regulation in the References section against the current published version before issue.