Invoicing
Currencies and exchange rates
Invoice in any currency. Amounts are exact integer minor units, and when a document's currency differs from your business currency, the exchange rate is frozen on it.
You can bill each client in the currency they pay in. Every document has one currency, every amount on it is stored exactly in that currency's smallest unit, and when the currency differs from your business's base currency, the exchange rate of the day is frozen on the document so your reports never shift later.
Money is exact
Amounts are never floating-point numbers. Each one is a whole number of the currency's minor unit plus a three-letter currency code:
| Amount | Stored as |
|---|---|
| 1,200.00 USD | "total_minor": "120000", "currency": "USD" |
| 1,250.00 PKR | "total_minor": "125000", "currency": "PKR" |
| 5,000 JPY (no decimals) | "total_minor": "5000", "currency": "JPY" |
| 12.500 KWD (three decimals) | "total_minor": "12500", "currency": "KWD" |
Currencies with 0 or 3 decimal places work exactly like two-decimal currencies; the number of decimals comes from the currency data. In the API, money is always a string, so very large amounts are never cut by number limits in JavaScript or other languages. See Money and currencies.
Which currency a document uses
The currency is chosen when the document is created. If you do not pick one, it is resolved in this order, the first that has a value wins:
- the currency you set on the document;
- the client's default currency;
- the business setting;
- the account setting;
- the business's base currency.
Your business's base currency is set on the business profile. Reports total amounts in it.
Exchange rates
When a document's currency is different from the business's base currency, an exchange rate to the base currency is frozen on the document. It never changes after that, so:
- the document's stored totals never move when markets do;
- reports show amounts per currency, plus a total in your base currency at each document's own frozen rate (reports arrive in the week of 25 January 2027);
- the PDF, pay page and API always agree.
Rates are fetched once a day from the exchange-rate provider. The default provider is the European Central Bank reference rates. Each business may also enter a rate by hand when it needs a specific one, for example the rate its bank used.
The exchange rate is for your records and reports. Your client always pays the amount in the document's own currency.
Set the currency in the web app
Set the business base currency
In the business profile, choose the currency your books are kept in.
Give clients a default
On a client who always pays in another currency, set their default currency. New documents for that client use it.
Change it on one document
In the editor, choose the currency for this document while it is a draft. If it differs from the base currency, the exchange rate is shown and frozen with the document.
Through the API and MCP
Send currency with every document, and every money field as a string of minor units:
curl -X POST "https://api.freeinvoiceautomation.com/v1/documents" \
-H "Authorization: Bearer $FIA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8e1f3a5c-eur-invoice" \
-d '{
"type": "invoice",
"client_id": "0193f2a1-0c11-7d2e-9a40-1b2c3d4e5f60",
"currency": "EUR",
"lines": [
{ "description": "Translation, 4,000 words", "quantity": "1", "unit_price_minor": "48000" }
]
}'The returned document includes fx_rate, the frozen rate to your base currency, when the currencies differ. Filter lists by currency with ?currency=EUR on List documents.
Rules and edge cases
- One currency per document. All lines, payments and credit notes of a document are in its currency.
- Payment methods follow currency. Local QR payments are shown only when the currency matches the rail: UPI for INR, and Raast, JazzCash and Easypaisa for PKR (from the week of 25 January 2027). A mismatch is refused with
currency_mismatch. See Local QR payments. - Client credit is per currency. Credit kept from a credit note is held per client and per currency, and is applied to a later invoice in the same currency. See Client credit.
- Saved items carry a currency. An item's price is in its own currency. If you use it on a document in another currency, check the line price before sending.
- The rate is frozen, not the currency list. You can still create new documents in any currency at any time.
- Changing the currency after sending is part of a revision, like any change to a sent document.
Permissions
| Action | Permission key |
|---|---|
| Choose a currency on a document | documents.create or documents.edit |
| Change a client's default currency | clients.edit |
| Change business and account settings | settings.manage |
| Change the business profile | businesses.manage |
Errors you may see
| Code | Meaning |
|---|---|
validation_failed | The currency is not a three-letter code, or an amount is not a whole number of minor units. |
currency_mismatch | A payment method or credit does not match the document's currency. |