Supported Currencies

Learn about currency support, exchange rates, multi-currency payments, and settlement options.

Primary Currencies

Inkress currently supports the following currencies for payments and payouts:

Jamaican Dollar

Primary

Code: JMD

Symbol: $

Decimals: 2 (cents)

Example: $1,250.50

Payment Methods:

  • Credit/Debit Cards (Visa, Mastercard)
  • Bank Transfers (Local)
  • Digital Wallets

United States Dollar

Supported

Code: USD

Symbol: $

Decimals: 2 (cents)

Example: $12.50

Payment Methods:

  • Credit/Debit Cards (International)
  • ACH Transfers
  • Digital Wallets (PayPal, Stripe)

Setting Payment Currency

When creating a payment link or order, specify the currency using the currency_code field:

const response = await admin.paymentLink.create({
  title: "Premium Subscription",
  total: 9900,  // Amount in cents (JMD 99.00)
  currency_code: "JMD",  // or "USD"
  description: "Monthly premium plan"
});

⚠️ Amount Format

Always provide amounts in the smallest currency unit (cents). For example, $99.00 JMD should be passed as 9900.

Amount Formatting Best Practices

Store as Integers

Always store and transmit amounts as integers in cents to avoid floating-point precision issues:

// ✓ Good - using integers
const amount = 2550;  // $25.50

// ✗ Bad - using floats
const amount = 25.50;  // Can cause precision errors

Display to Users

Convert to decimal format when displaying to users:

function formatCurrency(cents: number, currency: string): string {
  const amount = cents / 100;
  
  const formatters = {
    JMD: new Intl.NumberFormat('en-JM', {
      style: 'currency',
      currency: 'JMD'
    }),
    USD: new Intl.NumberFormat('en-US', {
      style: 'currency',
      currency: 'USD'
    })
  };
  
  return formatters[currency].format(amount);
}

// Usage
formatCurrency(9900, 'JMD');  // "$99.00"
formatCurrency(2550, 'USD');  // "$25.50"

User Input Handling

Convert user input to cents before sending to the API:

function parseCurrencyInput(input: string): number {
  // Remove currency symbols and commas
  const cleaned = input.replace(/[$,]/g, '');
  
  // Parse as float and convert to cents
  const dollars = parseFloat(cleaned);
  
  if (isNaN(dollars)) {
    throw new Error('Invalid amount');
  }
  
  return Math.round(dollars * 100);
}

// Usage
parseCurrencyInput("$99.99");    // 9999
parseCurrencyInput("1,250.50");  // 125050

Multi-Currency Payments

Merchants can accept payments in multiple currencies, but each payment link must specify a single currency. Customers see prices in that currency throughout the checkout flow.

Example: Serving International Customers

// Create separate payment links for different currencies
const jmdLink = await admin.paymentLink.create({
  title: "Premium Plan",
  total: 9900,
  currency_code: "JMD"
});

const usdLink = await admin.paymentLink.create({
  title: "Premium Plan", 
  total: 6500,  // ~$65 USD equivalent
  currency_code: "USD"
});

// Show appropriate link based on customer location
function getPaymentLink(countryCode: string) {
  return countryCode === 'US' ? usdLink : jmdLink;
}

Exchange Rates

Inkress does not automatically convert between currencies. If you need to support multiple currencies, you must:

  1. Fetch current exchange rates from a service (e.g., exchangerate-api.com)
  2. Calculate equivalent amounts in each currency
  3. Create separate payment links for each currency
  4. Display appropriate links to customers based on their preference

Example Implementation

async function getExchangeRate(from: string, to: string): Promise<number> {
  const response = await fetch(
    `https://api.exchangerate-api.com/v4/latest/${from}`
  );
  const data = await response.json();
  return data.rates[to];
}

async function createMultiCurrencyLinks(
  baseAmount: number, 
  baseCurrency: string
) {
  const links = [];
  
  // Create JMD link
  links.push(await admin.paymentLink.create({
    title: "Premium Plan",
    total: baseCurrency === 'JMD' ? baseAmount : 
      Math.round(baseAmount * await getExchangeRate(baseCurrency, 'JMD')),
    currency_code: "JMD"
  }));
  
  // Create USD link
  links.push(await admin.paymentLink.create({
    title: "Premium Plan",
    total: baseCurrency === 'USD' ? baseAmount : 
      Math.round(baseAmount * await getExchangeRate(baseCurrency, 'USD')),
    currency_code: "USD"
  }));
  
  return links;
}

Settlement & Payouts

Your merchant account has a primary settlement currency (usually JMD). Payments received in different currencies are handled as follows:

Same Currency Settlement

If you receive payments in JMD and your settlement currency is JMD, no conversion occurs. Funds go directly to your available balance.

Cross-Currency Settlement

If you receive payments in USD but your settlement currency is JMD, the funds are converted at the daily exchange rate (minus a 1% conversion fee).

Payment:           $100.00 USD
Exchange Rate:     1 USD = 155 JMD
Gross:             JMD 15,500
Conversion Fee:    JMD   -155 (1%)
Transaction Fee:   JMD   -310 (2%)
────────────────────────────────
Net to Balance:    JMD 15,035

Payout Currency

Payouts are always processed in your settlement currency. You cannot request payouts in a different currency than your account's settlement currency.

Fee Structure by Currency

Transaction fees vary slightly by currency and payment method:

CurrencyPayment MethodTransaction FeeFlat Fee
JMDCard2.0%-
JMDBank Transfer1.5%-
USDCard2.9%$0.30
USDACH0.8%$5.00

Note: These fees are deducted automatically before funds are added to your available balance. The actual fees may vary based on your subscription plan.

Requesting Additional Currencies

We're actively expanding our currency support. If you need to accept payments in a currency not currently supported, please contact our sales team.

Currencies Under Consideration:

EUR - Euro
GBP - British Pound
CAD - Canadian Dollar
TTD - Trinidad & Tobago Dollar
BBD - Barbadian Dollar
XCD - Eastern Caribbean Dollar

Enterprise customers: Custom currency support and preferential exchange rates are available. Contact us to learn more.