A field-tested approach to integrating iDempiere with DHL Express, FedEx Ship, and UPS Developer Kit: rate shopping, one-click label generation, AWB tracking, pickup scheduling, and proof-of-delivery capture.
Without ERP ↔ carrier integration, every shipment requires a warehouse operator to open the carrier portal, re-key the AWB details, download the label, paste it on the box, and then re-enter the tracking number back into the ERP. For a 200-shipment-a-day operation, that's 4–6 labor hours and a meaningful error rate.
A proper integration collapses the whole thing into a single click inside iDempiere: ship a package, print the label, book the pickup, and have the tracking number post back to the ERP automatically.
The standard scope for a full carrier integration has four functions:
DHL offers a modern MyDHL API with REST/JSON endpoints for rate shopping, shipment creation, label generation, pickup booking, and tracking. Key endpoints we use:
POST /rates — get a rate quote with service optionsPOST /shipments — create an AWB, returns the base64-encoded label (PDF or ZPL)POST /pickups — schedule pickup for the day's manifestGET /tracking/{awb} — pull status; or subscribe to tracking webhooks for push updatesAuth is HTTP Basic with your DHL account number + API key. Sandbox and production share the same structure. We cache rate quotes for 15 minutes to keep the UI snappy.
FedEx's REST API (modernized from the legacy SOAP stack) covers rating, shipping, tracking, and pickup. Auth uses OAuth2 client-credentials flow:
POST /oauth/token — client_id + client_secret → access token (valid 1 hour)POST /rate/v1/rates/quotes — rate shopping with all eligible servicesPOST /ship/v1/shipments — shipment creation; returns label (PDF, ZPL, or thermal) and tracking numberPOST /pickup/v1/pickups — close-of-day manifest and pickupPOST /track/v1/trackingnumbers — bulk tracking (up to 30 AWBs per call)UPS also offers modern REST endpoints after retiring the SOAP XPCI stack. We use:
/api/rating/v1/Rate — rate shopping/api/shipments/v1/ship — shipment + label/api/track/v1/details/{inquiryNumber} — tracking/api/shipments/v1/pickup — pickup schedulingFor every shippable iDempiere document (M_InOut in draft), we call all three carriers in parallel, get rate quotes, and present a ranked list to the warehouse operator:
Rate quotes are cached for 15 minutes per (origin-destination-weight-service) tuple. One click, and the chosen carrier's label is generated.
The carrier returns a base64-encoded label (PDF for A4 printers, ZPL for thermal label printers like Zebra ZD420). We attach the label to the iDempiere M_InOut via C_Attachment and the AWB number goes into the shipment's tracking field.
Warehouse clients almost always prefer thermal printers on 4×6" labels. Plan for that hardware in your rollout and test a few hundred labels end-to-end before go-live — thermal printer quirks are real.
Each carrier supports either webhook push or scheduled pull for tracking updates. We convert carrier status codes to an internal canonical state machine: Picked Up → In Transit → Out for Delivery → Delivered (or Exception). On "Delivered" we capture the POD (name + signature image if available) and attach it to the iDempiere shipment for audit.
Not every shipment goes through cleanly. Common exceptions:
We've shipped production integrations for 3PL operators, eCommerce exporters, and manufacturers. Typical turnaround is 3–5 weeks including testing.
Scope Your Carrier Integration →Get a free Proof of Concept — we build a working iDempiere environment with your data, modules, and integrations in 2–3 weeks. Zero upfront cost, zero obligation.
Talk to an iDempiere Expert