Documentation

Support

In-App Purchasing

In-App Purchasing

Purchases

Retrieve purchase information and determine purchase status for products bought by players.
Read time 3 minutesLast updated 10 hours ago

Unity IAP fetches purchase information from the store so your application can recognize and fulfil what players have bought. This ensures that your game can deliver content or entitlements to users based on their purchase history, even if they bought items outside your app or on another device. A purchase is represented as an
Order
object. The
Order
contains all relevant details about the purchase and provides information needed to track and manage it with the store.

Retrieve purchases

Purchases made by the user can be retrieved from the store. However, consumable products must be tracked by your application after they are consumed, because stores don't return consumables that have already been fulfilled. For non-consumable products and subscriptions, the store accurately returns these purchases when you call
FetchPurchases
or
CheckEntitlement
.

Determine purchase status

You can determine the status of a purchase in two ways:
  • Use
    Order
    to determine if the
    Order
    is a
    PendingOrder
    ,
    ConfirmedOrder
    ,
    DeferredOrder
    or
    FailedOrder
    .
  • Use
    CheckEntitlement
    to receive
    EntitlementStatus
    , which returns
    EntitledButNotFinished
    ,
    EntitledUntilConsumed
    ,
    FullyEntitled
    ,
    NotEntitled
    or
    Unknown
    .

Purchase attributes

Attribute

Description

transactionId
A unique identifier for the purchase.
product
The purchased product.
quantity
The quantity of the product purchased.
receipt
Receipt data for validating the purchase with the store.

Purchase states

State

Description

Pending
The purchase has been paid but not yet fulfilled.
Confirmed
The purchase has been fulfilled and acknowledged.
Failed
The purchase failed due to an error.
Deferred
The purchase is waiting for payment.

Process purchases

The
OnPurchasePending
callback is invoked when a purchase is made and is awaiting fulfillment. Your application should fulfill the purchase at this point, for example by unlocking local content or sending the purchase receipt to a server to update a server-side game model.
Note that
OnPurchasePending
may be called at any point following a successful initialization. If your application crashes during execution of the
OnPurchasePending
handler, then it is invoked again the next time Unity IAP initializes. Consider implementing your own de-duplication logic.
// Handle restore on initializationprivate async void Start(){ // Setup, e.g. add listeners to your StoreController... await m_StoreController.Connect(); // Fetch previous purchases (includes confirmed orders) m_StoreController.FetchPurchases();}// Handle new purchases and pending transactionsprivate void OnPurchasePending(Order order){ ProcessPurchase(order);}// Handle fetched purchases (includes previously confirmed orders)private void OnPurchasesFetched(Orders orders){ foreach (var confirmedOrder in orders.ConfirmedOrders) { ProcessPurchase(confirmedOrder); }}// Your ProcessPurchase logicprivate void ProcessPurchase(Order order){ var productId = order.Info.PurchasedProductInfo[0].productId; if (IsNonConsumable(productId)) { // Grant non-consumable product GrantProduct(productId); } // Handle other product types as needed}

Purchase acknowledgement and reliability

Unity IAP requires you to explicitly acknowledge purchases to ensure that purchases are reliably fulfilled, even during network outages or application crashes. If a purchase is paid for but not fulfilled, Unity IAP delivers the purchase to your application the next time it initializes. This process prevents purchases from being lost when the purchase flow is interrupted or when purchases are completed while the application is offline. After successfully fulfilling a purchase, call
ConfirmPurchase
with the relevant
PendingOrder
to acknowledge the purchase to the store.

Save purchases to the cloud

If you are saving consumable purchases to the cloud, you must call
ConfirmPurchase
when you have successfully persisted the purchase.
When returning
Pending
, Unity IAP keeps transactions open on the underlying store until confirmed as processed. This ensures consumable purchases are not lost even if a user reinstalls your application while a consumable is pending.