The challenge
The retailer's shipments crossed dozens of couriers, and Odoo knew nothing about any of them after the delivery order was validated. Support staff played detective across carrier websites while purchasing had even less visibility on inbound stock.
- Tracking numbers lived in emails and carrier portals, not on the Odoo delivery order, so "where is my order?" meant a manual hunt.
- Shipment statuses in Odoo went stale the moment a parcel left the dock — nothing updated them.
- Inbound purchase-order shipments from vendors had no tracking linkage at all, leaving receiving dates to guesswork.
- With couriers numbering in the hundreds globally, per-carrier integrations were never going to be maintainable.
Our approach
iVentureTeam used AfterShip as the single tracking layer and wired Odoo to it in both directions — a productized module for the sales flow and a custom-built extension for the purchase flow.
Outbound: Sales module integration
- Confirming a sale generates the delivery order; the user sets the courier on that record as usual.
- On delivery validation, Odoo creates the tracking entry in AfterShip with the courier and tracking number — no separate registration step.
- Built and packaged across Odoo 10, 11, 12, and 13 so the client (and future users) are not locked to one version.
Inbound: custom Purchase module extension
- Confirmed purchase orders go to the vendor as normal; when the vendor ships, their AfterShip tracking info is recorded against the matching PO in Odoo.
- Procurement sees inbound shipment progress on the same screen they manage the order from — a customization built specifically for this client's replenishment flow.
Status sync engine
- An Odoo scheduled action polls AfterShip periodically and writes the latest checkpoint state onto each tracking record.
- Both sales and purchase tracking records refresh through the same job, keeping one consistent source of shipment truth.
Outcomes
Tracking became something Odoo does, not something people do. Every parcel — customer-bound or vendor-bound — reports its own status into the ERP.
- Customer service answers delivery questions from the Odoo record instead of visiting carrier sites.
- Purchasing plans receiving around live inbound tracking rather than vendor promises.
- One integration covers 686 couriers, eliminating the need for per-carrier connectors as the business adds shipping partners.
- Support time spent on shipment-status inquiries dropped noticeably after go-live.
“Customers stopped emailing 'where is my order' — tracking updates flow into Odoo and out to them automatically, across every courier we use.”
Customer Service Lead · eCommerce retailer
