Fiat & Bank Integration
There are four ways to let your users pay in or cash out with fiat money on a HollaEx exchange. They differ in who holds the money, who checks the user, and how much work your team does for each transaction.
Your options
| Option | Who holds the fiat | What your team does | Examples |
|---|---|---|---|
| On/off-ramp plugin | The provider. Your exchange never touches fiat. | Sign up with the provider and install the plugin. | Transak, Banxa, Guardarian, Simplex, Onramper |
| Payment-provider plugin | Your account with the provider. | Sign up with the provider, install the plugin and watch for transactions held for review. | Finmo |
| Manual fiat with Fiat Controls | Your exchange's own bank account. | Check and approve every deposit and withdrawal by hand. | Fiat Controls, optionally with the Bank plugin |
| Custom bank integration | Your own bank or payment processor. | Have it built for you, or build it as a plugin. | Built on request |
Installing plugins needs the Enterprise plan on HollaEx Cloud.
On/off-ramp plugins
An on/off-ramp plugin adds a buy (and sometimes sell) page to your exchange. The user picks a coin and an amount, then pays on the provider's own checkout. The provider handles the card or bank payment, its own identity checks and the conversion, and sends the crypto to the user's deposit address on your exchange. Your exchange never receives or holds fiat, and no fiat balance appears in the user's wallet.
- Transak: buy and sell crypto with cards, bank transfers and local payment methods.
- Banxa: buy crypto with cards and local payment methods.
- Onramper: buy and sell crypto through Onramper's network of providers.
- Guardarian: buy crypto by card.
- Simplex: buy crypto by card.
This is the simplest option when you don't want to hold fiat or handle payments yourself.
Payment-provider plugins
A payment-provider plugin connects your exchange to your own account with a payment company. Money from your users goes into that account, and the plugin credits your users on the exchange.
- Finmo: Australian dollar (AUD) deposits and withdrawals. Each user gets their own deposit account.
For other payment providers, open a ticket.
Finmo pays withdrawals to the user's own verified bank account. The bank details are stored by the Bank plugin, which HollaEx sets up for you on request.
Manual fiat with Fiat Controls
With Fiat Controls, users deposit to and withdraw from your exchange's own bank account. Each request appears in Operator Controls, and someone on your team checks the bank account and approves or dismisses it. Nothing is automated, so it works with any bank in any country, but your team does the work for every transaction.
Fiat Controls collect your users' payment details themselves. Some exchanges also use the Bank plugin to collect bank details.
A custom bank integration
To connect your exchange directly to your own bank or payment processor, so that deposits and withdrawals happen without anyone approving them, you need a custom integration. There are two ways to get one:
- Ask HollaEx to build it. HollaEx builds custom plugins and integrations for Enterprise customers. Open a ticket from your HollaEx dashboard with the name of your bank or processor and the currencies you need.
- Build it yourself. A developer can build the integration as a plugin and install it on your exchange. See Develop Plugins.
Safety rules for any bank integration
Whoever builds it, a bank integration moves real money in and out of your exchange. It must follow the rules below. The current HollaEx payment plugins are the reference for how each one is done.
A deposit is credited only once, and only after the payment is confirmed
The exchange must not credit a user because a message says money arrived. Before crediting, the integration checks that the message really came from the provider, and asks the provider for the payment's own record. It credits only when that record shows a completed payment of the same amount and currency. Each payment is credited once: if the provider sends the same notification again, nothing more is credited.
For example:
Finmo signs each notification with a secret key that only you and Finmo know. The plugin rejects any notification without it, then looks the payment up with Finmo and checks the amount, the currency and that it was paid in full. A payment that has already been recorded is refused.
Deposits that need a person's attention, for example because they go over a user's daily limit or come from a bank account that isn't verified, are created as pending instead of being credited.
Funds are deducted before money is sent
When a user withdraws, the amount is taken out of their exchange balance (as a pending withdrawal) before the integration asks the bank to pay. This way the user can't spend or withdraw the same funds twice while the payment is in progress. For example, the Finmo plugin creates the pending withdrawal first and only then asks Finmo to send the money.
A withdrawal with an unclear result stays pending for a person to check
Sometimes the bank doesn't answer, the connection drops, or the answer is unexpected. The money may or may not have left your account. In that case the withdrawal stays pending for someone on your team to check with the bank. It is never refunded to the user, and never sent again automatically, because either could pay the user twice.
For example, when the Onramper plugin can't tell whether a payout went out, it marks the order for review and doesn't retry it.
Ask how the integration handles each of these three cases. A good integration can answer all three without hesitation.
Need help? Open a ticket from your HollaEx dashboard.