# Refunds and disputes for D2C payments

> Understand who handles refunds, chargebacks, and player billing support for Direct-to-Consumer payments, and how Unity IAP reports them to your game.

When you sell through a Direct-to-Consumer (D2C) payment provider, that provider acts as the merchant of record (MoR). The MoR owns refunds, chargeback disputes, and player billing support, so you run those processes through your provider's dashboard or API rather than through Unity.

Unity In-App Purchasing (IAP) keeps order state in sync and tells your game what happened. It reports refunds and dispute outcomes as [order webhook events](./implement-backend.md#event-types), and it revokes the order itself in one case only: a dispute the player wins.

This page explains the division of responsibilities, how refunds and disputes each reach your game, where player support requests go, and where to monitor refund and dispute volume. For the setup that these processes build on, refer to [Integrate D2C payment providers workflow](./workflow.md).

## Division of responsibilities

| **Process**                                         | **Who handles it**            | **What Unity IAP does**                                                      |
| --------------------------------------------------- | ----------------------------- | ---------------------------------------------------------------------------- |
| Issuing and processing refunds                      | Your payment provider, as MoR | Sends `order.updated` with the refunded amount. Doesn't revoke entitlements. |
| Resolving chargebacks and disputes                  | Your payment provider, as MoR | Revokes the order and sends `order.revoked` when the player wins a dispute.  |
| Player billing and transaction support              | Your payment provider, as MoR | Nothing. You can look up an individual order through the Orders API.         |
| Tax compliance and fraud prevention                 | Your payment provider, as MoR | Nothing.                                                                     |
| Revoking entitlements that Unity IAP manages        | You                           | Removes the entitlement from the player when you set the order to `revoked`. |
| Revoking entitlements that your own backend manages | You                           | Sends the webhook events that your own systems act on.                       |
| Reporting external transactions to Apple and Google | You                           | Returns the transaction tokens you attached to the order.                    |

Where the entitlement itself lives depends on how you fulfill purchases. If Unity IAP manages entitlements, setting an order to the `revoked` status removes the entitlement from the player. If your own backend manages entitlements, the status change only records what your backend already did. Refer to [Fulfill purchases](./fulfill-purchases.md).

Unity doesn't act as merchant of record and doesn't contact players on your behalf. For the related platform compliance responsibilities, refer to [Comply with Apple and Google external purchase requirements](./external-purchase-compliance.md).

## Refunds

A refund returns a payment to the player. Refunds originate on the seller side, and either you or your provider can start one:

* You issue a refund through your provider's dashboard or API.
* Your provider's support team issues a refund on a player's behalf, after the player contacts them directly.

When your provider processes a refund, Unity IAP sends an `order.updated` [event](./implement-backend.md#event-types). The `refundedAmountMicros` field in `data.total` carries the current total refunded amount, which is smaller than `amountMicros` for a partial refund.

> **Important:**
>
> Unity IAP doesn't automatically revoke entitlements when a refund occurs. To act on a refund, listen for `order.updated` and compare `refundedAmountMicros` against `amountMicros` in `data.total`. What you do next depends on whether the refund is full or partial.

For a full refund, where `refundedAmountMicros` equals `amountMicros`, remove what the player received:

* If Unity IAP manages entitlements for your game, [update the order](./implement-backend.md#update-an-order) to the `revoked` status, which removes the entitlement from the player.
* If your own backend manages entitlements, revoke the entitlement in your system, then update the order to `revoked` so that Unity IAP order tracking matches your entitlement state.

For a partial refund, where `refundedAmountMicros` is smaller than `amountMicros`, decide what the player keeps according to your own policy. Set the order to `revoked` only when you intend to remove the whole purchase, because a `revoked` order can't move to another status.

This behavior differs from disputes, where Unity IAP revokes the order for you. Refer to [Disputes and chargebacks](#disputes-and-chargebacks).

Refund capabilities differ by provider:

* **Stripe**: issue refunds from the Stripe Dashboard or the API, in full or in part. Players can also request a refund from Onelink support, and Stripe can refund a transaction within 60 days of the original payment. If Stripe asks you for product-specific input on a support request and you don't reply within 48 hours, Stripe might issue the refund without your approval. Refer to [Refunds and cancellations](https://docs.stripe.com/refunds) and [Refund support](https://docs.stripe.com/payments/managed-payments/how-it-works#refund-support).
* **Coda**: issue refunds by calling the `createRefund` endpoint. Coda supports full refunds only, accepts them for completed payments only, and requires approval before it enables the refund API on your account. Refer to [Refund a payment](https://coda-payments.gitbook.io/coda-public-technical-documentation/codapay/refund-a-payment).

> **Note:**
>
> Because Coda supports full refunds only, expect `refundedAmountMicros` to match the full order total for a Coda refund. Partial refunds apply to Stripe transactions.

## Disputes and chargebacks

A dispute, also called a chargeback, is a player-initiated reversal. The player contacts their bank or card issuer, which reverses the payment and asks the merchant of record to respond.

Because your payment provider is the merchant of record, the provider responds to the dispute on your behalf. You don't have to gather evidence or correspond with the card network.

When a dispute closes and the player wins, Unity IAP automatically revokes the order and sends an `order.revoked` [event](./implement-backend.md#event-types). If Unity IAP manages entitlements, the revoked order removes the entitlement from the player, so handle the event only to remove what you granted outside Unity IAP, such as soft currency in your own economy. If your own backend manages entitlements, handle the event by removing the entitlement or currency you granted for the original purchase.

Provider dispute handling differs:

* **Stripe**: with [Managed Payments](https://stripe.com/managed-payments), Stripe reviews each dispute through automated and manual processes and submits evidence for you without asking you for more. If Stripe judges that you're unlikely to win, it might accept the dispute instead of countering it. You can still view disputes in the Stripe Dashboard and accept or counter them yourself, but an evidence submission fee applies when you counter a dispute yourself, and every received dispute incurs a dispute received fee. Refer to [Dispute support](https://docs.stripe.com/payments/managed-payments/how-it-works#handle-disputes) and [Disputes and fraud](https://docs.stripe.com/disputes).
* **Coda**: Coda handles fraud disputes as part of its MoR service. Coda doesn't publish dispute documentation, so contact Coda for the details that apply to your account.

## Player support

Billing and transaction questions belong to your payment provider. These include receipts, unrecognized charges, failed payments, and refund requests.

* **Stripe**: Managed Payments handles payment and subscription support requests through [Onelink support](https://docs.stripe.com/payments/managed-payments/how-it-works#transaction-support). Players manage their order history, subscriptions, and payment methods on the Onelink site, and Stripe sends receipts, invoices, and refund notifications to players directly. Keep the support email address in your Stripe business settings up to date, because Stripe uses it for support escalations.
* **Coda**: Coda provides transaction support for the payments it processes. Contact Coda for the support routing that applies to your account.

> **Note:**
>
> With Stripe Managed Payments, players see Onelink as the merchant of record, and their bank statement shows `LINK.COM*` followed by your statement descriptor. Players who don't recognize that descriptor are a common source of support contacts and disputes, so consider naming it in your own support material.

You remain responsible for support questions about your game: which entitlements a player owns, and the in-game consequences of a refund or revocation. To investigate an individual order, call the Orders API [`GET` endpoint](./implement-backend.md#get-order) with the order ID. The response returns the order status, its line items, and the `fulfilledAt` and `revokedAt` timestamps.

## Monitor refunds and disputes

The Unity Dashboard reports refund and dispute volume alongside the rest of your D2C activity:

* The **Refunds & disputes** metric and the **Refunds & disputes by provider** chart on the **D2C Performance** page. Refer to [D2C Performance reference](/iap/reporting/d2c-performance-reference.md).
* The **Activity Type** dimension on the **Revenue Performance** page, which separates purchases, refunds, and chargebacks. Refer to [Revenue Performance reference](/iap/reporting/revenue-performance-reference.md).
