Skip to content

Payment Gateways

ChargePanda supports several payment gateways. Enable and configure them under Admin Dashboard > Settings > Payments. Each gateway has its own tab.

PayPal

PayPal lets customers pay with their PayPal balance or a card through PayPal's secure checkout. At checkout, customers are taken to PayPal to approve the payment, then redirected straight back to your store to complete their order.

PayPal now uses the REST "PayPal Checkout" connection. PayPal has retired the older API Username / Password / Signature credentials. If you used PayPal on an earlier version of ChargePanda, you'll need to reconnect using a Client ID and Secret from a PayPal app (steps below). Until you do, PayPal stays hidden at checkout so customers are never shown a payment option that can't be completed.

Supported currencies

PayPal supports a fixed set of currencies (US Dollar, Euro, British Pound, Canadian Dollar, Australian Dollar, and around twenty others). ChargePanda sends your store currency as-is — if PayPal doesn't support it, or your PayPal account isn't set up to accept it, the payment is declined. Set your store currency under Settings > General before enabling PayPal, and check PayPal's list of supported currencies if you're unsure.

Subscriptions renew manually. ChargePanda's PayPal integration takes one-time payments. When a subscription renews, a new invoice is created that the customer pays themselves each billing cycle — PayPal is not charged automatically.

Setup

  1. Go to Settings > Payments and open the PayPal tab.
  2. Set Enable PayPal to Yes.
  3. Set Enable Sandbox mode to Yes while testing (this uses your PayPal Sandbox app credentials), or No to take real payments (this uses your Live app credentials).
  4. Choose the Default Order Status applied after a successful payment (Processing or Completed).
  5. Optionally set the Payment Title shown at checkout.
  6. In the PayPal Developer Dashboard > Apps & Credentials, switch to Sandbox or Live to match step 3, create an app (or open an existing one), and copy its Client ID and Secret.
  7. Paste the Client ID and Secret into the matching fields in ChargePanda.
  8. Configure the webhook (see below) and save.

Use your Sandbox app credentials while trying things out, then switch to your Live app credentials (and set Sandbox mode to No) when you are ready to take real payments.

A webhook lets PayPal confirm a payment reliably even if the customer closes their browser before returning to your store.

  1. In the PayPal settings tab in ChargePanda, copy the Webhook URL shown.
  2. In the PayPal Developer Dashboard, open your app and scroll to the Webhooks section (in the matching Sandbox/Live mode).
  3. Click Add Webhook, paste the URL, and subscribe it to the Payment capture completed (PAYMENT.CAPTURE.COMPLETED) event.
  4. Save. PayPal will show a Webhook ID — copy it.
  5. Paste it into the Webhook ID field in ChargePanda and save.

Troubleshooting

  • PayPal doesn't show up at checkout. Enable PayPal isn't set to Yes, or the Client ID / Secret fields are empty. Check the PayPal tab under Settings > Payments and save again.

  • "Unable to authenticate with PayPal." The Client ID or Secret is wrong, or doesn't match the mode you selected. Sandbox credentials only work with Sandbox mode Yes; Live credentials only work with Sandbox mode No. Re-copy both from the correct (Sandbox/Live) app in the PayPal Developer Dashboard.

  • Order marked Failed right after paying. The captured amount or currency didn't match the order, or PayPal rejected the capture. Make sure your store currency (Settings > General) is one your PayPal account accepts, and try again.

  • Payment completed on PayPal but order stays Pending. The customer likely didn't return to your store, and the webhook isn't set up. Follow the webhook setup steps above so PayPal can confirm payments automatically.


Paystack

Paystack lets you accept card and local payments across Nigeria, Ghana, South Africa, Kenya and other supported regions. At checkout, customers are taken to Paystack's secure hosted payment page to pay, then redirected straight back to your store to complete their order. This redirect approach works reliably in every browser (including Firefox and Safari).

Supported currencies

ChargePanda will send a Paystack payment when your store currency is one of:

CodeCurrency
NGNNigerian Naira
GHSGhanaian Cedi
ZARSouth African Rand
KESKenyan Shilling
USDUS Dollar
EGPEgyptian Pound
XOFWest African CFA Franc
RWFRwandan Franc

Important: this is the list ChargePanda allows. It is not the same as the currencies your Paystack account can actually accept. Paystack enables currencies per account based on the country you registered in — for example, a Nigerian account is usually NGN only, and accepting USD or other currencies often needs to be activated separately by Paystack.

A payment can only go through when your store currency is in both lists — the table above and the set your own Paystack account is enabled for. If you are unsure, the safest choice is the home currency of the country your Paystack account is registered in (e.g. NGN for a Nigerian account). You can check the currencies enabled on your account in your Paystack Dashboard under Settings.

