---
title: "Virtual currency balance"
description: "See a user's virtual currency balances on their profile and review every balance change in the event history."
---

:::link
Main article: [Virtual currencies](virtual-currencies)
:::

Every user profile in [Profiles/CRM](profiles-crm) shows that user's virtual currency balance, along with a history of every change.

## View balances in a user profile

Open the user's [profile](https://app.adapty.io/profiles/users). The **Virtual currency** card lists every currency the user holds.

Each row shows:

- The currency **code**, such as `COINS`.
- The current **balance**, as a whole number.

Balances update as the user earns, spends, or receives credits. A balance can't go below 0: a transaction that tries to spend more than the user holds fails with `insufficient_balance` and changes nothing. A profile with no balances shows an empty card.

To read a balance from your own code instead, call [List virtual currency balances](api-adapty/operations/listVirtualCurrencyBalances) in the server-side API.

## Review balance changes in the event history

Every balance change appears in the profile's event history, newest first. Each entry names the change and lists the currencies it affected.

The history shows three virtual currency events:

- **Virtual currency credited**: A purchase, renewal, or trial start granted credits.
- **Virtual currency transaction**: A server-side API call credited or debited the balance.
- **Virtual currency expired**: Expiring credits reset at the end of a billing cycle, or when the subscription ended.

Each entry lists, for every currency it changed:

- **Virtual currency**: The currency name and code, such as `Gold Coins (COINS)`.
- **Amount**: The signed change — positive for a credit, negative for a debit.
- **Balance after**: The currency's balance once the change applied.

One event can change several currencies at once — for example, a single [transaction](api-adapty/operations/createVirtualCurrencyTransaction) that debits one currency and credits another to convert between them.

## Balances, profiles, and devices

A balance always belongs to exactly one [profile](profiles-crm) and never moves to another one. Adapty does not share or transfer balances between profiles the way it can [share access levels between user accounts](profiles-crm#sharing-paid-access-between-user-accounts).

In practice, this means:

- **Identified users**: A customer user ID always resolves to the same profile, so the user sees the same balance on every device where they log in.
- **Anonymous users**: An anonymous profile can earn and spend credits, but it exists only on one device. When the same user opens your app on another device without logging in, Adapty creates a new anonymous profile with a zero balance.

So, to run a virtual currency economy across devices, identify your users. You can identify them in the app code through the SDK (see [Identify users](ios-quickstart-identify) in the quickstart) or from your backend through the [server-side API](getting-started-with-server-side-api).

Identifying a user late has a caveat of its own: if a user earns credits anonymously and then logs in with a customer user ID that already belongs to another profile, the device switches to that profile and its balance. The credits earned anonymously stay on the old profile and become unreachable. If the customer user ID is new, it attaches to the current profile, and the user keeps the balance. To be safe, identify users before they can earn or buy credits.

In [server-side API](getting-started-with-server-side-api) calls, identify the profile with the `adapty-profile-id` or `adapty-customer-user-id` header — both resolve to a single profile. For anonymous profiles, use `adapty-profile-id`.