EnableYourData.com

KPI · Logistics

OTIF (on time in full): formula and example.

OTIF (on time in full) is the percentage of orders delivered to the customer both on time and complete. An order only counts if both conditions are met. OTIF therefore combines on-time delivery and fill rate into one stricter measure.

OTIF (on time in full) formula

Orders delivered on or before the promised date and in full ÷ total orders delivered × 100%

Worked example

In May 2026 Acme Groothandel delivered 3,000 orders. Of these, 2,820 were on time, and 2,700 of those 2,820 were also complete. OTIF is 2,700 ÷ 3,000 × 100% = 90.0%.

Fictitious figures for Acme Groothandel, a sample wholesaler.

How to read this KPI

A higher OTIF means customers more often get exactly what they expect, when they expect it. When it drops, check which part fails: on time or in full, because the causes sit in different teams. Compare with the OTIF terms agreed with key customers and by customer, carrier or product group.

Pitfalls with OTIF (on time in full)

  • Customer and supplier using different definitions of on time, such as the day or the time slot.
  • Counting orders the customer asked to split as not in full.
  • Calculating on shipments when the customer measures on orders.

SQL & DAX

Calculating OTIF (on time in full) in SQL and DAX

Two examples on a fictitious data warehouse for Acme Groothandel: a PostgreSQL query and a measure for a Power BI model. Adjust table and column names to your own model.

SQL · PostgreSQL
WITH per_order AS (
  SELECT order_id,
         MIN(promised_date) AS promised_date,
         MAX(delivered_at)::date AS delivered_date,
         BOOL_OR(complete) AS delivered_complete
  FROM shipments
  WHERE delivered_at IS NOT NULL
  GROUP BY order_id
)
SELECT date_trunc('month', delivered_date) AS month,
       COUNT(*) AS orders,
       COUNT(*) FILTER (WHERE delivered_date <= promised_date) AS on_time,
       ROUND(100.0 * COUNT(*) FILTER (WHERE delivered_date <= promised_date AND delivered_complete)
             / NULLIF(COUNT(*), 0), 1) AS otif_pct
FROM per_order
GROUP BY 1
ORDER BY 1;
DAX · Power BI
Delivered Orders = DISTINCTCOUNT(OrderDelivery[OrderID])
OTIF % = DIVIDE(CALCULATE(DISTINCTCOUNT(OrderDelivery[OrderID]), OrderDelivery[OnTime] = TRUE(), OrderDelivery[InFull] = TRUE()), [Delivered Orders])

In ENABLE

Tracking this KPI in ENABLE

Plain-language questions

Ask for OTIF (on time in full) per month, customer or product in the SQL Explorer with AI. The AI writes the SQL, you see the query and run it yourself; the AI only receives metadata.

Read more →

In your Power BI dashboard

Define the KPI as a measure in your Power BI model and show it in the portal, with "Last refreshed" next to it. Access profiles and optional row-level security decide who sees which figures.

Read more →

Custom dashboards (pilot)

Add the KPI as a tile to a custom dashboard, compared with last year. The Dashboard Builder is a pilot and can be switched on per client.

Read more →

Monthly targets

With the built-in Targets app you set a target for the KPI per month, so you see actuals and target side by side.

Read more →

FAQ

Frequently asked questions

How do you calculate OTIF?

Count the orders delivered both on or before the promised date and complete. Divide by the total number of orders delivered in the same period. An order that is on time but incomplete does not count.

Why is OTIF lower than on-time delivery?

OTIF applies two conditions at once: on time and in full. Every order that is on time but incomplete drops out. That makes OTIF always equal to or lower than both on-time delivery and fill rate.

Is OTIF measured per order or per order line?

Both are used. Large retailers often measure per order line or even per unit, and some apply penalties when the score falls short. When agreeing terms with a customer, always check which version and time window they use.

Use AI on your own data. Securely, and without the headache.

In an online demo we show how ENABLE makes your data securely available and how you build on it: describing an app in the AI Builder, plain-language questions, dashboards and APIs. And how we set it up and manage it for you.