Technical architecture · 27 October 2026 · Neerej Sasikumar
Payment Deadline vs Offer Validity: Designing Safe NDC Order Commitments
Summary: Separate Offer expiration, price and inventory guarantees, and payment commitment deadlines. Use authoritative Order and payment state to recover from delayed authentication and ambiguous OrderCreate outcomes.
The four clocks behind one checkout
A traveller can select an Offer, enter payment details and still fail to obtain a confirmed Order. The checkout looks like one journey, but several independent clocks may be running. An Offer expiration time controls whether the Offer remains usable for later transactions. A price guarantee can cover a specific Offer Item for a defined period. An inventory guarantee, when supplied, concerns availability rather than price. A payment time limit describes when a commitment to pay is required. Confusing these clocks creates misleading countdowns, accidental repricing and orders that appear confirmed while payment is unresolved.
This guide examines the contract between shopping, payment orchestration and Order Management. The question is what to do when a customer is ready to pay but one deadline is about to pass. It is distinct from general payment routing and fraud prevention.
What the original IATA definitions say
Standards reference: IATA AIDM 20.1 Offer describes Offer Expiration Time Limit Date Time as the period for which an Offer persists for subsequent transactions. It explicitly warns that this limit does not itself guarantee price or inventory. The Offer Item definition treats price guarantee separately: once it expires, repricing or a new shopping process may be necessary. Even a valid price guarantee does not guarantee related inventory.
IATA's 20.2 Implementation Guide, Time Limits capability distinguishes a duration-based payment limit from a fixed deadline. A zero duration indicates immediate payment commitment, while an absent value supplies no advice. These are release-specific descriptions, not proof that every airline supports every optional field.
Payment deadlines attach to commitments
Standards reference: The AIDM Order Item defines Payment Time Limit as the time by which commitment to pay is required. Its notes anticipate removal of an Order Item after expiry, subject to the actual implementation contract. The AIDM 24.1 Order Item model also documents inventory guarantee identifiers and limits independently.
Do not display a generic message that the seat is held simply because a timer exists. An Offer can remain retrievable after its price guarantee has ended. After Order creation, the relevant payment deadline may belong to the Order Item rather than the earlier shopping Offer. A seller should display the authoritative commitment state, not an invented frontend countdown.
Build a four-clock contract
Practitioner recommendation: Store offerExpiresAt, priceGuaranteedUntil, inventoryGuaranteedUntil and paymentCommitmentDueAt as distinct optional fields. Preserve the source message, identifier, original offset and time-zone interpretation for each. Missing means unknown, not unlimited validity. Record which deadline belongs to an Offer and which belongs to an Order Item.
Compare deadlines using server time. A customer countdown may be derived from a server-issued safe deadline, but must refresh after authentication, reload or session resume. Do not trust the device clock for a booking decision. A small internal safety margin can protect against latency, but its duration is a local engineering policy, not an IATA rule. Avoid hiding the actual deadline in a single generic expiresAt field.
Worked example: the clocks disagree
Imagine an illustrative Offer returned at 10:00 UTC. It expires at 10:12, its price guarantee ends at 10:08 and no inventory guarantee is supplied. A customer starts payment authentication at 10:07 and returns at 10:09. The Offer may still be available for a follow-up transaction, but the original price cannot be assumed guaranteed. Nor can availability be assumed. The seller needs authoritative confirmation or repricing, not silent submission of the old amount.
Now suppose an Order was created at 10:06 with an explicit payment commitment deadline of 10:20. At 10:09 the seller should inspect the Order and payment state, rather than treating the original Offer expiry as if no Order existed. The business object governing the next step has changed.
Boundary decision table
| Observed state | Recommended response | Unsafe assumption |
|---|---|---|
| Offer expired before OrderCreate | Refresh shopping or obtain a new Offer | Old Offer ID is usable |
| Price guarantee expired, Offer still valid | Reconfirm price before commitment | Displayed total is guaranteed |
| Inventory guarantee absent | Validate with authoritative sell process | Seat is reserved |
| Order created, payment pending | Retrieve Order and payment state | OrderCreate must be retried |
| Payment deadline passed | Retrieve current Order; follow supplier rules | Local timer proves cancellation |
This is an independent decision framework, not a mandated IATA state machine. Exact exchanges, authority and cancellation behaviour depend on the airline integration, commercial agreement and message release.
Keep payment and Order creation recoverable
Practitioner recommendation: Treat authorization, OrderCreate and Order retrieval as separately observable operations. Generate a stable checkout attempt identifier before initiating payment. Persist selected Offer and Offer Item identifiers, amount, currency, deadline snapshot, authentication state and provider reference. Authorization success is evidence about payment processing, not proof that an airline Order exists.
If OrderCreate times out, do not repeat it blindly. First reconcile through the airline's supported retrieval or reference mechanism and the payment provider's transaction status. Move the checkout to outcome_unknown until it can distinguish confirmed Order, rejected Order and processing still in progress. Replaying payment without checking the first attempt risks duplicate charges; replaying OrderCreate without reconciliation risks duplicate Orders. Recovery must be designed for the particular supported API.
Authentication consumes real time
Issuer challenges, wallet redirects and customer authentication can consume the remaining validity window. On return, query authoritative payment and Order state before enabling another Pay action. If the Offer expired and no Order exists, refresh commercial terms. If an Order exists with payment outstanding, follow the Order Item's payment commitment rules. If authorization exists but no Order can be confirmed, route the attempt to reconciliation and potential reversal under provider rules.
Customer messaging should distinguish payment processing, Order confirmed and outcome under verification. Avoid saying booking is guaranteed merely because a browser callback reports success. The customer should never be asked to pay again while the first payment's outcome remains unknown.
Illustrative internal contract
This JSON is an internal design example, not an IATA schema or prescribed API. Optional guarantees remain separate and an absent value is explicit.
{
"checkoutAttemptId": "CHK-2048",
"offerId": "OFF-481",
"offerItemIds": ["ITEM-1"],
"offerExpiresAt": "2026-10-27T10:12:00Z",
"priceGuaranteedUntil": "2026-10-27T10:08:00Z",
"inventoryGuaranteedUntil": null,
"paymentCommitmentDueAt": null,
"paymentState": "authentication_pending",
"orderState": "not_created",
"sourceRelease": "implementation-specific"
}When an Order is created, attach its authoritative Order ID and Order Item deadlines without overwriting the historical Offer snapshot. An absent payment limit must not be converted into an arbitrary grace period. Store correlation identifiers and a transition history so payment operations can reconstruct exactly what the seller knew at commitment time.
When price changes after authorization
A difficult edge case arises when a payment provider has authorized an amount but the Offer must be repriced before Order creation. The new price cannot simply be attached to the old authorization without checking provider rules. Compare amount and currency, determine whether new customer consent or authorization is required, and reconcile or reverse the previous authorization according to the provider contract.
Use a strict commercial-consent boundary: the traveller should approve a material price or product change before the seller commits a revised Order. Some airlines support specific repricing or confirmation flows; verify them rather than assuming that a generic payment API makes an old Offer usable again.
Treat missing guarantees as unknown
Optional fields require defensive interpretation. An absent price guarantee is not a guarantee without an end date. An absent inventory guarantee is not evidence of a held seat. An absent payment deadline is not permission to leave an unpaid Order open indefinitely. Record these distinctions in interface documentation and user experience copy.
Legacy integrations may expose ticketing deadlines or reservation controls rather than the same modern field names. During coexistence, map their operational meaning only after validating it. Do not assume a ticketing time limit, Offer expiry and payment deadline are interchangeable. This is especially important when a seller supports multiple carriers, channels and mixed legacy and Offer and Order flows.
Boundary tests and operational measures
Practitioner recommendation: Test one second before and after Offer expiry; before and after price guarantee expiry; missing inventory guarantee; zero payment duration; fixed and missing payment limits; and an Order created just before Offer expiry. Add delayed authentication, authorization success followed by OrderCreate timeout, duplicate callbacks, provider retry and a browser refresh during an unknown outcome.
Assert the customer message, payment amount, number of OrderCreate calls, number of authorizations, final Order Item state and audit trail. Track offer_expired_at_commit_rate, reprice_after_auth_rate, payment_deadline_miss_rate and authorization_without_order_count. Segment by channel and payment method without logging sensitive card data. These metrics and thresholds are proposed engineering controls, not IATA service levels.
Implementation plan and source notes
First inventory time-limit elements received across shopping, pricing, OrderCreate and OrderView. Then build the server-side clock contract and customer-facing states. Connect payment references to Order retrieval and test recovery under network faults. Finally, review unresolved outcomes with payment operations and customer servicing. The useful outcome is not a prettier countdown. It is a verifiable distinction between an Offer that can be selected, a price that is guaranteed, inventory that may be available and an Order that is confirmed and payable.
For related implementation context, read Payment Orchestration, Offer-to-Order telemetry and ONE Order accounting.
- IATA AIDM 20.1 Offer, expiration definition.
- IATA AIDM 20.1 Offer Item, price guarantee definition.
- IATA AIDM 20.1 Order Item, payment limit definition.
- IATA AIDM 24.1 Order Item, inventory guarantee fields.
- IATA Implementation Guide 20.2, Time Limits and Order Management.
- ATPCO NDC Solutions AirShopping Response 2017.2, version-specific mapping.
Editorial scope: Public standard definitions are identified as such. JSON, states, metrics, thresholds and workflows are independent illustrative recommendations, not official requirements. Verify against the applicable release, airline agreement, payment-provider rules and regulation.