Disbursement Status Notifications
Disbursement status notifications are callbacks that Flywire sends to notify you when a disbursement reaches a specific status. Currently, Flywire sends a notifications when a disbursement reaches the delivered status, indicating that Flywire has sent a bulk disbursement of funds to your institution's bank account.
A disbursement is a consolidated financial settlement transferred from Flywire to
Rather than transferring individual transactions separately, a disbursement acts as a single container that bundles together payouts, along with any applicable refunds or balance modifications, into one total settlement amount.
Note if you are using refunds:
Disbursements can also contain refunds if you are using the refund collection method netting.
Netting refers to a method used to simplify transactions. By offsetting the value of multiple payments between you and Flywire into a single net amount, it reduces the number of individual transactions.
Simplified example: You have to pay Flywire $200 because you have to refund money to your payers. At the same time, Flywire has to pay you $500 because you have new payments incoming. Instead of exchanging $200 and $500 separately, netting combines these amounts and you'll receive only $300 from Flywire while Flywire takes no money from you.
Essentials about using netting as a refund collection method
-
Refunds will only be processed when Flywire has received enough funds from new payments to offset them against the pending refunds.
-
This means if the original recipient doesn't have a constant stream of new incoming payments, it can take a while before refunds are processed.
-
This refund collection method is not available by default, you need to set it up together with Flywire. Please contact the Solutions team if you want to use this method.
Why should I use callbacks?
Using callbacks has several benefits:
-
You can use callbacks to trigger the reconciliation of Flywire disbursements within your accounting systems, ERP, etc.
-
You instantly receive aggregate data for the deposit, including total net amount, currency, and itemized counts for payments, refunds, and adjustments.
-
You can pair the callback for the bulk disbursement deposit (the disbursement delivered callback) with individual payment callbacks (the payment delivered callback) using their shared disbursement_id.
-
You can remove the need to manually monitor bank statements or log into the Flywire Dashboard to verify when your funds arrive.
When should I use callbacks?
If you have access to the Flywire Dashboard, callbacks are optional (but recommended) as you can manually monitor status updates there. If you don't have access to the Flywire Dashboard, it is highly recommended that you use callbacks to track status updates.
If you are using the
Flywire API, callbacks are essential to ensure you get reliable updates in real-time. Without callbacks, your system would have to poll the API for updates, which is resource-intensive and can lead to performance bottlenecks or rate-limiting.
How do I get started?
-
For your production environment: See How to set up Disbursement Status Notifications.
-
For testing notifications: See Flywire API Sandbox
Disbursement Statuses and Notifications
A disbursement can have the following statuses and notifications:
| Status | Notification | Description |
|---|---|---|
|
|
|
Flywire has sent the disbursement to your bank account. |
Content of Disbursement Status Notifications
-
Delivered
Flywire has sent the disbursement to your bank account.
Type of the event (status change).
Possible event types:
delivered
The time when the event (status change) occurred.
Timestamps use ISO 8601 format with UTC (YYYY-MM-DDTHH:MM:SSZ, e.g., 2025-03-31T13:21:27Z).
The last part of a timestamp indicates the time zone:
-
Z → Means UTC (Coordinated Universal Time).
Example: 2024-09-20T14:30:00Z = 2:30 PM in UTC.
-
+hh:mm or -hh:mm → Offset from UTC.
Example: 2024-09-20T14:30:00+02:00 = 2:30 PM in a time zone 2 hours ahead of UTC (e.g., Central European Summer Time).
The resource that has generated the notification.
Possible values:
-
disbursement
data object
The status of this disbursement.
Possible values:
-
delivered
The ID of the recipient that received the disbursement.
The recipient ID identifies the recipient (also called portal). The recipient ID has been assigned by Flywire when the recipient has been set up.
Format:
Either: 3 letters (ABC)
Or: 5 alphanumeric characters, always starting with a letter (ABC1D)
Only payments that are in status delivered have a disbursement ID.
The disbursement ID identifies a disbursement.
Format:
Either: ABC2025-12-17
3-letter portal/recipient ID disbursement date YYYY-MM-DD
Or: ABC1D2025-12-17
5-alphanum portal/recipient ID disbursement date YYYY-MM-DD
A disbursement is a consolidated financial settlement transferred from Flywire to
Rather than transferring individual transactions separately, a disbursement acts as a single container that bundles together payouts, along with any applicable refunds or balance modifications, into one total settlement amount.
Note if you are using refunds:
Disbursements can also contain refunds if you are using the refund collection method netting.
Netting refers to a method used to simplify transactions. By offsetting the value of multiple payments between you and Flywire into a single net amount, it reduces the number of individual transactions.
Simplified example: You have to pay Flywire $200 because you have to refund money to your payers. At the same time, Flywire has to pay you $500 because you have new payments incoming. Instead of exchanging $200 and $500 separately, netting combines these amounts and you'll receive only $300 from Flywire while Flywire takes no money from you.
Essentials about using netting as a refund collection method
-
Refunds will only be processed when Flywire has received enough funds from new payments to offset them against the pending refunds.
-
This means if the original recipient doesn't have a constant stream of new incoming payments, it can take a while before refunds are processed.
-
This refund collection method is not available by default, you need to set it up together with Flywire. Please contact the Solutions team if you want to use this method.
The total number of unique, originating payments represented by the payouts in this disbursement.
This summary counter allows you to verify the total number of originating payments without needing to fetch the detailed payouts list.
The total number of refunds deducted from this disbursement.
This summary counter allows you to quickly check if any refunds occurred without fetching the full list
You can retrieve an itemized breakdown of the refunds within a disbursement using the endpoint, Getting a List of all Refunds within a Disbursement.
A disbursement only contains refunds if you are using netting as a refund method
Netting refers to a method used to simplify transactions. By offsetting the value of multiple payments between you and Flywire into a single net amount, it reduces the number of individual transactions.
Simplified example: You have to pay Flywire $200 because you have to refund money to your payers. At the same time, Flywire has to pay you $500 because you have new payments incoming. Instead of exchanging $200 and $500 separately, netting combines these amounts and you'll receive only $300 from Flywire while Flywire takes no money from you.
Essentials about using netting as a refund collection method
-
Refunds will only be processed when Flywire has received enough funds from new payments to offset them against the pending refunds.
-
This means if the original recipient doesn't have a constant stream of new incoming payments, it can take a while before refunds are processed.
-
This refund collection method is not available by default, you need to set it up together with Flywire. Please contact the Solutions team if you want to use this method.
The total number of adjustments (both debits and credits) applied directly to this disbursement.
This summary counter allows you to quickly check if any adjustments occurred without fetching the full list.
You can retrieve an itemized breakdown of these adjustments within a disbursement using the endpoint, Getting a List of all Adjustments within a Disbursement.
The date and time at which the disbursement was delivered to the
Timestamps use ISO 8601 format with UTC (YYYY-MM-DDTHH:MM:SSZ, e.g., 2025-03-31T13:21:27Z).
The last part of a timestamp indicates the time zone:
-
Z → Means UTC (Coordinated Universal Time).
Example: 2024-09-20T14:30:00Z = 2:30 PM in UTC.
-
+hh:mm or -hh:mm → Offset from UTC.
Example: 2024-09-20T14:30:00+02:00 = 2:30 PM in a time zone 2 hours ahead of UTC (e.g., Central European Summer Time).
The net monetary total of the disbursement, representing the combined value of all payouts minus refunds and adjustments.
The amount is specified in the smallest unit of the currency, called subunits. For example, in USD, the subunit is cents, and 100 cents equal 1 USD. So, an amount of 12025 (cents) is equivalent to 120.25 USD.
Note that the subunit-to-unit ratio varies by currency, it is not always 100. See Currencies for the subunits of each currency.
The payout currency of the disbursement in ISO 4217 format.
The payout currency is the currency
{
"event_type": "delivered",
"event_date": "2026-07-13T17:11:39Z",
"event_resource": "disbursement",
"data": {
"status": "delivered",
"recipient_id": "FWU",
"disbursement_id": "FWU2026-07-13",
"number_of_payments": 82,
"number_of_refunds": 0,
"number_of_adjustments": 0,
"delivered_at": "2026-07-13T17:11:39Z",
"amount": 6000000,
"currency": "EUR"
}
}
How to set up Disbursement Status Notifications
When setting up a portal with Flywire, you have the option to define a static callback URL. Flywire sends callback notifications to this URL when a disbursement is delivered. Disbursement callbacks are sent exclusively to this portal-level URL. To receive status notifications, the portal receiving the disbursement must have a valid callback URL configured. If you need to set up a static callback URL, please contact the Solutions team.
Validating Disbursement Status Notifications
Validating notifications is optional, as it’s on your server side, but for security reasons it is recommended to validate all notifications.
How to validate a notification
To validate a notification, check its X-Flywire-Digest header. This value is generated by Flywire using your Shared Secret to encrypt the notification body. To verify the notification, generate the digest using the same method and compare it to the X-Flywire-Digest value in the header. If they match, the notification is legitimate and hasn't been tampered with.
-
Retrieve the raw HTTP body of the notification you received.
Make sure you use the raw HTTP body of the notification. You must generate the X-Flywire-Digest value using the exact payload you received in the notification. If you change the body in any way the values won't match later.
-
Encrypt the received notification twice:
1) Encrypt the raw HTTP body of the received notification with your Shared Secret using the SHA-256 algorithm.
2) Take the result and encrypt it in Base64.
The examples show you how to do this in different programming languages. In each example, exchange the shared_key with your Shared Secret and message_body with the raw HTTP body of the notification.
What is my Shared Secret?
The Shared Secret is a string of characters used for security validations.
For API integration:
Your Shared Secret is used to validate notifications. You receive your Shared Secret together with your API credentials via a secure email after you registered your application.
For other integrations:
Your Shared Secret is used to validate notifications and authenticate requests. You receive your Shared Secret from the Flywire Solutions team after your portal has been set up (please contact the Solutions team in case you don't have your Shared Secret). Note that each portal might have a different shared secret. If you have access to multiple portals, make sure you use the correct shared secret for each portal.
- Ruby
- .NET
- JavaScript
digest = OpenSSL::Digest.new('sha256') encrypted_payload = OpenSSL::HMAC.digest(digest, shared_secret, notification_body) Base64.encode64(encrypted_payload).strip # Step 1: Define the hashing algorithm to use for the HMAC. # This initializes the SHA-256 hashing mechanism. hash_algorithm = OpenSSL::Digest.new('sha256') # Step 2: Compute the HMAC in binary format. # This uses the shared secret and the message body to produce the HMAC signature. hmac_binary = OpenSSL::HMAC.digest(hash_algorithm, shared_secret, message_body) # Step 3: Encode the HMAC in Base64 for use in the X-Flywire-Digest header. x_flywire_digest = Base64.encode64(hmac_binary).strippublic static string Digest(string shared_secret, string message_body) { // Step 1: Initialize the HMACSHA256 object with the shared secret. // This sets up the hashing algorithm (SHA-256) and the secret key for HMAC. using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(shared_secret))) { // Step 2: Convert the message body into a byte array. // The message body is the message payload you want to hash var bytes = Encoding.UTF8.GetBytes(message_body); // Step 3: Compute the HMAC hash of the message body. // This generates the HMAC using the shared secret and the message body. var hashedBytes = hmacsha256.ComputeHash(bytes); // Step 4: Convert the hashed byte array into a Base64 string. return Convert.ToBase64String(hashedBytes); } }const crypto = require('crypto'); function createDigest(shared_secret, message_body) { // Step 1: Initialize the HMAC with the SHA-256 algorithm and the shared secret. const hmac = crypto.createHmac('sha256', shared_secret); // Step 2: Update the HMAC with the message body. // The message body is the message payload you want to hash hmac.update(message_body); // Step 3: Get the HMAC digest and encode it in Base64. const digestHeader = hmac.digest('base64'); return digestHeader; // The `digestHeader` is the X-Flywire-Digest header. } -
Compare your Base64 string to the value in the X-Flywire-Digest parameter of the notification you received.
If the values match, the notification came from Flywire and hasn't been changed by a third party.
If the values don't match, you shouldn't trust the notification.
