Transaction States
Transactions progress through several states from creation to completion:Status Descriptions
Status | Description | Next State | Actions Available |
---|---|---|---|
PENDING | Transaction created, awaiting processing | PROCESSING, FAILED | Monitor status |
PROCESSING | Payment being routed and settled | COMPLETED, FAILED | Monitor status |
COMPLETED | Successfully delivered to recipient | Terminal | None (final state) |
FAILED | Transaction failed, funds refunded if applicable | Terminal | Create new transaction |
REJECTED | Rejected by recipient or compliance | Terminal | None (final state) |
REFUNDED | Completed transaction later refunded | Terminal | None (final state) |
EXPIRED | Quote or payment expired before execution | Terminal | Create new quote |
Terminal statuses:
COMPLETED
, REJECTED
, FAILED
, REFUNDED
, EXPIRED
Once a transaction reaches a terminal status, it will not change further.Outgoing Transaction Flow
Your customer/platform sends funds to an external recipient.Step-by-Step
1
Create Quote
Lock in exchange rate and fees:Response:
- Quote ID
- Locked exchange rate
- Expiration time (1-5 minutes)
2
Execute Quote
Initiate the payment:Result:
- Transaction created with status
PENDING
- Source account debited immediately
OUTGOING_PAYMENT
webhook sent
3
Processing
Grid handles:
- Currency conversion (if applicable)
- Routing to appropriate payment rail
- Settlement with destination bank/wallet
PROCESSING
Webhook: OUTGOING_PAYMENT
with updated status4
Completion or Failure
Success Path:
- Funds delivered to recipient
- Status:
COMPLETED
settledAt
timestamp populated- Final
OUTGOING_PAYMENT
webhook sent
- Delivery failed (invalid account, etc.)
- Status:
FAILED
failureReason
populated- Funds automatically refunded to source account
- Final
OUTGOING_PAYMENT
webhook sent
Webhook Payloads
On Creation (PENDING):Same-Currency Transfers
For same-currency transfers without quotes:Transfer-Out (Internal → External)
Transfer-In (External → Internal)
Monitoring Transactions
Via Webhooks (Recommended)
Subscribe to transaction webhooks for real-time updates:Via Polling (Backup)
Query transaction status periodically:Listing Transactions
Query all transactions for a customer or date range:Failure Handling
Common Failure Reasons
Failure Reason | Description | Recovery |
---|---|---|
QUOTE_EXPIRED | Quote expired before execution | Create new quote |
QUOTE_EXECUTION_FAILED | Error executing the quote | Create new quote |
INSUFFICIENT_BALANCE | Source account lacks funds | Fund account, retry |
TIMEOUT | Transaction timed out | Retry or contact support |
Best Practices
Always use webhooks for status updates
Always use webhooks for status updates
Don’t rely solely on polling:
Store transaction IDs for reconciliation
Store transaction IDs for reconciliation
Save transaction IDs to your database:
Handle idempotency
Handle idempotency
Use idempotency keys for safe retries:
Provide clear status messages to users
Provide clear status messages to users
Translate technical statuses to user-friendly messages: