> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stigg.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Serving countries that pay in EUR

## Overview

The euro (EUR) is the shared currency of the eurozone - 21 EU member states (as of 2026). A common requirement is to offer a **single EUR price** to most of these countries, while keeping a distinct localized price for a subset of them where you want to charge differently.

Stigg supports this with a dedicated `EU` country code that represents the eurozone as a single region. In the Stigg app it’s labeled **European Union** and shown with the EU flag.

Follow this guide to set up one localized `EU` price that covers multiple eurozone countries - via [**no-code configuration**](/documentation/price-localization/price-localization-no-code-configuration) or [**programmatically**](/documentation/price-localization/price-localization-codebase-integration) - instead of adding and maintaining the same price separately for each country. Countries you leave out of this group keep their own default or localized price, so you can mix a shared `EU` price with country-specific ones.

## How matching works

Matching a `billingCountryCode` to a localized price is a simple, predictable exact string comparison against the country code configured on that price row - and that's what makes the `EU` code work: any country you map to `EU` before sending it shares that one price, and any country you don't map keeps its own default or localized price.

Stigg doesn't maintain this country-to-`EU` mapping for you - it's a mapping you own and maintain on your side. You decide exactly which countries are grouped together, and can change that grouping at any time.

To use it, maintain your own list of eurozone country codes, and when you resolve a customer's actual country (via GeoIP, billing address, or an onboarding preference), map it to `EU` before passing it as `billingCountryCode` - on **every** call that accepts it: the `Paywall`, `Checkout`, and `CustomerPortal` widgets, and the `provisionSubscription` and `previewSubscription` APIs.

```typescript TypeScript theme={null}
const EUROZONE_COUNTRY_CODES = new Set([
  "AT", "BE", "BG", "HR", "CY", "EE", "FI", "FR", "DE", "GR",
  "IE", "IT", "LV", "LT", "LU", "MT", "NL", "PT", "SK", "SI", "ES",
]);

function resolveBillingCountryCode(actualCountryCode: string): string {
  if (EUROZONE_COUNTRY_CODES.has(actualCountryCode)) {
    return "EU";
  }

  return actualCountryCode;
}
```

<Note>
  Countries that use the euro unilaterally (Andorra, Monaco, San Marino, Vatican City) or de facto (Kosovo, Montenegro) are not eurozone member states. Add their country codes to the mapping only if you intend to serve them the same EUR price.
</Note>

## Things to keep in mind

* **Customer-facing country in the Stigg app.** Once a subscription is provisioned, the [customer's payment details](/documentation/price-localization/price-localization-no-code-configuration#at-the-customer-level) show `EU` rather than the customer's actual country. If you rely on this field for reporting, resolve the customer's real country in your own systems and store it as [customer metadata](/documentation/managing-customers-and-subscriptions/customers/storing-metadata) so it's still available directly from Stigg.
* **Differentiating a specific country later.** If you later want to charge a different price in one eurozone country, stop mapping that country to `EU` and [add a dedicated localized price](/documentation/price-localization/price-localization-no-code-configuration) for it directly.

## Consolidating existing per-country prices into one EU price

If you're already serving the eurozone with a separate localized price per country and want to replace them with a single `EU` price, follow these steps so existing subscribers aren't disrupted along the way.

<Steps>
  <Step title="Add the EU price">
    Add the new `EU` localized price to the plan or add-on, alongside your existing per-country prices - via [no-code configuration](/documentation/price-localization/price-localization-no-code-configuration) or [programmatically](/documentation/price-localization/price-localization-codebase-integration).
  </Step>

  <Step title="Roll it out to new customers first">
    Update your country-resolution logic so only new customers map to `EU`. Consolidating prices doesn't change what country an existing subscriber resolves to, so existing subscribers keep resolving to their original country (for example `DE`) and stay on their current price until you decide to move them.
  </Step>

  <Step title="Decide how to move existing subscribers">
    For subscribers still on a per-country price, either:

    * **leave their price in place** until they naturally churn or upgrade, or
    * **explicitly re-point their subscription to the `EU` price** when you're ready to move them.

    Keep the old per-country price in place until every subscriber has moved off it - a subscriber's country needs a matching price row on their next invoice, so they stay on the currency and price they expect throughout the transition.
  </Step>

  <Step title="Remove the old per-country prices">
    Once every subscriber has moved off a per-country price, remove it. A price row's delete control is disabled once it has live subscriptions, and that stays disabled even in a new draft, so if any subscribers remain on it, use [Set Package Pricing](https://studio.apollographql.com/public/Stigg-API/variant/Production/schema/reference) instead. It replaces a plan or add-on's entire pricing set in one atomic call, so include every price you want to keep - the default price, any other localized prices, and the new `EU` price - not just the ones you're changing.
  </Step>
</Steps>

## Reference: eurozone country codes

| Country     | ISO-3166-1 code |
| ----------- | --------------- |
| Austria     | AT              |
| Belgium     | BE              |
| Bulgaria    | BG              |
| Croatia     | HR              |
| Cyprus      | CY              |
| Estonia     | EE              |
| Finland     | FI              |
| France      | FR              |
| Germany     | DE              |
| Greece      | GR              |
| Ireland     | IE              |
| Italy       | IT              |
| Latvia      | LV              |
| Lithuania   | LT              |
| Luxembourg  | LU              |
| Malta       | MT              |
| Netherlands | NL              |
| Portugal    | PT              |
| Slovakia    | SK              |
| Slovenia    | SI              |
| Spain       | ES              |


## Related topics

- [Price localization overview](/documentation/price-localization/price-localization.md)
- [No-code configuration in the Stigg app](/documentation/price-localization/price-localization-no-code-configuration.md)
- [Implementing price localization on your public website and application](/documentation/price-localization/price-localization-codebase-integration.md)
