Skip to main content

Go live as a 3PL

3PL add-on For: Administrator, Compliance manager Checked on 18.0.0.2.0, 18.0.1.0.0

Work through this page once, in order, when you start holding prescription stock for other companies (owners) on your real database. It sets up your facilities and your first owners, brings the owner stock already on your shelves under the package ledger, and proves the setup with one owner receipt before the owners depend on it. To try the same flow on a demo database first, see the 3PL quick start.

Go live as a 3PL: the setup order, and owner stock you already hold​

The order matters: some settings appear only once 3PL is on, owner profiles can't be created before, and owner stock can only be entered once its owner has a profile. Background: the modules follow the reading that the 3PL's own duties are licensing and reporting per facility, while the owners keep the duties of the goods' seller (FD&C Act § 581(6), (22), (24), (26), (27); § 582(a)(1), (a)(7); § 584(d); FD&C Act § 584(a), (b), (d); FDA annual licensure reporting; see Compliance background). This is how the modules read the law; it has not been reviewed by counsel. See the disclaimer. Your procedure decides who approves each owner and which company policies apply; the software records the choices.

Who: Administrator (Administration: Settings) with Inventory Administrator and Rx Tracking Manager, as the administrator is after installation. Part 1, items 5 to 10, and part 2 (except its step 5) and part 3 can also be done by a compliance manager (Rx Tracking Manager); part 3 step 2 by warehouse staff (Rx Tracking User).

Requires: Rx Tracking (DSCSA) and Rx Tracking (DSCSA): 3PL and title model. Works in Odoo Community and Enterprise.

