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

TransferMateQualyNotes
Education: payer payment (MakeAPayment)Payment intent + its payment linkThe student pays on Qualy's portal in their own currency.
Education: FX conversionsettlementCurrency on the paymentQualy prices FX at checkout.
Education: payer documents / ID checksBuilt into the portalOver the API, sign returns 424 with the missing fields. See Collecting payments.
Corporate: Global / Virtual AccountsBank transfer methods on the paymentEach payment shows the account and reference to pay to.
Corporate: payment requestsPayment linksOne-off links per student, or reusable links per service.
Corporate: clients, banks and beneficiariesPartnerships + their bank accountsSet beneficiaries up again: bank details held by TransferMate don't come across.
Corporate: outgoing paymentsPayment splitsDeclared on the payment; paid out by Qualy once the student's money settles.
Payment / credit webhooksQualy webhookspaymentIntents.update, transactions.create, splitIntents.update.
StatementsTransactions + 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.
Previous
From Flywire