Inter-Company Transfers¶
Who this is for
Operations and accounting. You'll use this when devices need to physically change ownership between Reyder Enterprises and Axis Mobile — e.g. Reyder bought stock from a supplier and is now moving some of it over to Axis to resell.
What you'll accomplish: move a batch of devices from one company to the other, with the accounting (sale on the source side, receipt on the destination side) automatically mirrored.
When to use this¶
- Reyder received a PO from a supplier and some of those devices are actually being bought by Axis.
- Axis bought stock directly but Reyder's warehouse will store and sell it — you need to transfer ownership back to Reyder.
- One company is rebalancing stock to the other for operational reasons.
For moving devices between locations within the same company, use a Relocate warehouse task instead. Inter-company transfers are specifically for ownership changes.
How the transfer works¶
One transfer order generates two linked documents:
- A sales order in the source company (Company A sells to Company B)
- A purchase order in the destination company (Company B buys from Company A)
The two are linked by Odoo's inter-company mechanics. The destination's receiving manifest is not created when the PO is confirmed — it's created when the source's delivery manifest completes (to avoid duplicate manifests). So the destination waits until the source actually ships.
Transfer Order → Source SO (confirmed)
↓ (inter-company mirror)
Dest PO (auto-created, confirmed, awaiting shipment)
↓
Source delivery manifest / packing box completes
↓
Dest Receiving Manifest (auto-created NOW)
↓
Scan + Mark Complete
↓
Devices now owned by destination company
Step 1 — Create the transfer order¶
Go to Inventory → Device Inventory → Inter-Company Transfers → New.

Fill in:
- Source Company — who currently owns the devices
- Destination Company — who will own them after transfer
- Source Location — the warehouse/shelf the devices ship from
- Destination Location — where they'll end up on the other side
Pick the devices¶
Choose a Selection Mode:
| Mode | What it does |
|---|---|
| By Manifest | Pulls every device from a specific receiving manifest — useful when you want to transfer an entire inbound shipment |
| By Purchase Order | Pulls every device from a specific PO (even if it was received across multiple manifests) |
| By Product Group | Filters by model/storage/grade/color — useful when transferring a homogeneous batch |
Pick the devices you want moved. Prices are set to the devices' purchase_cost automatically — inter-company transfers are at cost, not a marked-up price.

Step 2 — Confirm the transfer¶
Click Create Sale Order on the transfer form.
The system:
- Creates and auto-confirms a sales order in the source company to the destination company's partner.
- Odoo's inter-company mirroring auto-creates a matching purchase order in the destination company with you (source company's partner) as the vendor. The PO is auto-confirmed.
- The source SO spawns a delivery manifest pre-filled with the IMEIs.
- The destination's receiving manifest is not yet created — it will spawn when the source's delivery manifest is marked complete. Destination users should expect the manifest to appear after the source ships, not immediately.
Transfer order state moves to Sale Created. Source has a delivery manifest to work; destination has a PO and is waiting.
Step 3 — Source ships¶
The source company's warehouse team treats this like any normal delivery:
- Open the delivery manifest (smart button on the source SO).
- Scan the IMEIs into the auto-created packing box (see Delivery Manifests).
- Mark the box ready to ship, then mark it shipped.
On ship:
- Devices are marked
Soldin the source company. - COGS posts in the source company's books.
- An inter-company customer invoice is created (out_invoice) — and via Odoo's mirroring, a draft vendor bill appears on the destination side for the same amount.
Step 4 — Destination receives¶
Once the source's delivery manifest completes, the system auto-creates the destination's receiving manifest. The destination company's warehouse treats this like any normal receipt:
- Open the receiving manifest (smart button on the destination PO — appears once the source has shipped).
- Click Start Manual Receiving or Continue Receiving, then scan the IMEIs in.
- Mark the manifest complete.
If the receiving manifest isn't there yet
Check the source's delivery manifest. If it's still In Progress or Draft, the destination's receiving manifest hasn't been created yet — that happens only when the source's manifest transitions to Done. The destination team should wait for that handoff rather than creating a manifest manually.
On receive:
- Devices'
owner_company_idupdates to the destination company. - Each device's stock.quant is now in the destination company's warehouse.
- The receiving GL entry (DR Valuation / CR GRNI) posts in the destination company's books.
The devices are now owned by and stocked with the destination company.
Direct-to-owner delivery (optional)¶
If the destination company wants devices shipped straight from the supplier to their location (bypassing your warehouse entirely), check the Direct Owner Delivery option on the PO. Devices never transit the source warehouse — they ship direct from vendor to destination.
This is used when Axis buys devices that Reyder's ordering on their behalf but shouldn't physically handle.
Accounting summary¶
Source company¶
| Event | Entry |
|---|---|
| Delivery shipped | DR COGS / CR Device Valuation |
| Customer invoice | out_invoice to destination company, auto-posted |
Destination company¶
| Event | Entry |
|---|---|
| Receiving manifest complete | DR Device Valuation / CR GRNI |
| Vendor bill | in_invoice from source company, draft — needs manual posting |
The draft vendor bill on the destination side is deliberate. Your accountant reviews it before posting so the inter-company handoff is verified.
See Accounting Reference for full entry detail.
Configuration needed¶
Before the first transfer can run, confirm these settings:
Settings → Inventory → Inter-Company Device Transfers:
- Inter-Company Partner — the Contact record representing the other company
- Inter-Company Sale Journal — the sales journal used for cross-company invoices
- Default Transfer Location — where receipts land by default

