Skip to main content

Local Billing, Base-Currency Settlement

Recurso supports billing in multiple currencies, allowing you to charge customers in their local currency while tracking revenue and settling funds in your base currency. Currency is specified at the plan, invoice, and ledger level, giving you full control over international billing.

Key Concepts

All monetary amounts in the Recurso API are expressed in minor units (e.g., cents, paise). An amount of 4999 in INR represents ₹49.99. An amount of 5999 in USD represents $59.99.

Setting Your Base Currency

Configure your base currency during tenant setup. This is the currency used for financial reporting and ledger balances.
Changing your base currency after you have active subscriptions and ledger entries is not recommended. It will not retroactively convert historical data. Set this before going live.

Creating Multi-Currency Plans

Plans can include prices in multiple currencies. When a subscription is created, Recurso selects the appropriate price based on the customer’s currency. A plan’s flat price is one currency. Sell a tier in several currencies with per-currency plan codes — the smart router then picks the gateway per currency (₹ → Razorpay, $/€/£ → Stripe by default):
Usage charges don’t need per-currency plans — one charge carries a per-currency amounts map, so a metered plan rates in whatever currency the subscription bills in. See usage-based billing.

Currency on Subscriptions

When creating a subscription, the currency is determined by the customer’s configured currency or can be explicitly specified:

Currency on Invoices

Invoices inherit the currency from the subscription. All line items, taxes, and totals are expressed in the presentment currency.

How FX Rates Work

When payments in foreign currencies are received, Recurso records the exchange rate for ledger entries and reporting.

Rate Determination

Recurso supports multiple approaches for exchange rates:

Configuring FX Rate Source

The FX rate source (live provider vs. fixed rates) is a deployment setting, not a runtime API — configure it via environment / dashboard, not a /v1 call. FX affects reporting only: invoices always bill in the subscription’s own currency, and MRR/revenue normalize to your reporting currency at read time.

Currency Conversion in the Ledger

The ledger posts each entry once, in the invoice’s own currency’s minor units — a €49.99 payment posts 4999, exactly as billed. There are no duplicate base-currency entries and no per-currency account balances: currency normalization happens in reporting (MRR, revenue analytics), which converts to your reporting currency at read time.

Example: EUR Payment

A customer pays €49.99 for a subscription:
Keep an eye on currency exponents: JPY has none (¥500 posts as 500), KWD/BHD have three. Recurso stores every amount in the currency’s own minor units.

Reporting in Base Currency

All financial reports aggregate to your base currency, giving you a single unified view regardless of how many currencies you bill in.

Revenue by Currency

The ledger itself stays in each invoice’s own currency — conversion is a reporting concern, so use the analytics endpoints (revenue by plan / geography, MRR) for base-currency views.

Breakdown by Presentment Currency

To see deferred revenue broken down by the currencies your customers pay in, the revenue-recognition report returns a per-currency split directly:

Supported Currencies

Recurso supports all ISO 4217 currencies. Common currencies used by customers:
Zero-decimal currencies like JPY have no minor unit. An amount of 5999 in JPY represents ¥5,999 — not ¥59.99. Recurso handles this automatically based on the ISO 4217 exponent, but be careful when constructing amounts in your application.

Handling FX Gains and Losses

Because both the invoice and its payment post in the invoice’s own currency, no FX gain or loss ever arises inside the ledger — the receivable and the cash that settles it are the same number of minor units. Rate movement between invoicing and payment shows up only in reports, which convert at read time. If you book realized FX gains/losses for statutory accounts, do it in your accounting system from the GL export, using your own rate policy.

Best Practices

Define All Prices Upfront

Add prices for every currency you support when creating a plan. This avoids subscription creation failures.

Use Gateway Rates

Gateway FX rates reflect what you actually receive after conversion, eliminating discrepancies between billed and settled amounts.

Monitor FX Exposure

Track your receivables by currency. Large balances in volatile currencies increase FX risk.

Handle Zero-Decimal Currencies

Validate your amount logic for currencies like JPY and KRW that have no minor unit.
If you only serve customers in one country, you can skip multi-currency entirely. Just set your base currency and define a single price on each plan. Multi-currency features activate only when you add prices in additional currencies.