Configuring DB Schenker IFTMIN Orders in Your TMS

Step-by-step setup for sending EDIFACT IFTMIN transport orders to DB Schenker from your TMS, plus how to read CONTRL and IFTSTA replies.

Share

Before You Touch the EDIFACT Config

Before you map a single segment, you need four things sitting on your desk: DB Schenker's partner ID (or GLN), the agreed message version, your AS2 or OFTP2 connection details, and a confirmed test window with their EDI onboarding team. Skip any of these and your first transmission will bounce.

Most EU shippers running DB Schenker EDI integration still land on D.96A as the baseline message version, even though UN/EDIFACT has moved through D.97B, D.98A and beyond. IFTMIN covers every mode of transport, road, rail, sea, air, inland waterway, and every party, consignor, consignee, forwarder, broker, carrier, closing the loop on transport instructions for a consignment. That flexibility is exactly why the base standard isn't enough on its own. DB Schenker layers its own conditional and mandatory segment usage on top of the UN/EDIFACT skeleton, so pull their IFTMIN and IFTSTA implementation guides before you start mapping fields. The generic spec tells you what's legal. The carrier guide tells you what they'll actually accept.

Here's what trips up admins moving from US EDI (204/990, 856, 214) to EDIFACT for the first time: IFTMIN D.96A is a flat-structure message, with no formal Header, Detail, Summary split, no UNS, no labelled Detail section. There's no visual scaffolding guiding you through the document the way X12 envelopes do. You're reading a segment table and a branching diagram side by side, and that takes getting used to.

Step-by-Step: Building and Transmitting the IFTMIN

Building a valid IFTMIN is a mapping exercise first, a transmission problem second. Work through these steps in order and you'll have a message DB Schenker's gateway can actually parse.

  1. Map your internal order fields to IFTMIN segments. Every message opens with UNH (message header, declaring IFTMIN, version D, release 96A, controlling agency UN) followed immediately by BGM, which carries the document/message name code and your transport instruction number. For a standard new instruction you'll typically see something like BGM+610+<your-order-id>+9, where 610 is the document code for a transport instruction and 9 marks the message function as "original."
  2. Set terms of delivery and reference numbers. Use the TOD segment for your Incoterm and the RFF segment group for booking numbers, contract references, or purchase order numbers that DB Schenker needs to match the shipment against an existing agreement. Get this wrong and the message parses fine but lands in nobody's queue on their side, because there's nothing to reconcile it against.
  3. Build the party loop in SG11. SG11 is mandatory and repeats up to 99 times, carrying NAD-LOC-MOA-SG12-SG13-SG15, which is how you identify every party on the shipment: consignor, consignee, carrier, forwarder, notify party, payer. Each NAD occurrence needs a qualifier code (CZ for consignor, CN for consignee, CA for carrier, DP for delivery place) plus the party's identifier. A real file looks something like NAD+CZ+5412345123453::9' followed by separate NAD lines for each role. Miss a mandatory party and you'll get a negative CONTRL, not a silent drop, so this is a forgiving place to make your first mistake.
  4. Populate transport and goods details. The TDT segment group describes the transport stage: mode, means, carrier identification, and (for air or rail legs) the voyage or flight number. The goods-item loop, driven by GID, carries the commercial core of the shipment: package count, package type, weight via MEA, and value via MOA. For multimodal shipments, the IFTMIN contains multiple TDT segment groups, one for each transport leg, and the LOC segments connect the legs, where the discharge point of one leg is the loading point of the next.
  5. Wrap the segments in a correct envelope and validate. Your interchange needs UNA (optional service string advice), UNB (interchange header with your sender/receiver IDs and a unique interchange control reference), the UNH/message body/UNT you built above, and a closing UNZ. Run this through a validator against DB Schenker's directory, not just the generic D.96A schema, before you send anything live.
  6. Transmit over AS2 or OFTP2 to DB Schenker's EDI gateway using the connection credentials confirmed during onboarding. Log the interchange control number and timestamp in your TMS immediately. You'll need both the moment anything downstream goes quiet.

How You Know It Worked

You know transmission succeeded when a positive CONTRL comes back, typically within minutes, confirming interchange receipt. You know the shipment itself was accepted when IFTSTA references your order ID correctly a few hours to a day later. Those are two separate checkpoints, and conflating them is the single most common reconciliation mistake admins make.