These are per-company settings. Both Reyder and Axis need their side configured, with each pointing at the other.
Common problems¶
The inter-company PO didn't auto-create
The inter-company partner on the SO isn't linked correctly to the destination company. Open the partner record (destination side), scroll to the bottom, and verify Company is set. If it's blank, Odoo doesn't know to mirror the SO into a PO.
The destination has a PO but no receiving manifest
Expected behavior until the source ships. The destination manifest only spawns when the source's delivery manifest transitions to Done. Check the source side first — if it's still In Progress, wait. If the source says Done and the destination still has no manifest, investigate the _create_buyer_receiving_manifest() call path (check server logs around the completion event).
Devices show up in both companies after the transfer
Check the step that didn't complete. The ownership change happens on the receiving manifest complete step. If the source shipped but the destination didn't mark the receiving manifest complete, the devices are still owned by the source company — the manifest being open is what's blocking the ownership update. Complete it and the issue resolves.
The destination's vendor bill amount doesn't match the source's invoice
Both amounts are computed from purchase_cost summed across transferred IMEIs. If they differ, someone edited one of the two documents post-creation. Compare the line IMEIs and purchase_cost values. Repost if necessary.
Can I cancel a transfer in progress?
Only before the destination receives. Cancel the source SO and the transfer order — this releases the devices back to the source company. Once the destination's receiving manifest is complete, the ownership has transferred and you'd need a reverse transfer order to move them back.
Under the hood¶
Technical details for developers
Models
device.transfer.order— top-level transfer record- The source SO is a standard
sale.orderwithis_inter_company = True - The destination PO is a standard
purchase.ordercreated by Odoo's multi-company invoice mirroring
State machine
draft → confirmed → sale_created → cancelled
Sale order creation
action_create_sale_order():
sale.order.create(...)in source company with partner = destination's inter-company partner- Pricing: each line's
price_unit=lot.purchase_cost sale_order.action_confirm()— triggers overridden flow that calls_create_inter_company_po()to create the mirror PO in the destination company- Delivery manifest auto-created with lines pre-filled from the allocations
transfer_order.state = 'sale_created'
Ownership transfer on receive
device.manifest._quick_receive() on an inter-company receiving manifest:
- Row-level lock on the existing
stock.lotin source company:SELECT ... FOR UPDATE - Updates
lot.owner_company_idto destination company - Removes
stock.quantin source location - Creates
stock.quantin destination location - Creates
device.movementwith typeinter_company_receive - Updates
lot.current_location_id
Configuration
ir.config_parameter:device_inventory.inter_company_partner_id,device_inventory.inter_company_sale_journal_id,device_inventory.default_transfer_location_id- Per-company: each company needs the other company's partner set
Direct-owner delivery
purchase.order.direct_owner_delivery = True bypasses intermediate warehousing — the lot's current_location_id goes directly to destination's receiving location on receipt, with no source-side stock.quant ever created.