Odoo consultants for regulated manufacturers · code you keep

Life sciences · Odoo guide

How do 503A and 503B compounding pharmacies manage master formulation records (MFR) and beyond-use dates (BUD) in Odoo?

503A and 503B compounding pharmacies model each Master Formulation Record (MFR) as a versioned mrp.bom with USP <795>/<797>/<800> controls, tie every batch to stock.lot with potency-tested ingredients in quarantine, auto-calculate Beyond-Use Date (BUD) from compounding date and storage class, and capture 21 CFR Part 11 electronic signatures on release. A mock recall should trace any finished lot to suppliers and patients in under 30 seconds from Odoo traceability.

By Chase Robbins, Operator & Founder at The ERP Firm · Last updated October 26, 2026

Steps

  1. Map 503A patient-specific vs 503B outsourcing batch sizes to mrp.bom revisions with effective dates and pharmacist approval states.
  2. Store MFR components with assay-adjusted quantities on BOM lines; link raw stock.lot CoA attachments before release from quarantine locations.
  3. Configure USP <795> non-sterile, <797> sterile, and <800> hazardous handling via product categories, locations, and quality.point checks on weigh-and-dispense work orders.
  4. On mrp.production completion, compute BUD on finished stock.lot from product rules (room temp, refrigerated, frozen) and block delivery until QA release.
  5. Enable mail.thread tracking on BOM, MO, and quality.check; restrict write access with res.groups aligned to 21 CFR Part 210/211 responsibilities.
  6. Deploy electronic signature on batch release (quality.check or custom batch record) with user re-auth per 21 CFR Part 11.
  7. Run quarterly mock recall: stock.traceability.report from finished lot to ingredient lots and outbound deliveries; target under 30 seconds to export affected partners.

Common mistakes

  • Using a single BOM without revision control when potency or supplier changes.
  • Shipping finished lots before quality.check passes and pharmacist sign-off.
  • Shared warehouse logins on dispensing tablets breaking Part 11 attribution.
  • Manual BUD spreadsheets that disagree with stock.lot expiration_date in Odoo.
  • Skipping potency adjustment on active ingredient move lines when assay is 95%.

Odoo version notes

Compounding on Odoo 16–18 typically uses Enterprise MRP, Quality, Expiry, and custom batch-record models; Community needs OCA or validated extensions. USP <800> often requires location segregation and PPE checkpoints modeled as quality points. The ERP Firm implements 503A/503B traceability with Git-owned modules and staging validation—anonymous case studies available under NDA.

Compare your options

ControlSpreadsheet + paperOdoo + Quality/MRP
MFR revisionEmail PDF versionsVersioned mrp.bom with effective dates
BUDManual calculatorAutomated on stock.lot at MO completion
Mock recallHours of pivot tablesTraceability report in <30 sec drill
Part 11 signaturesWet ink scanElectronic sign on release with audit trail

FAQ

Follow-up questions

Does Odoo distinguish 503A and 503B in one database?
Use product categories, routes, and approval groups so 503B bulk batches cannot post to 503A patient-specific workflows without authorization.
Where does BUD live?
On stock.lot expiration_date/removal_date computed from compounding datetime and USP storage class rules on product.template.
How do we prove Part 11 controls?
Document configuration, access reviews, and immutable exports of mail.tracking and signed quality.check records—validation is customer-owned with vendor support.

Book a scoping call for your Odoo environment.

Bring your version, user count, and the workflow that is blocked today.

Book a scoping call