CONTRL is a message syntactically acknowledging or rejecting, with error indication, the interchange you sent. It doesn't tell you whether DB Schenker's planning team can actually execute the shipment, only that the envelope and segments parsed. Acknowledgement indicated by means of CONTRL does not imply that the business content of a message has been accepted or can be complied with. That business-level confirmation comes later, through IFTMCS (contract status) and then IFTSTA, which reports status milestones as the shipment actually moves.

Practical check: when IFTSTA lands, match its reference segment back to your internal order ID, not just the carrier's shipment number. DB Schenker will generate their own shipment reference the moment they accept the booking, and if your TMS is only watching for your own order number in the wrong field, you'll show the shipment as unconfirmed for days while it's actually moving. Build your reconciliation query against both reference types from day one.

Failure Mode: CONTRL Rejection and Segment Errors

When DB Schenker rejects your IFTMIN, the CONTRL response tells you exactly where, down to the segment and data element, if you know where to look. A UCI segment identifies the subject interchange and indicates interchange receipt, containing references to the UNA, UNB, and UNZ segments, and has a max occurrence of 1, so it reports the first error encountered in one of the control segments. If the problem is deeper than the envelope, a UCM segment identifies a message segment and indicates the nature of any error, and a UCD segment identifies an erroneous composite or component data element.

The three failure patterns that show up most often in practice:

  • Missing mandatory NAD party. SG11 requires full coverage of the parties DB Schenker expects for that shipment type. Leave out the notify party on a cross-border move and you'll get a UCM pointing straight at the NAD segment position.
  • Wrong TOD qualifier. Incoterm codes are easy to typo and the validator won't always catch a code that's syntactically valid but semantically wrong for the trade lane. This one often slips past CONTRL and only surfaces when the shipment stalls at planning.
  • Reused or out-of-sequence interchange control numbers. A CONTRL receipt reports a status of "Rejected" when the incoming EDIFACT message is a duplicate or there are errors in the envelope. If your TMS retries a failed send without incrementing the control number in UNB, DB Schenker's gateway will treat it as a duplicate and reject it outright, even if the underlying content is now correct.

The fix is always the same sequence: isolate the rejected interchange using the UCI/UCM/UCD codes, diff it segment-by-segment against DB Schenker's implementation guide example, correct the field, and resend with a fresh control number. Never reuse a rejected control number. It muddies your audit trail and, per the pattern above, can trigger a duplicate rejection on its own.

Where EDIFACT Fits Next to Your API-First Carriers

Most shipper TMS stacks run EDIFACT for legacy EU forwarders like DB Schenker alongside REST and webhook integrations for parcel and regional carriers. Platforms like MercuryGate, Descartes, and Transporeon each take their own approach to abstracting this complexity, and multi-carrier connectors such as Cargoson, Sendcloud, and EasyPost generally aim to hide the raw segment strings from your downstream systems entirely, exposing a normalized shipment object instead.

The practical pattern worth adopting: wrap your IFTMIN/IFTMCS/IFTSTA loop behind the same abstraction layer you already use for webhook-based carriers, so your dispatch, tracking, and exception dashboards never need to know whether a given shipment is riding on EDIFACT or a JSON webhook underneath. If you're evaluating multi-carrier connectivity tools for exactly this kind of hybrid stack, this is the detail to press vendors on during the demo, not whether they support "EDI" as a checkbox.

Copy-Paste Mini-SOP

Keep this close to your desk during hypercare after any DB Schenker partner profile change, including the post-DSV re-verification many shippers are running right now following the carrier's 2025 acquisition.

  • Pre-send: validate every outbound IFTMIN against DB Schenker's current implementation guide, not just the base D.96A schema, before it leaves your TMS.
  • Control-number log: record every UNB interchange control number, timestamp, and order ID in a single queryable table. Never resend under a reused number.
  • CONTRL timeout escalation: if no CONTRL arrives within 30 minutes, treat it as a transmission failure, not a business delay, and escalate to your AS2/OFTP2 connectivity contact first.
  • IFTSTA timeout escalation: if no IFTSTA arrives within 24 hours of a positive CONTRL, escalate to DB Schenker's operations desk, referencing both your internal order ID and their shipment reference.
  • Resend ownership: name one person per shift during hypercare who owns corrections and resends. Don't let two admins fix the same rejected interchange in parallel.

Run this checklist for your first two weeks on any new or re-verified DB Schenker connection, then fold it into your standard exception-handling SOP once rejection rates settle.