Skip to main content

Managing currencies

WooCommerce > MHM Currency > Manage Currencies

This is where you configure which currencies your store offers.

The currency table

ColumnWhat it does
EnabledTurns a currency on or off. Disabled currencies don't show in the switcher.
CodeThe ISO 4217 code, flag, and full currency name.
RateRate type (Auto / Manual) and the rate value.
FeeAn extra fee on top of the rate (None / Percent / Fixed).
RoundingThe rounding rule applied to the converted amount.
OrderUp/down arrows to reorder the switcher's dropdown.
ActionsRemove the currency from the list.

The base currency is not a row here — it is named above the table and comes from WooCommerce > Settings > General. On the storefront it is the switcher's first entry.

What the customer will see

Since 1.3.0.

Under each row is a preview line: Customer sees: 100.00 <base> → …. It is computed on the server by the store's own price formatter, not estimated in the browser, so it applies the same rate, fee, rounding and number format the storefront will apply — including edits you have not saved yet. A row whose rate cannot produce a price shows a dash instead.

Number format per currency

Since 1.3.0.

Edit format on a row opens five fields for that currency alone:

FieldWhat it does
SymbolThe symbol shown with the amount
PositionLeft, Right, Left with space, or Right with space
DecimalsHow many decimal places, 0 to 4
Decimal separatorOne character
Thousand separatorOne character

WooCommerce stores exactly one set of these for the whole shop, because it assumes a shop has one currency. These values are per currency and apply to that currency only.

Entries are corrected rather than silently accepted — a separator longer than one character, a decimal count outside 0–4, or a thousand separator identical to the decimal separator. When a correction happens the screen names it, instead of changing your input without saying.

Is the rate current?

Since 1.3.0.

Each row carries a status line, and the tab header carries a summary pill:

LineMeaning
entered manuallyThe rate is a Manual value; no sync produced it
No rate yet — this currency is not shown in the storeThe rate is 0 or missing, so the storefront leaves this currency out
rate saved, no sync recordedThere is a rate, but no sync timestamp for this row
updated N agoA sync produced this value, N ago

"No sync recorded yet" means exactly that — no record. It does not claim a sync never ran, which is the honest reading on a shop upgrading from a version that kept no timestamp.

Add a currency

  1. Click + New Currency.
  2. Pick a currency from the dropdown (the base currency and ones you've already added are excluded).
  3. Click Add.
  4. Set its rate, fee and rounding.
  5. Click Save Changes.

A newly added currency starts with: enabled, rate type Auto, fee None, rounding None.

Rate types

  • Auto — the rate field is read-only; its value comes from a sync.
  • Manual — you type the rate yourself, up to 6 decimal places.

Syncing updates every currency's rate regardless of its type, so a manually entered rate can be overwritten by the next sync — check it afterwards if that matters to you.

Fees

Three ways to add a markup on top of the exchange rate:

TypeEffectExample (rate 0.92)
NoneNo feeEffective rate 0.92
PercentThe rate is increased by a percentage2.5% → 0.92 × 1.025 = 0.943
FixedA flat amount is added to the rate0.03 → 0.92 + 0.03 = 0.95

Rounding

Rounding runs after the rate and fee are applied, and it isn't limited to product prices — since 1.1.0 it also rounds shipping, fees and coupon discounts the same way.

TypeEffect
NoneNo rounding
NearestRounds to the nearest multiple of the step
Round upRounds up to the next multiple of the step
Round downRounds down to the previous multiple of the step

Choosing anything but None opens two extra fields:

  • Step — what to round to (e.g. 1, 5, 0.5)
  • Subtract — an amount deducted after rounding, useful for charm pricing

Example: a converted price of 47.30, Round up, step 1, subtract 0.01 → 47.99.

A step of 0 disables rounding.

Syncing rates

Sync Rates fetches current rates immediately and writes them into the table. It needs outbound HTTP access from your server — it doesn't work offline.

Rates come from, in order:

  1. ExchangeRate-API (primary) — api.exchangerate-api.com
  2. European Central Bank (fallback) — the daily reference feed at www.ecb.europa.eu

Both are free and need no API key. The plugin tries them in order and stops at the first that answers; if neither does, your existing rates stay in place. Fetched rates are cached for 1 day, and that cache is what backs the price display shown to shoppers. Sync Rates — whether you click the button, run wp mhmcs rates-sync, or let the scheduled task fire — always skips the cache and goes straight to the API.

Changed in 2.1.0. The chain used to have two fallbacks, Currency API and then Frankfurter, and now has one. Coverage is unchanged — the ECB feed was already the final stage of the old chain, roughly thirty currencies — only the intermediate stage is gone. If your store restricts outbound requests to an allow-list, permit www.ecb.europa.eu.

If you have server access, you can sync rates or flush the cache from the command line instead — see WP-CLI Commands.

The full FAQ is on the FAQ page; the full list of known limits is on the Known limits page.