1, 2 & 3-Step Guide
Odoo 18 incoming shipments streamline your warehouse work. In this tutorial, you will learn how to set up and use one-step, two-step, and three-step receiving processes. First, you will see how to enable each route. Next, you will follow clear UI steps. Then, you will discover Python and XML code snippets to automate critical tasks. Finally, you will troubleshoot common issues and apply best practices.
Prerequisites
Before you start working with Odoo 18 incoming shipments, make sure you meet these requirements.
System Requirements
- Odoo 18 CE/EE: Install Odoo 18 on a supported server.
- PostgreSQL: Version 13 or later.
- Python: Version 3.8 or higher.
User Permissions
First, ensure your user has the following access rights:
- Inventory Manager: Allows you to configure routes and operations.
- Warehouse Manager: Lets you adjust locations and picking types.
- Technical Features: Activates developer mode for code and record edits.
Enabling Developer Mode
Next, enable developer mode to access advanced settings:
- Go to Settings > General Settings.
- Scroll down and click Activate the developer mode.
- Confirm by clicking Reload.
Understanding Receiving Methods in Odoo 18
In Odoo 18 incoming shipments, you can choose from three methods. Each method balances speed, control, and quality checks.
One-Step Receiving (Direct)
- Definition: Moves products directly from vendor location to stock.
- Use Case: Ideal for small items or fast-moving goods.
- Benefit: Minimizes steps and reduces manual work.
Two-Step Receiving (Push & Pull)
- Definition: Moves goods first to an intermediate location, then to stock.
- Use Case: Useful when you need staging or quality checks.
- Benefit: Offers a buffer point for inspection.
Three-Step Receiving (Receive → Quality → Stock)
- Definition: Includes a quality control step between receipt and stock.
- Use Case: Required for regulated or delicate items.
- Benefit: Ensures highest level of inspection.
Configuring Receiving Methods
You must configure warehouse routes and picking types to control Odoo 18 incoming shipments.
Accessing Inventory Settings
- Go to Inventory > Configuration > Settings.
- Under Warehouse, enable Multi-Step Routes.
- Click Save.
Enabling Multi-Step Routes
After you activate developer mode, do the following:
Activate “Multi-Step Routes”
- In Inventory > Configuration > Settings.
- Tick Multi-Step Routes.
- Press Save.
Configure “Receipt” Picking Type
Next, adjust the default receipt type:
- Go to Inventory > Configuration > Operations > Picking Types.
- Find Receipts / Incoming Shipments.
- Click Edit.
- Operation Type: Set to One Step, Two Steps, or Three Steps.
- Default Source Location: Vendor Location.
- Default Destination Location: Stock Location.
- Sequence: Set priority for routing.
One-Step Receiving Process
First, you will configure and execute a one-step receipt in Odoo 18 incoming shipments.
Step-by-Step UI Guide
- Navigate to Inventory > Operations > Transfers.
- Click Create.
- Choose Receipt type.
- Select Vendor and Products.
- Click Mark as Todo.
- Then click Validate.
By doing this, you move goods directly into stock.
Code Example for Automation
Moreover, you can automate one-step receipts with server-side code. Use this Python snippet:
from odoo import api, models
class StockPicking(models.Model):
_inherit = 'stock.picking'
@api.model
def auto_receive_one_step(self, purchase_order_id):
order = self.env['purchase.order'].browse(purchase_order_id)
pickings = order.picking_ids.filtered(
lambda p: p.picking_type_code == 'incoming'
)
for picking in pickings:
picking.action_confirm()
picking.action_assign()
for move in picking.move_line_ids:
move.qty_done = move.product_uom_qty
picking.button_validate()
return True
- First, the method finds relevant pickings.
- Next, it confirms and assigns them automatically.
- Then, it sets
qty_doneequal to the ordered qty. - Finally, it validates the receipt.
This code ensures every incoming shipment processes in one step.
Two-Step Receiving Process
Now, let’s set up two-step receiving and process it in Odoo 18 incoming shipments.
Step-by-Step UI Guide
- Go to Inventory > Configuration > Operations > Picking Types.
- Edit Receipts / Incoming Shipments.
- Set Operation Type to Two Steps.
- Click Save.
- To receive, create a new transfer under Inventory > Operations > Transfers.
- Click Validate on the first move to pull goods into a staging location.
- Then click Transfer to push goods to stock.
Code Example for Two-Step Automation
You can automate the two-step flow with this Python snippet:
from odoo import api, models
class StockPicking(models.Model):
_inherit = 'stock.picking'
@api.model
def auto_receive_two_step(self, purchase_order_id):
pickings = self.env['stock.picking'].search([
('origin', '=', purchase_order_id),
('picking_type_code', '=', 'incoming')
])
for picking in pickings:
picking.action_confirm()
picking.action_assign()
# First step: Receive into staging
for move in picking.move_line_ids:
move.qty_done = move.product_uom_qty
picking.button_validate()
# Second step: Push to stock
picking.action_assign()
picking.button_validate()
return True
Here, you first fill the staging location, then move goods into stock. This method gives you extra control.
Three-Step Receiving Process
After you master one and two-step flows, you can use a three-step process.
Step-by-Step UI Guide
- Under Inventory > Configuration > Operations > Picking Types, edit Receipts / Incoming Shipments.
- Choose Three Steps.
- Click Save.
- Create a new transfer with your purchase order.
- Click Validate to receive goods.
- Click Quality Check to inspect items.
- Then click Transfer to move to final stock.
Field-Level Configuration
You can fine-tune each step:
- Quality Control: Enable or disable under the picking type.
- Control Lots: Turn on lot creation or tracking for serial products.
- Backorder Handling: Decide automatically or manually.
Code Example for Three-Step Automation
Use this snippet to automate quality checks:
from odoo import api, models
class StockPicking(models.Model):
_inherit = 'stock.picking'
@api.model
def auto_receive_three_step(self, purchase_order_id):
pickings = self.env['stock.picking'].search([
('origin', '=', purchase_order_id),
('picking_type_code', '=', 'incoming')
])
for picking in pickings:
# Step 1: Receive
picking.action_confirm()
picking.action_assign()
for move in picking.move_line_ids:
move.qty_done = move.product_uom_qty
picking.button_validate()
# Step 2: Quality
qc_wizard = self.env['stock.move.line.qty_done'].create({
'picking_id': picking.id,
'quantity_done': sum(m.product_uom_qty for m in picking.move_line_ids),
})
qc_wizard.process()
# Step 3: Transfer to stock
picking.action_assign()
picking.button_validate()
return True
This code ensures each step completes in sequence without manual clicks.
Automating with Custom Code
In addition to the above, you can customize Odoo’s XML records to define default behaviors.
XML Record to Configure Picking Type
<odoo>
<record id="stock.picking_type_in" model="stock.picking.type">
<field name="name">Incoming Shipments</field>
<field name="code">incoming</field>
<field name="sequence">5</field>
<field name="warehouse_id" ref="stock.warehouse0"/>
<field name="default_location_src_id" ref="stock.stock_location_suppliers"/>
<field name="default_location_dest_id" ref="stock.stock_location_stock"/>
<field name="operation_type">three_steps</field>
<field name="use_create_lots">True</field>
<field name="use_existing_lots">True</field>
</record>
</odoo>
- First, this record updates the incoming shipment route.
- Next, it sets
operation_typeto three_steps. - Then, it ensures lots track properly.
Troubleshooting Common Issues
Even with clear setup, you may face problems with Odoo 18 incoming shipments. Here is how to fix them.
Stock Location Not Updated
- Issue: Goods stay in vendor location after validation.
- Solution: Confirm that the destination location is correct in the picking type.
- Tip: Inspect XML or UI record for
default_location_dest_id.
Quantities Not Reserved
- Issue: Reservation fails during two or three-step.
- Solution: Enable Reservation in
Settings> Warehouse. - Tip: Use Force Availability on the picking screen.
Access Rights Errors
- Issue: “Access Denied” on validate.
- Solution: Grant your user the Inventory Manager role.
- Tip: Check record rules under Settings > Technical > Security.
Best Practices for Odoo 18 Incoming Shipments
Finally, apply these best practices to keep your processes smooth.
Naming Conventions
- Pickings: Use clear labels like
IN/2025/001. - Locations: Prefix staging areas with
STG_. - Lots: Follow date + vendor code for lot names.
Maintain Clear Routes
First, keep routes simple. Next, group similar products under one route. Then, audit routes quarterly.
Regular Audits
- Monthly: Check unprocessed pickings.
- Quarterly: Review stock valuation.
- Yearly: Archive old routes to keep the UI clean.
Additional Resources
For more in-depth information, visit the official Odoo 18 Documentation. Moreover, you can explore community forums on Odoo Community for peer advice.
Conclusion
By following this tutorial, you now know how to configure and run Odoo 18 incoming shipments in one, two, or three steps. You also saw Python and XML code to automate each method. Furthermore, you learned how to troubleshoot key issues and adopt best practices. Therefore, you can implement an efficient and robust receiving process in your warehouse. Happy integrating!
Discover more from teguhteja.id
Subscribe to get the latest posts sent to your email.

