The EU has no single law for in-game currencies. What it has is a reading of the law it already has: in March 2025, the network of national consumer authorities published key principles on how EU consumer law applies to coins, gems and other currencies players buy with real money. If you're looking up EU virtual currency rules for games, this is the document enforcers point to. This page covers what the CPC principles on virtual currency ask for, where they stand as of October 2026, what they mean for an indie game with a coin shop, and what PowerUp checks for you.
What the CPC principles are
The Consumer Protection Cooperation (CPC) Network is the EU's network of national consumer authorities, coordinated by the European Commission. On 21 March 2025 it published key principles on in-game virtual currencies, prepared under the lead of the Netherlands Authority for Consumers and Markets and the Norwegian Consumer Authority. They cover currencies bought with real money and then spent on digital content or services, and the Commission describes them as the minimum requirements EU consumer law already sets for them.
Status: guidance on law that's already in force. The principles don't create new obligations. They set out how the authorities read existing EU consumer law: the Unfair Commercial Practices Directive, the Consumer Rights Directive and the Unfair Contract Terms Directive. A court has the final word on whether a practice breaks the law, but this is what enforcers look for.
What's happened since
- March 2025. The same day, the network acted against Star Stable Entertainment over ads that urged children to buy, time-limited pressure to buy, and unclear information about its in-game currency.
- June and September 2025. The Commission hosted two workshops between the authorities and the games industry's trade bodies on applying the principles, followed by written exchanges.
- Early 2026. The network opened an action over Call of Duty Mobile and Diablo Immortal, covering currency sales and preselected parental control settings among other things.
- 30 September 2026. A joint statement said a high number of game companies hadn't made substantive changes after the guidance and the talks that followed. The network announced eleven coordinated actions asking companies including King, Mojang, Riot Games, Supercell and Ubisoft to bring their in-game currency practices into line with EU law.
When the network acts together like this, EU law (Directive 2019/2161) requires that the maximum fine available be at least 4% of the company's annual turnover in the countries concerned, or at least EUR 2 million where turnover isn't known.
Planned: the Digital Fairness Act. The Commission consulted in 2025 on a Digital Fairness Act, and its 2026 work programme lists the proposal for the fourth quarter of 2026. Commentators expect it to cover in-game currencies and loot boxes. As of October 2026 no proposal has been published, so nothing in it applies yet.
What the principles ask for
The document has seven principles. The Commission sums them up under four headings: clear pricing and information before purchase, no practices that hide costs or force players to buy currency, respect for the right of withdrawal, and respect for vulnerable players, especially children.
- Show the real price. When something is sold for a currency players buy with money, show its price in real money too, clearly and prominently. Work it out from what the coins cost in full, without bulk discounts or promotions.
- Don't hide the cost. Avoid selling several currencies and mixing them for purchases, and avoid chains of exchanges before a player can buy anything.
- Don't make players buy currency they don't want. The principles name two practices to avoid: selling currency only in bundles that don't match item prices, and not letting players choose the amount they buy.
- Say what's being bought before the player pays: what it is, who sells it, its real-money price, the right of withdrawal, the legal guarantee, and how payment and delivery work.
- Respect the right of withdrawal. Players have 14 days to withdraw. For digital content the right can end early only if the player expressly agrees to start right away and acknowledges losing it, in a step separate from the buy button. The principles treat the currency itself as something else: they say not to exempt currency purchases from withdrawal, or to refuse withdrawal for currency that's still unused within the 14 days.
- Write fair terms in plain language. No terms that let you change the currency's value, take back what was bought, or close an account without a way to contest it.
- Protect children and other vulnerable players. Any game that isn't strictly for adults should expect many players under 18. Use parental controls with age-appropriate defaults (the principles' example is real-money spending switched off by default), and never tell children to buy something or to ask an adult to, which point 28 of the Unfair Commercial Practices Directive's blacklist already bans.
What it means for an indie game
Take a typical Godot game with a coin shop: coin bundles for real money, and skins and power-ups priced in coins. Here's what the principles change.
Put a real-money figure beside every coin price
Base the figure on your undiscounted rate, which is usually your smallest bundle. If 120 coins cost €0.99, a coin is worth €0.00825 and a 500-coin skin costs €4.13. Bigger bundles giving a better rate doesn't change the figure. Show it on the item, not in a help page.
With PowerUp, the player's wallet carries the coin's disclosed rate, so your shop can print it beside every coin price:
var coin_usd := 0.0
func _ready() -> void:
PowerUp.wallet_changed.connect(_on_wallet_changed)
var me: Dictionary = await PowerUp.fetch_me()
if me.ok and me.me.wallet != null:
_on_wallet_changed(me.me.wallet)
func _on_wallet_changed(wallet: Dictionary) -> void:
var rate: Variant = wallet.get("coins", {}).get("usdRate")
coin_usd = float(rate) if rate != null else 0.0
## "400 coins ($3.30)" at buggs.io's demo rate
func coin_price_text(price_coins: int) -> String:
if coin_usd <= 0.0:
return "%d coins" % price_coins
return "%d coins ($%.2f)" % [price_coins, price_coins * coin_usd]
Size bundles to your prices
If items cost 100 and 150 coins and your cheapest bundle gives 120, every first purchase leaves 20 coins stranded. Either size bundles so they spend down to zero, or sell a cheap item that soaks up leftovers. Re-check whenever a price changes. Our virtual currency page walks through the maths. The principles also count not letting players choose the amount as a practice to avoid. Fixed bundles can't fully meet that, but a small bundle that matches your cheapest item at least lets a player buy only what one item needs.
Keep one currency you sell
A sold currency and an earned one (like XP) are easy to follow. Two sold currencies with an exchange between them is exactly what the principles warn against.
Make timers real, and keep pressure off kids
The September 2026 statement names misleading countdown timers and unfounded scarcity claims among the practices that harm players. Countdowns should end when they say they will, not reset. For players under 18, start from protective defaults and never prompt kids to buy or to ask a parent to.
Write the withdrawal and terms part down
On phones, the App Store and Google Play run the checkout and its terms. On the web the seller is you, or your merchant of record, so the purchase screen and your terms need to explain the right of withdrawal, including for coins players haven't spent yet. This is a question for your lawyer, not your engine.
What PowerUp checks and does
| What the principles ask | What PowerUp does | Covered |
|---|---|---|
| Real-money price beside the currency price | Every currency you sell needs a disclosed real-money rate, or publishing fails. The Godot SDK's offer buttons print each coin bundle with its value beside it ("1,200 coins (≈ $9.90)"), and the wallet carries the rate so your shop can print it beside item prices, as above. | Partly: the rate is enforced, and printing it beside item prices is up to your shop |
| Real-money prices on cards | Every purchase card must show its real-money price, or publishing fails. | Yes, enforced |
| No forced leftover balances | Publishing fails when the cheapest coin bundle can't buy a single item sold for coins. The Currency page works out the leftover coins of every bundle and suggests a soak-up price or bundle sizes that land exactly. | Partly: the first bundle is enforced, the rest is advice |
| Let players choose the amount | Coins are sold in the bundles you define. | No |
| No hidden costs | Items are priced in one coin balance, and there's no exchange between currencies. Any extra currency you sell needs its own disclosed rate. | Partly |
| No false time pressure | Countdowns must come from a server end time that ends rather than resets, or publishing fails. | Yes, enforced |
| Protect children | A neutral age question before purchases and ads. Children can't buy until a parent's consent is recorded, and kids and teens are held to a monthly spending limit, which publishing requires. Teens get non-personalized ads and kids get child-directed ads. No ad conversions are sent for children's or teens' accounts, or for players in the EEA, the UK or Switzerland. | Partly: teens can buy within the limit, where the principles' example default is no real-money spending |
| Right of withdrawal | PowerUp doesn't add withdrawal wording to checkout or track it. | No |
| Plain terms | Your terms are yours to write. | No |

Two things to know about the coverage
- The checks don't cite the EU principles. The two checks that enforce them name the FTC's order against HoYoverse and PowerUp's own bundle analysis, so the console won't tell you a result is an EU matter. The store rules overview lists what each check cites.
- The rate is in US dollars, and it's yours to set. PowerUp's disclosed rate is a dollar rate, so the value the SDK prints is in dollars. If you want euro values for players in the EU, work them out in your own shop UI. PowerUp doesn't check that the rate comes from your undiscounted bundle: buggs.io's demo uses its smallest bundle, $0.99 for 120 coins.
For randomized items, see loot box odds disclosure, and for age checks in US app stores, see app store age laws.