Hi,
By default, Odoo Sales Orders always create a Delivery Order to the customer, since the sales flow assumes goods move from the warehouse to a customer location. To make a Sales Order trigger an internal transfer instead, you need to change the logistics route. The goal is to move stock between two internal or virtual locations rather than delivering to a customer.
To achieve this, you first create a custom route in Inventory → Configuration → Routes with an operation type set to Internal Transfer. Define a rule that pulls or pushes goods from one virtual location to another and make sure it applies to Sales Order Lines. Then, enable Multi-Step Routes and Advanced Routes on Sales Order Lines in Inventory settings so that routes can be selected directly in a sale order. Assign this new internal transfer route to your product or choose it manually when creating a Sales Order.
Once configured, confirming the Sales Order will generate an Internal Transfer picking instead of a Delivery Order. If you need to track stock ownership, you can customize the stock move creation to assign ownership (using the restrict_partner_id field). The reason Odoo defaults back to delivery orders is that the system’s standard sale routes always prioritize customer deliveries unless explicitly overridden.
For automation, you can extend the Sale Order Line model with a small customization that automatically sets the warehouse or route when the picking type is internal. This setup allows you to seamlessly handle internal or virtual stock movements triggered directly from Sales Orders, while still maintaining flexibility and full control over routing logic.
Hope it helps