Migration guides
Migrating from Convera
If you use Convera GlobalPay for Students (formerly Western Union Business Solutions), your students already pay in their home currency through a portal with a payment reference. Qualy works the same way for the student. What changes for you is that every payment is a record you create and track through an API, and you can pay agents and partners from it.
Convera doesn't publish a public developer API for its student payments, so this guide maps workflows rather than API calls.
Concept map
| Convera GlobalPay for Students | Qualy | Notes |
|---|---|---|
| Payer (student with a student id) | Contact | Keep your student id in a custom field. |
| Payment instructions + unique reference | Payment intent + its link | The payment carries its own reference, so nothing is matched by hand. |
| Institution payer portal | Payment portal on your subdomain or custom domain | One-off links per student, or reusable links for set fees. |
| Paying in home currency with a held quote | settlementCurrency, or the student chooses on the portal | Local methods appear by currency. |
| Card, eWallet, local bank transfer | Methods on the portal | See Collecting payments. |
| Agent pays, or sends the student a link | The agent shares the payment link; payment splits pay the agent's commission | — |
| Tracking emails and texts | Notifications and dunning | Reminders before and after the due date. |
| Refund with its own reference | Refund | — |
| Reconciliation data into finance | Webhooks + queries | paymentIntents.update, transactions.create, splitIntents.update. |
Issuing a payment
Where a student would start on Convera's portal and pick your institution, you create the payment and send them straight to it:
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',
number: 'STU-88231-T1',
contact: 'chen.wei@example.com',
currency: 'AUD',
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);
For fees anyone can pay without being invoiced first (application fees, deposits), use a reusable link instead.
Reconciliation
You don't import a file. Listen for:
paymentIntents.update—statusmoves topaid-partialorpaid-full.transactions.create— money arrived, with amount, currency and method.
Bank transfers to Qualy are matched by the payment's reference (QLY-PYMT-<number>), shown to the student on the portal.
Cutting over
- Switch by intake or term. Payments already sent to Convera, and refunds on them, finish with Convera.
- Import open balances as contacts and payment intents, and send the new links.
- Update your payment pages and agent instructions to point to Qualy links, so no one pays the same fee twice.