Outgoing Transaction Flow
Your customer/platform sends funds to an external recipient.1
Create Quote
Lock in exchange rate and fees:Response:
- Quote ID
- Locked exchange rate
- Expiration time (typically ~5 minutes or greater, depending on corridor)
2
Execute Quote
Initiate the payment:Result:
- Transaction created with status
PENDING - Source account debited immediately
OUTGOING_PAYMENT.PENDINGwebhook sent
3
Processing
Grid handles:
- Currency conversion (if applicable)
- Routing to appropriate payment rail
- Settlement with destination bank/wallet
PROCESSING4
Completion or Failure
Success Path:
- Funds delivered to recipient
- Status:
COMPLETED settledAttimestamp populatedOUTGOING_PAYMENT.COMPLETEDwebhook sent
- Delivery failed (invalid account, etc.)
- Status:
FAILED failureReasonpopulatedOUTGOING_PAYMENT.FAILEDwebhook sent- Refund initiated automatically — track via the
refundobject andOUTGOING_PAYMENT.REFUND_*webhooks
Same-Currency Transfers
For same-currency transfers without quotes:Transfer-Out (Internal → External)
Transfer-In (External → Internal)
Outgoing Payment Status
A singlestatus field represents whether the transaction reached its destination:
State Diagram
Refund Object
When a payment fails or is cancelled, refunds are tracked in a dedicated object on the transaction, decoupled from the payment status:Refund destination
Where a refund lands depends on how the transaction was funded:- Prefunded (internal account) — the amount is credited back to the source internal account balance.
- Real-time (JIT) funding via an instant fiat rail (RTP, PIX, SEPA Instant, etc.) — the refund is returned to the originating funding instrument.
- Real-time (JIT) funding via crypto (for example USDC or BTC) — the refunded amount is credited to the customer’s internal account balance for that asset. It is not returned to the wallet the funds were sent from.
Crypto deposits are not refunded to the source wallet because Grid cannot verify that the sending wallet belongs to your customer — the funds may have originated from an exchange or another third-party address. The credited internal balance is reusable: spend it with a new quote, or withdraw it to an external wallet with
POST /transfer-out.Webhooks
Outgoing payment webhooks use the formatOUTGOING_PAYMENT.<STATUS>. The webhook request body contains the full transaction resource.
Event Types
Example Payloads
- PENDING
- COMPLETED
- FAILED
- REFUND_COMPLETED
Handling Webhooks
Scenarios
- Happy Path
- Failure with Refund
- Failure with Failed Refund
- Bank Return
- Manual Cancellation
The standard successful payment flow:
OUTGOING_PAYMENT.PENDINGOUTGOING_PAYMENT.PROCESSINGOUTGOING_PAYMENT.COMPLETED
Listing Transactions
Query all transactions for a customer or date range:Failure Handling
Common Failure Reasons
When a transaction fails, a refund is initiated automatically. Track the refund via the
refund object on the transaction and OUTGOING_PAYMENT.REFUND_* webhook events. See Refund Object above.
Best Practices
Store transaction IDs for reconciliation
Store transaction IDs for reconciliation
Save transaction IDs to your database:
Handle idempotency
Handle idempotency
Use the
Idempotency-Key HTTP header for safe retries:Provide clear status messages to users
Provide clear status messages to users
Translate technical statuses to user-friendly messages: