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.
KPI · Logistics
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.
Orders delivered on or before the promised date and in full ÷ total orders delivered × 100%
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.
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.
SQL & 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.
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;Delivered Orders = DISTINCTCOUNT(OrderDelivery[OrderID])
OTIF % = DIVIDE(CALCULATE(DISTINCTCOUNT(OrderDelivery[OrderID]), OrderDelivery[OnTime] = TRUE(), OrderDelivery[InFull] = TRUE()), [Delivered Orders])In ENABLE
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.
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.
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.
With the built-in Targets app you set a target for the KPI per month, so you see actuals and target side by side.
FAQ
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.
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.
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.
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.