McTaba Labs logo
Software EngineeringThe WhiteboardProjectsEventsMasterclassesWebinarsLearn
Book Call

500+ developers already in the community

Get answers, find accountability partners, and stay ahead

Join Discord →
McTaba Labs logo

Educating 1 million students in tech by 2030.

Programs

  • HighSchool Graduates Launchpad
  • AI & Business Automation
  • Corporate Training
  • McTaba Story & Mission
  • Full-Stack Curriculum
  • Course Pricing & Plans
  • Frequently Asked Questions

Resources

  • Join Discord Community
  • Tech Events in Nairobi
  • Masterclasses
  • Free Resources
  • Learn
  • Campus
  • Africa Tech Talent Report
  • Partner With Us
  • Start a Project
  • Our Work

Contact Us

  • 124 Manyani East Road, Lavington, Nairobi
  • +254727795603
  • Book a Discovery Call

Office Hours:

Mon-Fri: 9am - 2pm EAT

Sat: 10am - 12pm EAT

© 2027 McTaba Labs - A product of Edtech Industries. All rights reserved.

Privacy PolicyTerms of ServiceRefund Policy
  1. Learn
  2. Paystack for African Developers
  3. Paystack Currency Not Supported Error
Bonaventure OgetoBy Bonaventure Ogeto|Updated July 20, 2026

Paystack Currency Not Supported Error

The "Currency not supported" error means your Paystack account is not enabled for the currency you sent in the request. Each Paystack account is tied to a country and has a default currency. Nigerian accounts default to NGN. To accept GHS, KES, ZAR, or USD, you need to enable those currencies in your Paystack dashboard or contact Paystack support. Also check that your currency code is a valid uppercase ISO 4217 string like "NGN", not "naira" or "ngn".

In this article

  1. 1. What the Error Looks Like
  2. 2. Which Currencies Does Paystack Support
  3. 3. Common Causes
  4. 4. How to Check Your Enabled Currencies
  5. 5. The Fix
  6. 6. Multi-Currency Checkout Pattern
  7. 7. Accepting USD on Paystack
  8. 8. Verification Checklist

What the Error Looks Like

When you initialize a transaction with a currency your account does not support, Paystack responds with:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "status": false,
  "message": "Currency not supported"
}

You may also see variations like "Currency not supported for this business" or "Invalid currency" if the currency code itself is malformed. The HTTP status is always 400.

This error fires on /transaction/initialize, /charge, and any other endpoint where you specify a currency. It means Paystack recognized your API key and authenticated you, but the currency you requested is not in the list of currencies your account can use.

Which Currencies Does Paystack Support

Paystack supports different currencies depending on the country your business is registered in. As of July 2026:

Business country Default currency Additional currencies (may require activation)
NigeriaNGNUSD, GHS (with approval)
GhanaGHSUSD (with approval)
South AfricaZARUSD (with approval)
KenyaKESUSD (with approval)

This table represents common configurations. Paystack continues to expand, so check the official documentation for the latest list. Some currencies require additional business verification or a specific account type.

If you are building for multiple African markets, you may need separate Paystack accounts for each country. A Nigerian account cannot charge in KES directly. You would need a Kenyan Paystack account for KES transactions.

Get weekly developer tips

Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.

No spam. Unsubscribe anytime.

Common Causes

1. Your account is not activated for that currency

This is the most common cause. You have a Nigerian Paystack account and you sent currency: "KES". Your account only supports NGN by default. You need either a separate Kenyan account or to contact Paystack about multi-currency support.

2. Wrong country account

You registered your Paystack account in Nigeria but your customers are in Kenya. You send currency: "NGN" but your customers' cards are Kenyan. The transaction might fail not because of the currency error but because of geographic restrictions. Make sure your account country matches your target market.

3. Currency code format is wrong

// WRONG: lowercase
{ currency: "ngn" }

// WRONG: full name
{ currency: "naira" }

// WRONG: symbol
{ currency: "N" }

// WRONG: with extra whitespace
{ currency: " NGN " }

// RIGHT: uppercase ISO 4217
{ currency: "NGN" }

Paystack expects the ISO 4217 three-letter currency code in uppercase. Anything else triggers an error.

