Cross-Border Payroll
Fund, send, and reconcile recurring payroll payouts with the merged Wallet, Beneficiary, and Exchange services.
Run Cross-Border Payroll Payouts
Use this flow when you need to fund a payroll run, reuse approved beneficiaries, convert balances into payout currencies, and reconcile salary or contractor disbursements through webhook-driven status updates.
✅ Before you start
Complete these steps before you run payroll through Verto:
- Authenticate with the merged Login service and store the returned
tokenandcompanyId. - Decide whether you are sending payouts from your own wallet or on behalf of downstream customers.
- Collect the beneficiary and bank-routing or stablecoin wallet data for every employee or contractor you need to pay.
- Create and store beneficiary records so you can reuse them across recurring pay runs.
- Make sure the source wallet has enough
availableBalancefor the full payroll run or planned batch segment. - Register webhook endpoints so you can reconcile each payout outcome asynchronously.
- Generate a unique
paymentIdor idempotency key for every worker payment, not only for the run as a whole.
Use Environments to configure the merged service hosts for Login, Wallet, Beneficiary, and Exchange.
📚 Use this page with the recipe
This guide explains when to use the payroll payout flow and the minimum sequence. For the implementation walkthrough, use the recipe:
Run Cross-Border Payroll Payouts Recipe →
The payroll payout workflow
This use case follows a simple sequence:
- Create or validate beneficiary records for each worker with Create beneficiary and Fetch beneficiary by ID.
- Check beneficiary readiness before adding a worker to the payable batch.
- Confirm wallet balance with Get all Wallets before each batch segment.
- Get an FX rate and create the FX trade with Get FX rate and Create FX trade when the payout currency differs from the source wallet currency.
- Store
paymentIdand tradereferencefor each worker payment. - Track payout states through webhooks instead of polling for each item.
- Reconcile completed, failed, rejected, or refunded outcomes back into your payroll or finance system.
Before you submit a worker payment, check:
| Object | Fields to check |
|---|---|
| Wallet | availableBalance, currency, isDisabled |
| Beneficiary | verificationState, isAccountActive, isArchived, isUpdateRequired, paymentMode |
| FX trade | paymentId, reference, state, inwardSettlementTime, outwardSettlementTime |
What makes this use case different?
Unlike a one-off payout flow, payroll usually needs you to:
- reuse beneficiary records safely across recurring cycles
- apply deterministic reconciliation for every worker payment
- isolate failures so one bad item does not force a full rerun
- refresh beneficiary readiness before each pay cycle because a beneficiary can later require updates or become inactive
- create a new FX rate token for each execution window because
vfx_tokenvalues are short-lived
Optional: Run payroll in batches
If your payroll run contains many payouts, process the run in smaller batches and keep the paymentId or idempotency key at the individual payment level.
This helps you retry only the affected items when a timeout or route-specific delay occurs.
Where to go deeper
Use the product guides when you need implementation detail for a specific step:
Troubleshooting
| Issue | What to check |
|---|---|
| Duplicate payout risk after timeout | Retry only the affected payout item and reconcile using the same paymentId or idempotency key. |
| Beneficiary is rejected | Confirm the account number, routing fields, stablecoin wallet details, and country or currency data match the target payroll corridor. |
| Beneficiary is no longer payable | Check verificationState, isAccountActive, isArchived, and isUpdateRequired before each pay cycle. |
| FX token expires before execution | Request a new FX rate and use the new vfx_token before creating the trade. |
| Payout remains in an intermediate state | Check your webhook consumer first, then confirm whether route timing, compliance review, or an RFI is delaying completion. |
| Batch partially succeeds | Reconcile each worker payment separately and retry only the affected items. |
Next steps
| Send → Implement the outbound payout flow for each worker payment. | Handle RFIs and Compliance Exceptions → Pause review-blocked payroll items safely and avoid duplicate retries. |
Updated 3 days ago
