Odoo shipping carrier integration: what the connection does and how to scope it
If your team ships physical orders from Odoo Inventory or eCommerce, the carrier connection exists to remove re-keying. Done well, it lets a delivery order request live rates, print labels and write tracking numbers back to the record, so warehouse staff do not copy addresses and weights into a carrier portal by hand. In Odoo, a carrier connection is set up as a delivery method tied to a carrier account. Which carriers and connector types you can use depends on your Odoo version, your edition and whether the connector comes from Odoo, the Odoo Apps Store or a partner. Before you commit to a carrier, confirm it in the Odoo documentation for your exact version, because a carrier listed for one release may not be documented for another.
The first scoping decision is account ownership. Decide which party holds each carrier contract, which shipping services each account can use, and whether shipments from more than one company or warehouse need separate accounts. Multi-company operation is included only in Odoo's Custom plan, according to Odoo's pricing page, so confirm that your edition covers the company structure you run. Hosting matters too. The same pricing page says only the Custom plan can be hosted on Odoo.sh or on-premise, so a self-hosted deployment needs to confirm that the connector supports your hosting type and that outbound calls to carrier APIs are permitted from your network. Write these answers down before the build, since they determine who must sign off on credentials and where they are stored.
Four functional areas drive most of the effort. Live rates depend on accurate product and package data, so check that each product has a correct weight and unit of measure, and that packaging definitions match the boxes your warehouse actually uses. Label printing depends on the printers and label formats your sites use, which should be tested with real label stock. Multi-package shipments are where connectors differ most. Confirm whether the connector splits one delivery order into several packages, returns one tracking number per package and stores every label. Invoicing shipping costs is also connector-specific. Confirm whether the carrier charge is added to the sales order as a delivery line, and how that line flows into customer invoices and accounting, so finance does not discover the gap at month end.
Plan for version changes from the start. Odoo's standard support covers the first three years after a major release, and the support documentation lists Odoo 19.0 standard support until September 2028, Odoo 18.0 until September 2027, and Odoo 17.0 standard support ended in September 2026. On Odoo Online and Odoo.sh, major upgrades are mandatory every two years. A carrier connector can lag a new Odoo release, so ask the connector provider for written version compatibility and add a check of rates, labels and tracking to your upgrade test plan. Run that test on the upgraded test database that Odoo's upgrade service produces before you touch production. Make the connector version, the carrier API credentials and the owner of each one part of your change record.
What you need in place before configuring a carrier in Odoo
A carrier connection in Odoo depends on the edition and hosting type you run, the Odoo version under support, and the accounts and data the carrier expects. Work through these six items before anyone opens the carrier settings, because several of them decide whether the connector can be installed at all.
Edition and hosting type
Confirm whether you run Community or Enterprise, and whether the instance is Odoo Online, Odoo.sh or on-premise. Odoo's pricing page limits Odoo.sh and on-premise hosting to the Custom plan, and only Custom includes external API access and custom modules. If your carrier connector depends on custom code or external API calls, check this before you budget the build. Confirm the connector's own edition requirements in its documentation.
Odoo version and support end date
Odoo 19.0 is covered by standard support until September 2028, which is the date to plan around for this implementation. Standard support includes security updates and bug fixes, and security patches are only provided during that window. Record the version and its end date before choosing a connector release, since a connector built for one major version may not install on another. Confirm compatibility with the connector documentation.
Carrier accounts and API credentials
Each carrier issues its own business account, API keys or client credentials, and sometimes a separate sandbox or test account. Request these from the carrier before the build starts, because account approval can take longer than the configuration itself. Store the credentials in a secrets store your team controls, and confirm which environment (test or production) each credential belongs to and which shipping services it enables.
Shipping origin addresses
Carrier rate and label requests need a validated origin address for every warehouse or dispatch point that ships in Inventory. Collect the registered name, street address, postal code, country and contact details exactly as the carrier has on file, and confirm which warehouse maps to which carrier account. Mismatched origins are a common cause of rejected labels and rate errors when a business ships from more than one site.
Product weights and dimensions
Live rates and package weights depend on data held on each product in the Inventory app. Audit the product records you plan to ship for weight, unit of measure and package dimensions, and decide who owns that data after go-live. Products without weights can produce zero-cost or failed rate requests, and shipments with inaccurate weights can lead to carrier surcharges that Accounting will need to reconcile.
Outbound network access to carrier endpoints
The Odoo server must reach each carrier's API endpoints over HTTPS, which usually means outbound firewall rules, proxy settings and, where the carrier requires it, a fixed outbound IP allowlist. Ask your network team to confirm these before testing, and ask the carrier which hostnames and ports it uses for test and production. Self-hosted and on-premise instances carry this responsibility in full, while Odoo Online and Odoo.sh handle it differently, so confirm the setup for your hosting type.
How rate requests, labels and tracking move between Odoo and the carrier
The shipping step in Odoo starts when a sales order or an outbound transfer reaches the point where goods are ready to leave the warehouse. At that moment the carrier integration reads the data already on the transfer, most importantly the delivery address, the package details and the weight. Odoo then either asks the carrier for a rate quote or creates a shipment, depending on how the connector is configured. The carrier replies with the cost, and for a shipment it also returns a label and a tracking reference. Odoo stores these on the transfer and records the exchange in the chatter, so the warehouse and sales teams can see what was sent and what came back. Your team should map this path step by step in a test database before any live carrier account is connected. The order of data entry matters more than most teams expect. A rate request is only as accurate as the weight and dimensions it receives. If products have no weight, or if packages are not set up before the rate is requested, the carrier quote will be wrong or the request will fail. Warehouse staff usually need to confirm product weights, define the packaging types the business uses, and then choose or assign the package on the transfer before the shipping action runs. Because menu names and field labels differ between Odoo versions and between Community and Enterprise, confirm the exact names of the weight, package and carrier fields in your own version before writing the operating procedure. Where the carrier's charge is recorded is a decision for finance as well as operations. In Odoo, the shipping cost returned by the carrier can be added to the delivery order or sales order as a line, so it can be invoiced to the customer or treated as an internal cost. Agree with your finance lead whether shipping is charged to customers, absorbed, or passed through at the carrier's rate, because each choice changes how the cost appears on invoices and in the accounts. Ask the integration partner to show exactly which record holds the cost, how a cancelled or re-created shipment affects it, and whether a label reprint generates a second charge. Several risks deserve a plan before go-live. Failed requests can leave a transfer in an unclear state, so define who checks the error messages and how staff retry. Labels may be generated for the wrong package count if multi-package logic is not tested. Tracking references should be verified against the carrier's own portal during testing. Ask your carrier and your integration partner to confirm which data each request sends and which fields are written back, and keep a record of the test cases you ran. Finally, treat the flow as something to test, not assume. Run sample orders with light, heavy and multi-package contents, cancel one after label creation, and confirm the chatter entries, transfer fields and invoice lines all match. Reviewing these results with warehouse, finance and the carrier account owner gives you a clear acceptance record before the integration handles real shipments.
Configuration sequence for carrier integration in Odoo
This sequence moves a carrier connection from an edition and connector check through a neutralized test copy to tested rates, labels, tracking and invoiced shipping costs. Production credentials are enabled only after each earlier step has passed its check, so the first live shipment is one your team has already verified.
Confirm edition and connector source first
Before any build work, confirm with Odoo which edition and version your organization runs, and which carrier connectors that edition and version provide for your delivery methods. Record whether each connector is an Odoo app, a module from the Odoo Apps Store, or a community module, and confirm the licensing and support terms for each one. Your platform team and the implementation partner should sign off on this list together. The step is complete when every carrier you plan to use is matched to a named connector source and an owner who will maintain it.
Create a neutralized test database
Duplicate the production database into a test copy using the database duplication feature that Odoo documents for on-premise test environments, and apply neutralization so that live outgoing communications and external integrations do not run from the copy. Confirm in your Odoo version's documentation exactly what neutralization disables, and check that the copy is hosted on infrastructure separate from production. Your team should then confirm that the test copy cannot send messages or call production carrier accounts. The step is complete when the copy loads, a test user can sign in, and the neutralization checks pass.
Set company addresses, units and product weights
In the test database, enter the legal and shipping addresses for each warehouse and company, and confirm the weight and dimension units used by Inventory. Carrier rate calculations depend on these values, so a wrong unit or missing origin address produces wrong quotes. Then enter weights and dimensions for the products you will ship in the test set, starting with the heaviest and largest items, since these drive packaging choices and rate tiers. The step is complete when a sample of products shows the expected weight and dimensions on the delivery order, and the origin address matches the warehouse the carrier will collect from.
Create the carrier account in test mode
Create the carrier account record in Odoo using the carrier's test or sandbox credentials, and keep production credentials out of the test database. Ask the carrier which test account numbers, service levels and label formats their sandbox supports, because sandbox behavior often differs from production. Store the credentials in the field Odoo provides for them and restrict who can view them. The step is complete when Odoo reports a successful connection to the carrier's test environment and the account shows the service levels the carrier confirmed for it.
Configure the delivery method and packaging
Create or edit the delivery method so it points to the test carrier account, and define the packaging types the warehouse uses, with their dimensions and maximum weights. Decide how multi-package shipments are handled, including whether one order can split into several packages and how each package is weighed. Confirm which services the delivery method offers to customers and whether any are restricted by country or weight. The step is complete when a test delivery order can select the method, the packaging list matches what the warehouse physically uses, and a multi-package case has been set up or explicitly marked as out of scope.
Compare rates with the carrier quote tool
Create a test sales order with a known weight, dimensions, origin and destination, then request live rates from Odoo for each service you enabled. Run the same shipment through the carrier's own quote tool or sandbox quoting interface, using identical inputs. Compare the service names, currency, and charges, and record any difference, including surcharges or fuel charges that one side shows and the other does not. The step is complete when the Odoo rate matches the carrier's quote for each service, or each difference is explained and accepted in writing by the team that owns shipping costs.
Print test labels and verify tracking
Confirm the delivery order in the test database and print a label through the carrier connector for each packaging type and at least one multi-package order if you support them. Check that the label prints at the correct size for your label printer and that the barcode scans. Then use the tracking number on the label in the carrier's sandbox tracking page, and confirm that the tracking status returns to the delivery order in Odoo. The step is complete when the label prints at the expected size, the barcode scans on the warehouse printer, and the tracking status updates in Odoo.
Verify invoice shipping costs, then enable production
Invoice the test sales order and confirm that the shipping cost appears as its own line, with the amount, tax treatment and revenue or cost account your finance team has defined. Check that the cost in the invoice matches the rate you accepted in the earlier comparison step. Once every earlier check has passed and finance has approved the account mapping, replace the sandbox credentials with production credentials in a controlled change, using the same carrier account settings you tested. Run one low-risk live shipment and confirm its label and tracking before opening the method to customers. The step is complete when the invoice line reconciles to the carrier charge and the first production shipment completes without manual correction.
Which Odoo data each carrier request needs
This table maps each piece of Odoo source data to the carrier request field it feeds, with the error that usually appears when it is missing or wrong. Read it before configuring a connector, then check each carrier's required fields and units in that connector's documentation. Most failed rate requests trace back to an address, weight or service setting that was never filled in on the source record.
| Odoo object | Data used | Carrier requirement | Common error |
|---|---|---|---|
| Company shipping address | Warehouse or company address on the sending location, including country and postal code | Sender address and origin country used for rate and service eligibility | Rate request rejected because the warehouse has no postal code or country set |
| Customer delivery address | Partner address on the sales order or delivery order, including state and phone where the carrier asks for it | Recipient address, validated against the carrier's address rules | Label fails because the state or region code does not match the carrier's accepted format |
| Product weight | Weight field on each product variant, with the unit of measure set in Inventory settings | Package weight in the unit the carrier expects, often kilograms or pounds | Weight sent as zero or in the wrong unit, so the carrier quotes a wrong rate |
| Product volume | Volume field on the product, used where the carrier prices by dimensional weight | Length, width, height or volume for dimensional weight calculation | Dimensions missing on the package, so dimensional weight is skipped and the quote is understated |
| Package type | Packaging or package type record set on the delivery order | Carrier package code or box type that matches the carrier's catalog | Package code not mapped to the carrier, so the request uses a default that the carrier rejects |
| Declared value | Sale price or invoice value on the delivery order, in the company currency or converted to the carrier's currency | Declared or insured value for customs and insurance where the service needs it | Currency sent without conversion, so the declared value does not match the commercial invoice |
| Service level | Carrier service selected on the delivery method, such as an express or ground option | Service code that the carrier accepts for the origin and destination pair | Service not available for the destination country, so the carrier returns no rates |
| Shipping cost product | Service product linked to the delivery method and used on customer invoices | Carrier cost recorded as a line item so the shipping charge reconciles to the carrier invoice | Shipping cost product missing or set to a tax category that differs from the sales order, so invoice totals do not match |
How to test rates, labels and multi-package shipments before go-live
Before a shipping carrier goes live in Odoo, run a written test plan that covers rates, labels, multi-package shipments and the exception paths your warehouse will actually hit. Start by asking the carrier whether it offers test or sandbox credentials for the Odoo connector and which of its services those credentials can exercise. Where a sandbox exists, configure it on a separate Odoo test database, never on production. Where the carrier offers no sandbox, agree in writing with your account manager how test shipments will be created and voided, because some carriers bill for labels that are generated and not voided.
Build a fixed set of sample orders and run every one of them through Inventory and the delivery order flow. The set should include at least one domestic and one international destination, a single-package shipment, a multi-package shipment with weights entered on each package, a shipment that is cancelled after the label is generated, a shipment whose delivery address is corrected before pickup, and a returned parcel handled through the return flow. Record, for each order, the service selected, the rate Odoo displayed, the label produced, the tracking numbers and the status shown after each step. The point is to confirm that each path behaves the way your operations team expects, not just that a label prints.
Neutralize the test database before anyone uses it. Odoo documents database duplication with neutralization for test copies, and a neutralized copy should be checked before it is used. Confirm that outgoing mail, scheduled actions and any live carrier, payment or marketplace connections are disabled or pointed at test endpoints, so a test run cannot send customer notifications or create real shipments. Assign one named owner to this check and make it a required step in every test cycle.
Reconcile the results against two independent sources. Compare each test label and rate with the carrier portal, confirming that the shipment, service level, package count and charged amount match what Odoo recorded. Then compare the shipping cost that Odoo passed to the customer or posted to the invoice with the carrier's charge for the same shipment. Differences in weight, dimensional rounding, surcharges or currency conversion should be explained and documented before go-live, not left for the finance team to find in month-end close.
Keep the test plan, the sample orders and the recorded results in version-controlled documents owned by your operations or integration lead. Rerun the same plan after every Odoo upgrade, after any change to carrier credentials or service mappings, and after any change to packaging or weight configuration. Odoo's upgrade process uses an upgraded test database that should be tested before production, so the shipping plan should be part of that test. Confirm with the carrier whether its connector version changes with the Odoo version and ask for the test steps it recommends before each change.
How to protect carrier credentials and shipment data
Carrier integrations hold two kinds of sensitive material: account credentials that let Odoo request rates and print labels, and recipient addresses that move through Inventory and eCommerce. The controls below cover where secrets live, who can change shipping setup, what the server can reach, how the platform stays patched, how costs are reviewed, and what the carrier contract must say about data.
Store and rotate carrier API keys
Carrier connectors need API keys or account credentials to request rates, create shipments and fetch labels. Keep them in the connector's configuration fields inside Odoo, and out of custom module code, server scripts, shared spreadsheets and chat messages. Ask the connector's maintainer how it stores these values, and confirm that database backups and duplicated test databases carry the same secrets. Use sandbox credentials in test copies. When a credential changes hands, generate a new key in the carrier portal, update the connector, and revoke the old key.
Restrict who edits delivery methods
Delivery methods decide which carrier account ships each order and which rates customers see. Limit edit rights on delivery methods and carrier accounts to the few people who own shipping setup. Confirm that warehouse staff can view labels and tracking numbers without seeing account credentials. Review group memberships in Inventory and Sales settings before go-live and after every reorganization, because access granted for a pilot often remains in place. Ask your implementation partner to document which access group maps to which task.
Limit outbound access to carrier endpoints
The Odoo server needs to reach only the carrier endpoints the connector calls, plus the services the deployment depends on, such as the database and mail relay. Ask each carrier for its documented API hostnames, including any sandbox hostnames, and allow outbound traffic to those names through the firewall or egress proxy while blocking everything else. Re-check the list when a carrier changes its API version. Keep the rule set documented so the security team can review it during audits.
Stay on a supported Odoo version
Security patches for Odoo are provided only during standard support. Standard support covers the first three years after a major release on Odoo Online, Odoo.sh and on-premise. Odoo 19.0 is listed with standard support until September 2028, Odoo 18.0 until September 2027, and Odoo 17.0 standard support ended in September 2026. Plan connector upgrades together with the core upgrade, test the full shipping flow on an upgraded test database, and confirm that the connector supports the target version before production cutover.
Audit changes to shipping costs
Shipping costs flow into quotes, invoices and margin reports, so an unexpected change to a rate table or a carrier surcharge affects revenue quickly. Turn on change tracking for delivery method pricing and carrier account settings where Odoo supports it, and record who changed each value and why. Each month, compare live carrier rates with the shipping charges applied to a sample of orders. Confirm with your partner which changes are logged by default and which need configuration.
Check carrier data handling terms
Shipment records contain recipient names, addresses and phone numbers, which may count as personal data under privacy law in your jurisdiction. Before connecting a carrier, read its data handling terms. Confirm where requests are processed, how long it retains shipment and label data, whether it uses that data for its own purposes, and how cross-border transfers are covered. Ask for a data processing agreement where one applies, and record the terms in your records of processing.
Common carrier integration failures and how to fix them
This table lists common symptoms when Odoo talks to a shipping carrier, the usual cause behind each one, and the general direction for a fix. Use it to narrow down where to look first, then follow the connector's own documentation and logs for the exact settings and error messages. Most failures trace back to account setup, unit and address data, or configuration that changed during an upgrade or credential rotation.
| Symptom | Likely cause | Fix |
|---|---|---|
| Rates return zero or are missing | Carrier account not linked to the delivery method, wrong service codes, or missing product weight and dimensions | Check the delivery method configuration, confirm each product has a weight, and review the connector log for the rate request and response |
| Labels fail for international addresses | Incomplete or non-standard address fields, missing customs or commodity data, or a service that does not serve the destination | Validate partner addresses, complete country and state fields, and confirm the chosen service supports the destination and required customs data |
| Weights arrive in the wrong unit | Product unit of measure differs from the weight unit set in the carrier connector or company settings | Align the Inventory weight unit with the unit the carrier expects, then test a single package before batch processing |
| Multi-package shipments create one label | Packages were not split on the transfer, or the connector does not request multiple pieces for the chosen service | Confirm the connector supports multi-piece shipments for that service, and set package details on the transfer before validating |
| Tracking numbers do not return to the transfer | Webhook or callback not reachable, tracking field not saved, or carrier returns a reference that does not match the picking | Check that the callback URL is reachable from the carrier, review the transfer chatter and logs, and confirm which reference the connector writes back |
| Shipping cost missing from invoices | Shipping product not set on the delivery method, or the cost is not added to the sales order before invoicing | Set the invoicing product on the delivery method, confirm the cost line appears on the order, and invoice after the delivery is validated |
| Credentials rejected after rotation | Old API key or secret still stored in the connector, or a sandbox key used against production | Enter the new credentials in the carrier record, confirm the environment (test or production), and check the log for the authentication error code |
| Failures after an Odoo version upgrade | Connector module not compatible with the new version, or its settings were not migrated | Confirm the connector has a release for the target version, test on the upgraded test database, and review the module changelog before going live |
What drives the cost and duration of a carrier integration
The cost of an Odoo shipping carrier integration is set less by the carrier you choose than by the number of places the integration has to reach. Start with the licence and edition. Shipping features in Odoo depend on which edition and plan you run, and the Community and Enterprise editions differ in the apps and support you receive. Confirm in writing which edition the quote assumes, and whether the carrier connector you need is available for it, because a connector that works on one edition may need a different licence or a partner-built module on another.
Next, count the moving parts. Each carrier account, each delivery service (for example, ground, express or international) and each packaging type adds configuration, mapping and testing. A warehouse that ships through two carriers, with four services and three box sizes, is a materially larger job than one carrier with a single service, even if both use the same connector. The same applies to the number of warehouses and to every marketplace or eCommerce channel that feeds orders into Inventory. Ask the partner to list each carrier account, service, packaging type, warehouse and order source in the scope, and to state which of them are covered by the fixed price.
Data quality is the cost driver most often underestimated. Rates and labels depend on accurate product weights and dimensions, and on addresses that the carrier can validate. If weights are missing on product records or customer addresses are free text, someone has to clean them before live rates are reliable. Ask who owns that cleanup, whether it is in scope, and how many records need review. Custom label or invoice formats add design and approval time, and the carrier's label format rules must be checked against your printers, so ask for a sample label per carrier printed on your actual hardware.
Some costs recur after go-live and belong in a separate line of the quote. Carrier fees are charged by the carrier under your own account agreement and are not paid to the implementation partner. Connector subscriptions, where a paid Apps Store or partner connector is used, usually renew on their own schedule. Support retainers cover fixes, carrier API changes and Odoo version upgrades. Ask the quote to show one-time setup (analysis, configuration, testing, go-live support and training) separately from each recurring item, with the party that charges it named for each one.
When you compare quotes, ask for the following in writing: the edition and connector assumed, the list of carriers, accounts, services, packaging types, warehouses and order sources in scope, the data cleanup responsibility, the number of test shipments and test environments, the go-live support window, the acceptance criteria, and what is excluded. Any item left out of the written scope will be priced as a change later, so the scope document is the main control you have over cost and duration.
Questions buyers ask about Odoo shipping carrier integration
Does Odoo include built-in shipping carriers or does each one need a connector?
Carrier support depends on the carrier and your Odoo version, so confirm the current list in the Odoo documentation for the version you run before you scope the work. Some carriers are covered by shipping methods in the Inventory and eCommerce apps, and others need a connector module, which may come from Odoo or from the Odoo Apps Store. Start with a carrier inventory: each carrier, each service you use (domestic, international, economy), each warehouse that ships, and the account and API credentials each carrier requires. Ask the implementation partner to map every carrier to a built-in option or a named connector, with the Odoo version and edition each one supports, and to flag any carrier that needs custom development.
Can the Odoo Community edition use carrier connectors, or does it need Enterprise?
Confirm this for your version before you commit. Odoo offers a Community edition licensed under LGPL-3.0 and a paid Enterprise edition, and the Enterprise source code is not publicly available. Odoo's pricing page places multi-company, Odoo Studio, external API access and custom modules in the Custom plan, so a connector that depends on any of those features will need that plan or edition. A connector from the Odoo Apps Store may carry its own license and its own edition requirement. The LGPL-3.0 license covers the code, but it does not cover your agreement with the carrier or the carrier's API terms. Ask for a written list of each connector with its edition requirement, license and required carrier account. Community also has no access to Odoo's upgrade service, so plan how you will move to a newer version later.
How long does an Odoo shipping carrier integration take, and what drives the time?
No duration can be stated from the facts available here, so ask for a schedule built from your written scope. The main drivers are the number of carriers, the number of services and countries in each carrier's scope, whether each carrier can be covered by an existing module or needs custom code, how many warehouses and packing stations ship, and the label printers in use. Carrier test accounts also set the pace, because rates, labels and tracking can only be verified once sandbox or test credentials work. Engagements are fixed-scope, so the timeline is agreed in writing before work starts. Ask for each carrier as a separate work item with its own test steps, so you can see where time goes and how a delay in carrier access would affect the plan.
What does our team need to provide for an Odoo carrier integration?
Plan on your team providing accounts, decisions and people for testing. You will need carrier accounts with production and test credentials, the contract terms that set your negotiated rates, product weights and dimensions in Inventory, a list of packaging types, the label printer models and label formats your warehouse uses, and written shipping rules such as which carrier applies to which region or order value. You also need a non-production Odoo copy for testing and warehouse staff who will run acceptance tests with real packages. Implementation work is a one-time project cost. Carrier rates and fees are paid to the carrier under your contract and recur, and carrier API maintenance, credential rotation and version upgrades also recur. Ask the partner for a written list of inputs with an owner and a due date for each.
Can our own staff configure and run Odoo carrier connectors after go-live?
Settings are usually within reach of trained Odoo administrators. Trained staff can typically maintain shipping methods, product weights, packaging, warehouse settings and shipping rules, provided the connector's settings are documented. Changes to connector code, handling a carrier API change, fixing a label format or moving to a newer Odoo version need developers who know both Odoo and the connector. Confirm this split against the vendor documentation and each connector's own documentation, because modules differ. Ask the partner for a runbook that covers daily checks, credential rotation, how to test a rate change in a non-production copy, who to contact for each carrier and what to do when a carrier changes its API. Then decide whether your team, a support retainer or a combination will carry that work after go-live.
How does Odoo handle multi-package shipments sent through a carrier?
Confirm multi-package support in the connector documentation for your version, because behavior differs by carrier and module. Check four things: whether one order can create several packages with a separate tracking number for each, whether each package gets its own weight and label, whether the carrier returns one rate or a rate per package, and how the shipment and tracking appear on the delivery order. Also check partial shipments and backorders, since a split order can produce several deliveries. Test a multi-package order in a non-production copy against each carrier's test environment, and confirm that labels print and tracking links reach the customer. Record the expected package count and weight for each test order so the results can be compared with the carrier's response.
Do shipping costs appear on Odoo customer invoices?
Confirm this in the documentation for your version, because the answer depends on the delivery method and the connector. In general, a shipping charge is carried on the sales order as a delivery line, and that line can flow through to the customer invoice. Whether the amount is the live carrier rate, a fixed rate or a rate with a margin depends on how each method is configured. Also check whether the carrier's actual cost is recorded anywhere for margin reporting, since the customer charge and the carrier invoice are often different figures. Ask the partner to test one order end to end, from sales order to posted invoice, with a live rate and a fixed rate, and to confirm how Accounting posts each amount.
How DeployOpen works on this
DeployOpen plans, implements, customizes, integrates, documents and supports self-hosted open-source platforms inside your own cloud accounts, data centers or air-gapped networks. For Odoo shipping carrier integration, the work starts with a written scope that names the carriers, Odoo apps and hosting edition involved, and each step is checked against your environment before it reaches production.
How we scope
- Confirm which Odoo edition and hosting type you run, since carrier connectors depend on what your plan and deployment allow.
- List each carrier account, service level, country lane and label format the written scope must cover.
- Agree in writing which Inventory and eCommerce flows are in scope, such as live rates, labels, package weights and multi-package shipments.
How we build
- Configure each carrier connector in a test database first, using test credentials from the carrier where it offers them.
- Map package weight, dimension and product data sources so rate requests and labels reflect real warehouse practice.
- Test multi-package shipments, returns and shipping cost invoicing against sample orders before any production switch.
How we hand over
- Provide the written configuration record for each carrier, including account settings, shipping methods and any custom code.
- Document the label printing setup, printer and workstation requirements, and the steps for handling failed rate or label calls.
- Walk your operations and finance teams through daily use and the invoicing of shipping costs before go-live sign-off.
How we support
- Offer ongoing support, upgrades and testing as a retainer after handover, with scope agreed in writing.
- Plan each Odoo version upgrade in a test copy so carrier connectors are retested before production moves.
- Confirm with your carriers and Odoo which connector versions and APIs remain supported when your plan changes.