Before you start:

  • The core go-live is done: company GLN and address, your own licenses, trading partners, scanners and your own stock. See The first 30 minutes: configure Rx Tracking and Go live with stock and records you already have.
  • The 3PL add-on is installed. See Install the 3PL add-on.
  • For each owner: its legal name, DSCSA role, GLN (Global Location Number), business address, licenses with their verification proof, the people who receive its documents and notices (with an email address), and, if it lets you send its documents to its customers, its written authorization.
  • For each warehouse that holds owner stock: your state license for third-party logistics (or, in a state that doesn't license 3PLs, the proof of that and your FDA annual report).
  • For owner stock already on your shelves: per owner, product, lot and location, the quantity and the expiration date printed on the units. Every unit carries a serialized DataMatrix.

Part 1: set up, in this order​

  1. ☐ Each warehouse that holds owner stock has its address (Inventory ‣ Configuration ‣ Warehouses, the warehouse's Address). The facility's state is taken from it, or from the company's address when the warehouse has none.
  2. ☐ Turn 3PL on, with Consignment in the same save: Turn on third-party logistics for a company. The switch is refused while DSCSA stock is held for another partner through Odoo's own Consignment setting. Turning it on before recording the facility licenses means their verification records the New licence facility events of item 5.
  3. ☐ Choose the company's policies: Choose the company's 3PL policies and Choose the hold scope: whole lot or per owner. Decide Owner isolation for non-DSCSA products now: with the default (cleared), an owner order of a non-DSCSA product can reserve and ship your own stock (Known issue PF-W16-03).
  4. ☐ Record and verify your facility licenses, one per warehouse and activity: Record and verify our facility licenses. Third-party logistics for every warehouse where owner stock is received, stored or shipped, including each warehouse of a multi-step route; Wholesale distribution as well where you transfer title in place or hold consignor stock. In a state that doesn't license 3PLs: Record that a state does not license 3PLs.
  5. ☐ Record the FDA reporting for each facility: the New licence event each verification created (Record a facility event and mark it reported to FDA) and, where the jurisdiction path or the company's Wholesalers/3PLs need a 503(e) report setting needs it, the facility's annual report (Record a facility's FDA annual report and mark it submitted). The yearly reminders are described in Act on the FDA annual report reminders.
  6. ☐ Set up each owner as a trading partner: its company contact with DSCSA Role, GLN and address, its people as contacts under it with email addresses, and its licenses verified. See Onboard a trading partner: DSCSA role, GLN and address and Record and verify a trading partner's license. Do the same for the owners' suppliers and customers you receive from or ship to.
  7. ☐ Create each owner profile, with the warehouses under Facilities Served: Create an owner profile. Then check Authorized Trading Partner (Check whether an owner is an authorized trading partner, and fix it).
  8. ☐ Set how each owner's documents are issued and its policies: its written authorization (issuing mode), Document Contacts, Notice Contacts, Owner Instructions, Goods Before Data and Return Designees. See Set how the owner's documents are issued and Set the owner's policies. Title transfers, just-in-time buying and consignors: Allow title transfers or just-in-time transfers, or make the owner a consignor.
  9. ☐ Give the owner's people the owner portal, if they use it: Give an owner's contacts the owner portal, and hand them the owner portal handout.
  10. ☐ Agree how the owner sends its instructions (orders to ship, releases, returns) and record each one as it arrives: Record an owner's instruction. Your procedure decides which channels count; the software requires one recorded instruction per operation while the owner's Owner Instructions policy is Required.

Part 2: bring owner stock already on your shelves under the ledger​

Do this part for each owner whose goods you already hold. It follows the order of the own-stock go-live, with Held for Owner added: the owner's quantities while the product is not yet a DSCSA product, then the product flag, then one scan per unit. If the product is already a DSCSA product, use the fallback at the end of this part. The example is 4 bottles of Placebrin 10 mg Tablets (DEMO-PLB-10) of lot NWPLB2607A, expiry 07/31/2027, held for Northwind Generics LLC.

  1. Go to Inventory ‣ Operations ‣ Physical Inventory and select New.

    Result: a new, editable line appears. It has a Held for Owner column, because 3PL is on.

  2. On the new line, fill in:

    • Location: where the units are, for example WH/Stock
    • Product: for example [DEMO-PLB-10] Placebrin 10 mg Tablets, 100 count
    • Lot/Serial Number: type the lot, for example NWPLB2607A, and select Create "NWPLB2607A" if it doesn't exist yet
    • Held for Owner: the owner company, for example Northwind Generics LLC (never one of its contacts)
    • Counted Quantity: for example 4
  3. Select Save, then Apply on the line.

    Result: the line shows On Hand Quantity 4.00, held for the owner. No serials are asked for: the product isn't a DSCSA product yet. Repeat steps 1 to 3 for each owner, lot and location. A user without Inventory Administrator (a compliance manager) sees the list open with Odoo's My Counts filter: the applied line leaves the list, and it shows again once you remove My Counts and search the product.

  4. Go to Inventory ‣ Products ‣ Lots / Serial Numbers, search each lot you entered, open its location's group (the list is grouped by location, with every group folded; for example WH/Stock (1)) and open the lot. On its Dates tab check Expiration Date. If it isn't the date printed on the units, enter that date, for example 07/31/2027 00:00:00, and select the save icon.

    Result: the lot's Expiration Date is the one on the units' labels. A lot created in step 2 for a product with expiration dates gets today's date (Known issue PF-W29-01, below).

  5. As the administrator, open the product (Inventory ‣ Products ‣ Products), select DSCSA Product on its DSCSA tab, check its NDC, and select the save icon. See Set up a DSCSA product.

    Result: the product is a DSCSA product. A compliance manager (Rx Tracking Manager with the Inventory User right) sees DSCSA Product greyed out.

  6. Go to Inventory ‣ Rx Tracking ‣ Opening Balance and choose the Product, the Held for Owner (for example Northwind Generics LLC) and the Lot.

    Result: On Hand 4.00, Already Registered 0 and Units Without Package 4: the figures count only the owner's units.

  7. In Reference, enter where the count comes from, for example NWG go-live count 2026-09-27, scan the DataMatrix of each of the owner's units in the scan box, one per line, and select Register.

    Result: a notification says "4 DSCSA package(s) of lot NWPLB2607A registered as opening balance.". Every option and message of this dialog is in Register an opening balance of units held for an owner.

  8. Your own units of the same product need their opening balance too: register them as in Go live with stock and records you already have, part 5 (Held for Owner empty).

  9. Go to Inventory ‣ Rx Tracking ‣ Ledger vs Stock per Owner (in the 3PL ‣ Reports section).

    Result: no row for the owner. A row still listed has units without a package (a negative Packages - On Hand); a row with an empty Owner is your own stock (step 8). See Check every serial's recorded owner against the stock.

Fallback, when the product is already a DSCSA product: Units Without Package stays 0 for the owner, because the owner's units weren't entered before the flag. Enter them with a count instead: on a Physical Inventory line held for the owner, Apply opens the DSCSA Serials dialog, where you scan each unit; the packages get Origin Found in Inventory Count. See Record owner units found in a count. Check the lot's expiration date first (step 4). Units recorded as your own stock can't be moved to an owner by editing the stock: only a title transfer changes the owner.

Part 3: prove the setup once​

  1. Record an owner receipt from one of the owner's suppliers, held for the owner, and attach the supplier's EPCIS file (Electronic Product Code Information Services) (Create a receipt held for an owner, attach the supplier's EPCIS file).

    Result: the receipt is Ready, and the Supplier EPCIS File is Awaiting Receipt with no Warnings tab.

  2. Scan the units and select Validate (Scan and validate an owner receipt).

    Result: the receipt is Done, the chatter says "Everything matches the supplier's file.", and the inbound document in the owner's name is posted (DSCSA/CODE/IN/YYYY/NNNNN).

  3. Go to Inventory ‣ Rx Tracking ‣ Gate Log (in the 3PL ‣ Reports section).

    Result: three Pass rows for the receipt, For Owner the owner: Party Role Our facility (your company, with the warehouse), Owner and Supplier. See Review the gate log.

  4. Go to Inventory ‣ Rx Tracking ‣ Facility Client List (in the 3PL ‣ Reports section).

    Result: the owner is listed for its warehouse, with its code, type and role. See Print or export the facility client list.

  5. Ship once for the owner on its order (Record an owner order to Pick, scan and ship an owner order), with an owner order, not a delivery created in the transfer form.

    Result: the order is Shipped and the outbound document in the owner's name is posted (DSCSA/CODE/OUT/YYYY/NNNNN).

  6. Check the owner's records:

    Result: Ledger vs Stock per Owner lists no row for the owner. The owner export is Generated, named after the owner's code and the period, for example "NWG, first record to 2026-09-28", and Download gives owner_export_NWG_20000101_20260928.zip.

Result: the company holds and ships stock for its owners. Records: your verified facility licenses and their New licence facility events; the company's 3PL setting and policies (the DSCSA Title Transfer location and a Title Transfer operation type per warehouse); one owner profile per owner; the owners' instructions as they arrive; for owner stock already held, the inventory moves held for each owner, the lots' expiration dates, the product's DSCSA Product flag, and one package per unit held for its owner, Origin Opening Balance (or Found in Inventory Count for the fallback), with your reference; and, from part 3, the owner receipt, its gate log rows, the owner's inbound and outbound documents and its owner order.

What happens when a step is missing​

MissingWhat you seeFix
3PL offSaving an owner profile: "Turn on third-party logistics (Inventory settings, DSCSA 3PL) for COMPANY before creating owner profiles."; Physical Inventory has no Held for Owner columnitem 2
Consignment not saved with the switchno Held for Owner on receipts, counts or stock (Known issue PF-W12-03)Held for Owner doesn't show although 3PL is on
Your facility license (activity Third-party logistics)Validate on the owner's receipt: "… can't be validated: it moves DSCSA products (…) to or from a trading partner." and "Facility WAREHOUSE has no valid 3PL licence: record our state 3PL licence for it (activity Third-party logistics) and verify it."item 4; Error: "Facility … has no valid 3PL licence …"
A license saved without Facility or Activityit doesn't count, and without Facility it isn't listed under Facility Licences (Known issue PF-A05-04)item 4
The 503(e) setting on, no submitted FDA report"… which the company's 503(e) setting requires."item 5; Error: "… which the company's 503(e) setting requires."
The owner isn't an authorized trading partnerAuthorized Trading Partner cleared on the profile, with the reason in red; its receipts, shipments and returns are refused ("Owner: …")items 6 and 7; The owner is not an authorized trading partner
Facilities Served emptythe owner is missing from the facility client listitem 7; The facility client list misses an owner
A contact without an emailthe owner portal can't be granted; notices go unsentitems 6 and 8; Error: "The contact … does not have a valid email."
The owner's instruction (policy Required)confirming an owner order: "OWNER's instruction (Ship to a customer) is required for ORDER: record the owner's order or approval first."item 10; Error: "OWNER's instruction (KIND) is required for …"
The owner's written authorizationthe owner stays in issuing mode A: its documents go to it only, not to its customersitem 8
The owner's supplier or customer isn't authorizedthe owner's receipt or order is refused (policy Block, the default) or let through with a warning (Warn and log)item 6; Get an owner transfer through the owner, counterparty and facility checks
The lot's expiration date (part 2)Opening Balance: "Nothing was registered. Fix these scans and try again:" with "Line N: Serial …: the scan says expiry … but lot … expires …"part 2, step 4

If it doesn't work

  • Saving the settings in item 2 is refused with "3PL can't be turned on for … DSCSA stock is already held for … through Odoo's consignment owner, without an owner per serial. …": stock was received for a partner through Odoo's owner field before 3PL. Ship it out first; the add-on doesn't migrate it. See Error: "3PL can't be turned on …".
  • Opening Balance refuses every scan with "Nothing was registered. Fix these scans and try again:" and "Line 1: Serial …: the scan says expiry 2027-07-31 but lot NWPLB2607A expires 2026-09-28.": the lot has today's date as its expiry (PF-W29-01). Correct it as in part 2, step 4, and register again. See Error: "Nothing was registered. Fix these scans and try again".
  • Opening Balance says "… serial(s) scanned, but only … unit(s) of … have no package yet …" for the owner: the owner's room is smaller than the scans, often 0 because the product was flagged before the owner's quantities were entered. Use the fallback. See Error: "… serial(s) scanned, but only … unit(s) … have no package yet".
  • The owner isn't offered in Held for Owner of Opening Balance: its profile is archived, or it has none (item 7). See Error: "… has no active owner profile …".
  • In part 2, step 3, Apply opens a DSCSA Serials dialog: the product is already a DSCSA product. That is the fallback: scan each unit there (Rx Tracking Manager).
  • DSCSA Product is greyed out in part 2, step 5: you need Inventory Administrator as well as Rx Tracking Manager.
Known issue

Known issue (PF-W29-01): Odoo gives a lot created while you enter stock today's date as its expiration date when the product tracks expiration dates. The opening balance and the count fallback then refuse every scan. Check each lot's date before you scan (part 2, step 4).

Known issue (PF-W15-01): the Release window of a quarantined lot can't release a lot that holds owner units. Until it is fixed, test your hold and release procedure before go-live: see Release a lot that holds owner units, with each owner's release instruction.

Known issue (PF-W16-03): with Owner isolation for non-DSCSA products cleared, an owner order of a non-DSCSA product reserves and ships any stock of the product, yours included, with no invoice and no warning. Select the policy if owners also store non-DSCSA products with you (item 3).

Next: the owners' daily work: Create a receipt held for an owner and Record an owner order.