Available to promiseAvailable to Promise (ATP)

The quantity of stock that can be promised to new orders right now — what's on hand, minus what's already allocated, plus what's confirmed inbound within the promise window.

By Oana Bradulet

Available to Promise (ATP) is the quantity of stock that can be promised to new orders right now — taking into account what's already committed and what's reliably inbound.

It's the answer to "can I sell this to the customer who's about to checkout?"

The basic formula:

ATP = On hand − Allocated − Reserved − Safety stock + Inbound (within promise window)

Each term changes the answer in a real way:

  • On hand — physical units in the warehouse
  • − Allocated — units already committed to existing orders (see allocated stock)
  • − Reserved — units held without a specific order (e.g. for an upcoming promo)
  • − Safety stock — the buffer you don't want to dip into
  • + Inbound — confirmed POs arriving within the promise window the customer is willing to accept

Skip any of these and ATP misrepresents reality.

Why ATP exists separately from on-hand

Two reasons:

  • Customer-facing answer. The website needs to show "in stock" to the next visitor. That has to mean available to them, not "exists in the warehouse."
  • Order acceptance. Sales operations need a single number to decide whether to confirm a B2B order. Confirming based on on-hand alone causes overselling.

ATP is the metric that gets exposed in checkout flows, sales dashboards, and customer-service screens. On-hand is for warehouse and finance.

ATP windows

The "+ Inbound" term depends on what window you're willing to promise to. Examples:

  • D2C "in stock" badge. Usually no inbound — only stock physically on hand counts. Customers expect 1–3 day delivery; promising against arriving stock is risky.
  • Made-to-order or pre-order flow. Inbound counts heavily; the customer has accepted a longer lead time at checkout.
  • Wholesale order entry. Inbound within the customer's accepted ship window counts. A retailer ordering for delivery in 6 weeks doesn't care whether stock is in the warehouse today.
  • Backorder acceptance. All inbound counts; the customer is explicitly waiting.

The same SKU can have several ATP figures simultaneously — one per channel, one per delivery window. Most modern OMS platforms let you configure these.

ATP vs CTP

Two related but distinct concepts:

  • ATP (Available to Promise). Based on existing inventory plans — answers "with what we already have or have on order, can I serve this?"
  • CTP (Capable to Promise). Goes further — "can we make the inventory in time to serve this?" Used in build-to-order manufacturing.

Most consumer brands operate ATP. Manufacturers and configured-to-order businesses use CTP.

Worked example

A SKU's status:

  • On hand: 1,000 units
  • Allocated to existing orders: 600
  • Reserved for tomorrow's promo: 200
  • Safety stock target: 50
  • Inbound PO arriving in 3 days: 800
  • Inbound PO arriving in 21 days: 1,200

For a D2C 1-day-shipping promise (no inbound):

ATP = 1,000 − 600 − 200 − 50 = 150 units

For a wholesale 14-day-ship promise (3-day inbound counts):

ATP = 1,000 − 600 − 200 − 50 + 800 = 950 units

For a backorder explicitly accepting 4-week ship (both inbounds count):

ATP = 1,000 − 600 − 200 − 50 + 800 + 1,200 = 2,150 units

Same SKU. Three very different ATPs depending on the promise window.

Where ATP breaks

Common operational failures:

  • Out-of-date allocation. Cancelled orders not releasing allocations means ATP shows lower than reality.
  • Inbound POs trusted that are actually slipping. A PO marked as arriving in 3 days that actually arrives in 10 promises stock the customer can't get on time.
  • Multi-location confusion. Total ATP across all warehouses can be high while the warehouse that ships to a specific customer is empty.
  • Channel-allocation conflicts. Single ATP pool shared across channels means D2C can sell out the wholesale buffer (or vice versa).

Each of these is solved with policy: explicit channel splits, conservative inbound trust windows, location-aware ATP, automated allocation release.

ATP in promotional periods

ATP is most stressed during promos because the rate of change is fastest. A flash sale can drop ATP from 500 to 0 in minutes; if the system isn't updating in near-real-time, customers continue to see "in stock" and get cancellation emails an hour later.

The defence: real-time ATP propagation, explicit allocation rules, automatic safety-stock buffers that prevent the headline ATP from going negative even when demand spikes.

Formula

ATP = On hand − Allocated − Reserved − Safety stock + Inbound (within promise window)
On hand
= Sellable physical stock at the location
Allocated
= Units committed to existing customer orders
Reserved
= Units ring-fenced without a specific order (e.g. for promo)
Safety stock
= Buffer you don't want to dip into
Inbound
= Confirmed POs arriving within the customer's accepted ship window

Worked example

On hand 1,000, allocated 600, reserved 200, safety 50. D2C 1-day-ship ATP = 1,000 − 600 − 200 − 50 = 150. Wholesale 14-day-ship ATP, with a 3-day inbound of 800 = 150 + 800 = 950. Same SKU, different ATPs per promise window.

Common mistakes

  • Reporting one ATP figure across all channels and promise windows. ATP depends on what the customer is willing to wait for.
  • Trusting inbound POs without a delivery confidence threshold. POs that slip turn confirmed orders into customer-service problems.
  • Slow ATP updates during promos. Customers see in-stock at minute 1 and a cancellation at minute 30. Real-time matters most when demand is moving fast.
  • Forgetting safety stock in the formula. The headline ATP shouldn't include the buffer you don't actually want to draw down.

How Lumina handles available to promise for scaling brands

Lumina uses available stock — not just what's on hand — as the starting point of your forward projection, so your plan draws down from what you can genuinely sell, not stock that's already spoken for.

Frequently asked questions

What is available to promise (ATP)?
ATP is the quantity of stock that can be promised to new orders right now — what's on hand, minus what's allocated to existing orders, minus reserved and safety stock, plus confirmed inbound within the promise window.
How is ATP calculated?
ATP = On hand − Allocated − Reserved − Safety stock + Inbound (within promise window). The 'Inbound' term depends on what window the channel is promising — D2C 1-day-ship usually excludes inbound; wholesale 14-day-ship usually includes it.
What's the difference between ATP and on-hand stock?
On-hand is total physical units. ATP is the subset of those that can actually be sold to new orders, after subtracting allocations, reservations, and safety stock. Selling against on-hand instead of ATP is the most common cause of overselling.
What's the difference between ATP and CTP?
ATP (Available to Promise) is based on existing inventory plans — can we serve this with what we have or have on order? CTP (Capable to Promise) goes further — can we make the inventory in time? CTP is used in build-to-order manufacturing; consumer brands typically use ATP.
Can the same SKU have different ATPs?
Yes — and usually should. ATP changes with the promise window. A SKU offered as next-day delivery has a tighter ATP (no inbound counts) than the same SKU offered as a 3-week pre-order (all confirmed inbound counts). Most modern OMS platforms support multiple ATP views per SKU.

Related terms