Scan It LabsPW Scan IT BV
Guides · Sales

How to measure customer OTIF in D365

Every customer asks for it, every sales meeting quotes it, and D365 F&O has no standard OTIF report per customer. The number is easy to calculate once you decide what "on time" and "in full" mean, and that decision is the hard part.

By Pieter Willaert, D365 F&O consultant · Updated 14 October 2026

First decide what you measure

OTIF is the share of order lines (or orders) delivered on time and in full. Three choices change the result more than any calculation:

  • On time against which date? A sales line has a requested and a confirmed date, each as a ship date and a receipt date. Measuring against the confirmed ship date measures your own promise and your warehouse. Measuring against the requested receipt date measures what the customer experienced, transport included.
  • Lines or orders? Per line is fairer and more useful for finding causes. Per order is what the customer feels: one missing line makes the whole order late.
  • How much tolerance? One day late, or 98 of 100 pieces: on time and in full, or not? Agree on a tolerance in days and in quantity, and write it next to the number, so everyone reads the same figure.

Where the data is in D365

You needWhere it is
The promiseThe sales order line: ordered quantity and the requested and confirmed ship and receipt dates
What was delivered, and whenThe posted packing slips (customer packing slip journal): quantity and date per line, one record per delivery
BackordersSales lines with a remaining deliver quantity after the promised date

Calculate it by hand

  1. Export the sales order lines for the period, with customer, item, ordered quantity and the date you chose as the promise.
  2. Export the posted packing slip lines for the same orders, with quantity and packing slip date.
  3. Per sales line, add up what was delivered on or before the promised date (plus your tolerance).
  4. On time: the first delivery is on or before the promised date. In full: the quantity delivered by the promised date covers the ordered quantity, within your tolerance. OTIF: both.
  5. Group by customer, and by month if you want a trend.

Excel or Power BI both work. The join between sales lines and packing slip lines (by order and line) is where most of the time goes.

Traps that change the number

  • The confirmed date moves. When an order is confirmed again with a new date, the line shows the latest promise, not the first. Measuring against it makes everyone look on time. The confirmation journals keep each version, if you want to measure the first promise.
  • Packing slip date is not delivery date. The packing slip is posted when goods leave. Measuring the customer's experience needs the transport time on top.
  • Lines that should not count. Cancelled lines, lines whose date the customer moved, samples, zero-price lines, direct deliveries from a vendor. Decide up front, and filter them out the same way every month.
  • Several deliveries per line. A line delivered in three parts is on time for the first part and late for the rest. Your definition of in full decides how that counts.

The quick way: Supply Chain X-ray

The Workspace in Supply Chain X-ray has a customer OTIF report that does the steps above for you: on time in full per customer, over the period you choose, with the backorders and the lead times behind the figure, and the tolerance you set. No export, no join, no spreadsheet to maintain.

It reads D365 as you (read-only, with your own permissions) and calculates in your browser: the order data never leaves it. And for a single late order, the X-ray side panel shows where it got stuck, which is the question that follows every OTIF number.

Using the number

OTIF on its own starts a discussion; the causes behind it end one. Look at the late lines per reason (no stock, not released, not picked in time, transport) and the improvement is usually in one or two of them, not everywhere. For your own suppliers, the same idea works the other way round: How to measure vendor performance in D365.

Menu names and behaviour can differ between D365 versions and your own setup. Check in your environment before you act.