Migration guides
Migrating from TransferMate
If you built on TransferMate Education (payer payments, FX conversion, payer documents) or TransferMate Corporate (global accounts, beneficiaries, payment requests, outgoing payments), this guide shows where each piece lives in Qualy's API.
Concept map
| TransferMate | Qualy | Notes |
|---|---|---|
Education: payer payment (MakeAPayment) | Payment intent + its payment link | The student pays on Qualy's portal in their own currency. |
| Education: FX conversion | settlementCurrency on the payment | Qualy prices FX at checkout. |
| Education: payer documents / ID checks | Built into the portal | Over the API, sign returns 424 with the missing fields. See Collecting payments. |
| Corporate: Global / Virtual Accounts | Bank transfer methods on the payment | Each payment shows the account and reference to pay to. |
| Corporate: payment requests | Payment links | One-off links per student, or reusable links per service. |
| Corporate: clients, banks and beneficiaries | Partnerships + their bank accounts | Set beneficiaries up again: bank details held by TransferMate don't come across. |
| Corporate: outgoing payments | Payment splits | Declared on the payment; paid out by Qualy once the student's money settles. |
| Payment / credit webhooks | Qualy webhooks | paymentIntents.update, transactions.create, splitIntents.update. |
| Statements | Transactions + queries | — |
Payment references
Bank transfers to Qualy are matched by the payment's reference, QLY-PYMT-<number>, shown to the payer on the portal. Ask payers to quote it exactly. If you set your own number on a payment it can't start with QLY-PYMT-, which is reserved.
Payers who saved your TransferMate bank details should use the details shown on their Qualy payment instead.
Moving a payment flow
Before (TransferMate Education): quote with FXConversion, create with MakeAPayment, wait for the status webhook.
After (Qualy): create one payment and send its link. The student picks their currency and method on the portal; you get a webhook when it's paid.
const res = await fetch('https://api.qualyhq.com/v1/payment-intents/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'ApiKey your-api-key-here',
'X-TENANT-ID': 'your-tenant-id-here',
},
body: JSON.stringify({
intentType: 'ad-hoc',
contact: 'priya.shah@example.com',
currency: 'AUD', // what you invoice; the student can pay in INR, EUR…
dueAt: '2027-01-15T00:00:00.000Z',
items: [{ name: 'Tuition fee — Term 1', category: 'Course', amount: 820000 }],
}),
});
const { data: payment } = await res.json();
console.log(payment.links.short);
Before (TransferMate Corporate): receive into a Global Account, then send an outgoing payment to the school's beneficiary.
After (Qualy): attach a payment split to the payment. Qualy pays the school (and any agent) after the student's payment settles, and sends remittance advice.
What doesn't carry over
- TransferMate ids (transaction, order, beneficiary, account) stay on old records only.
- Beneficiary bank details — add each school or agent as a partnership with its bank account.
- Booked FX deals and rates — new payments are quoted at checkout.
- Card payments — payers enter their card on Qualy's portal.
- Webhook handlers — rebuild them on Qualy's events.