Set your store currency under Settings > General before enabling Paystack. If you pick a currency your account does not support, checkout will fail with a message telling you the currency is not supported.

Setup

  1. Go to Settings > Payments and open the Paystack tab.
  2. Set Enable Paystack to Yes.
  3. Choose the Default Order Status applied after a successful payment (Processing or Completed).
  4. Optionally set the Payment Title and Payment Description shown at checkout.
  5. From your Paystack Dashboard > Settings > API Keys & Webhooks, copy your Public Key (pk_test_… / pk_live_…) and Secret Key (sk_test_… / sk_live_…) and paste them into the matching fields.
  6. Save your changes.

Use your test keys while trying things out, then switch to your live keys when you are ready to take real payments. Paystack's test card 4084 0840 8408 4081 (any future expiry, any CVV) can be used to simulate a successful payment.

A webhook lets Paystack confirm a payment reliably even if the customer closes their browser before returning to your store.

  1. In the Paystack settings tab, copy the Webhook URL shown.
  2. Paste it into the Webhook URL field in your Paystack Dashboard (under the matching Test/Live section) and save.

Paystack will then notify your store of completed payments automatically.

Troubleshooting

If checkout shows "Unable to initialise the Paystack transaction":

  • Keys in the wrong fields. The Public Key starts with pk_ and the Secret Key with sk_. If you accidentally paste them into the wrong boxes, your store now detects this and uses each key correctly, and saving the Payments settings once will move them into the right fields automatically — so this no longer breaks checkout.
  • Keys still rejected ("Invalid key"). If the message persists, the keys themselves are wrong. Copy a fresh Public and Secret key from your Paystack Dashboard and paste them in again.
  • Currency not supported. If the message mentions the currency, set your store currency (under Settings > General) to one your Paystack account is enabled to settle.

Xendit

Xendit is a payment platform for Southeast Asia, serving Indonesia, the Philippines, Malaysia, Thailand, Vietnam and more. At checkout, customers are taken to Xendit's secure hosted payment page to pay, then redirected straight back to your store to complete their order.

Supported currencies

ChargePanda will send a Xendit payment when your store currency is one of:

CodeCurrency
IDRIndonesian Rupiah
PHPPhilippine Peso
USDUS Dollar
THBThai Baht
MYRMalaysian Ringgit
VNDVietnamese Dong

Important: this is the list ChargePanda allows. It is not the same as the currencies your Xendit account can actually accept. Xendit enables currencies per account based on the country you registered in — for example, an Indonesian account is typically IDR only, and accepting other currencies may need to be activated separately.

A payment can only go through when your store currency is in both lists — the table above and the set your own Xendit account is enabled for. Check which currencies are active on your account in your Xendit Dashboard under Settings.

Amounts are always rounded to the nearest whole number. Xendit does not use decimal subunits (no cents or pence). If your store price is $10.99 USD, Xendit will charge $11. Set your prices accordingly.

Set your store currency under Settings > General before enabling Xendit.

Setup

  1. Go to Settings > Payments and open the Xendit tab.
  2. Set Enable Xendit to Yes.
  3. Choose the Default Order Status applied after a successful payment (Processing or Completed).
  4. Optionally set the Payment Title and Payment Description shown at checkout.
  5. In your Xendit Dashboard → Settings → API Keys:
    • Open the API key you want to use (or create a new one).
    • Under Permissions, enable Money-in products (this grants permission to create Invoices). Without this, every payment attempt will fail with a permissions error.
    • Save the key.
    • Copy the Secret Key — it starts with xnd_development_ for test mode or xnd_production_ for live mode.
  6. Paste the Secret Key into the Secret API Key field in ChargePanda.
  7. Configure the webhook (see below) and save.

Use your test (xnd_development_) key while trying things out, then switch to your live (xnd_production_) key when you are ready to take real payments.

Webhook (required)

The webhook is essential for Xendit — it confirms payment reliably even if the customer closes their browser before returning to your store.

  1. In the Xendit settings tab in ChargePanda, copy the Webhook URL shown.
  2. In your Xendit Dashboard → Settings → Callbacks:
    • Find the Invoice Paid callback field.
    • Paste the webhook URL.
    • Save. Xendit will generate a Verification Token.
    • Copy the Verification Token.
  3. Paste the Verification Token into the Webhook Verification Token field in ChargePanda.
  4. Save your ChargePanda settings.

Both test and live modes have separate callback settings. Make sure you configure the webhook in the mode that matches your API key (test callbacks for test keys, live callbacks for live keys).

