Available-to-Promise for CPG Lines: Quote Ship Dates From Your Schedule, Not Your Gut
Available-to-Promise for CPG Lines: Quote Ship Dates From Your Schedule, Not Your Gut
A buyer calls. "Can you ship 40 pallets of the 16oz hot sauce by Thursday?" You have about four seconds before the silence gets awkward. Two bad answers are available to you.
The first is to say yes because you think the line has room — and then spend next week firefighting, bumping another customer's order, or shipping short. The second is to sandbag: quote two weeks out to protect yourself, and watch the buyer go find supply somewhere else.
There is a third answer, and it has a name: available-to-promise. ATP is the discipline that turns your master production schedule into ship-date promises you can actually keep. Instead of a gut check, you answer from the plan — the real on-hand, the real production runs, and the orders you've already committed. This post walks through what ATP is, how to compute it off your schedule, the net-versus-gross distinction that prevents double-booking, and when to escalate to its more ambitious cousin, capable-to-promise.
What ATP actually is
Available-to-promise is a business function that responds to customer order inquiries based on resource availability. Given a request, it returns two things: the quantity of the product that can be supplied and a credible delivery due date. In short, it matches incoming demand against your production plans so that order promising is grounded in reality rather than optimism.
The key thing to understand is where ATP lives in the planning stack:
forecast → master production schedule → ATP → customer commitment
ATP is not an ERP afterthought bolted on at the end. It is an output of the master production schedule (MPS). The MPS is a statement of what you expect to produce and purchase, and its explicit deliverables include the projected available balance and the quantity available to promise. When you build the schedule, you are already generating the raw material for every ship-date promise you'll make that week. ATP is just the discipline of reading it correctly.
Gross vs. net ATP — the distinction that prevents double-booking
If you remember one thing from this post, make it this. There are two flavors of ATP, and confusing them is how two customers get sold the same pallets.
- Gross ATP is the total available supply on your plan — everything the schedule says you'll have.
- Net ATP is the supply remaining to support new demand after existing customer commitments have been subtracted.
Gross is what you made. Net is what's left to sell. You promise against net, always. Promising against gross is the single most common way a scheduler over-commits a line: the number on the screen looks healthy, but half of it already belongs to orders booked last Tuesday.
A worked CPG example
Say you run the 16oz hot sauce once a week. Here's a simple time-phased picture:
| Week 1 | Week 2 | Week 3 | |
|---|---|---|---|
| On-hand (start) | 30 | ||
| Scheduled production receipt | 100 | 0 | 120 |
| Committed customer orders | 90 | 40 | 60 |
| Projected available balance | 40 | 0 | 60 |
On-hand is 30 pallets. A production run of 100 lands in Week 1. You already have 90 pallets of orders booked due in Week 1.
Net ATP in Week 1 = on-hand + this period's receipt − all committed orders due before the next scheduled receipt.
The next receipt is in Week 3, so Week 1's and Week 2's commitments both draw against Week 1 supply:
Net ATP = 30 + 100 − (90 + 40) = 0
So when that buyer asks for 40 pallets by Thursday (Week 1), the honest answer is zero available from the current plan — even though you're "making 100 this week." Gross says 130 on hand. Net says you've sold every one of them. If you'd quoted off gross, you'd have just double-booked the line.
Week 3's run of 120 against 60 of commitments leaves 60 pallets of net ATP — a credible promise for a later ship date. This is cumulative or look-ahead ATP: promising beyond the first bucket by reading forward to the next uncommitted supply.
The inputs that feed this calculation are always the same three families: current stock, planned receipts (production orders, purchase orders, planned orders), and planned requirements (sales orders, deliveries, reservations). Get those three clean and ATP computes itself.
Push vs. pull ATP — which fits your line
There are two broad philosophies for how ATP gets its numbers.
Push-based ATP computes available quantities and dates from forecasts, classically straight off the MPS. You plan production ahead of demand, then promise against the plan. It's a natural fit for make-to-stock, high-volume CPG — your stable movers that run on a production wheel. Its weakness is inherited: push ATP is only as good as your forecast. If the forecast is wrong, the promises are built on sand. (This is why forecast value added and tracking signal discipline matter upstream of promising.)
Pull-based ATP dynamically allocates resources in response to actual orders — it consumes supply as orders land rather than committing it to a forecast. It's more responsive, but allocating with each incoming order can be myopic: a strict first-come-first-served rule will happily hand your last promo pallets to a small order that happened to call at 9 a.m., leaving nothing for the key account that calls at 2 p.m.
Most real CPG operations run a hybrid. You allocate scarce, high-stakes SKUs — promotional packs, new-item launches, key-account volume — and open general ATP freely on your stable, abundant movers. Knowing which SKUs deserve which treatment is exactly the kind of decision ABC/XYZ segmentation is built to inform, and it leans on where your customer order decoupling point sits.
Real-time vs. batch promising
ATP can also run in two execution modes, and the right one depends on how orders arrive.
- Real-time ATP: each order triggers an availability check before a delivery commitment is made. Check and commit, one order at a time. This is what e-commerce and key-account desks need — an instant, binding answer.
- Batch ATP: the system periodically checks availability for orders accumulated over an interval, then allocates across the pool. This fits classic DSD and retail replenishment windows, where orders arrive in waves against a cutoff.
The trade-off is speed versus fairness. Real-time gives the fastest answer but commits greedily in arrival order. Batch waits, but lets you allocate the pool rationally — satisfying your most important customers first instead of whoever hit submit earliest. Neither is "better"; match the mode to how your channel actually orders.
When ATP says no: stepping up to capable-to-promise
Sometimes net ATP comes up short — like the zero in our Week 1 example. The next question isn't "sorry, no." It's capable-to-promise (CTP): could we marshal available capacity and materials to make more by the requested date?
Where ATP interrogates the existing plan, CTP interrogates the production system itself. It asks whether there's open line time, whether the ingredients and packaging are on hand, and whether you could slot an extra run before Thursday. The operations literature treats this as "advanced ATP" — order promising that reaches past static inventory into real capacity.
CTP only works if it's honest about three constraints your scheduler already knows cold:
- Changeover time. Squeezing in an extra run means a changeover, and that time is capacity you don't get back. (See the hidden cost of changeovers and sequence-dependent changeover scheduling.)
- Real run-rate, not nameplate. CTP must plan against your OEE-based schedulable run-rate, not the line's theoretical speed. Promising at nameplate is how CTP becomes the next firefight.
- Time fences. If the requested date falls inside your frozen zone, the schedule is locked for good reasons — see time fences and the frozen zone. CTP can offer to add capacity in the slushy or liquid zone; it should not casually blow up a frozen schedule.
Before a CTP promise, a quick rough-cut capacity planning check confirms the extra run is even feasible against your constrained resources.
ATP guardrails for CPG schedulers
A practical checklist you can tape to the monitor:
- Promise net, never gross. Subtract existing commitments before you quote a single pallet.
- Respect time fences. Don't promise inside the frozen zone just because the ATP number looks available.
- Allocate before you open. Reserve supply for promotions and key accounts before general ATP goes live, so first-come-first-served doesn't strand your most important orders.
- Account for shelf life. Promised stock must be sellable stock. Don't commit product that will expire before it reaches the customer — see shelf-life-constrained scheduling.
- Feed it real numbers. ATP is only as honest as its inputs: live on-hand, actual scheduled receipts, every committed order, and a run-rate that reflects the floor.
Did the promise hold? Metrics that keep ATP honest
A promise discipline needs a scorecard. Track:
- On-time-in-full (OTIF): the share of orders delivered complete and on the promised date. The ultimate verdict on your promising.
- Promise reliability / date-adherence: did you ship on the date you quoted? A high over-commitment rate here means you're promising gross or ignoring time fences.
- Over-commitment rate: how often did bookings exceed net ATP? This is your early warning that double-booking is creeping back in.
When these numbers are healthy, the downstream payoff is exactly the theme from stop firefighting stockouts: fewer emergency reruns, fewer robbed allocations, fewer apologetic calls.
How CPG Scheduler fits
CPG Scheduler runs the ATP check against your live schedule rather than a stale snapshot — netting existing commitments automatically, respecting time fences and shelf life, and escalating to a capacity-aware CTP check when net ATP comes up short. Because it's headless and agentic, the order desk can get a grounded, binding answer in the moment the buyer is still on the phone.
TL;DR
- ATP answers order inquiries from your plan, returning a quantity and a credible due date. It's an output of the MPS, not a guess.
- Promise net, not gross. Net ATP = on-hand + scheduled receipts − orders already committed before the next receipt. Gross-based promising double-books the line.
- Push ATP reads from the forecast/MPS (great for stable movers); pull ATP allocates as orders land (responsive but myopic). Most CPG lines run a hybrid.
- Real-time promising is fast and greedy; batch promising is slower but fairer. Match it to your channel.
- When ATP says no, escalate to capable-to-promise — but keep it honest with real changeover time, OEE run-rates, and time fences.
- Score it with OTIF, date-adherence, and over-commitment rate.
Sources
- Available-to-promise — https://en.wikipedia.org/wiki/Available-to-promise
- Master production schedule — https://en.wikipedia.org/wiki/Master_production_schedule
- Advanced available-to-promise: classification, selected methods and requirements — https://www.sciencedirect.com/science/article/abs/pii/S0925527304002452
- ASCM/APICS CPIM — Master Planning & order promising — https://www.ascm.org/globalassets/ascm_website_assets/docs/ecm/ecm-CPIM9.pdf
- The Definitive Guide to Inventory Ordering — https://www.netstock.com/blog/the-definitive-guide-to-inventory-ordering/
More from the journal
Johnson's Rule: Sequence Your Mix-and-Pack Runs to Shrink Total Makespan
On a two-stage CPG line, finish time isn't the sum of run times — it's the makespan. Johnson's rule re-orders the same jobs to finish the whole set sooner, with zero new equipment. Here's the algorithm, a worked mix-to-pack example, and the CPG fine print.
OTIF Starts on the Line: Scheduling to the Must-Arrive-By Date
OTIF is a retailer-compliance scorecard that grades whether you delivered the right product, in full, on the must-arrive-by date. It's a scheduling problem before it's a logistics one — here's how to build a schedule that survives it.
SMED Changeover Reduction: Convert Internal Setup to External and Break the 10-Minute Barrier
Most schedulers optimize the order of changeovers. SMED shrinks the duration of each one. Here's how to measure a changeover correctly, separate internal from external setup, and convert the two into smaller, fresher production runs.