4. Currency enabled in test mode but not live mode

You tested your integration in test mode where USD was enabled. You switch to live mode and get "Currency not supported" because your live account has not been approved for USD transactions yet. Test and live currency settings are independent.

5. Omitting currency and expecting Paystack to guess

If you omit the currency field, Paystack uses your account's default currency. If your account default is NGN but you intended to charge in GHS, the amounts will be wrong. Always specify the currency explicitly.

How to Check Your Enabled Currencies

There are two ways to check which currencies your account supports:

1. Paystack dashboard

Log in to your Paystack dashboard. Go to Settings. Look for the Currencies or Payment Channels section. You will see a list of currencies that are enabled for your account. Some may have toggle switches, others may show "Contact support to enable".

2. Test with the API

The quickest way to test is to initialize a small transaction in the currency you want to verify:

// Test if KES is enabled on your account
const response = await fetch('https://api.paystack.co/transaction/initialize', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.PAYSTACK_SECRET_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    email: 'test@example.com',
    amount: 10000,
    currency: 'KES',
  }),
});

const data = await response.json();
console.log(data);
// If KES is not enabled: { status: false, message: "Currency not supported" }
// If KES is enabled: { status: true, data: { authorization_url: "...", ... } }

Run this in test mode with your test secret key. If the currency is supported, you will get an authorization URL. If not, you will get the error message.

The Fix

Follow this checklist:

  1. Confirm your currency code is correct. It must be an uppercase three-letter ISO 4217 code: "NGN", "GHS", "ZAR", "KES", or "USD". Trim whitespace and convert to uppercase in your code.
  2. Check your Paystack dashboard for enabled currencies. If the currency you need is not listed, enable it if there is a toggle, or contact Paystack support to request activation.
  3. Verify both test and live modes. Enable the currency in both modes if you need it in both.
  4. For multi-country support, consider separate accounts. If you need to accept KES and NGN, you may need a Kenyan account for KES and a Nigerian account for NGN. Use the appropriate secret key for each currency.
  5. Always specify the currency explicitly. Do not rely on the default. Make your code explicit about which currency it is charging in.

Here is a server-side validation function that catches currency issues before calling Paystack:

const SUPPORTED_CURRENCIES = ['NGN', 'GHS', 'ZAR', 'KES', 'USD'] as const;
type SupportedCurrency = typeof SUPPORTED_CURRENCIES[number];

function validateCurrency(currency: string): SupportedCurrency {
  const normalized = currency.trim().toUpperCase();

  if (!SUPPORTED_CURRENCIES.includes(normalized as SupportedCurrency)) {
    throw new Error(
      `Currency "${currency}" is not supported. Supported currencies: ${SUPPORTED_CURRENCIES.join(', ')}`
    );
  }

  return normalized as SupportedCurrency;
}

// Map each currency to its Paystack secret key (for multi-country setups)
const PAYSTACK_KEYS: Record = {
  NGN: process.env.PAYSTACK_SECRET_KEY_NG!,
  KES: process.env.PAYSTACK_SECRET_KEY_KE!,
  GHS: process.env.PAYSTACK_SECRET_KEY_GH!,
  ZAR: process.env.PAYSTACK_SECRET_KEY_ZA!,
};

function getPaystackKeyForCurrency(currency: SupportedCurrency): string {
  const key = PAYSTACK_KEYS[currency];
  if (!key) {
    throw new Error(`No Paystack key configured for currency ${currency}`);
  }
  return key;
}

Multi-Currency Checkout Pattern

If your application serves customers in multiple countries, you need a pattern for selecting the right currency and Paystack account. Here is a clean approach:

interface PaymentConfig {
  secretKey: string;
  currency: string;
  minimumAmount: number; // in minor units
}

const PAYMENT_CONFIGS: Record = {
  NG: {
    secretKey: process.env.PAYSTACK_SECRET_KEY_NG!,
    currency: 'NGN',
    minimumAmount: 10000,
  },
  KE: {
    secretKey: process.env.PAYSTACK_SECRET_KEY_KE!,
    currency: 'KES',
    minimumAmount: 100,
  },
  GH: {
    secretKey: process.env.PAYSTACK_SECRET_KEY_GH!,
    currency: 'GHS',
    minimumAmount: 100,
  },
  ZA: {
    secretKey: process.env.PAYSTACK_SECRET_KEY_ZA!,
    currency: 'ZAR',
    minimumAmount: 100,
  },
};