Troubleshooting

  • Payment fails immediately / order goes to "Failed". The most common cause is that the API key does not have Money-in products permission. Go to Xendit Dashboard → Settings → API Keys, open your key, enable Money-in products, save, then re-copy and re-paste the Secret Key.

  • Currency error at checkout. Your store currency (under Settings > General) is not in Xendit's supported list (IDR, PHP, USD, THB, MYR, VND), or it is not enabled on your Xendit account. Change the store currency or contact Xendit to enable the currency on your account.

  • Payment completed on Xendit but order stays Pending. The webhook is not configured or the Verification Token is wrong. Follow the webhook setup steps above. Make sure the token in ChargePanda exactly matches the one shown in your Xendit Dashboard Callbacks settings for the same mode (test vs live).

  • Amounts look wrong (rounded). This is expected — Xendit only accepts whole-number amounts. A $9.99 product will be charged as $10. Adjust your pricing to avoid unexpected rounding.


Lemon Squeezy

Lemon Squeezy is a merchant-of-record payment platform. At checkout, customers pay in a secure Lemon Squeezy popup without ever leaving your store.

Currency

Lemon Squeezy checkouts always use the currency configured on your Lemon Squeezy store — there is no way to choose a currency per order. Set your store currency under Settings > General to match the currency configured on your Lemon Squeezy store before enabling it.

Important: if the two currencies don't match, Lemon Squeezy will misread your order totals and checkouts will fail — for example, a $19.00 order can be read as a small fraction of that in the wrong currency and rejected with an error like "The custom price field must be at least …". Always double-check both currencies match before going live.

Setup

  1. In your Lemon Squeezy Dashboard, create one product with a single variant to act as a placeholder. Its price and name don't matter — ChargePanda overrides the price with the actual order total, and overrides the displayed name with the actual product/plan being purchased, on every checkout.
  2. Go to Settings > Payments and open the Lemon Squeezy tab.
  3. Set Enable Lemon Squeezy to Yes.
  4. Choose the Default Order Status applied after a successful payment (Processing or Completed).
  5. Optionally set the Payment Title and Payment Description shown at checkout.
  6. From your Lemon Squeezy Dashboard, copy your Store ID (Settings > Stores), the Variant ID of the placeholder product you created, and an API Key (Settings > API), then paste them into the matching fields.
  7. Configure the webhook (see below) and save.

Webhook (required)

Unlike some other gateways, the webhook is not optional for Lemon Squeezy — it's the only way ChargePanda can confirm a payment succeeded. Without it, orders will stay Pending after checkout even though the customer paid.

  1. In the Lemon Squeezy settings tab in ChargePanda, copy the Webhook URL shown.
  2. In your Lemon Squeezy Dashboard → Settings → Webhooks, click + Add webhook, paste the URL, choose a signing secret, and select the order_created event.
  3. Save the webhook, then paste the same signing secret into the Signing Secret field in ChargePanda.

Troubleshooting

  • Payment completed on Lemon Squeezy but order stays Pending. The webhook is not configured, or the Signing Secret in ChargePanda doesn't match the one in your Lemon Squeezy Dashboard webhook settings. Follow the webhook setup steps above.

  • Checkout fails with "The custom price field must be at least …" (or the charged amount looks wrong). Your ChargePanda store currency doesn't match your Lemon Squeezy store's configured currency, so your order total is being misread in the wrong currency. Check both under Settings > General (ChargePanda) and your Lemon Squeezy Dashboard, and make sure they're set to the same currency.


Cryptomus

Cryptomus lets you accept cryptocurrency payments. Customers pay in USDT, choosing whichever blockchain network they prefer (TRC20, ERC20, BEP20, and others) on Cryptomus's secure hosted payment page, then are redirected straight back to your store once payment is complete.

Supported currencies

ChargePanda will send a Cryptomus payment when your store currency is one of:

CodeCurrency
USDUS Dollar
EUREuro
GBPBritish Pound

Important: your store currency is only used to price the invoice — customers always pay in USDT. Cryptomus converts your store currency amount to USDT automatically at checkout.

Set your store currency under Settings > General before enabling Cryptomus.

Subscriptions renew manually. Like all cryptocurrency payments, Cryptomus cannot automatically charge a customer again when a subscription renews. As with Xendit, a renewal creates a new invoice that the customer pays themselves each billing cycle.

Setup

  1. Go to Settings > Payments and open the Cryptomus tab.
  2. Set Enable Cryptomus to Yes.
  3. Choose the Default Order Status applied after a successful payment (Processing or Completed).
  4. Optionally set the Payment Title and Payment Description shown at checkout.
  5. In your Cryptomus merchant dashboard, go to Settings > API and copy your Merchant ID and API Key.
  6. Paste them into the matching fields in ChargePanda.
  7. Configure the webhook (see below) and save.

Webhook (required)

