> For the complete documentation index, see [llms.txt](https://developers-apps-in-toss.toss.im/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers-apps-in-toss.toss.im/guide/en/monetization/in-app-payment.md).

# In-app payments

Connect Apps in Toss in-app payments and easily sell digital products, permissions, and content. Shortening the purchase flow makes it easier for users to pay and can quickly increase revenue.

### What in-app purchases are

In-app purchases are a payment method that lets users buy paid items directly inside the app. Users can pay for the features, items, or content they need without leaving the app. In-app purchase items are divided into consumable items and non-consumable items.

* **Consumable items:** These are items that disappear after use. To use them again, you need to buy them again. (e.g. game items, coins, hint passes)
* **Non-consumable items:** These are items you can keep using after buying once. (e.g. unlocking premium features, removing ads, access to specific content)

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2FQ8oGeiB5LAaJQsBNJloN%2Fimage.png?alt=media&#x26;token=96af789b-aebd-417f-874b-d0f38d4768cd" alt=""><figcaption></figcaption></figure>

***

### Benefits of in-app purchases

* Users can pay right away without leaving the app, which can reduce drop-off during checkout.
* You can generate revenue right from the early stage of app launch by selling paid items or subscription products.
* You can create a variety of payment models by combining consumable and non-consumable items.
* You can increase revenue more by offering products that fit the intended use.

{% hint style="info" %}
**Please note**

* Refunds for in-app purchases follow Apple and Google policies.
* The selling price is the amount after adding VAT to the supply price.
* While payment is in progress, pause in-app features such as music or video playback temporarily, and make sure they resume automatically after payment is completed.
  {% endhint %}

***

### Set up in the console

#### 1) Register business information

To integrate in-app purchases, you must first register your business information. Business information must be registered before you can proceed to the next steps: agreeing to the terms and entering settlement information. See the following [guide](https://developers-apps-in-toss.toss.im/guide/operation/register-business)for details.

#### 2) Enter settlement information

To receive settlement for in-app purchase revenue, [register settlement information](https://developers-apps-in-toss.toss.im/guide/settlement)you must. Enter the settlement information in the workspace's 'Info' tab, then request review. Review takes an average of 2–3 business days.

#### 3) Register in-app products

If you enter product information accurately, users can clearly understand what they are purchasing, and you can reduce disputes and refund issues during operations.

There is a limit to the number of products you can register. Game mini apps can have up to 80, and non-game mini apps can have up to 30.

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2FWEVxGawwAyHNKpTtQjK6%2Fimage.png?alt=media&#x26;token=d04f46a5-d324-4cb4-9551-8eeab755b74d" alt=""><figcaption></figcaption></figure>

**Product type**

Please choose the type according to how the product is used. Products that are cash-equivalent or can be converted to cash, or products bundled with Toss points, cannot be sold.

* Consumable: These are products that are used up when used. To use them again, you must repurchase them. (e.g. game items, internal currency top-up, one-time pass)
* Non-consumable: These are products you can keep using after buying once. (e.g. ad removal, owned content)
* Auto-renewing subscription: Payments recur automatically at a fixed interval, and the service remains available until canceled. (e.g. monthly membership, recurring content subscription)

**Product name**

* The product name should clearly reflect the functions and conditions the user receives.
* Please write it to match the actual offering.
* Exaggerated or misleading wording cannot be used. For example, if the usage period is limited, you cannot say 'unlimited.'

**Product image**

* Please create it so users can understand the product intuitively.
* You can include text needed for identification, such as '30-day pass' or '100 coins.'
* If you include promotional wording, be sure to also display the event period.
* The resolution must be registered as 1024 × 1024px.
* Only use images that do not raise copyright issues, and the partner company must obtain the images directly.
* You cannot use images that are sexually explicit, violent, or may cause discomfort.

**Supply price**

* The supply price is the amount excluding VAT.
* You can set it from a minimum of 400 KRW to a maximum of 1,400,000 KRW.
* You can only enter amounts in units of 10 KRW.
* When you enter the supply price, the selling price is calculated automatically. The feature to enter the selling price first and automatically calculate the supply price is not supported at this time.

**Selling price**

The selling price is the final amount the user actually pays. It is automatically set to the amount after VAT is added to the supply price.

**Consumable discount**

You can set discount benefits for in-app products of the consumable type. In the in-app product list in the console, click the '+ Discount' button shown on the consumable product you want to display, and register the discount details. When setting a discount, enter the discounted supply price, discount period, and discount target. Once discount settings are completed, they cannot be edited.

There are three discount targets.

* All users: Apply the discount regardless of payment history.
* Users with no payment history: Apply the discount to users who have never made a purchase.
* Users with payment history: Apply the discount to users who have purchase history.

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2FOfV0TEWiEjCUpbiqujWn%2F%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%8B%E1%85%A2%E1%86%B8%E1%84%89%E1%85%A1%E1%86%BC%E1%84%91%E1%85%AE%E1%86%B7%20%E1%84%85%E1%85%B5%E1%84%89%E1%85%B3%E1%84%90%E1%85%B3%2047%20(1).png?alt=media&#x26;token=dade1730-dd18-49ff-bc40-064f62fd7f1d" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2FqV00eI3NVlVy64ecTTgz%2Fimage.png?alt=media&#x26;token=662c0467-46ed-4e74-a861-59e26b7cc855" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Please note**

* Users who have already purchased a discounted product cannot receive an additional discount even if they are eligible.
* Refunded payments are also included in purchase history.
* Discounted products can also be purchased with the existing in-app purchase SDK. No separate SDK integration changes are needed.
  {% endhint %}

**Settings for auto-renewing subscriptions only**

If you select the auto-renewing subscription type, you can set the items below as additional options.

* **Auto-renewal cycle:** Choose the interval at which payments repeat. (Weekly: automatic payment every 7 days / Monthly: every 30 days / Yearly: every 365 days)
* **Free trial:** Users can use subscription benefits for a certain period without payment. When the free trial ends, paid billing starts automatically. Choose from 3 days, 1 week, 2 weeks, or 1 month.
* **New subscription discount:** Offer a discounted price for a certain period to users who are starting a subscription for the first time. When you enter the discount period and discounted supply price, the discounted selling price is calculated automatically.
* **Resubscription discount:** Offer a discounted price when users who previously canceled a subscription resubscribe. When you enter the discount period and discounted supply price, the discounted selling price is calculated automatically.

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2F9UxqVhINyp7xoeoQQqS6%2FColumns%2091.png?alt=media&#x26;token=f2487a89-db2c-45a1-b6ff-37f8996388f1" alt=""><figcaption></figcaption></figure>

#### 4) Register payment notification URL

You can register a URL to receive notifications when payment status changes, such as subscription renewals or cancellations. When you register the URL, an HTTP request is sent to that URL whenever the status changes.

* Payment notification URL: Enter the server URL that will receive payment status change notifications.
* Basic Auth header: You can optionally enter a Basic Auth header value. If entered, it will be included in the HTTP header of notification requests as shown below.

{% code collapsedlinecount="10" %}

```
Authorization: Basic {Basic Auth header value}
```

{% endcode %}

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2FamRYTT5AmyJ4ArNLDALG%2F%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%8B%E1%85%A2%E1%86%B8%E1%84%89%E1%85%A1%E1%86%BC%E1%84%91%E1%85%AE%E1%86%B7%20%E1%84%85%E1%85%B5%E1%84%89%E1%85%B3%E1%84%90%E1%85%B3%2042.png?alt=media&#x26;token=7b516918-5938-4a6a-93de-c9552f0a61c4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2Fvf2Jq5yD4z1wdVaegJDN%2F%F0%9F%9F%A3%20Desktop_Modal%2038.png?alt=media&#x26;token=99491d6f-8dc9-4970-8748-0ffe4816640d" alt=""><figcaption></figcaption></figure>

#### 5) Check payment and refund history

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2FegO0ESdAx6p9IK58ui1G%2F%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%8B%E1%85%A2%E1%86%B8%E1%84%89%E1%85%A1%E1%86%BC%E1%84%91%E1%85%AE%E1%86%B7%20%E1%84%85%E1%85%B5%E1%84%89%E1%85%B3%E1%84%90%E1%85%B3%2030.png?alt=media&#x26;token=07e12b23-0f58-433e-866c-021becf9e8cd" alt=""><figcaption></figcaption></figure>

**Payment history**

This is the history of products the user paid for in the mini app.

* Delivered: This means all purchased items have been provided to the user.
* Payment complete: Payment has been made, but the purchased items have not yet been delivered.

**Refund history**

This is the history of refund requests made by users. You can check the reason for the refund request and reject or approve it. Users who paid with in-app purchases can request a refund by tapping the 'Get a refund' button in the Toss app.

Refund statuses are as follows.

* Refund request approved: The partner company approved the refund request. Once approved, a review is requested from the app market.
* Refund request rejected: The partner company rejected the refund request, or the app market rejected the refund.
* Refund complete: The refund has been completed by the app market.

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2F4uYR0JGRfVulaRzaYxAp%2F%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%8B%E1%85%A2%E1%86%B8%E1%84%89%E1%85%A1%E1%86%BC%E1%84%91%E1%85%AE%E1%86%B7%20%E1%84%85%E1%85%B5%E1%84%89%E1%85%B3%E1%84%90%E1%85%B3%2040.png?alt=media&#x26;token=1120d658-fbd9-453f-9062-881ffffe4766" alt=""><figcaption></figcaption></figure>

**Refund policy by market**

The way in-app purchase refunds are handled varies depending on the user's operating system (OS) and the market's policy.

<details>

<summary>Android</summary>

* Users request refunds directly in the Toss app.
* In the Apps in Toss console, partner companies can check requests in the 'Refund history' menu and approve or reject them.
* However, the final approval or rejection is determined by Google Play.
* The refund result is sent to the user via push notification, and the user can also check it on the order details screen. The same notification is sent if the partner company or Google Play rejects the refund.
* Please review both your internal policy and the Google Play policy before handling refund requests.

</details>

<details>

<summary>iOS</summary>

* Refunds for iOS users are fully managed by Apple. Apple directly determines and approves all refunds.
* Partner companies cannot approve or reject refunds because Apple does not provide refund request functionality externally.
* Partner companies can only check the status through the payment status inquiry API.

</details>

***

### Integrate development <a href="#develop" id="develop"></a>

After registering in-app products in the console, please integrate the flows for product list lookup, payment request, product delivery, and pending order recovery in the mini app.&#x20;

The 3.x SDK reference is divided by function, so we recommend first understanding the flow below and then checking the SDK documentation for each step.

{% hint style="info" %}
**Please check first**

The flow below is based on one-time in-app products that are completed with a single purchase, such as consumables and non-consumables. \
For auto-renewing subscriptions, integrate both the console's payment notification URL and payment status change handling.
{% endhint %}

#### Normal payment flow

1. **Fetch the product list.**

   When entering the product list screen, [`IAP.getProductItemList`](https://developers-apps-in-toss.toss.im/documentation/sdk/domains-api/iap/iap.getproductitemlist)call to retrieve the in-app products registered in the console. Use the response's `sku`, product name, price, and image information to display the list of products available for purchase.
2. **Request payment for the product selected by the user.**

   When the purchase button is pressed, with the selected product's `sku`to [`IAP.createOneTimePurchaseOrder`](https://developers-apps-in-toss.toss.im/documentation/sdk/domains-api/iap/iap.createonetimepurchaseorder)call. \
   At this time, `options.processProductGrant` you must pass the callback together.
3. **Grant the product when payment is complete.**

   When payment is completed and the order is created, the SDK calls the `processProductGrant` callback. \
   Inside this callback, `orderId`based on, record the purchase in the partner server or app storage, and deliver the product, entitlement, or content to the user. Return `true`only when the delivery process has succeeded all the way through.

   `false`If you return
4. **Process the success event and clean up resources.**

   When payment and product delivery both finish successfully, `onEvent`is called with `type: "success"`. \
   Show the payment completion screen or refresh the user's owned product information. When the payment flow ends, call the cleanup function returned by `createOneTimePurchaseOrder`to release resources.

#### Pending order recovery flow

If product delivery cannot be completed due to app closure, network errors, server errors, etc., the order may remain pending. \
To prevent situations where the user has paid but has not received the product, check for pending orders when the app starts or when entering the payment screen.

1. [`IAP.getPendingOrders`](https://developers-apps-in-toss.toss.im/documentation/sdk/domains-api/iap/iap.getpendingorders)to retrieve orders for which payment is complete but product delivery has not finished.
2. For each order, `orderId`and `sku`based on, deliver the product, entitlement, or content again. Check whether the order has already been delivered to avoid duplicate delivery.
3. If delivery succeeds, [`IAP.completeProductGrant`](https://developers-apps-in-toss.toss.im/documentation/sdk/domains-api/iap/iap.completeproductgrant)call to change the order to a completed product delivery state. If delivery fails, do not mark it complete, and leave it so it can be processed again at the next recovery point.

#### Check order status and refunds

If you need to check in the app the history of orders for which product delivery is complete or orders that were refunded, [`IAP.getCompletedOrRefundedOrders`](https://developers-apps-in-toss.toss.im/documentation/sdk/domains-api/iap/iap.getcompletedorrefundedorders)use. This function is not for recovering pending orders; use it to check already completed or refunded order history.

If you need to verify the latest status of a specific order on the server, [payment status inquiry API](https://developers-apps-in-toss.toss.im/api/iap)you can call. \
This API is server-to-server communication from the partner server to the Apps in Toss server, so mTLS certificate setup is required.

{% hint style="info" %}
**Criteria for product delivery handling**

Product delivery is the step where actual benefits are provided to the user and the result is stored in the partner system. For example, this refers to charging coins, granting ad removal privileges, or activating access to paid content. Please judge delivery as successful only after this process succeeds.
{% endhint %}

***

### Check performance

You can view the performance metrics of in-app purchases that have been developed and integrated on a single screen. Analyze revenue flow and user payment behavior together to improve product composition and operational strategy. Data is updated sequentially starting after 8:00 AM on D+1.

* Revenue metrics: total payment amount, total revenue, average revenue per payer, revenue per paying user
* User metrics: active users, paying users, new paying users, repaying users, payment rate, final conversion rate

<figure><img src="https://3177177630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8pQgXiR5QAzduV54W8Om%2Fuploads%2FPcVTPy6VJlt4t51tJBUG%2Fimage.png?alt=media&#x26;token=d172209b-2352-4dc6-909b-e6cacd2eb1a3" alt=""><figcaption></figcaption></figure>

***

### Frequently asked questions

<details>

<summary>What is the in-app purchase fee?</summary>

The in-app purchase fee is the app market fee of 15% (subject to change depending on future revenue) + Toss fee of 5%.

For details, please check Settlement Guide > In-app purchase.

</details>

<details>

<summary>I want to test in-app purchases.</summary>

You can test in-app purchases in the sandbox. Please check the guide.

</details>

<details>

<summary>What should I do if a user wants a refund?</summary>

For iOS users, please direct them to Apple Customer Support. (Apple has all authority.)

For Android users, please guide them to submit a refund request within the Toss app, as shown in the guide.

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://developers-apps-in-toss.toss.im/guide/en/monetization/in-app-payment.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