async function initializePayment(
  email: string,
  amountInMinorUnit: number,
  countryCode: string
) {
  const config = PAYMENT_CONFIGS[countryCode];

  if (!config) {
    throw new Error(`Payments not available in country: ${countryCode}`);
  }

  if (amountInMinorUnit < config.minimumAmount) {
    throw new Error(
      'Amount below minimum for ' + config.currency + '. ' +
      'Minimum: ' + (config.minimumAmount / 100) + ' ' + config.currency
    );
  }

  const response = await fetch('https://api.paystack.co/transaction/initialize', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${config.secretKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      email,
      amount: amountInMinorUnit,
      currency: config.currency,
    }),
  });

  return response.json();
}

The country code can come from the user's profile, their IP address (via a geolocation service), or a manual selection on your checkout page. Use whatever makes sense for your product.

Accepting USD on Paystack

USD is a special case. Most Paystack accounts do not have USD enabled by default. To accept USD:

  1. Your business must be fully verified on Paystack (KYC complete)
  2. Contact Paystack support and request USD currency activation
  3. Paystack may require additional documentation depending on your business type
  4. Once approved, USD will appear as an available currency in your dashboard

When you charge in USD, Paystack handles the conversion and settles to your local account in your default currency. The settlement amount will reflect the exchange rate at the time of settlement, not at the time of charge. This means there is exchange rate risk between the charge and settlement dates.

If you are accepting USD from international customers, make sure your checkout clearly displays prices in USD and confirms the currency before the customer pays. Accidentally charging someone in NGN when they expected USD (or vice versa) is a quick way to get chargebacks.

Verification Checklist

After fixing the error:

  1. Test with your default currency. Initialize a transaction with your account's primary currency (e.g., NGN for Nigerian accounts). Confirm it succeeds.
  2. Test with a non-default currency you have enabled. If you enabled USD, initialize a transaction with currency: "USD". Confirm it succeeds.
  3. Test with a currency you have NOT enabled. Send a currency your account does not support. Confirm you get the "Currency not supported" error. Verify your server-side validation catches it before the API call.
  4. Test with malformed currency codes. Send lowercase "ngn", send "Naira", send an empty string. Confirm your validation normalizes or rejects these.
  5. Test both test and live modes. Verify the currencies are enabled in both environments.
  6. For multi-account setups, verify key routing. Confirm that KES transactions use the Kenyan account key and NGN transactions use the Nigerian account key.

For related amount errors, see Paystack Amount Too Low Error and Paystack Invalid Amount Error and Kobo Confusion. For the complete error reference, see Paystack Errors and Troubleshooting: The Complete Reference.

Key Takeaways

  • ✓Your Paystack account is registered to a specific country and defaults to that country's currency. A Nigerian business account uses NGN. A Ghanaian account uses GHS. A South African account uses ZAR. A Kenyan account uses KES. You cannot charge in a currency your account does not support.
  • ✓To enable additional currencies, go to your Paystack dashboard under Settings. Some currencies can be enabled with a toggle. Others require contacting Paystack support. USD acceptance, for example, typically requires additional verification.
  • ✓The currency field must be a valid ISO 4217 three-letter code in uppercase: "NGN", "GHS", "ZAR", "KES", "USD". Sending "naira", "ngn" (lowercase), "N", or an empty string will trigger an error.
  • ✓If you omit the currency field entirely, Paystack defaults to your account's primary currency. This is fine for single-currency apps but dangerous for multi-currency ones where you might accidentally charge in the wrong currency.
  • ✓Test mode and live mode can have different currency configurations. Verify that the currencies you enabled in test mode are also enabled in live mode before going to production.
  • ✓When building multi-currency checkout, always validate the currency against your known supported list on the server side before calling Paystack. This prevents the error and lets you show a meaningful message.

Frequently Asked Questions