The webhook is essential for Cryptomus — it confirms payment reliably even if the customer closes their browser before returning to your store.

  1. In the Cryptomus settings tab in ChargePanda, copy the Webhook URL shown.
  2. In your Cryptomus merchant dashboard, go to Settings > API and paste the URL into the payment callback field.
  3. Save.

Troubleshooting

  • Currency error at checkout. Your store currency (under Settings > General) is not in Cryptomus's supported list (USD, EUR, GBP). Change your store currency to one of these.

  • Payment completed on Cryptomus but order stays Pending. The webhook is not configured, or the callback URL in your Cryptomus dashboard does not match the one shown in ChargePanda. Follow the webhook setup steps above.

  • Order marked Failed after payment. The customer likely sent less than the invoiced amount (Cryptomus reports this as an underpayment). Ask the customer to complete the remaining balance, or contact them to arrange payment again for the full amount.


Paddle

Paddle is a merchant-of-record payment platform. At checkout, customers pay in a secure Paddle popup without ever leaving your store.

Important: use Paddle Billing, not Paddle Classic. Paddle has two generations of product — the older Paddle Classic and the current Paddle Billing. ChargePanda only supports Paddle Billing. If you already have a Paddle Classic account, you'll need a separate Paddle Billing account (new sign-ups on paddle.com are Billing by default). Classic credentials (a vendor auth code) look completely different from Billing credentials and will not work — pasting one in will cause every checkout attempt to fail.

Unlike some other gateways, you do not need to pre-create a product in your Paddle dashboard. ChargePanda sends Paddle a "non-catalog" (ad-hoc) item on every checkout, so Paddle creates the product and price on the fly — there's no placeholder to set up or keep in sync.

Required one-time Paddle account setup: Default Payment Link. Paddle won't let any integration create a transaction until your account has a Default Payment Link set. In your Paddle Dashboard > Checkout > Checkout settings, set a Default Payment Link and save. This is a Paddle account requirement, unrelated to ChargePanda's setup — without it, every checkout attempt fails.

Setup

  1. Go to Settings > Payments and open the Paddle tab.
  2. Set Enable Paddle to Yes.
  3. Choose the Default Order Status applied after a successful payment (Processing or Completed).
  4. Optionally set the Payment Title and Payment Description shown at checkout.
  5. Choose the EnvironmentSandbox to test with fake payments, or Live to accept real ones. This must match the credentials you paste in below.
  6. In your Paddle Dashboard — making sure you're in a Paddle Billing account — go to Developer Tools > Authentication:
    • Copy the Client-side Token shown there (starts with test_ for Sandbox or live_ for Live). This is a public token, safe to expose in the browser.
    • Create (or copy) an API key. Under its permissions, enable Transactions: Write (Write also grants Read, and Transactions is the only permission ChargePanda needs — no Products or Prices access required). This is a secret key — keep it safe.
  7. Paste the Client-side Token and API Key into the matching fields in ChargePanda.
  8. Configure the webhook (see below) and save.

Sandbox and Live each have their own separate Client-side Token and API key in the Paddle Dashboard — make sure the ones you paste in match the Environment you selected.

A webhook lets Paddle confirm a payment reliably even if the customer closes their browser before returning to your store.

  1. In the Paddle settings tab in ChargePanda, copy the Webhook URL shown.
  2. In your Paddle Dashboard > Developer Tools > Notifications, add a new notification destination using that URL.
  3. Subscribe it to the transaction.completed event.
  4. Paddle will show a Notification Secret Key — copy it.
  5. Paste it into the Webhook Secret Key field in ChargePanda and save.

Troubleshooting

  • Paddle doesn't show up at checkout. Enable Paddle isn't set to Yes, or the Client-side Token / API Key fields are empty. Check the Paddle tab under Settings > Payments and save again.

  • "Unable to create the Paddle transaction." This has two common causes:

    • The API Key isn't a valid Paddle Billing key — commonly because a Paddle Classic credential (or some other key) was pasted in by mistake. Go to your Paddle Billing Dashboard's Developer Tools > Authentication > API keys, copy the correct key for the Sandbox/Live environment you selected, and paste it into the API Key field again.
    • Your Paddle account has no Default Payment Link set yet. See the note under Setup above — set one in Paddle Dashboard > Checkout > Checkout settings and retry.
  • Payment completed in the Paddle popup but the order stays Pending / Failed. The webhook isn't configured, or the Webhook Secret Key in ChargePanda doesn't match the Notification Secret Key shown in your Paddle Dashboard's Notifications settings. Follow the webhook setup steps above — also double check you subscribed to the transaction.completed event.

  • Works in Sandbox but not Live (or vice versa). The Client-side Token, API Key, and Environment setting must all match. Sandbox credentials only work with Environment set to Sandbox; Live credentials only work with Environment set to Live.

Released under the Commercial License.