Currency conversion

Why FX is built into the free plugin

IOSS is defined in euros — the EUR 150 ceiling, the return amounts, the recommended invoice value — but most stores this plugin serves price in USD, GBP, CHF, CAD, or AUD. Without conversion, the EUR 150 test is unusable, so ECB currency conversion ships in the free plugin. EUR stores skip conversion entirely; everything below applies to non-EUR stores.

ECB daily rates

The plugin fetches the European Central Bank’s public daily reference-rate file (eurofxref-daily.xml) once a day and caches it. This is exactly the rate source the VAT Directive prescribes for the EUR 150 test (Article 91(2)): the ECB daily rate applicable on the day payment is accepted. The request carries no information about your store or customers — it is a plain download of a public file.

Frozen at payment acceptance

When payment is accepted on an order, the plugin captures that day’s ECB rate and converts once, then persists the results as order meta:

MetaContents
_ioss_fx_rateThe ECB rate used (store currency per EUR)
_ioss_intrinsic_eurThe consignment’s intrinsic value in EUR
_ioss_vat_eurThe VAT amount in EUR
_ioss_net_by_rateNet amounts in EUR, broken down by rate band

Everything downstream — the eligibility verdict, the monthly totals, refund reversals, the Pro return report — reuses these captured values. A rate move the next day never shifts an order in or out of IOSS and never changes a filed month retroactively. This mirrors how customs is advised to treat your numbers, too: the Commission recommends showing the EUR value fixed at payment acceptance on the commercial invoice, and customs are advised to accept it absent fraud suspicion.

Where you see the EUR values

The captured EUR intrinsic value and VAT appear in the order’s IOSS meta box and in the orders-list column, and the intrinsic value is surfaced on the order for use on your commercial invoice. If you generate invoices with another plugin, the meta keys above are the stable place to read from.

When the ECB feed is unavailable

Rates go stale or the fetch can fail (host firewall, ECB outage, TARGET closing days are bridged by the last published rate). The plugin uses the freshest cached rate it has; only when no usable rate exists at all for a non-EUR order does it refuse to guess:

  • The order is marked fx_unavailable and treated as not IOSS-eligible — no destination VAT was charged for it, and it stays out of your monthly figures rather than entering them with an invented conversion.
  • An admin warning notice appears so you know it happened; the affected orders are identifiable by their exclusion reason.

This is deliberately conservative. Charging destination VAT without a defensible EUR value would put unverifiable numbers in your return; leaving the order out keeps your return clean and leaves that order to be handled like any other non-IOSS import (customer pays import VAT on delivery). If it happens more than very rarely, check that your server can reach www.ecb.europa.eu over HTTPS — see Troubleshooting.

Refunds

Refunds are converted with the original order’s captured rate, never the current one, so a refund reverses exactly the EUR amount that was recorded. How refunds land in your figures — same month vs. a correction against a filed month — is covered in Corrections ledger.