Can a Nigerian Paystack account accept KES payments?
Not directly. A Nigerian Paystack account is configured for NGN by default. To accept KES, you would need a Kenyan Paystack account. Paystack does not allow cross-country currency acceptance on a single account. If you serve customers in multiple African countries, you need separate Paystack accounts for each country.
What happens if I omit the currency field entirely?
Paystack uses your account's default currency. For a Nigerian account, it defaults to NGN. This works fine for single-currency applications. For multi-currency apps, always specify the currency explicitly to avoid charging in the wrong currency.
Is the currency code case-sensitive?
Yes. Paystack expects uppercase ISO 4217 codes: "NGN", "GHS", "ZAR", "KES", "USD". Lowercase like "ngn" will likely be rejected. Always normalize to uppercase in your code before sending to Paystack.
How do I enable a new currency on my Paystack account?
Log in to your Paystack dashboard. Go to Settings and look for the Currencies or Payment Channels section. Some currencies have toggle switches you can enable directly. Others, especially USD, require you to contact Paystack support. They may ask for additional business documentation.
Can I accept both Naira and Dollars on the same checkout page?
Yes, if your account supports both currencies. Let the customer choose their preferred currency, then pass that currency code to Paystack when initializing the transaction. Make sure the amount is converted to the correct minor unit for the selected currency (kobo for NGN, cents for USD).

Learn Paystack Integration

KES 2,999

The definitive guide to building payment systems with Paystack — from your first transaction to production-grade payment infrastructure across Africa. 9 modules, 47 lessons. Free preview available.

Start Paystack Course

Not ready? Create Free Account

Keep reading

Paystack Errors and Troubleshooting: The Complete Reference

Every Paystack error you will hit in production, what causes it, and how to fix it. Authentication failures, webhook signature problems, transaction errors, transfer issues, and frontend bugs. Code-first solutions for each one.

Read more

Paystack "Declined by Financial Institution" Error

The "Declined by financial institution" response means the customer's bank rejected the transaction. This is not a Paystack error or a bug in your code. The bank made the decision, and neither you nor Paystack can override it.

Read more

Paystack Transfer OTP Required Error

Your transfer call returns an OTP required error because Paystack protects every transfer with a one-time password by default. To automate transfers, you must call the disable_otp endpoint, confirm via the finalize_disable_otp endpoint, and accept the security trade-off. This guide walks through every step with code.

Read more

Paystack Rate Limit and 429 Handling

Paystack returns 429 Too Many Requests when you exceed their API rate limit. This guide covers the actual limits, how to implement exponential backoff, when to cache responses, and how to batch operations to avoid hitting the limit.

Read more

Paystack Webhooks and CSRF Protection in Rails

Rails rejects Paystack webhook POSTs with an ActionController::InvalidAuthenticityToken error because they lack a CSRF token. This guide shows how to skip CSRF verification for your webhook controller while keeping protection active everywhere else, plus the complete HMAC signature verification setup in Ruby.

Read more

Seeding Test Data for a Payments Feature

Good test data is essential for testing payment features. This guide covers creating Paystack test mode resources (plans, subaccounts, split codes) and seeding your application database with matching payment records for realistic test scenarios.

Read more

Explore related topics

M-Pesa & African Stack

M-Pesa Daraja API tutorials, USSD development, and WhatsApp Business API guides. The African Stack that global bootcamps do not teach.

Learn to Code in Kenya

Everything a Kenyan needs to know before writing their first line of code. Career paths, real costs, hardware requirements, and honest answers about what it takes.

Learning to Code

Roadmaps, language guides, and practical advice for learning to code and launching a programming career.

Breaking Into Tech

Practical, no-nonsense guides for anyone looking to start or change their career in tech. From choosing your first language to acing interviews.

The African Stack: Skills for This Market

The skills that make Kenyan developers hard to replace: M-Pesa, USSD, WhatsApp, fintech, and building for the African market.

Bonaventure Ogeto

Bonaventure Ogeto

Founder, McTaba Labs

Bonaventure is the founder of McTaba Labs, a coding bootcamp in Nairobi, Kenya. He has spent years building products for the African market and mentoring the next generation of developers across the continent.